Skip to content

[Decision] What instrument stops the container-declaration class regenerating — and do the remaining 45 get fixed before it lands? #6779

Description

@os-sales

Filed by the domain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49) from the census in #6764 / PR #6774. ⛔ This card does not repeat that measurement — #6764 is the authoritative record.

The same defect has now been found three times independently, one registration at a time: #3900 (page-header, closed), #6740 (flex, PR #6762), #6764 (8 more). Nothing in the repo asks the question, so the class regenerates.

The denominator, which is what this ruling was waiting for

Of 131 bare authoring tags (292 registry keys counting the namespaced twins):

count
render schema.children 58
…of those, declare isContainer 5
…of those, do NOT 53

The 5 that declare are exactly flex / grid / card / container / stack — the control set — so the zero elsewhere is a reading, not a broken scan. PR #6774 fixes the 8 the card named and leaves 45.

Only 1 of the 53 is public. react-page.tsx iterates getPublicConfigs(), not the whole registry, so for 52 of them declaring isContainer provably removes no injected identifier. The one exception is button, left alone deliberately: declaring it would delete Button from every kind:'react' page scope, and it reads children as a label fallback, not layout containment.

⭐ Three exception shapes a naive predicate sweeps in wrongly: tabs (renders item.content off an items array); the void tags img / hr / br (same 37-tag loop factory as 34 that do render children); and badge / alert plus 8 sidebar- keys that read schema.body only — a key validateTree's containment branch never inspects.

Why a source-side gate was NOT added — four measured reasons

  1. The tree's own reader, scripts/component-registrations.mjs, refuses computed keys by design, and 41 of the 53 register from a loop variable — it cannot even name them.
  2. File granularity mis-reads layout/page.tsx as compliant: it holds two isContainer tokens, both in a manifest-builder helper, while all five of its registrations lack the flag.
  3. Which registration is live is a whole-program import-order fact, with two recorded casualties in this tree (ui:kbd, ui:table, finding(components): table 被注册两次,data-display 的 SimpleTableRenderer 被 complex/table.tsx 完全遮蔽 —— 而它是唯一读 bind 的表格渲染器 #5125).
  4. "children or body" is not a distinction a source predicate keeps — that spelling over-reports by 10.

⭐ What is decidable is the RUNTIME form that produced these numbers — the same mechanism #6740's pin already uses. The difference: its covered set is a literal 4-element array, which is precisely why the class regenerated past it.

Options

A Land the runtime census as a UNIVERSAL pin now and fix all 53 in one PR.
B Land the runtime pin with an explicit LEDGER of currently-undeclared tags: a new violation is red; the existing 45 are listed, dated and visible.
C No gate; keep enumerative per-incident pins — the status quo that produced three rediscoveries.
D A registration-time assertion inside Registry.register. ⛔ NOT BUILDABLE, and that is a measurement: the registry receives a renderer function, and whether it reads schema.children is only knowable by executing it; a source-side reader attached there inherits reasons 1-4 unchanged.

四维分析

① 实际业务需求 —— 实测,非投机。 53 个 registration 在专门用来接收 AI 起草页面的那一层上发出假的 not-a-container#6740 自己的测量:三个已发布的 app-showcase 页面共 232 条诊断,其中 32 条只是 flex 一个标签的这条假警告。#6764 的普查再补一刀:components-layout-semantic 全部 9 个已发布 fixture 都 author children —— 仓库自己的演示页就是这条警告的受害者。

② 平台长远合理性。 C 已被卡本身否决(三次重复发现就是它的判决书)。B 是本仓对同类情形已有的形状i18n-call-site-key-baseline.jsonskills-path-baseline.json)。A 是最健全的终态,但今天做不诚实 —— button 需要先有它自己的 public-tier 裁决。

③ 防 AI 写错元数据 —— 这一轴最强,且指向同一处。一条会说谎的警告比缺一条警告更糟,因为它教会 AI 作者去忽略真的 not-a-container 报告 —— 这正是 #3900 自己的推理。所以既要现在关掉这个类,也要最终修掉而不是永久豁免。

④ 创业阶段不扩散需求。 B 的成本是一个测试文件加一张清单,今天就能止住再生;A 是 53 个 registration 的大扫除。

本席意见与实施席一致:B,并带两个从普查里直接长出来的条件 —— button 排除在清单之外、单独裁清单声明为「ratchet-to-zero」而不是豁免名单

⛔ 但这三条都改变仓库用哪种仪器去约束一个公开面,属于工具/契约形状决定,落在人工地板上 —— 本席记录,不代裁。

Related

#6764 (the census) · PR #6774 · #6740 / PR #6762 (flex, instance two) · #3900 (page-header, instance one, closed) · #5125 (the import-order casualties) · #6771 (the body key the tier rejects) · #6773 (the aspect-ratio demos)

Metadata

Metadata

Assignees

Labels

domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatchedpriority:p1

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions