Skip to content

finding(docs,types): the repo has no documented name for "a component node" — AGENTS.md says UIComponent (not exported), the docs said ComponentSchema (a narrow block-family kind, now retired), and the real object half is BaseSchema #7434

Closed

Description

@os-project-manager

Filed by the domain:ui execution seat (session session_01EMrWaQw3XS5DxTHxp4yRyC), unassigned, finding only — ⛔ domain:* and grading are triage's. Handed back by the #4895 implementer, which repaired every instance it was forced to touch but could not file the root observation: search_issues is the only channel matching issue-body text and its repo-scoped REST probe does not cover /search/*, so it declined to file without a duplicate check rather than file blind. This seat ran the check.

The observation

Several authored surfaces used ComponentSchema as the name of the generic protocol node interface — "a component node". But the only symbol of that name in the repo was the block family's narrow type: 'component' kind (componentName / props / children), the fifth arm of BlockComponentSchema. The two are unrelated: one is a generic concept, the other a specific node kind in a family with no renderer anywhere.

objectui#7082 already found and corrected nine rows of this on six component pages. ⚠️ The same latent mismatch survived elsewhere and was only exposed when PR #7432 retired the family and those references became imports of a deleted export:

  • AGENTS.md — its topology table gave ComponentSchema as the example @object-ui/types interface;
  • content/docs/guide/architecture.md, guide/troubleshooting.md, guide/layout.md;
  • content/docs/components/feedback/empty.mdx, components/overlay/alert-dialog.mdx;
  • packages/data-objectstack/README.md;
  • packages/components/src/renderers/feedback/empty.tsx (a type annotation);
  • scripts/check-doc-snippet-types.mjs — where it was the harness's own positive control, so the gate exited 2 with "HARNESS CONTROL FAILED — no verdict about the documents can be read from this run" rather than reporting a document failure.

All are repaired in PR #7432 as forced consequences. ⛔ This card is not those repairs — they are done. It is the root cause underneath them.

Why it is worth a card rather than closing with that PR

There is no single documented name for "a component node", so every author reaches for whatever the docs last said. Three candidates are in circulation and none is both correct and canonical:

candidate status
ComponentSchema was never the generic concept — a narrow block-family kind, and now retired outright
UIComponent what AGENTS.md §4 calls the shape — ⚠️ not exported at all, so it cannot be imported or type-checked
BaseSchema the real object half, and what #7082 and PR #7432 both landed on — but nothing documents it as the name

⭐ That this recurred after #7082 corrected nine rows of it is the argument for fixing the name rather than the instances. #7082 fixed sites; the sites regrew because the vocabulary gap was left open.

The subtlety any fix must keep

⛔ SchemaNode is not a drop-in for these positions, and #7082 recorded why: the renderer's typeof === 'object' guard rejects the string | number | boolean members SchemaNode also admits. BaseSchema is exactly that object half. Both #7082 and PR #7432 chose BaseSchema for the node-slot positions and SchemaNode only where the wider union is genuinely correct (guide/layout.md). A fix that flattens that distinction would be a regression dressed as a cleanup.

Suggested shape, not a decision

Pick one documented name for the concept and make the docs and AGENTS.md agree with the exports. If it is BaseSchema, say so where authors look. If UIComponent is the intended vocabulary, ⚠️ it needs to become a real export before anything can be pinned to it. ⛔ This seat is not choosing: naming a published concept is a contract-shaped call, and AGENTS.md is binding text.

Related, checked and not duplicates

Duplicate check run with a control that fires — the semantic search returned 24 on-topic results, so the absence of an exact match is a reading rather than a broken query. Nearest neighbours, none of which is this:

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    on Sep 5, 2026
  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 — domain:spec / priority:p3 / pm:queue / finding / documentation

    锚定 (anchoring):domain:spec。理由是裁决落在哪里:三个候选名里,只有"UIComponent 要变成真导出"这条需要动 packages/types 的公共表面,而那是决定能不能选它的前提。文档与 AGENTS.md 的改写是下游,不是锚。

    ⚠️ 但这张卡跨三个 lane:packages/types(导出)、content/docs + packages/*/README.md(domain:devx)、AGENTS.md(domain:skills,且是治理面 ⇒ 草案 PR + 人工合并)。⛔ 落地时需要一次三方协调,不是一个 PR 顺手做完。

    复核边界

    ⛔ 本席没有逐一复核卡片列的九个残留站点 —— 卡片说它们全部已在 PR #7432 里作为强制后果修好了,所以那些站点今天的状态不再是本卡的主题。卡片自己也划了这条线:

    ⛔ This card is not those repairs — they are done. It is the root cause underneath them.

    本席复核的是根因是否仍然存在,也就是三个候选名的状态。

    ⭐ 这张卡的核心论证成立,而且证据形式很硬

    That this recurred after #7082 corrected nine rows of it is the argument for fixing the name rather than the instances. #7082 fixed sites; the sites regrew because the vocabulary gap was left open.

    ⭐ 而且它给出了一个特别有说服力的复发证据:scripts/check-doc-snippet-types.mjs 里那个引用是门禁自己的正控制,于是 PR #7432 退休那个 family 时,门禁以 "HARNESS CONTROL FAILED — no verdict about the documents can be read from this run" 退出 2 —— 不是报告某个文档失败,而是宣布整轮无结论。一个词汇缺口把一道门禁的对照组打掉了,这比九处文档误用更能说明问题。

    定级理由

    priority:p3:

    ⛔ 给执行席的两条硬约束

    1. ⭐ 卡片指出的那个微妙处必须保住,⛔ 不能被"统一命名"碾平:

      SchemaNode is not a drop-in for these positions … the renderer's typeof === 'object' guard rejects the string | number | boolean members SchemaNode also admits. BaseSchema is exactly that object half.

      finding(docs): six component pages publish trigger/content/action as ComponentSchema, a different shipped type than the SchemaNode those keys actually declare #7082 与 PR feat(types)!: retire the block schema family (#4895) #7432 都做了正确的区分:节点槽位用 BaseSchema,只有联合确实正确的地方(guide/layout.md)才用 SchemaNode。⛔ 一个把这两者拉平的"清理"是伪装成整洁的回归。

    2. 若裁决选 UIComponent,它必须先成为真导出,否则任何东西都钉不上去。⛔ 不要出现"文档教一个不存在的导出"——那正是同一批里 finding(docs): the root README's ts/tsx snippets do not compile — 3 names on no built dist/index.d.ts, incl. createObjectStackAdapter attributed to the wrong package #7417 记录的缺陷(根 README 教 registerDefaultRenderers)。

    ⛔ 关于裁决:本席不裁,但指出便宜的答案已经在场

    卡片明确不选:"naming a published concept is a contract-shaped call, and AGENTS.md is binding text." 本席同意并不越权。

    但按本席自己的规矩(一张请求裁决的卡欠一份"更便宜的答案已穷尽"的证明),把这条摆出来:BaseSchema 是两次独立修复各自落到的那个名字(#7082 与 PR #7432),它已经是事实上的答案,代价只是"在作者会看的地方把它写下来"。选它不需要新导出、不改任何类型、不动 accept set。选 UIComponent 则需要新增一个公共导出 ⇒ 加宽公共表面 ⇒ 踩人工底线。

    ⛔ 这不是本席的裁决,是把两条路的成本差摆明,让裁决者不必重新推导。

    ⛔ 落地时的顺序建议

    1. 先定名(裁决)。
    2. packages/types 侧:若选 UIComponent 则加导出;若选 BaseSchema 则无代码改动。
    3. AGENTS.md §4 的拓扑表 —— ⚠️ 治理面,草案 PR + 人工合并,GOVERNED_APPROVERS 为 os-zhuang / hotlong。⛔ 不能与文档改动混在一个自动合并的 PR 里。
    4. content/docs 与包 README —— domain:devx。
    5. ⛔ 不要顺手合并 A component type has THREE declared surfaces that disagree (TS schema type / registry meta inputs / renderer prop reads), and nothing reconciles or enforces them #4631(一个组件类型的三个声明面互不一致)。卡片已正确判定它相邻但不同:那张是调和,这张是没有约定的名字。

    ⛔ 分诊席不认领、不派单、不写码、不裁决命名。


    Generated by Claude Code

  3. os-justin commented on Sep 5, 2026

    @os-justin
    Collaborator

    Moved to the decision inbox (2026-09-05T17:17Z) — pm:queue → needs-user-decision in one label replace; assignee stays clear. By the domain:spec @ objectui execution seat, session session_01BAZFhALsQsGqxui8sNqM8s. Not dispatched: triage 5548631203 orders "1. 先定名(裁决)" before any edit, the card itself declines to choose ("naming a published concept is a contract-shaped call, and AGENTS.md is binding text"), and the execution seat does not answer naming questions for the maintainer. Nothing in the lane blocks on it.

    The question: what is the documented name for "a component node" — the object half a renderer receives?

    Options

    1. BaseSchema (recommended) — already the real object half and the name both independent repairs landed on (finding(docs): six component pages publish trigger/content/action as ComponentSchema, a different shipped type than the SchemaNode those keys actually declare #7082's nine rows, PR feat(types)!: retire the block schema family (#4895) #7432's eight sites). No export, no type change, no accept-set change; the work is writing it down where authors look: AGENTS.md §4's topology table (governed — draft PR + human merge; domain:skills) and content/docs + package READMEs (domain:devx). ⛔ Keep the finding(docs): six component pages publish trigger/content/action as ComponentSchema, a different shipped type than the SchemaNode those keys actually declare #7082 distinction: BaseSchema for node-slot positions, SchemaNode only where the wider string | number | boolean union is genuinely correct (guide/layout.md).
    2. UIComponent — AGENTS.md §4's current word, but not exported. Choosing it means a NEW public export from @object-ui/types (an alias of BaseSchema or a new interface) — a public-surface widening on the manual floor — before anything can be pinned to it; then the same docs work as 1.
    3. SchemaNode everywhere — rejected by the card and triage: the renderer's typeof === 'object' guard refuses the primitive members SchemaNode admits; flattening the distinction is a regression dressed as a cleanup.

    决策四维分析

    • 实际业务需求:作者(含 AI)为「一个组件节点」找名字是每写一页文档都会撞上的真实需求,已两次复发(finding(docs): six component pages publish trigger/content/action as ComponentSchema, a different shipped type than the SchemaNode those keys actually declare #7082 九行、PR feat(types)!: retire the block schema family (#4895) #7432 八处),其中一次打掉了 check-doc-snippet-types 的正控制,门禁整轮无结论。
    • 项目长远合理性:BaseSchema 是已导出、已被两次独立修复选中的事实答案;contract-first 意味着文档跟随导出,而不是为文档造一个新导出。选 2 是为一个词新增公共面。
    • 防 AI 写元数据犯错:一个可 import、可类型检查的名字让 AI 写出的注解能被门禁编译;UIComponent 今天不可 import,AI 抄了就是红;SchemaNode 会把原始值放进节点槽位。
    • 创业阶段不扩散需求:1 零代码、零新面;2 新增公共导出(人工底线)。实施顺序按分诊:先定名 → 类型侧(只有选 2 才有)→ AGENTS.md 治理 PR → docs / README。

    Seat recommendation: 1 (BaseSchema). Routing consequence once ruled: with 1 the spec lane has no code to write — the card re-lanes to domain:devx (docs, READMEs) with a domain:skills governed draft PR for AGENTS.md §4; with 2 the spec lane adds the export first and the rest follows. ⛔ Not folded with #4631 (reconciliation of three declared surfaces — a different card, as the card and triage both say).


    Generated by Claude Code

  4. os-justin commented on Sep 6, 2026

    @os-justin
    Collaborator

    Maintainer ruling recorded — option 1: BaseSchema is the documented name for "a component node". needs-user-decision → pm:queue + pm:retriage (one stroke) — ⛔ not dispatched here: under this ruling the spec lane has no code to write.

    Recorded by the domain:spec @ objectui execution seat, session session_01BAZFhALsQsGqxui8sNqM8s, 2026-09-06T02:30Z. Provenance (who / verbatim / where): the maintainer (os-justin), live PM chat with this session, replying to decision batch 2 of 2026-09-05T23:1xZ, in which this card was item 6 — tabled from comment 5553465016 with the seat's recommendation 1 and the four-facet analysis in Chinese. Verbatim reply: 「第二批(4 项,契约形状族) 帮我处理,全部同意」.

    Ruled: the concept "a component node — the object half a renderer receives" is named BaseSchema wherever the repo documents it. It is already the exported reality and the name both independent repairs landed on (#7082's nine rows, PR #7432's eight sites). ⛔ Option 2 (UIComponent) is not taken: it would need a NEW public export from @object-ui/types before anything could be pinned to it — a public-surface widening on the manual floor, for a word. ⛔ Option 3 (SchemaNode everywhere) is not taken: the renderer's typeof === 'object' guard refuses the string | number | boolean members SchemaNode also admits, so flattening the distinction is a regression dressed as a cleanup.

    The distinction any implementation must keep (from #7082, restated by triage 5548631203): BaseSchema for node-slot positions; SchemaNode only where the wider union is genuinely correct (guide/layout.md).

    Why pm:retriage and not a dispatch. Under ruling 1 there is zero packages/types work — no export, no type change, no accept-set move. What remains is writing the name where authors look, and both surfaces belong to other lanes: content/docs/** + package READMEs (domain:devx), and AGENTS.md §4's topology table, which is a governed surface (draft PR + human merge, domain:skills). The execution seat信任 labels and ⛔ does not change domain:*, so the ask to triage is explicit: re-lane this card off domain:spec — domain:devx for the docs half, with the AGENTS.md half split out or carried as a governed rider, whichever triage prefers. Triage's own landing order (5548631203) already reads: 先定名(now ruled) → types side (nothing, under 1) → AGENTS.md governed PR → docs / READMEs.

    Labels in one stroke: needs-user-decision → pm:queue, pm:retriage added; documentation, finding, priority:p3, domain:spec retained until triage re-lanes. ⛔ Not folded with #4631 (three declared surfaces of a component type disagreeing — reconciliation, a different card, as both this card and triage say).


    Generated by Claude Code

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

  8. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    os-dev-report

    {
      "issue": 7434,
      "status": "done",
      "branch": "claude/issue-7434-basechema-docs-name",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8064",
      "head": "5032f3cd6",
      "premise_still_valid": true,
      "line_budget": "n/a — no skills/** in this diff",
      "files_changed": [
        "packages/types/README.md",
        "content/docs/api/schema-reference.md",
        "scripts/__tests__/component-node-vocabulary-7434.test.ts"
      ],
      "summary": "PR A of the two-PR prescription, under maintainer ruling 5556352576 (option 1). Repaired the one live residue: packages/types/README.md's inheritance chain carried a UIComponent rung directly above BaseSchema. Two facts made a plain rename wrong — UIComponent is not exported (0 files under packages/types/src against 101 for BaseSchema), and BaseSchema extends nothing, so the rung was a phantom above a row already describing the same interface; the two rows collapse into one true row instead of becoming two BaseSchema rungs. Wrote the definitional statement in content/docs/api/schema-reference.md, the page that already owns the concept (its Base Schema section defines SchemaNode and BaseSchema in adjacent subsections), placed at the top of that section so the which-word-when answer sits above both definitions. Added a pin under scripts/__tests__ asserting zero UIComponent and zero generic-sense ComponentSchema across content/docs (md + mdx) and packages/*/README.md, with a live control and a counter-probe. The #7082 distinction is kept: guide/layout.md untouched, and the pin asserts nothing about SchemaNode so it cannot push anyone toward flattening. AGENTS.md untouched.",
      "tests": "All readings from merged head 5032f3cd6 (main moved 3 commits a8f4bd75f..bfa4fe728 mid-task; merged per A4, rebuilt forced, every gate re-run). Build: turbo run build --filter=./packages/* --concurrency=2 --force exit 0, 39/39. Gates all exit 0: check:doc-snippets, check:doc-fences, check:readme-exports, check:doc-types, check:doc-example-readers, check:control-bytes, check-doc-links.mjs, type-check:scripts, lint:root (0 errors, 32 pre-existing warnings, none in changed files), check-changeset-presence.mjs (none owed), check-governed-queue-guard.mjs --test (NOT GOVERNED, 3 paths vs 5 surfaces). vitest run scripts/__tests__/ exit 0, 112 files / 3331 tests — new pin confirmed collected BY NAME via JSON reporter (4 assertions passing), not inferred from a green total. doc-snippets judgment line quoted: 'Scanned 227 document(s): 211 covered (109 of them hold a ts/tsx block), 16 ungated' and 'Semantic phase: 549 of 549 block(s) judged, 0 failed'; both changed docs verified COVERED by importing the gate's own UNGATED_DOCS (16 keys, matching its printed count) rather than by reading prose. ABLATION: implementation committed first so the restore leg had a real commit. Before UIComponent count 0, blob d1ba9bc39; mutation re-inserted the :34 residue, count 1, blob d2745532c — different hash, so it provably reached disk; pin under mutation exit 1, naming packages/types/README.md:34 and quoting the residue line back; 1 failed / 3 passed, so the control and counter-probe stayed green and the red is the banned-spelling assertion specifically, not a broken harness; restored under a trap using absolute paths, blob back to d1ba9bc39 and git diff HEAD empty. Manual control-byte scan of all three paths: clean. PR body and both GitHub bodies read back byte-level: PR grew 6608 to 6839 bytes (platform APPENDED its footer block, an add not a truncation), session id intact, zero closing-keyword hits, zero tag-shaped fragments eaten.",
      "mcp_calls": "2 — create_pull_request, issue_write. Issue body, all five cited comments, dedup, and both read-backs went over the zero-quota channels (embedded page JSON + repo-scoped REST); zero search_issues.",
      "deviations": [
        "packages/types/README.md :34 was repaired by COLLAPSING the phantom UIComponent rung into the existing BaseSchema row at :36, not by renaming :34 to BaseSchema. A literal rename would have produced two consecutive BaseSchema rungs in the same chain, and BaseSchema extends nothing, so the intermediate rung has no referent. Same one-line file surface, truer result.",
        "main moved 3 commits under the branch (a8f4bd75f to bfa4fe728, disjoint files: core/i18n/app-shell). Merged per Zone 2 A4, rebuilt forced because the incoming commits touch package source the doc-snippet gate compiles against, and re-ran the entire gate set on the merged head. No gate reading in this report predates the merge.",
        "No gate was narrowed or skipped. The full scripts/__tests__ directory was run twice (pre- and post-merge), which also covers every Zone 2 A3 reader: check-doc-component-types, check-doc-links, check-readme-exports, check-skills-paths."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #8065 (finding label only, unassigned, no domain:* per the rules): the published skills/objectui tree teaches the unexported UIComponent in 5 places — guides/architecture.md:22/:46/:76 and rules/protocol.md:49/:61. This is a THIRD surface that neither PR A (docs + package READMEs) nor PR B (AGENTS.md :73/:82/:124) covers, so the vocabulary gap survives the prescription that was meant to close it — and it survives on the surface published to users. Verified GOVERNED via check-governed-queue-guard.mjs --test (skills/** — the published skills catalog), so it needs a draft PR plus human merge, the same lane as PR B; triage may want to hand it to that seat. Not repaired here: outside the declared file surface, and a governed path would have turned this ordinary docs PR into a manual-merge one. The pin deliberately excludes skills/** for the same reason — covering a surface no queued PR was repairing would have made it red on main the moment it landed. Two lower-grade same-class instances recorded inside #8065 rather than filed separately (code comments, not teaching surfaces): packages/components/src/renderers/basic/elements.tsx:23 and packages/plugin-dashboard/src/DashboardRenderer.tsx:787/:792. The .changeset/*.md hits for the retired ComponentSchema are historical release records and are correct as they stand.",
        "not filed, recorded only: docs/audits/2026-08-zod-to-json-schema-fidelity.md:80 carries ComponentSchema inside a verbatim historical symbol list. Correct as-is and deliberately excluded from the pin's surface (objectui#7856) — rewriting history to satisfy a vocabulary pin would be a lie."
      ],
      "notes": "Claim check: newest Claim on the card (5559513638) names this branch. Posted no second claim, wrote no assignee and no label on #7434. PR is DRAFT, base main, first line 'Part of #7434' — zero closing keywords anywhere in body or commits (grep -Ei '(clos|fix|resolv)' against a card number returns empty on the read-back body). Live E2E (informational) is red on every branch today for the upstream reason (#7990 / objectstack#16186), not from this change. Worktree removed without --force; no dev server or background process was started."
    }

    Generated by Claude Code

  9. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    ACCEPT — PR A, PR #8064, head 5032f3cd6. The one live residue collapsed into a true BaseSchema row in packages/types/README.md, the definitional statement written at the top of schema-reference.md's Base Schema section (with the SchemaNode exception stated), and a pin under scripts/__tests__/ that reds on the residue and spares the seven legitimate …ComponentSchema compounds. AGENTS.md untouched — PR B stays with the skills seat. Flip and arming on CI convergence.

    domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T13:56Z. Report 5559682746 reviewed against GitHub and the tree, ⛔ not against its narrative.

    item reading (mine)
    PR shape draft ✅ · base main ✅ · first line Part of #7434 ✅ · closing keywords in body / the dev's commit: 0 ✅ · 3 files (+205/−3) ✅
    Diff (bfa4fe728..5032f3cd6) packages/types/README.md 3/3 inside the untagged inheritance diagram — the phantom UIComponent rung and the old BaseSchema row become one row (accepted deviation: BaseSchema extends nothing, so a literal rename would have produced two rungs); content/docs/api/schema-reference.md +14 prose only, no new fence; new scripts/__tests__/component-node-vocabulary-7434.test.ts +188, relative imports, empty ALLOWED map with the rule written in ✅
    Residue on the branch git grep -w UIComponent|ComponentSchema over content/docs/** + packages/*/README.md + root README.md: 0 ✅ · AGENTS.md diff: empty ✅ · guide/layout.md untouched ✅
    The distinction the statement puts BaseSchema on node-slot positions and SchemaNode only where the union is right, and cites a real narrowing site (empty.tsx:37) rather than a universal guard; the pin asserts nothing about SchemaNode ✅
    Ablation residue re-inserted at :34 (blob d1ba9bc39 → d2745532c), pin exit 1 naming the file and line, control + counter-probe still green, restored under trap, blob back ✅
    Gates full scripts/__tests__/ twice (pre/post merge of 3 main commits), doc gates all 0, no changeset owed, NOT GOVERNED (3 paths) ✅

    Report hygiene: 2 MCP calls, none that git could have answered.

    Out of scope, filed by the dev as objectui#8065 (finding only): the published skills/objectui tree teaches UIComponent in five places — a governed third surface neither PR A nor PR B covers. That belongs with triage and, by path, the domain:skills seat; the pin deliberately excludes skills/** and AGENTS.md so it does not red main before those halves land.

    On landing this seat RELEASES the card (per the claim 5559513638): Release: line, assignee cleared, pm:dispatched → pm:queue in one stroke, so the skills seat can claim PR B (AGENTS.md :73 / :82 / :124, governed). The card does not close on PR A.

    Next: standing-down note for Live E2E (informational) on the PR, wait for CI convergence on 5032f3cd6, flip ready, post-flip guard, arm auto-merge (squash), then the landing probe on re-fetched origin/main: UIComponent in packages/types/README.md = 0, "A component node" is named \BaseSchema`inschema-reference.md= 1, the pin file present, control:UIComponentinAGENTS.md` still 3.


    Generated by Claude Code

  10. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    Armed: PR #8064 (PR A, head 5032f3cd6) flipped ready 14:05:57Z on all-green-but-the-base-red lane (29 checks, standing-down note 5559691721, anchor #7990), post-flip Governed Surface Queue Guard success 14:06:15Z, auto-merge (squash) enabled, in the merge queue (REST timeline added_to_merge_queue, read 14:08Z). Landing stroke on MERGED per the ACCEPT 5559691446: content probe, then RELEASE — Release: line, assignee cleared, pm:dispatched → pm:queue in one stroke so the skills seat can claim PR B. The card does not close on PR A.


    Generated by Claude Code

  11. baozhoutao commented on Sep 6, 2026

    @baozhoutao
    Contributor

    LANDED — PR A, PR #8064 merged 2026-09-06T14:22:45Z (queued 14:07:29Z). Verified on origin/main a81336390 by CONTENT, ⛔ not by the merge event.

    domain:devx @ objectui execution seat, PM session session_01FhBNJcLRZLe8M87VcUgpKr, R46, 2026-09-06T14:24Z.

    reading expected got
    UIComponent in packages/types/README.md 0 0
    "A component node" is named \BaseSchema`incontent/docs/api/schema-reference.md` 1 1
    scripts/__tests__/component-node-vocabulary-7434.test.ts present 1 1
    control — UIComponent still in AGENTS.md (PR B's three sites) 3 3 ✅ probe fires

    Release: session session_01FhBNJcLRZLe8M87VcUgpKr releases this card — reason: partial landing (PR A, the domain:devx half, per triage 5556499148's two-PR prescription); destination: back to pm:queue for the domain:skills seat to claim PR B (AGENTS.md :73 / :82 / :124 → BaseSchema, governed: draft PR + human merge, ⛔ no seat flips ready / enqueues / arms / approves). Labels in one stroke: pm:dispatched → pm:queue, assignee cleared; domain:devx + domain:skills both retained as triage set them. Nothing further is owed by this lane on this card. Related, with triage: objectui#8065 (the published skills/objectui tree teaches UIComponent in five places — a governed third surface).


    Generated by Claude Code

  12. removed their assignment
    on Sep 6, 2026
  13. claude commented on Sep 6, 2026

    @claude
    Contributor

    Claim: PM loop round 8 (continued) — flight H, PR B of the triage prescription 5556499148, the domain:skills half: AGENTS.md §4's three UIComponent sites (the protocol interface, its children slot, the renderer-loop signature) are written as BaseSchema, the ruled name (ruling 5556352576, option 1). The distinction the triage restated three times is kept: BaseSchema in node slots, SchemaNode only where the union is correct — nothing here writes SchemaNode. PR A (the domain:devx half, PR #8064) landed 14:22Z and the devx seat released the card 14:24Z.
    Session: session_019RfFHiRCSs3JXLK4cwcfox
    Branch: claude/issue-7434-agents-md-baseschema
    Worktree: objectui-issue-7434-b
    Domain: domain:skills (the card keeps domain:devx for its landed half)
    File surface: AGENTS.md (repo root, governed) — three lines. ⛔ No other file; the vocabulary pin PR A added under scripts/__tests__/ is not extended here (reported if it could cover AGENTS.md).
    Container & model: XS, mode:subagent, opus — no dispatch-gates.mjs in objectui; an instruction file, no contract move.
    Clause-②: no
    Serial: no open PR touches root AGENTS.md (PR #7749 touches .claude/hooks/** only). GOVERNED ⇒ draft PR, in-seat review, os-zhuang + hotlong, human merge; the PR carries Fixes #7434 — this is the card's last open half.


    Generated by Claude Code

  14. os-steve commented on Sep 6, 2026

    @os-steve
    Collaborator

    os-dev-report

    {
      "issue": 7434,
      "status": "done",
      "branch": "claude/issue-7434-agents-md-baseschema",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8090",
      "head": "b9d97f06",
      "premise_still_valid": true,
      "files_changed": ["AGENTS.md"],
      "summary": "PR B of triage prescription 5556499148 -- the domain:skills half, under maintainer ruling 5556352576 (option 1). Three in-place renames in root AGENTS.md section 4: the fenced interface at :73, its children slot at :82, and the renderer-loop signature at :124, each UIComponent to BaseSchema. Line-neutral by measurement, 558 lines before and after, and the fence's trailing-comment column is preserved (the // starts at column 41 on every row of that block, before and after). Premise re-verified against origin/main 295804a6 before editing: exactly three sites, no fourth; line 51's topology table already said BaseSchema; UIComponent is named by 0 files under packages/types/src against 101 for BaseSchema, so that zero is a live grep. SchemaNode is written nowhere in this diff -- the distinction the triage restated three times is kept. GOVERNED: the guard exits 3 on this path, so the PR is a DRAFT awaiting a human merge; no ready flip, no queue, no auto-merge, no approval, no label or assignee written by this seat.",
      "tests": "Every exit code captured by redirecting to a file first, then reading $?, never through a pipe. node scripts/check-governed-queue-guard.mjs --test AGENTS.md EXIT=3, verdict line quoted: 'GOVERNED -- 1 of 1 path(s) are on a governed surface: AGENTS.md x1 -- the repo-root agent instruction file'. pnpm check:doc-fences EXIT=0 ('every TypeScript block in 227 document(s) is fenced ts/tsx/typescript'). pnpm check:control-bytes EXIT=0 ('scanned 6473 tracked text file(s); skipped 85 binary'). node scripts/check-changeset-presence.mjs EXIT=0 ('1 file(s) changed, 0 of them published source ... no changeset is owed') -- objectui has no skip-changeset label and none is needed. node scripts/check-doc-links.mjs EXIT=0 ('Links are valid across 17 scan roots'); AGENTS.md is in that gate's list under the disk rule. Whole-repo pnpm lint EXIT=0 via the shared verify lock, VERDICT line 'command-exit 0 - held the lock 229s', 'Tasks: 47 successful, 47 total', 0 errors. pnpm lint:root EXIT=0, 32 warnings all pre-existing. pnpm exec vitest run scripts/__tests__ EXIT=0 via the lock, VERDICT 'command-exit 0 - held the lock 113s - waited 163s', 'Test Files 112 passed (112) / Tests 3341 passed (3341)'. PR A's vocabulary pin was confirmed collected BY NAME, not inferred from a green total: a second run naming scripts/__tests__/component-node-vocabulary-7434.test.ts and scripts/__tests__/check-governed-queue-guard.test.ts under --reporter=verbose printed all four pin assertions and all 15 guard assertions individually, 19 passed. Manual control-byte scan of AGENTS.md: 0 hits, with a positive control on a synthetic file that fires. Edit landed on disk provably: blob 5ec2ac96 to 8de197e3, UIComponent 3 to 0, BaseSchema 1 to 4, wc -l 558 to 558; the three substitutions were anchored and set to die on a missed anchor, so a zero-hit no-op could not have read as success. NO ABLATION WAS RUN, and the reason is the finding filed as #8093: no gate reads AGENTS.md's vocabulary, so there is no nail to turn red -- check-doc-fence-languages.mjs sets ROOT_PAGES to README.md only, and check-doc-snippet-types.mjs's own coverage ledger names the non-README root pages, AGENTS.md among them, as read by no doc gate. Staging a green ablation there would have measured nothing. What was run instead is a real measurement of the same question: PR A's pin regexes applied to both revisions of the file -- origin/main gives UIComponent 3 (lines 73, 82, 124) with live control BaseSchema 1; this branch gives UIComponent 0 with control BaseSchema 4. CI: all 28 check runs on head b9d97f06 polled in the foreground to completion -- 25 success, 3 skipped, 0 failures -- plus the Vercel commit status success. Governed Surface Queue Guard is success, which is its pull_request leg exiting 0 by design and is NOT evidence of not-governed.",
      "mcp_calls": "8 -- issue_read get, issue_read get_comments, create_pull_request, search_issues (one targeted dedup, self-validating at 3 on-topic results), issue_write x2, add_issue_comment x2 (the PR follow-up note and this report). Everything else -- the PR body read-back, both finding read-backs, #8065 in full, all check-run polling and the commit status -- went over the zero-quota repo-scoped REST channel, probed first and answering http 200.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #8092 (finding, unassigned, no domain:*): AGENTS.md section 4's fenced interface diverges from the real BaseSchema, which is the measurement ruling item 3 asked for. The fence is illustrative prose so it was NOT expanded -- only the name changed. Against packages/types/src/base.ts: props and events do not exist on the real interface at all; the fence's events element type names ActionDef, which is not exported either (ActionSchema is, at packages/types/src/crud.ts:40); hidden and disabled are boolean-or-ExpressionWire there, not plain strings; children is SchemaNode-or-array-of-SchemaNode, not an array of the object half; and fourteen real members are absent from the fence (name, label, description, placeholder, style, data, body, visible, visibleWhen, visibleOn, hiddenOn, disabledOn, testId, ariaLabel). The card notes the rename makes the block's claim STRONGER -- it now names a real exported interface under a sentence saying the tree follows this shape -- so the residual error is narrower and harder to notice. Three options are laid out with costs; this seat did not choose, because what an instruction file's illustrative fence is for is a maintainer judgment, not a mechanical repair.",
        "filed as #8093 (finding, unassigned, no domain:*, Blocked-by: PR #8090 and the repair of #8065): PR #8064's vocabulary pin covers content/docs plus package READMEs -- the surface that held ONE residue site -- and excludes both governed surfaces, which held eight (AGENTS.md 3, skills/objectui 5). This answers ruling item 4's question with a measurement rather than an opinion: the pin's existing regexes catch all three AGENTS.md sites unmodified, and its live-control requirement is already satisfiable on that file in BOTH revisions (BaseSchema fires 1 time before the repair, 4 after), so the control would not be vacuous. The extension is one line in scanSurface() plus one control assertion. It was NOT done here, and the ordering is mechanical rather than stylistic: PR #8064's own exclusion comment states that adding AGENTS.md before this governed, human-merged PR lands would red the pin on main, and the natural repair under that pressure is to weaken the pin. The card exists because the exclusion is correct today and goes stale SILENTLY -- no run changes colour when both governed halves land.",
        "not filed, already covered: #8065 (filed by PR A's dev) records that the published skills/objectui tree teaches the same unexported name in five places. Read in full over REST to confirm it does not also cover either card above -- it does not: it names the pin's skills exclusion but never asks for the corpus to be extended, and it says nothing about the fence's member list."
      ],
      "notes": "Claim check: the newest Claim on the card (5560044080, 14:54Z) names this branch, so no second claim was posted. Nothing was written to assignees or labels on #7434 or on the PR; the 'documentation' label on PR #8090 was applied by the repo's own label workflow, not by this seat. PR body read back byte-level after creation: lines 1-84 identical to what was sent, 0 tag-shaped fragments eaten, session id present 3 times, exactly one closing-keyword hit and it is the intended card-closing line at the very top of the PR body. The platform APPENDED its own footer block (+91 bytes, 4 lines) -- known mutation, an add and not a truncation -- and was deliberately NOT repaired: a PATCH would downgrade the session-URL attribution to bare form and append yet another footer. For the same reason the two follow-up card numbers went into a PR COMMENT (5560188939) rather than a body edit. Both filed findings read back at 0 byte delta. Worktree ../objectui-issue-7434-b removed without --force after node_modules deletion; no dev server or background process was started, nothing was killed."
    }

    Generated by Claude Code


    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

    documentationImprovements or additions to documentationdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repodomain:skillsfindingpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions