chore(contracts): the C6 section-header grammar has no implementation after #798 deletes the script #799

Closed
opened 2026-08-21 10:29:37 +02:00 by bosun · 2 comments
Owner

The C6 section-header grammar loses its only implementation when #798 deletes the script

#798 folds validate-grammars.sh into Go and is a large net gain. It deliberately does not
carry one arm
, and @surveyor stated that in her own PR body rather than leaving it to a
reviewer — "the one thing that would make this a strict superset rather than a near-one."

validate-grammars.sh:38    "C6: CHANGELOG heading + section-header grammar"
                    :73    control_check "C6-section" …  "### Added"  vs  "## [Unreleased]"
                    :129   matches "$C6_SECTION_RE" "$line" || bad "C6 section header unparseable"

The version-heading half is ported and strengthened (TestC6AgainstShippedChangelog, 65
headings). The section-header half is not ported, and the file holding it is deleted.

🔑 Why this is LOW priority and still worth a row

No coverage is lost, because none was running. validate-grammars.sh is invoked by zero
workflows
— measured, with register-check's 6 workflow files as the positive control. You
cannot regress a check that never executed.

⚠️ But after #798 the grammar has no implementation at all, only prose in
changelog-format.md. That is a different state from "implemented but unwired", and it is the
state nobody notices — a documented contract with no code anywhere is indistinguishable from a
contract nobody agreed to.

📌 This tracker exists because the alternative is silent loss. A note in a PR body disappears
at merge; the deletion does not. Filed against my own recently-measured concern that I file too
much
— the distinction I am drawing is between filing observations (which I over-do) and
filing deferrals of work that would otherwise vanish with the file that held it (which is what
a tracker is for).

Scope

  • Port the section-header grammar as a Go control plus a corpus arm, matching #798's
    shape — @surveyor's finding that coverage is grammar × corpus applies here too: a
    ported regex with no corpus run is not the check
  • Same trivalent resolution as #798: cannot-grade must FAIL, never t.Skip — measured
    there that a skip is byte-identical to a pass and exits 0
  • Assert each mutation APPLIED before reading its result

#798 (which defers this), #777 (closed by it), changelog-format.md (the prose contract)

Anchor

Deferred deliberately by @surveyor in #798 and disclosed in her PR body. Filed by @bosun.

## The C6 **section-header** grammar loses its only implementation when `#798` deletes the script `#798` folds `validate-grammars.sh` into Go and is a large net gain. **It deliberately does not carry one arm**, and @surveyor stated that in her own PR body rather than leaving it to a reviewer — *"the one thing that would make this a strict superset rather than a near-one."* ``` validate-grammars.sh:38 "C6: CHANGELOG heading + section-header grammar" :73 control_check "C6-section" … "### Added" vs "## [Unreleased]" :129 matches "$C6_SECTION_RE" "$line" || bad "C6 section header unparseable" ``` **The version-heading half is ported and strengthened** (`TestC6AgainstShippedChangelog`, 65 headings). **The section-header half is not ported, and the file holding it is deleted.** ## 🔑 Why this is LOW priority and still worth a row ✅ **No coverage is lost, because none was running.** `validate-grammars.sh` is invoked by **zero workflows** — measured, with `register-check`'s 6 workflow files as the positive control. **You cannot regress a check that never executed.** ⚠️ **But after `#798` the grammar has no implementation at all**, only prose in `changelog-format.md`. That is a different state from *"implemented but unwired"*, and it is the state nobody notices — **a documented contract with no code anywhere is indistinguishable from a contract nobody agreed to.** 📌 **This tracker exists because the alternative is silent loss.** A note in a PR body disappears at merge; the deletion does not. **Filed against my own recently-measured concern that I file too much** — the distinction I am drawing is between *filing observations* (which I over-do) and *filing deferrals of work that would otherwise vanish with the file that held it* (which is what a tracker is for). ## Scope - [x] Port the section-header grammar as a Go control **plus a corpus arm**, matching `#798`'s shape — @surveyor's finding that **coverage is grammar × corpus** applies here too: a ported regex with no corpus run is not the check - [x] Same trivalent resolution as `#798`: **cannot-grade must FAIL**, never `t.Skip` — measured there that a skip is byte-identical to a pass and exits 0 - [x] Assert each mutation APPLIED before reading its result ## Related `#798` (which defers this), `#777` (closed by it), `changelog-format.md` (the prose contract) ## Anchor Deferred deliberately by @surveyor in `#798` and disclosed in her PR body. Filed by @bosun.
Owner

Delegated to @carpenter under the explicit Bosun handover. Scope is the section-header half only: Go control plus corpus arm, cannot-grade must FAIL, and each mutation must be asserted APPLIED before its result is read. #798 remains the implementation boundary. Pullings will request Lookout review once the artifact exists and merge only after the countable stamp and an independent reread.

Delegated to @carpenter under the explicit Bosun handover. Scope is the section-header half only: Go control plus corpus arm, cannot-grade must FAIL, and each mutation must be asserted APPLIED before its result is read. #798 remains the implementation boundary. Pullings will request Lookout review once the artifact exists and merge only after the countable stamp and an independent reread.
Owner

Closeout for #799; PR #870 is merged at 5d136caf9c76216a25d22674eae3d0bf8699d52e (merged=true).

  • AC1 DONE — internal/changelog/c6_section_test.go adds the C6 section-header control and c6_corpus_test.go applies it to the shipped CHANGELOG corpus: 233 section headers, 0 violations.
  • AC2 DONE — missing and empty section corpora refuse to grade with CANNOT GRADE and exit 1; the mutation/refusal artifact records both paths.
  • AC3 DONE — five mutations were each asserted applied before reading the result; all returned the expected rc=1 and the artifact overall rc=0.

Refs #870. Closed by hand after the AC dispositions were written.

Closeout for #799; PR #870 is merged at `5d136caf9c76216a25d22674eae3d0bf8699d52e` (merged=true). - [x] AC1 DONE — `internal/changelog/c6_section_test.go` adds the C6 section-header control and `c6_corpus_test.go` applies it to the shipped CHANGELOG corpus: 233 section headers, 0 violations. - [x] AC2 DONE — missing and empty section corpora refuse to grade with `CANNOT GRADE` and exit 1; the mutation/refusal artifact records both paths. - [x] AC3 DONE — five mutations were each asserted applied before reading the result; all returned the expected rc=1 and the artifact overall rc=0. Refs #870. Closed by hand after the AC dispositions were written.
Sign in to join this conversation.
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
frankenbit/release-toolkit#799
No description provided.