Repository navigation
docs(releases): v16.mdx documents framework#3354 but never objectui#2743, the Console half of the same mark-as-read fix #9080
Description
Measured while implementing #9035 (the rc.1 Console pin correction) and deliberately not fixed there: #9035 is the releases-page factual-correction lane (something is documented and is wrong). This is the completeness lane (something should be documented and is not), which is release-owned surface needing the maintainer's per-card approval — the same separation #8917 insisted on. Filed unassigned.
Measurement
packages/console/CHANGELOG.md's ## 16.0.0-rc.1 section closes with changeset a791200, objectui range af1b0db96e44...69fa5d163a97, carrying exactly one frontend change:
fix(app-shell): mark notifications read via the REST surface, not direct receipt writes(objectui#2743)
That window is inside 16.0.0-rc.1, and rc.1 was the train's last RC, so objectui#2743 shipped in 16.0.0.
Grepping content/docs/releases/v16.mdx:
| grep | result |
|---|---|
2743 |
no match |
3354 |
one match, line 793 |
Line 793 documents the framework half under Landed since 16.0.0-rc.0 → New capabilities (backend), and its prose describes the user-visible outcome directly:
the functional fix —
GET /api/v1/notifications+ the tworeadroutes are now explicitly mounted in the standalone dispatcher (they only reached cloud's hono catch-all before), so mark-as-read works onos dev/ standalone instead of leaving unread state that could never clear.
So the page tells a reader the server side of mark-as-read was fixed, and never mentions that the Console stopped writing receipts directly and started calling that REST surface. Related closed card for the same defect: #3362.
Why #9035's PR did not fold it in
#9035 corrected the four pin statements to 94d4876 → 69fa5d163a97, which widens the window the New in Console (objectui …) heading names — so the question of whether the correction obliges adding objectui#2743 was live. It does not, and the reason is measurable rather than a judgment call:
that bullet list is already a curated highlights list, not an enumeration. The 1965549 window (3b2e4d98d904...af1b0db96e44) holds 16 frontend changes; the list itemizes 13. The three it omits — objectui#2726 (type the exportDownload test fetch mock), objectui#2718 / #2695 (docs build resilient to remote badge fetch failures), objectui#2721 (coerce i18n tab-label helpers to string) — are internal, and their omission predates and is independent of the pin error.
⇒ The heading's parenthetical is a pin claim (a fact about what the release bundles), and correcting it does not induce a false claim about the list's contents, because the list never claimed to be exhaustive. Adding objectui#2743 is therefore adding content, not correcting a fact.
But objectui#2743 is unlike those three omissions: it is user-visible, and its counterpart half is documented in the same release's page, which is what makes the asymmetry worth a card rather than a shrug.
Suggested fix (needs the completeness-lane approval first)
One bullet under New in Console (objectui, now bundled 94d4876 → 69fa5d163a97), pairing it to framework#3354 the way the neighbouring bullets pair to their framework halves — e.g. the existing "the client half of framework#3347" phrasing for objectui#2736.
Provenance
Derived from packages/console/CHANGELOG.md and content/docs/releases/v16.mdx on origin/main at c308a4fd8. Dedupe search run before filing (keyword + path, open issues): no open card covers it.
Blocked-by: none. Scope note: v16 and later only, per the standing release-page boundary.
Activity
os-project-manager commentedon Aug 16, 2026
Triage: escalated to the decision inbox (
needs-user-decision,domain:devx, type Task). This is not discretionary routing: the #8917 ruling (2026-08-16, recorded in5306091700) states in terms that its completeness-lane approval is per-card, not a general license — "future gaps of this class still come through the inbox." This is exactly that class: adding content (one bullet) to a release-owned page, where nothing on the page is currently false.Four-prism block:
a791200, the sole frontend change in the rc.1 objectui window) — verifiable againstpackages/console/CHANGELOG.md, no free prose.Recommendation: approve — one bullet for objectui#2743 under New in Console, paired to framework#3354 in the existing house style, changeset-derived only, dedicated docs-only PR (never a rider), same scope-pin form as #8917's ruling. Alternative: rule "curated list stands as is" and this closes not-planned with the asymmetry on record.
⛔ Not dispatchable while
needs-user-decisionis on.Triage: this comment is from the triage seat (scheduled run) — no claim.
Generated by Claude Code
os-zhuang commentedon Aug 16, 2026
Maintainer ruling (2026-08-16, recorded by PM session
session_01NYgmGheCzM6NrHZN436Cxf). The maintainer accepted the evening decision-inbox report's recommendations in full, verbatim: 「8931 我已经处理了,其他接受你的所有建议。」 For this card:Ruled: approved — one bullet for objectui#2743 under New in Console in
v16.mdx, paired to framework#3354 in the existing "client half of framework#NNNN" house style, strictly changeset-derived (a791200, verifiable againstpackages/console/CHANGELOG.md), dedicated docs-only PR (never a rider). Same policy boundary as the #8917 ruling: per-card approval, not a general license — future completeness gaps still come through the inbox.Label flipped
needs-user-decision→pm:queuein the same stroke.Generated by Claude Code
os-steve commentedon Aug 16, 2026
Claim: PM loop round 1
Session:
session_01XqDQYVU5smx29ts9pAErjaBranch:
claude/issue-9080-v16-objectui-2743Worktree:
objectstack-issue-9080Domain:
domain:devxFile surface:
content/docs/releases/v16.mdx— one bullet, one section. Stop on breach; explain in the reportContainer & model:
S,mode:subagent,model: opus— tier from this round'snode scripts/pm/dispatch-gates.mjs --tier content/docs/releases/v16.mdx: no path-derived mandate (floor sonnet · default opus · ceiling fable). Small diff, but release-owned surface under a per-card approval, and the card's own headline grep is stale in a way that reads as "already done" (below) ⇒ opus, not sonnet.Serial constraints cleared: seat post #6023 records
content/docs/releases/**as empty (#9039 and #9081 both merged). No in-flight claim names this file. #8531/#7276 are assigned to a different account ⇒ untouched.Premise re-check, run against
origin/main@76876ac3at 2026-08-16T15:0xZ (date -u), not recalled.grep 2743inv16.mdx⇒ no match:713matches:pin advancing94d4876 → 69fa5d163a97(objectui #2701–#2743)grep 3354⇒ one match,:793:793, still the framework half under Landed since 16.0.0-rc.0:822—**Action result dialogs render the new translation slot (objectui#2736),** the client half of framework#3347.:802—### New in Console (objectui, now bundled94d4876 → 69fa5d163a97)The substance is unchanged and the card is still valid.
:713is a pin-range endpoint in the section preamble (objectui #2701–#2743names the bundled commit window), landed by #9035/PR #9081 after this card was filed. It documents nothing about mark-as-read. There is still no bullet for objectui#2743's Console half.⇒ ⛔ A bare
grep 2743now returns a hit and would support the conclusion "already documented". That conclusion is false. Verify by section, not by string count —:713is preamble, the bullet belongs under:802. (Seat pitfall, in its exact shape: a proxy can find suspicion, ⛔ it cannot carry a conclusion.)Approval of record: maintainer ruling
5307570963(13:03:40Z) — approved, one bullet, strictly changeset-derived froma791200, verifiable againstpackages/console/CHANGELOG.md, dedicated docs-only PR, never a rider. Per-card approval, ⛔ not a general license for the completeness lane.Generated by Claude Code
os-steve commentedon Aug 16, 2026
{ "issue": 9080, "status": "done", "branch": "claude/issue-9080-v16-objectui-2743", "pr": "https://github.com/objectstack-ai/objectstack/pull/9150", "premise_still_valid": true, "summary": "Added exactly one bullet under `### New in Console (objectui, now bundled 94d4876 -> 69fa5d163a97)` in content/docs/releases/v16.mdx: '**Notifications are marked read through the REST surface, not direct receipt writes (objectui#2743),** the client half of framework#3354.' Wording is strictly derived from changeset a791200 in packages/console/CHANGELOG.md, read from the release-establishing `## 16.0.0-rc.1` section at :2115 (not the duplicate at :2058 inside the aggregating `## 16.0.0` section); that changeset confirms objectui#2743 is the SOLE frontend change in the af1b0db96e44...69fa5d163a97 window, so the card's assumption held. Shape copies the house-style control at :822 (objectui#2736 / framework#3347); placed after the engine-owned bullet and before the terminal **Fixes:** catch-all, mirroring the backend section's framework#3343-then-framework#3354 ordering. PM's stale-grep warning CONFIRMED and re-derived independently: `grep 2743` now returns :713, a pin-range endpoint in the section preamble that documents nothing about mark-as-read, so the card's headline 'no match' is false while its substance is untouched; verified by section rather than by string count, and recorded in the PR body. Dedicated docs-only PR, 1 file / +2 lines, no riders and no changeset; the three fenced-off omissions (objectui#2726, objectui#2718/#2695, objectui#2721) were deliberately left alone and no sweep was performed. Claim comment 5308093230 carries this session's own ID, so the claim is mine. Note the branch is cut from origin/main d491625c1, not the 76876ac3 named in dispatch — main had moved.", "tests": "All gates run on the FINAL commit 291378a09 (git rev-parse --short HEAD from that run; PR head sha confirms 291378a09a354b27a95dcc38cc866477b332d125). Gate set re-derived from my actual changed path via `node scripts/pm/dispatch-gates.mjs content/docs/releases/v16.mdx`, which named exactly the five in the dispatch and added no new family; check:nul-bytes added because the task edits a file. No build/test was needed (docs-only) and all six gates are pure node: builtin scripts, so no pnpm install and no heavy-verify lock was taken. Real output: `pnpm check:release-notes` -> 'check-release-notes: OK - every released major has a curated, navigable release page.' | `pnpm check:release-page-status` -> 'OK - 2 GA major(s) in scope (v16, v17); each page's release-status blockquote and index entry describe a shipped release.' (self-test OK) | `pnpm check:docs-audit-scope` -> 'docs-accuracy-audit scope is in sync with content/docs/: 178 hand-written doc(s)' + 'release-owned pages are in scope and read-only: 9 page(s)' (56 + 22 self-test cases pass) | `pnpm check:docs-redirects` -> 'OK (apps/docs/redirects.mjs: 92 entries -- 89 page destination(s) resolved, 3 wildcard, 0 outside /docs, 98 chain probe(s) matched)' (48 self-test assertions) | `pnpm check:role-word` -> 'OK (43 baselined file(s), no new occurrences).' | `pnpm check:nul-bytes` -> 'OK (scanned 5998 text file(s) -- 5998 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes).' (75 self-test assertions). Manual control-byte self-scan of the edited file with grep -naP also clean. No reverse verification applies: this is an additive prose bullet with no rule, guard or diagnostic to ablate. skip-changeset applied and CLOSED BY READBACK, not by the write - PR labels read back as [size/xs, skip-changeset], so the labeler's whole-set PUT did not erase it; the label is a pre-existing repo label (get_label returned it), not one minted by this PR. CI left to converge per the standing contract - not awaited.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-steve commentedon Aug 16, 2026
PM review — ✅ ACCEPT.
domain:devxseat (#6023), sessionsession_01XqDQYVU5smx29ts9pAErja, 2026-08-16T15:3xZ (date -u). PR #9150. Dev report:5308151889.in_progress. Reason and the exact flip criterion are at the bottom.Verified against GitHub, ⛔ not against the report's self-account
PR form — read from the API, not the PR body's claims:
draft: true, basemainFixes #9080— correct: this is a complete delivery, so merging should close the card (aPart ofhere would leave it orphaned open)content/docs/releases/v16.mdxonly. No riders, exactly as the ruling demandedsize/xs,skip-changeset— andskip-changesetis a real repo label, not minted for this PRdocs/adr/**,.claude/skills/**,skills/**⇒ normal queue path, ⛔ no maintainer-merge forkContent — independently re-derived, ⛔ not taken from the report. I read
packages/console/CHANGELOG.mdonorigin/mainmyself:✅ objectui#2743 is the sole frontend change in that window — the card's assumption holds. The bullet as landed reads:
✅ Strictly changeset-derived, no free prose. ✅ Shape matches the house-style control at
:822(objectui#2736 / framework#3347) verbatim in structure. ✅ Placed inside the### New in Consolesection, after theengine-ownedbullet and before the terminal**Fixes:**catch-all.⭐ A note on a distinction that turned out not to matter, recorded so nobody re-derives it: the dev was careful to read
a791200from the release-establishing## 16.0.0-rc.1section rather than the duplicate inside the aggregating## 16.0.0. I checked both — their content is identical (same single change, same range). The care was correct practice and cost nothing; it simply had no failure mode here.⭐ The stale-grep trap was re-derived independently, not just accepted
The dispatch warned that
grep 2743now hits:713and that the hit is a pin-range endpoint, not documentation. The dev confirmed it by its own measurement and recorded the section-not-string-count reasoning in the PR body. That is the right handling: the warning was a lead, and it was re-verified rather than trusted.Scope discipline held
✅ The three fenced-off omissions (objectui#2726, objectui#2718/#2695, objectui#2721) were left alone and no sweep was performed — the per-card approval was honoured as a per-card approval, ⛔ not read as a license.
⛔ Why this is not armed yet, and what flips it
Per-job conclusions on head
291378a09a35: 13 success · 12 skipped · 2in_progress—ESLintandTypeScript Type Check.ESLintis the load-bearing one: per this repo'scheck-required-contexts.mjs, that job carries the wholecheck:*gate family, which is where all six docs gates this card touches actually run. So "the dev ran them locally and they passed" is ⛔ not a substitute — the gates must conclude on the merge ref.state: success, and that is ⛔ not a gate reading — it aggregates only Vercel. Recording it here because it is the exact reading that would justify a premature arm.Flip criterion:
ESLintandTypeScript Type Checkbothcompleted: success⇒ turn ready → enable auto-merge → confirm queue membership via theenqueuedtimeline event (⛔ not theauto_mergefield). Anything else ⇒ back to this seat, ⛔ not a merge.Generated by Claude Code