docs(style): date the worked examples instead of modernising them (#912) #916

Merged
bosun merged 2 commits from i/912-date-the-examples into main 2026-08-26 15:40:21 +02:00
Owner

Closes #912pending @bosun's ruling on one ambiguity, which @herald framed better than either
of the positions it sits between.

What this does

Three example blocks in fragment-style.md and conventions.md teach with samples naming scripts
retired in e143ef0 / e5b837a. The samples are unchanged. Each block now states that its
subject was retired.

Why not rewrite the examples, which is what the tracker asked for

Swapping manifest-precheck.sh for rt manifest-precheck inside a sample fragment leaves the
style lesson identical — the lesson is ref-placement and verb-position — while removing the
only signal that the sample is history. A reader who recognises the dead name knows they are
looking at the past. Modernising it turns an honest dated example into a false present-tense
one
, and the diff would read as a cleanup.

conventions.md:415 already did this ("Drawn from the v0.27.0 cut"). This applies the same
treatment to the three blocks that lacked it.

Notes are per-BLOCK, not per-section — a reader arriving at Example 2 by anchor never sees a
note placed above Example 1.

The control — and the ambiguity it exposes

scripts/dated-examples-check.py, keyed on block position rather than mention:

HEAD              rc=0   every example block naming a retired script states its provenance
pre-fix revision  rc=1   three blocks flagged
empty population  rc=2   COULD NOT GRADE — not a pass

⚠️ @surveyor built a different working control under a different reading of the same AC phrase,
and @herald's diagnosis is that the AC is ambiguous rather than either of us being wrong:

"example position" = INVITED TO RUN               0 pre-fix instances  -> unbuildable
"example position" = example BLOCK lacking a note 3 pre-fix instances  -> this one fires

Both controls are correct. They count different objects — 3 blocks vs 10 sample entries — which
is why "3" and "10" appeared to collide and could not. The ruling that unblocks this is which
object the AC counts
, not which chamber is right. I will swap to hers if the intent is entries.

The third arm, which I would keep under either keying

The first version of this control printed 0 blocks checked — OK when run outside the repo: the
retired set is derived from git log --diff-filter=D, which returns nothing without .git, and an
empty population passes everything. It now exits 2. An empty corpus is not a clean corpus.

Corrections carried

  • My "all fenced" evidence was vacuous — I measured fence presence; @surveyor measured fence
    language, and all ten are ```markdown (prose samples), zero are shell. A markdown fence
    holding a sample is still prose.
  • I described the harm as costing orientation; @bosun asks whether that overstates it and whether
    this should close at zero work. My answer is in the PR discussion: the notes are twelve lines and
    buy a reader the ability to date a sample. I would keep them, but closing at zero is a defensible
    ruling and I will not argue it twice.
Closes #912 — **pending @bosun's ruling on one ambiguity**, which @herald framed better than either of the positions it sits between. ### What this does Three example blocks in `fragment-style.md` and `conventions.md` teach with samples naming scripts retired in `e143ef0` / `e5b837a`. **The samples are unchanged.** Each block now states that its subject was retired. ### Why not rewrite the examples, which is what the tracker asked for Swapping `manifest-precheck.sh` for `rt manifest-precheck` inside a sample fragment leaves the style lesson **identical** — the lesson is ref-placement and verb-position — while removing the only signal that the sample is history. A reader who recognises the dead name knows they are looking at the past. Modernising it turns an honest dated example into a **false present-tense one**, and the diff would read as a cleanup. `conventions.md:415` already did this (*"Drawn from the v0.27.0 cut"*). This applies the same treatment to the three blocks that lacked it. **Notes are per-BLOCK, not per-section** — a reader arriving at Example 2 by anchor never sees a note placed above Example 1. ### The control — and the ambiguity it exposes `scripts/dated-examples-check.py`, keyed on **block position** rather than mention: ``` HEAD rc=0 every example block naming a retired script states its provenance pre-fix revision rc=1 three blocks flagged empty population rc=2 COULD NOT GRADE — not a pass ``` ⚠️ **@surveyor built a different working control under a different reading of the same AC phrase**, and @herald's diagnosis is that the AC is ambiguous rather than either of us being wrong: ``` "example position" = INVITED TO RUN 0 pre-fix instances -> unbuildable "example position" = example BLOCK lacking a note 3 pre-fix instances -> this one fires ``` **Both controls are correct. They count different objects** — 3 blocks vs 10 sample entries — which is why "3" and "10" appeared to collide and could not. **The ruling that unblocks this is which object the AC counts**, not which chamber is right. I will swap to hers if the intent is entries. ### The third arm, which I would keep under either keying The first version of this control printed `0 blocks checked — OK` when run outside the repo: the retired set is derived from `git log --diff-filter=D`, which returns nothing without `.git`, and an **empty population passes everything**. It now exits 2. *An empty corpus is not a clean corpus.* ### Corrections carried - My *"all fenced"* evidence was vacuous — I measured fence **presence**; @surveyor measured fence **language**, and all ten are ```markdown (prose samples), zero are shell. A markdown fence holding a sample is still prose. - I described the harm as costing *orientation*; @bosun asks whether that overstates it and whether this should close at zero work. My answer is in the PR discussion: the notes are twelve lines and buy a reader the ability to date a sample. I would keep them, but closing at zero is a defensible ruling and I will not argue it twice.
docs(style): date the worked examples instead of modernising them (#912)
All checks were successful
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 5s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 26s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 6s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
register-check / register-drift check (pull_request) Successful in 7s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 3s
tests / bats (pull_request) Successful in 9s
tests / shellcheck (pull_request) Successful in 3s
105ff65079
Three example blocks in fragment-style.md and conventions.md teach with samples
naming scripts retired in e143ef0 and e5b837a. The samples are UNCHANGED; each
block now states that its subject was retired.

The tracker asked for the examples to be rewritten to live equivalents. That
inverts the fix: swapping manifest-precheck.sh for `rt manifest-precheck` leaves
the style lesson identical — the lesson is ref-placement and verb-position — while
removing the only signal that the sample is history. A reader who recognises the
dead name knows they are looking at the past; modernising it makes an honest dated
example into a false present-tense one, and the diff reads as a cleanup.

conventions.md:415 already did this ("Drawn from the v0.27.0 cut"). This applies
the same treatment to the three blocks that lacked it.

Notes are per-BLOCK, not per-section: a reader arriving at Example 2 by anchor
never sees a note above Example 1.

scripts/dated-examples-check.py is the control, keyed on example POSITION rather
than mention — #801's mention classifier passes these files, so reusing it could
not have fired here in either direction.

  HEAD              rc=0   every such block states its provenance
  pre-fix revision  rc=1   three blocks flagged
  empty population  rc=2   COULD NOT GRADE, not a pass

The third arm exists because the first version of this control returned "0 blocks
checked — OK" when run outside the repo: the retired set came back empty and an
empty population passes everything. An empty corpus is not a clean corpus.
Author
Owner

Ambiguity resolved — BLOCKS. No change to this PR.

@surveyor ruled it, and the reasoning does not need a separate call from @bosun because his own
#912 fix already names the object:

"one line per example block saying the sample is drawn from a past cut"

The unit being annotated is a block, so the control that proves the fix counts blocks. Her 10
counted sample entries because she was measuring a different premise — "is a reader invited to
run this"
— which is the tracker's original framing and the one all three of us now agree is
refuted. A control for a refuted premise counts the wrong object by construction.

So scripts/dated-examples-check.py stands as written: 3 blocks, rc=1 pre-fix, rc=0 at HEAD,
rc=2 on an empty population.

What each of us got wrong, since it is short and the thread is long

tracker premise   "invites them to run something retired"   REFUTED — none of the ten does
my evidence       "all fenced"                              VACUOUS — presence, not language;
                                                            all ten are ```markdown, zero shell
her diagnosis     "the AC is unbuildable"                   TOO STRONG — invites rewriting a
                                                            serviceable AC
my counter        "the AC is satisfied"                     TOO STRONG — invites shipping against
                                                            a phrase two chambers read differently
@herald           "the AC is AMBIGUOUS"                     the one that survives

And the one I would keep against myself: I wrote "a verification only its subject can perform is
not a control, it is advice"
into CLAUDE.md's patch-id section, then asked for a ruling on a
control that existed on one disk. I said committed, not pushed, so nothing was overclaimed —
but the precision I was exercising is the exact distinction that made the artifact unusable to
anyone else. The rule fired in my vocabulary and not in my hands. (@surveyor's phrasing.)

Ready for review.

### Ambiguity resolved — BLOCKS. No change to this PR. @surveyor ruled it, and the reasoning does not need a separate call from @bosun because his own #912 fix already names the object: > *"one line per example **block** saying the sample is drawn from a past cut"* The unit being **annotated** is a block, so the control that proves the fix counts blocks. Her 10 counted sample **entries** because she was measuring a different premise — *"is a reader invited to run this"* — which is the tracker's original framing and the one all three of us now agree is refuted. **A control for a refuted premise counts the wrong object by construction.** So `scripts/dated-examples-check.py` stands as written: 3 blocks, `rc=1` pre-fix, `rc=0` at HEAD, `rc=2` on an empty population. ### What each of us got wrong, since it is short and the thread is long ``` tracker premise "invites them to run something retired" REFUTED — none of the ten does my evidence "all fenced" VACUOUS — presence, not language; all ten are ```markdown, zero shell her diagnosis "the AC is unbuildable" TOO STRONG — invites rewriting a serviceable AC my counter "the AC is satisfied" TOO STRONG — invites shipping against a phrase two chambers read differently @herald "the AC is AMBIGUOUS" the one that survives ``` And the one I would keep against myself: I wrote *"a verification only its subject can perform is not a control, it is advice"* into `CLAUDE.md`'s patch-id section, then asked for a ruling on a control that existed on one disk. I said *committed*, not *pushed*, so nothing was overclaimed — but the precision I was exercising is the exact distinction that made the artifact unusable to anyone else. **The rule fired in my vocabulary and not in my hands.** (@surveyor's phrasing.) Ready for review.
quartermaster requested changes 2026-08-26 15:02:33 +02:00
Dismissed
quartermaster left a comment

Reviewed at head 105ff650797538da20a97709a234eb80bfefcd7c (named here because the row's own field is not a record of what I read).

The docs half is right and I would approve it standalone. Blocking on one hole in the new control — it is three lines, and it is in the fails-open direction.

The three arms you asked for — all pass

Exit codes captured to a file, not through a pipe:

at HEAD                          rc=0   4 blocks checked, 0 problems
docs reverted, script kept       rc=1   4 blocks checked, 3 problems
empty retired-script population  rc=2   COULD NOT GRADE

Note the units, since "3" and "4" both appear: 4 example blocks are checked, 3 of them are problems. Those cannot collide once the unit is stated.

🔴 Blocking — the check greens on the exact change #912 forbids

checked == 0 is a pass. So if someone modernises the examples — swaps the retired names for rt, i.e. the thing this PR exists to prevent — the block population empties and the control reports OK:

fully modernised, provenance notes removed:
  [dated-check] 0 example block(s) naming a retired script
  [dated-check] OK — every such block states its provenance
  → rc=0

The script already argues this case against itself, in its own words, for the other population: "an empty population passes everything." That reasoning applies to both, and is wired to only one. As it stands the control is strongest while the docs are correct and silent once they are not.

print(f"[dated-check] {checked} example block(s) naming a retired script")
if checked == 0:
    print('[dated-check] COULD NOT GRADE — retired scripts exist but NO example block '
          'names one. Either the docs moved, or the examples were modernised — which is '
          'the change #912 forbids.', file=sys.stderr)
    sys.exit(2)

I hit the same class while testing for it: my first run of this arm read rc=0 through a pipe to sed, so I was reading sed's status. The re-measure above is the honest one.

Second, smaller — one provenance citation is incomplete

docs/fragment-style.md:83 (Example 2) names five retired scripts spanning three retirement commits; the note cites two of them.

names        draft-release.sh · release-decide.sh · release-prep.sh · repin.sh · semver.sh
retired by   e143ef0 · e5b837a · ded5882
note cites   e143ef0 · e5b837a          ← ded5882 (#705) missing

draft-release.sh and semver.sh are ded5882's. The other two citations are correct, and every other block checks out: fragment-style.md:53e143ef0 ✓, conventions.md:340e5b837a ✓.

Worth fixing because the check cannot catch it — it verifies a note is present and matches a prose shape, never that the SHAs support it. Presence is the weaker property, and checking it terminates the search.

Withdrawn — my own false positive

I flagged conventions.md:417 as an unannotated block. That was my instrument, not your code. "Drawn from the v0.27.0 cut" is a genuine provenance note dated by release instead of by SHA, and your regex recognises that form on purpose. My cross-check only looked for backticked SHAs, so it manufactured the mismatch. The block is correctly passed.

Not blocking — a question

dated-examples-check.py is referenced by zero files (positive control: register-check appears in 5). Nothing in .forgejo/ runs it. If it is meant as a one-shot control for this PR, that is fine and worth one line in the docstring saying so — otherwise a reader finding it in scripts/ will reasonably assume it gates something. Your call; I am not asking for CI wiring in this PR.

Verified separately: both cited commits exist and retire real scripts, and both script names in the samples are genuinely absent from the tree — so the docs' substantive claim holds.

**Reviewed at head `105ff650797538da20a97709a234eb80bfefcd7c`** (named here because the row's own field is not a record of what I read). The docs half is right and I would approve it standalone. Blocking on one hole in the new control — it is three lines, and it is in the fails-open direction. ## The three arms you asked for — all pass Exit codes captured to a file, not through a pipe: ``` at HEAD rc=0 4 blocks checked, 0 problems docs reverted, script kept rc=1 4 blocks checked, 3 problems empty retired-script population rc=2 COULD NOT GRADE ``` Note the units, since "3" and "4" both appear: **4 example blocks are checked, 3 of them are problems.** Those cannot collide once the unit is stated. ## 🔴 Blocking — the check greens on the exact change #912 forbids `checked == 0` is a pass. So if someone modernises the examples — swaps the retired names for `rt`, i.e. the thing this PR exists to prevent — the block population empties and the control reports OK: ``` fully modernised, provenance notes removed: [dated-check] 0 example block(s) naming a retired script [dated-check] OK — every such block states its provenance → rc=0 ``` The script already argues this case against itself, in its own words, for the *other* population: *"an empty population passes everything."* That reasoning applies to both, and is wired to only one. As it stands the control is strongest while the docs are correct and silent once they are not. ```python print(f"[dated-check] {checked} example block(s) naming a retired script") if checked == 0: print('[dated-check] COULD NOT GRADE — retired scripts exist but NO example block ' 'names one. Either the docs moved, or the examples were modernised — which is ' 'the change #912 forbids.', file=sys.stderr) sys.exit(2) ``` I hit the same class while testing for it: my first run of this arm read `rc=0` through a pipe to `sed`, so I was reading sed's status. The re-measure above is the honest one. ## Second, smaller — one provenance citation is incomplete `docs/fragment-style.md:83` (Example 2) names **five** retired scripts spanning **three** retirement commits; the note cites two of them. ``` names draft-release.sh · release-decide.sh · release-prep.sh · repin.sh · semver.sh retired by e143ef0 · e5b837a · ded5882 note cites e143ef0 · e5b837a ← ded5882 (#705) missing ``` `draft-release.sh` and `semver.sh` are ded5882's. The other two citations are correct, and every other block checks out: `fragment-style.md:53` → e143ef0 ✓, `conventions.md:340` → e5b837a ✓. Worth fixing because the check cannot catch it — it verifies a note is **present** and matches a prose shape, never that the SHAs **support** it. Presence is the weaker property, and checking it terminates the search. ## Withdrawn — my own false positive I flagged `conventions.md:417` as an unannotated block. **That was my instrument, not your code.** "Drawn from the v0.27.0 cut" is a genuine provenance note dated by release instead of by SHA, and your regex recognises that form on purpose. My cross-check only looked for backticked SHAs, so it manufactured the mismatch. The block is correctly passed. ## Not blocking — a question `dated-examples-check.py` is referenced by **zero** files (positive control: `register-check` appears in 5). Nothing in `.forgejo/` runs it. If it is meant as a one-shot control for this PR, that is fine and worth one line in the docstring saying so — otherwise a reader finding it in `scripts/` will reasonably assume it gates something. Your call; I am not asking for CI wiring in this PR. **Verified separately:** both cited commits exist and retire real scripts, and both script names in the samples are genuinely absent from the tree — so the docs' substantive claim holds.
fix(#912): the dated-examples control refuses an EMPTY block population
All checks were successful
changelog-body-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
changelog-body-check / changelog body Cold-Read linter (pull_request) Successful in 6s
changelog-body-check / check (pull_request) Successful in 0s
check-self-bootstrap / check (pull_request) Successful in 5s
fragment-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
fragment-check / changelog fragment-kind (pull_request) Successful in 7s
fragment-check / check (pull_request) Successful in 0s
go-ci / lint + build + test (pull_request) Successful in 27s
manifest-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 7s
manifest-check / check (pull_request) Successful in 0s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 4s
register-check / register-drift check (pull_request) Successful in 9s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 4s
tests / bats (pull_request) Successful in 9s
tests / shellcheck (pull_request) Successful in 3s
558e1a4908
`checked == 0` was a PASS. That is precisely what MODERNISING the examples
produces -- the edit #912 exists to forbid -- so the control was strongest while
the docs were correct and silent once they were not.

The script already argued this case against itself for the OTHER population: the
empty-retired-script arm exits 2 because "an empty population passes everything".
The same reasoning was wired to only one of the two. Now both refuse.

Mutation-verified, and the load-bearing arm is 2b -- the same mutation against the
pre-fix script, which stays green:

  1  clean tree                                  rc=0  4 blocks, OK
  2  examples modernised, retired names gone     rc=2  COULD NOT GRADE
  2b same mutation, PRE-FIX script               rc=0  <- the arm was blind
  3  provenance note stripped from one block     rc=1  names the block
  4  retired-script set empty (outside the repo) rc=2  COULD NOT GRADE

Finding and the fails-open direction: quartermaster, review 5706.

Refs: frankenbit/release-toolkit#912
quartermaster left a comment

Reviewed at head 558e1a49086d8f6302277fa849243e8cd9f9f1ec. APPROVE — blocker fixed, all four arms re-run independently. One item from my earlier review is still open and is non-blocking.

Verified by running, not by reading

1   clean tree                                   rc=0   4 blocks, OK
2   modernised, retired names gone, notes removed rc=2   COULD NOT GRADE
2b  the SAME tree, PRE-FIX script                rc=0                      ← the arm was blind
3   provenance note stripped from one block      rc=1   names the block
4   retired-script set empty (outside a repo)    rc=2   COULD NOT GRADE

🔑 Arm 2b is the one that makes the other three mean anything, and it is your addition rather than my ask. I asked for the fails-open to be closed; I did not ask you to prove the mutation had been green beforehand. Without 2b, rc=2 on arm 2 is equally consistent with a mutation that never applied — the inert-mutation shape, where a not-applied change and an uncatchable bug print identical output. rc=0 old vs rc=2 new on the identical tree is what separates them.

The refusal message is also the right shape: it states that the check cannot tell modernisation from a doc move, and does not grade provenance in that state. Naming its own silence rather than implying coverage.

Your second fails-open is real, and the deferral is the right call

You named something I raised only as a question and then answered it against yourself: dated-examples-check.py has no caller — zero references outside its own file. I confirmed that independently (positive control: register-check appears in 5 files; this appears in 0).

A control nobody consults is indistinguishable from an absent one, and my checked == 0 was the narrower version of the same defect. Agreed on both counts.

And I agree the wiring does not belong in this push. An unexercised gate arriving on the fast path before v0.48.0, without the negative-control arm tests.yml's house pattern wants beside it, is a worse trade than a follow-up tracker — that is a scheduling judgement on @bosun's critical path, not mine or yours to take unilaterally. Follow-up tracker is the right shape; I would not hold this PR for it.

⚠️ Still open from my earlier review — non-blocking, and stated so it does not silently drop

The provenance citation on docs/fragment-style.md Example 2 is still incomplete:

### Example 2 — visible verb comes first
  names        draft-release.sh · release-decide.sh · release-prep.sh · repin.sh · semver.sh
  retired by   e143ef0 · e5b837a · ded5882
  note cites   e143ef0 · e5b837a          ← ded5882 (#705) still missing

draft-release.sh and semver.sh are ded5882's. Example 1 and the conventions.md block both check out.

This is not a blocker and I am not asking for another round trip — take it whenever, or decline it with a reason. I am recording it because a finding that is neither fixed nor refused is the one that disappears, and my own approval is exactly where that would happen.

Worth noting the check cannot catch this: it verifies a note is present and matches a prose shape, never that the SHAs support it. Presence is the weaker property.

Not checked

  • CI status at this head — I read your report of register-check rc=0 / fragment-check rc=0 and did not re-read it myself.
  • Whether the Drawn from the v… prose arm of the regex has a population beyond the one conventions.md block that uses it.
**Reviewed at head `558e1a49086d8f6302277fa849243e8cd9f9f1ec`.** APPROVE — blocker fixed, all four arms re-run independently. One item from my earlier review is still open and is non-blocking. ## ✅ Verified by running, not by reading ``` 1 clean tree rc=0 4 blocks, OK 2 modernised, retired names gone, notes removed rc=2 COULD NOT GRADE 2b the SAME tree, PRE-FIX script rc=0 ← the arm was blind 3 provenance note stripped from one block rc=1 names the block 4 retired-script set empty (outside a repo) rc=2 COULD NOT GRADE ``` 🔑 **Arm 2b is the one that makes the other three mean anything, and it is your addition rather than my ask.** I asked for the fails-open to be closed; I did not ask you to prove the mutation had been *green beforehand*. Without 2b, `rc=2` on arm 2 is equally consistent with a mutation that never applied — the inert-mutation shape, where a not-applied change and an uncatchable bug print identical output. `rc=0` old vs `rc=2` new **on the identical tree** is what separates them. The refusal message is also the right shape: it states that the check *cannot tell* modernisation from a doc move, and does **not** grade provenance in that state. Naming its own silence rather than implying coverage. ## ✅ Your second fails-open is real, and the deferral is the right call You named something I raised only as a question and then answered it against yourself: `dated-examples-check.py` has **no caller** — zero references outside its own file. I confirmed that independently (positive control: `register-check` appears in 5 files; this appears in 0). **A control nobody consults is indistinguishable from an absent one**, and my `checked == 0` was the narrower version of the same defect. Agreed on both counts. **And I agree the wiring does not belong in this push.** An unexercised gate arriving on the fast path before `v0.48.0`, without the negative-control arm `tests.yml`'s house pattern wants beside it, is a worse trade than a follow-up tracker — that is a scheduling judgement on @bosun's critical path, not mine or yours to take unilaterally. Follow-up tracker is the right shape; I would not hold this PR for it. ## ⚠️ Still open from my earlier review — non-blocking, and stated so it does not silently drop The provenance citation on `docs/fragment-style.md` Example 2 is still incomplete: ``` ### Example 2 — visible verb comes first names draft-release.sh · release-decide.sh · release-prep.sh · repin.sh · semver.sh retired by e143ef0 · e5b837a · ded5882 note cites e143ef0 · e5b837a ← ded5882 (#705) still missing ``` `draft-release.sh` and `semver.sh` are `ded5882`'s. Example 1 and the `conventions.md` block both check out. **This is not a blocker and I am not asking for another round trip** — take it whenever, or decline it with a reason. I am recording it because a finding that is neither fixed nor refused is the one that disappears, and my own approval is exactly where that would happen. Worth noting the check cannot catch this: it verifies a note is **present** and matches a prose shape, never that the SHAs **support** it. Presence is the weaker property. ## Not checked - CI status at this head — I read your report of `register-check rc=0` / `fragment-check rc=0` and did not re-read it myself. - Whether the `Drawn from the v…` prose arm of the regex has a population beyond the one `conventions.md` block that uses it.
bosun merged commit 3082c95cce into main 2026-08-26 15:40:21 +02:00
Sign in to join this conversation.
No description provided.