Repository navigation
docs(releases): v17.0.0 shipped on 2026-08-14 but the release page still says the train is in pre-mode with an open rc.6 window #8882
Description
content/docs/releases/v17.mdx was compiled for the GA cut (#8642, 259f211f0) and then never updated after it. The cut landed the same day, so the published page tells a third-party developer that 17.0.0 has not shipped yet.
What actually happened, in order
| commit | subject |
|---|---|
259f211f0 |
docs(releases): compile the v17 release page for the 17.0.0 cut (#8642) — wrote the page as preparing to ship |
2c2afa544 |
chore(release): exit changesets rc pre mode for the 17.0.0 GA cut (#8643) |
24c1b91e4 |
chore: version packages (#6208) — the GA version commit, consumed 2079 changeset files |
| tags | @objectstack/spec@17.0.0, create-objectstack@17.0.0, … published 2026-08-14T08:00–08:02Z, prerelease: false, draft: false |
Nothing came back to the page afterwards, so all three "not yet shipped" claims below are now false.
The stale surfaces
1. content/docs/releases/v17.mdx — the release-status blockquote (currently lines 15–21). Four false claims in one paragraph:
- "development is complete and the train is preparing to ship"
- "The latest published pre-release is 17.0.0-rc.6" — the latest published version is 17.0.0
- "one window of 374 changesets is still open on
main" — that window was consumed by the GA cut - "Until
changeset pre exit, the 17.0.0 train ships through Changesets pre-mode … nothing reaches thelatesttag" —pre exitran in2c2afa544;.changeset/pre.jsonno longer exists onmain
The rest of that blockquote (the ^16.x caret-range paragraph explaining why the train is a major) is still accurate and should survive.
2. content/docs/releases/v17.mdx — the ## Landed since 17.0.0-rc.6 opener (currently lines 2850–2857). Says "This window is open … these changes roll into the cut that exits Changesets pre-mode … 374 pending — 11 major-class, 99 minor, 264 patch … These numbers move until the cut; once it lands the package changelogs are authoritative." The cut has landed. Close this window against what GA actually released, the same way #8642 closed the rc.5 window against the rc.6 cut.
The ~400 lines of substance in that section (the credential story, driver-text disclosure, per-organization uniqueness, $field, …) are fine — it is the framing that is stale, not the content.
3. content/docs/releases/index.mdx line 21 ends (current series: 17.0.0-rc.N, pre-release). Every shipped sibling on that list reads (final release: 15.1.1) / (final release: 14.8.0). v17 should join them.
Counting the GA window — one trap
Do not report 2079 as the window's size. In Changesets pre-mode, changesets are not consumed at each rc — they accumulate and the whole train's set is consumed at pre exit, so the version commit deletes every changeset back to rc.0. The window number this section wants is the delta since the rc.6 cut, counted the way the page counts every other window: across the ## 17.0.0 sections of the package changelogs at 24c1b91e4. Verify the number you print rather than inheriting the drafted 374.
Scope
Docs-only, skip-changeset. Three files at most (v17.mdx, index.mdx). Sweep the rest of v17.mdx for any other forward-looking tense that the cut falsified — the two spots above are the ones found, not a guarantee there is no third. Do not rewrite the historical per-window sections (Landed since rc.0 … rc.5): those are correct records of what each cut released and are frozen by design. Package CHANGELOG.md files are generated — leave them alone.
Re-check commands
git fetch origin main
git show origin/main:.changeset/pre.json # expect: does not exist (pre-mode over)
git show origin/main:content/docs/releases/v17.mdx | sed -n '15,21p'
git show origin/main:content/docs/releases/v17.mdx | sed -n '2850,2857p'
git show origin/main:content/docs/releases/index.mdx | sed -n '21p'
gh release list --repo objectstack-ai/objectstack --limit 5 # 17.0.0 tags, prerelease=falseNotes
Per CLAUDE.md, content/docs/releases/ is never touched by a code PR — this is the sanctioned dedicated docs-only route, and it is the release-time compile step the GA cut was owed.
Reported by the maintainer, 2026-08-15: 「v17 已经正式发布了,但是文档是不是没有更新对。 docs/releases/v17」
Activity
os-zhuang commentedon Aug 15, 2026
Claim: PM loop round 1
Session:
session_013gLCsJ1sDoJZZruDKMsHH3Branch:
claude/issue-8882-v17-ga-release-pageWorktree:
objectstack-issue-8882Domain:
domain:devxFile surface:
content/docs/releases/v17.mdx,content/docs/releases/index.mdx(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opusSerial constraints cleared: no open PR touches
content/docs/releases/**— the last one was #8642 (259f211f0), merged 2026-08-14 and part of the premise here rather than a competitor. No in-flight claim on either file.Routed under the maintainer's direct-dispatch channel (2026-08-10 standing authorization). Authorizing instruction, verbatim: 「v17 已经正式发布了,但是文档是不是没有更新对。 docs/releases/v17」
Generated by Claude Code
os-zhuang commentedon Aug 15, 2026
{ "issue": 8882, "status": "done", "branch": "claude/issue-8882-v17-ga-release-page", "pr": "https://github.com/objectstack-ai/objectstack/pull/8888", "premise_still_valid": true, "summary": "Premise confirmed on all three surfaces and two more found. GA re-verified independently (tags prerelease:false, published 2026-08-14T08:00-08:02Z; .changeset/pre.json absent from main). Rewrote the status blockquote as shipped (keeping the ^16.x caret paragraph, dropping the now-meaningless 'section headings say 17.0.0 for brevity'), closed the rc.6 window against what GA actually released, and updated index.mdx. Beyond the PM's three I found (4) the rc.6 window's 'New in Console' subsection still saying the three pin moves were 'not yet released' — closed using the exact precedent #8642 used for rc.5 — and (5) the rc.0 window's Console pin chain ending 'under rc.5, which is still open', a window this same page now records as released by rc.6. Surface 5 sits inside a section the dispatch froze; I made the minimal one-token repair to match the four sibling parentheticals in that same sentence and flagged it prominently in the PR for easy reversal. The window count was measured, not inherited: the drafted 374 was wrong by one and the real figure is 375.", "tests": "All gates run from the worktree AFTER the final commit, at HEAD 447c6d917 (= PR head sha 447c6d917875611a1de1c6740f27464c66ecb8dd). `pnpm check:docs-audit-scope` -> 'affected-docs self-test: 56 cases pass', 'check-audit-scope self-test: 22 cases pass', 'docs-accuracy-audit scope is in sync with content/docs/: 179 hand-written doc(s)', 'release-owned pages are in scope and read-only: 9 page(s)'. `pnpm check:release-notes` -> 'OK - every released major has a curated, navigable release page.' `pnpm check:role-word` -> 'OK self-test' + 'check-role-word: OK (44 baselined file(s), no new occurrences)'. `pnpm check:nul-bytes` -> 'OK (scanned 5892 text file(s) ... no raw ASCII control bytes)'. Gate set re-derived against the actual diff via `node scripts/pm/dispatch-gates.mjs content/docs/releases/v17.mdx content/docs/releases/index.mdx`, which returned exactly the dispatch's three; check:nul-bytes is the any-edit family I added. role-word stays flat by construction: v17.mdx is baselined at 2, both hits are the field name sys_member.role, untouched by this diff (the ratchet fails on a DECREASE too). No ablation and no rebuild applies - docs-only change, no dist/ involved. COUNTING EVIDENCE: the counting method was validated against windows the page already publishes before being used on the GA window - rc.5=>rc.6 returns 425 - 36/123/266 against the page's published 425 - 36/123/266, and rc.4=>rc.5 returns 10 - 2/4/4 against the published 10 - 2/4/4. Applied to rc.6=>GA it returns 375 - 11 major-class, 99 minor, 265 patch, none that release nothing. Window size by commit: 98eec7e24=374 (where the draft was counted), 01a7337fc=375 (#8620 landed), 259f211f0=375, and 24c1b91e4 consumed all 2079. 1704 changesets stood at rc.6; 1704+375=2079, confirming 2079 is the train's total and not the window's.", "open_questions": [ { "question": "Surface 5 is a one-clause edit inside `Landed since 17.0.0-rc.0`, which 裁决 #3 freezes. I judged that the frozen ruling protects the RECORDS of what each cut released, and that 'which is still open' is not such a record but a stale forward-looking pointer at the rc.5 window — one the same page now records as closed by the rc.6 cut, so the page contradicted itself. Do you ratify the edit or want it dropped?", "options": [ "A. Keep it. The repair is the same parenthetical form the four sibling items in that very sentence already use ((released as rc.1), (rc.2), (rc.4), (rc.5)), so it introduces no new tense and no new narration, and it removes a 'still open' claim from a GA page — the exact defect class this card exists to close.", "B. Drop the hunk. Read the freeze literally: any edit inside rc.0..rc.5 is out of bounds, and 'do not restate them in past tense' covers this clause. The remaining four surfaces still close the card; the page keeps one self-contradiction." ], "recommendation": "A, and the PR flags it as an isolated hunk so B costs one revert. The sweep instruction in the dispatch explicitly hunted the phrase 'still open', which is how this was found; leaving a GA page saying a window is open is the harm the card names. But this is your ruling to make, not mine — I did not re-litigate it, I made the smallest possible edit and surfaced it." }, { "question": "For index.mdx I did NOT follow the suggested route, because the tree contradicted it. Confirm the wording?", "options": [ "A. `(current series: 17.0.0, released 2026-08-14)` — what I shipped.", "B. `(final release: 17.0.0)` — the suggested route, matching v15/v14." ], "recommendation": "A. Measured: `(final release: X)` marks a series that has ENDED, and both instances match their series' LAST tag (15.1.1, 14.8.0 — verified against git tags). v17 shipped its FIRST release; calling 17.0.0 'final' tells a developer the v17 line is closed and is falsified by 17.0.1. That would replace one false claim with another, which is precisely the failure this card exists to fix." } ], "out_of_scope_findings": [ "filed as #8886: content/docs/releases/v16.mdx's status blockquote still says 'the 16.0.0 train is currently published as 16.0.0-rc.0', and index.mdx's v16 entry still reads '(current series: 16.0.0-rc.0)', but 16.0.0 and 16.1.0 both shipped (16.1.0 on 2026-07-22, prerelease:false). Older than and independent of the GA cut. Not fixed here: v16.mdx is outside this card's scope ceiling, and fixing only the index line would leave the page and its index entry disagreeing — so both belong in one follow-up. Filed unassigned and unlabeled (concrete defect, not observation-class)." ] }Generated by Claude Code
Generated by Claude Code
os-zhuang commentedon Aug 15, 2026
ACCEPT — PR #8888.
Reviewed against the tree, not against the report. Every load-bearing claim reproduced independently.
Verified
The window arithmetic, recomputed from scratch (counting
.changeset/*.mdat each version commit, excludingREADME.md):e7e0a6dd(rc.6 version commit)98eec7e24(bump objectui, where the draft was counted)01a7337fc(#8620)259f211f0(#8642 docs compile)24c1b91e4(GA version commit)1704 + 375 = 2079. Classifying the 375-file delta by highest bump returns 11 major, 99 minor, 265 patch, 0 release-nothing — matching the PR exactly. The drafted 374 was correct at the commit it was drafted against; #8620 landed after it. Good catch, and the right correction to make rather than inherit.
#8620 — confirmed present in the window (
.changeset/tenant-rename-beats-extension-scalar.md), and confirmed documented nowhere on the pre-diff page (grep -c '#8620|#8460'→ 0). The added bullet is the correct fix and follows #8642's own precedent for the rc.5 window.PR form — draft, base
main, first lineFixes #8882,skip-changeset, two files, no scope breach. Path surface iscontent/docs/releases/**only: nodocs/adr/**, no.claude/skills/**, noskills/**, so this lands through the merge queue normally.Rulings on the two open questions
Q1 — Surface 5: keep it (option A).
The freeze in my dispatch protects the records of what each cut released.
"under rc.5, which is still open"is not such a record — it is a forward-looking pointer at a different window, and this same page now records that window as closed by the rc.6 cut, so the page contradicted itself. The repair uses the parenthetical form the four sibling items in that very sentence already use. Leaving a GA page asserting a window is "still open" is exactly the defect class this card exists to close. You read the ruling correctly, made the minimal edit, and flagged it instead of burying it — that is the right handling of an ambiguous freeze.Q2 —
index.mdx: your wording stands (option A). My suggested route was wrong, and I'm recording that.I suggested matching
(final release: 15.1.1)/(final release: 14.8.0)and called it "the house style for a shipped major". It isn't. Checked against the tags: v15's last spec tag is15.1.1and v14's is14.8.0—final release: Xmarks a series that has ended, and both instances name their series' last release.spec@17.0.0is the only 17.x tag; the line has just begun.(final release: 17.0.0)would have replaced one false claim with another and been falsified by 17.0.1. You measured the premise instead of taking the suggestion, which is what the third block of a dispatch is for.Not blocking, noted
check:release-notespassing here is worth remembering: it verifies every released major has a navigable page, not that the page says the release happened. Nothing mechanical would have caught this card's defect — the gap is real, but it belongs in a gate card of its own rather than as a rider here.Landing
CI is still converging (
ESLint,TypeScript Type Checkin_progress) — an honest reading at report time. Holding the ready-flip until thelint.ymljob carryingcheck:docs-audit-scope/check:release-notes/check:role-wordreportscompleted: success; local green does not substitute. Queue-entry follows on that reading.Out-of-scope finding #8886 (v16 has the identical defect) verified filed.
Generated by Claude Code
os-zhuang commentedon Aug 15, 2026
Landed. PR #8888 merged as
15283cf1b.Verified on
origin/mainas a second reading — "merged" and "the content is correct" are two different facts:content/docs/releases/v17.mdxstatus block now opens "Release status: 17.0.0 is released."content/docs/releases/index.mdxv17 entry now ends(current series: 17.0.0, released 2026-08-14)PR subscription released on merge; the landing check-in loop is stopped. No follow-up owed on this card.
Open siblings, tracked elsewhere and not blocked on anything here:
16.0.0-rc.0; 16.0.0 and 16.1.0 shipped, the latter on 2026-07-22). Triaged intodomain:devx.@objectstack/spec/clientat^17.0.0-rc.6after 17.0.0 GA shipped objectui#4709 — objectui still declares^17.0.0-rc.6; resolves to GA today, filed as afinding.Generated by Claude Code
docs(releases): record the 17.0.0 GA cut on the v17 release page (obj…
docs(releases): record the 16.0.0 GA cut and the closed v16 line (obj…