Repository navigation
fix(spec): the packageless-overlay-write-closed prose names the ceremony's own-member move - #29457
Conversation
…ony's own-member move The unreleased `18.packageless-overlay-write-closed` semantic entry and its pending changeset said every `os migrate packageless-overlays` move declares `overrides`, and listed an email template locale the base does not ship among rows the pair refuses. The ceremony now moves such a row as the pair's own member, declaring nothing (outcome `moved` with `addedMember`), and the close of the package-less write still judges only the declared-override move, so that locale's package-less write stays open before and after the move. Both texts now say so. Text only; no runtime change. Claude-Session: https://claude.ai/code/session_01ADHkmQncBZPJcTEqSfYmqd Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
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 b479d18c9c1d9b343d4570f75cf9154d205ebcf9 && git checkout b479d18c9c1d9b343d4570f75cf9154d205ebcf9
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8ca9dd7baa595715f36c2282467bb72a3b235b19 01d462ad336c652c1347306494aa343d2fb2e269 && git checkout -B drift-repro 8ca9dd7baa595715f36c2282467bb72a3b235b19 && git merge --no-ff 01d462ad336c652c1347306494aa343d2fb2e269
node scripts/docs-audit/affected-docs.mjs --json 8ca9dd7baa595715f36c2282467bb72a3b235b19
|
|
domain:spec#4 · os-steve · session_01ADHkmQNap7ryQcyQXocWct Contract-review-claim: session_01ADHkmQNap7ryQcyQXocWct · head d241313 · 2026-11-02T15:46Z The lane seat reviews this head itself at |
|
domain:spec#4 · os-steve · session_01ADHkmQNap7ryQcyQXocWct Contract reviewServed-tier: ① Derived judgmentsRead against the head's tree. The six cited files are byte-identical between the merge-base
② Semver level
③ Boundary flagsDev's os-dev-report is card comment 6581404094. Every flag and the one open question, answered:
④ Design judgment
Implemented-by: VERDICT: FAIL |
…eview and delete address Contract review round 2. The entry's surface named every write the ceremony would move as refused; it now says a declared-override move, and that a row it moves as the pair's own member keeps the write. The preview names that row as the pair's own member and only `--json` carries `addedMember`; the pair's delete of a non-canonical locale needs the member selector. The changeset's "Now refused" bullet now says the gate admits the row declared as the base's override, so it agrees with "Still open". Claude-Session: https://claude.ai/code/session_01ADHkmQncBZPJcTEqSfYmqd Co-authored-by: Claude <noreply@anthropic.com>
|
domain:spec#4 · os-steve · session_01ADHkmQNap7ryQcyQXocWct Contract-review-claim: session_01ADHkmQNap7ryQcyQXocWct · head 01d462a · 2026-11-02T16:22Z Delta review of the round-2 commit (the FAIL record 6581627406's must-fix and three should-fixes) by the same reviewer. |
|
domain:spec#4 · os-steve · session_01ADHkmQNap7ryQcyQXocWct Contract reviewServed-tier: Delta record on the round-2 head: one commit on ① Derived judgments
② Semver levelUnchanged from round 1: ③ Boundary flagsNo new dev flag on this head beyond the round-1 report; the round-1 answers stand: deviations 1–5 accepted (the claim's file surface is amended to the fields edited, ④ Design judgment
Implemented-by: VERDICT: PASS |
|
domain:spec#4 · os-steve · session_01ADHkmQNap7ryQcyQXocWct Head-sha: 维护者速读
席位意见:可落地。契约复审第一轮 FAIL(6581627406,一处 surface 措辞),第二轮在现 head PASS(见本 PR 上一条记录)。CI 除按设计变红的 Check Changeset 外全绿。 席位核对 — ACCEPT ·
|
Requested by Steve · project thread
Fixes #29261
Clause-②: no
Metadata-protocol: none
维护者速读
packageless-overlay-write-closed(ADR-0087 语义迁移)和它待发的 changeset 改写为:os migrate packageless-overlays把「基础包没发的邮件模板语言」那一行作为.custom配对包自己的成员迁过去(不声明overrides,结果moved+addedMember),而不再说它迁移失败、也不再说每次迁移都声明overrides;该语言的无包写入在迁移前后都仍然开放。packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts(replacement 与 reason 两段)、.changeset/28576-packageless-overlay-write-closed.md(movable一条与 Still open 一条)。pnpm --filter @objectstack/spec check:upgrade-guide,预期 exit 0;生成的升级指南里出现addedMember,不再有「such as an email template locale the base does not ship」。What changes
Text only. No runtime file is touched.
packages/spec/src/migrations/entries/semantic/18.packageless-overlay-write-closed.ts(unreleased ADR-0087 semantic entry):replacement:--applydeclaresoverrides: { package, basedOn }on each move, except a row of an email template locale the base does not ship (the preview names itaddedMember), which moves as the pair's own member at that locale, declaring nothing, outcomemovedwith thataddedMemberin place of abasedOn. The "from then on" writes say an added member is written into the pair with nooverridesand that its pair DELETE removes it. New sentence: an added member's package-less write stays open, before and after its move. Thefailedclause drops "such as an email template locale the base does not ship" from the pair-refusal example, and scopes the missing-version case to a declared override (the own-member move records nobasedOn).reason: the 403 applies to a movable row the command moves as a declared override; an email template locale the base does not ship keeps its package-less write. "The close reaches only what the command moves as a declared override".acceptanceCriteria: "a save of a moved declared override" (an added member's save into the pair carries nooverrides).surfaceis not touched (that is spec(migrations): widen the unreleased ADR-0087 entrypackageless-overlay-write-closedto name the base-named overlay write #28905 also closed #29393's widening, not in this card's claim)..changeset/28576-packageless-overlay-write-closed.md(pending, from PR metadata-protocol: close the package-less write onto a packaged item (PUT/DELETE, rollback, source save, reset) naming <base>.custom; Studio drops its overlay link #28576's work, not yet released):Clause-②:prose and theMetadata-protocol:prose: "can move as a declared override". The two declaration tokens (yes (narrowing),narrowed) are unchanged.movablebullet: names both outcomes (movedwithbasedOn,movedwithaddedMember) and says the added member's package-less write stays open; the missing-version case is scoped to a declared override.overrides; one declaring the base is refused).What
maindoes (measured at 3291213)migratePackagelessOverlayssaves anaddedMemberrow into the pair withoutoverridesand pushes{ outcome: 'moved', packageId, addedMember }(L519–L560). A missing base version fails only a declared-override move (L515–L516).packagelessCloseSubjectbuilds the DECLARED body (overrides: { package: base, basedOn }) and asks the override write gate; a refusal returnsnull, the write stays open (L711–L718). The gate refuses a declared override at a locale the base does not ship, so every package-less write of that member (save, delete, publish, rollback; a stored row or none, so before and after the move) is left open. Pinned on main bypackages/objectql/src/environment-overlay-email-locale-restart.test.ts"the reset (?member=): an unshipped member … (its package-less reset stays open)" (L906) beside its CONTROL "a shipped member's unmigrated row: its package-less reset door is closed" (L912).Tests
No test is added or edited (prose only; no test pins this entry's text:
git grepfor the entry id and for the old phrase hits only the two edited files, the #28905 changeset's reference to the id, and an unrelated dogfood comment).packages/specmigrations suite,pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 src/migrationsaftergen:migration-registry, on d241313: Test Files 5 passed (5), Tests 195 passed (195).check:upgrade-guideexit 0 (in-memory, protocol 18.0.0, 2 hop sections);check:spec-changesexit 0. Generated to a scratch file with--out:addedMember1 hit, the dropped phrase "such as an email template locale the base does not ship" 0 hits. The docs pages (content/docs/protocol-upgrade/) are gitignored, so no regenerated reference rides this PR.packages/metadata-protocol: no test pins this prose (zerogit grephits), so not run; the runtime is unchanged.Acceptance notes
.changeset/28576-packageless-overlay-write-closed.md) to remove sentences fix(metadata-protocol): os migrate packageless-overlays moves an email template row of a locale the base does not ship as the pair's own member #29258 made false.check-empty-changeset --base origin/mainexits 1 with the DELIBERATE CORRECTION class; the remedy it prints is "do NOT restore it — say so on the PR". It is not restored andskip-changesetis not added. This PR adds no changeset of its own: the entry is unreleased, and its text ships with the edited changeset's release.skills/objectstack-platform/SKILL.md's ADR-0146 paragraph still says a pre-D11 row's "package-less save, reset and rollback are refused once movable (D11)", which an added-locale row (movable, write open) contradicts. A governed surface; reported to the seat, not edited here.Verification
Gates on d241313
turbo run build --concurrency=2 --filter='./packages/**'under the lock, VERDICT command-exit 0.pnpm --filter @objectstack/spec test: Test Files 791 passed (791), Tests 23469 passed, 1 todo.pnpm --filter @objectstack/spec typecheck: VERDICT command-exit 0.node scripts/pm/dispatch-gates.mjs --commands: 76 derived families; every one run on d241313, each< /dev/null, exit captured before any pipe. 74 exit 0 on the first pass.check-plugin-teardown-shape.mjs --self-test: exit 3 (PREREQUISITE NOT MET, shallow clone) on the first pass; aftergit fetch --depth=1 origin 621a487607881c66b2899b7e3477115229a156b4exit 0, 48 cases pass.check-empty-changeset.mjs --base origin/main: exit 1, DELIBERATE CORRECTION class on.changeset/28576-packageless-overlay-write-closed.md(see Acceptance notes). Not restored, noskip-changeset.check-changeset-no-major.mjs --base origin/main --eventwith this body: exit 0, LEVEL AXIS readsClause-②: no+Metadata-protocol: none.dispatch-gates --ran: 76 derived, 76 run, 0 NOT-MEASURED, 0 UNRUN (a DERIVED zero).Generated by Claude Code