Skip to content

[Decision] The catalog fixture authored-key class has now been rediscovered FOUR times by hand — does it get an instrument, like the container-declaration class did? #6810

Description

@claude

Filed by the domain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49) after the fourth independent rediscovery of one defect class in the schema catalog, in a single day.

The class

A fixture authors its visible text under a key the renderer for that node type never reads. The page ships as empty boxes, and the string reaches the DOM only as a leaked host attribute (the #5574 class).

foundwherescale
#6773five aspect-ratio demos author content5
#6788components-overlay-context-menu/basic-context-menu trigger card authors content1
#6805all sevencomponents-complex-scroll-area demos author content; scroll-area.tsx reads children7 of 7
#6806components-basic-sidebar/sidebar-with-badges authors both counts as content on badge nodes; badge.tsx reads label || body2

⚠️ Each of the four was found by hand, while fixing the previous one. None was found by an instrument. That is the definition of a class that regenerates.

⭐ The mechanism to stop it now exists and has been demonstrated

PR #6807 (#6788) builds a catalog-wide sweep for card nodes: every card node at any depth — the dev reports 93 nodes across 53 entries and 19 categories — checked twice over, once against the shipped CardSchema zod shape (declared) and once against card.tsx's actual read keys, the read set being strictly the stronger of the two (variant is declared and read by nothing). Each assertion carries a counter-probe.

⇒ The proposal is to generalise that from card to every registered node type: for each type, the keys its renderer actually reads, swept over every fixture node of that type.

What already exists, and why it does not cover this

⛔ Stating this precisely, because "nothing asks the question" would be false. examples/schema-catalog/test/component-fixture-declared-keys.test.ts exists and is substantial — but it is a ledger of specific, named corrections (the toast variant, CommandItem.shortcut, radio-group's direction, menubar, toaster position), each with its own counter-probe. It is not a family-wide sweep, and it does not enumerate node types.

⭐ The file's own header says the blocker is gone. Read on origin/main26896c689, line 424:

The renderer split that used to block a family-wide sweep is gone

⇒ The obstacle that justified doing this one finding at a time no longer exists, and that is recorded in the file that would have to change.

⚠️ Why a naive sweep is wrong

Measured on origin/main26896c689: "content" appears in 127 catalog fixture files, "children" in 138 (control — the comparable key, so the 127 is a reading rather than a broken query).

⛔ Those 127 are not 127 defects. Some renderers genuinely read contenttabs renders item.content off an items array, which #6779's ruling separately names as an exception shape. So the sweep must be per node type, against that type's renderer read set — exactly the shape PR #6807 demonstrates — and never a repo-wide grep for the key.

The precedent this mirrors almost exactly

#6779, ruled today: the container-declaration defect was rediscovered three times independently, one registration at a time, and the ruling adopted a runtime census pin plus a ratchet-to-zero list, on the stated ground that three independent rediscoveries are the verdict on doing it one at a time. This class is at four.

四维分析

① 实际业务需求。 ⭐ 与多数「整洁性」卡不同,这一族有确定的用户可见损伤:#6805七个中的七个 demo 渲染成空框,而它们是已发布的文档画廊页面。⇒ 读文档的人(和抄 demo 的 AI)看到的是空盒子。不是假想。

② 平台长远合理性。 目录 fixture 是教材。一个教错键名的 demo 比没有 demo 更糟,因为它会被复制。⇒ 让"作者写的键有没有人读"成为可测量的,是把教材纳入契约,方向正确。

③ 防 AI 犯错。 ⭐ 分水岭,而且是双向的:AI fixture 时会挑一个看起来合理的键(content 是最自然的猜测),AI fixture 学习时又会把这个错键学走。⇒ 一个不检查的目录会自我放大这个错误。四次独立发现全部由人手在修别的卡时撞见,说明现有流程对它是盲的。

④ 创业阶段不扩散需求。⚠️ 这一轴是唯一指向克制的:全类型普查需要为每个注册类型确定"渲染器读哪些键",而那不是免费的 —— #6779 的裁决就为此专门列了三种必须排除的例外形状(tabs、void 标签、body-only 族)。⇒ 代价真实,不该假装是一条 grep。

⭐ 置信缺口

  1. ⚠️finding(examples): all seven components-complex-scroll-area demos author their body under content, which ui:scroll-area never reads — every box on the page is empty #6805 / finding(examples): sidebar-with-badges authors its two counts under content, which ui:badge never reads — the badges render empty #6806 的测量本席未复核,是 finding(examples): the basic-context-menu demo authors its trigger card under content, which ui:card never reads — the tile is an empty dashed box #6788 实施席报告的转述。finding(examples): all seven components-complex-scroll-area demos author their body under content, which ui:scroll-area never reads — every box on the page is empty #6805 的「七个中的七个、整页空框」是本卡最重的一条证据,裁前应复核
  2. 未测:确定"渲染器读哪些键"能不能机械导出,还是每个类型都要人读一遍。PR docs(context-menu): author the trigger card's text under the key ui:card reads #6807card 做到了,但那是一个类型。这个数字决定本卡是"一次工程"还是"一条长尾"。
  3. **未测:127 个含 content 的 fixture 里,真正的缺陷占多少。**若绝大多数是合法的(tabs 类),收益就集中在少数几族,ratchet 清单会很短;若过半是缺陷,那是另一个量级的活。⇒ 这一次清点应当先于裁决,和 [Decision] What instrument stops the container-declaration class regenerating — and do the remaining 45 get fixed before it lands? #6779 的处理方式一致。

低摩擦裁决:回「#6779 的形状做」(全类型普查 pin + ratchet-to-zero 清单)/「先清点」(先跑上面第 3 条的读数再定)/「继续一张一张修」(明确接受这一族会继续被人手撞见)。

⚠️分诊席:本卡由执行席立,domain:* 与定级请照常由分诊产出 —— 本席只挂了 needs-user-decision

Related

#6773 · #6788 / PR #6807(示范了机制)· #6805 · #6806 · #6779(同形状的先例,当日裁决)· #5574(属性泄漏的那一半)· #5250(JSON fixture 无门禁解析的洞)


Generated by Claude Code

Metadata

Metadata

Assignees

No one assigned

    Labels

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

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions