Uh oh!
There was an error while loading. Please reload this page.
docs(changeset-gate): record the launch-window convention's end condition - #14227
Merged
Merged
Conversation
…tion The no-major guard documented the launch-window convention but not when it stops applying. A window-period convention with no written end condition erodes into a permanent exception. Records, in the file that enforces the convention so declared = enforced stays in one place: the convention applies during the launch window only; at GA (the fixed group's first general-availability major) the group returns to strict semver; until then the BREAKING banner and the ADR-0087 disposition are the mandatory information carriers for breaking-ness. Adds the self-referential note that this guard is what gets disarmed at GA. Comment-only; the gate's behaviour is untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WLJQhde67SeTccsmnBVarV
baozhoutao
marked this pull request as ready for review
September 1, 2026 15:28
Uh oh!
There was an error while loading. Please reload this page.
baozhoutao
deleted the
claude/issue-14043-launch-window-end-condition
branch
September 1, 2026 15:54
This was referenced Sep 1, 2026
4 tasks
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#14043
Records the launch-window versioning convention's end condition in the header of
scripts/check-changeset-no-major.mjs. Comment-only: the gate's behaviour is untouched.Why here
The card offered two candidate homes and triage ruled for one: 「落在
check-changeset-*今天记载该惯例的地方 —— declared = enforced 保持在同一处」, adding that it is the one place read by both machine and human. Derived onorigin/mainrather than assumed:scripts/check-changeset-no-major.mjs— the onlycheck-changeset-*file whose prose states the convention (WHY THIS EXISTS: "During the launch window we ship breaking changes asminor…").scripts/check-changeset-fixed.mjs— documents lockstep membership only; never the minor-for-breaking convention. No second copy, so nothing to cross-reference and nothing to duplicate.AGENTS.md— carries no mention of the launch window,no-major, major bumps or lockstep (git grep -i -E 'launch window|no-major|major bump|lockstep' -- AGENTS.mdis empty). The convention's documented home is genuinely the gate header, so this stays an ordinarydomain:devxPR rather than a governed-surface edit.scripts/objectui-changeset-digest.mjsalready points at this gate as the convention's home ("the same convention this repo'scheck-changeset-no-major.mjsenforces"). The reference direction was already correct and one-way.What is recorded
Faithful to the maintainer-ruled text (director decision batch B, 2026-09-01, 「同意」), with no dates or version numbers the ruling does not contain:
major.**BREAKING**banner in the changeset body plus the ADR-0087 migration-ledger disposition are the mandatory information carriers for breaking-ness — during the window they are the only signal there is, because the bump level is not one.Plus the self-referential sentence triage asked for: this guard is what gets disarmed at GA, so whoever closes the window retires this check and the
allow-majorescape hatch with it. "Reaching GA without touching this file means the window did not actually close."Pin disposition — no pin, because no idiom exists for prose
The dispatch asked whether load-bearing header prose has an existing pin idiom to reuse. Measured, and the answer is no:
check-changeset-no-major.mjs --self-testnever reads its own source (noimport.meta.urlread anywhere inselfTest()), so there is no in-file hook to extend.check-empty-changeset.mjs, pins a regex literal shared across four files — a code artifact, not prose.check-vendor-version-stamps.mjs: "this gate offers no baseline/ledger expansion remedy"), never the presence of a prose sentence.check-stall-guard-budget.mjs, where the point is to mask header prose from being read as data — the opposite.Per the dispatch fence, no pinning mechanism was invented for prose.
Enforcing state verified
So the paragraph's claims are true the day they land:
.changeset/pre.jsonis absent (the RC exemption is not active), and the gate runs in its enforcing state, printing: ✓ This diff introduces nomajorbump.Verification — all at HEAD
25d6547bGate family derived from the actual diff via
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(never a hand-built path list). 14 path-derived families + 2 convention-triggered by editing a gate script, all exit 0:node scripts/check-changeset-no-major.mjsnode scripts/check-ci-filter-parity.mjsnode scripts/check-cross-package-test-inputs.mjsnode scripts/check-shard-attestation.mjsnode scripts/check-test-completeness.mjsnode scripts/pm/bare-root-worklist.mjs --self-testpnpm check:agent-test-spellingpnpm check:bash32-floorpnpm check:changeset-gate-self-testspnpm check:cli-command-idspnpm check:cross-package-test-inputspnpm check:entry-guardpnpm check:parse-guardpnpm check:pnpm-filter-targetspnpm check:watch-hint-literalpnpm check:pm-dispatch-gates(convention)✓ dispatch-gates self-test: 1110 cases pass.node scripts/check-ratchet-remedy-authority.mjs(scripts/** prose)OK … 183 scripts sweptEvery exit code captured by redirect-then-read, never across a pipe.
check-test-completenessis NOT MEASURED, not green and not red. Its own output: PREREQUISITE NOT MET — this gate grades a savedturbo run testlog, and no log was named. It does not run tests and cannot produce one; CI tees the log and passes the path. Recorded as unmeasured rather than counted as a pass.Gate script's own test suite: this gate has no separate
*.test.ts—git grep -l check-changeset-no-major -- '*.test.ts' '*.test.mjs' '*.spec.ts'returns nothing. Its test surface is--self-test, which runs green above viacheck:changeset-gate-self-tests.ESLint — declared narrowing, not a skipped run. Ran
eslint --no-inline-config --format jsonon the changed file instead of the repo-wide sweep, with all three pieces of evidence:new ESLint().isPathIgnored('scripts/check-changeset-no-major.mjs')→false, so the file is genuinely in the linted set.--format jsonoutput: 1 file linted, 0 errors, 0 warnings.eslint.config.mjsstates — and backs with a measured positive control — that this repo runs one config which "never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file". With no cross-file type program, a comment-only edit in one file cannot move the verdict on any file it does not touch.CI runs the full
pnpm lintunconditionally regardless.Scope
skip-changeset— comment-only prose inscripts/, publishing nothing from any package.⛔ Not touched:
AGENTS.md(governed surface, and not the convention's home anyway) andcontent/docs/**. The customer-facing half is a separate follow-up. Worth noting for it:content/docs/protocol/backward-compatibility.mdx:207currently says the closing condition "is tracked separately and is deliberately not stated here" — this PR is what it defers to, so that page can now be pointed at a written end condition instead of a gap.Generated by Claude Code