You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
the list-view / list registrations still declare the react-tier aliases objectName (required) and viewType as designer inputs after @objectstack/spec 17.4.0 retired both — the second half of objectui#8510 #10603
Filing-gate category: ④ a coordination child. This is the second half of objectui#8510 (itself the objectui half of objectstack-ai/objectstack#14791), split out at the triage's direction (5580304720: 「⛔ 第二半必须拆卡,不要塞进同一个 PR … 本席建议开在本仓、domain:ui,正文照抄卡的 (a)/(b) 两条出口并注明 (b) 需跨仓」). Reader who acts: the domain:ui execution seat that claims it. Ruled A: no change, closed not_planned (ruling comment 5852003049). Dedupe: objectui issues and PRs updated since 2026-09-18 (1000 walked, open and closed) — registryOnly → 1 (objectui#8510), react-declaration-parity → 4 (objectui#8510 and three unrelated closed items), list-view.{0,60}inputs → 1 (objectui#8510), (objectName|viewType).{0,80}designer input → 2 (objectui#8510; objectui#7470, closed, the same class on map / gantt). No card carries this half.
Filed by the domain:ui seat 1 (session_01BA3nKVUwKQJf8DBxrSVtNC). The first half (five author sites) lands with PR objectui#10600, which closes objectui#8510. This card keeps the half that PR leaves alone.
What is still live
Measured on objectui mainf5178a272 by the objectui#8510 dev (report on objectui#8510):
The installed @objectstack/spec 17.4.0 REACT_BLOCKS ListView summary: 「Bind the object with the metadata-tier data source — data={{ provider: 'object', object: '…' }} — and pick the visualization with type: … the only spellings (the objectName / viewType aliases are retired).」 objectstack's parity ratchet (check:react-declaration-parity) judges registry inputs against node-level keys ∪ the spec block props ∪ the react overlay. With the overlay rows gone, both inputs become registryOnly for ListView. The gate is on-demand (pnpm sdui:manifest over a real browser), so it reds on the next manifest run, not in CI.
The two exits (objectui#8510's body, verbatim)
(a) retire the two designer inputs here, since the metadata host stamps objectName and the fold supplies it from data — the objectui#7470 class, on plugin-list; or (b) widen the objectstack baseline row deliberately with the reason written down. Not decided here.
(b) lands in objectstack-ai/objectstack, not in this repo.
Execution: inherits the objectui#7470 ruling
objectui#7470 is this class on map and gantt. Its ruling 5809231477 (UI closure batch 2 item 8, maintainer 「同意」) reads: 「Ruled: align the registration to the contract.」 It landed there as PR objectui#10390 and on calendar as PR objectui#10508. Under the inheritance rule (a new branch reuses the mother card's ruling, and only a real semantic difference reopens it), this card goes to pm:queue with that ruling. It does not go to the decision box.
The dev first measures which declared face the list-view / list registrations serve: the metadata-tier ListView schema (@object-ui/types, and @objectstack/spec's own ListView view schema) and the react tier (REACT_BLOCKS).
If no face the registration serves still declares objectName / viewType, the inputs are aligned to the contract: data / type in their place, following the objectui#7470 form. ⛔ No renderer read-order change: the fold (objectui#7477) keeps reading both spellings.
⛔ If the metadata tier still declares either key while the react tier retired it, that is a real semantic difference between two faces the same registration serves. Stop and report; the card then goes to needs-user-decision (triage's own rule in 5580304720). ⛔ Exit (b) is not taken from this repo.
priority:p3 and domain:ui are inherited from objectui#8510.
Claim: PM loop round 6 — domain:ui execution seat 2
Session: session_014mXUNuFomfj24w7s1pZzhN
Branch: claude/issue-10603-list-view-registration-inputs
Worktree: objectui-issue-10603
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/plugin-list/src/index.tsx (the list-view and list registrations' inputs / defaultProps), tests, one changeset ('@object-ui/plugin-list': patch, or minor with a BREAKING body if a published registration input is removed). Stop on breach and explain it in the report
Container & model: S, mode:subagent, model: opus — dispatch-gates --tier: 「no path-derived mandate … floor sonnet · default opus · ceiling fable」; executes the card's inherited ruling: objectui#7470 5809231477 (maintainer 「同意」, 「Ruled: align the registration to the contract.」), in the form of PRs objectui#10390 / objectui#10508, with the card's stop rule: a metadata-tier face that still declares objectName / viewType while the react tier retired them ⇒ stop and report, ⛔ exit (b) is not taken here
Clause-②: yes
Thread-read: none
Serial constraints cleared: objectui#8510's half (PR objectui#10600) is merged. Open-PR file lists read 2026-09-25T12:40Z: no open PR touches packages/plugin-list/src/index.tsx. check-governed-queue-guard.mjs --test: NOT GOVERNED.
Clause-②: yes — the designer's declared input set for list-view / list narrows to the contract's spellings; the renderer's read order is unchanged (the objectui#7477 fold keeps reading both).
{
"issue": 10603,
"status": "needs_decision",
"branch": "claude/issue-10603-list-view-registration-inputs",
"pr": null,
"session": "session_014mXUNuFomfj24w7s1pZzhN (mode:subagent, the dispatching seat's session)",
"premise_still_valid": true,
"summary": "Stopped at the card's own stop rule (dispatch H1): no code, no PR, no changeset. The metadata-tier face the `list-view` registration serves still declares both keys live: `@object-ui/types` `ListViewSchema` (the zod mirror) has `objectName: z.string()` REQUIRED and `viewType: ViewKindEnum.optional()`, and holds `type` as the `z.literal('list-view')` discriminator, while the react tier (`REACT_BLOCKS` in `@objectstack/spec` 17.4.0) retired both; the spec's own view-level `ListViewSchema` declares neither. A second semantic difference the card did not name: on this registration's face `type` cannot be the view-kind input at all (the html-tier compile refuses a `type` attribute as `forbidden-attr`, and the react tier parks an author's `type` under `specType`, ADR-0078), so 'data / type in their place' has no legal `type` half here. The card's motivating mechanism is gone: objectstack `28ce612` (objectstack#19921) retired `check:react-declaration-parity` and its baseline file (ADR-0082 D4 status line: retired 2026-09-18 by maintainer ruling on objectstack#17735) before this card was filed, so exit (b) has no baseline row left to widen. The card's title facts still hold (hence premise true); only its harm claim is stale. The card assignee (os-elon-musk) was already set and was not written.",
"faces_measured": [
"(a) @object-ui/types ListViewSchema (zod mirror, the node schema of type 'list-view'): declares `objectName: z.string().describe('Object Name')` under the comment 'objectui-only object binding (spec binds via data.provider:'object'; migration deferred)', and `viewType: ViewKindEnum.optional().describe('View Type')` under 'Renamed spec `type` (view-kind)'; `type: z.literal('list-view')`. LIVE, objectName REQUIRED.",
"(b) @objectstack/spec 17.4.0 ListViewSchema (ui, view level): shape has no objectName and no viewType; both are refused by name as unrecognized_keys. Declares `type` (view kind) and `data`.",
"(c) REACT_BLOCKS ListView (schemaType list-view): summary '(the `objectName` / `viewType` aliases are retired)'; dataProps carry `type` and `data`; interaction `data` is required: true. RETIRED.",
"(d) html tier (not named by the card; the registration's inputs ARE its save-gate contract, and objectstack's tracked sdui.manifest.json at 949e99b ships list-view with objectName required: true and viewType enum): the alias spelling compiles clean; the contract spelling is refused; a `type` attribute is a compile error.",
"Stop rule verdict: (a) declares both keys live while (c) retired them, so this is the card's stop condition, verbatim: 'If the metadata tier still declares either key while the react tier retired it, that is a real semantic difference between two faces the same registration serves. Stop and report'."
],
"hypotheses": {
"H1": "Confirmed as the STOP gate: see faces_measured (a) through (d).",
"H2": "Not reached (stopped at H1). The objectui#10390 / #10508 form was read: it dropped `required: true` from objectName and described a record-source one-of because the zod mirror already carried requireRecordSource on map / gantt / calendar. `ListViewSchema` carries no such refinement (objectName is required), so that form is not available here without a contract change first.",
"H3": "Fold untouched and live at head b1030c71a: `normalizeListViewSchema` (@object-ui/core) gap-fills objectName from `data.provider === 'object'` and reads the author's kind via `readListViewKind(s.specType) ?? readListViewKind(s.type)` into viewType.",
"H4": "No registry-parity test or snapshot in objectui pins list-view inputs (git grep of 'list-view' with 'inputs' over tests: zero hits). html-tier suites that compile through the live registration with an objectName attribute on the list-view tag: htmlTierColumnSpellings-6598, htmlTierListViewDefaultColumns-6598 (plugin-list), inert-expression-6598 and literal-subset-6614 (sdui-parser), htmlTierDataSourceInputDeclaration-6678 (console).",
"H5": "Readers of these inputs: the html-tier compile in page.tsx (`getJsxManifest` builds the whitelist from ComponentRegistry meta inputs) and objectstack's tracked sdui.manifest.json, read by packages/cli/src/utils/sdui-manifest.ts. Producers of the keys on list-view nodes: ObjectDataPage and InterfaceListPage (app-shell) and ObjectView (plugin-view) all stamp objectName and viewType.",
"H6": "Not reached (no change)."
},
"tests": "No diff, so no gate was run: worktree clean, branch == origin/main b1030c71a. Gates: NOT MEASURED, reason: zero-file diff. One-time probes (not kept, files deleted, git status clean after each): [1] tsx over packages/types/src/zod/objectql.zod.ts: ListViewSchema shape objectName opt=false desc 'Object Name'; viewType opt=true; node {type 'list-view', data {provider 'object', object 'x'}} gives success false, invalid_type at [objectName]; node {type 'list-view', objectName 'x', viewType 'kanban'} gives success true; control viewType 'zzz' gives invalid_value at [viewType]; node {type 'kanban', objectName 'x'} gives invalid_value at [type], expected 'list-view'. [2] node over installed @objectstack/spec 17.4.0 ui.ListViewSchema: shape objectName ABSENT, viewType ABSENT; safeParse with objectName gives unrecognized_keys [objectName]; with viewType gives unrecognized_keys [viewType]; lit control zzzBogus gives unrecognized_keys [zzzBogus]. [3] vitest single file in plugin-list under os-verify-lock ('VERDICT command-exit 0, held the lock 12s'; 'Test Files 1 passed (1)'): live ComponentRegistry inputs for list-view and view:list = objectName string required, viewType enum, columns, filter, sort, options, dataSource; list-view defaultProps objectName '' and viewType 'grid'. sdui-parser compile against the manifest built exactly as page.tsx builds it: list-view tag with objectName + viewType gives ok=true, zero diagnostics; list-view tag with a data object-provider binding only gives ok=false, [error missing-required-prop objectName, warning unknown-prop data]; list-view tag with objectName + type 'kanban' gives ok=false, [error forbidden-attr: 'on this tier the tag name IS the component']; lit control zzzBogus gives warning unknown-prop. [4] objectstack origin/main 949e99b: `git cat-file -e` of packages/spec/react-declaration-parity.baseline.json exit 128; positive control scripts/check-sdui-lockstep.mjs exit 0; `merge-base --is-ancestor 28ce612` exit 0 (exit 0 self-proves on the shallow checkout).",
"files_changed": [],
"deviations": [
"No PR, no pr_create, no label-write (PR assignee) and no changeset: the card's stop rule fired, so the write budget used is the empty-branch git push plus this one comment.",
"The empty branch claude/issue-10603-list-view-registration-inputs stays on origin at main's b1030c71a: ref deletion is refused by the agent proxy (objectui AGENTS.md, objectui#6756). Left for the seat.",
"Role file read at objectstack origin/main 949e99b, newer than the a4ca69a the order names.",
"Citations are by symbol and quoted string, not path:line: objectui AGENTS.md #11 bans line addresses in card bodies, so the order's line addresses are not repeated."
],
"mcp_calls": "0",
"api_writes": "1: POST /repos/objectstack-ai/objectui/issues/10603/comments (this os-dev-report, via scripts/pm/post-stamped.mjs). Plus git push of the empty branch (not REST).",
"open_questions": [
{
"question": "The list-view / view:list registration serves the html and metadata tier. That tier's declared contract is objectName (required) plus viewType, and `type` is the component discriminator there. The react tier has retired both keys, and the parity ratchet that motivated this card is retired too. What happens to objectui#10603?",
"options": [
"A. Close as not planned and change nothing. The inputs are the html/metadata tier's declared contract (objectui ListViewSchema and the shipped sdui.manifest.json), and the react-tier retirement does not bind that tier. BUSINESS: all three live producers of this face stamp objectName/viewType (ObjectDataPage, ObjectView, InterfaceListPage), html-tier sites write objectName, and zero html or metadata list-view sites write a data binding (census of both repos). LONG-TERM: this is not a workaround, since declaration equals enforcement on this tier. The two-tier spelling split is the zod mirror's named 'migration deferred', not something new. AI-SAFETY: the react spelling on the html tier is refused loudly at the save gate (missing-required-prop error, forbidden-attr for type). Nothing is silently tolerated. STARTUP: zero new surface, zero gates, zero cost.",
"B. Record-source one-of, contract-first, in the objectui#7470 form. First a @object-ui/types contract card makes ListViewSchema.objectName optional under a requireRecordSource-style refinement (data object provider or objectName). Then the registration drops required on objectName and declares data as type object. viewType stays declared, because this face has no legal alternative spelling. BUSINESS: no measured author writes data on this tier (zero sites), so the demand is speculative. LONG-TERM: it moves the binding toward the spec-canonical data, but as a SECOND accepted spelling. It also widens the published sdui.manifest.json contract (Clause-2 yes, contract review). AI-SAFETY: one tier accepting two spellings is the consumer-side tolerance this axis disfavours. STARTUP: a dual-spelling window with no named external user defaults to no.",
"C. Full retirement on the metadata tier: tombstone objectName/viewType on the list-view node face, then migrate the three host producers, the html pages, the docs and the objectstack CLI manifest. It also needs a NEW view-kind key for the SDUI node, because `type` is the discriminator (ADR-0078). That naming decision does not exist today, and objectui#2231 and #2890 are both closed. BUSINESS: no pull measured; the host is the only producer and it works. LONG-TERM: a single vocabulary is the right end state, but it needs a new name and a cross-repo migration. AI-SAFETY: the best end state (one spelling, loud tombstones). STARTUP: the largest expansion, cross-repo, and not justified without pull."
],
"recommendation": "A. BUSINESS: every live producer of this face writes the kept spelling and none writes the retired one. LONG-TERM: on the html/metadata tier the declaration equals the enforcement, and the split is an existing named deferral, not a new workaround. AI-SAFETY: the html save gate already refuses the react spelling loudly, while B would add tolerance. STARTUP: A adds no surface, and the only pressure on this card (the declaration-parity ratchet) was retired by maintainer ruling on objectstack#17735. If the maintainer wants the one-vocabulary end state, that is C as its own spec-first card, not this one."
}
],
"out_of_scope_findings": []
}
⇒ 这正是本卡正文写好的停止条件:「If the metadata tier still declares either key while the react tier retired it … Stop and report; the card then goes to needs-user-decision.」
本卡的动机机制已不存在:objectstack 28ce612(objectstack#19921)已在本卡立卡之前退役了 check:react-declaration-parity 及其基线文件(objectstack origin/main 上该基线 does not exist)。所以出口 (b)「放宽基线行」已没有行可放宽。
dev 另测到一条卡没写的差异:在这个注册服务的 html 层,type 根本不能充当视图种类输入。编译器把 type 属性判为 forbidden-attr,react 层把作者的 type 停放为 specType(ADR-0078)。所以「以 data / type 取代」在这里没有合法的 type 那一半。
三个方案(沿四条评估轴)
A. 不改,按 not planned 关卡(dev 推荐,席位同意)
实际业务需求:这一面的三个活生产者(app-shell ObjectDataPage、InterfaceListPage,plugin-view ObjectView)都写 objectName / viewType;两个仓里 html / 元数据层的 list-view 写 data 绑定的站点为 0(dev 普查)。
项目长远合理性:在 html / 元数据层,声明 = 强制,不是 workaround。两层拼写分裂是 zod 镜像里已具名的「migration deferred」,不是新造的。
防 AI 写错:react 拼写写到 html 层,会在保存闸门被响亮拒绝(missing-required-prop 报错,type 报 forbidden-attr),没有静默容忍。
Ruling: batch #225 item 4 · letter A · maintainer 「其他同意」 2026-09-27T02:34Z
Director seat, summon #30, session_01AsCNgFBs8HCjwhyHQsFbx3. Batch #225 was presented in the seat chat; the maintainer named two other items for a further mainstream-platform analysis and ruled every remaining item as recommended: 「20149 19995 其他主流平台是怎么处理类似问题的,帮我分析给我建议;其他同意。」
Ruled: A — no change; closed not_planned. The list-view / list registrations' objectName (required) and viewType inputs are the html / metadata tier's declared contract and stay.
Readings this ruling rests on (re-verified on objectui origin/main5c61e52 and objectstack origin/main8d1f7ab785):
packages/types/src/zod/objectql.zod.ts, the list-view node: objectName: z.string() required, viewType: ViewKindEnum.optional(), and type: z.literal('list-view') is the discriminator.
@objectstack/specpackages/spec/src/ui/react-blocks.ts, the ListView summary: 「the objectName / viewType aliases are retired」 — the react tier only.
ADR-0080, amendment of 2026-09-01: a type= attribute on the html tier is refused loudly and 「specType 别名不引入 html tier」, so 「data / type in their place」 has no legal type half on this tier.
ADR-0082 D4 status line: the declaration-parity ratchet was 「retired 2026-09-18 by maintainer ruling on #17735」; the pressure this card was filed under is gone.
The inherited ruling (objectui#7470, 「align the registration to the contract」) is already satisfied: the registration matches its own tier's contract, the zod mirror and the shipped sdui.manifest.json.
Why not B or C: B accepts two spellings on one tier (consumer-side tolerance, with zero measured authors writing data on this tier); C is the one-vocabulary end state, but it needs a view-kind key name that does not exist today (objectui#2231 and objectui#2890 are closed) and a cross-repo migration with no pull. If the maintainer wants that end state later, it is a spec-first card that names the key, not this one.
State after this ruling: needs-user-decision removed, assignee cleared, closed not_planned. The dev's empty branch claude/issue-10603-list-view-registration-inputs at main b1030c71a stays on origin for a hand with delete rights (objectui#6756).
Activity
objectstack-fleet commentedon Sep 25, 2026
Claim: PM loop round 6 —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10603-list-view-registration-inputsWorktree:
objectui-issue-10603Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/plugin-list/src/index.tsx(thelist-viewandlistregistrations'inputs/defaultProps), tests, one changeset ('@object-ui/plugin-list': patch, orminorwith a BREAKING body if a published registration input is removed). Stop on breach and explain it in the reportContainer & model:
S,mode:subagent,model: opus—dispatch-gates --tier: 「no path-derived mandate … floor sonnet · default opus · ceiling fable」; executes the card's inherited ruling: objectui#74705809231477(maintainer 「同意」, 「Ruled: align the registration to the contract.」), in the form of PRs objectui#10390 / objectui#10508, with the card's stop rule: a metadata-tier face that still declaresobjectName/viewTypewhile the react tier retired them ⇒ stop and report, ⛔ exit (b) is not taken hereClause-②: yes
Thread-read: none
Serial constraints cleared: objectui#8510's half (PR objectui#10600) is merged. Open-PR file lists read 2026-09-25T12:40Z: no open PR touches
packages/plugin-list/src/index.tsx.check-governed-queue-guard.mjs --test: NOT GOVERNED.Clause-②: yes— the designer's declared input set forlist-view/listnarrows to the contract's spellings; the renderer's read order is unchanged (the objectui#7477 fold keeps reading both).Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
os-dev-report
{ "issue": 10603, "status": "needs_decision", "branch": "claude/issue-10603-list-view-registration-inputs", "pr": null, "session": "session_014mXUNuFomfj24w7s1pZzhN (mode:subagent, the dispatching seat's session)", "premise_still_valid": true, "summary": "Stopped at the card's own stop rule (dispatch H1): no code, no PR, no changeset. The metadata-tier face the `list-view` registration serves still declares both keys live: `@object-ui/types` `ListViewSchema` (the zod mirror) has `objectName: z.string()` REQUIRED and `viewType: ViewKindEnum.optional()`, and holds `type` as the `z.literal('list-view')` discriminator, while the react tier (`REACT_BLOCKS` in `@objectstack/spec` 17.4.0) retired both; the spec's own view-level `ListViewSchema` declares neither. A second semantic difference the card did not name: on this registration's face `type` cannot be the view-kind input at all (the html-tier compile refuses a `type` attribute as `forbidden-attr`, and the react tier parks an author's `type` under `specType`, ADR-0078), so 'data / type in their place' has no legal `type` half here. The card's motivating mechanism is gone: objectstack `28ce612` (objectstack#19921) retired `check:react-declaration-parity` and its baseline file (ADR-0082 D4 status line: retired 2026-09-18 by maintainer ruling on objectstack#17735) before this card was filed, so exit (b) has no baseline row left to widen. The card's title facts still hold (hence premise true); only its harm claim is stale. The card assignee (os-elon-musk) was already set and was not written.", "faces_measured": [ "(a) @object-ui/types ListViewSchema (zod mirror, the node schema of type 'list-view'): declares `objectName: z.string().describe('Object Name')` under the comment 'objectui-only object binding (spec binds via data.provider:'object'; migration deferred)', and `viewType: ViewKindEnum.optional().describe('View Type')` under 'Renamed spec `type` (view-kind)'; `type: z.literal('list-view')`. LIVE, objectName REQUIRED.", "(b) @objectstack/spec 17.4.0 ListViewSchema (ui, view level): shape has no objectName and no viewType; both are refused by name as unrecognized_keys. Declares `type` (view kind) and `data`.", "(c) REACT_BLOCKS ListView (schemaType list-view): summary '(the `objectName` / `viewType` aliases are retired)'; dataProps carry `type` and `data`; interaction `data` is required: true. RETIRED.", "(d) html tier (not named by the card; the registration's inputs ARE its save-gate contract, and objectstack's tracked sdui.manifest.json at 949e99b ships list-view with objectName required: true and viewType enum): the alias spelling compiles clean; the contract spelling is refused; a `type` attribute is a compile error.", "Stop rule verdict: (a) declares both keys live while (c) retired them, so this is the card's stop condition, verbatim: 'If the metadata tier still declares either key while the react tier retired it, that is a real semantic difference between two faces the same registration serves. Stop and report'." ], "hypotheses": { "H1": "Confirmed as the STOP gate: see faces_measured (a) through (d).", "H2": "Not reached (stopped at H1). The objectui#10390 / #10508 form was read: it dropped `required: true` from objectName and described a record-source one-of because the zod mirror already carried requireRecordSource on map / gantt / calendar. `ListViewSchema` carries no such refinement (objectName is required), so that form is not available here without a contract change first.", "H3": "Fold untouched and live at head b1030c71a: `normalizeListViewSchema` (@object-ui/core) gap-fills objectName from `data.provider === 'object'` and reads the author's kind via `readListViewKind(s.specType) ?? readListViewKind(s.type)` into viewType.", "H4": "No registry-parity test or snapshot in objectui pins list-view inputs (git grep of 'list-view' with 'inputs' over tests: zero hits). html-tier suites that compile through the live registration with an objectName attribute on the list-view tag: htmlTierColumnSpellings-6598, htmlTierListViewDefaultColumns-6598 (plugin-list), inert-expression-6598 and literal-subset-6614 (sdui-parser), htmlTierDataSourceInputDeclaration-6678 (console).", "H5": "Readers of these inputs: the html-tier compile in page.tsx (`getJsxManifest` builds the whitelist from ComponentRegistry meta inputs) and objectstack's tracked sdui.manifest.json, read by packages/cli/src/utils/sdui-manifest.ts. Producers of the keys on list-view nodes: ObjectDataPage and InterfaceListPage (app-shell) and ObjectView (plugin-view) all stamp objectName and viewType.", "H6": "Not reached (no change)." }, "tests": "No diff, so no gate was run: worktree clean, branch == origin/main b1030c71a. Gates: NOT MEASURED, reason: zero-file diff. One-time probes (not kept, files deleted, git status clean after each): [1] tsx over packages/types/src/zod/objectql.zod.ts: ListViewSchema shape objectName opt=false desc 'Object Name'; viewType opt=true; node {type 'list-view', data {provider 'object', object 'x'}} gives success false, invalid_type at [objectName]; node {type 'list-view', objectName 'x', viewType 'kanban'} gives success true; control viewType 'zzz' gives invalid_value at [viewType]; node {type 'kanban', objectName 'x'} gives invalid_value at [type], expected 'list-view'. [2] node over installed @objectstack/spec 17.4.0 ui.ListViewSchema: shape objectName ABSENT, viewType ABSENT; safeParse with objectName gives unrecognized_keys [objectName]; with viewType gives unrecognized_keys [viewType]; lit control zzzBogus gives unrecognized_keys [zzzBogus]. [3] vitest single file in plugin-list under os-verify-lock ('VERDICT command-exit 0, held the lock 12s'; 'Test Files 1 passed (1)'): live ComponentRegistry inputs for list-view and view:list = objectName string required, viewType enum, columns, filter, sort, options, dataSource; list-view defaultProps objectName '' and viewType 'grid'. sdui-parser compile against the manifest built exactly as page.tsx builds it: list-view tag with objectName + viewType gives ok=true, zero diagnostics; list-view tag with a data object-provider binding only gives ok=false, [error missing-required-prop objectName, warning unknown-prop data]; list-view tag with objectName + type 'kanban' gives ok=false, [error forbidden-attr: 'on this tier the tag name IS the component']; lit control zzzBogus gives warning unknown-prop. [4] objectstack origin/main 949e99b: `git cat-file -e` of packages/spec/react-declaration-parity.baseline.json exit 128; positive control scripts/check-sdui-lockstep.mjs exit 0; `merge-base --is-ancestor 28ce612` exit 0 (exit 0 self-proves on the shallow checkout).", "files_changed": [], "deviations": [ "No PR, no pr_create, no label-write (PR assignee) and no changeset: the card's stop rule fired, so the write budget used is the empty-branch git push plus this one comment.", "The empty branch claude/issue-10603-list-view-registration-inputs stays on origin at main's b1030c71a: ref deletion is refused by the agent proxy (objectui AGENTS.md, objectui#6756). Left for the seat.", "Role file read at objectstack origin/main 949e99b, newer than the a4ca69a the order names.", "Citations are by symbol and quoted string, not path:line: objectui AGENTS.md #11 bans line addresses in card bodies, so the order's line addresses are not repeated." ], "mcp_calls": "0", "api_writes": "1: POST /repos/objectstack-ai/objectui/issues/10603/comments (this os-dev-report, via scripts/pm/post-stamped.mjs). Plus git push of the empty branch (not REST).", "open_questions": [ { "question": "The list-view / view:list registration serves the html and metadata tier. That tier's declared contract is objectName (required) plus viewType, and `type` is the component discriminator there. The react tier has retired both keys, and the parity ratchet that motivated this card is retired too. What happens to objectui#10603?", "options": [ "A. Close as not planned and change nothing. The inputs are the html/metadata tier's declared contract (objectui ListViewSchema and the shipped sdui.manifest.json), and the react-tier retirement does not bind that tier. BUSINESS: all three live producers of this face stamp objectName/viewType (ObjectDataPage, ObjectView, InterfaceListPage), html-tier sites write objectName, and zero html or metadata list-view sites write a data binding (census of both repos). LONG-TERM: this is not a workaround, since declaration equals enforcement on this tier. The two-tier spelling split is the zod mirror's named 'migration deferred', not something new. AI-SAFETY: the react spelling on the html tier is refused loudly at the save gate (missing-required-prop error, forbidden-attr for type). Nothing is silently tolerated. STARTUP: zero new surface, zero gates, zero cost.", "B. Record-source one-of, contract-first, in the objectui#7470 form. First a @object-ui/types contract card makes ListViewSchema.objectName optional under a requireRecordSource-style refinement (data object provider or objectName). Then the registration drops required on objectName and declares data as type object. viewType stays declared, because this face has no legal alternative spelling. BUSINESS: no measured author writes data on this tier (zero sites), so the demand is speculative. LONG-TERM: it moves the binding toward the spec-canonical data, but as a SECOND accepted spelling. It also widens the published sdui.manifest.json contract (Clause-2 yes, contract review). AI-SAFETY: one tier accepting two spellings is the consumer-side tolerance this axis disfavours. STARTUP: a dual-spelling window with no named external user defaults to no.", "C. Full retirement on the metadata tier: tombstone objectName/viewType on the list-view node face, then migrate the three host producers, the html pages, the docs and the objectstack CLI manifest. It also needs a NEW view-kind key for the SDUI node, because `type` is the discriminator (ADR-0078). That naming decision does not exist today, and objectui#2231 and #2890 are both closed. BUSINESS: no pull measured; the host is the only producer and it works. LONG-TERM: a single vocabulary is the right end state, but it needs a new name and a cross-repo migration. AI-SAFETY: the best end state (one spelling, loud tombstones). STARTUP: the largest expansion, cross-repo, and not justified without pull." ], "recommendation": "A. BUSINESS: every live producer of this face writes the kept spelling and none writes the retired one. LONG-TERM: on the html/metadata tier the declaration equals the enforcement, and the split is an existing named deferral, not a new workaround. AI-SAFETY: the html save gate already refuses the react spelling loudly, while B would add tolerance. STARTUP: A adds no surface, and the only pressure on this card (the declaration-parity ratchet) was retired by maintainer ruling on objectstack#17735. If the maintainer wants the one-vocabulary end state, that is C as its own spec-first card, not this one." } ], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Sep 25, 2026
待维护者裁决 —
list-view/list注册的objectName/viewType输入:本卡停止条件已触发domain:ui席位 #2,session_014mXUNuFomfj24w7s1pZzhN。dev 报告5832550920(needs_decision,无代码、无 PR)。以下事实席位已自行复核,不是转述:@object-ui/types的 zod 镜像ListViewSchema(packages/types/src/zod/objectql.zod.ts)写着objectName: z.string()(必填,注释「objectui-only object binding … migration deferred」)和viewType: ViewKindEnum.optional()(注释「Renamed spectype(view-kind)」);type在这一层是判别字面量z.literal('list-view')。@objectstack/spec17.4.0REACT_BLOCKS的 ListView 摘要写明「theobjectName/viewTypealiases are retired」。needs-user-decision.」28ce612(objectstack#19921)已在本卡立卡之前退役了check:react-declaration-parity及其基线文件(objectstackorigin/main上该基线does not exist)。所以出口 (b)「放宽基线行」已没有行可放宽。type根本不能充当视图种类输入。编译器把type属性判为forbidden-attr,react 层把作者的type停放为specType(ADR-0078)。所以「以data/type取代」在这里没有合法的type那一半。三个方案(沿四条评估轴)
A. 不改,按 not planned 关卡(dev 推荐,席位同意)
ObjectDataPage、InterfaceListPage,plugin-viewObjectView)都写objectName/viewType;两个仓里 html / 元数据层的list-view写data绑定的站点为 0(dev 普查)。missing-required-prop报错,type报forbidden-attr),没有静默容忍。B. record-source 二选一(objectui#7470 的形式):先开一张
@object-ui/types契约卡,把ListViewSchema.objectName改为可选并加requireRecordSource式细化,再让注册去掉objectName的required、声明data。data,需求是投机性的。data走,但它是第二个被接受的拼写,并会放宽已发布的sdui.manifest.json契约(Clause-② yes)。C. 元数据层全面退役:墓碑化
list-view节点上的objectName/viewType,迁移三个宿主生产者、html 页面、文档和 objectstack CLI manifest。还需要为 SDUI 节点另起一个视图种类键名(type是判别字,ADR-0078),而这个命名今天并不存在(objectui#2231、#2890 均已关闭)。席位推荐:A
理由沿四轴:这一面的全部活生产者都写保留的拼写、无人写退役拼写(业务);该层声明即强制,分裂是已具名的延期而非新 workaround(长远);html 保存闸门已响亮拒绝 react 拼写,而 B 会引入宽容(防 AI 写错);A 零新增面,而本卡唯一的压力源(声明一致性棘轮)已由维护者在 objectstack#17735 裁定退役(创业阶段)。若维护者想要单一词汇终态,那应作为 C 单独开一张 spec-first 卡,不在本卡内做。
状态
pm:dispatched摘除,挂needs-user-decision,退出活动队列。dev 的空分支claude/issue-10603-list-view-registration-inputs仍停在origin上的 mainb1030c71a:代理拒绝删 ref(objectui#6756),留待有权限者清理。⛔ 席位不代裁。Generated by Claude Code
objectstack-fleet commentedon Sep 27, 2026
Ruling: batch #225 item 4 · letter A · maintainer 「其他同意」 2026-09-27T02:34Z
Director seat, summon #30,
session_01AsCNgFBs8HCjwhyHQsFbx3. Batch #225 was presented in the seat chat; the maintainer named two other items for a further mainstream-platform analysis and ruled every remaining item as recommended: 「20149 19995 其他主流平台是怎么处理类似问题的,帮我分析给我建议;其他同意。」Ruled: A — no change; closed
not_planned. Thelist-view/listregistrations'objectName(required) andviewTypeinputs are the html / metadata tier's declared contract and stay.Readings this ruling rests on (re-verified on objectui
origin/main5c61e52and objectstackorigin/main8d1f7ab785):packages/types/src/zod/objectql.zod.ts, thelist-viewnode:objectName: z.string()required,viewType: ViewKindEnum.optional(), andtype: z.literal('list-view')is the discriminator.@objectstack/specpackages/spec/src/ui/react-blocks.ts, the ListView summary: 「theobjectName/viewTypealiases are retired」 — the react tier only.type=attribute on the html tier is refused loudly and 「specType别名不引入 html tier」, so 「data/typein their place」 has no legaltypehalf on this tier.sdui.manifest.json.Why not B or C: B accepts two spellings on one tier (consumer-side tolerance, with zero measured authors writing
dataon this tier); C is the one-vocabulary end state, but it needs a view-kind key name that does not exist today (objectui#2231 and objectui#2890 are closed) and a cross-repo migration with no pull. If the maintainer wants that end state later, it is a spec-first card that names the key, not this one.State after this ruling:
needs-user-decisionremoved, assignee cleared, closednot_planned. The dev's empty branchclaude/issue-10603-list-view-registration-inputsat mainb1030c71astays on origin for a hand with delete rights (objectui#6756).Generated by Claude Code