ci: run the dangling-citation detector on documentation-only PRs (BACKLOG #1235) - #560
Merged
Conversation
…KLOG #1235) The gate existed, passed its own 45 tests, and NEVER RAN ON THE SHAPE IT WAS BUILT FOR. #1235 is about a citation to an unallocated number, which is introduced BY EDITING PROSE -- and the detector ran only inside pytest, which a documentation-only pull request skips. `ci.yml`'s docs-only step named eighteen modules including TWO citation siblings (test_backlog_citation_check, test_claude_section_citations) and not this one. WHY ONE LINE IS THE WHOLE FIX, verified rather than assumed: the module ALREADY carries both arms the re-score asks for. `test_no_docs_citation_names_a_number_that_can_still_be _issued` is the must-trip; `test_the_docs_scan_actually_covers_something` pins the population at >200 files so a collapsed walk cannot report clean forever. It scans the real tree via `rglob`, not a fixture. So the residual really was wiring, not coverage. THE SECOND FILE IS THE PART THAT LASTS. Nothing pinned the module's MEMBERSHIP, so deleting the line would have regressed in silence -- `test_every_named_doc_guard_exists` only validates modules that ARE named, and `test_the_lane_is_not_empty` passes at any count above ten. A guard removed from the list is indistinguishable from one that was never in it, which is #1235's own defect wearing a different hat. MUTATION-VERIFIED: removing the line from DOC_GUARDS fails the new test and only that test, 1 of 4. Restored, 4 pass. A FLOOR MEMBER, NOT A CENSUS. The lane file's docstring says the list is "a FLOOR, NOT a census" and this does not change that -- it names the three guards whose absence was the defect and asserts nothing about the other fifteen. No ledger row: touches_code is *messagefoundry/*|*ide/*|*messagefoundry_webconsole/*, and this touches .github/ and tests/ only. Confirmed by running the gate's logic, not by reading it. 63 passed across test_required_contexts, test_ci_step_margin, test_lint_scope_parity and test_tooling_partition. DISPOSITION IS NOT MINE. The re-score names this as the item's last gap, so #1235 may now be closable -- that is the Dispatcher's call and I have not touched the banner. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
wshallwshall
enabled auto-merge (squash)
August 23, 2026 20:42
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
One line in
ci.yml, plus the test that stops it from being deleted in silence. By Builder 1.The gate existed, passed its own 45 tests, and never ran on the shape it was built for
BACKLOG #1235 is a citation to an unallocated number. That defect is introduced by editing prose — and the detector ran only inside pytest, which a documentation-only PR skips.
ci.yml's docs-only step named eighteen modules, including two citation siblings and not this one.So the detector was correct, tested, and pointed away from the traffic that produces its defect.
The second file is the part that lasts
Nothing pinned membership. Deleting the line would have regressed silently: the existence test only validates modules that are already named, and the not-empty test passes at any count above ten.
tests/test_doc_guards_lane.pypins it. Mutation-verified: removing the line fails the new test and only that test, 1 of 4.That is the difference between a fix and a fix that stays fixed. A one-line CI addition with no test is one careless rebase from being gone, and its absence renders exactly like its presence.
Why one line is the whole fix
The author verified rather than assumed that the detector module already carries both arms the re-score asks for: a must-trip arm (no documentation citation names a still-issuable number) and a population control pinning more than 200 files, so a collapsed walk cannot read clean. It scans the real tree via
rglob, not a fixture.Landing notes
58 passed.
backlog-hygienedoes not fire:touches_codeglobs onlymessagefoundry/,ide/andmessagefoundry_webconsole/, and this touches.github/andtests/. The author ran the gate's own logic rather than reading the rule, which is the practice that has been correcting this fleet all day.Disposition is deliberately not taken. The re-score calls this the item's last gap, so #1235 may be closable — that is the item owner's call and the banner is untouched.
A duplicate of this commit exists on the abandoned branch
claude/builder-1-237-templated-modeasd3ec7d26. Ignore both it and that branch; this one is off current main.Co-Authored-By: Claude Opus 5 noreply@anthropic.com