Skip to content

ci: run the dangling-citation detector on documentation-only PRs (BACKLOG #1235) - #560

Merged
wshallwshall merged 15 commits into
mainfrom
claude/builder-1-1235-docs-lane
Aug 24, 2026
Merged

ci: run the dangling-citation detector on documentation-only PRs (BACKLOG #1235)#560
wshallwshall merged 15 commits into
mainfrom
claude/builder-1-1235-docs-lane

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

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.py pins 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-hygiene does not fire: touches_code globs only messagefoundry/, ide/ and messagefoundry_webconsole/, and this touches .github/ and tests/. 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-mode as d3ec7d26. Ignore both it and that branch; this one is off current main.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com

wshallwshall and others added 2 commits August 23, 2026 14:28
…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
wshallwshall enabled auto-merge (squash) August 23, 2026 20:42
@wshallwshall
wshallwshall merged commit b47c9fd into main Aug 24, 2026
42 of 43 checks passed
@wshallwshall
wshallwshall deleted the claude/builder-1-1235-docs-lane branch August 24, 2026 05:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant