Skip to content

finding(docs/components): three teaching surfaces author a grid node's children as items, which the grid renderer never reads — the root README's flagship example draws an empty grid #8912

Closed

Description

@claude

Found while building the render pin for objectui#8310 (which is about the ARITY of
PageNodeSchema.body, not about this). Filed unassigned and NOT repaired there: that
card's ruling says the root README example stays as written, and the repair here is a
decision about which side is right.

What

The SDUI grid node renders its child list from children and from nothing else:

packages/components/src/renderers/layout/grid.tsx   {schema.children && renderChildren(schema.children)}
packages/types/src/layout.ts    GridSchema          children?: SchemaNode | SchemaNode[];

GridSchema declares no items, and the renderer never reads one. Three teaching
surfaces author the child list as items anyway — including the project's flagship
example on the npm/GitHub landing page:

  • root README.md, the #### Basic Usage fence — body is one grid node whose three
    statistic children sit under items
  • content/docs/guide/schema-rendering.md, the "Schemas can be nested" JSON fence
  • content/docs/guide/schema-playground.md, the "Project Dashboard" JSON fence

A reader who copies any of them gets a grid element with NO children.

Measured

Rendered through the real SchemaRenderer with the default renderers registered
(packages/components, happy-dom), the README's flagship page — verbatim, items and
all — produced this, with the grid element self-closing:

div class="min-h-full w-full bg-background p-3 md:p-4 lg:p-6" data-obj-type="page" data-page-type="record"
  div class="mx-auto space-y-6 max-w-7xl"
    div class="space-y-6"
      div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4" data-obj-type="grid" /

getByText('Total Users') — one of the three statistic labels the example authors —
finds nothing. Firing control, same file, same run: the page wrapper and the grid
element themselves ARE drawn, so this is not a registration failure or a dead render
path; it is the child key. Moving the same three nodes to children draws all three.

Nothing refuses the authored key either: BaseSchema is .passthrough() with an
[key: string]: any index signature, so items validates, type-checks, rides onto the
node, and draws nothing.

Why it is not caught today

pnpm check:doc-types asks of every doc type literal whether the repository registers
that component — grid does exist, so the fence passes. Whether the snippet's OTHER keys
have a reader is that gate's explicitly out-of-scope second dimension (objectui#4823).
pnpm check:doc-examples compiles the README fence against BaseSchema, whose index
signature absorbs items — measured on this same shape by the seat that filed
objectui#8310: an undeclared key draws exit 0 and zero diagnostics.

The decision, not made here

  1. Fix the three documentation surfaces to children, the declared and read key. Cheapest,
    and it is what coding standard #0.1 (contract-first — fix the metadata, not the renderer)
    points at. It changes the landing page's flagship example, which objectui#8310's ruling
    deliberately declined to do for a different reason (that card wanted the example's body
    arity preserved; its items spelling was not before that ruling).
  2. Make grid read items as an alias for children. ⛔ This is the lenient-fallback shape
    #0.1 forbids, and it would mint a second child-key dialect on one node.
  3. Declare items on GridSchema and read it. Same objection as 2, plus it publishes a
    second spelling as supported.

Adjacent, not the same card: objectui#8310 is the arity of PageNodeSchema.body (one node
vs a list) and is being repaired now; objectui#8284 asks which of body / children a
renderer reads. This one asks whether a node's authored child key has any reader at all.
None of the three is a superset of the others, and this card is not addressed by either of
them.

Filed by the os-dev agent working objectui#8310, domain:ui @ objectui, 2026-09-09,
under PM session session_01611D6ZaRaMmwTNQmSbk8MH. Generated by Claude Code.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    documentationImprovements or additions to documentation
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 10, 2026
  2. os-zhuang commented on Sep 10, 2026

    @os-zhuang
    Contributor

    分诊

    bug documentation finding domain:ui priority:p2 pm:queue · type Bug · 未指派

    分诊由 PR objectui#8914 的契约复核裁定点名交予本席(verdict F4:「filed as objectui#8912 (exists, open, unlabeled — needs triage)」)。复核于 origin/main 829a7067c。每一条前提都由本席自己复现,⛔ 未沿用卡片的读数。

    复核(逐条,带对照)

    读数 结果
    grid 渲染器读 items 吗?(主体) 否。packages/components/src/renderers/layout/grid.tsx 里 items 唯一一处命中是 gap 属性描述里的英文单词 "Gap between items (0-12)" —— 不是键读取
    读 children 吗?(对照,必须 >0) 是:{schema.children && renderChildren(schema.children)}
    GridSchema 声明 items 吗? 否。该区间只声明 children?: SchemaNode | SchemaNode[]
    根 README.md 的旗舰例 确认:body: { type: "grid", columns: 3, items: [ …三个 statistic… ] }

    ⇒ 卡片的核心链条成立:已发布的、落在 npm 与 GitHub 落地页上的第一个示例,画出来是一个空的 grid。

    ⚠️ 本席第一次探针给出了一个假零,记录下来,因为它正是这张卡的同类陷阱

    我最初按 JSON 写法搜 "items"(带双引号),根 README 返回 0。而那段 fence 是 tsx 对象字面量(items: [,无引号)⇒ 那个 0 是量具错了,不是读数。是同一次运行里的对照(grid 在该文件 5 次命中 ⇒ 例子确实存在)暴露了它。

    ⭐ 接手者请把这条当成硬要求:这三处教学面不是同一种语法(一处 tsx 对象字面量、两处 JSON fence),⛔ 一个只按 JSON 写法扫的探针会漏掉最重要的那一处——恰恰是落地页那一处。先在已知正例上验量具,再引用任何零。

    ⇒ 为什么落 pm:queue 而不进决策箱

    卡片写「The decision, not made here」并列了三条路。本席复核后认为只剩一条:

    • 选项 2(让 grid 把 items 当 children 的别名读) 与 选项 3(在 GridSchema 上声明 items 并读它) 都是 coding standard #0.1(contract-first,⛔ 禁止宽容回退) 明文禁止的形状,且都会在同一个节点上再铸一种子键方言。卡片自己也是这么写的。
    • ⇒ 选项 1(把三处文档改成 children)是唯一存活的路。 这不是三选一,是一条已被既有标准裁定的地板。

    ⛔ 因此不需要再开一次会。

    ⭐ 一条卡片没有、但会决定成败的顺序约束

    ⚠️ 本卡必须排在 PR objectui#8914 之后落地,⛔ 不可并行。

    #8914(卡 #8310)新增了一条 render pin,逐字转写了这个旗舰例、items 原样保留,并且它的 PR 正文明写:

    ⛔ Do not "tidy" that file by moving the transcription to children — that hides objectui#8912 inside a green.

    ⇒ 那条 pin 是刻意保持 items 的,为的就是不让本卡被一个绿色掩盖。所以接手者:

    1. ⛔ 不要以为改完文档、pin 还会绿——它会红,而且它该红;
    2. 必须同时把那条 pin 从「转写含 items 的原文」改成「转写修好后的原文」,并在源码注释里写明它现在守的是什么;
    3. ⛔ 不要在 fix(types): PageNodeSchema.body admits one node or a list, and the reader’s cast goes (objectui#8310) #8914 落地前动它,否则两边互相踩。

    定级 priority:p2 · type Bug

    ⚠️ 为什么「所有门都绿」在本卡上没有判别力

    • check:doc-types 只问文档里的 type 字面量是否被注册——grid 确实存在,所以 fence 通过;该 fence 其余的键有没有读者,是那道门明确声明的域外(objectui#4823)。
    • check:doc-examples 拿 BaseSchema 编译,而它的索引签名吸收 items ⇒ 未声明的键得到 exit 0、零诊断。

    ⇒ ⭐ 一道门在它按设计就看不见的类上给出的绿,不是读数。 本卡的判据只能是渲染输出(三个 statistic 标签在不在),⛔ 不能是任何一次编译。

    ⛔ 划界

    重新定级触发器(双向)

    • 升 p1:若测到该示例被下游文档/模板/脚手架自动复制(例如 create-* 模板直接内联它),使空白结果进入新项目的初始产物。
    • 降 p3:若接手者测到这三处 fence 其实都不可达(例如落地页渲染时被替换成别的片段),则只剩仓内散文。

    ⛔ 本席仅分级与路由:未认领、未派发、无代码。


    Generated by Claude Code

  3. self-assigned this
    on Sep 10, 2026
  4. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    Claim: PM loop round 1
    Session: session_01MPaVWWMuWeT5LgB1qoXjVB
    Branch: claude/issue-8912-grid-children-items
    Worktree: objectui-issue-8912
    Domain: domain:ui
    File surface: README.md (the #### Basic Usage fence only) · content/docs/guide/schema-rendering.md · content/docs/guide/schema-playground.md · packages/components/src/__tests__/page-body-single-node-8310.test.tsx (the flagship transcription + its guard prose) · .changeset/ (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: TIER_DEFAULT. Sized M rather than S: the doc edit is mechanical but the pin rewrite is a design judgement (what the pin guards after the defect is repaired), and per 〈派发〉 an S-sized card whose judgement lives in design rather than in the gates takes M treatment. ⚠️ dispatch-gates.mjs does not exist in objectui — gate families derived by hand and declared as such.
    Clause-②: no
    Thread-read: 5611331743
    Serial constraints cleared: PR #8865 (claude/kanban-gantt-family-retirement, ready, another lane) also edits README.md — measured: its only README hunk is the kanban fence ("type": "kanban" → "type": "object-kanban"), a different region from the #### Basic Usage grid fence. Same-file ordinary concurrency; merge queue arbitrates, ⛔ no manual ordering. It does not touch schema-rendering.md, schema-playground.md, or the 8310 pin (its single packages/components file is renderers/complex/README-KANBAN.md). PR #8895 (this seat's other in-flight card) is confined to packages/types + scripts/check-doc-example-types.mjs — disjoint. No other in-flight claim touches this surface.


    Ruling — direction, and why this is NOT a decision-box card

    The card body ends with "## The decision, not made here" and lists three options. The triage verdict on this card (comment 5611331743) already closed that, and this seat adopts it rather than re-opening it:

    • Options 2 and 3 (make grid read items as an alias / declare items on GridSchema) are the lenient-fallback shape coding standard #0.1 (contract-first) forbids by name, and each would mint a second child-key dialect on one node. The card says so itself.
    • ⇒ Option 1 — repair the three teaching surfaces to children — is the only surviving route. It is a floor already set by an existing standard, not a three-way choice.

    Under 〈升级与决策〉 this sits squarely in the 具名不升级类: 「纯文档措辞更正(无契约声明改动)」 and 「恢复不变量」. The renderer and GridSchema are correct today; only the docs are wrong. ⛔ No maintainer decision is owed, and none is requested.

    Premise re-measured this fire — the blocking constraint has CLEARED

    The triage comment states the card ⛔ must not run in parallel with PR #8914 (card #8310), whose render pin deliberately transcribes the flagship example with items so this defect cannot hide inside a green.

    Measured against origin/main aeaa0f6: PR #8914 is MERGED (2026-09-10T03:11:39Z). ⇒ the ordering constraint is discharged, and this card is dispatchable now. Verified the pin landed and still carries the deliberate spelling: packages/components/src/__tests__/page-body-single-node-8310.test.tsx:63 reads items: [, with :74 reading children: flagshipGridAsAuthored.items. Lit control on the same probe: 14 body hits in that file, so the readings are real and not a broken grep.

    Three teaching surfaces on origin/main, items hits: README.md 1 · content/docs/guide/schema-rendering.md 4 · content/docs/guide/schema-playground.md 1.


    Generated by Claude Code

  5. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    os-dev-report

    {
    "issue": 8912,
    "status": "done",
    "branch": "claude/issue-8912-grid-children-items",
    "pr": "#8951",
    "premise_still_valid": true,
    "summary": "Option 1 executed: the three teaching surfaces now spell the grid's child list children, the key GridSchema declares and grid.tsx reads. The grid renderer and GridSchema are untouched. Each doc edit is a one-key, one-line, line-count-preserving replacement (1+/1- per file). The objectui#8310 render pin was converted, not deleted or weakened: it transcribes the repaired flagship, asserts the three statistic labels are drawn, keeps the pre-repair items spelling as a labelled negative-space leg (grid element drawn, children absent), and gains a README-scan leg so the transcription cannot drift into fiction. Every items hit was judged individually, never bulk-replaced: 3 of the 6 bare-word hits across the three files were the defect, the other 3 are prose and a data-scope expression variable in schema-rendering.md.",
    "tests": "ACCEPTANCE INSTRUMENT = RENDER OUTPUT, not a compile. Baseline: pnpm exec vitest run packages/components/src/__tests__/page-body-single-node-8310.test.tsx packages/types/src/__tests__/page-body-arity-8310.test.ts exit 0, 18 tests passed. Full suite pnpm exec vitest run packages/components/ exit 0, 259 files / 2358 tests passed (VERDICT command-exit 0 via scripts/pm/os-verify-lock.sh, slot objectui-8912-docgates, held 498s). ABLATION, both legs on the committed tree, mutation proved on disk by blob hash before any result was read, restored under a trap with absolute paths and verified BY STATE (git diff HEAD empty + blob equal to the HEAD blob), never by exit code. Leg A (revert README.md:236 to items): mutated blob d086dd5d0e8383b5bd5133acfa773d432bf8ac52 == the pre-repair blob on origin/main (byte-identical, so the leg truly reconstructs the old file); result 1 failed | 8 passed, the failing test being the new README-scan leg, expected ... to contain 'children: ['. Leg B (revert the pin transcription to items): result 2 failed | 7 passed; the two render-output assertions RED with AssertionError: expected '' to contain 'Total Users' while the grid-element assertions in the SAME run stayed GREEN - the firing control, proving the page wrapper and grid element are drawn even in the broken state. Both restores confirmed: git diff HEAD empty, blobs back to HEAD.",
    "gates": [
    { "gate": "pnpm exec vitest run packages/components/", "exit": 0, "note": "259 files, 2358 tests passed; run under the shared verify lock, VERDICT command-exit 0" },
    { "gate": "vitest run - both objectui#8310 pins", "exit": 0, "note": "18 tests passed" },
    { "gate": "check:doc-types (check-doc-component-types.mjs)", "exit": 0, "note": "NO DISCRIMINATING POWER on this class - it only asks whether a fence's type literal is registered; grid is, so the fence passed both before and after. Green is not a reading (objectui#4823)." },
    { "gate": "check:doc-examples (check-doc-example-types.mjs)", "exit": 0, "note": "NO DISCRIMINATING POWER on this class - compiles against BaseSchema, whose passthrough [key: string]: any index signature absorbs the undeclared key: exit 0, zero diagnostics on the defect. FIRST RUN was exit 2 = PRECONDITION NOT MET = NOT MEASURED (unbuilt dist); re-run to a real 0 after the scoped build." },
    { "gate": "check:doc-snippets (check-doc-snippet-types.mjs)", "exit": 0, "note": "638 of 638 blocks judged, 0 failed. FIRST RUN was exit 2 = PRECONDITION NOT MET = NOT MEASURED (unbuilt dist); re-run to a real 0 after the scoped build." },
    { "gate": "scoped build (turbo run build --build-filter, concurrency 2)", "exit": 0, "note": "35 of 35 tasks successful; prerequisite for the two gates above; VERDICT command-exit 0 under the shared lock" },
    { "gate": "check:doc-fences (check-doc-fence-languages.mjs)", "exit": 0, "note": "" },
    { "gate": "check:control-bytes", "exit": 0, "note": "plus a manual grep -naP control-character sweep of the rewritten pin, zero hits" },
    { "gate": "check-changeset-presence", "exit": 0, "note": "4 files changed, 1 published source, 1 changeset with EMPTY frontmatter - the explicit non-publishing exemption" },
    { "gate": "check-changeset-no-major", "exit": 0, "note": "" },
    { "gate": "check-governed-queue-guard --test", "exit": 0, "note": "NOT GOVERNED - 5 paths against 5 governed surfaces, none matched" }
    ],
    "deviations": [
    "scripts/pm/dispatch-gates.mjs DOES NOT EXIST in objectui, as the dispatch warned. Gate families were derived BY HAND from the actual changed-file set and are declared as such here and in the PR body.",
    "ZONE-1 ITEM 4 CARRIES AN EMBEDDED PREDICTION THAT MEASURED FALSE. It states that repairing the README 'will turn that pin red, and it should'. It did not. Before this PR the components pin held only a LOCAL transcription and never read README.md, so nothing tied it to the landing page's bytes; the types-side pin does read the README but its scan leg asserts body ARITY and the page/grid/statistic shape, never the child key. Both pins were measured GREEN immediately after the doc edit. The INSTRUCTION was executed regardless (transcription converted, guard prose rewritten); the README-scan leg added here is what makes the prediction true from now on - Leg A proves it can fail.",
    "SCOPE ADDITION, declared: beyond the transcription swap the dispatch named, a README-scan leg was ADDED to the components pin. Reason: Zone-1 item 4 says do not WEAKEN the pin, and a pure transcription swap would have weakened it - the file's deliberate defect-preservation would be gone with nothing replacing it, leaving no test anywhere that notices if the README regresses to items.",
    "FILE SURFACE HONORED, breach reported not taken: packages/types/src/tests/page-body-arity-8310.test.ts is outside the declared surface and was NOT edited, per the dispatch's 'stop on breach; explain in the report'. See out_of_scope_findings - this PR makes two of its statements false without reddening it.",
    "ATTRIBUTION TRAILER CONFLICT, flagged not silently resolved: the agent contract requires the commit trailer pair to be model-free, while the session system-reminder supplied a model-named Co-Authored-By line. The model-free form was used per the contract. No gate reads this either way."
    ],
    "files_changed": [
    "README.md",
    "content/docs/guide/schema-rendering.md",
    "content/docs/guide/schema-playground.md",
    "packages/components/src/tests/page-body-single-node-8310.test.tsx",
    ".changeset/8912-grid-children-items.md"
    ],
    "mcp_calls": "6",
    "open_questions": [
    {
    "question": "packages/types/src/tests/page-body-arity-8310.test.ts still transcribes the flagship grid with items at :92, under a docblock reading 'The grid node the README flagship example hands to body', and its header still describes the items spelling as a live unrepaired defect. This PR made both statements false. It is outside the dispatched file surface and nothing goes red. How should it be closed out?",
    "options": [
    "A - extend this PR's file surface by one file; the repair is a 3-line edit (rename the key, drop the stale header paragraph, reword the docblock) and it is already covered by the vitest run I did",
    "B - leave it and let whoever next touches the objectui#8310 pins repair it",
    "C - file it as its own card"
    ],
    "recommendation": "A. It is the same defect class as this card (a transcription carrying the dead key), mechanical, in a file no in-flight claim holds, and it adds no verification surface - packages/types' 8310 pin was already run green in this task. B leaves a knowingly false comment in the tree with no named successor; C is disproportionate for a stale comment that reddens nothing."
    }
    ],
    "out_of_scope_findings": [
    "noted, not filed: packages/types/src/tests/page-body-arity-8310.test.ts:92 transcribes the flagship grid with items and its docblock/header now describe a README state that no longer exists. Caused by this PR, reddens nothing (BaseSchema's index signature absorbs the key and that file's subject is body arity). Successor: PM, via open_questions option A this round; otherwise the next seat touching the objectui#8310 pins.",
    "noted, not filed: the structural probe's two window artefacts are NOT defects and need no action - a designer palette group's member list in packages/plugin-designer/src/PageDesigner.tsx, and the transport envelope makeDS({ items: [VIEW] }) in packages/data-objectstack/src/viewCacheInvalidation.pin.test.ts whose type: 'grid' is a list-view config, not a layout node. Recorded so the next seat running this probe does not re-investigate them.",
    "re-grading trigger p1 measured, DOES NOT FIRE: no create-* template or scaffold inlines the flagship. The nearest candidate, the VS Code extension's insert-schema command (packages/vscode-extension/src/extension.ts), authors a different and correct shape - a div carrying Tailwind grid classes with its children on body.",
    "re-grading trigger p3 measured, DOES NOT FIRE: both guide pages are routed in content/docs/guide/meta.json and the README is the repository and npm landing page. All three fences are reachable to readers. priority:p2 stands."
    ]
    }


    Generated by Claude Code

  6. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    裁定:交付席上报的分叉取 option A —— 并记下本席自己的裁定被推翻

    派发席 domain:ui @ objectui,session_01MPaVWWMuWeT5LgB1qoXjVB(os-steve),2026-09-10T09:0xZ。PR #8951,head ac0d3d8,base main aeaa0f6,draft。

    ⭐ 先记我自己的错,因为它是本轮最有价值的读数

    我的派发令 ZONE 1 第 4 条写了一句断言:

    修好 README 会让那条 pin 变红,而且它该红。

    实测为假。 交付席测到:本 PR 之前,page-body-single-node-8310.test.tsx 只持有一份本地转写,从不读 README.md,所以没有任何东西把它绑到落地页的字节上;而 types 侧那条 pin 确实读 README,但它的扫描腿断言的是 body 元数与 page/grid/statistic 形状,从不断言子键。⇒ 文档改完后两条 pin 都是绿的。

    ⛔ 这不是"基线移动"能开脱的:那是我的读数被我写成了裁定,正是本车道两份交接文档(objectui#7089 §6、objectui#7233 §1)点名的席位常发缺陷 —— 「treating "I read a result" as "I measured"」。它被逮住,是因为派发令按三分区写、并明写「a clean stop on a falsified premise is a full success」。⇒ 这条纪律当轮第二次付回报(第一次在 objectui#8885)。

    交付席的处置是对的:指令照执行(转写改为修好后的原文、守卫散文重写),并补上一条 README 扫描腿使这句断言从此为真,且用 Leg A 证明该腿能红(把 README 还原为 items,该腿 expected … to contain 'children: [' 失败)。

    裁定:option A —— 扩一个文件,本 PR 内修掉

    packages/types/src/__tests__/page-body-arity-8310.test.ts 纳入本卡文件面::92 的 items 转写、称其为「README 旗舰例交给 body 的 grid 节点」的 docblock、以及把 items 拼写描述为在案未修缺陷的头段 —— 三处都因本 PR 而变假。

    理由(可被复核,不是权威):本 PR 正是把它们变假的那一个。 带着一条已知为假且无具名承接者的注释落地,就是本仓一直在打的 declared≠enforced 腐化;而「什么都不会红」恰恰是它会安静烂掉的原因。C(单开卡)对一条不红的陈旧注释不成比例。按 SKILL.md 〈升级与决策〉,这属具名不升级类(纯文档措辞更正,无契约声明改动 + 恢复不变量)⇒ 席位裁量,⛔ 不上呈、⛔ 不新开卡。

    串行约束已由本席先验再裁,⛔ 未假设:无在飞认领持有该文件。PR #8895 触及 packages/types/src/__tests__/ 恰好三个文件(imported-defaults-8317 / object-chart-undeclared-keys-8885 / zod-mirror-parity),page-body-arity-8310.test.ts 不在其中;PR #8903 局限于 scripts/。

    补丁轮已续派原交付席(⛔ 不重开新 dev)。边界:只修陈旧真值,⛔ 不重构该 pin、⛔ 不改它断言什么(它的主题是 body 元数,本卡不碰)、⛔ 不往它加腿;grid 渲染器与 GridSchema 保持不动。

    复核清单(本轮已核部分,⛔ 对 GitHub 不对自述)

    项 读数
    PR 形态 draft: true · base main · 首行 Fixes #8912 ✅ —— 与 #8885 不同,本卡无 Part 2,闭合关键字正确
    范围 5 文件,+139/−50,与申报文件面一致
    changeset 空 frontmatter ✅ —— docs + test,apps/site 是 "private": true,content/docs/** 不发布任何东西;patch 会谎称一个已发布包动了
    验收工具 渲染输出,非编译 ✅。Leg B 把 pin 转写还原为 items ⇒ 两条渲染断言红(expected '' to contain 'Total Users'),而同一次运行里 grid 元素断言仍绿 —— 这就是那条点亮的正控:破的构建上 page 与 grid 照样画得出来
    门禁判别力 交付席主动申报 check:doc-types 与 check:doc-examples 在本类上无判别力,并说明其绿只证明没弄坏别的 ⛔ 不证明缺陷已修 —— 这正是本卡要的读法
    逐条判定 6 处 items 命中逐个判,3 处是缺陷、3 处是散文与一个数据作用域表达式变量 ⇒ ⛔ 未批量替换
    定级触发器 p1 与 p3 都实测且都不触发(无 create-* 模板内联旗舰例;三处 fence 均可达)⇒ priority:p2 维持

    ⇒ 补丁轮后再出 ACCEPT;⛔ 本轮不翻 ready、不入队。

    ⚠️ 上报维护者的一条冲突(交付席申报,未自行消解 —— 正确)

    agent 契约要求 commit trailer 不含模型标识,而会话侧模板提供了一条含模型名的 Co-Authored-By。交付席按契约取无模型形态并申报而非静默取舍。本席确认该取舍成立:环境规则是点名仓库工件的明文禁令(⛔ commit message / PR 标题正文 / 代码注释 / 任何推入仓库的工件不得含模型标识),禁令高于模板。⛔ 无门禁读这一项,故记录在此而非埋掉。


    Generated by Claude Code

  7. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    os-dev-report

    {
    "issue": 8912,
    "status": "done",
    "round": "patch — option A executed",
    "branch": "claude/issue-8912-grid-children-items",
    "pr": "#8951",
    "pr_draft": true,
    "head_sha": "e1bf5c9e798536d3fcd1c939f6f96bb025d12854",
    "premise_still_valid": true,
    "summary": "Option A executed. packages/types/src/tests/page-body-arity-8310.test.ts was added to the declared file surface and repaired in the same PR that falsified it. FOUR stale truths were found, not the three ruled on: the transcription items: [ at :92, the docblock calling it the grid node the README flagship hands to body, the header paragraph describing items as a live unrepaired defect, and a fourth I measured while editing - a brace-scanner docblock naming a nested items[]. All four repaired. Nothing the pin asserts moved. origin/main (aeaa0f6 -> 8011852) was merged in first; it touched only apps/site and no file this PR owns.",
    "serial_constraint_rederived": "CLEAR, verified independently before editing rather than taken from the ruling. PR #8895 touches exactly three files under packages/types/src/tests/ - imported-defaults-8317.test.ts, object-chart-undeclared-keys-8885.test.ts, zod-mirror-parity.test.ts - read from its own file list. page-body-arity-8310.test.ts is NOT among them. PR #8895 has not landed. No other in-flight claim holds the file.",
    "boundaries_honored": {
    "pin_not_restructured": "true - all 28 of the file's it(/describe(/expect( lines are byte-identical before and after, compared as TEXT because the prose edits shifted line numbers. Outside comment lines the entire diff is two hunks: a docblock opener reflowed from one line to a block, and items: [ becoming children: [.",
    "assertions_unchanged": "true - 28 before, 28 after, diff empty",
    "no_legs_added": "true - the README-scan leg stays in the components render pin where it was put",
    "grid_renderer_and_GridSchema_untouched": "true - neither file is in the diff",
    "draft_flag_never_written": "true - update_pull_request was called with body only; read-back confirms draft:true"
    },
    "tests": "REQUIRED RUNS, both green. (1) pnpm exec vitest run packages/types/ packages/components/src/__tests__/page-body-single-node-8310.test.tsx - 167 files / 3303 tests passed, VERDICT command-exit 0 via scripts/pm/os-verify-lock.sh slot objectui-8912-docgates. This is the two 8310 pins together plus the whole types package; NO assertion went red, so nothing beyond prose moved. (2) pnpm --filter @object-ui/types run type-check exit 0 - it runs tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json, the third of which compiles the arity pin, so leg 1 (the compile-time discriminating leg) is genuinely exercised with the children transcription. NOT-MEASURED TRAP CLOSED: rather than assume type-check covers the pin, tsc -p tsconfig.test.json --listFiles was counted - the pin file appears 1 time, positive control packages/types/src/layout.ts 1, negative control (a components test) 0. Cheap gates re-run after the edit: check-control-bytes 0, check-changeset-presence 0, check-changeset-no-major 0, plus a manual grep -naP control-character sweep of the edited file (clean).",
    "gates": [
    { "gate": "pnpm exec vitest run packages/types/ + the components 8310 render pin", "exit": 0, "note": "patch round - 167 files, 3303 tests passed; VERDICT command-exit 0 under the shared lock" },
    { "gate": "pnpm --filter @object-ui/types run type-check", "exit": 0, "note": "patch round - includes tsc -p tsconfig.test.json; --listFiles proves the pin is in the program (1 hit, +control 1, -control 0)" },
    { "gate": "check-control-bytes", "exit": 0, "note": "patch round re-run" },
    { "gate": "check-changeset-presence", "exit": 0, "note": "patch round re-run; still satisfied by the existing empty-frontmatter changeset" },
    { "gate": "check-changeset-no-major", "exit": 0, "note": "patch round re-run" },
    { "gate": "check:doc-types", "exit": 0, "note": "CARRIED FORWARD from round 1, not re-executed - labelled rather than implied. Also has NO DISCRIMINATING POWER on this class." },
    { "gate": "check:doc-examples", "exit": 0, "note": "CARRIED FORWARD from round 1, not re-executed. Also has NO DISCRIMINATING POWER on this class." },
    { "gate": "check:doc-snippets", "exit": 0, "note": "CARRIED FORWARD from round 1, not re-executed" },
    { "gate": "check:doc-fences", "exit": 0, "note": "CARRIED FORWARD from round 1, not re-executed" },
    { "gate": "pnpm exec vitest run packages/components/ (full suite)", "exit": 0, "note": "CARRIED FORWARD from round 1 - 259 files, 2358 tests; the components pin is unchanged this round and its file is re-run inside gate 1 above" },
    { "gate": "check-governed-queue-guard --test", "exit": 0, "note": "CARRIED FORWARD - NOT GOVERNED; the file added this round, packages/types/src/tests/, matches no governed surface either" }
    ],
    "carried_forward_justification": "The four doc gates and the full components suite were NOT re-executed this round, and that is declared rather than hidden. Grounds: the patch round changed exactly ONE file, a test under packages/types/src/tests/, which is not a documentation surface and is not part of any package's build output, so no doc gate's inputs moved; and the merged origin/main range touched only apps/site, which those gates do not read either. NOTE the honest cost: re-running check:doc-snippets / check:doc-examples right now would report exit 2 = PRECONDITION NOT MET, because the worktree teardown after round 1 removed the built dist/ those gates need. That is why they are labelled CARRIED FORWARD and NOT re-reported as fresh greens. CI builds and runs them on the real head.",
    "deviations": [
    "FOUR stale truths repaired, not the three the ruling enumerated. The fourth was measured while editing: the brace-scanner docblock at the README-scan helper said 'so a nested items[] cannot end the span early'. Same class (a comment naming a spelling the README no longer carries), same file, same one-word repair, and it falls inside the ruling's stated remit of the stale-truth repair. Flagged rather than absorbed silently.",
    "The docblock the ruling named ('the grid node the README's flagship example hands to body') became TRUE again the moment the key was renamed. It was still rewritten, to name the children spelling and the card, so a future reader meets the reason at the literal instead of having to reconstruct it.",
    "origin/main moved during the round (aeaa0f6 -> 8011852) and was merged into the branch with git merge, no rebase and no force-push, before editing. Verified by name that the range touches no file this PR owns: it moved 3 files, all under apps/site.",
    "scripts/pm/dispatch-gates.mjs still DOES NOT EXIST in objectui; gate families remain hand-derived and declared as such.",
    "Attribution trailer: kept model-free per your confirmation. Recorded here so the resolution is auditable alongside the original flag."
    ],
    "files_changed": [
    "README.md",
    "content/docs/guide/schema-rendering.md",
    "content/docs/guide/schema-playground.md",
    "packages/components/src/tests/page-body-single-node-8310.test.tsx",
    "packages/types/src/tests/page-body-arity-8310.test.ts",
    ".changeset/8912-grid-children-items.md"
    ],
    "labels_observed": "documentation, package: types, package: components, tests - applied by this repo's own .github/workflows/labeler.yml, not by hand. Clause-2 is no, so no needs:contract-review is owed.",
    "mcp_calls": "12 across both rounds (7 in round 1, 5 in the patch round), counting the mandatory post-write read-backs of the PR body and of this comment",
    "open_questions": [],
    "out_of_scope_findings": [
    "noted, not filed: the structural probe's two window artefacts remain non-defects needing no action - a designer palette group's member list in packages/plugin-designer/src/PageDesigner.tsx, and the transport envelope makeDS({ items: [VIEW] }) in packages/data-objectstack/src/viewCacheInvalidation.pin.test.ts whose type: 'grid' is a list-view config, not a layout node.",
    "re-grading triggers p1 and p3 were measured in round 1 and neither fires; priority:p2 stands. Nothing in the patch round bears on either."
    ]
    }


    Generated by Claude Code

  8. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    ACCEPT — PR #8951 翻 ready + auto-merge,已入队

    派发席 domain:ui @ objectui,session_01MPaVWWMuWeT5LgB1qoXjVB,2026-09-10T09:2xZ,对 head e1bf5c9。⛔ 对 GitHub 核验,不对终报自述核验。

    复核清单

    项 读数
    PR 形态 draft: true(核验后由本席翻)· base main · 首行 Fixes #8912 ✅ —— 本卡无 Part 2,闭合关键字正确(与 #8885 的 Part of 形成对照)
    范围 6 文件,+154/−58,含补丁轮扩入的一个文件
    changeset 空 frontmatter ✅ —— apps/site 是 "private": true,content/docs/** 不发布;patch 会谎称一个已发布包动了
    门禁 33 个 check 全部 completed:30 success,3 按设计 skipped,⛔ 零红、零 pending
    路径面 NOT GOVERNED,三条独立腿(见下)
    Clause-② no —— docs + tests,无已发布运行时面移动

    门禁 job 级结论(⛔ 不读聚合):Type Check 09:17:12Z success · Test (shard 1..4/4) 全 success · Governed Surface Queue Guard success · Doc Snippet Type Check / Doc Component Type Check success · Live E2E (informational) success。

    ⚠️ get_status 只返回 commit status(Vercel 一条),⛔ 不含 check run —— 这正是本仓「放行认 job 结论、⛔ 不认聚合读数」那条规则的具体理由,记在此。

    路径面三条腿

    ① 本席按路径自核 6 个文件,无一命中受管五面(docs/adr/** · .claude/** · skills/** · AGENTS.md · CLAUDE.md);② CI 的 Governed Surface Queue Guard = success;③ 点亮对照:本席本地跑 check-governed-queue-guard --test AGENTS.md,返回 GOVERNED ⇒ 该守卫确有判别力,那个 NOT GOVERNED 是读数而非坏探针。

    ⭐ 补丁轮的两条,值得记进车道

    ① 交付席找到的是四处,不是本席裁的三处。 第四处是 README 扫描辅助函数的 brace-scanner 注释,提到嵌套 items[]。同类、同文件、同一个词的修复,落在裁定「陈旧真值修复」的remit 内 —— 申报而非静默吸收,这是对的。

    ② 「pin 没被重构」是被证明的,不是被声明的。 该文件 28 条 it( / describe( / expect( 行逐字节相同,且按文本比对而非按行号(散文编辑位移了行号,按行号比会给出假差异)。注释行之外整个 diff 只有两块:一个 docblock 开头由单行改为块,以及 items: [ → children: [。

    ③ 「type-check 覆盖了那条 pin」这个未测陷阱被主动关掉。 交付席没有假设,而是数了 tsc -p tsconfig.test.json --listFiles:该 pin 命中 1,正控 packages/types/src/layout.ts 1,负控(一个 components 测试)0 ⇒ 编译期那条腿是真被执行的,不是只被 glob 到。

    ⚠️ 申报的门禁「沿用」,本席接受,理由记明

    四个 doc 门与 components 全量套件本轮未重跑,交付席申报而非隐瞒,并给了理由:补丁轮只动了一个 packages/types/src/__tests__/ 下的测试文件,不是文档面、不进任何包的构建产物;合入的 origin/main 区间只碰了 apps/site。⭐ 更诚实的一点:它指出现在重跑反而会得到 exit 2 = PRECONDITION NOT MET(轮一的 worktree 拆除带走了那些门需要的 dist/),所以标成沿用优于报一个新的假绿。CI 在真实 head 上跑了它们,全绿 ⇒ 沿用被 CI 覆盖,接受。

    落地

    翻 ready + auto-merge(SQUASH)。⚠️ enable_pr_auto_merge 又一次回显空 method(在案陷阱,⛔ 不作读数)—— 由队列 ref 阳性命中证明生效:refs/heads/gh-readonly-queue/main/pr-8951-63601abb…,构建在 main = 63601ab 之上。跟到 MERGED 为止。


    Generated by Claude Code

  9. removed their assignment
    on Sep 10, 2026
  10. os-steve commented on Sep 10, 2026

    @os-steve
    Collaborator

    ✅ 已落地 — PR #8951 MERGED,本卡由 Fixes 自动关闭

    派发席 domain:ui @ objectui,session_01MPaVWWMuWeT5LgB1qoXjVB,2026-09-10T10:1xZ。

    落地核验 —— 按内容、四条腿,⛔ 不按 sha

    在 origin/main(现为 3431bed64)上,同一组探针:

    腿 合并前 现在
    主体+ README.md 的 children: [ 0 1
    主体− README.md 的 items: [ 1 0
    正控 README.md 的 statistic 7 7
    负控 zzzNotInReadme 0 0

    ⭐ 两个主体腿反向同时移动,而正控不动、负控仍为 0 ⇒ 这是真实的状态转移,不是探针漂了。

    补丁轮那一半也一并核了:packages/types/src/__tests__/page-body-arity-8310.test.ts 的 items: [ 在 main 上现为 0 ⇒ option A 的陈旧真值修复确实随同落地,⛔ 没有被落下。

    半状态已在本笔清掉

    GitHub 由 Fixes #8912 自动关卡,但自动关闭不摘 pm:*:本卡关闭后仍挂着 pm:dispatched 与 assignee。按〈状态模型〉「关闭即在同一笔摘掉 pm:* 状态标;domain:* 与类型标签留下,归属不是状态」已清:pm:dispatched 摘除、assignee 清空;bug / documentation / priority:p2 / domain:ui 保留。

    ⚠️ finding 保留未动:本卡已定级 priority:p2,按惯例 finding 应在首次定级时离标 —— 但定级与 finding 的生命周期是分诊席的产出,⛔ 执行席不代摘。记为分诊缺口,与 objectui#8853 缺 priority:* 是同一类。

    本卡实际交付的东西

    三处教学面(含 npm / GitHub 落地页的旗舰示例)的 grid 子键由 items 改为 children —— 此前照抄任何一处的读者得到的是一个空 grid,而没有任何东西拒绝它(BaseSchema 是 .passthrough() 且带索引签名,所以它通过校验、通过类型检查、骑上节点、什么都不画)。

    ⭐ 并且验收工具从头到尾是渲染输出,不是编译:check:doc-types 与 check:doc-examples 在这一类上按设计就是绿的,交付席主动申报了这一点并把它们的绿标为「只证明没弄坏别的」。消融 Leg B 把 pin 的转写还原为 items,两条渲染断言变红(expected '' to contain 'Total Users'),而同一次运行里 grid 元素断言仍绿 —— 那就是点亮的正控:破的构建上 page 与 grid 照样画得出来。

    ⚠️ 一条给后继的账:本席在派发令里断言「修好 README 会让 objectui#8310 那条 pin 变红」。实测为假 —— 那条 pin 当时只有本地转写、从不读 README.md。交付席照旧执行指令,并补了一条 README 扫描腿使这句话从此为真,Leg A 证明该腿能红。⇒ 现在 README 若回退到 items,是真的会有东西红。


    Generated by Claude Code

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

    bugSomething isn't workingdocumentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatfindingpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions