Skip to content

fix(release): #1189 — the v0.66 release notes' two tag-gate defects: shipped artifacts filed [Unreleased], and two remembered counts - #1258

Merged
avrabe merged 2 commits into
mainfrom
fix/v066-changelog-unreleased
Sep 10, 2026
Merged

fix(release): #1189 — the v0.66 release notes' two tag-gate defects: shipped artifacts filed [Unreleased], and two remembered counts#1258
avrabe merged 2 commits into
mainfrom
fix/v066-changelog-unreleased

Conversation

@avrabe

@avrabe avrabe commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

Two defects in the v0.66.0 release notes, both found at the tag gate on the tag candidate itself. v0.66.0 is not tagged, so both are fixable now and neither would have been afterwards.

1. Two of this release's own artifacts were filed under [Unreleased]

The release PR (#1251) wrote a fresh, editorially-organised [0.66.0] section BELOW the existing [Unreleased] heading instead of renaming it. The two lane-written entries under it — RQ-66-DELETE and RQ-66-WATCHED — survived the release and the cold review, which edited inside that block (#1253 corrected a stale emulation floor there) rather than noticing the block itself.

The previous three tags are the discriminating evidence: git show v0.6{3,4,5}.0:CHANGELOG.md each ship with no [Unreleased] heading at all. The convention here is rename, not append. v0.66.0 would have been the first release to publish its own shipped work under a heading asserting it is not shipped, and the first thing v0.67 would inherit.

Nothing machine-reads it, which is exactly why no gate caught it: claims.yaml lists CHANGELOG.md as unpinned_ok ("append-only release narrative; no live current-state claims"), and no script or workflow greps the heading.

Deleted, not relocated. Moving the block verbatim would have republished a lane-scoped number as a release-scoped one — the "84 of 89" shape this release's own cold review just corrected. Its RQ-66-DELETE entry says selector_lines_code "stays 19,896, no waiver": true of that lane's diff, false of v0.66, which finished at 20,097 with 21 waivers.

Verified recoverable before dropping, not assumed: all four oracle names and their red-first numbers are in docs/status/MUTATION_SURVEY.md (in more detail than the CHANGELOG carried) and artifacts/release-v0.66/RQ-66-WATCHED.yaml; #1240/#1241, the 27 % / 25 % pair, the DEAD-reach gate and mutants_untested holding at 4 with its reason are already in [0.66.0]. One fact was not, and is carried forward release-scoped: the emulation floor 346751 -> 367759, both endpoints re-derived from ci.yml at the v0.65.0 tag and at HEAD.

2. Two scorecard "since" counts were remembered, not derived — and both were wrong

Re-deriving every number in the scorecard against the shipped source at every tag, the way the cold review re-derived the parity figure:

claim published derived
sel_dsl_rules "flat, thirteenth release" unchanged since v0.59.0 — eighth release at 80
selector_lines_code "eighth consecutive rise" eight releases since v0.58, not one fall (v0.63 was +0)

sel_dsl_rules counted over coq/vcr_sel_rules.manifest, the file claims.yaml itself derives the pin from: 50 from v0.47 through v0.57, 74 at v0.58, 80 at v0.59 and every tag since. Thirteen matches nothing in that history. selector_lines_code's per-tag deltas are +327 +911 +14 +14 +0 +513 +156 +201 — seven rises in eight releases. "Never fallen" is what the history supports, and is the stronger claim anyway.

Neither phrase appears anywhere else (grepped across every .md, .yaml, .py). The derivation for each is now stated beneath the table so the next reader can check rather than inherit.

Verified sound in the same pass, so the table is not left half-audited: selector_lines_code 19896 and selector_wildcard_arms_code 55 are the values pinned at the v0.65.0 tag; the v0.66 column matches claim_check --metric live; and known_open_pins = 104 at v0.65 reproduces exactly by running the shipped _pin_table derivation against a detached worktree of the v0.65.0 tag over the four tables that existed there (parity 103 + home-alias 1) — which also independently confirms the 622-assertion base the cold review named.

Checked for a second consequence: there is none

A positional extractor would not contain the string "Unreleased", so grepping for it does not rule out the published GitHub release page having carried the wrong section. .github/workflows/release.yml builds the release with gh release create --generate-notes — GitHub generates the body from commits and PRs and never reads CHANGELOG.md. The defect was confined to the in-repo file.

Gates

claim_check 0 · status_evidence 0 · oracle_wiring 0 · version_pins 0

Refs #1189

🤖 Generated with Claude Code

https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L

avrabe and others added 2 commits September 10, 2026 12:38
…ts under [Unreleased]

Found at the tag gate, on the tag candidate itself. The v0.66.0 release PR
wrote a fresh, editorially-organised [0.66.0] section BELOW the existing
[Unreleased] heading instead of renaming it, so the two lane-written entries
under it — RQ-66-DELETE and RQ-66-WATCHED — survived the release and the cold
review, which edited inside that block rather than noticing it.

THE DISCRIMINATING EVIDENCE IS THE PREVIOUS THREE TAGS. v0.63.0, v0.64.0 and
v0.65.0 each shipped with NO [Unreleased] heading at all: the convention here
is rename, not append. v0.66.0 would have been the first release to publish
its own shipped work under a heading asserting it is not shipped, and the
first thing v0.67 would inherit.

NOTHING MACHINE-READS IT, which is why no gate caught it and why it would
have been permanent. claims.yaml lists CHANGELOG.md as `unpinned_ok`
("append-only release narrative; no live current-state claims") and no script
or workflow greps the heading.

THE BLOCK IS DELETED, NOT RELOCATED — moving it verbatim would have
republished a LANE-SCOPED number as a RELEASE-SCOPED one, which is the "84 of
89" shape this release's own cold review just corrected. Its RQ-66-DELETE
entry says `selector_lines_code` "stays 19,896, no waiver": true of that
lane's diff, false of v0.66, which finished at 20,097 with 21 waivers. The
[0.66.0] scorecard already states the release-scoped figure.

VERIFIED RECOVERABLE BEFORE DROPPING, not assumed: all four oracle names and
their red-first numbers live in docs/status/MUTATION_SURVEY.md (in more
detail than the CHANGELOG carried) and artifacts/release-v0.66/
RQ-66-WATCHED.yaml; #1240/#1241, the 27 %/25 % pair, the DEAD-reach gate and
`mutants_untested` holding at 4 with its reason are all already in [0.66.0].

ONE FACT WAS NOT, and is carried forward release-scoped: the emulation floor
346751 -> 367759, both endpoints re-derived from ci.yml at the v0.65.0 tag
and at HEAD rather than copied.

    claim_check 0 · status_evidence 0 · oracle_wiring 0 · version_pins 0

Refs #1189

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
…mbered, not derived; both were wrong

Found at the tag gate by re-deriving every number in the [0.66.0] scorecard
against the shipped source at every tag, the way this release's own cold review
re-derived the parity figure. Three of five rows were already sound. Two were
not, and both are the same failure: a count of releases carried in prose that
no derivation ever produced.

sel_dsl_rules: "flat, thirteenth release" -> UNCHANGED SINCE v0.59.0, the
EIGHTH release at 80. Counted over `coq/vcr_sel_rules.manifest` — the file
`claims.yaml` itself derives the pin from — at every tag: 50 from v0.47 through
v0.57, 74 at v0.58, 80 at v0.59 and every tag since. Thirteen matches nothing in
that history.

selector_lines_code: "eighth consecutive rise" -> EIGHT RELEASES SINCE v0.58
AND NOT ONE FALL. The per-tag deltas are +327 +911 +14 +14 +0 +513 +156 +201, so
SEVEN of the eight are rises and v0.63 is exactly +0. "Never fallen" is what the
history supports and is the stronger claim anyway; "consecutive rise" is
falsifiable and false.

Neither phrase appears anywhere else — grepped across every .md, .yaml and .py
in the tree. The correction is contained to the table, and the derivation for
each is stated beneath it so the next reader can check rather than inherit.

VERIFIED SOUND IN THE SAME PASS, so the table is not left half-audited:
`selector_lines_code` 19896 and `selector_wildcard_arms_code` 55 are the values
pinned at the v0.65.0 tag; the v0.66 column matches `claim_check --metric` live
(20097/21 waivers, 56/2 waivers, 127 against baseline 27/3 waivers, 80, 4); and
`known_open_pins` = 104 at v0.65 reproduces EXACTLY by running the shipped
`_pin_table` derivation against a detached worktree of the v0.65.0 tag over the
four tables that existed there (parity 103 + home-alias 1), which also confirms
the 622-assertion base the cold review named.

    claim_check 0 · status_evidence 0 · oracle_wiring 0 · version_pins 0

Refs #1189

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L
@avrabe avrabe changed the title fix(release): #1189 — v0.66 would have shipped two of its own artifacts under [Unreleased] fix(release): #1189 — the v0.66 release notes' two tag-gate defects: shipped artifacts filed [Unreleased], and two remembered counts Sep 10, 2026
@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@avrabe
avrabe merged commit 2e1a828 into main Sep 10, 2026
69 checks passed
@avrabe
avrabe deleted the fix/v066-changelog-unreleased branch September 10, 2026 12:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant