fix(docs): resolve three dead anchors, and ship the check that finds them (#1431) #1439
No reviewers
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
3 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1439
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1431-dead-anchors"
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?
For #1431. Head
18f2a909on24491072.A heading's punctuation is dropped rather than replaced, so the spaces around it collapse into one hyphen — while an author counting space · punctuation · space writes two.
Both routes to the token section were dead, in a guide whose recommended path needs
RELEASE_TOOLKIT_TOKEN.The complement, with its before-value
📌 The distinct count drops by one, and the reason is stated rather than explained away:
tokens--permissionsandtokens-permissionswere two distinct anchors in that file and are now one. A count that moved for a reason other than the fix would be the alarming case.Units, since this repo has spent the day on that: 26/25 are distinct anchors per file; the 30 quoted on the tracker are occurrences. Different questions, both correct.
scripts/anchor-check.pyThe AC asks that the complement be the thing that runs, so it is a script rather than a paragraph. Three controls, each fired separately:
The two could-not-grade paths matter more than the positive one — a renderer that stopped answering and a clean corpus emit the same zeros.
🔴 My own sweep failed on its own documentation first
Extracting links from raw text reported three "dead anchors" that were code examples inside the section documenting anchors:
The detector firing on the prose that describes it. ¶39 again — a change that documents what it fixes contains the thing it fixes — and the instrument is what needed fixing, not the doc. The script strips fences and inline code spans, and a positive control proves it still catches a real break afterwards.
Recorded where a link author will meet it
Not on the tracker — in
docs/conventions.md, beside the other author-time rules, with both failure modes named:v0.57.0→v0-57-0, a leading emoji dropping with no dash — so an author who trusts the regex ships a dead link it cannot see.Exhaustive on today's corpus, and not by construction.
⚠️ The third class is SCOPE, not an AC
A link that resolves to the wrong section is invisible to both checks. A resolver answers does this land somewhere, never does this land where you meant, because the substrate holds no copy of the intent. A dead link announces itself; a live wrong one lands the reader somewhere plausible and they blame their own reading.
Recording it as an AC would commission work that cannot succeed, so the script's own pass message says what it does not check.
Gates
go build·go vet·go test ./...·bats tests/(198 arms) ·register-check·fragment-check·changelog-body-check·contract-paths-check— allrc=0. Fragment 423 chars, warns on nothing.⚠️
readme-pin-checkmay be red from main's mirror backfill; #1435 owns it and it is optional.🤖 Generated with Claude Code
https://claude.ai/code/session_01MMmaXmMhZdAAnttWBS6zqa
Approved at exact head
18f2a909012909431056f3b30efb2da6d586bf0e.Verified against the live Forgejo renderer: base
24491072e99ee3062d3418c23369a9b51b25c129reproduces 58 files, 26 global distinct anchors, and exactly the two unresolved anchor names (three occurrences); the PR head is 58 files, 25 distinct, 0 unresolved. The only distinct-count reduction is the twotokens--permissionsoccurrences becomingtokens-permissions; the single-line-bullets anchor is a one-for-one rename.Controls were run independently: clean head rc=0; known real dead-anchor base rc=1; renderer unreachable rc=2; empty selector rc=2. Raw extraction reproduces the three fenced documentation false positives, while the fence-stripped check still catches the real base break. The pass output explicitly records the unresolved wrong-section class as outside the resolver's scope.
Approved at exact head
18f2a909012909431056f3b30efb2da6d586bf0e.Verified against the live Forgejo renderer: base
24491072e99ee3062d3418c23369a9b51b25c129reproduces 58 files, 26 global distinct anchors, and exactly the two unresolved anchor names (three occurrences); the PR head is 58 files, 25 distinct, 0 unresolved. The only distinct-count reduction is the twotokens--permissionsoccurrences becomingtokens-permissions; the single-line-bullets anchor is a one-for-one rename.Controls were run independently: clean head rc=0; known real dead-anchor base rc=1; renderer unreachable rc=2; empty selector rc=2. Raw extraction reproduces the three fenced documentation false positives, while the fence-stripped check still catches the real base break. The pass output explicitly records the unresolved wrong-section class as outside the resolver's scope.
Landing identity record
18f2a909012909431056f3b30efb2da6d586bf0e18f2a909012909431056f3b30efb2da6d586bf0eThis is a post-merge identity record. It does not retroactively review the landed object; it records whether the server landed the object that an official approval named.