Repository navigation
fix(spec): the packageless-overlay-write-closed upgrade entry names both closed overlay write addresses - #29535
Conversation
…ed overlay write addresses The unreleased ADR-0087 semantic entry's surface and reason named only the write naming no package. The same release also closes the save, publish and rollback naming the read-only package itself onto its five overlay types, onto the TO the entry's replacement already prescribes. One entry now names both addresses and the rows each stored. Text only. Claude-Session: https://claude.ai/code/session_01JQwxbWytk9Ec5dXr38QrwZ Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 12 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 168 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin da402338d742a106576c146871270878dd8fe707 && git checkout da402338d742a106576c146871270878dd8fe707
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8e505db8178cedbed174049b211cc409b22adaea b99d86a144ed9c23d9170c5802a2f27ac480dd90 && git checkout -B drift-repro 8e505db8178cedbed174049b211cc409b22adaea && git merge --no-ff b99d86a144ed9c23d9170c5802a2f27ac480dd90
node scripts/docs-audit/affected-docs.mjs --json 8e505db8178cedbed174049b211cc409b22adaea
|
…ws bound to the read-only package Since the ceremony also moves rows bound to the read-only package itself, the entry's replacement names them, and gives a bound foreign_declaration row the remedy the cli prints (delete it naming the package, then save its body into the pair, declared), since a save naming the package is closed. The package-less remedies are unchanged. Text only. Claude-Session: https://claude.ai/code/session_01JQwxbWytk9Ec5dXr38QrwZ Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir Contract reviewServed-tier: Inputs: card #29393 body and all five comments (triage 6582524180, claim 6583771832, reports 6584466731 and 6585010191, claim amendment 6584492790); PR #29535 body, file list (2 files, +50/-19) and the net diff against Check-runs on ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Tried to break it; what held and what did not.
Findings:
No must-fix. The three should-fixes are one-line text edits in the same file and do not move the verdict. Implemented-by: VERDICT: PASS Generated by Claude Code |
…e tail name both closes Contract review should-fixes on the entry: restore the dropped space in the multi_shipped remedy, the header comment names both closed addresses and both kinds of stored row, and a bound row's failed-move tail also keeps the save naming the package where the pair could not take the override. Text only. Claude-Session: https://claude.ai/code/session_01JQwxbWytk9Ec5dXr38QrwZ Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir Contract review — deltaServed-tier: Per-finding closure:
New findings: none.
Check-runs on Implemented-by: VERDICT: PASS Generated by Claude Code |
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir 维护者速读
席位核对ACCEPT ·
Generated by Claude Code |
|
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir Landed · 2026-11-02T20:23Z
State change: Generated by Claude Code |
Requested by Warren · project thread
Fixes #29393
Clause-②: no (migration entry prose; no accept set moves)
Metadata-protocol: none
维护者速读
packageless-overlay-write-closed(ADR-0087 语义迁移)的surface与reason现在同时点名两个被关闭的覆盖写入地址:不带包的写入,和点名只读基础包本身(?package=基础包)的保存、发布、回滚,并点名这两种写入各自存下的行;replacement补上绑定在基础包上的行的迁移与处置(与 CLI 打印的一致)。packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts的surface(两个编号地址)、reason(新增两句)与replacement(绑定行的foreign_declaration处置)。pnpm --filter @objectstack/spec check:upgrade-guide,预期 exit 0;用--out生成的指南里该条目出现naming the read-only package itself与publish-drafts。What changes
Text only, one entry.
packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts(unreleased ADR-0087 semantic entry, shipping in the same release as the two closes):surfacenow names both closed addresses onto a view, dashboard, report, translation or email template an installed read-only package ships: (1) the write naming no package, worded as before; (2) the write naming the read-only package itself: a save in draft or publish mode or a per-item publish with?package=BASE,POST /api/v1/packages/BASE/publish-draftsholding such a draft, and a rollback of a row bound to the package, where the pair can be ensured, the base records a version and the override write gate admits the declared body (a delete naming the package keeps the write). The stored-rows clause now covers both: package-less rows, and rows bound to the read-only package itself (the rowsos migrate packageless-overlaysalso moves since migrate: rows bound to a read-only base package stored before the #28905 close are invisible toos migrate packageless-overlays, so their only exit drops the customization #29392).reasongains two sentences: what each address stored (a row of no package, which no export carries; a row bound to the package, declaring nothing, served in place of its own document), and the named close (refused403 NOT_OVERRIDABLEnaming the pair and theoverridesdeclaration where the pair can take the declared override; a delete naming the package stays open, and so does every write the pair could not take, an email template locale the base does not ship among them). Everything else inreasonis unchanged.replacement(claim amendment 6584492790): the movable rows--applymoves are package-less OR bound to the read-only package itself (the preview's "bound to",--jsonboundToBase, which the ceremony lists and moves since migrate: rows bound to a read-only base package stored before the #28905 close are invisible toos migrate packageless-overlays, so their only exit drops the customization #29392). An unmoved package-less row keeps its package-less write; an unmoved bound row keeps its delete naming the package. A boundforeign_declarationrow gets the remedy the cli prints (reasonOf, theboundToBasearm, inpackages/cli/src/commands/migrate/packageless-overlays.ts): delete it naming the package, then save its body into the pair, declaringoverrides, since a save naming the package is closed; the package-less remedy is unchanged. The failed-move tail: a bound row keeps its delete naming the package, and the save naming it where the pair could not take the override (for those two causesnamedBaseCloseSubjectanswers null). The TO both closes share (write intoBASE.custom, declaringoverrides) is unchanged.acceptanceCriteriais untouched..changeset/29393-overlay-write-entry-both-addresses.md:@objectstack/specpatch, both declaration lines, one sentence each forsurface/reasonandreplacement.Measured against the code on
origin/main(399df5b):namedBaseOverlayWriteRefusal/namedBaseCloseSubjectinpackages/metadata-protocol/src/protocol-packaged-base-refusal.ts, and the #28905 changeset's Now refused / Still open lists, which the new wording follows clause for clause.The card's conditional line (commit revert path)
The card says to add a line if the S1 card decides the commit revert path stays open. The S1 card is #29390; its seat ruling (comment 6579511992) is fork A: the revert's restore limb is closed with the same sentence, so the path does not stay open. No such line is added. #29390 has no PR yet; when it lands, its own ADR-0087 disposition decides whether this entry's address (2) also names the commit revert and package rollback.
Why
Contract review 6577747588 of PR #29270, should-fix S3 (the dev's open question 1, answered A): the upgrade guide is generated from this entry, and a reader should meet both closed addresses in one entry. Triage 6582524180 set p1: it lands before the 18.3.0 cut.
Tests
No test pins this entry's text (
git grepfor the entry id hits only the entry and two changesets). The checks that read it, on b99d86a:pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrations scripts/upgrade-guide-docs.test.ts scripts/upgrade-guide-surface-span.test.tsunder the lock, afterpnpm --filter @objectstack/spec build(VERDICT command-exit 0): Test Files 7 passed (7), Tests 226 passed (226), VERDICT command-exit 0 (also 226/226 on 6b1ea51 and ecf1fd4).check:upgrade-guideexit 0 (protocol 18.0.0, 2 hop sections);check:spec-changesexit 0.tsx scripts/build-upgrade-guide.ts --outto a scratch file: the entry renders as one surface code span holding both numbered addresses;naming the read-only package itself2 hits,publish-drafts5 hits,boundToBase1 hit,ship the name): delete it naming no package1 hit,and the save naming it where the pair could not take the override1 hit.Acceptance notes
spec-changes.jsonare generated in memory at PR time and at publish (build-upgrade-guide.tsheader), and the docs pages are gitignored.Verification
Derived gates on ecf1fd4 (b99d86a is a prose-only follow-up in the same file)
pnpm --filter @objectstack/spec build(VERDICT command-exit 0);turbo run build --concurrency=2over the objectql, lint, formula, client and client-react closures (VERDICT command-exit 0, 38/38 tasks).node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackre-derived on ecf1fd4: 76 families (2 paths vs merge base 399df5b, +50/-19). Each run once, stdin from /dev/null, exit captured before any pipe: 75 exit 0 (the teardown self-test after its pinned fixture621a4876was fetched on the first round).pnpm check:dual-build-cjs-loads: exit 3 (PREREQUISITE NOT MET: 68 workspace packages unbuilt). NOT MEASURED locally; CI runs it on a full build.dispatch-gates --ran: 76 derived, 75 run, 1 NOT-MEASURED (dual-build, from its recorded exit 3), 0 UNRUN.check-changeset-no-major.mjs --base origin/main --eventwith this body: exit 0; LEVEL AXIS readsClause-②: no+Metadata-protocol: none, patch.check:upgrade-guideandcheck:spec-changesexit 0. The derived set is a property of the changed paths, which did not change.check:dev-prereqs(local-only family): exit 1, the workspace is not fully built (68 of 106 packages); a reading of this container, not of the diff.Human Minimum
packages/specholds no runtime logic (prose only).pnpm lintis CI's run.main, one pull request.packages/spectouched: no checked-in artifact regenerates from this entry (the guide and spec-changes are generated in memory at PR time).content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code