Follow-up to #955, which shipped the store-isolation guard in two halves.
The channel half is armed by default. The data-root half ships behind
--strict-recall-data-root, off by default. This issue is the burn-down
that lets it be turned on.
Why it is off
Arming it fails 30 tests across 10 files, measured at base 1245f62:
| file |
failures |
| tests/recall/test_dm_channels.py |
8 |
| tests/recall/test_supersession.py |
5 |
| tests/recall/test_resume.py |
4 |
| tests/recall/test_live.py |
3 |
| tests/recall/test_freshness.py |
3 |
| tests/recall/test_channel_hooks.py |
3 |
| tests/recall/test_startup.py |
1 |
| tests/recall/test_codex.py |
1 |
| tests/recall/test_clustering.py |
1 |
| tests/recall/test_action_registry.py |
1 |
These are true positives, not guard noise. tests/recall/conftest.py
deliberately strips SYNAPT_RECALL_ROOT and SYNAPT_RECALL_WORKTREE so that
recall tests measure path inference rather than the override — a correct
intent, documented in that fixture. But inference then resolves the data root
into a real checkout, so these tests read and write a live .synapt/recall:
journal, index, archive, knowledge.
The visible consequence is that a test's result can depend on operator history
rather than on its own fixtures. A negative assertion over journal content
changes outcome with no test-code change, depending only on which directory the
process happens to be standing in.
What "done" looks like
- Each of the 30 sites resolves its data root somewhere the test owns — either
an explicit project_dir under tmp_path, or SYNAPT_RECALL_ROOT pointed
at a pytest-owned directory (note it refuses a root that does not exist, by
design).
- Preserve the existing intent where it applies: a test that is genuinely
asserting inference behaviour should still exercise inference, just from a
pytest-owned starting point rather than from the repository.
pytest --strict-recall-data-root runs clean.
- Flip the flag default to on, so the guarantee holds without anyone
remembering to pass it.
Note that flipping the flag also completes coverage of the per-gripspace
channels.db. That path is composed from project_data_dir, so it can never
resolve inside the global channel store and is correctly outside the channel
guard — the data-root policy is what reaches it. Until the flag is on, it is
unguarded in the default suite.
Note on the count
An earlier draft of #955 put this at roughly 60. That figure was measured while
the harness still installed a session-wide channel override which was itself
breaking 30 tests — so half of it was the harness's own doing. 30 is the number
at base 1245f62 with the shipped configuration. Re-derive before acting on it
if dev has moved substantially; a measurement inherits the configuration it was
taken under.
Follow-up to #955, which shipped the store-isolation guard in two halves.
The channel half is armed by default. The data-root half ships behind
--strict-recall-data-root, off by default. This issue is the burn-downthat lets it be turned on.
Why it is off
Arming it fails 30 tests across 10 files, measured at base
1245f62:These are true positives, not guard noise.
tests/recall/conftest.pydeliberately strips
SYNAPT_RECALL_ROOTandSYNAPT_RECALL_WORKTREEso thatrecall tests measure path inference rather than the override — a correct
intent, documented in that fixture. But inference then resolves the data root
into a real checkout, so these tests read and write a live
.synapt/recall:journal, index, archive, knowledge.
The visible consequence is that a test's result can depend on operator history
rather than on its own fixtures. A negative assertion over journal content
changes outcome with no test-code change, depending only on which directory the
process happens to be standing in.
What "done" looks like
an explicit
project_dirundertmp_path, orSYNAPT_RECALL_ROOTpointedat a pytest-owned directory (note it refuses a root that does not exist, by
design).
asserting inference behaviour should still exercise inference, just from a
pytest-owned starting point rather than from the repository.
pytest --strict-recall-data-rootruns clean.remembering to pass it.
Note that flipping the flag also completes coverage of the per-gripspace
channels.db. That path is composed fromproject_data_dir, so it can neverresolve inside the global channel store and is correctly outside the channel
guard — the data-root policy is what reaches it. Until the flag is on, it is
unguarded in the default suite.
Note on the count
An earlier draft of #955 put this at roughly 60. That figure was measured while
the harness still installed a session-wide channel override which was itself
breaking 30 tests — so half of it was the harness's own doing. 30 is the number
at base
1245f62with the shipped configuration. Re-derive before acting on itif dev has moved substantially; a measurement inherits the configuration it was
taken under.