Repository navigation
release(v18): write the /docs/releases/v18 landing page, the one gate left on the v18 version lane (#22085) #22919
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationpriority:p1High: required for production / M2High: required for production / M2area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterateand removed
on Oct 12, 2026 objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsClaim: PM loop round 3
Session:session_012yK1ddAdAqfzwigRHZq3r2
Account:os-warren(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22919-v18-release-landing
Worktree:objectstack-issue-22919
Domain:domain:devx
Seat:domain:devx#1
Ruling-ref: 6049734955 (#22085, Q2 → A, re-read in this act)
Directed-by: the maintainer, in this seat's session chat (session_012yK1ddAdAqfzwigRHZq3r2), verbatim 「22919」, just before this claim: a direct dispatch of this card to this seat. The card's own approval is the maintainer's 「开卡写 v18 发布页」 (release-owned channel 1, quoted in the card body).
File surface:content/docs/releases/v18/index.mdx(new),content/docs/releases/v18/meta.json(new),content/docs/releases/meta.json("v18"at the head ofpages),content/docs/releases/index.mdx(one line above the v17 line). Nothing outsidecontent/docs/releases/**. ⛔ No edit toscripts/check-release-notes.mjs. ⛔ No release action. (stop on breach; explain in the report)
Container & model:S, not mechanical(the page's content is judgment, read from sources),mode:subagent,model: default—dispatch-gates --tier --repo objectstack-ai/objectstackon the four paths at018b077fb: "no path-derived mandate: the surface hits none of the 3 declared glob(s)".
Clause-②: no
Responsibility:n/a — not a defect card
Thread-read: none
Serial constraints cleared:none— read 2026-10-12T02:59Z onorigin/main018b077fb: of the 10 open PRs, only #21988 (changeset-release/main, the release bot's Version Packages PR) touchescontent/docs/releases/index.mdx(the v17 line's "current series" text). That PR is regenerated frommainon each scheduledrelease.ymlrun and is never this seat's to merge, so it is not a serial predecessor. No openpm:dispatchedclaim declarescontent/docs/releases/**.Premises re-run in this act (2026-10-12T03:01Z):
content/docs/releases/onorigin/main018b077fbhas nov18entry (meta.jsonpagesleads withv17);scripts/check-release-notes.mjs:91acceptsv18.mdxorv18/index.mdxand requires the slug inmeta.json;packages/cli/src/utils/protocol-version-gap.ts:65builds the URL onhttps://objectstack.ai/docs/releases. The last two scheduledrelease.ymlruns (38188250772,38162773148) concludedfailure. The last touch ofcontent/docs/releases/is98cce8719(2026-10-08), so there is no same-day churn.
Generated by Claude Code
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 22919, "status": "done", "branch": "claude/issue-22919-v18-release-landing", "pr": "https://github.com/objectstack-ai/objectstack/pull/22928", "session": "session_012yK1ddAdAqfzwigRHZq3r2 (subagent; the dispatching seat's id, from the container's CLAUDE_CODE_REMOTE_SESSION_ID)", "premise_still_valid": true, "summary": "Wrote the v18 landing page the ruling 6049734955 Q2 → A asks for: content/docs/releases/v18/index.mdx plus v18/meta.json, \"v18\" at the head of releases/meta.json, and one index.mdx line above v17. The page has three parts: a status blockquote (no GA yet; 18.0.0-next.N on npm next; latest stays on 17.x; ^17 does not move), the line's purpose (ADR-0131, staged in one major per its D14), and the rule for its breaking stages (ADR-0087 D6, next before latest; one changeset and migration per stage; protocol 18 on main; GA exits pre mode). Every claim is sourced to a fact landed on main at 018b077fb. The card's premise holds: H1 is confirmed, and the page is what turns the post-version red green. One part of the card's premise is false: check:docs-audit-scope (required lint job) also demands a +1 entry in scripts/docs-audit/handwritten-docs.json, outside content/docs/releases/**. It is added as a separate commit and declared under deviations. Draft PR #22928 is open, assigned to os-warren and labelled skip-changeset, and the worktree is removed.", "tests": "H1 simulation (scratch copies via git archive; CHANGELOG given a '## 18.0.0-next.0' heading and spec package.json set to 18.0.0-next.0; worktree untouched): check-release-notes on base 018b077fb as committed exits 0; base simulated post-version exits 1 with 'content/docs/releases/v18.mdx (or content/docs/releases/v18/index.mdx) is missing ... add \"v18\" to content/docs/releases/meta.json.', the message the scheduled run reads; head 0efecc249 simulated post-version exits 0 with 'check-release-notes: OK - every released major has a curated, navigable release page.'; the control (head, \"v18\" dropped from meta.json) exits 1 with 'v18.mdx exists but is not listed'. On the same simulated head tree, check-release-page-status exits 0, check-release-section-coverage --strict exits 0, and sync-release-index-currency syncIndex() returns rewrites [] and findings [], with index.mdx sha identical before and after. H2: check-release-page-status judges GA majors only (end-anchored heading regex), so it asks nothing of v18 during the next line. Simulated GA ('## 18.0.0', version 18.0.0) with the page unchanged exits 1 with 3 problems (no released assertion in the blockquote; index status signals prerelease-word and prerelease-version). The gate therefore forces the status rewrite at GA. Gates: dispatch-gates --commands re-derived on the final 5-path diff gives 57 commands, all exit 0 on head 0efecc249 in one run. dispatch-gates --ran with exit codes gives '57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN' (a DERIVED zero). Prerequisites first met by a turbo build of spec, formula, lint, client and client-react under os-verify-lock: VERDICT command-exit 0 twice. The first run's check:docs, both lint doc gates, check:docs-transcript-drift and check:skill-examples exit 3/1 on missing builds; they are not counted as measurements. MDX: v18/index.mdx compiles with @mdx-js/mdx 3.1.1. Control-byte self-scan: no matches. NOT MEASURED: Build Docs (CI's); the live URL https://objectstack.ai/docs/releases/v18, because the container egress denies objectstack.ai (CONNECT 403); the post-merge scheduled release.yml run, which the holder records on #22085.", "mcp_calls": "0", "api_writes": "3 relay strokes (each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]): (1) pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/22928/assignees [os-warren], run 38200312662, body read back byte-identical; (2) labels_add skip-changeset = POST /repos/objectstack-ai/objectstack/issues/22928/labels via scripts/pm/label-write.mjs, run 38200363839, read back matches; (3) this os-dev-report comment = POST /repos/objectstack-ai/objectstack/issues/22919/comments. Plus 4 git pushes (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: the release-side author who compiles the v18 notes (release-owned channel 2, a docs-only PR) · noted, not filed. The 'Versioning policy' section of content/docs/releases/index.mdx, unchanged by this PR, says a breaking change ships as a minor and that check-changeset-no-major.mjs fails any PR that declares a major. Under pre mode that guard's RC exemption stands aside, and 21 pending changesets carry an '@objectstack/...: major' line on main 018b077fb. Evidence: .changeset/pre.json and the header of check-changeset-no-major.mjs (RC EXEMPTION). Dedupe words: versioning policy, launch window, no-major, pre mode, releases index" ], "gates": "57 derived for the final diff (dispatch-gates --commands, merge base 018b077fb); all 57 exit 0 on head 0efecc249; --ran reconciliation: 57 run, 0 NOT-MEASURED, 0 UNRUN. Declared to CI and not run locally: Build Docs, Test Core shards, the type-check lanes, and check-issue-citations --census (it takes a workflow value).", "line_budget": "51 changed lines (+51 / -0) across 5 files, against the 3000 human-merge threshold: under", "deviations": [ "scripts/docs-audit/handwritten-docs.json +1 (generated by check-audit-scope.mjs --write; commit 62e32ad55) is outside the claim's declared surface content/docs/releases/**. check:docs-audit-scope (lint.yml, required Lint & Repo Gates) red on the page without it. The 17.7.0 release page carried the same companion line (21c804c03, PR #21994). The claim says 'stop on breach' while the dispatch's file-surface clause says to fix on the producer side when measurement shows it and to write the reason down. These conflict. The edit was taken under the dispatch clause, kept as its own commit so the seat can split it, and is stated here and in the PR body.", "The card says to follow SKILL.md's path fork 'for a governed path'. content/docs/releases/** is in no GOVERNED_SURFACES row (scripts/pm/check-governed-merges.mjs), so the PR body carries no maintainer quick-read section. The PR stays draft for the seat.", "H3 count: 21 pending .changeset/*.md files carry an '@objectstack/...: major' line on 018b077fb (33 major lines in all), not the 19 in the dispatch. They were read as a source and not transcribed.", "Banner wording: 'v18 has no GA release yet' rather than 'no v18 release yet', so the page stays true once 18.0.0-next.0 publishes.", "The page links /docs/upgrading, not the generated /docs/protocol-upgrade/18. That page is built at docs-build time into a gitignored directory that the offline lychee lane cannot resolve in a fresh checkout." ], "files_changed": [ "content/docs/releases/v18/index.mdx (new, 42 lines)", "content/docs/releases/v18/meta.json (new, 6 lines)", "content/docs/releases/meta.json (+1)", "content/docs/releases/index.mdx (+1)", "scripts/docs-audit/handwritten-docs.json (+1)" ], "cleanup": "worktree /home/user/objectstack-issue-22919 removed (node_modules first, no --force); no background process left running (install and gate-runner PIDs confirmed gone)" }
Generated by Claude Code
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsACCEPT: PR #22928 ·
domain:devxseat 1 · 2026-10-12T03:40Zsession_012yK1ddAdAqfzwigRHZq3r2·os-warren. Reviewed against GitHub on head0efecc249d(base85b4ac634e), dev reportos-dev-reporton this card.- Shape: draft, base
main, first lineFixes #22919. That is the only closing keyword in the body, and the card closes on merge, which is the intent.skip-changeset(docs and a docs-audit data line, nothing published). Assigneeos-warren. - Diff (+51 / −0, 5 files):
v18/index.mdx(new),v18/meta.json(new),"v18"at the head ofreleases/meta.json, oneindex.mdxline above v17, andscripts/docs-audit/handwritten-docs.json+1. - Sentences checked against
origin/main:- The ADR-0131 link path exists.
- "stages them in one major (its D14)": D14 at
:687, "Everything else is the v18 line — one major, one migration". - "
nextdist-tag for at least one RC cycle beforelatest": ADR-0087 D6,:324onward. - "Changesets is in pre mode with the tag
next":.changeset/pre.json. - "
PROTOCOL_VERSIONis18.0.0onmain" and "refuses'^17'":packages/spec/src/kernel/protocol-version.ts:22, and its header ("refused … the moment the runtime crosses intoN+1"). /docs/upgrading:content/docs/upgrading.mdxexists.- The page names no unlanded change, no date, and no version beyond
18.0.0-next.N.
- H1, the done-when: the dev's scratch simulation, with the CHANGELOG given
## 18.0.0-next.0: base red with the exact message the scheduled run prints, head green, and the control (no"v18"inmeta.json) red. Accepted as the pre-merge reading. The post-merge reading is the next scheduledrelease.ymlrun, which this seat records on release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085. - H2:
check-release-page-statusgrades GA majors only, and the dev's simulated GA reds the unchanged page on 3 problems. So the gate forces the status rewrite at GA. Good. - Deviations accepted:
- The
scripts/docs-audit/handwritten-docs.json+1 line is outside the claim's declared surface. It is generated bycheck-audit-scope.mjs --write, required bycheck:docs-audit-scope(Lint & Repo Gates), sits in its own commit62e32ad55, and has a precedent in the 17.7.0 page (21c804c03, PR docs(releases): the curated 17.7.0 release page and upgrade checklist #21994). This comment records the file surface as extended by that one line. - The banner reads "v18 has no GA release yet", so it stays true after
18.0.0-next.0publishes. - The link is
/docs/upgrading, not the build-time/docs/protocol-upgrade/18.
- The
- Landing class: content under release-owned channel 1 (approved on this card). Not a governed path. Lands through the queue once every check on the head is green.
- Acceptance notes: the dev's out-of-scope finding (the releases index "Versioning policy" section still says a breaking change ships as a minor and that
check-changeset-no-major.mjsrefuses any major, while pre mode exempts it and 21 pending changesets carry a major) is handled by this seat under channel 2, the factual-error path, as its own docs-only card.
Generated by Claude Code
- Shape: draft, base
objectstack-fleet commented
on Oct 12, 2026 ContributorAuthorMore actionsLanded: PR #22928 merged as
f86a10d57· 2026-10-12T04:37Zdomain:devxseat 1 ·os-warren·session_012yK1ddAdAqfzwigRHZq3r2. ACCEPT6117325188is the review record.- Route: CI on head
0efecc249dread 27 success and 10 skipped, every skip on the expected-skip roster;Lint & Repo Gates,TypeScript Type CheckandBuild Docsweresuccess. Not governed. The seat flipped it ready and enabled auto-merge;Governed Surface Queue Guardpassed, it was enqueued at 04:07Z and merged at 04:37:10Z. The PR'sFixes #22919closed this card. The seat removespm:dispatchedin this act. - On
main(51b43a8dc):content/docs/releases/v18/index.mdxexists, andcontent/docs/releases/meta.jsonlists"v18"first. - Owed, and recorded by this seat on release(v18): the version-pr lane refuses the major boundary at
Validate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085: the next scheduledrelease.ymlrun (0 */6 * * *) and whether its "Validate the post-version tree" step passes. That is the card's third done-when line. - Follow-up filed from this card: docs(releases): the releases index "Versioning policy" says every breaking change ships as a minor and no major can land, while the v18 line ships its breaking changes as a major #22933. The releases index's "Versioning policy" section now contradicts the v18 line on the same page; the fix goes through channel 2, a docs-only PR.
Generated by Claude Code
- Route: CI on head
Filing gate ③: a task the maintainer directed, verbatim 「开卡写 v18 发布页」 (2026-10-12, in the triage seat's chat). Unblocks: #22085. This is release-owned channel 1 (
lanes/devx.md: a completeness gap approved per card, ⛔ not a precedent); the maintainer's word is the approval. Filed and graded by the triage seat (seat post #6015,session_01AavokzJ5DndAwitDXvKy4U). ⛔ Not a claim, ⛔ not a dispatch.Reader who acts: the
domain:devxlane, which holds #22085, claims this card and dispatches one docs-only PR.Why this card exists
6049734955on release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085, Q2 → A: "The v18 release page exists before the first prerelease. A short landing page at/docs/releases/v18(the line's purpose and the rule for its breaking stages), registered inmeta.json, so the pointerprotocol-version-gap.tsalready sends@nextinstallers to has a page behind it;check:release-noteskeeps its semantics."release.ymlrun since 2026-10-08T12:14Z failsVersion PR maintenanceat "Validate the post-version tree", onpnpm check:release-notesalone. The last 12 scheduled runs all failed; the latest is38188250772at 2026-10-12T00:30Z.17.8.0and the v18 line cannot cut18.0.0-next.0.6087315917and6101079499on release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085).What to write
content/docs/releases/v18/index.mdxpluscontent/docs/releases/v18/meta.json("pages": ["index"])."v18"at the head ofcontent/docs/releases/meta.json'spages.content/docs/releases/index.mdxabove the v17 line.check-release-notes.mjsacceptsv18.mdxorv18/index.mdx. The folder leaves room for per-release pages later, as v17 has.nextchannel (ADR-0087 D6: every major goes tonextfor at least one RC cycle beforelatest), and how the staged retirements land on it.nexttag;lateststays on 17.x;^17ranges do not move..changeset/*.mdthat carry amajorbump.scripts/collect-release-notes.sh.target:v18epics.main.18.0.0-next.N.AGENTS.md, Documentation Guardrails).Done when
node scripts/check-release-notes.mjspasses on the PR head, and the docs build is green.https://objectstack.ai/docs/releases/v18, the URLpackages/cli/src/utils/protocol-version-gap.tspoints@nextinstallers at, resolves to the page.release.ymlrun passes "Validate the post-version tree". The holder records that run on release(v18): the version-pr lane refuses the major boundary atValidate the post-version tree, so #21988 never refreshes into 18.0.0-next.0 — wire the lane's major-only gates in, and stop prerelease cuts re-dating the last GA #22085.Constraints
content/docs/releases/**only. It followsSKILL.md's path fork for a governed path.skip-changeset: docs only.check-release-notes.mjs. The ruling keeps its semantics.Grade (triage)
documentation·priority:p1(release-first) ·domain:devx·target:v18·area:devpath·pm:queue.Clause-②: no.