fix(release): #1189 — the v0.66 release notes' two tag-gate defects: shipped artifacts filed [Unreleased], and two remembered counts - #1258
Merged
Conversation
…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
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.mdeach 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.yamllistsCHANGELOG.mdasunpinned_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) andartifacts/release-v0.66/RQ-66-WATCHED.yaml;#1240/#1241, the 27 % / 25 % pair, the DEAD-reach gate andmutants_untestedholding 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 fromci.ymlat thev0.65.0tag and atHEAD.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:
sel_dsl_rulesselector_lines_codesel_dsl_rulescounted overcoq/vcr_sel_rules.manifest, the fileclaims.yamlitself 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_code19896 andselector_wildcard_arms_code55 are the values pinned at thev0.65.0tag; the v0.66 column matchesclaim_check --metriclive; andknown_open_pins= 104 at v0.65 reproduces exactly by running the shipped_pin_tablederivation against a detached worktree of thev0.65.0tag 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.ymlbuilds the release withgh release create --generate-notes— GitHub generates the body from commits and PRs and never readsCHANGELOG.md. The defect was confined to the in-repo file.Gates
Refs #1189
🤖 Generated with Claude Code
https://claude.ai/code/session_01YJK5LZZEkV5smCY1jKn18L