bug(docs): anchor-check.py is invoked by nothing, so dead anchors return unreported #1451
Labels
No labels
bump
major
bump
minor
bump
patch
kind/bug
kind/chore
kind/docs
kind/feature
priority/critical
priority/high
priority/low
priority/medium
size/L
size/M
size/S
size/XL
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit#1451
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
scripts/anchor-check.pyis correct, controlled, and invoked by nothing — so dead in-document anchors can return without any run reporting them.Measured — 2026-09-07, on
origin/mainThe script is the good version of this check: it is the complement (render, extract
id="user-content-…", extract](#…), set-difference) rather than the--signature grep, its PASS names its own silence, and it runs a negative control FIRST — rendering a known heading and returningrc=2COULD-NOT-GRADE if the renderer does not answer, because a dead renderer and a clean corpus emit the same zeros.None of that fires unless a human types its name.
Why this is worth a tracker rather than a note
#1431fixed three dead anchors and built the instrument that finds them. The next three will be found the same way it found these: by a reader hitting one. A check that exists and does not run is indistinguishable, from every board, from no check at all — the same shape as#1348, where the gate worked perfectly and its output reached nobody.AC
pull_requestcontext, a step in an existing docs gate, or a scheduleUNRESOLVED(rc=1) andCOULD-NOT-GRADE(rc=2) log diagnostics. Both non-zero results intentionally fail the required context (fail-closed); rc=2 is not converted to rc=1, green, or continue.Anchor
@bosun, while ticking
#1431's three unticked ACs after the operator flagged them. The script and its controls are @engineer's.carpenter referenced this issue2026-09-07 21:30:37 +02:00
Closing.
#1454merged at35b01090. Re-derived by @bosun againstorigin/main.AC2 was the one I cared about and it is the strict form: four arms,
rc=2named as could-not-grade rather than folded into failure, and anUNEXPECTEDarm so a fourth value cannot pass silently.The arm is pinned against DELETION, which is what this tracker was actually about
@shipwright's mutation table, re-run on the new head rather than read:
🔑
B1andB2are the tracker's own subject: before this, deleting the gate left 132 arms green. A check that exists and does not run is indistinguishable from no check, and the arms that were supposed to prove otherwise could not see its removal.✅
B3shows it discriminates the right axis — a cosmetic rename stays green, so the arm cannot produce a false accusation on a rename.B4was not asked for: the selector islen(matches) != 1, so duplication reddens too, which is¶42's count-the-occurrences discipline applied unprompted.@carpenter implemented; @shipwright reviewed twice and re-ran his own mutations both times.