Skip to content

fix(gate): the tooling-partition gate states its own remedy (BACKLOG #1434) - #835

Open
wshallwshall wants to merge 3 commits into
mainfrom
worktree-agent-aca5875d3fccc61d4
Open

fix(gate): the tooling-partition gate states its own remedy (BACKLOG #1434)#835
wshallwshall wants to merge 3 commits into
mainfrom
worktree-agent-aca5875d3fccc61d4

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Closes BACKLOG #1434.

tests/test_tooling_partition.py::test_every_non_engine_test_is_classified named the offending
file and stopped, so anyone who tripped it had to go read the gate to learn the remedy. It reds
all three required test legs at once, and it is not marked tooling, so -m 'not tooling'
does not deselect it. Both Builders who tripped it on 2026-09-03 had exited before any leg reported.

What changed

The failure message now gives the exact manifest line to paste, states the criterion as the test's
subject rather than its location, notes that a test importing messagefoundry,
messagefoundry_webconsole, harness or tee needs no entry at all, and gives the tie-break with
its cost. Both registry paths render from _MANIFEST and __file__, so a rename moves the message
with the file.

test_every_manifest_entry_exists becomes _resolves_as_written: it now requires the spelling
git diff --name-only reports, which is what ci.yml matches with grep -qxFf. The old basename
check was blind to a bare name and to a ./ prefix.

The mutation that mattered

The first version of the message tests asserted on _unclassified_remedy's return value, so
reverting the assertion's call site to the old string left every content arm green. That is the
SDS-3.8 defect this repository names, committed inside a fix for a gate. The arms now drive the real
gate into failure against a tmp_path and read the message it actually raises.

Six mutations run, each red on its named arm: revert the message, recommend a bare filename, bare
manifest entry, drop the tie-break, a ./tests/ entry, and point the reader at a renamed registry.

Sweep of the open queue, both directions

Five open pull requests will red three required legs as they stand -- each added a
harness-subject test file missing from tests/tooling_manifest.txt. I did not push to any of them;
the fix is one alphabetical line each.

PR file subject
774 tests/test_coord_fleet_fetch_clock.py scripts/coord/fleet.ps1
789 tests/test_ci_red_reader.py scripts/ci/report_ci_red.py
795 tests/test_install_gate_allowlist_merge.py scripts/worktree/install-gate.ps1
798 tests/test_claim_shared_registry.py claim.ps1, claim_check.py
799 tests/test_steer_inject.py scripts/hooks/steer-inject.ps1

The other six pull requests adding test files are correct: 764, 769, 773 and 796 import the engine;
792 and 806 each appended their own manifest line.

The opposite direction is clean. All 137 manifest entries were swept for an engine test wrongly
listed -- the silent failure, where a test stops running on the legs that would catch its
regressions. One hit, tests/test_serverdb_ci_coverage.py, and it is correctly listed: it rglobs
the engine only to prove a ci.yml regex still refuses something, so its assertion is invariant to
engine content. The discriminator is recorded in the item: can an engine-only diff change this
test's result?

Commit shape

The docs/BACKLOG.md row is deliberately its own trailing commit, so a conflict with another
pull request is a scripted row merge rather than a re-read of intent.

Checks

ruff check, ruff format --check, mypy strict on the changed file, and all 11 pre-commit hooks
passed at commit. Tests: test_tooling_partition (11), plus test_ci_tooling_gate,
test_conftest_name_collision_guard, test_licence_header_gate, test_cp1252_console_safety,
test_control_char_check, test_escape_sequence_check (121 total), plus the backlog doc guards
(164 total).

Not run: the full suite. The box was saturated -- 20 logical cores against 28 concurrent pytest
processes -- and a full run reached 4 percent in 18 minutes. CI must read the remaining legs.

Two follow-ups recorded in the item, not built

Three copies of the manifest parser pinned against nothing (here, tests/conftest.py, and
tests/test_ci_tooling_gate.py); and a test_every_manifest_entry_trips_its_own_gate arm that
feeds each entry back as its own changed path.

wshallwshall added 3 commits September 4, 2026 16:15
…#1434)

test_every_non_engine_test_is_classified named the offending file and
stopped, so anyone who tripped it had to read the gate to learn the fix.
It reds all three required test legs, and both Builders who tripped it
on 2026-09-03 had exited before any leg reported.

The message now gives the exact manifest line to paste, states the
criterion as the test's SUBJECT rather than its location, and gives the
tie-break with its cost. Both registry paths render from _MANIFEST and
__file__, so a rename moves the message with the file.

Asserting on the helper's return value was measured vacuous: reverting
the assertion's call site left every content arm green. The arms now
read the message the gate actually raises.

test_every_manifest_entry_exists becomes _resolves_as_written: it
requires the spelling git reports, which is what ci.yml's path gate
matches. The basename check was blind to a bare name and a ./ prefix.

Six mutations run, each red on the named arm.
Kept in its own trailing commit, and it is the only change here. Every
open pull request edits this file, so they conflict serially as each one
lands. A conflict confined to one commit is a scripted row merge; one
tangled with code needs a re-read of the author's intent.
…5d3fccc61d4

# Conflicts:
#	docs/BACKLOG.md
@wshallwshall wshallwshall added the reviewed A reviewer has read this. Removed automatically when new commits arrive. label Sep 4, 2026
@github-actions github-actions Bot removed the reviewed A reviewer has read this. Removed automatically when new commits arrive. label Sep 4, 2026
@wshallwshall wshallwshall added the reviewed A reviewer has read this. Removed automatically when new commits arrive. label Sep 4, 2026
@wshallwshall

Copy link
Copy Markdown
Collaborator Author

Disclosure, per the Manager playbook section 6: the reviewed label on this pull request was applied by the Manager seat that commissioned the diff, not by an independent reader. It records that a step happened. It is not evidence that a second party read the scope, and it should not be read as one.

Context: the owner suspended the Reviewer seat and directed the Manager to apply the tag, and has since disabled the reviewer role and its tag requirement altogether. Removing the required status context is a branch-protection change and belongs to the Lander, not to this seat.

Defects I know of are named in the pull request body rather than left for a reader to find.

@wshallwshall

Copy link
Copy Markdown
Collaborator Author

Correction to my disclosure above: it said the required status context still exists on main mechanically. That was true when written and is false now. Re-read live at 23:39Z, printing the full set rather than grepping for a zero: 13 required contexts, and a reviewer has read this is not among them. The set moved while several seats were measuring it.

The disclosure's load-bearing half stands unchanged: the reviewed label here was applied by the Manager seat that commissioned the diff and is not an independent read. It is now also not load-bearing for the merge.

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

Labels

reviewed A reviewer has read this. Removed automatically when new commits arrive.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant