Repository navigation
finding(docs/console): five in-repo author sites still write the react-tier ListView objectName / viewType spelling objectstack#14791 retires, and list-view's designer inputs turn registry-only under the parity ratchet #8510
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentationdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seat
on Sep 8, 2026 分诊路由 —
domain:ui·pm:blocked·priority:p3· type Task⛔ 本席是分诊席(
claude-opus-5):不认领、不派发、不写码、不合并、不裁决决策箱卡。以下只是定级与路由。状态 —
pm:blocked,对 GitHub 现验过阻塞卡objectstack-ai/objectstack#14791 state: OPEN labels: bug, priority:p2, pm:dispatched, domain:spec, needs:contract-review └─ closed_by_pull_requests: PR #16777 state: OPEN ← 未合并 "feat(spec)!: retire the ListView objectName / viewType react-tier aliases"⇒ 阻塞未满足,
pm:blocked成立。⚠️ 解锁判据是 #14791 关闭 / PR #16777 合并,⛔ 不是「PR 开出来了」。⭐ 在那之前落地本卡是有害的,不只是早。 今天
objectName/viewType仍是published contract 上的合法拼法(虽已 deprecated);若现在就把五处改成data={{provider:'object', object}}/type,而 #16777 又因契约评审改道(它带needs:contract-review,且 #14791 正文里 A/B 两条岔路的推荐方向是 A —— 撤销弃用),那么这五处就会变成「教一个被撤销了的拼法」,方向正好反过来。⇒ ⛔ 不要抢跑。复核 —— 五处作者站点在
origin/main f76f4362上逐处命中content/docs/guide/react-pages.md:42 <ListView objectName=\"showcase_project\" fields={['name','status']} … content/docs/guide/react-pages.md:108 object is `<ListView viewType="kanban" …>`, or `<Block type="object-kanban" …>`. content/docs/guide/react-pages.md:134 | `<RecordRelatedList>` | `<ListView objectName="child_object" filters={…} />` … content/docs/guide/react-pages.md:199 <ListView objectName="showcase_project" fields={['name','status']} pagination={…} /> apps/console/src/sdui-workbench-preview.tsx:111 <ListView key={reloadKey} objectName="showcase_project" fields={[…]} navigation={{mode:'none'}} … />✅ 五处全部成立,行号一处未动。卡自己的对照也重取确认:
git grep -c "provider === 'object'" -- packages/core/src/utils/normalize-list-view.ts= 2 ⇒ fold 在、grep 是活的。⭐ 卡把
packages/plugin-list/README.md:200的ListViewSchema['viewType']主动排除(那是组件 schema 类型,不是 react-tier prop)。本席确认这个排除是对的 —— 这正是「按键的身份普查,不按词面普查」的正确做法,⛔ 换个不小心的人会把它一起改掉。第二半的两处 designer inputs 也确认:
packages/plugin-list/src/index.tsx的:76-77与:109-110各声明{ name: 'objectName', required: true }与{ name: 'viewType', type: 'enum' }。✅车道 —
domain:ui(⚠️ 与直觉相反,理由写全)按 2026-08-21 裁定,落点分三流,判据是修复落地的包:
content/docs/guide/react-pages.md—— 裁定写「docs 随所记录的面走」。这四处记录的是怎么写一个 ListView react block,那是packages/plugin-list在本仓的产品面;apps/console/src/sdui-workbench-preview.tsx—— apps,裁定明列归domain:ui;packages/plugin-list/src/index.tsx(第二半)—— 发布库,归domain:ui。
⇒ 三处落点无一落在
packages/types的契约两面,而本仓domain:spec一贯覆盖的正是那两面(#8347 / #8338 / #8367 / #8516 / #8517 同族)。⇒domain:ui。⛔ 不判
domain:spec,尽管契约在动。 契约的移动发生在 objectstack(packages/spec+packages/lint,那边已是domain:spec且已派发)。本仓这张卡是那次移动的跨仓合规清扫,落点全在本仓的 UI 面。裁定「症状位置不改流向」的对偶也成立:上游位置也不改流向。定级 —
priority:p3⛔ 运行期完全不受影响 —— 卡自己说得很清楚,渲染器直接读
objectName,所以这五处今天和 #16777 之后都照常渲染。会红的只有objectstack validate的react-prop-retired。⇒ 伤害是「文档与一处 in-repo 作者站点教了一个校验器会拒的拼法」,是合规/一致性问题,不是缺陷。p3。
⚠️ 重定级触发(写死): 若 #16777 落地后,react-prop-retired进入本仓任何一条必经门(CI 里跑objectstack validate覆盖content/docs或apps/console),使这五处把主干点红,则抬至 p2 —— 届时它从「文档过时」变成「阻塞合并」。⛔ 第二半必须拆卡,不要塞进同一个 PR
卡的后半(
list-view的两个 designer inputs 在 parity ratchet 下变成registryOnly)与前五处不是一回事:- 前五处 = 机械的拼写替换,处方卡里已经给全(含 item 3 保留 related-list 形状的那条),⛔ 无需任何裁定;
- 后半 = 卡自己写着 "Two honest exits … Not decided here",而且其中一条出口(widen the objectstack baseline row)落在 objectstack,不在本仓。
⇒ 承接者请只做前五处,后半另开一张(本席建议开在本仓、
domain:ui,正文照抄卡的 (a)/(b) 两条出口并注明 (b) 需跨仓)。理由是那道门是 on-demand 的(要pnpm sdui:manifest跑真浏览器),⛔ 不在 CI 里,所以它不会阻塞前五处,也不该被前五处拖着。⚠️ 若承接者判断 (a)(在本仓退掉两个 designer inputs)需要产品拍板,那张拆出来的卡挂needs-user-decision,⛔ 不要让确定的五处陪着一起等。type = Task
⛔ 不是 Bug:本仓无任何已声明契约被违背 —— 违背发生在 #16777 落地之后,且发生在 objectstack 侧的校验器判定里;本仓这五处今天完全合法。⛔ 也不是 Feature:不扩任何接受集。⇒ Task。
Generated by Claude Code
objectstack-fleet commented
on Sep 24, 2026 ContributorMore actionsUnblocked — status reading for the next dispatch. Director seat, summon #29 (
session_01EcrTi7s5oDYPHS4Pi7h31d), 2026-09-24T07:48Z, taken during UI closure batch 5, where the maintainer answered 「同意」 to keeping this card. ⛔ No label, grade or assignee change.- Upstream objectstack#14791 is closed
completed, so theBlocked-by:line in the body is discharged. - Read on objectui
origin/main62597c5: all five author sites still write the retired react-tier spellings (content/docs/guide/react-pages.md:42,:108,:134,:199;apps/console/src/sdui-workbench-preview.tsx:111). - The deliverable is unchanged: rewrite them as
data={{ provider: 'object', object: '…' }}andtype. First act on claim: confirm the retirement ships in the@objectstack/specversion objectui installs (react-prop-retired), so the docs teach the spelling the installed validator enforces.
Generated by Claude Code
- Upstream objectstack#14791 is closed
objectstack-fleet commented
on Sep 25, 2026 ContributorMore actionsClaim: PM loop round 1 —
domain:uiexecution seat
Session:session_01BA3nKVUwKQJf8DBxrSVtNC
Branch:claude/issue-8510-react-listview-spelling
Worktree:objectui-issue-8510
Domain:domain:ui
Seat:domain:ui#1
File surface:content/docs/guide/react-pages.md(the four ListView sites the body names,:42,:108,:134,:199only),apps/console/src/sdui-workbench-preview.tsx(the ListView at:111only), any test that pins that preview source, and one.changeset/8510-…mdonly if the changeset gate asks for one (stop on breach; explain in the report)
Container & model:S,mode:subagent,model: opus(default judgement tier) —priority:p3documentation: five in-repo author sites teach the react-tier ListView spelling the installed validator refuses
Clause-②: no
Thread-read: 5810028260
Serial constraints cleared: open-PR file lists read 2026-09-25T10:26Z. No open PR and no live claim touchescontent/docs/guide/react-pages.mdorapps/console/src/sdui-workbench-preview.tsx. The upstream block objectstack#14791 is closedcompleted(director seat5810028260).Scope
The director seat (
5810028260): 「The deliverable is unchanged: rewrite them asdata={{ provider: 'object', object: '…' }}andtype. First act on claim: confirm the retirement ships in the@objectstack/specversion objectui installs (react-prop-retired), so the docs teach the spelling the installed validator enforces.」- The seat's reading: objectui's lockfile resolves
@objectstack/specand@objectstack/lintto17.4.0, and both packages'17.4.0CHANGELOG sections namereact-prop-retired. Confirm it in the installed package. If the rule is absent, stop and report. - Rewrite items 1–5 exactly as the body's Prescription says. Item 3 keeps the related-list shape.
- ⛔ The body's second half, the
list-viewregistryinputsinpackages/plugin-list/src/index.tsx(exits a / b), is 「Not decided here」 and is not in this card. Report its current state as an out-of-scope finding. - Proof: the rewritten preview still renders the list through the existing fold (
normalizeListViewSchema), and no retired spelling is left at the five sites (with a live control).
⇒
Fixes #8510.domain:uiseat #1 ·session_01BA3nKVUwKQJf8DBxrSVtNC· claim · 2026-09-25T10:34Z- The seat's reading: objectui's lockfile resolves
objectstack-fleet commented
on Sep 25, 2026 ContributorMore actionsos-dev-report
{ "issue": 8510, "status": "done", "branch": "claude/issue-8510-react-listview-spelling", "pr": "https://github.com/objectstack-ai/objectui/pull/10600", "session": "session_01BA3nKVUwKQJf8DBxrSVtNC — harness-stamped id of this run (subagent: the parent PM session's id; container CLAUDE_CODE_REMOTE_SESSION_ID cse_01BA3nKVUwKQJf8DBxrSVtNC)", "premise_still_valid": true, "summary": "First act on claim done: the retirement ships in what objectui installs. @objectstack/spec and @objectstack/lint resolve to 17.4.0, the installed lint exports and fires react-prop-retired, and the installed REACT_BLOCKS ListView entry carries data/type and neither alias. Rewrote the card's five sites to data={{ provider: 'object', object: '…' }} / type (the related-list row keeps its filters shape), and also one census hit the card predates: the 'Written out, that source is:' JSX copy of the :42 source, at react-pages.md:54 on f5178a272. Added a console pin beside the preview (renders the extracted crm_workbench source through the real react tier, and ListView binds showcase_project through the objectui#7477 fold; strip control; lint react-prop-retired sweep with a put-back control) and an empty-frontmatter changeset, which the presence gate asked for. Seat notes: claim 5830977123 confirmed with a matching branch; assignee was already os-bill at hand-off and was not touched. The claim's file surface said the four doc sites 'only', and the fifth site was added under the dispatch's census clause and listed in the PR body. PR line 1 is 'Fixes #8510' as dispatched, so the card body's undecided second half (list-view registry inputs, first out_of_scope_findings entry) needs its split card filed before #10600 merges, or it closes with #8510. The harness attribution reminder asked for a model-named Co-Authored-By trailer and a claude.com PR footer; I followed the dispatch and os-dev contract instead (model-free trailer pair, session-URL footer).", "tests": "Premise: installed @objectstack/spec@17.4.0 and @objectstack/lint@17.4.0 (the lockfile's only resolution for each; both 17.4.0 CHANGELOG sections name react-prop-retired). The installed REACT_BLOCKS ListView entry has dataProps [type,data,columns,sort,…] and interactions [data (required), filters, navigation, onRowClick, onNavigate, fields, options], with no objectName/viewType prop; the only mention is the summary sentence saying they are retired. Lint probe, one-time, installed validateReactPageProps over 6 sources (preview source cooked, doc JSON page, its written-out copy, 3 inline doc snippets with the … elision filled by a data binding): base f5178a272 {react-prop-retired: 6}; head 1bc5466b5 {} (0 findings of any rule). New pin apps/console/src/__tests__/sdui-workbench-preview-listview-binding-8510.test.tsx: 5/5 passed. Ablation, one-time, direction predicted first as 'only the positive render case red': in the normalize-list-view.ts data.provider==='object' leg, anchor count 1, marker after mutation 1, 2 diff lines. core and plugin-list alias to src in the console project, so no build was involved. Result: 'Tests 1 failed | 4 passed (5)'. The failing case was 'renders the ListView bound to showcase_project through the data-source fold' (expected 0 to be greater than 0: the view was never handed a bound object); the strip control and both lint cases stayed green. Restored with git checkout HEAD --; the restored blob hash equals HEAD's 2cb793505300, and git diff HEAD was empty. At HEAD 1bc5466b5: pnpm exec vitest run apps/console/ gave Test Files 117 passed (117), Tests 1277 passed (1277); 117 equals the tracked console test files, pin included. turbo run build --filter='@object-ui/console^...' (34/34 tasks) then pnpm --filter @object-ui/console type-check: exit 0. Its first run caught TS6133 in the new test, so it covers that file. eslint on the 2 touched .tsx files: 0 errors. The pin has 0 warnings; the preview's 7 no-explicit-any warnings are on untouched lines (7 at base f5178a272 too). Other gates: check:control-bytes OK (8686 files). check:new-line-citations: 0 new. check-changeset-presence OK with the empty-frontmatter declaration. check:changeset-claims exit 0; 5 pending changesets name touched files, each read, none falsified. Docs gates, all exit 0: check:doc-types, check:doc-snippets (674/674 judged, 0 failed; the first run was PREREQUISITE NOT MET until its own --build-filter build), check:doc-examples, check:doc-fences, check:doc-example-ids, check:doc-example-readers, docs:check-links, check:spec-symbols, check:docs-route-closure. NOT MEASURED: built console dist grep for the preview. Reason: no dist on this box, and a full console build is disproportionate for this check. Static reading instead: vite rollupOptions declares no input (entry index.html only), and the preview's only importer is apps/console/sdui-workbench-preview.html. NOT MEASURED: the check-links.yml workflow. Reason: left to CI; the diff adds or changes no link. CI: not awaited; in_progress at report time.", "mcp_calls": "0 — no MCP GitHub tool called (reads went through single-card REST GETs, writes through the fleet relay)", "api_writes": "2 — (1) relay pr_create: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write run 36127313220, success) executing POST /repos/objectstack-ai/objectui/pulls, draft, which opened #10600, body read back byte-identical; (2) relay post-stamped: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/8510/comments. git push is not REST. Zero label writes.", "open_questions": [], "out_of_scope_findings": [ "class: b · The card body's second half, still live on f5178a272: packages/plugin-list/src/index.tsx:76-77 declares list-view inputs { name: 'objectName', type: 'string', required: true } and { name: 'viewType', type: 'enum' }, :109-110 declares the same on the 'list' alias, and :84-85 sets defaultProps objectName: '' / viewType: 'grid'. Contract text in 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).' Seam: spec:REACT_BLOCKS[ListView] (data, type) → renderer:plugin-list list-view / list registration inputs (objectName required, viewType). The card calls it 'Not decided here' (exits a/b), and triage 5580304720 asked for a split card in this repo, domain:ui. Untouched here. Needs filing before #10600 merges, because Fixes #8510 closes the card that carries it. Dedupe words: list-view inputs objectName viewType · registryOnly react-declaration-parity ListView · plugin-list designer inputs retired alias", "carrier: 承接者:无 · Three test fixtures in packages/components mount a react page whose ListView writes the retired objectName spelling: react-page-adapter.test.tsx (one) and react-page-scope.test.tsx (two). They exercise scope and adapter plumbing, which renders either spelling, and they are outside the card's census (content/docs/**, apps/**). Not a/b/c. Noted in PR #10600 Acceptance notes, not filed." ] }
Generated by Claude Code
objectstack-fleet commented
on Sep 25, 2026 ContributorMore actions✅ ACCEPT — PR objectui#10600 at
1bc5466b5· entering the merge queue once CI is greendomain:uiseat #1,session_01BA3nKVUwKQJf8DBxrSVtNC. The seat read the dev report and the diff against the director seat's unblock5810028260, the triage5580304720and the claim5830977123. No review-tier record is owed, becauseClause-②: noholds: documentation and a dev-server-only console harness page, with no export, prop or accept set moved.Implemented-by: claude/issue-8510-react-listview-spelling Reviewed-by: session_01BA3nKVUwKQJf8DBxrSVtNCitem reading shape draft · base main·Fixes #8510·Clause-②: noat line start · 4 files (+211 / −6)first act on claim The retirement ships in what objectui installs. @objectstack/specand@objectstack/lintresolve to17.4.0(the lockfile's only resolution), the installed lint exports and firesreact-prop-retired, and the installedREACT_BLOCKSListView entry carriesdata/typeand neither aliasthe rewrite The five sites the card names, exactly as its Prescription says (item 3 keeps the related-list filtersshape). One census hit the card predates: the written-out JSX copy of the:42source (react-pages.md:54), listed in the PR body. The seat read the diff line by line: onlyListViewsites changed, andObjectForm objectName=is correctly left as it isproof The installed validateReactPagePropsover 6 sources:{ react-prop-retired: 6 }on base,{}at head. The new console pin renders the preview's extracted source through the real react tier, and ListView bindsshowcase_projectthrough the objectui#7477 fold (5/5). Ablation: the fold'sdata.provider === 'object'leg removed turns only the positive render row red, and the tree was restored by blobtests + gates apps/console/117 files, 1277 tests pass. The console type-check passes after the closure build. eslint on the touched.tsxshows 0 errors and no new warning. Control bytes, new line citations, changeset presence (an empty-frontmatter declaration, which the gate accepts), changeset claims and nine docs gates (doc-types,doc-snippets674/674,doc-examples,doc-fences,doc-example-ids,doc-example-readers,docs:check-links,spec-symbols,docs-route-closure) exit 0Out-of-scope items — each one routed
- The card body's second half, the
list-view/listregistrationinputs(objectNamerequired,viewType) atpackages/plugin-list/src/index.tsx:76-77/:109-110, which the card leaves 「Not decided here」 ⇒ split into objectui#10603 before this PR closes the card, at the triage's direction (5580304720). It inherits the objectui#7470 ruling5809231477(align the registration to the contract), with a stop condition if the metadata and react tiers really disagree. - Three
packages/componentstest fixtures (react-page-adapter.test.tsx, one;react-page-scope.test.tsx, two) mount a react page whose ListView writes the retiredobjectName. They exercise adapter and scope plumbing that renders either spelling, and sit outside the card's census (content/docs/**,apps/**) ⇒ PR Acceptance notes. 承接者:无.
domain:uiseat #1 · review · 2026-09-25T11:16Z- The card body's second half, the
- added a commit that references this issue
on Sep 28, 2026
Blocked-by: objectstack-ai/objectstack#14791
Filed unassigned, unlabelled, from the objectstack
domain:specdev seat executing objectstack#14791 (sessionsession_016N6xmWt5hYm94ffVEwGH8x), as the cross-repo census that ruling ordered: a live external author site of the retired spelling is a fork to report, not a reason to keep the spelling.What changes upstream (objectstack#14791, maintainer ruling 2026-09-07, option B, no deprecation window)
The react-tier component contract (
REACT_BLOCKSin@objectstack/spec/ui) retires the ListView block'sobjectNameandviewTypeoverlay props. The only spellings are ListViewSchema's owndata={{ provider: 'object', object: '…' }}andtype.@objectstack/lintrefuses the retired spellings on akind:'react'page with a newreact-prop-retirederror (the generated contract,skills/objectstack-ui/references/react-blocks.md, drops both rows). The consumer half already ships in this repo (normalizeListViewSchemafoldsdata.provider === 'object'ontoobjectNameand reads the author'stype— objectui#7477, in console pina472b071), so both spellings render today; only the contract and the validator move.What in THIS repo still writes the retired spelling (measured at objectui
61e649ab, 2026-09-08)Census by key identity — only the react-tier ListView block prop counts; the metadata-tier
objectNamethe host stamps, nav items, action targets and the component-schema key are out of scope and untouched:content/docs/guide/react-pages.md:42— the workedkind:'react'page source writesListView objectName="showcase_project".content/docs/guide/react-pages.md:108— prose: "ListView viewType="kanban" …" selects the visualization.content/docs/guide/react-pages.md:134— theRecordRelatedListreplacement row prescribesListView objectName="child_object" filters=….content/docs/guide/react-pages.md:199— a second sample writesListView objectName="showcase_project" ….apps/console/src/sdui-workbench-preview.tsx:111— the workbench preview's react page source writesListView key={reloadKey} objectName="showcase_project" ….Control:
git grep -c "provider === 'object'" HEAD -- packages/core/src/utils/normalize-list-view.ts= 2, so the fold is present and the grep is live;packages/plugin-list/README.md:200(ListViewSchema['viewType']) is the component-schema type, not the react-tier prop — out of scope.After objectstack#14791 merges, items 1–5 teach or author a spelling the published contract rejects (
react-prop-retiredunderobjectstack validate) — a contract violation in the docs and one live in-repo author site. Runtime is unaffected: the renderer still readsobjectNamedirectly, which is exactly why the lint, not a crash, is the only thing that would ever surface it.The second half — registry inputs vs the spec (
check:react-declaration-parity)packages/plugin-list/src/index.tsx:76-77and:109-110declareobjectName(required) andviewTypeas designerinputsoflist-view. Objectstack's parity ratchet judges registry inputs against node-level keys ∪ the spec block props ∪ the react overlay; with the overlay rows gone, both inputs becomeregistryOnlyfor ListView — the baseline row there is{ registryOnly: [] }today, and the gate is on-demand (it needspnpm sdui:manifestover a real browser at the pin), so it reds on the next manifest run, not in CI. Two honest exits, for the seat that owns this repo: (a) retire the two designer inputs here, since the metadata host stampsobjectNameand the fold supplies it fromdata— the objectui#7470 class, on plugin-list; or (b) widen the objectstack baseline row deliberately with the reason written down. Not decided here.Prescription
Items 1–5:
objectName="X"→data={{ provider: 'object', object: 'X' }},viewType="K"→type="K", on the ListView block only. Item 3 keeps the related-list shape:ListView data={{ provider: 'object', object: 'child_object' }} filters={['lookup_field', '=', parentId]}.Refs: objectstack#14791 (the ruling and the PR it dispatched) · objectui#7477 (the fold, closed) · objectui#2890 (the convergence carrier) · objectui#7470 (the adjacent registry-inputs finding on map/gantt).
Generated by Claude Code