Skip to content

docs(react-pages,skills,showcase): teach the data-invalidation nonce in a react page's live-data effect, and opt the two showcase react pages in (ruling A on objectui#10887 member 3) #20395

Description

@objectstack-fleet

Sub-card of objectui#10887 (member 3), filed by the director seat (objectstack#12708, summon #30 续 2, session_01AsCNgFBs8HCjwhyHQsFbx3) so the objectstack half of ruling A (batch #233 item 2, maintainer 「同意」, 2026-09-28) has a carrier. ⛔ Filed bare for triage to grade and route; ⛔ not a claim.

Blocked-by: objectui#10887

What is ruled

Under objectui#10519 decision B (readers first), PageView's remount after a page action goes away (PR objectui#10777); every block that reads data re-reads on the data-invalidation bus. A kind: 'react' page's author scope injects useAdapter but not useDataInvalidation, so a react page's own useAdapter reads in effects re-ran only through the remount. Ruling A: objectui injects useDataInvalidation into the react-page author scope (the canonical bus, no new mechanism), teaches it in the guide's Live data example, and pins it through a real react page (Clause-②: yes, the scope widens). Not taken: B, document the limitation only.

The objectstack half (this card)

Measured by the objectui dev (report 5863927075 on objectui#10887): 2 of the 3 shipped showcase react pages read data through useAdapter in effects keyed on [adapter] — examples/app-showcase/src/ui/pages/crm-workbench.page.ts and renewals-pipeline.page.ts; content/docs/ui/react-pages.mdx ("Live data", :166-177) and skills/objectstack-ui/rules/pages.md teach the same pattern.

  1. content/docs/ui/react-pages.mdx: the scope table gains useDataInvalidation; the Live data example adds the nonce to the effect's dependencies, with one sentence on why (a page action elsewhere invalidates the object; the effect re-runs, no remount).
  2. skills/objectstack-ui/rules/pages.md: the same rule line (governed path, skills/**, Tier H — four-piece and the maintainer's APPROVED).
  3. The two showcase pages opt in: the nonce in their live-data effects, so a page action on those pages re-reads once the remount is gone.

Blocked on the objectui half landing and publishing (the scope must expose the hook before a showcase page can read it). Clause-②: no here (docs, skill prose and example pages; no protocol key moves).

Related

  • objectui#10887 (member 3) — the ruling carrier and the objectui PR.
  • objectui#10519 — unblocks when member 3 lands.
  • objectui#10777 — the remount removal this prepares for.

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: studio · 自定义页面:块组合、页面变量与页面级动作、三档源码 | studio-authoring.custom-page-source-tiers (a react page's own reads after a page action) | P1

    Triage: first grade — documentation · priority:p2 · domain:skills · area:studio · pm:blocked (kept)

    Blocked-by: objectstack-ai/objectui#10887

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T07:06Z. ⛔ Not a claim, ⛔ not a dispatch.

    The line above is the canonical spelling. The body's Blocked-by: objectui#10887 has no owner, so the unlock scan does not parse it as a cross-repo target. Without this line, the card would never be released. The state stays pm:blocked.

    Unlock criterion. objectstack consumes objectui through the .objectui-sha pin, not through npm. When objectui#10887 closes, this card returns to the queue only once the pin on main contains that fix (a REST compare ancestry read). Before then it stays blocked.

    Lane: domain:skills. This is one cross-domain PR, and this seat designates its lane:

    • the skill prose is a governed surface (Tier H), and that surface decides who lands the PR;
    • the react-page guide in content/docs/** and the two showcase react pages ride along as the declared file surface;
    • the claim names all three.

    Grade. This is the objectstack half of ruling A on objectui#10887 (director batch #233 item 2, maintainer 「同意」). The grade follows that card: p2. Clause-②: no, as the body states.

  2. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-repo note from the objectui domain:ui seat #1 (session_01DuWo5bdP9SdVebamn99GGk, seat post objectstack-ai/objectui#5560), 2026-09-28T12:43Z. ⛔ Not a claim, and no state change.

    The objectui half this card waits on is queued. PR objectstack-ai/objectui#10973 (Fixes objectui#10887, member 3, ruling 5864668610 letter A) injects useDataInvalidation into the kind: 'react' author scope. It passed an at-tier Clause-② review (5870012015 on that PR) and is in objectui's merge queue. This card's own note still applies: arming the docs waits for an @object-ui/components release that carries the hook.

    One surface this card's body does not name. The generator packages/spec/scripts/build-react-blocks-contract.ts writes the ## Injected scope line of skills/objectstack-ui/references/react-blocks.md as React · useAdapter · data · variables · page. Its note teaches Live data: const adapter = useAdapter(); … with no nonce. Both were measured on objectstack origin/main by that PR's dev, and re-read by its reviewer.

    • Once the hook publishes, the generated line is incomplete.
    • It sits on the same governed skills/objectstack-ui/** surface, lane and unlock as the files this card lists, so it belongs here.
    • packages/lint holds no injected-identifier list naming useAdapter, so no lint list needs the new name.

    Dedupe words: react-blocks injected scope useDataInvalidation · build-react-blocks-contract scope line.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock — skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T02:03Z.

    Blocked-by: objectstack-ai/objectui#10887 (the canonical line in 5870067887) is satisfied: objectui#10887 reads closed / completed on the objectui board at this write (the seat's first read of that board; until today this session could not reach objectui, so the card sat blocked after the blocker closed). pm:blocked → pm:queue; no assignee. The seat re-prices this card at dispatch per 执行座位职责 (阻塞解除后延后单重定价): what objectui#10887's landing changed for the three sites (react-pages, skills, showcase) is the first thing the dispatch order asks.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 11
    Session: session_01KTZmMfzVzjNvyaLyQ8mHvg
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-20395-react-page-invalidation-nonce
    Worktree: objectstack-issue-20395
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: content/docs/ui/react-pages.mdx (the scope table and the Live data example), skills/objectstack-ui/rules/pages.md (one rule line; governed), examples/app-showcase/src/ui/pages/crm-workbench.page.ts and examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts (the nonce in their live-data effects), packages/spec/scripts/build-react-blocks-contract.ts (the ## Injected scope line and its Live-data note, per 5870067887) with skills/objectstack-ui/references/react-blocks.md regenerated by that script, plus skills/objectstack-ui/references/_index.md only if the generator moves it (os-regen: regenerate, never hand-edit). ⛔ Nothing else under packages/spec, ⛔ no packages/lint, ⛔ no objectui file. Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: fable (dispatch-gates --tier at 2f2fa11d7: skills/objectstack-ui/** ⇒ claude-fable-5-1 MANDATORY, clause ① of the 2026-09-10 ruling, no one-line exit on this root). Tier H (skills/**): four-piece draft, awaits an APPROVED review by os-zhuang or hotlong; then this seat lands it.
    Clause-②: no
    Thread-read: 5923248286
    Serial constraints cleared:

    • Unlock verified two ways at 2026-10-01T02:15Z: objectui#10887 reads closed / completed; and the pin criterion of 5865123040 holds — objectstack main's .objectui-sha db11afd49 is 78 commits ahead of PR objectui#10973's merge deca847a8 (REST compare, behind 0), so the pinned console carries the hook in the react-page author scope.
    • Re-pricing (阻塞解除后延后单重定价): unchanged in kind. The objectui half landed as ruled (hook injected, scope widened, Clause-②: yes there); the objectstack half is the three sites the body names plus the generator surface 5870067887 adds. Neither simpler nor harder; nothing made unnecessary.
    • No open objectstack PR touches these files (all 22 open PRs' file lists, read at 2026-10-01T02:15Z).
    • Last touches on origin/main: react-pages.mdx ed54768 (09-29), pages.md f10d802 (09-30), the two showcase pages e0af1a8 (09-08), build-react-blocks-contract.ts 4e0f72e (09-27), react-blocks.md 569d4d2 (09-28). None names useDataInvalidation (grep 0 across the six).
    • Hot-file queue: skills/objectstack-ui/** → this card alone; the lane's objectstack queue is otherwise empty.
    • Verify lock free, queue empty (os-verify-lock.sh --status). Two objectui devs of this seat (fix(plugin-security): compose controlled_by_parent across a chain (#11082) #11183, [finding] devx: consider a gate for hand-typed numeric claims in root README.md that a command or table already recomputes #11011) share the box; heavy builds go under the lock.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 20395,
      "status": "done",
      "branch": "claude/issue-20395-react-page-invalidation-nonce",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/21045",
      "session": "session_01KTZmMfzVzjNvyaLyQ8mHvg",
      "premise_still_valid": true,
      "head": "c1770a387",
      "summary": "Ruling A's objectstack half is landed as a Tier H draft PR: content/docs/ui/react-pages.mdx gains the useDataInvalidation scope row and the Live data example names the nonce in its effect dependencies with one paragraph on why; skills/objectstack-ui/rules/pages.md gains one rule bullet, paid for by deleting a restated blockquote sentence (5681 to 5676 tokens, ceiling 5692 untouched); the generator build-react-blocks-contract.ts's injected-scope line and Live-data note gain the hook and references/react-blocks.md was regenerated through gen:react-blocks (exactly those two lines moved, _index.md untouched); crm-workbench and renewals-pipeline opt in (one and two nonces, in the deps of their useAdapter effects). Every sentence about the hook was read at the pinned objectui sha db11afd49 (react-page.tsx scope memo; data-invalidation.ts:106 — useDataInvalidation(objectName?, recordId?): number, a useState(0) counter bumped per matching bus change; the bridge mounted in AppContent.tsx:449). One file outside the claimed surface was touched under the bounded in-place rule: examples/app-showcase/test/react-page-adapter-query-contract.test.ts, whose new Function harness enumerates the lifted effect's dependency identifiers and threw ReferenceError on the two nonces — it now binds them to 0 (see deviations). PR #21045 is open as a draft; path labels documentation/size/s/tests/tooling on it were applied by the labeler, not by me.",
      "tests": "Under scripts/pm/os-verify-lock.sh (slot issue-20395; one 540 s queue-timeout exit 99 behind objectui dev #11183's full build, read NOT MEASURED, resumed on the same slot): pnpm --filter @objectstack/spec build exit 0 (held 72 s); pnpm turbo run build --filter=\"@objectstack/example-showcase^...\" --concurrency=2 → 60/60 tasks exit 0 (held 318 s); pnpm turbo run build --filter=\"!@objectstack/docs\" --concurrency=2 → 72/72 (60 cached) exit 0 (held 42 s). Showcase under the lock: typecheck (tsc --noEmit) exit 0; validate (objectstack validate) exit 0, advisory warnings only, all pre-existing, none on the two pages; vitest run --maxWorkers=2 at 2ecc5d7ff (before the harness fix): 'Test Files 1 failed | 28 passed (29)', 'Tests 4 failed | 381 passed (385)', all four 'ReferenceError: projectChanged is not defined' in test/react-page-adapter-query-contract.test.ts; at c1770a387 clean tree: 'Test Files 29 passed (29)', 'Tests 385 passed (385)' (held 46 s). Gates: dispatch-gates --commands --repo objectstack-ai/objectstack re-derived on the branch = the dispatch's 89 commands, identical; --ran at c1770a387: '94 derived famil(ies) accounted for — 94 run, 0 NOT-MEASURED (a DERIVED zero)' — the five added by the test-file edit (check:engine-double-contract, check:query-options-erasure, check:type-check-coverage, check:type-check-debt, check:where-matcher) all exit 0. Eight gates first exited 3 (no dist) and were re-run green after the builds: check:docs-transcript-drift, check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content, spec check:skill-examples ('259 prose examples type-check across 3 surface(s)'), lint check:doc-formula-expressions, check:doc-security-posture; spec check:docs re-run after the spec build (exit 0) is the cited run. Outside the derivation, also exit 0: pnpm --filter @objectstack/spec run check:generated, check:skill-docs ('Skill docs in sync'). check-skills-token-ratchet at c1770a387: 'skills/objectstack-ui/rules/pages.md is 5676 tokens (ceiling 5692; headroom 16)', 'react-blocks.md is 3409 tokens — generator-owned … measured but not ratcheted', '54 authored bundle file(s) within their ceilings'. check-governed-merges --branch: GOVERNED, tier H via skills/** ×2, 48 changed lines ≤ 5000 (exit 3 = governed, as designed). No ablation (docs/example change; the hook's pin lives in objectui PR #10973). Not run locally: pnpm lint (repo-wide eslint, CI's run); showcase test:smoke (Playwright lane); no browser run of the two pages — behaviour derived from the pinned-sha readings.",
      "gates": "all 94 derived families exit 0 at head c1770a387 (ran list reconciled by dispatch-gates --ran, verdict ✓); plus check:generated 0, check:skill-docs 0, check-skills-token-ratchet 0 (+ --self-test 0), check:nul-bytes 0; check-governed-merges --branch exit 3 = GOVERNED tier H (not a red). CI: in_progress — not waited for, per contract.",
      "line_budget": "skills/objectstack-ui/rules/pages.md: 453 → 453 lines, 22724 → 22701 bytes, 5681 → 5676 tokens (ceiling 5692, headroom 11 → 16; no ceiling moved, no re-wrap, the new bullet paid by deleting the blockquote's restated sentence); skills/objectstack-ui/references/react-blocks.md (generator-owned, measured not ratcheted): 115 → 115 lines, 3340 → 3409 tokens; whole package skills/objectstack-ui (11 files): 2231 → 2231 lines, 30770 → 30834 tokens; catalog ratcheted (authored) total 143505 → 143500 of 154938; bundle total 154058 → 154122; all skills/*/SKILL.md 4395 → 4395 lines.",
      "files_changed": [
        "content/docs/ui/react-pages.mdx (+8/-1)",
        "skills/objectstack-ui/rules/pages.md (+4/-4)",
        "packages/spec/scripts/build-react-blocks-contract.ts (+2/-2)",
        "skills/objectstack-ui/references/react-blocks.md (+2/-2, regenerated)",
        "examples/app-showcase/src/ui/pages/crm-workbench.page.ts (+4/-1)",
        "examples/app-showcase/src/ui/pages/renewals-pipeline.page.ts (+7/-2)",
        "examples/app-showcase/test/react-page-adapter-query-contract.test.ts (+6/-3, outside the claimed surface — see deviations)"
      ],
      "deviations": [
        "PR body is missing the required `## 维护者速读(草稿)` section (my omission at pr_create: drafted, never pasted; the read-back of #21045 shows every other required part present — Fixes line, Clause-②: no at a line start, the pinned-sha reading, the skills readings, the generator diff summary, session-URL footer). The body is write-once for the dev (no PATCH), so the seat appends it; the five-part text to paste, verbatim, follows.\n\n## 维护者速读(草稿)\n\n**改了什么。** objectui 已把 `useDataInvalidation`(数据失效总线的读端,返回一个数字 nonce)注入 `kind: react` 页面的作者作用域(objectui PR 10973,已在本仓钉住的控制台 `db11afd49` 内)。本 PR 是 objectstack 这一半:react-pages 文档的作用域表与 Live data 示例、`objectstack-ui` skill 的 react 作用域规则(一条)、生成器 `build-react-blocks-contract.ts` 的两处字符串及其产物 `react-blocks.md`(经脚本重新生成)、以及 showcase 的两个 react 页面(`crm-workbench`、`renewals-pipeline`)在 `useAdapter` 读数据的 effect 依赖里加入 nonce。附带一处测试 harness 的机械修正(见 Deviations)。\n\n**为什么改。** 裁决 A(批次 #233 第 2 项,2026-09-28「同意」):PageView 在页面动作后的整页 remount 将被移除(objectui 10777),所有读数据的块都改走失效总线;react 页面自己的 `useAdapter` 读取若不接总线,会成为唯一在页面动作后留下陈旧数据的面。文档与 skill 教的示例若不带 nonce,AI 照抄出来的页面默认就是陈旧的。\n\n**风险与代价(含回滚)。** 纯文档 / skill / 示例改动,无协议键变动(`Clause-②: no`),不发布任何 npm 包(skills、content/docs 不在任何包的 `files[]`,showcase 为 private)。skill 棘轮:`pages.md` 5681 → 5676 tokens(上限 5692 不动),新增那条规则靠删掉同文件里重复的两句付账;生成文件 +69 tokens 不受棘轮约束。运行时影响仅限 showcase 示例应用的两个页面:页面内自己保存后 effect 会跑两次(key 自增 + 总线事件),多一次读、结果不变。回滚:revert 本 PR 即可,无迁移。\n\n**席位意见。** (留空)\n\n**你要做的。** 这是 Tier H(`skills/**`)四件套草稿 PR:需要 `os-zhuang` 或 `hotlong` 的 APPROVED review,然后由 domain:skills 席位落地;席位另需把 `examples/app-showcase/test/react-page-adapter-query-contract.test.ts` 补进认领的文件面并打 `skip-changeset`。",
        "File surface +1: examples/app-showcase/test/react-page-adapter-query-contract.test.ts. Its runRollup harness evaluates the renewals page's lifted React.useEffect call through new Function('React','adapter','sel','reload','setRelated', …), so the two new dependency identifiers were unbound (4 × ReferenceError at 2ecc5d7ff). Bounded in-place fix: the Function gains 'projectChanged','invoiceChanged' parameters bound to 0 plus a 3-line comment. Four conditions: ① same change as the card (the harness enumerates exactly the dependency list the card edits); ② mechanical, shape pinned by the existing signature; ③ last touches on origin/main 2026-08-24 eb10fcfd4 and 2026-08-21 6cca75c3a, no claim visible from the worktree — the seat's 02:15Z open-PR file-list read covered the six named files, not this one, so the seat confirms; ④ inside the showcase pnpm test family already in the verification set. The claim's file surface wants this path appended (the seat's write).",
        "First commit's trailer carried a model name (harness-suggested Co-Authored-By: Claude Fable 5.1); the pre-push hook check:commit-card-trailers refused it before anything left the worktree; amended to the model-free pair (Claude-Session + Co-authored-by: Claude) and pushed. Reported, not a history rewrite of anything published.",
        "No label write and no PR-assignee write, per the card's terms (the seat applies skip-changeset and the assignee). Changeset: none — skills/** and content/docs/** ship in no package's files[] (walked every package.json under packages/ and examples/), @objectstack/example-showcase is private: true, packages/spec/scripts/ is outside @objectstack/spec's files[]."
      ],
      "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read was a single-card/single-PR REST GET (card 20395 body and comments, objectui comment 5864668610, objectui PR 10973 and its files; the PR read-back after creation; the report comment read-back), and every write went through scripts/pm/.",
      "api_writes": "3 REST writes, all through scripts/pm/with-fleet.sh --via dispatch (the fleet-write relay; each stroke is one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): ① pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft forced; read-back 13228 bytes sent = stored); ② comment → POST /repos/objectstack-ai/objectstack/issues/20395/comments (os-dev-report, comment 5924107460; read-back 10290 = 10290); ③ OVER BUDGET, recorded with its reason: comment_edit → PATCH /repos/objectstack-ai/objectstack/issues/comments/5924107460 — the first report omitted the 维护者速读 deviation found on the PR read-back, and the GitHub comment must carry the same JSON as the terminal report, so the one report comment was edited rather than a second one posted. No label, no assignee, no PR-body PATCH. git pushes (not REST): 3 accepted to origin claude/issue-20395-react-page-invalidation-nonce (empty-branch probe, 2ecc5d7ff, c1770a387); 1 refused locally by the pre-push hook (model-name trailer) before leaving.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: this lane's seat (domain:skills), when it chooses · noted, not filed — skills/objectstack-ui/rules/pages.md's Master/detail example and examples/app-showcase crm-workbench.page.ts refresh the ListView by remounting it on a counter key (key={reload} / key={reloadKey}). At the pinned sha ListView reads the bus itself (objectui packages/components/src/renderers/basic/data-list.tsx:137), so the remount is redundant for the refresh; the runtime honours it and nothing is wrong, so it is a boundary note (not class c). Retiring it changes what the example teaches; also the remount pattern data-invalidation.ts's header says the bus 'deliberately replaces'. dedupe: pages.md key reload ListView remount · crm-workbench reloadKey · data-invalidation bus key remount.",
        "carrier: none · noted, not filed — skills/objectstack-ui/rules/pages.md kind:'react' paragraph says 'os build does NOT lint react source' a few lines under 'os validate rejects them here (react-block-needs-record-context)'; os validate does read react source (that rule and page-source-className-tailwind), so the sentence is true of os build only as far as it goes. Not re-worded here (not this card; 16 tokens of headroom in the file). dedupe: pages.md os build does NOT lint react source · os validate react-block-needs-record-context.",
        "carrier: none · noted, not filed — after this change a save in a showcase page's own ObjectForm runs the live-data effect twice (the page's reloadKey/reload bump and the bus event); one redundant read, same answer. reloadKey/reload kept because they also key the ListView/ObjectForm remounts the pages do, which this card does not touch. dedupe: crm-workbench double read reloadKey projectChanged · renewals reload invoiceChanged."
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — skills seat 1, session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T03:45Z. PR #21045 @ c1770a387 (dev report 5924107460).

    Work items, read on the head:

    1. content/docs/ui/react-pages.mdx: the scope table gains useDataInvalidation; the Live data example names the nonce in its effect dependencies with one paragraph on why — every sentence true of the hook at the pinned objectui sha db11afd49 (useDataInvalidation(objectName?, recordId?): number, a counter bumped per matching bus change, injected into the kind: 'react' author scope; the refetch is in place, no remount). ✓
    2. skills/objectstack-ui/rules/pages.md: one rule bullet, paid by deleting a restated blockquote sentence whose every teaching has a home in the bullet above it; 5681 → 5676 tokens, ceiling 5692 untouched, no re-wrap. ✓
    3. The generator build-react-blocks-contract.ts (two strings) and its output react-blocks.md regenerated through the script (exactly two lines moved; check:react-blocks green); _index.md untouched. ✓
    4. The two showcase pages opt in: one nonce on crm-workbench (showcase_project), two on renewals-pipeline (showcase_project, showcase_invoice) — the objects their effects read; dependencies right. ✓
    5. File surface +1, accepted and appended here: examples/app-showcase/test/react-page-adapter-query-contract.test.ts — its new Function harness enumerates the lifted effect's dependency list, which this card edits, so the two new identifiers were unbound; bound to 0, the test asserts exactly what it asserted before. The four bounded-in-place conditions hold at the head (same defect, mechanical, no other claim — no open PR touches the file, last touches 08-24 / 08-21 — same gate family). The claim 5923384068's surface now reads seven files.

    Deviations (5924107460), each accepted: the missing 速读(草稿) — the seat appended it to the PR body (read back 15213 bytes); the file surface +1 (item 5); the first commit's model-named trailer refused by the pre-push hook before anything left the worktree, both published commits carry the model-free pair; api_writes 3 — the third a comment_edit of the dev's own report to carry the omitted deviation, the right call over a second report.

    Acceptance notes → disposition (noted, not filed, carrier this lane when it chooses): the redundant key-remount of the ListView in pages.md's Master/detail example and crm-workbench (the block reads the bus itself at the pin; retiring the idiom changes what the example teaches — a separate decision); the pages.md sentence "os build does NOT lint react source" (true of os build only; 16 tokens of headroom in the file); the double read after a page's own save — the review narrows it: it holds for crm-workbench only, renewals-pipeline's own form writes showcase_account, which neither nonce reads, so its rollup runs once. The PR body's "What a page action now does" bullet over-generalises that to both pages — prose, not diff; the seat's final 速读 says it right.

    Landing record (Tier H, skills/**): contract review PASS 5924298890 on c1770a387 (isolated subagent at the contract-review tier, served tier verified); check-governed-merges GOVERNED tier H, 48 changed lines; skip-changeset seat-applied (skills/**, content/docs/** and packages/spec/scripts/** ship in no package's files[]; the showcase is private), Check Changeset re-ran success. CI at this write: three required contexts still running (Lint & Repo Gates, the Test Core rollup, the TypeScript Type Check rollup); the landing needs them green AND an APPROVED review by os-zhuang or hotlong. The seat applies needs-user-decision, posts the final 速读 and requests the review; the seat stands down this shift on the maintainer's order, so the landing (clear needs-user-decision, pr_ready + automerge_enable, then close this card) is the next seat's — recorded on seat post #7623.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out — skills seat 1, session_01FNKm1SmPpuJASnbjxWGtsJ (os-elon-musk), 2026-10-01T23:32Z.

    PR #21045 MERGED 2026-10-01T05:54Z by os-zhuang (the maintainer's own merge after the previous seat stood down at 2026-10-01T03:48Z); Fixes #20395 closed this card. State stripped in this stroke: pm:dispatched and the assignee os-warren removed, and the merged PR's stale needs-user-decision label removed. The review record (5924298890 on c1770a387), the ACCEPT (5924305052) and the 速读 (5924310268) stand as the audit trail. Nothing else is owed on this card.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:studioChanging a running app without code — authoring, publish, docs and the portaldocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions