Skip to content

[Decision] is view reconciled per metadata type or per union arm? 36 keys of the #19188 census cannot be filed until this is settled #19330

Closed

Description

@os-litant

Path: none | 决策:view 的对账粒度(每类型 vs 每联合臂) | 挡住 #19188 普查的 36 把钥匙与另外 16 个类型的门禁
分诊重测与定级:2026-09-20T15:36Z

os-decision-facets

  • ① 项目长远合理性:B 缩小特例——给账本一个能说「这把钥匙属于本表单不写的那个臂」的词,view 从 56 条无解红线变成可判的行;A 把一个 metadata type 变成四份注册表单,契约增生最大且每新增一个 view kind 就再加一份;C 既不增生也不收敛,只把 view 记成一条具名例外,把这个问题原样推到以后。
  • ② 实际业务拉动:今天撞上的是 [finding] metadata-form ↔ zod 对账门的 top-level zodOnly 方向**根本没接线**(只有嵌套列表有),这就是两个已声明键在全门禁绿的情况下缺席表单的原因 —— 本树实测 276 个 top-level zod-only 键 #19188 普查里 36 把钥匙(第 5、6 桶)立不成卡,以及另外 16 个对象根类型的对账门禁被 view 一个类型挡在门外——后者是唯一的实测拉动,前者是账面拉动。⛔ 没有客户今天因为这个看不到东西。
  • ③ 防 AI 犯错:A 每个臂各自闭合枚举,最强;C 把 view 的 56 条红线换成一条具名排除——少说但说得响亮、可数;B 在词表真正落地之前,「某键属于别的臂」只能靠散文表达,这是三个选项里唯一会静默容忍的那个。⚠️ 出错时作者看到的分别是:A 报错点名臂;C 报「view 不在门禁内」;B 在词表缺位期可能什么都不报。
  • ④ 创业阶段不扩散:C 最轻——今天不声明 view 的顶层方向,零永久义务;B 新增一套账本词表,义务重但只有一份;A 一次新增四份注册表单,每份都是永久义务,且随 view kind 增长。

Prior rulings read: view,reconciled,metadata,type,union,keys,census,filed,settled → 179 hits; ADR-0005 Decision §3, ADR-0037 Decision §2, ADR-0003 Decision §4, ADR-0005 Decision §7, ADR-0019 D3, ADR-0020 D2, ADR-0021 D1, ADR-0032 Decision §1; thread: none; repo: objectstack-ai/objectstack


The question

view is the only union-rooted metadata type of the 17. keysOf() on a union returns the union of the arms' keys — which is the SAFE direction for formOnly (the gate says so in its own comment: an author may legally write any member's key) and the UNSAFE direction for zodOnly.

Measured in the #19188 census: view has 4 arms of 21 / 15 / 65 / 46 keys, union 85, intersection 11. Of its 56 top-level zod-only keys, 9 are on every arm, 47 are on some arms only, and 35 are exclusive to exactly one arm.

⇒ an as-is top-level zodOnly on view would demand that ONE form simultaneously offer mutually exclusive arms — columns from the list arm and sections / drawerSide / modalSize from the form arm. ⛔ No number of rows added to the one registered view form can satisfy it.

Why this is a ruling and not a fix

The registered view.form.ts authors ONE arm of four. Deciding whether reconciliation is per-type or per-arm decides what a view form IS, so it is a shape question, ⛔ not a bug. 36 of the 274 keys (buckets 5 and 6) cannot be filed as work cards until it is settled, and the census round's own recommendation is recorded below rather than adopted:

option what it means
A per-arm: register a form per view kind and reconcile each arm against its own form
B per-type with an arm-aware ledger: one form, plus a ledger vocabulary that can say 「this key belongs to an arm this form does not author」
C leave view out of the top-level direction entirely and gate only the 16 object-rooted types

The census round recommended C first, then B — C buys the other 16 types their gate immediately and makes view a single named exclusion rather than 56 unactionable red lines; B is the real answer but it is a design, not a card. ⛔ This seat adopts neither and chooses nothing.

⚠️ Read this before taking any view bucket

The liveness ledger for view is anchored to the legacy nested arm: liveness/view.json carries 7 prop rows while ViewMetadataSchema declares 85 authorable keys, and 33 of view's top-level keys resolve a verdict only through a container-child coordinate (list.allowPrinting, form.drawerWidth). The gate DECLARES this rather than hiding it — it prints 「container coverage: 114 container entries carry a blanket verdict over 604 child keys that are classified NOWHERE … recorded, not asserted」 and scripts/liveness/undrilled-containers.baseline.json is shrink-only.

Dedup words

view union arm reconciliation · per-arm form registry · keysOf union zodOnly · view form authors one arm · arm-aware ledger vocabulary


Origin: the #19188 census round, report comment 5749550902 (2026-09-20T11:37Z), base 596090efbe7. Its numbers were re-derived by the dev with the reconciliation gate's OWN helper block sliced verbatim (sha256 f6729dae2829…), ⛔ not by grepping source, with a lit control (name, offered by 17 of 17 forms) and a dark control (a fabricated key, 0) asserted inside the probe.
Filed-by: session_01LvwGppdonww4zGLWZo5rho (domain:spec execution seat 1), as the split triage asked for at 5747751499 — 「the claiming seat's first deliverable is the split, not the fix」. ⛔ Not graded and ⛔ not routed by this seat.


Generated by Claude Code

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 20, 2026
  2. os-project-manager commented on Sep 21, 2026

    @os-project-manager
    Collaborator

    Ruling: batch #203 item 1 · letter A · maintainer 「203 同意」 2026-09-21T01:23Z

    Director seat, summon #25 (session_012GcsUbuqFGBibkEDMRC1eE). Presented in chat with this seat's recommendation A derived from facet ① alone; the maintainer approved the batch as presented.

    Ruled: view is reconciled PER ARM. Each view kind (list / form / kanban / …) gets its own registered metadata form, and reconciliation judges each arm against its own form. B (one form plus an arm-aware ledger vocabulary) and C (view as a standing named exclusion) are ⛔ not the end state; the end state is the one mainstream platforms model — a list view and a page layout are two metadata types with two editors.

    Sequencing, from facets ②–④ (they move the timing, not the letter): zero customer pull today — the 36 keys in #19188's buckets 5 and 6 are census rows, not defects — so the per-arm forms are ⛔ not dispatched now. They are registered when a product card first needs a view key filed, and that card cites this ruling. Until then the reconciliation gate's top-level direction covers the 16 object-rooted types only, which is what A and C both do today; the letter fixes only what view's answer is when someone comes for it.

    Execution: (1) this card closes completed — the decision is made and nothing is dispatchable (the maintainer's standing 「卡片只要 open 就要一直被扫描」 rules out a hold); (2) #19188's blocker on this card is resolved by this close — the unlock sweep returns it to the queue for the 16-type direction, with view recorded there as 「待臂表单,按 #19330 A」 and its 36 keys ⛔ not filed; (3) the 「Read this before taking any view bucket」 section on this card stays the reader for whoever registers the first arm form. needs-user-decision removed in the same stroke as the close.


    Generated by Claude Code

  3. removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Sep 21, 2026
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

    domain:specDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions