Skip to content

C-89's two orphaned deferrals: relocate the leak guards, and point the rename proof at its subject #265

Closed

Description

@Polichinel

Two deferrals recorded under register C-89 lost their owner when the issue they were routed to closed. Neither is urgent; both are small; and an ownerless deferral is not a deferral (ADR-014 §4), which is the reason this exists rather than another paragraph in the register.

1. The leak guards still live in the wrong file

tests/test_redaction_guard.py is this repository's home for "what stops us leaking". The coordinate-value guards live in tests/test_env_declaration.py instead, and tests/test_env_declaration.py::test_the_environment_refusal_logs_names_and_never_values already points readers at the redaction guard for "the wider rule" — so the split is visible in the code and unresolved.

The deferral's trigger was "when #243 finishes touching tests/test_env_declaration.py". #243 closed 2026-08-12. The trigger fired; the move did not happen.

Why it was deferred and why that still partly holds: moving code while fixing bugs in it is how the next defect arrives, and #242–#243 were fixing bugs in exactly these guards. That reason has now expired — the guards have been stable since #243.

Scope: move the value-scan guards and their fixtures into tests/test_redaction_guard.py, or decide deliberately that they stay and record why. Either outcome closes this half.

2. A proof that re-types its subject instead of driving it

tests/test_env_declaration.py::test_the_drift_check_would_catch_a_rename rebuilds the checked function's comparison with its own comprehension rather than calling it. Blank the subject's assertions and this proof stays green.

This is the exact defect its two siblings had and had repaired — the rotation proof and the table-partition proof both now drive the real function. This one was routed to #243 and #243 closed without it.

Scope: point it at the function it names, the way test_the_drift_check_is_silent_on_a_row_this_partner_does_not_read and test_the_drift_check_fires_when_a_row_this_partner_reads_rotates were pointed in #245/#246 — monkeypatch the readers, call the real check. Mutation-prove by neutering the subject.

Acceptance

Why this is not urgent

Neither is a live defect. The first is organisation; the second is a proof that is weaker than its siblings, in a cluster where the other two are now strong. Register C-89, C-82.

Activity

  1. added 2 commits that reference this issue on Aug 13, 2026
  2. Polichinel commented on Aug 14, 2026

    @Polichinel
    CollaboratorAuthor

    Both deferrals discharged in #274 (0d38a71).

    The rename proof now drives its subject. The comparison the gated check ran inline is _name_and_class_drift, called by both. Mutation-proven: making it return ([], {}) fails the proof for both partners, where before it stayed green. It also gained an assertion that the report names both sides of a mismatch — expected and declared — since a reader who cannot tell which moved cannot act on it.

    The relocation is answered no, with the reason recorded. The coordinate-value scan stays in test_env_declaration.py: its subject is _EXPECTED_NAMES, derived from the partner declarations that are that module's substance, and separating a guard from the declaration it guards to make a filename read better trades a real coupling for a filing convenience.

    What was actually misfiled moved instead — registry_at/registry_current/rows are the shared reader, not this package's env declarations, so their refusal tests are now tests/test_seam_registry.py. 109 lines of test code out; the module went 1503 to 1406.

    Review of my own change caught two false claims in it: "115 lines out" (no command produced that number) and a claim that the sibling defects had been repaired by the same extraction — they were not, they were repaired by driving the real check under monkeypatch, and I had used that non-existent precedent as the licence to extract. The extraction still stands, for a reason now stated honestly. Register C-89 carries it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    storyA single reviewable unit of an epic

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions