Skip to content

Isolate the 30 data-root test sites, then arm --strict-recall-data-root by default #967

Description

@laynepenney

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

  1. 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).
  2. 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.
  3. pytest --strict-recall-data-root runs clean.
  4. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions