Repository navigation
Commit 1896e31
fix(spec): the packageless-overlay-write-closed prose names the ceremony's own-member move (#29457)
<!-- claude-projects-attribution: {"github_login":"os-steve"} -->
_Requested by **Steve** · [project
thread](https://claude.ai/code/project/chan_01FdL1XeUyvVNxLreh3F4Qi9?thread=cmsg_01FdL1XeUyvVNxLreh3F4Qi94JJKezo6hNEcFJ8VTnfh4W)_
Fixes #29261
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:只改文字。未发布的升级条目 `packageless-overlay-write-closed`(ADR-0087
语义迁移)和它待发的 changeset 改写为:`os migrate packageless-overlays`
把「基础包没发的邮件模板语言」那一行作为 `.custom` 配对包自己的成员迁过去(不声明 `overrides`,结果 `moved` +
`addedMember`),而不再说它迁移失败、也不再说每次迁移都声明 `overrides`;该语言的无包写入在迁移前后都仍然开放。
- 为什么改:PR #29258 已让迁移命令这样做,但这两段文字仍是旧说法,会随发布说明和升级指南原样发出去,误导运维。
- 风险与回滚:无运行时改动,只影响升级指南与发布说明的文字。回滚即 revert 本 PR。
-
先看:`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`: `--apply` declares `overrides: { package, basedOn }` on
each move, **except** a row of an email template locale the base does
not ship (the preview names it `addedMember`), which moves as the pair's
own member at that locale, declaring nothing, outcome `moved` with that
`addedMember` in place of a `basedOn`. The "from then on" writes say an
added member is written into the pair with no `overrides` and that its
pair DELETE removes it. New sentence: an added member's package-less
write stays open, before and after its move. The `failed` clause 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 no `basedOn`).
- `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 no `overrides`).
- The header comment says the same.
- `surface` is not touched (that is #29393's widening, not in this
card's claim).
- `.changeset/28576-packageless-overlay-write-closed.md` (pending, from
PR #28576's work, not yet released):
- Headline, the `Clause-②:` prose and the `Metadata-protocol:` prose:
"can move as a declared override". The two declaration tokens (`yes
(narrowing)`, `narrowed`) are unchanged.
- "Upgrade, then run the ceremony": the refusal covers what the command
moves as a declared override; an own-member move keeps its write.
- `movable` bullet: names both outcomes (`moved` with `basedOn`, `moved`
with `addedMember`) and says the added member's package-less write stays
open; the missing-version case is scoped to a declared override.
- FROM → TO: one sentence for the email-locale case (write it into the
pair with no `overrides`; one declaring the base is refused).
- **Still open**: the email-template-locale case leaves the "the
ceremony would not move" list (the ceremony now moves it) and becomes
its own sentence: every package-less write of that locale stays open,
before and after the move, because the close judges only the
declared-override move and the override write gate refuses a declared
override of that locale.
### What `main` does (measured at 3291213)
- The move: `migratePackagelessOverlays` saves an `addedMember` row into
the pair without `overrides` and pushes `{ outcome: 'moved', packageId,
addedMember }`
([L519–L560](https://github.com/objectstack-ai/objectstack/blob/329121397b395e688cff1ca9e845e07ba53c652a/packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts#L519-L560)).
A missing base version fails only a declared-override move
([L515–L516](https://github.com/objectstack-ai/objectstack/blob/329121397b395e688cff1ca9e845e07ba53c652a/packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts#L515-L516)).
- The close: `packagelessCloseSubject` builds the DECLARED body
(`overrides: { package: base, basedOn }`) and asks the override write
gate; a refusal returns `null`, the write stays open
([L711–L718](https://github.com/objectstack-ai/objectstack/blob/329121397b395e688cff1ca9e845e07ba53c652a/packages/metadata-protocol/src/protocol-packageless-overlay-migration.ts#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 by
`packages/objectql/src/environment-overlay-email-locale-restart.test.ts`
"the reset (?member=): an unshipped member … (its package-less reset
stays open)"
([L906](https://github.com/objectstack-ai/objectstack/blob/329121397b395e688cff1ca9e845e07ba53c652a/packages/objectql/src/environment-overlay-email-locale-restart.test.ts#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 grep` for 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/spec` migrations suite, `pnpm --filter @objectstack/spec
exec vitest run --maxWorkers=2 src/migrations` after
`gen:migration-registry`, on d241313: Test Files 5 passed (5), Tests
195 passed (195).
- Upgrade-guide generator: `check:upgrade-guide` exit 0 (in-memory,
protocol 18.0.0, 2 hop sections); `check:spec-changes` exit 0. Generated
to a scratch file with `--out`: `addedMember` 1 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 (zero `git grep`
hits), so not run; the runtime is unchanged.
## Acceptance notes
- **Check Changeset is red by design.** This PR edits a PENDING
changeset another PR added
(`.changeset/28576-packageless-overlay-write-closed.md`) to remove
sentences #29258 made false. `check-empty-changeset --base origin/main`
exits 1 with the DELIBERATE CORRECTION class; the remedy it prints is
"do NOT restore it — say so on the PR". It is not restored and
`skip-changeset` is not added. This PR adds no changeset of its own: the
entry is unreleased, and its text ships with the edited changeset's
release.
- Not touched, outside this card:
`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
<details><summary>Gates on d241313</summary>
- Build: `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; after `git fetch --depth=1
origin 621a487` exit 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, no `skip-changeset`.
- `check-changeset-no-major.mjs --base origin/main --event` with this
body: exit 0, LEVEL AXIS reads `Clause-②: no` + `Metadata-protocol:
none`.
- `dispatch-gates --ran`: 76 derived, 76 run, 0 NOT-MEASURED, 0 UNRUN (a
DERIVED zero).
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01ADHkmQncBZPJcTEqSfYmqd)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 86d36e9 commit 1896e31
2 files changed
Lines changed: 45 additions & 34 deletions
File tree
- .changeset
- packages/spec/src/migrations/entries/semantic
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
| 20 | + | |
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
24 | | - | |
| 24 | + | |
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| |||
43 | 43 | | |
44 | 44 | | |
45 | 45 | | |
46 | | - | |
| 46 | + | |
47 | 47 | | |
48 | | - | |
49 | | - | |
| 48 | + | |
| 49 | + | |
50 | 50 | | |
51 | 51 | | |
52 | 52 | | |
0 commit comments