Repository navigation
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 |
…bjectstack-ai#21290) ## What this is A pre-cut draft of the curated release page for **17.6.0**, `content/docs/releases/v17/17-6.mdx`, plus its entry in `content/docs/releases/v17/meta.json` and in `scripts/docs-audit/handwritten-docs.json`. It also appends one dated correction to `content/docs/releases/v17/17-5.mdx` (details below). Docs-only. Everything is under `content/docs/releases/` (release-owned) or the docs-audit list, so this is the dedicated docs-only PR `AGENTS.md` sanctions for that tree. It publishes nothing from any package, hence `skip-changeset`. Clause-②: no It follows the 17.5.0 page's structure: 1. Highlights 2. What's new, including the "read this before treating the version number as a safety guarantee" list of silent runtime changes 3. Breaking changes & migration (triaged, not exhaustive) 4. New capabilities 5. Notable fixes 6. New in Console (Studio) 7. Shipped in 17.5.0, listed again in 17.6.0's CHANGELOG 8. Upgrade checklist (every line marked *not exercised*) ## How it was compiled - **Source:** all 338 changesets pending on `main` at `748b2407`. Every changeset was read and triaged into breaking, feature, fix or internal. PR numbers and short SHAs are taken from the commit that added each changeset. - **Already shipped in 17.5.0:** 16 of the 338 changesets (from 15 commits) describe code that 17.5.0 already published. I checked each commit with `git merge-base --is-ancestor` against the version commit `8c87d26a` and the publish commit `0f6dcac5`. - Eight follow the version commit in first-parent order. The 17.5.0 page already covers them. - Seven are ancestors of the version commit but were not in the version PR when it merged. The 17.5.0 page does not mention them. Two of them are breaking (`e73ee2d` objectstack-ai#20567, `c876a74` objectstack-ai#20504), and `7a1faf1` (objectstack-ai#20579) makes `os validate --strict` fail on a live conversion. - The new section matches the list in `.changeset/20622-release-aftercare-upgrade-and-unannounced-notes.md`. - **Cross-check:** each of the nine ADR-0087 conversions added since 17.5.0 is covered by a migration entry on the page: - `action-block-endpoint-to-target` - `connector-sync-keys-removed` - `connector-triggers-removed` - `cube-refresh-key-removed` - `dataset-count-measure-empty-field-removed` - `form-field-public-picker-removed` - `form-view-subform-columns-canonicalized` - `page-header-breadcrumb-removed` - `time-default-utc-suffix-dropped` - **Console section:** built from the three pin-bump changesets (`dd3f7e1be356 → db11afd4967c → e420df310f5b → 31971ff1e28f`), which carry 232 releasing objectui changesets, 23 of them declared breaking. The range was also read with `scripts/objectui-range.mjs`. - **Fact-check pass:** a second pass checked every cited SHA's changeset against the page, in three slices. It found 31 claims that were wrong or overstated, and the three follow-up commits correct them. Some examples: - An RLS `contains` verdict that `d2bc644` (objectstack-ai#21253) later reversed in this same release. - The `manage_platform_settings` scope: reads of both types, but writes of `datasource` only. - The dataset door's status after `434c6c7` (objectstack-ai#21240). - Filter positions that differ per change. - `7a1faf1`, which is not a breaking change. - **Other corrections made while compiling:** - The connector migration table does not claim that a `job` schedules a `connectorSource` pull. `0efbdc3` says nothing schedules a pull until the `job` stage lands, and none landed in this release. - The public-form picker search-key change (`bafb8c9`, objectstack-ai#21136) is noted as moot, because the route it changed is retired later in the same release (`3dc33b2`, objectstack-ai#21222). ## Open items for the cut These are recorded in the page's RELEASE-TIME TODO comment. - **Anonymous endpoints.** Under the deny baseline (objectstack-ai#21217), an app-declared anonymous endpoint (`authRequired: false`) can no longer read or write objects. objectstack-ai#21158 is still open, and until it lands no supported channel grants anonymous callers a permission set. The page says so instead of prescribing a grant. - **Console pin.** Three 17.6.0 server changes refuse a body that the pinned Studio (`31971ff1e28f`) still sends. objectui fixed each one after the pin: | Studio action | Server change that refuses it | objectui fix (not in the pin) | |:--|:--|:--| | A dataset count measure saved with the Field box blank (`field: ''`) | objectstack-ai#21240 | `0858267e` | | An External / Validate-only datasource saved without a credential | objectstack-ai#21133 | `8001068b` | | Republishing an html page that gained a plugin component | objectstack-ai#20852 | `3ae91930` | The page lists these under "Known console issues". If the pin moves before the cut, the lines it fixes come out. Otherwise the accepted-for-GA waiver is recorded. ## The correction to 17.5.0 One dated correction line is appended in place to the "Also shipped in 17.5.0" paragraph of `17-5.mdx`, in the form objectstack-ai#20985 used. It names the seven commits that shipped in 17.5.0 with no CHANGELOG entry and links to the 17.6.0 section. The original text is unchanged. ## Deliberately not in this PR - `content/docs/releases/v17/index.mdx` is **untouched**. Its status blockquote and per-release list may only claim 17.6.0 after the release ships. - An MDX comment at the top of `17-6.mdx` lists the release-time edits: 1. the publish date; 2. changesets landed after `748b2407`; 3. the per-package CHANGELOG entry count; 4. the console-pin outcome; 5. objectstack-ai#21158 if it lands first; 6. the `v17/index.mdx` update. ## Verification Run locally on the head commit, with the workspace installed. All of these pass: - `check-issue-citations --base origin/main`: every added citation resolves. - `check:doc-anchors`, `check:role-word`, `check:docs-audit-scope`, `check:nul-bytes`, `check:doc-authoring`, `check:docs-single-h1`, `check:docs-redirects`, `check:docs-locale-catch-all` - `check:corpus-claim-drift`, `check:docs-spec-enumerations`, `check:published-readme-links` - `check:release-notes`, `check:release-page-status`, `check:release-index-currency-sync`, `check:release-body` - `check-release-section-coverage` (plain and `--strict`), `check-doc-frontmatter`, `check-docs-nav-label`, `check-docs-section-name`, `check-section-landing-index`, `check-doc-route-spelling --advisory` Both pages compile as MDX with `@mdx-js/mdx` 3 + `remark-gfm`, and the three tables parse with no ragged rows. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL --------- Co-authored-by: Claude <noreply@anthropic.com>
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