Ruled: 5902378057 · letter A + E on #20542 — stage ① merged into stage ②: one domain:cli PR builds the channel (one constant service key exported by @objectstack/metadata-protocol, registered by os serve, read per publish) together with the save-time refusal; lane → domain:cli; dispatch pointer 5902497015 (ruling 5881821895 · letter A, staged ①②③, stands; stage ③ follows ②) · 2026-09-30T01:52Z
Filing gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (5727134555). This is triage's standing request 5857165909 on the seat post. Family page-requires, seat verdict ENFORCE.
reach: the declared authoring door. packages/spec parses this key and publishes it in the reference docs. The liveness ledger row cited below records it as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).
- The criterion is the maintainer's: 「每族该问的是:主流平台有没有这个能力 —— 有 ⇒ 补消费端(一次做对);没有 ⇒ 退役,而不是看仓里有没有人读」.
- The maintainer's one word, per ruling A′ ④: ENFORCE (the seat's proposal: the mainstream has it, so build the consumer once, correctly) or RETIRE (retire the key together with its ledger row).
Census by the domain:spec execution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstack a9fb83ef, re-checked against 4d7e740d, where no ledger file or cited surface moved; objectui 6fa5f64a1 (pin f8a9d0fb); cloud 96eb092. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. This family's rank is 13 of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287–#20289, #20294, #20295 and #20299–#20301; the ledger fix is #20296.
Capability: Dependency check: a page that references a component namespace from a plugin that is not present is refused, not broken at render
| key |
ledger status |
ledger row |
what the ledger cites |
page.requires |
planned |
packages/spec/liveness/page.json:9 |
note: Plugin namespaces the JSX source references (ADR-0080). Inferred at compile time; save/load enforcement of plugin presence is deferred (M3b) — declared, not enforced yet. |
Mainstream evidence:
- Salesforce metadata deploy validation: a Lightning page that references a missing component fails deployment.
- Power Apps solution import runs a dependency check, and missing dependencies block the import.
Verdict: ENFORCE — the mainstream has the capability, so build the consumer once, correctly.
Reader that must exist / disposition: objectstack packages/metadata-protocol (save door) and runtime load: compare page.requires against the loaded plugin namespaces (ADR-0080 M3b). Today 0 reads (the only requires reads are stack-level config.requires, e.g. runtime/src/standalone-stack.ts:831).
User-visible risk (2): A page saved against a missing plugin fails only at render time, for the end user.
Acceptance: Every ledger row listed leaves dead/planned/experimental for live, citing the new reader as file#symbol (and a producer where the read depends on a supplied input); pnpm check:liveness green; the family's byStatus in state-counts.md regenerated.
Lane: domain:spec parent + metadata-protocol sub-issue (objectstack)
File surface: packages/spec/src/ui/page.zod.ts:903 · packages/metadata-protocol/src/* (save door) · packages/spec/liveness/page.json
Dedupe: page\.requires \| requires.{0,40}(plugin presence\|M3b) \| ADR-0080 → 5 open hits. None carries a key of this family:
四轴:
- 实际业务需求: 安装包或页面依赖缺失时,在保存或部署阶段拒绝,是 Salesforce 与 Power Apps 的标准行为。
- 项目长远合理性: 依赖声明由编译期推断、在保存期校验,形成闭环,是 ADR-0080 已规划的 M3b。
- 防 AI 写错: AI 生成的 JSX 页面引用未安装的插件时,保存即报错,不会在用户那里白屏。
- 创业阶段不扩散: 单键、单个校验点。
Ruled: 5902378057 · letter A + E on #20542 — stage ① merged into stage ②: one
domain:cliPR builds the channel (one constant service key exported by@objectstack/metadata-protocol, registered byos serve, read per publish) together with the save-time refusal; lane →domain:cli; dispatch pointer 5902497015 (ruling 5881821895 · letter A, staged ①②③, stands; stage ③ follows ②) · 2026-09-30T01:52ZFiling gate: ① a declared≠enforced family, filed as one sweep card per family under ruling A′ item ④ on #18900 (
5727134555). This is triage's standing request5857165909on the seat post. Familypage-requires, seat verdict ENFORCE.reach:the declared authoring door.packages/specparses this key and publishes it in the reference docs. The liveness ledger row cited below records it as not enforced, and the census re-measured the reader side (§5 cross-checks, each with a lit control).Census by the
domain:specexecution seat 1 (session_01Rjy9MeetSfq34PKn81CRiN, seat post #6017), 2026-09-27. Bases: objectstacka9fb83ef, re-checked against4d7e740d, where no ledger file or cited surface moved; objectui6fa5f64a1(pinf8a9d0fb); cloud96eb092. ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. This family's rank is13of 16. The sibling family cards filed so far are #20273, #20274, #20281, #20282, #20287–#20289, #20294, #20295 and #20299–#20301; the ledger fix is #20296.Capability: Dependency check: a page that references a component namespace from a plugin that is not present is refused, not broken at render
page.requirespackages/spec/liveness/page.json:9sourcereferences (ADR-0080). Inferred at compile time; save/load enforcement of plugin presence is deferred (M3b) — declared, not enforced yet.Mainstream evidence:
Verdict: ENFORCE — the mainstream has the capability, so build the consumer once, correctly.
Reader that must exist / disposition: objectstack packages/metadata-protocol (save door) and runtime load: compare
page.requiresagainst the loaded plugin namespaces (ADR-0080 M3b). Today 0 reads (the onlyrequiresreads are stack-levelconfig.requires, e.g. runtime/src/standalone-stack.ts:831).User-visible risk (2): A page saved against a missing plugin fails only at render time, for the end user.
Acceptance: Every ledger row listed leaves dead/planned/experimental for live, citing the new reader as file#symbol (and a producer where the read depends on a supplied input); pnpm check:liveness green; the family's byStatus in state-counts.md regenerated.
Lane: domain:spec parent + metadata-protocol sub-issue (objectstack)
File surface: packages/spec/src/ui/page.zod.ts:903 · packages/metadata-protocol/src/* (save door) · packages/spec/liveness/page.json
Dedupe:
page\.requires \| requires.{0,40}(plugin presence\|M3b) \| ADR-0080→ 5 open hits. None carries a key of this family:zodOnly方向**根本没接线**(只有嵌套列表有),这就是两个已声明键在全门禁绿的情况下缺席表单的原因 —— 本树实测 276 个 top-level zod-only 键 #19188 — census parent of #19188 split: 39 top-level zod-only keys are structured controls needing a designed widget, not a row #19332/#19188 split: 145 top-level zod-only keys need a RECORDED REASON, never a form row — and none can be recorded until the ledger learns a root path #19333 (form-offer axis)四轴: