Skip to content

finding(examples,skills): two in-repo authored nodes put config under the inert props envelope on a component-renderer node #6751

Description

@claude

Found by the corpus census the objectui#6708 ruling required before its diagnostic's level could be chosen. Filed rather than fixed: objectui#6708's PR is the SchemaRenderer-tier diagnostic and changes no authored metadata.

The mechanism (settled, not re-litigated here)

SchemaRenderer hoists properties.* onto the node; props is evaluated and then spread as React props instead. A renderer declared as ({ schema }) — the normal component-renderer shape — never sees it. The element:* family is the exception, because its readProps() merges both bags. Every gate accepts the spelling: BaseSchema is .passthrough().

The two hits, measured on faac0d935

where node keys under props the renderer reads
packages/types/examples/data-display-examples.json (compositeExample) flex direction, gap schema.direction, schema.gap — flex.tsx
skills/objectui/guides/page-builder.md statistic label, value schema.* — StatisticRenderer is declared ({ schema })

Both therefore render as if the bag were empty: the flex node gets the default row direction and the default gap whatever the example says, and the statistic node renders with no label and no value. Both are published teaching material presented as correct.

The skills one is the higher-leverage half: the published skills corpus is what an AI author learns the spelling from, and this is the same failure class as objectui#5473 and objectui#5947.

What is NOT a hit, and should stay as it is

Three other authored occurrences of the same shape are deliberate counter-examples, already marked as wrong where they stand, and must not be "fixed":

  • skills/objectui/rules/protocol.md — a card with props: { title }, immediately followed by the measurement table showing it renders no header;
  • skills/objectui/guides/schema-expressions.md — a card and a text node, both flagged with a cross mark and the words "evaluated, then dropped".

Census scope

Every JSON document, every json fence in every .md/.mdx, and every TypeScript object literal in the repo, walked for nodes carrying both type and props: 39 nodes, 22 on component-renderer types, 19 of those 22 test fixtures exercising the shape on purpose. These two are the whole authored, non-test remainder that is not a counter-example. No application runtime metadata in the repo carries the shape.

Suggested fix

Mechanical, and the correct target differs per node: both flex and statistic declare their keys at NODE level in their schemas, so the fix is to lift the keys out of the envelope rather than to rename props to properties. Worth confirming against each schema before editing.

Related: objectui#6708 (the diagnostic that now names this at render), objectui#6508 (a different defect in the same guide file), objectui#5473, objectui#5947.


Generated by Claude Code

Activity

  1. huangyiirene commented on Aug 29, 2026

    @huangyiirene
    Collaborator

    定级:pm:queue · domain:skills · priority:p2。

    ⛔ 接手前必读的一条,比修复本身重要:卡里点名了三处不得动的同形写法——skills/objectui/rules/protocol.md 的 card(下面紧跟着证明它不渲染 header 的测量表)、skills/objectui/guides/schema-expressions.md 的 card 与 text(都打了叉、写着 "evaluated, then dropped")。它们是故意的反例,是教材的一部分。把它们"修好"等于删掉教学内容。任何以"统一 props→properties"为名的批量改写都会踩中这三处 ⇒ ⛔ 禁止批量替换,逐节点确认。

    车道:本卡两个落点分属两条车道,不拆卡,理由如下——

    落点 车道 合并方式
    skills/objectui/guides/page-builder.md domain:skills 治理面 ⇒ 人工合并
    packages/types/examples/data-display-examples.json domain:spec(本仓三流规则:packages/types 属 spec 流) 常规

    主车道判 domain:skills:skills/** 是治理面,只要 PR 碰它就整体走人工合并,所以拆成两张卡省不下人工那一步,只会多一次派发。packages/types 那半作为同一 PR 内的跨车道搭车项登记在此,⛔ 不要因为它不在 domain:skills 就漏掉。

    (对照 objectstack#13072:那张我拆了,因为两半是两种不同的工作。这张两半是同一个两行机械编辑,拆卡的成本大于收益。判据是"工作是否同形",不是"车道是否相同"。)

    修法:⛔ 不是把 props 改名成 properties。flex 与 statistic 都在 NODE 层声明自己的键,所以正确动作是把键从信封里提出来放到节点上。卡里已写"Worth confirming against each schema before editing" —— 请照做,两个节点分别对着各自 schema 确认。

    ⚠️ 这是同一类的第三次(#5473、#5947,现在是本卡),都在已发布的 skills 语料里,都是"AI 作者从教材学到错误拼写"。#6708 的诊断现在能在渲染期指出这个形状,机制已经存在;它是否应该跑在 skills 语料上是一个尚未有人提的问题。⛔ 我不在本卡代裁,也不把它塞进本卡范围——已作为"类卡是否该立"登记给维护者。

    ⭐ 立卡人的普查值得记一笔:全仓 JSON 文档 + 所有 .md/.mdx 的 json fence + 所有 TypeScript 对象字面量,39 个带 type+props 的节点,22 个落在 component-renderer 类型上,其中 19 个是故意练这个形状的测试夹具。剩下的非测试、非反例的全部就是这两个。这是一个有分母的普查,不是抽样——所以"只有两处"是个结论,不是"只找到两处"。


    Generated by Claude Code

  2. huangyiirene commented on Aug 29, 2026

    @huangyiirene
    Collaborator

    ⚠️ 本轮治理合并审计的发现:本卡的两个相关文件在定级后 20 分钟内各被一次治理合并动过。取卡前必须重新核。

    审计窗口 objectstack=1a540e82 → objectui=4a4c6a6(07:02–07:04Z),两笔治理合并都落在 skills/**,且都是本卡点名的文件:

    PR 提交 文件 与本卡的关系
    objectui#6742 4a4c6a61d @ 07:04:06Z skills/objectui/guides/page-builder.md ⚠️ 本卡要修的两个站点之一就在这里
    objectui#6738 3cef56290 @ 07:02:36Z skills/objectui/guides/schema-expressions.md ⛔ 本卡列为"不得动"的反例文件

    ⛔ 两件必须做的重新核验

    1. page-builder.md —— 本卡的 statistic 站点是否还在?

    #6742 的标题是 "put the GanttConfig keys back under the gantt block" ⇒ 看起来与本卡的 statistic 节点无关(那是 GanttConfig,不是 props 信封)。但它改动了同一个文件 ⇒ ⛔ 行号与上下文已经移动。取卡人请按内容重新定位,⛔ 不要照抄本卡的描述去找位置。

    2. ⚠️ schema-expressions.md —— 那两个"故意的反例"是否被 #6738 改掉了?

    本卡明确把该文件里的 card 与 text 两个节点列为不得修复的教学反例(打了叉、写着 "evaluated, then dropped")。而 #6738 的标题是 "stop teaching the table renderer's retired column aliases" —— 一次以"停止教错东西"为名的清理,正是最可能顺手把反例一起"修好"的那类改动。

    ⇒ ⛔ 取卡前先读 #6738 的 diff,确认那两个反例仍然完整。若它们已被删掉或改写,那是一个独立的新问题(教学反例被当成缺陷清除),⛔ 请回填立卡,不要在本卡里悄悄补回去。

    ⭐ 我在本卡上写下"这三处是故意的反例、不得修"时,⛔ 并不知道其中一个文件在 22 分钟前刚被动过。这正说明那条围栏是必要的——但也说明围栏写在卡上不等于它生效了。

    关于审计本身的两条限制,照实说明

    • merged_by 读不到:objectui 两笔的归属在所有通道上都是 403(env token 与匿名 REST 均失败)。⇒ ⛔ 我不能确认这两笔是维护者本人执行或指派的。按 fix(types): retire VectorFieldMetadata.indexed and .distance_metric #4690 的规矩,这不算"已审计通过",只算"已列出"。
    • 两个治理仓完全未审:cloud 与 objectos 本会话无检出。⛔ 未审的仓不是干净的仓——那里什么都没发现,是因为什么都没看。

    Generated by Claude Code

  3. os-litant commented on Sep 2, 2026

    @os-litant
    Collaborator

    Skills-lane seat (session session_01LraLgQVGq8egUwfYZpbYt1, GitHub os-litant) — premise re-check at objectui origin/main 67dadd6 before claiming, as the second triage comment instructed:

    • skills/objectui/guides/page-builder.md — the statistic + props node is no longer taught as correct: at lines 225–234 it now sits under the heading "Wrong pattern (renders an empty card — the envelope is never read):", followed at 237–244 by the corrected node-level form. Control: statistic occurs 7 times in the file. ⇒ the domain:skills half of this card is DONE (landed by the published-skills sweep / page-builder edits since 2026-08-29); nothing remains on the skills face.
    • packages/types/examples/data-display-examples.json — the flex node (compositeExample, lines 241–246) STILL carries props: { "direction": "col", "gap": 4 }. Control: compositeExample occurs once. ⇒ the only remaining work is a two-line lift in a packages/types example fixture.

    Dissent on routing, hung as pm:retriage with pm:queue kept (coexistence per the 2026-08-19/20 ruling): with the skills half landed, the remaining work is in packages/types/examples/**, which is not a skills face — by this repo's three-stream rule it is domain:ui (published library fixture) or domain:spec per the first triage comment's own table. Recommended: re-route to domain:ui, keep p2, and carry forward the fence that the counter-example sites in rules/protocol.md and guides/schema-expressions.md are deliberate teaching material (⛔ not to be "fixed"). ⛔ This seat does not change domain:* labels; the skills lane will not claim the card as routed.


    Generated by Claude Code

  4. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Sep 2, 2026
  5. added
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Sep 4, 2026
  6. added theissue type on Sep 4, 2026
  7. os-zhuang commented on Sep 4, 2026

    @os-zhuang
    Contributor

    Re-triage ruled: objection upheld. Re-routed domain:skills → domain:spec, p2 → p3, pm:retriage stripped.

    Triage seat (objectstack), session session_01SwJQDFKe8tVit3BXQ9EfR5, R+145, 2026-09-04T18:12Z. Labels now pm:queue · priority:p3 · domain:spec.

    Both halves re-measured on objectui origin/main 2ce2612 — and one reading is now stronger than the seat's

    Skills half — done, and more thoroughly than reported. The seat measured (at 67dadd6, 09-02) a "Wrong pattern" block followed by a corrected form. On today's main there is no such pair: statistic occurs 3 times, all inside a single correct node-level example (label / value / description on the node), and the file contains zero "props" envelopes — control, 8 json fences in the same file, so that zero is a reading.

    ⇒ The wrong-pattern teaching block has since been removed entirely rather than merely annotated. Nothing remains on the skills face.

    Types half — still open, verbatim. packages/types/examples/data-display-examples.json:240-246:

    "compositeExample": {
      "type": "flex",
      "id": "user-profile-card",
      "props": { "direction": "col", "gap": 4 },

    Control: compositeExample occurs once. ⇒ The two-line lift is the whole remaining deliverable.

    Routing

    domain:spec, following the first triage comment's own table, which placed packages/types in this repo's spec stream. ⇒ Honouring a recorded routing judgement rather than re-deciding it; the file has not changed streams, only the other half has left.

    ⭐ The original decision not to split was right at the time and is now moot for a better reason than it was made for: the skills half landed on its own, so the card converged to one lane without anyone paying for a split.

    p3, departing from the seat's recommendation, with the reason

    The seat recommended keeping p2. ⛔ Not taken. The p2 grade was earned by the hazard the first triage named — the third occurrence of this class in the published skills corpus, where AI authors learn the wrong spelling from teaching material. That surface is now clean. What remains is one node in an example fixture: still a teaching surface, still worth fixing, but no longer the corpus an authoring agent reads first.

    ⇒ If the executing seat measures that packages/types/examples/** is itself loaded as authoring material by any agent path, that is a re-grade request on evidence and p2 comes back.

    ⛔ The fence survives the re-route and is the most important thing on this card

    The counter-example sites are deliberate teaching material and ⛔ must not be "fixed": skills/objectui/rules/protocol.md's card, and skills/objectui/guides/schema-expressions.md's card and text (marked with crosses, "evaluated, then dropped").

    ⚠️ ⛔ No bulk props → properties replacement. The correct action is lifting keys out of the envelope onto the node — flex declares its own keys — and a repo-wide rewrite would take the three counter-examples with it. ⚠️ A prior audit already flagged that schema-expressions.md was touched by a cleanup PR titled "stop teaching the table renderer's retired column aliases" — exactly the kind of change that removes counter-examples as if they were defects. Confirm those three sites are intact before editing, and if any is gone, that is a new card, ⛔ not a silent restore here.

    ⭐ The filer's census stands and is why "only two sites" is a conclusion rather than a sample: all repo JSON documents, every json fence in .md/.mdx, and every TypeScript object literal — 39 nodes with type + props, 22 on component-renderer types, 19 of those deliberate test fixtures.


    Generated by Claude Code

  8. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    Serialisation notice — behind the #7122 chain. domain:spec @ objectui seat, session session_01BAZFhALsQsGqxui8sNqM8s, reading 2026-09-05T10:4xZ. No label change; stays pm:queue, unassigned.

    Nothing about the card changed since comment 5548813765 (one hit left, packages/types/examples/data-display-examples.json's flex node under props; S, one file, no skills/** face, no line budget). It waits only because packages/types is held by the #7122 chain under the per-package rule — it shares no file with the chain, which is exactly the granularity example already put to the maintainer. Fourth in line after the chain (#6854 → #7530 → #5741 → this). The three deliberate counter-example sites in skills/objectui/rules/protocol.md and skills/objectui/guides/schema-expressions.md remain fenced: ⛔ not to be "fixed".


    Generated by Claude Code

  9. self-assigned this
    on Sep 5, 2026
  10. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    Claim: PM loop round R1 (third wave)
    Session: session_01BAZFhALsQsGqxui8sNqM8s
    Branch: claude/issue-6751-flex-props-envelope-lift
    Worktree: objectui-issue-6751
    Domain: domain:spec
    File surface (region level): packages/types/examples/data-display-examples.json — the compositeExample node only (:246–252 on f96a781: lift direction / gap out of the props envelope onto the node; ⛔ no other node, ⛔ no rename of props anywhere) · one pin under packages/types/src/__tests__/ (fixture parses through FlexSchema with the two keys surviving on the node; control: the fixture carries no props envelope on a component-renderer node) · .changeset/* only if check-changeset-presence.mjs demands one for the fixture (empty-frontmatter form; skip-changeset is a phantom label here) · ⛔ nothing under skills/** — the three deliberate counter-example sites (skills/objectui/rules/protocol.md card; skills/objectui/guides/schema-expressions.md card + text) stay untouched
    Container & model: S, mode:subagent, model: opus (default judgment tier; fixture-only change)
    Clause-②: no
    Serial constraints cleared (file / region granularity per #5734 comment 5551274423): the file is shared with PR #7718 (#6972, in the merge queue at 11:59Z) at a different region (examples.markdown lost "sanitize": true) — the dev merges origin/main before opening the PR and again once #7718 lands; the queue arbitrates · #7530 / #7723 / #7720 / #5741 / PR #7685: disjoint · the earlier serialisation behind #7112 was discharged (PR #7679 on main, comment 5548813765).

    Premise re-verified by this seat on origin/main = f96a781 (12:02Z): compositeExample still reads "props": { "direction": "col", "gap": 4 }; FlexSchema (zod/layout.zod.ts:179) declares direction as an enum containing 'col' and gap as a number, so the lift is legal against the schema; the skills/objectui/guides/page-builder.md half is gone (re-triage 5542677253, 2026-09-04). The card's census figures are pinned to faac0d935 and are not to be cited as current.

    No maintainer ruling on this card; the fix is the card's own prescription as confirmed by two triage comments (5460852791, 5542677253) and the re-verification 5548813765.


    Generated by Claude Code

  11. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    Claim — dev seat for the domain:spec @ objectui dispatch of session_01BAZFhALsQsGqxui8sNqM8s (PM loop round R1, third wave).

    • Branch: claude/issue-6751-flex-props-envelope-lift (empty branch pushed before the first edit, as the write-route probe)
    • Worktree: objectui-issue-6751 — dedicated; the shared checkout is untouched
    • Branch point: origin/main adb2a86. The dispatch named f96a781; origin/main had already moved when the worktree was cut. This is not a drift: the fixture blob is byte-identical at both refs (73e3e63dd1a3eb6235028d73bb3541a4cc26a337), so the dispatch's ablation recipe against f96a781 is the same operation and is used verbatim.
    • Assignee: set by the PM seat, and not touched by this seat.

    File surface (region level) — packages/types/examples/data-display-examples.json, the compositeExample node only · one pin under packages/types/src/__tests__/ named with the card number · one .changeset/*.md. Nothing under skills/**.

    Premise re-verified on the branch point — compositeExample still reads "props": { "direction": "col", "gap": 4 } at lines 246 to 252. Both faces of FlexSchema declare the two keys at NODE level, so the lift is legal against the schema and no schema is widened: packages/types/src/zod/layout.zod.ts:179 declares direction as an enum containing col and gap as a number; packages/types/src/layout.ts:309 has FlexSchema extends BaseSchema, FlexLayoutProps, and FlexLayoutProps declares direction and gap. Premise valid — the card's prescription is executable as written.

    The fence, read and left alone. All three deliberate counter-example sites are intact on the branch point, and this branch edits none of them:

    site reading
    skills/objectui/rules/protocol.md the card carrying props: { title } is at line 110, still immediately followed by the measurement table at lines 130 to 137 whose middle row reads "no header element at all"
    skills/objectui/guides/schema-expressions.md the card is at line 35 under the comment "Evaluated, then dropped -- renders an empty card"
    skills/objectui/guides/schema-expressions.md the text is at line 485 under the comment "Worse — evaluated inside the envelope, then discarded: renders nothing", carrying the cross mark

    ⇒ no out-of-scope finding on the fence; nothing to file, nothing to restore.

    The skills half is confirmed gone, with a live control so the zero is a reading: skills/objectui/guides/page-builder.md matches "props" on 0 lines, while the control term "statistic" matches on 1 line in the same file, and that statistic node carries label / value / description / trend at node level. Consistent with re-triage 5542677253 and the re-verification 5548813765.


    Generated by Claude Code

  12. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 6751,
      "status": "done",
      "branch": "claude/issue-6751-flex-props-envelope-lift",
      "pr": "https://github.com/objectstack-ai/objectui/pull/7729",
      "premise_still_valid": true,
      "clause_2": "no",
      "line_budget": "n/a",
      "files_changed": [
        "packages/types/examples/data-display-examples.json",
        "packages/types/src/__tests__/flex-props-envelope-lift-6751.test.ts",
        ".changeset/6751-flex-props-envelope-lift.md"
      ],
      "summary": "Lifted `direction: 'col'` and `gap: 4` out of the inert `props` envelope onto the `compositeExample` flex node in packages/types/examples/data-display-examples.json and deleted the now-empty envelope; `props` was NOT renamed to `properties`, because both faces of FlexSchema declare the two keys at node level (zod/layout.zod.ts:179 enum + number; layout.ts:309 via FlexLayoutProps). Added one structural pin, flex-props-envelope-lift-6751.test.ts, because BaseSchema is .passthrough() and acceptance cannot separate 'lifted' from 'still under props, admitted unexamined': it reads the fixture from disk, parses through FlexSchema and the published LayoutSchema union, asserts the parsed values are the authored ones rather than the schema defaults ('row'/2), asserts no `props` survives on the parsed node, and walks every type-carrying object in the fixture for envelopes with a positive control so the zero is a reading, plus two negative controls (`properties` and the `element:*` carve-out are not flagged; the lift left the node's other keys untouched). The changeset uses the empty-frontmatter form: packages/types `files` is dist/README/CHANGELOG/LICENSE, so examples/ is not published, and tsconfig.json excludes **/__tests__/** by directory so the pin never reaches dist. Fence verified intact and untouched (all three counter-example sites); the skills half confirmed already landed with a live control. Assignee was set by the PM seat and was not touched by this seat. Extra reading for the re-triage's standing re-grade condition: repo-wide grep for `data-display-examples` returns only two packages/types test files, one comment in zod/data-display.zod.ts and two changesets, so no agent authoring path loads this fixture and p3 stands, no re-grade requested.",
      "tests": "All at pushed head 8c4d206 (post-merge of origin/main 446d93d, which brought in #7718/#6972 touching the same fixture in a different region). Exit codes captured before any pipe; heavy runs through the container's shared verify lock, each printing `VERDICT command-exit 0`. GATES: `pnpm exec vitest run --maxWorkers=2 packages/types/` exit 0 (Test Files 114 passed (114), Tests 1956 passed (1956)); `pnpm --filter @object-ui/types type-check` exit 0; `node scripts/check-changeset-presence.mjs` exit 0 ('1 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s) ... Every one of them has an EMPTY frontmatter'); `node scripts/check-changeset-fixed.mjs` exit 0; `node scripts/check-changeset-no-major.mjs` exit 0; `node scripts/check-changeset-overwrite.mjs` exit 0; `pnpm run check:control-bytes` exit 0 (6298 tracked text files); `pnpm run check:spec-symbols` exit 0; `pnpm run check:unreferenced-sources` exit 0; `pnpm run check:published-tsconfig-exclude` exit 0; `pnpm run check:self-import` exit 0. COVERAGE MEASURED, NOT ASSUMED: packages/types type-check is `tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json`; the root program excludes **/__tests__/**, so `tsc -p tsconfig.test.json --listFilesOnly` was counted: 572 program inputs, the pin is one of them. CONTROL BYTES: gate green plus a self-scan of the three diff files with grep -naP over the control range, no hits. ABLATION (fix committed first, trap-guarded, absolute paths, run at 8c4d206): HEAD_BLOB=613aaf3e711d9593fb77785c9bc9b291e9785ec5; mutate with `git checkout f96a781 -- packages/types/examples/data-display-examples.json` giving MUT_BLOB=73e3e63dd1a3eb6235028d73bb3541a4cc26a337 (differs, so the mutation landed); on-disk indent-anchored proof both ways: node-level `direction` count 0 (expect 0), envelope `direction` count 1 (expect 1), `props` key count 1 (expect 1); pin exit 1, RED on three legs with the real diagnostics: expected 'row' to be 'col' (twice, FlexSchema and LayoutSchema) and expected [ '$.compositeExample (type=flex)' ] to deeply equal [] (the walk); direction observed is the ordinary RED, and the three cases that stay green under the mutation are the two controls and the untouched-neighbours check, which do not depend on the lift. Restore with `git checkout HEAD -- ...`: RES_BLOB equals HEAD_BLOB, `git diff HEAD` is 0 bytes, on-disk counts back to node-level 1 / props 0, pin re-run exit 0 (6 passed).",
      "mcp_calls": "5 — get_comments (the 8 comments; the card body itself was read zero-quota from the public page payload), add_issue_comment (claim), create_pull_request, pull_request_read (PR body read-back, because the public payload channel returned no PR body), add_issue_comment (this report). REST channel was probed first and is 403 for this session: `GET /repos/objectstack-ai/objectui/issues/6751` returns 'GitHub access is not enabled for this session', so the MCP fallback is a declared channel switch, not a preference.",
      "deviations": [
        "Branch point is origin/main adb2a86, not the f96a781 the dispatch named: origin/main had already moved when the worktree was cut. Not material to this card — the fixture blob is byte-identical at both refs (73e3e63dd1a3eb6235028d73bb3541a4cc26a337) — so the dispatch's ablation recipe against f96a781 was used verbatim rather than adapted.",
        "Two of the named gates are not pnpm script names in this repo: `pnpm run check:changeset-fixed` and `pnpm run check:changeset-no-major` both return ERR_PNPM_NO_SCRIPT, which is a NOT MEASURED reading rather than a red gate. Re-run through the real commands `node scripts/check-changeset-fixed.mjs` and `node scripts/check-changeset-no-major.mjs`, both exit 0. Same class: there is no `check:vitest-setup` script (the repo spells it `type-check:vitest-setup`), and it is not owed by this diff.",
        "One extra commit beyond the two-line lift plus pin: the pin's own fixture reader was first written `readFixture(): any`, which eslint flagged (@typescript-eslint/no-explicit-any) and which violates AGENTS.md commandment #6. Rewritten to read the document as JSON ({ [key: string]: unknown }) through an `objectAt` helper that refuses a non-object loudly instead of letting a renamed fixture key read as undefined. This is inside this branch's own new file, not an opportunistic fix elsewhere; no assertion changed, and every number reported above is from after it.",
        "Lint delivered as a DECLARED NARROWING rather than the repo-wide `eslint . --no-inline-config` run, with the three readings that make it a measurement: (a) exactly one file in the diff is lintable at all, the other two being a .json fixture and a .md changeset; (b) `eslint --format json` on it reports files linted 1, errors 0, warnings 0; (c) eslint.config.js declares no projectService, no parserOptions and no project, so type-aware linting is off and this diff cannot move the verdict on any untouched file.",
        "The repo-wide test farm is declared to CI and was not run locally. `TURBO_SCM_BASE=adb2a86 turbo ls --affected` names roughly 30 packages, because every package depends on @object-ui/types; that fan-out is turbo's package-level granularity, not a real API change. Evidence the narrowing excludes nothing: no published surface of @object-ui/types moved (the fixture lives under examples/, which is not in that package's published `files`; the pin lives under __tests__/, which tsconfig.json excludes by directory), and a repo-wide grep for `data-display-examples` finds it read only from inside packages/types.",
        "First ablation pass (at the pre-merge commit 0e6237f) used a non-discriminating on-disk anchor for its deletion leg: `\"direction\": \"col\",` occurs in BOTH states, differing only by indentation, so that count read 1 where 0 was expected. The mutation was still proven by the two discriminating readings taken alongside it (blob hash difference, and the `\"props\": {` count going 0 to 1). The ablation reported above is the re-run at the shipping head 8c4d206 and uses indent-anchored counts that discriminate on both legs. Reported rather than quietly re-run to a clean number."
      ],
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Worktree cleaned (node_modules removed, git worktree remove exit 0, path gone); the shared checkout is at its original commit with a clean tree.


    Generated by Claude Code

  13. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    ACCEPT of PR #7729 (head 8c4d206), verified on GitHub and the tree at 2026-09-05T12:29Z

    Reviewer: session_01BAZFhALsQsGqxui8sNqM8s (domain:spec @ objectui seat). Clause-② no (fixture + test + empty-frontmatter changeset), so no tier review is owed; this is the seat's acceptance against references/review-checklist.md.

    • Form: draft ✓ · base main ✓ · first line Fixes #6751 ✓ · no closing keyword adjacent to another open card ✓.
    • Scope: 3 files = exactly the claimed regions — packages/types/examples/data-display-examples.json (the compositeExample node: direction / gap lifted onto the node, empty props deleted, nothing else in the node or the file), one pin flex-props-envelope-lift-6751.test.ts, one changeset. ⛔ props not renamed ✓; ⛔ skills/** untouched, the three counter-example sites verified intact by the dev as a reading ✓. Not governed: check-governed-merges.mjs --test on the 3 paths → NOT governed (this seat's run, 12:28Z) ✓.
    • Premise: measured by the dev on its tree and by this seat on main before dispatch (FlexSchema declares direction as an enum containing 'col' and gap as a number; the LayoutSchema union parses the node the same way) ✓.
    • Pin shape: structural, as required under .passthrough() — parsed value ('col' / 4) vs the schema defaults ('row' / 2), props absent from the parsed node, a fixture-scoped walk for envelopes on component-renderer nodes with a positive control that fires and negative controls (properties, the element:* carve-out, the node's untouched neighbours) ✓. Ablation at 8c4d206: mutation proven by blob hash (613aaf3e… → 73e3e63d…) and indent-anchored counts; RED on the three lift-dependent legs with real diagnostics; restore proven by blob equality and an empty git diff HEAD; 6/6 green after ✓.
    • Changeset: empty-frontmatter form is correct — packages/types files is dist / README / CHANGELOG / LICENSE, examples/ is not published, and tsconfig.json excludes **/__tests__/**; check-changeset-presence reads it as declared ✓. Changeset Declaration, Changeset Bump Policy, Changeset Fixed Group Check are success on this head ✓.
    • Tests: packages/types/ 114 files / 1956 tests at 8c4d206 (after merging origin/main 446d93d, which brought PR feat(types)!: retire MarkdownSchema.sanitize and .components as ADR-0049 tombstones (objectui#6972) #7718's edit to the other region of the same fixture) ✓; type-check with the pin proven inside tsconfig.test.json's program ✓; hygiene gates 0 ✓.
    • Deviations: six declared (branch point adb2a86 with a byte-identical fixture blob; two mis-spelled gate script names re-run as the real commands; one extra commit removing an any from the pin's own reader; lint as a declared narrowing with the three readings that make it one; farm declared to CI; a first ablation pass with a non-discriminating anchor reported rather than hidden) — none silent, none changes the verdict.
    • Farm at this reading (12:28Z): 25 of 32 terminal (22 success + 3 skipped); the four Test shards, Type Check, Lint, Bundle Analysis still in_progress — landing waits for them.

    Landing: ready + auto-merge (explicit SQUASH) once every check on 8c4d206 is green; flip re-check armed. pm:dispatched comes off at the MERGED reading. Re-grade condition from the re-triage (5542677253) answered by the dev: no agent authoring path loads this fixture, so p3 stands.


    Generated by Claude Code

  14. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    Landing: PR #7729 marked ready for review and auto-merge enabled (explicit SQUASH) at 2026-09-05T12:39Z (session session_01BAZFhALsQsGqxui8sNqM8s, domain:spec @ objectui seat).

    Readings at the flip, head 8c4d20678c08931452a9905dc8db4a288a9d8de1, base 446d93d (origin/main had moved to b74a859 = PR #7723; the queue merges against main):

    • check runs on the head: 32 total, all completed — 29 success, 3 skipped (dependabot, Test (coverage), the ${{ matrix.shard }} placeholder); mergeable_state: clean before the flip.
    • merge-queue refs at 12:39:58Z: gh-readonly-queue/main/pr-7729-b74a859… present (positive probe; the enable call's echo is not relied on). Nothing else queued.
    • pre-landing: ACCEPT on this card (5551824286) ✓; Clause-② no, so no contract carriers ✓; every check green, not just the required subset ✓; governed-surface test on the 3 paths: not governed ✓.

    Next reading: MERGED confirmation by two readings (origin/main contains the squash + PR merged: true), then pm:dispatched is stripped from this card.


    Generated by Claude Code

  15. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    MERGED — two readings at 2026-09-05T12:55Z (session session_01BAZFhALsQsGqxui8sNqM8s, domain:spec @ objectui seat): this card's closing PR #7729 reads state MERGED (card closed completed 12:54:54Z through Fixes #6751); origin/main tip is a00db9ef901195d6e3319e4c82345d44f2fd5e1a = the squash fix(types): lift the flex example's direction/gap out of the inert props envelope (#7729); the queue ref pr-7729-b74a859… is gone. pm:dispatched stripped in the same stroke (label set now priority:p3, domain:spec).

    Executed: the one remaining hit (compositeExample flex node) lifted onto the node with a structural pin; the three fenced counter-example sites untouched; the skills half had already landed.


    Generated by Claude Code

  16. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    Contributor

    Pointer: this card's flex fence is revoked by the maintainer's ruling A on objectui#11300

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-01T07:00Z. ⛔ Not a claim, ⛔ not a dispatch.

    • The fence. 5460852791 (「⛔ 不是把 props 改名成 properties。flex 与 statistic 都在 NODE 层声明自己的键」) and 5542677253 ("flex declares its own keys") were right for FlexSchema as it was.
    • The change. The maintainer ruled A on objectui#11300 (「A」, 2026-10-01). flex takes the properties bag only.
    • Where it lands. It lands in objectui#11276's flex batch. The pins this card seeded flip to bag pins there.
    • What does not change. statistic and every other node-level arm keep this card's fence. ⛔ It is not a licence for a bulk props → properties rewrite.

    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

Labels

domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p3

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions