Repository navigation
Commit 4df40e2
docs(skills): objectstack-upgrade teaches the stored pass before 18.3 drops the ≤16.x conversions (#28918)
<!-- claude-projects-attribution: {"github_login":"huangyiirene"} -->
_Requested by **Irene** · [project
thread](https://claude.ai/code/project/chan_01TJXtQ1tVD26ecLDZxFS67x?thread=cmsg_01TJXtQ1tVD26ecLDZxFS67xYEtCvd5esC5k6dbFvWLihm)_
Fixes #26303
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么:** `objectstack-upgrade` 技能不再教「16 时代存下的 `sys_metadata`
行读时会被永远自动改写、不必动」;改为:18.3 去掉 ≤16.x 的转换后这类行不再读时改写,所以要在 18.2 或更早版本上先跑一次 `os
migrate meta --stored --apply --yes` 再升级。eval 4 同步改写,新增 eval 5 直接问「18.1
想直升 18.3」。
- **为什么改:** 去掉 ≤16.x 转换的改动已合入 main、随 18.3 发布,它的 changeset 写明此类行「is no
longer rewritten at read」;技能原文照做的客户升到 18.3 后,存量行会永远停在旧形状,而 18.3
上的存量迁移也已救不回来。
- **风险与回滚:** 只改对外技能文本、报告模板一行与 eval,不动代码、schema、命令与行为;两份受 token
棘轮约束的文件都在天花板内、上限行未动;回滚即 revert 本 PR。
- **先看:** ① `skills/objectstack-upgrade/SKILL.md` 的 "Stored rows"
一节(两段改写)与 § 3.6 末句;② `evals/protocol-major-upgrade.json` 的 eval 4 改句与新
eval 5;③ `references/examples-upgrade.md` 报告模板「Pending, per
deployment」的存量迁移一行。
- **两分钟验证:** `node scripts/check-skills-token-ratchet.mjs && pnpm
--filter @objectstack/spec check:skill-docs` 均绿,且 `grep -n "rehydrates
in its protocol-17" skills/objectstack-upgrade/SKILL.md` 零命中。
- **需要你做的:** 审批本 PR(`skills/**` 是 Tier H 治理面,批准后由席位落地)。
## What changes
The 18.3 changeset `.changeset/25767-retire-16x-retirement-kits.md`
(pending in the Version Packages PR) removes the 50 D2 conversions
retired at or below 16.x, and its **Stored rows** bullet says a
`sys_metadata` row still in such a shape "is no longer rewritten at
read; canonicalize it once with `os migrate meta --stored --apply` on
18.2 or earlier, before moving to 18.3". The published upgrade skill
still taught the opposite. This PR is the stored-rows half the card
still owes (the floor half fell away under ruling 6434038284 on #25767:
`MIGRATION_SUPPORT_FLOOR` stays 16, so `os migrate meta --from 16` and
eval 1 are untouched).
- **`SKILL.md` § "Stored rows".** Heading and two paragraphs rewritten:
`applyConversionsToStoredItem` replays the conversions the installed
release still carries (load-path-retired ones included); 18.3 drops
those retired at or below 16.x, so such a row is no longer rewritten; ⛔
run the stored pass before you move (on 18.2 or earlier for such a row).
The removed sentences are the two the card names: "including entries
retired from the load path ... A row written under protocol 16 therefore
rehydrates in its protocol-17 shape without anybody editing it" and "To
make it durable, run the stored pass". The command block, the `--yes`
warning and the `--from` note are unchanged.
- **`SKILL.md` § 3.6.** "the read-time rehydration is still the
guarantee" becomes "so get `0` before you move" — the same claim in its
second place.
- **`references/examples-upgrade.md`** report template: the stored-pass
checklist line said "rows rehydrate correctly today; this makes it
durable"; it now says the pass is owed "before any release that drops
their conversions".
- **`evals/protocol-major-upgrade.json`.** Eval 4's expected answer says
stored rows rehydrate only while the installed release carries their
conversions and runs the stored pass before moving past 18.2; its
assertions are unchanged. New eval 5 (Chinese prompt, like eval 1): on
18.1, going straight to 18.3, rows from 16 read fine today; the expected
answer runs `--stored`, `--stored --apply --yes` and `--stored --json`
(exit 0) on 18.1 before the bump, and refuses both hand-editing
`sys_metadata` and bumping first.
- **Changeset**
`.changeset/26303-upgrade-skill-stored-rows-before-18-3.md`,
`'@objectstack/skills': patch`, carrying both declaration lines.
## Tests
No code path changes, so no unit test applies; the teaching is exercised
by eval 4 (amended) and eval 5 (new). The skill gates the card names are
green on `3bf0627876`: `check:skill-docs`, `check:skill-refs`,
`check:skill-examples` (280 prose examples type-check across 3
surfaces). The full derived set is under Verification.
## Acceptance notes
**Line and token readings** (tree `objectstack-ai/objectstack` at
`3bf0627876` against base `b15b634c16`; lines by `wc -l`, tokens by the
token ratchet's `ceil(utf8 bytes / 4)` over the whole file):
| File | Lines before → after | Tokens before → after |
|:--|:--|:--|
| `skills/objectstack-upgrade/SKILL.md` | 483 → 481 (−2) | 6176 → 6171
(ratchet's priced count after: 6166, ceiling 6188) |
| `skills/objectstack-upgrade/references/examples-upgrade.md` | 119 →
119 (0) | 1195 → 1194 (ceiling 1197) |
| `skills/objectstack-upgrade/evals/protocol-major-upgrade.json` | 45 →
55 (+10) | 1033 → 1314 (eval fixture, measured, not ratcheted) |
| **Package** `skills/objectstack-upgrade/**` (all files) | 647 → 655
(+8, budget +15) | — |
| **Catalog** sum of all 11 `skills/*/SKILL.md` | 4554 → 4552 (−2) | — |
No ceiling row moves: the new teaching is paid for inside the stale
sentences it replaces.
**Premise readings.** At tag `@objectstack/spec@18.2.0` (`27f38ada49`)
`packages/spec/src` carries 45 conversions with `retiredAfter` 16.x and
5 with 15.x; at `b15b634c16` it carries 0. `packages/spec/package.json`
on the base reads `18.2.0`, so the drop ships in the next release, 18.3,
per the changeset.
**Scope.** The seat's brief named § "Stored rows" and the eval; § 3.6's
last sentence and the report-template line state the same claim, so they
were corrected in the same stroke (stale lines of the claim this card
names, nothing else removed).
**Observed, not filed (unrehearsed drift, outside this file surface):**
two code headers still state the pre-18.3 policy —
`packages/spec/src/conversions/stored.ts` ("D3 keeps every conversion
forever precisely so any past major can replay forward") and
`packages/metadata-protocol/src/stored-migration.ts` ("a row written
under any past protocol is *served* canonical forever"); Prime Directive
#12 in `AGENTS.md` says every rehydration seam replays "the full
conversion chain — retired entries included". None is published
teaching; carrier: none.
## Verification
<details><summary>Derived gate set — 46 derived, 45 run with exit 0, 1
NOT MEASURED (head 3bf0627)</summary>
`node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
--ran RECORD` on `3bf0627876`: "✓ dispatch-gates --ran: 46 derived
famil(ies) accounted for — 45 run, 1 NOT-MEASURED (1 DERIVED from a
recorded exit 3)".
- `node scripts/check-skills-token-ratchet.mjs` :: exit 0 — "57 authored
bundle file(s) within their ceilings";
"skills/objectstack-upgrade/SKILL.md is 6166 tokens (ceiling 6188;
headroom 22)"; "references/examples-upgrade.md is 1194 tokens (ceiling
1197; headroom 3)".
- `pnpm --filter @objectstack/spec run check:skill-docs` :: exit 0 —
"Skill docs in sync".
- `pnpm --filter @objectstack/spec run check:skill-refs` :: exit 0 — "9
generated files in sync with packages/spec".
- `pnpm --filter @objectstack/spec run check:skill-examples` :: exit 0
(after building `@objectstack/spec` and the `@objectstack/client-react`
closure) — "280 prose examples type-check across 3 surface(s)".
- `pnpm check:doc-authoring` :: exit 0; `pnpm check:nul-bytes` :: exit
0; `node scripts/check-empty-changeset.mjs --base origin/main` :: exit
0; `node scripts/check-adr-0087-registration.mjs --base origin/main` ::
exit 0; `node scripts/check-changeset-no-major.mjs --base origin/main`
:: exit 0; `pnpm check:role-word` :: exit 0; `pnpm
check:skill-compatibility` :: exit 0; `pnpm check:skill-frame-sync` ::
exit 0; `pnpm check:skill-identifier-liveness` :: exit 0; `pnpm
check:published-files` :: exit 0; `pnpm check:pm-governed-merges` ::
exit 0; the remaining derived families :: exit 0.
- `pnpm check:dts-closure`, `pnpm check:sourcemap-no-sources-content`,
`pnpm check:lean-entry-closure`, `pnpm --filter @objectstack/lint run
check:doc-formula-expressions` first answered exit 3 (no build); re-run
after building the 38-package `@objectstack/client-react` closure plus
`@objectstack/formula` and `@objectstack/lint` :: exit 0 each
(dts-closure and sourcemap swept the 38 built packages).
- **NOT MEASURED:** `pnpm check:dual-build-cjs-loads` :: exit 3,
PREREQUISITE NOT MET (reads every package's `dist/`; a repo-wide build
is not run locally) — CI's build lane carries it.
</details>
---
_Generated by [Claude
Code](https://claude.ai/code/session_01J8VVAkD2h5o5cmhTRa3bsF)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 494c743 commit 4df40e2
4 files changed
Lines changed: 35 additions & 14 deletions
File tree
- .changeset
- skills/objectstack-upgrade
- evals
- references
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
174 | | - | |
| 174 | + | |
175 | 175 | | |
176 | | - | |
177 | | - | |
178 | | - | |
179 | | - | |
180 | | - | |
181 | | - | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
182 | 181 | | |
183 | 182 | | |
184 | | - | |
185 | | - | |
| 183 | + | |
| 184 | + | |
186 | 185 | | |
187 | 186 | | |
188 | 187 | | |
| |||
447 | 446 | | |
448 | 447 | | |
449 | 448 | | |
450 | | - | |
451 | | - | |
452 | | - | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
453 | 452 | | |
454 | 453 | | |
455 | 454 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
37 | | - | |
| 37 | + | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
43 | 53 | | |
44 | 54 | | |
45 | 55 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
79 | | - | |
| 79 | + | |
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
| |||
0 commit comments