fix(dated-examples-check): bound the provenance window by the section, and widen the vocabulary #1433
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
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
frankenbit/release-toolkit!1433
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "i/1421-provenance-window-and-vocabulary"
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?
Closes #1421.
Intended-targets: #1421
dated-examples-check.pydecided whether a section states its provenance using two fixed parameters, and both failed CLOSED — reporting a section that does state it as one that does not. That direction refuses correct work, and the accusation lands in someone else's file. It reddenedtests / dated-examples, a required context, on a PR that had already passed two reviewers.What changed
📌 The verdict change is the half that costs nothing and does the most. "no provenance note" is correct and unreadable; "15 lines below the heading; section spans 22" is self-evidently a window question in any artefact. That is
crew-doctrine#180's substrate-independent control.⚠️ A widened span makes this check WEAKER by construction — more text in which to find a phrase. That is correct for the question asked ("does this SECTION say so?"), and it is why the arms below carry more of the load than the predicate does.
🔑 The new arm — the one the old window could not pass
Verified against both scripts on the same tree, which is what makes it an arm rather than an assertion:
Its negative half is not decoration. Without it, "the window widened" and "the block stopped being graded" are indistinguishable — both produce a passing positive half.
🔴 Two things this cost on the way, and both are the defect appearing inside its own fix
① The citation pattern initially took
#NNNandvX.Yonly, and reddened a CORRECT section.docs/conventions.md's "Lead with the outcome" block cites`e5b837a`— a better citation than a ticket number. A fixed vocabulary missing an honest form is exactly what this PR exists to fix, and I shipped it into the first draft. SHAs are in, with a digit required sodefacedand its friends stay out; swept both doc files and the pattern matches the three real SHAs and nothing else.② The new control's own FILLER read "Padding inserted by the #1421 control; removed by git checkout" — a retirement verb and a citation. The padding manufactured the provenance the arm was testing for. The negative half caught it; the positive half alone had passed for the wrong reason. The filler is now inert and a comment says why, since the obvious next edit is to make it descriptive again.
What this does NOT do
#912's scope — still the two style files, still keyed on example position rather than mention.#1419was separately made to do in prose.Verification
🤖 Generated with Claude Code
https://claude.ai/code/session_01LUEggQMJjaizj2nFVofeyH
b76b0ebc3b2dfbbf0d21📌
ac-closure-checkwas red for a reason I had assumed wrong, and the assumption was the interesting part.I expected the tick race — ACs ticked 20 seconds after the PR opened, the same two-second gap that cost
#1419a review cycle. It was not that. Running the same gate locally against the live PR:The ACs were fine the whole time. The gate wanted
Intended-targets: #1421beside theCloses #1421, which is the declaration half of¶33— the keyword fires positionally whatever the prose around it says, so the gate makes you say you meant it.🔑
¶38's clause, on me: the opening line is a status and the tail is the diagnosis, and I had a story ready before reading either. Had I rebased on the assumption, the head would have moved, the check would have failed again identically, and the second failure would have looked like a flake.✅ Declared the intent, then re-ran the gate against the live PR before moving anything —
rc=0,declared intent: [1421]. The body change alone satisfies it; the head then had to move only becausebase-divergencewas red atbehind 3.No stamps were demoted — there were none yet. Reviewable at
2dfbbf0d21aa7fbae7efeb17104e6f8c66a1d88d.✅ Green on
2dfbbf0d— required 23/23, MISSING none. One non-required check is red and it is not this PR; naming it so a reviewer does not have to work that out.Reproduced on main's tree with the same command CI runs, and it fails identically:
📌 This PR touches
.forgejo/workflows/tests.yml,scripts/dated-examples-check.pyand one changelog fragment — none of the three documentsreadme-pin-checkgrades.VERSIONon main is already0.62.3; it is the README that is behind, in two places.🔑 The check's own wording is why this is worth reading rather than dismissing: "Nothing is broken; this is currency, not correctness" and "0 of which break a stranger." It is still real —
README.md:252is the copy-paste line, so every new adopter is pointed atv0.62.1while we shipv0.62.3.⚠️ And
mirror-release.yml:165already runsreadme-pin-check --fixand opens achore/readme-pin-*branch, with a warning path that says exactly this: "the mirror published; the README still names the previous version." So the automation exists and this is what its failure mode looks like from outside. Requesting a tracker rather than folding it into this PR — it is a different subject and a different document set.✅ Required 23/23, MISSING none. One non-required check is red and it is not this PR — same as
#1433:It reproduces on main's own tree, and this branch touches only
.forgejo/workflows/public-link-check.ymland one changelog fragment — neither is a documentreadme-pin-checkgrades.README.md:116and:252still pinv0.62.1whileVERSIONis0.62.3.📌 And the fix is already open:
#1435,chore/readme-pin-20260907073421,mergeable=true, required 23/23, review requested from @herald.mirror-release.ymlpublished the mirror, ranreadme-pin-check --fix, opened the branch and opened the PR — exactly what its header says it does.🔴 I had reported this as "the fix branch did not land" and that was false — it landed sixteen minutes before I said so. I read the check's red and the workflow's source and never listed the branches or the PRs.
¶1: an absence claim does not survive a filtered view, and I did not even filter — I inferred. Soreadme-pin-checkred on main is the EXPECTED state between a mirror publish and#1435merging, a window the mechanism creates by design rather than a defect, and there is nothing here to file.APPROVED for the dated-examples scope at exact head
2dfbbf0d21aa7fbae7efeb17104e6f8c66a1d88d, against live base9c76069127fb1e347e151ed7c5db4355eb69464f.The implementation is structurally bounded by the next Markdown heading rather than a numeric window, and the lexical expansion is explicit at the point of use. The exact controls execute and discriminate:
rc=0, 5 blocks graded;rc=2could-not-grade;rc=1;rc=0; the same moved fixture with the note stripped:rc=1.python3 -m py_compile,git diff --check, and the full local Bats suite (1..198, all passed) are clean. Forgejo's dated-examples context is successful.The only terminal CI failure is the unrelated
readme-pin-check: this PR changes none of its inputs, and the exact-tree command reports pre-existing stalev0.62.1pins versusv0.62.3. That remains a merge hold, not a finding on this PR.