Repository navigation
docs(adr): amend ADR-0125 to admit the maintainer-approved next snapshot lane beside D1 (#29466 ruling B) - #30719
Conversation
…pshot lane beside D1 Ruling B on the release-cadence decision card admits a second publish path: a dispatch-only `next` snapshot cut from `main`, proposed daily, full battery green at that commit, versioned in the workspace only and published with `changeset publish --tag next --no-git-tag`, held at `environment: release` like the stable publish, pushing no tag, cutting no Release, never touching the Version Packages PR and never moving `latest`. D1 now reads "the version commit is the only stable publish"; D1-D6 and the 2026-09-29 amendment are not rewritten. The dist-tag guard is stated as a requirement on the release.yml lane card, not as workflow text. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
|
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8 Contract reviewServed-tier: Independent full review of the ADR-0125 amendment on card #30590, ordered by the 2026-10-25 rule (substance against the code and the first consumer, by an agent other than the drafter). Read: ruling 6663894403 and the whole #29466 thread, cards #30590 (triage 6666636809, claim 6671491544, dev report 6671957724) and #30591, PR #30719 body and diff ( ① Derived judgmentsFidelity to ruling 6663894403 — every bound line is present, none is softened; four sentences decide what the ruling left open (named).
Sentences that decide something the ruling did not decide, all in the record's own voice rather than marked as this record's reading:
Nothing in the ruling is softened except as ④-a states; nothing material is added beyond the four sentences above. The "Why" section's numbers are the ruling card's (1,700 PRs a week measured as 1,776; 214 changesets at Truth against the code at
Not decided here lists three items (runtime image, the proposal's form, the channel after the trial). Right: ② Semver levelNone. Docs-only diff: one file under ③ Boundary flagsThe boundary this record draws is "the stable lane is untouched; the snapshot lane writes M1 (must-fix) — a package's first publish moves S1 (should-fix) — the two uses of S2 (should-fix) — Smaller flags, none a finding on its own:
④ Design judgmentThe ADR against its first consumer (#30591) and the code it cites. The record is well built: it restates the ruling line by line, reads D1 to D6 against the real ④-a — "at that commit" versus "at or before" (the drafter's open choice; recommendation A was to leave it). Leaving it as written is not right, because the record is not silent: bound line 3 says "green at the commit it snapshots", and "The full-battery reading" requires the stable lane's reader "against the snapshot's own commit". That reader ( ④-b — a pointer callout under D1 (the drafter chose none). Add it, under D1 and D4, in the 2026-09-29 house shape (ADR:61, :91: a blockquote " Fidelity attributions (S5, should-fix, wording only). Mark the trial-start sentence and the D3 "removed in the same change" sentence as this record's readings (or cite 6664069140 for the first), so the next reader can tell the maintainer's lines from the seat's. Must-fix: M1. Should-fix: S1, S2, S3 (④-a), S4 (④-b), S5. A re-render is owed on the head that carries them. Implemented-by: VERDICT: FAIL |
…but rule, exclusivity, pre mode, exact commit, callouts) Independent full review of the amendment (contract review on PR #30719) failed round 1 on one must-fix and five should-fixes; all are applied as the seat ruled: - M1: the snapshot lane never debuts a package — a fixed-group member with no version on npm is refused before anything publishes, because a first publish takes `latest` whatever tag it carries; the stable lane debuts packages. The guard sentence now holds with both rules. - S1: a snapshot dispatch runs none of the stable lane's jobs (strictly subtractive, read like `refresh_version_pr`) and the snapshot job runs on no other dispatch; the un-sweepable stale-prompt hazard is named. - S2: the lane refuses while `.changeset/pre.json` is `mode: pre`; the release-channels table is a consumer #30591 updates; a stable publish moving `next` up to the stable is stated as intended. - S3: the ruling's literal "at that commit" — the lane snapshots the head of the newest green full-battery run, distance zero, one reader. - S4: 2026-09-29 house-shape callouts under D1 and D4; D1-D6 text unchanged. - S5: the trial start (seat note 6664069140) and the D3 "removed in the same change" sentence are marked as this record's readings. - Review observations for #30591 folded into the requirements: 109-package fixed group, packed manifests for the dry run, changesets consumed and CHANGELOGs written in the checkout, bare `changeset version --snapshot` not `pnpm run version`, the snapshot job name must not match the stable prompt shape. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
…wording fixes Drops ADR-0087 from the consumers #30591 updates (its one next sentence stays true), takes stale-prompts out of the exclusivity list so it agrees with "What does not change", describes the pnpm version chain correctly, and makes the debut refusal happen before any deployment is queued, like every other refusal in the section. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
…ghout, drop a wrong parenthetical The D1/D4 callouts and the forbidden list now name the stable lane's publishing jobs, matching the requirement, and the Workspace-only paragraph loses a parenthetical about the template syncs that misdescribed them. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ihL2ebbZkr2QAEG1x7UC8
|
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8 Contract reviewServed-tier: Round 4, the last check, of the independent full review on card #30590 (ADR-0125 amendment, #29466 ruling B). Round 1 on ① Derived judgmentsDo W2′ and W3a′ close? Both do. Nothing new is false.
Carried from rounds 1 to 3, re-checked at this head — all still hold. Every bound line of ruling 6663894403 is carried unsoftened (line 3 in the ruling's own words, read literally). The sentences that decide what the ruling left open are the four readings forced by the ruling's own lines — the commit choice (head of the newest green full-battery run, distance zero from the reader that exists), the debut rule, the pre-mode refusal, exclusivity — plus the two marked as this record's readings (trial start, cites 6664069140; removal with D1's reversion, with the relay reason, AGENTS.md:315-316). No sentence in this delta decides anything. Truth against the code at ② Semver levelNone. Docs-only diff: one file under ③ Boundary flagsNo must-fix. No should-fix that holds anything open: W1, W2, W3, W2′ and W3a′ are closed on this head. One optional wording note, and the observations for the lane card, carried unchanged:
Observations for #30591, carried from rounds 2 and 3:
④ Design judgmentThe record is now uniform with itself and with the code it cites. Over four rounds the substance moved once — the debut rule, which repaired a specified guard that could not keep the ruling's strongest line against a package that is in the tree today — and the rest brought the record's sentences into agreement with each other and with Open: none. Must-fix: none. Implemented-by: VERDICT: PASS |
|
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8 席位核对 — ACCEPT ·
|
Requested by 田騏 · project thread
Fixes #30590
Ruling-ref: 6663894403
Clause-②: no
Metadata-protocol: none
维护者速读
docs/adr/0125-release-approval-gate-replaces-the-typed-version.md:末尾新增一节「Amendment (2026-11-05, [Decision] Release cadence: a week of merges is about 1,700 PRs, so each QA-gated release carries a very large delta and app repos wait days to install fixes #29466)」,状态行加一条修订记录,D1 与 D4 下各加一条指向该节的「release环境批准、发到latest);另加一条只能手工触发、每天提议一次、仍由您批准的next快照发布通道,快照不打 tag、不建 Release、不碰 Version Packages PR、永不移动latest,也不首发任何包(首发会写latest,首发归稳定版通道)。nextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591 的 release.yml 快照通道就不能动工。修订后 D1 读作「版本提交是唯一的稳定版发布」。第二轮按独立复核的裁定补了四条对 ci(release): add the dispatch-onlynextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591 的硬要求:不首发包、快照派发不跑任何稳定版作业、pre 模式下拒绝、只快照「全量测试恰在该提交通过」的提交。@objectstack/service-push在树里却从未发布过)和「What the ruling binds」八条(与裁决评论 6663894403 逐条对应);其次是 D1、D4 下新增的两条提示。latest永不被快照移动,每次快照仍需您批准。What changes
One file, docs only. Round 2 (independent full review, round 1 FAIL, record 6672362721) is folded in; the diff against
origin/mainis now four hunks:**Status**:line gains one· **Amended** (2026-11-05, #29466 …)entry, in the shape the 2026-09-29 entry set, pointing at the new section;⚠️ Amended 2026-11-05blockquote callout under D1 and another under D4, in the 2026-09-29 house shape — pointers to the new section; D1 to D6 text is not rewritten;## Amendment (2026-11-05, #29466): a maintainer-approved next snapshot lane beside D1, with: Status of this amendment · Why · What the ruling binds (the eight bound lines of ruling record 6663894403, numbered; two sentences marked as this record's own readings — the trial start, citing seat note 6664069140, and the D3 "removed in the same change" consequence) · How D1 to D6 read with it (D1 as amended is the only stable publish; D2 and D3 gate the snapshot job identically; D4's repair lane andforceuntouched; D5's no-displacement property gains a third lane; D6 gains nothing) · What the lane must satisfy — requirements on ci(release): add the dispatch-onlynextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591, not workflow text: the dist-tag guard and the debut rule (a fixed-group member with no version on npm is refused, because a first publish takeslatestwhatever tag it carries;@objectstack/service-pushis that case today), dispatch-only and exclusive (a snapshot dispatch runs none of the stable lane's jobs, read likerefresh_version_pr; the snapshot job runs on no other dispatch; the un-sweepable stale-prompt hazard named), the commit (the head of the newest green full-battery run, distance zero underscripts/ci/scheduled-full-run.mjs --release-gate, so the ruling's "at that commit" holds literally), not during a major's RC cycle (.changeset/pre.jsonmode: prerefuses; the release-channels table indocs/releases-maintenance.mdis a consumer ci(release): add the dispatch-onlynextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591 updates), workspace only (barechangeset version --snapshot next, neverpnpm run version; consumed changesets and rendered CHANGELOGs stay uncommitted), the approval screen (the name must not match the stable prompt shaperelease-pending-publish.mjsreads), the dry run (109-package fixed group, not 69; packed manifests, since changesets leavesworkspace:*ranges alone) · What stays forbidden · What does not change, with a "Not decided here" list.Not touched, on purpose: the TL;DR (the ADR's own convention keeps amendments out of it — the 2026-09-29 amendment did not touch it either), the text of D1 to D6, the 2026-09-29 amendment,
.github/workflows/release.yml, anddocs/adr/README.md(the index row keys on the first status keyword,Accepted, so it is unchanged;node scripts/adr-index.mjs --reportanswers "current").Tests
Docs only: no package moved, so local verification scope ① (dependency closure) and ② (package tests and typecheck) are empty by rule. The gates that read
docs/adr/**are under Verification.Acceptance notes
docs/adr/**, Tier H): this PR stays a draft with no reviewers and no assignees. The seat orders the independent full review and does the hand-off; landing is the maintainer's hand.nextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591 now live in the amendment's requirements list. A re-render of the review is owed on this head.nextchannel when the trial ends.npm view):@objectstack/service-pushanswers 404 while the tree carries it at 18.2.0 in the fixed group — the live debut case;nextresolves to 18.2.0 (a stable version, whichscripts/release-dist-tags.mjsleaves alone by its own rule) andlatestto 18.3.0..changeset/config.jsoncarries nosnapshotblock, sochangeset version --snapshot nextcomposes its default0.0.0-next-timestamp version shape — the dry run the ruling asks for will show it; no.changeset/pre.jsonexists atorigin/main.#10150link on the Status line (cited as a pull) answers 404 through the issues API; left as is.Verification
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat head8adeb7793e(after the merge oforigin/mainab44ec94b0) derived 21 commands (13 matched by path, 8 whole-tree). All 21 ran at that head with each exit code captured before any pipe; every one exited 0 on the first pass. Reconciliationdispatch-gates --ran: 21 derived families accounted for, 21 run, 0 NOT MEASURED. (Round 1 at28c6fc09b8: the same 21 green after one prerequisite build of@objectstack/formulaand@objectstack/lintunder the verify lock.)node scripts/adr-index.mjs --report: exit 0 — "docs/adr/README.md is current, every record parsed, self-test 46 assertions green".git diff --stat origin/main...HEAD: 1 file, +69 / −1 — exactly one removed line (the Status line); D1 and D4 gain appended callouts, no decision text is rewritten.check-issue-citations(the citations this diff adds — [Decision] Release cadence: a week of merges is about 1,700 PRs, so each QA-gated release carries a very large delta and app repos wait days to install fixes #29466, docs(adr): amend ADR-0125 to admit a maintainer-approvednextsnapshot lane beside D1 (#29466 ruling B) #30590, ci(release): add the dispatch-onlynextsnapshot lane to release.yml, held at environment: release, never movinglatest(#29466 ruling B) #30591, chore(release): exit Changesets pre mode (next), so the next Version Packages PR versions 18.0.0 GA #24528, release: after a stable publish, thenextandrcnpm dist-tags still point belowlatest(npx create-objectstack@next installs 18.0.0-next.5, older than 18.0.0) #25581 — resolve on the board),Lint & Repo Gatesand the other PR check-runs; their verdicts are read from the PR, and this report does not wait for them.🤖 Generated with Claude Code