Repository navigation
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
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: studio · 自定义页面:块组合、页面变量与页面级动作、三档源码 |
studio-authoring.custom-page-source-tiers(a react page's own reads after a page action) | P1Triage: 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#10887has 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 stayspm:blocked.Unlock criterion. objectstack consumes objectui through the
.objectui-shapin, not through npm. When objectui#10887 closes, this card returns to the queue only once the pin onmaincontains that fix (a RESTcompareancestry 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.- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalpriority:p2Medium: important, M3Medium: important, M3
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsCross-repo note from the objectui
domain:uiseat #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, ruling5864668610letter A) injectsuseDataInvalidationinto thekind: 'react'author scope. It passed an at-tier Clause-② review (5870012015on that PR) and is in objectui's merge queue. This card's own note still applies: arming the docs waits for an@object-ui/componentsrelease that carries the hook.One surface this card's body does not name. The generator
packages/spec/scripts/build-react-blocks-contract.tswrites the## Injected scopeline ofskills/objectstack-ui/references/react-blocks.mdasReact · useAdapter · data · variables · page. Its note teachesLive data: const adapter = useAdapter(); …with no nonce. Both were measured on objectstackorigin/mainby 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/lintholds no injected-identifier list naminguseAdapter, 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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsUnlock — skills seat 1,
session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T02:03Z.Blocked-by: objectstack-ai/objectui#10887(the canonical line in 5870067887) is satisfied: objectui#10887 readsclosed/completedon 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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClaim: PM loop round 11
Session:session_01KTZmMfzVzjNvyaLyQ8mHvg
Account:os-warren(the seat's linked user asGET /useranswers 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.tsandexamples/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 scopeline and its Live-data note, per 5870067887) withskills/objectstack-ui/references/react-blocks.mdregenerated by that script, plusskills/objectstack-ui/references/_index.mdonly if the generator moves it (os-regen: regenerate, never hand-edit). ⛔ Nothing else underpackages/spec, ⛔ nopackages/lint, ⛔ no objectui file. Stop on breach; explain in the report.
Container & model:M,mode:subagent,model: fable(dispatch-gates --tier at2f2fa11d7: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 byos-zhuangorhotlong; 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 — objectstackmain's.objectui-shadb11afd49is 78 commits ahead of PR objectui#10973's mergedeca847a8(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-②: yesthere); 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.mdxed54768 (09-29),pages.mdf10d802 (09-30), the two showcase pages e0af1a8 (09-08),build-react-blocks-contract.ts4e0f72e (09-27),react-blocks.md569d4d2 (09-28). None namesuseDataInvalidation(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
- Unlock verified two ways at 2026-10-01T02:15Z: objectui#10887 reads
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsos-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
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsACCEPT — skills seat 1,
session_01KTZmMfzVzjNvyaLyQ8mHvg, 2026-10-01T03:45Z. PR #21045 @c1770a387(dev report 5924107460).Work items, read on the head:
content/docs/ui/react-pages.mdx: the scope table gainsuseDataInvalidation; 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 shadb11afd49(useDataInvalidation(objectName?, recordId?): number, a counter bumped per matching bus change, injected into thekind: 'react'author scope; the refetch is in place, no remount). ✓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. ✓- The generator
build-react-blocks-contract.ts(two strings) and its outputreact-blocks.mdregenerated through the script (exactly two lines moved;check:react-blocksgreen);_index.mduntouched. ✓ - The two showcase pages opt in: one nonce on
crm-workbench(showcase_project), two onrenewals-pipeline(showcase_project,showcase_invoice) — the objects their effects read; dependencies right. ✓ - File surface +1, accepted and appended here:
examples/app-showcase/test/react-page-adapter-query-contract.test.ts— itsnew Functionharness enumerates the lifted effect's dependency list, which this card edits, so the two new identifiers were unbound; bound to0, 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_writes3 — the third acomment_editof 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 inpages.md's Master/detail example andcrm-workbench(the block reads the bus itself at the pin; retiring the idiom changes what the example teaches — a separate decision); thepages.mdsentence "os builddoes NOT lint react source" (true ofos buildonly; 16 tokens of headroom in the file); the double read after a page's own save — the review narrows it: it holds forcrm-workbenchonly,renewals-pipeline's own form writesshowcase_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 onc1770a387(isolated subagent at the contract-review tier, served tier verified);check-governed-mergesGOVERNED tier H, 48 changed lines;skip-changesetseat-applied (skills/**,content/docs/**andpackages/spec/scripts/**ship in no package'sfiles[]; the showcase isprivate),Check Changesetre-ransuccess. CI at this write: three required contexts still running (Lint & Repo Gates, theTest Corerollup, theTypeScript Type Checkrollup); the landing needs them green AND an APPROVED review byos-zhuangorhotlong. The seat appliesneeds-user-decision, posts the final 速读 and requests the review; the seat stands down this shift on the maintainer's order, so the landing (clearneeds-user-decision,pr_ready+automerge_enable, then close this card) is the next seat's — recorded on seat post #7623.
Generated by Claude Code
objectstack-fleet commented
on Oct 1, 2026 ContributorAuthorMore actionsClose-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 #20395closed this card. State stripped in this stroke:pm:dispatchedand the assigneeos-warrenremoved, and the merged PR's staleneeds-user-decisionlabel removed. The review record (5924298890 onc1770a387), the ACCEPT (5924305052) and the 速读 (5924310268) stand as the audit trail. Nothing else is owed on this card.
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. Akind: 'react'page's author scope injectsuseAdapterbut notuseDataInvalidation, so a react page's ownuseAdapterreads in effects re-ran only through the remount. Ruling A: objectui injectsuseDataInvalidationinto 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
5863927075on objectui#10887): 2 of the 3 shipped showcase react pages read data throughuseAdapterin effects keyed on[adapter]—examples/app-showcase/src/ui/pages/crm-workbench.page.tsandrenewals-pipeline.page.ts;content/docs/ui/react-pages.mdx("Live data",:166-177) andskills/objectstack-ui/rules/pages.mdteach the same pattern.content/docs/ui/react-pages.mdx: the scope table gainsuseDataInvalidation; 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).skills/objectstack-ui/rules/pages.md: the same rule line (governed path,skills/**, Tier H — four-piece and the maintainer's APPROVED).Blocked on the objectui half landing and publishing (the scope must expose the hook before a showcase page can read it).
Clause-②: nohere (docs, skill prose and example pages; no protocol key moves).Related