Uh oh!
There was an error while loading. Please reload this page.
fix(release): carry QUICK_REFERENCE's Current Release block in changeset:version - #5396
Merged
os-support-ai merged 1 commit intoAug 20, 2026
Merged
Conversation
…set:version (#5394) The "Current Release" block fossilised once per release, three times (#4642, #4977, #5394). Its own preamble assumed a human holds the anchor when it moves — but the anchor moves inside `changeset version`, run by `changeset-release.yml` with nobody present, and the release PR is not a backstop: every `ci.yml` run on `changeset-release/main` is `conclusion: action_required` with `created_at == run_started_at`, because a GITHUB_TOKEN-authored PR starts no workflows. The first thing that reads a release is the push build on `main`, which is why `main` — never a PR — went red every time. So the derivation has to RUN where the anchor moves. `changeset:version` now runs `scripts/sync-quick-reference-release.mjs`, which rewrites only the version literals of the anchored rows, preserving each row's hand-written anchor note. It refuses (non-zero) rather than guessing when a row's literal count no longer matches its anchor, and leaves the unanchored TypeScript row alone. `quick-reference-current-release-4143.test.ts` is untouched — it stays the judge. The new test pins the wiring in both places (`package.json` and the workflow's `version:` input) and pins that the writer and the judge spell `VERSION_LITERAL` identically. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
os-support-ai
marked this pull request as ready for review
August 20, 2026 11:58
Uh oh!
There was an error while loading. Please reload this page.
os-support-ai
deleted the
claude/issue-5394-quick-reference-release-drift
branch
August 20, 2026 11:58
This was referenced Aug 20, 2026
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 freeto 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.
Fixes#5394
mainwas red onscripts/__tests__/quick-reference-current-release-4143.test.ts:manifests at
17.6.0,QUICK_REFERENCE.mdstill saying17.5.0. The gate isuntouched — no skip, no exemption, no loosened assertion. It stays the judge; this PR
adds the thing that keeps the doc true so the gate has nothing to report.
Route chosen: B — carry it in the release, and why A cannot work alone
Measured on
origin/mainbefore choosing:changeset version, run bychangeset-release.ymlasversion: pnpm changeset:versionci.ymlrun on branchchangeset-release/mainhasconclusion: "action_required"withcreated_at == run_started_at— the workflow never executes. AGITHUB_TOKEN-authored PR starts no workflows. PR #4655 (the 17.6.0 release) merged with one check run on its head sha, and that one started 7 seconds after the merge.pushbuild onmain— run 32356587040,Test (coverage)failure after 39 min 26 sThat is why
main— never a PR — goes red once per release. It also settles A vs B:row is written, not when.
changeset versionwould still bump 40 manifests withnothing re-running the derivation, the doc would still be a version behind, and the
push build on
mainwould still be the first reader. A alone buys nothing here.manifests. A block generated wholesale from those same manifests would leave the gate
comparing generated text with its own generator's input, and the rows' hand-written
anchor notes — which the gate's header calls out as deliberately rewordable — would
become script-owned prose.
So this PR runs A's mechanism at B's moment: a derivation that executes inside
changeset:version, rewriting only the version literals and leaving every word ofprose alone. The gate keeps judging the result with its own independent derivation, so a
bug in the writer still goes red.
The change
scripts/sync-quick-reference-release.mjs— reads the anchors, rewrites the literalsof the anchored rows in place. It refuses (non-zero) rather than guessing when a row's
literal count no longer matches its anchor's, and never touches the unanchored
TypeScriptrow.package.json—changeset:versionis nowchangeset version && node scripts/sync-quick-reference-release.mjs, plusquick-reference:sync/quick-reference:checkfor humans bumping Node, pnpm or thespec range by hand.
QUICK_REFERENCE.md— the row catches up to17.6.0, and the block's preamble namesthe new mechanism.
scripts/__tests__/sync-quick-reference-release.test.ts— 12 tests. The load-bearingones pin the wiring in both places (
package.json, and the workflow'sversion:input, so nobody can bypass the npm script) and pin that the writer and the judge spell
VERSION_LITERALidentically — two tokenizers would be free to drift into a doc thescript calls synced and the gate calls stale.
Recurrence proof: a real release bump, no hand edit
Not a simulation of the script — the actual release command, in the worktree:
81 files modified by that one command,
QUICK_REFERENCE.mdamong them — so the changesetsaction commits the doc in the same
chore: release packagescommit as the manifests.Control leg (what
changeset versionalone produces): doc reverted to the pre-bumpliteral, manifests left at
17.7.0— the gate goes red exactly as it did today, onerelease into the future:
The worktree was reset to the committed state afterwards (
git status --porcelainempty).Reverse verification — predicted before running, both legs matched
No build artifact sits between either leg and the tests. The gate reads
QUICK_REFERENCE.mdand the manifests off disk withfs; the test imports the.mjssource directly (
tsconfig.scripts.jsonallowJs, types inferred, nothing compiled).Nothing here has a
dist/, so no rebuild leg applies.changeset:versionwiringTest Files 1 failed / 1 passed— the failure is`changeset:version` invokes the sync script after bumping the manifestsQUICK_REFERENCE.mdtoorigin/mainLeg A is the one that matters: it is the difference between this card and a one-line edit.
With the wiring gone every other test still passes and the gate is still green — the tree
looks fixed and the next release reddens
mainagain. That single assertion is what makesthe recurrence visible.
Verification (all from the repo root, at
89cb6b0d1)Plus a manual control-byte scan of the untracked-at-the-time files (the tracked-file gate
could not see them yet): no hits.
pnpm check:published-distwas not run — it exceeded the 10-minute foreground budgetand it is outside this diff's surface (it guards
changeset:publish, unchanged here).Changeset
Empty frontmatter, deliberately. No package
src/is touched, so nothing publishes; perAGENTS.md that is the legal first-class way to declare "this releases nothing" rather than
leaving it undeclared. Scoring it
patchwould publish 39 packages for a docs-and-toolingchange.
What this does not cover
The
Reactrow states a variable-length list of majors; if that list ever changes lengththe script refuses the row and exits non-zero, failing the release loudly instead of
guessing which slot gets which value. Same for a literal wrapped across a line break. Both
land a human on the row — which is the right outcome, and neither has ever happened: the
only rows that have ever drifted are
Version(this family) andSpec/Client(#4977,whose own channel was closed by #4973).
Generated by Claude Code
Generated by Claude Code