docs(releases): append a dated correction to the 17.3.0 migrate-meta upgrade bullet - #20985
Conversation
…upgrade bullet The bullet says `os migrate meta` "also prints `runtime 17.0.0` on a 17.3.0 install". That was the 17.3.0 output; from 17.4.0 the chain line reads `Chain: protocol 17 → 17 (this runtime implements protocol 17)`. Per the maintainer ruling on published release text, the original sentence is left byte-identical and a dated correction line is appended in place. Four added lines, none removed. Claude-Session: https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9 Co-authored-by: Claude <noreply@anthropic.com>
…thoring day The correction line was first written on 2026-09-30 UTC and is finished on 2026-10-01 UTC; the ruled form is a dated line, and the date is the day the correction is made. Claude-Session: https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Reviewed against card #16056 (body and all six comments, ruling ① Derived judgmentsThe diff adds four lines to
② Semver level
③ Boundary flagsDev report: Deviations:
Reviewer's own flag, carrier none: the bullet's headline ("Expect Implemented-by: VERDICT: FAIL Generated by Claude Code |
…nthetical The first wording said the bullet's command prints `protocol 17 → 17` from 17.4.0 on. It does so on 17.4.0 only: from 17.5.0 `--to` defaults to the highest major the installed spec has a step for, so `os migrate meta --from 17` prints `protocol 17 → 18` there and on main. The correction now states only what holds on every build from 17.4.0: the parenthetical on the `Chain:` line reads `(this runtime implements protocol 17)`, where 17.3.0 printed `(runtime 17.0.0)`. It no longer says where the chain ends and does not assert the headline's `Nothing to migrate`. Form unchanged: dated, referenced, in place, original sentence byte-identical. Claude-Session: https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Reviewed against card #16056 (body and all eight comments, ruling ① Derived judgmentsThe diff adds three lines to
② Semver level
③ Boundary flagsDev reports: round 1 Patch-round
Round-1
Prior FAIL on head Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #16056
Clause-②: no
Ruling-ref: 5564448371
Docs-only. Appends one dated correction line, in place, to the
os migrate metaupgrade bullet in the 17.3.0 section ofcontent/docs/releases/v17/17-3.mdx, in the form the maintainer ruled for this card. The original sentence stays byte-identical.The change
Against the merge base
5f6b63a6f: 1 file, 3 insertions, 0 deletions (dispatch-gatesreads+3 / -0). There are three commits:The line continues the bullet's own paragraph, so the list stays tight and nothing re-flows.
Rework: the first wording was true of 17.4.0 only
The first wording said that from 17.4.0 the command prints
Chain: protocol 17 → 17 (this runtime implements protocol 17). The bullet's command isos migrate meta --from 17with no--to. From 17.5.0,--todefaults to the highest major the installed spec has a step for, so there the same command printsprotocol 17 → 18. The contract review of this PR caught it.The line now asserts only the parenthetical, which depends on neither
--fromnor--to. It says nothing about where the chain ends, or about the headline'sNothing to migrate.Measured by running the published builds (a scratch
npm installof each@objectstack/cliversion,NO_COLOR=1, a one-object stack config). TheChain:line each build printed:os migrate meta --from 17--from 17 --to 17--from 16 --to 16protocol 17 → 17 (runtime 17.0.0)protocol 17 → 17 (runtime 17.0.0)protocol 16 → 16 (runtime 17.0.0)protocol 17 → 17 (this runtime implements protocol 17)protocol 17 → 17 (this runtime implements protocol 17)protocol 16 → 16 (this runtime implements protocol 17)protocol 17 → 18 (this runtime implements protocol 17)protocol 17 → 17 (this runtime implements protocol 17)protocol 16 → 16 (this runtime implements protocol 17)Chain:.Nothing to migrateverdict. On 17.5.0 it lists 240 manual changes instead (in this probe project), which is why the correction does not repeat the headline.On
origin/mainat7fa67dada,meta.tscarries the same print template (:627) and the same--todefault (CHAIN_TERMINUS_MAJOR,:88and:544) ascli@17.5.0: a diff of the file between the two moves none of those lines. The built spec there reportsPROTOCOL_MAJOR = 17andMIGRATION_MAJORS = [17, 18]. So the default invocation printsprotocol 17 → 18 (this runtime implements protocol 17), and the parenthetical reads as in 17.4.0 and 17.5.0. This reading ofmainis computed from the source and the built spec, not from a CLI run.What I measured before editing
The page moved. The sentence is at
content/docs/releases/v17/17-3.mdx:648; the single v17 page was split into per-release pages. It was re-located by content:runtime 17.0.0has exactly one hit in the tree.The blocker is cleared.
packages/cli/src/commands/migrate/meta.ts:627printsChain: protocol ${fromMajor} → ${toMajor} (this runtime implements protocol ${PROTOCOL_MAJOR})throughprintInfo, which adds only a leadingℹ. The table above is that template, run on each build.The changeset half is already paid. The correction rode the changesets into shipped notes:
packages/cli/CHANGELOG.md:4748: 17.4.0, entry 135843d from fix(cli):os migrate metanames the protocol, not a package version #16058;packages/cli/CHANGELOG.md:1072andpackages/metadata-core/CHANGELOG.md:278: 17.5.0, the feat(cli,metadata-core)!: emit the protocol version underprotocolVersion, not a runtime-shaped name #17261 entry;content/docs/releases/v17/17-5.mdx:1711: the 17.5.0 notes quote the new wording.This diff publishes nothing from any package (no package
files[]shipscontent/docs), so it owes no changeset and carries theskip-changesetlabel. NoCHANGELOG.mdis edited.The build carrying the repair is 17.4.0, measured on the published tarballs and the runs above.
(runtime 17.0.0);@objectstack/spec@17.3.0hasPROTOCOL_VERSION = "17.0.0". 17.4.0 prints(this runtime implements protocol 17).Why "from 17.4.0" and not "from the build carrying #15585"
#15585 was repaired in two PRs:
os migrate metanames the protocol, not a package version #16058 (merged 2026-09-06, "Part of" the card) relabelled the printedChain:line and shipped in 17.4.0.protocolVersion, not a runtime-shaped name #17261 (merged 2026-09-10, the PR that completed the card) renamed the--jsonkey and shipped in 17.5.0.The parenthetical is the same in 17.4.0 and 17.5.0, so 17.4.0 is the earliest build that prints it, and naming the version lets a reader check their own install. The full
Chain:line is not the same in the two builds: its→end moved in 17.5.0 (see Rework). That is why only the parenthetical is quoted.Verification
At head
f4f2566a0,node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ranreconciles 47 derived, 47 run, 0 NOT-MEASURED, and every recorded exit code is 0. The derived set includescheck:doc-authoring,check:nul-bytes,check:issue-citations(which judges both new citations as resolving),check:release-notes,check:release-page-status,check:docs-transcript-driftandcheck:skill-examples. The page also compiles with the repo's@mdx-js/mdx3.1.1. Repo-widepnpm lintand the full lint workflow are CI's.Acceptance notes (observed, not filed)
content/docs/releases/v17/17-4.mdxcarries no line for the fix(cli):os migrate metanames the protocol, not a package version #16058 repair; only the 17.4.0packages/cli/CHANGELOG.mdentry does. Release notes are compiled centrally, so this is noted, not fixed here.--jsonpayload still carriesruntime: "17.0.0"; 17.5.0 renames it toprotocolVersion. The original sentence and this correction are about the printedChain:line only.Expect os migrate meta --from 17 to report Nothing to migrate) is the 17.3.0 observation. On 17.5.0 the same command lists protocol-18 edits instead, as the 17.5.0 release page records. It is the historical reading and out of this card's scope, and the correction does not assert it.Generated by Claude Code