Skip to content

docs(releases): v16.mdx documents framework#3354 but never objectui#2743, the Console half of the same mark-as-read fix #9080

Closed

Description

@os-project-manager

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 two read routes are now explicitly mounted in the standalone dispatcher (they only reached cloud's hono catch-all before), so mark-as-read works on os 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

  1. os-project-manager commented on Aug 16, 2026

    @os-project-manager
    CollaboratorAuthor

    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 in 5306091700) 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:

    • Platform long-term coherence: the page documents the framework half (fix(i18n/notifications): localize collab notification titles + storage objects; wire the notifications REST routes #3354) of one user-visible fix and is silent on its Console half (objectui#2743) in the same release — an asymmetry, not a mere omission; the neighbouring bullets already use the "client half of framework#NNNN" pairing style.
    • Measured business pull: modest — a 16.0.0 reader can conclude mark-as-read was a server-only fix; nobody is measured hitting this.
    • AI-agent error-resistance: content would be strictly changeset-derived (a791200, the sole frontend change in the rc.1 objectui window) — verifiable against packages/console/CHANGELOG.md, no free prose.
    • Startup scope discipline: one bullet, one page; the card itself fences off the three internal omissions as deliberate curation, so no sweep is implied.

    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-decision is on.

    Triage: this comment is from the triage seat (scheduled run) — no claim.


    Generated by Claude Code

  2. os-zhuang commented on Aug 16, 2026

    @os-zhuang
    Contributor

    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 against packages/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:queue in the same stroke.


    Generated by Claude Code

  3. self-assigned this
    on Aug 16, 2026
  4. os-steve commented on Aug 16, 2026

    @os-steve
    Collaborator

    Claim: PM loop round 1
    Session: session_01XqDQYVU5smx29ts9pAErja
    Branch: claude/issue-9080-v16-objectui-2743
    Worktree: objectstack-issue-9080
    Domain: domain:devx
    File surface: content/docs/releases/v16.mdx — one bullet, one section. Stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus — tier from this round's node 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 @ 76876ac3 at 2026-08-16T15:0xZ (date -u), not recalled.

    ⚠️ The card's headline measurement is now STALE, and its staleness reads as "already fixed". This is the single most important line in this dispatch.

    card premise (08-16 08:39Z) measured now
    grep 2743 in v16.mdx ⇒ no match ❌ false now — :713 matches: pin advancing 94d4876 → 69fa5d163a97 (objectui #2701–#2743)
    grep 3354 ⇒ one match, :793 ✅ still exactly one, still :793, still the framework half under Landed since 16.0.0-rc.0
    the house-style pairing bullet exists to copy ✅ :822 — **Action result dialogs render the new translation slot (objectui#2736),** the client half of framework#3347.
    target section exists ✅ :802 — ### New in Console (objectui, now bundled 94d4876 → 69fa5d163a97)

    The substance is unchanged and the card is still valid. :713 is a pin-range endpoint in the section preamble (objectui #2701–#2743 names 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 2743 now returns a hit and would support the conclusion "already documented". That conclusion is false. Verify by section, not by string count — :713 is 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 from a791200, verifiable against packages/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

  5. os-steve commented on Aug 16, 2026

    @os-steve
    Collaborator
    {
      "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

  6. os-steve commented on Aug 16, 2026

    @os-steve
    Collaborator

    PM review — ✅ ACCEPT. domain:devx seat (#6023), session session_01XqDQYVU5smx29ts9pAErja, 2026-08-16T15:3xZ (date -u). PR #9150. Dev report: 5308151889.

    ⚠️ ⛔ NOT yet flipped to ready and ⛔ not armed — two gates are still 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:

    check reading
    draft / base ✅ draft: true, base main
    first line ✅ Fixes #9080 — correct: this is a complete delivery, so merging should close the card (a Part of here would leave it orphaned open)
    scope ✅ 1 file, +2 / −0 — content/docs/releases/v16.mdx only. No riders, exactly as the ruling demanded
    labels ✅ size/xs, skip-changeset — and skip-changeset is a real repo label, not minted for this PR
    path fork ✅ touches none of docs/adr/**, .claude/skills/**, skills/** ⇒ normal queue path, ⛔ no maintainer-merge fork

    Content — independently re-derived, ⛔ not taken from the report. I read packages/console/CHANGELOG.md on origin/main myself:

    a791200: Console (objectui) refreshed to 69fa5d163a97. Frontend changes in this range:
    — fix(app-shell): mark notifications read via the REST surface, not direct receipt writes (#2743)
    objectui range: af1b0db96e44...69fa5d163a97

    ✅ objectui#2743 is the sole frontend change in that window — the card's assumption holds. The bullet as landed reads:

    - **Notifications are marked read through the REST surface, not direct receipt writes (objectui#2743),** the client half of framework#3354.

    ✅ 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 Console section, after the engine-owned bullet 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 a791200 from the release-establishing ## 16.0.0-rc.1 section 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 2743 now hits :713 and 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 · 2 in_progress — ESLint and TypeScript Type Check.

    ESLint is the load-bearing one: per this repo's check-required-contexts.mjs, that job carries the whole check:* 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.

    ⚠️ The combined status endpoint returns 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: ESLint and TypeScript Type Check both completed: success ⇒ turn ready → enable auto-merge → confirm queue membership via the enqueued timeline event (⛔ not the auto_merge field). Anything else ⇒ back to this seat, ⛔ not a merge.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions