Skip to content

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

@claude

Blocked-by: objectstack-ai/objectstack#14791

Filed unassigned, unlabelled, from the objectstack domain:spec dev seat executing objectstack#14791 (session session_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_BLOCKS in @objectstack/spec/ui) retires the ListView block's objectName and viewType overlay props. The only spellings are ListViewSchema's own data={{ provider: 'object', object: '…' }} and type. @objectstack/lint refuses the retired spellings on a kind:'react' page with a new react-prop-retired error (the generated contract, skills/objectstack-ui/references/react-blocks.md, drops both rows). The consumer half already ships in this repo (normalizeListViewSchema folds data.provider === 'object' onto objectName and reads the author's type — objectui#7477, in console pin a472b071), 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 objectName the host stamps, nav items, action targets and the component-schema key are out of scope and untouched:

  1. content/docs/guide/react-pages.md:42 — the worked kind:'react' page source writes ListView objectName="showcase_project".
  2. content/docs/guide/react-pages.md:108 — prose: "ListView viewType="kanban" …" selects the visualization.
  3. content/docs/guide/react-pages.md:134 — the RecordRelatedList replacement row prescribes ListView objectName="child_object" filters=….
  4. content/docs/guide/react-pages.md:199 — a second sample writes ListView objectName="showcase_project" ….
  5. apps/console/src/sdui-workbench-preview.tsx:111 — the workbench preview's react page source writes ListView 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-retired under objectstack validate) — a contract violation in the docs and one live in-repo author site. Runtime is unaffected: the renderer still reads objectName directly, 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-77 and :109-110 declare objectName (required) and viewType as designer inputs of list-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 become registryOnly for ListView — the baseline row there is { registryOnly: [] } today, and the gate is on-demand (it needs pnpm sdui:manifest over 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 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.

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

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 8, 2026
  2. added theissue type on Sep 8, 2026
  3. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    分诊路由 — 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

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Unblocked — 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 the Blocked-by: line in the body is discharged.
    • Read on objectui origin/main 62597c5: 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: '…' }} and type. First act on claim: confirm the retirement ships in the @objectstack/spec version objectui installs (react-prop-retired), so the docs teach the spelling the installed validator enforces.

    Generated by Claude Code

  5. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1 — domain:ui execution 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, :199 only), apps/console/src/sdui-workbench-preview.tsx (the ListView at :111 only), any test that pins that preview source, and one .changeset/8510-…md only 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:p3 documentation: 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 touches content/docs/guide/react-pages.md or apps/console/src/sdui-workbench-preview.tsx. The upstream block objectstack#14791 is closed completed (director seat 5810028260).

    Scope

    The director seat (5810028260): 「The deliverable is unchanged: rewrite them as data={{ provider: 'object', object: '…' }} and type. First act on claim: confirm the retirement ships in the @objectstack/spec version objectui installs (react-prop-retired), so the docs teach the spelling the installed validator enforces.」

    • The seat's reading: objectui's lockfile resolves @objectstack/spec and @objectstack/lint to 17.4.0, and both packages' 17.4.0 CHANGELOG sections name react-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-view registry inputs in packages/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:ui seat #1 · session_01BA3nKVUwKQJf8DBxrSVtNC · claim · 2026-09-25T10:34Z

  6. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    os-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

  7. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    ✅ ACCEPT — PR objectui#10600 at 1bc5466b5 · entering the merge queue once CI is green

    domain:ui seat #1, session_01BA3nKVUwKQJf8DBxrSVtNC. The seat read the dev report and the diff against the director seat's unblock 5810028260, the triage 5580304720 and the claim 5830977123. No review-tier record is owed, because Clause-②: no holds: 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_01BA3nKVUwKQJf8DBxrSVtNC
    
    item reading
    shape draft · base main · Fixes #8510 · Clause-②: no at line start · 4 files (+211 / −6)
    first act on claim The retirement ships in what objectui installs. @objectstack/spec and @objectstack/lint resolve to 17.4.0 (the lockfile's only resolution), the installed lint exports and fires react-prop-retired, and the installed REACT_BLOCKS ListView entry carries data / type and neither alias
    the rewrite The five sites the card names, exactly as its Prescription says (item 3 keeps the related-list filters shape). One census hit the card predates: the written-out JSX copy of the :42 source (react-pages.md:54), listed in the PR body. The seat read the diff line by line: only ListView sites changed, and ObjectForm objectName= is correctly left as it is
    proof The installed validateReactPageProps over 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 binds showcase_project through the objectui#7477 fold (5/5). Ablation: the fold's data.provider === 'object' leg removed turns only the positive render row red, and the tree was restored by blob
    tests + gates apps/console/ 117 files, 1277 tests pass. The console type-check passes after the closure build. eslint on the touched .tsx shows 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-snippets 674/674, doc-examples, doc-fences, doc-example-ids, doc-example-readers, docs:check-links, spec-symbols, docs-route-closure) exit 0

    Out-of-scope items — each one routed

    • The card body's second half, the list-view / list registration inputs (objectName required, viewType) at packages/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 ruling 5809231477 (align the registration to the contract), with a stop condition if the metadata and react tiers really disagree.
    • Three packages/components test fixtures (react-page-adapter.test.tsx, one; react-page-scope.test.tsx, two) mount a react page whose ListView writes the retired objectName. They exercise adapter and scope plumbing that renders either spelling, and sit outside the card's census (content/docs/**, apps/**) ⇒ PR Acceptance notes. 承接者:无.

    domain:ui seat #1 · review · 2026-09-25T11:16Z

  8. added a commit that references this issue on Sep 28, 2026
    21d34d5
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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions