Repository navigation
Commit dbf7e04
feat(spec)!: retirement kits whose conversion retired at or below 16.x age out; the strict unknown-key refusal names the protocol upgrade guide (#26599)
Fixes #25767
Supersedes #26138
Clause-②: no (narrowing)
Metadata-protocol: narrowed
Skills-docs: follow-up #26303
Release: 18.3
## 维护者速读(草稿)
- **改了什么:** 按 #25767 的裁决(6434038284):≤16.x 的退役套件(50 个 D2 conversion 和它们的
fixture、strict 容器里的 55 个墓碑、authorable-surface 上的 61 行
`[RETIRED]`)从代码里删掉。被删的键由 strict schema
当未知键拒绝,错误里多一句话,指向协议升级指南。迁移链不动:支持底线仍是 16,第 17 步和它的 159 个条目文件都在,`os
migrate meta --from 16` 照常从 16 重放到 18。
- **为什么改:** 每个 major 都在累积墓碑和 conversion,每张 spec
卡都要为它们买单。升级者需要的处方放在升级指南和当时的 release notes
里就够了。链的底线是发版策略,要另行裁决,不随套件老化一起动(#26138 原先连链一起砍,已按裁决撤回)。
- **风险与回滚:** ① 仍写着 ≤16.x 键的源码不再拿到逐键处方,只拿到未知键拒绝和链接。② `sys_metadata`
里仍是这种形状的行,读取时不再被改写,要在 18.2 或更早版本上用 `os migrate meta --stored --apply`
规范化一次(裁决把这条一次性提示放进 18.2 的 release notes)。③ 第 17 步的 graduated 列表少了 45 个已删
conversion 的 id,所以 `--from 16` 不再替你改这 45 类写法;步本身和它的语义条目都还在。回滚就是 revert 本
PR,不写数据,没有不可逆动作。
- **先看:** ① `packages/spec/src/migrations/registry.ts.template` 第 17 步的
`conversionIds`(删掉 45 个 id 的那一段);②
`docs/adr/0087-metadata-protocol-upgrade-contract.md` 末尾的 2026-10-26
addendum 和 D2 窗口那条修订;③ `packages/spec/scripts/build-schemas.ts` 的 proof
1(一个 major 的时钟和 release-tag 定日期)。
- **两分钟验证:** `cd packages/spec && pnpm exec vitest run src/migrations/
src/shared/retired-key-migrate-sentence.test.ts`,预期全部通过:链的完整性钉子(每个 id
都是真 conversion)、从底线 16 的重放,以及新旧两种处方句式。
- **需要你做的:** 以 `GOVERNED_APPROVERS` 身份批准本 PR(Tier H:`docs/adr/**` 原地修订)。
## What changes
Maintainer ruling 6434038284 on #25767 (2026-10-27, 「同意」) scopes the D2
= A ruling of 2026-10-25. It keeps kit aging and withdraws the chain
cut, and the release target is 18.3. This PR is #26138's branch reworked
to that scope. #26138 is closed as superseded (6434144688).
**Kept from #26138 (the kit ages out):**
- The 50 D2 conversions with `retiredAfter` at or below 16.x (5 at
15.0.0, 45 at 16.1.0) are removed, with their fixtures.
- The 55 strict-container tombstones already `[RETIRED]` at
`@objectstack/spec@17.0.0` are removed, along with 61 `[RETIRED]` lines
of the authorable surface and their liveness rows.
- The 58 strip-container tombstones of the same age stay, because
deleting one would turn a refusal into a silent strip. The four
inline-credential refusals are not retirements and are untouched.
- The strict unknown-key refusal carries
`RETIRED_KEY_UPGRADE_GUIDE_SENTENCE`
(`shared/protocol-upgrade-guide.ts`) after its fix channels, keeping the
#5955 order.
- The deletion gate ages a tombstone one major. Proof 1 dates a deleted
line by an exact `RETIRED_KEYS_BY_MAJOR` row or by the previous major's
release tag.
- The console's own refusals in `ui/packages/types` cover the keys it
used to inherit as tombstones: the five ListView keys and the three flat
public-block spellings.
- The lint, metadata-core, runtime, metadata-protocol, objectql,
services and `ui/**` test follow-ups are kept.
**Restored to `origin/main` (the step stays):**
- `packages/spec/src/migrations/entries/**`, including the 159 major-17
files, the README and the `conversionIds` links of the three protocol-18
entries.
- `registry.ts.template` with `MIGRATION_SUPPORT_FLOOR = 16`,
`chain.ts`, `migrations.test.ts` and `semantic-relevance.test.ts`.
- `packages/cli/src/commands/migrate/meta.ts` and its twelve tests, and
`docs/adr/0142`.
- The floor prose in `docs/protocol-upgrade-guide.md` and
`content/docs/upgrading.mdx`. The guide pointer gains one sentence
saying where an aged-out kit's prescription lives.
- ADR-0087's "permanent chain", "forever artifact" and 2026-08-01
amendments are withdrawn, and the D3 text stands.
**Reworded:**
- **ADR-0087:** the status line, the D2 window bullet, the 2026-07-31
stored-row note and the addendum now say the kit ages out and the step
stays.
- **The changeset:** `minor` for spec, `patch` for lint and
metadata-core. The cli is no longer touched in published code.
- **Retirement house sentences, which follow the conversion rather than
the floor:**
- An edit a surviving step-17 conversion still applies (the twelve
`toMajor: 17`, `retiredAfter: 17.7.0` ones: the flow-node aliases and
lifts, the mongo alias, the retry default, the sharing-rule `full` →
`edit` rewrite, the header subtitle alias and the inline action params)
goes back to main's "Run `os migrate meta --from 16` …" sentence.
- An edit whose 16.x conversion left says "This edit left `os migrate
meta` with the protocol-16.x conversions: apply it by hand, or run the
tool on a release that still carries the conversion", followed by the
guide link.
- No sentence names a floor of 17.
## Acceptance notes
1. **Step 17's graduated list named the aged-out conversions.** The
ruling's split reading checked that no semantic entry links a removed
conversion, and that holds. Step 17's own `conversionIds` list in
`registry.ts.template`, however, named the 45 conversions retired at
16.1.0, so restoring it verbatim failed the chain's integrity pin
("every step references only real conversion ids").
- The 45 ids leave that list, with a comment naming the ruling. The
step, its 77 semantic entries and its retired-key and retired-def rows
are unchanged.
- `--from 16` still replays 16 → 18, but it no longer applies those 45
edits. Each one's tombstone or guide entry names the hand edit.
- The ADR addendum and the changeset say so.
2. **Pins re-pointed by hand, because each replayed an aged-out
conversion:**
- The floor replay in `migrations.test.ts` now uses
`sharing-rule-access-level-full-to-edit` and
`flow-node-crud-object-alias`.
- The cli cross-hop pairing pin in `meta.report-order.test.ts` now uses
the sharing-rule conversion.
- The `--from 16` shape in `migrate-meta-protocol-range.test.ts` is now
a sharing rule.
- `migrate-meta-write.test.ts` takes #26138's protocol-18 fixtures at
`--from 16`. Its aged-out `compareTo` control now says the conversion
left, not the floor.
- The three repo-project pins on `RETIRED_KEYS_BY_MAJOR[17]` go back to
main.
3. **The optional simplification is not taken.** The ruling allowed
dropping the release-tag dating source if proof 1 could date every
deleted line by its registry row. It cannot: 46 of the 61 deleted
`[RETIRED]` lines predate `RETIRED_KEYS_BY_MAJOR`, and no row names
them. The tag source and its four `SKILL.md` lines stay, at net zero
lines (337 → 337).
4. **Stored rows.** A `sys_metadata` row carrying a spelling whose
conversion aged out is no longer rewritten at read. Canonicalize it with
`--stored --apply` on 18.2 or earlier. `app-hidden-to-unpublished` is
among the removed conversions, so the artifact door's refusal of it by
id is removed as moot. The 18.2 release-notes notice is the ruling's
part 3 and is not in this diff: `content/docs/releases/` is
release-owned.
5. **Residuals unchanged by this rework, as listed on the card:**
- The guidance tables are not kit rows, and whether they age with the
kits is still open.
- `pendingDataMigrations` is moot again while the chain still crosses
into 17.
- #26303 (skills) is handled by its own seat under the ruling.
## Verification
All readings are at head `393c768582`, which carries a merge of
`origin/main` at `add806c5a6`.
<details><summary>Suites (local, under the verify lock)</summary>
- `pnpm --filter @objectstack/spec test`: 728 files and 21889 tests
passed, 1 todo.
- `pnpm --filter @objectstack/spec test:repo`: 80 files and 1295 tests
passed.
- `pnpm --filter @objectstack/cli exec vitest run --project unit`: 337
files and 4904 tests passed. The integration tier is declared to CI.
- metadata-protocol: 21569 passed and 19 skipped. runtime: 7423 passed
and 19 skipped. objectql: 8789 passed. service-automation: 2708 passed.
service-datasource: 975 passed. These ran at the tree of `76dad1ceeb`.
lint (7389 passed) and metadata-core (823 passed) ran at `002710c1dc`.
The later commits touch none of their files.
- `pnpm --filter @object-ui/types test`: 393 files and 10696 tests
passed.
- `cd ui && pnpm exec vitest run scripts/`: 177 files passed and 1
failed. The failure is `check-i18n-dead-keys` "keeps every key it makes
reachable OUT of both tiers", a 15 s timeout on the real-tree scan under
full-suite load, the same on three runs. It passes when its file runs
alone (`check-i18n-dead-keys` plus `check-vi-mock-inherit`: 217 tests
passed), and the diff touches no i18n source.
- Type-check of types, react, plugin-list, plugin-view, components,
core, app-shell and console: all exit 0.
- `pnpm --filter @objectstack/dogfood test`, the full battery at the
final head: 300 files passed, 3 skipped. 2494 tests passed, 18 skipped.
Lock verdict `command-exit 0`.
</details>
<details><summary>Generated artifacts and gates</summary>
- `pnpm --filter @objectstack/spec check:generated`: all 14 artifacts
current. `node scripts/check-regen-pending.mjs`: exit 0.
- `node scripts/gen-sdui-manifest-node.mjs` then `check-sdui-manifest`:
`sdui.manifest.json` byte-identical (sha256 `1f6e1ccb925a…`, 106
components).
- `ui` `check:spec-symbols`: exit 0.
- The derived gate sweep (`dispatch-gates.mjs --commands`): 150 derived,
150 run, 0 NOT-MEASURED. 149 exit 0, and 1 exit 1, which is `pnpm --dir
ui exec vitest run scripts/` with the timeout named above. Reconciled
with `--ran`.
- Merges of `origin/main` went through `scripts/pm/os-regen-merge.sh`.
Each time the driver took main's side of a generated surface, the
branch's own aged-out `[RETIRED]` lines were deleted again before
`gen:schema`: three in `data.json`, one in `system.json` and five in
`api.json`.
</details>
_Generated by [Claude
Code](https://claude.ai/code/session_018wdyGVjfpxCUwq2UMrZkwi)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 03e898c commit dbf7e04
228 files changed
Lines changed: 4070 additions & 8848 deletions
File tree
- .changeset
- .claude/skills/spec-property-retirement
- content/docs/references
- ai
- api
- automation
- data
- integration
- kernel
- security
- system
- ui
- docs
- adr
- qa/platform-checklist/areas
- packages
- cli
- src/commands/migrate
- test
- drivers/driver-sql/src
- lint/src
- metadata-core/src
- metadata-protocol/src
- objectql/src/validation
- runtime/src
- services
- service-automation/src/builtin
- service-datasource/src/__tests__
- spec
- api-surface
- authorable-surface
- export-origins
- liveness
- state-counts
- scripts
- lib
- liveness
- src
- ai
- api
- automation
- conversions
- data
- integration
- kernel
- migrations
- security
- system
- ui
- scripts
- ui
- apps/console/src/__tests__
- examples/schema-catalog/test
- packages
- app-shell/src/views
- metadata-admin
- inspectors
- previews/__tests__
- core/src/actions
- __tests__
- layout/src/__tests__
- plugin-dashboard/src/__tests__
- plugin-detail/src/__tests__
- react/src/hooks/__tests__
- types/src
- __tests__
- zod
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
194 | | - | |
195 | | - | |
196 | | - | |
197 | | - | |
198 | | - | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
199 | 199 | | |
200 | 200 | | |
201 | 201 | | |
| |||
208 | 208 | | |
209 | 209 | | |
210 | 210 | | |
211 | | - | |
212 | | - | |
| 211 | + | |
| 212 | + | |
213 | 213 | | |
214 | 214 | | |
215 | 215 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
55 | | - | |
56 | | - | |
57 | 55 | | |
58 | 56 | | |
59 | 57 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | 42 | | |
44 | 43 | | |
45 | 44 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
103 | | - | |
104 | | - | |
105 | 103 | | |
106 | 104 | | |
107 | 105 | | |
| |||
0 commit comments