Repository navigation
types: the list-view node face still judges the retired objectName / viewType spelling, so objectui validate refuses a ruled page list-view node (follows objectui#12099, ruling C) #12670
Description
Filing gate ① (a defect with reach). This card carries the @object-ui/types node-face half of ruling C (objectstack-ai/objectstack#22444, 6100463199); objectui#12099 keeps the registration and renderer half, in PR objectui#12668.
Reader who acts: the objectui seat triage routes this to; the face is packages/types, objectui's contract face. One PR. Filed by domain:ui seat 3 (session_01Vk15bz8xHtKGUfXfCm16h4) from the in-flight report 6215866081 on objectui#12099. ⛔ Not a claim. Lane and grade are triage's.
reach: objectui validate, a public authoring door. Measured on objectui main 8614705 by the objectui#12099 dev (report 6215866081, open question 1). The @object-ui/types zod ListViewSchema (what objectui validate, StrictAnyComponentSchema and check:doc-json judge) does three things:
- It refuses the ruled node, a
list-viewwhosepropertiescarrydata: { provider: 'object', object: 'X' }andtype: 'kanban'. Strict givesunrecognized_keysforpropertiesplusRECORD_SOURCE_REQUIREDatobjectName. - It refuses a flat data-only node.
- It accepts the flat
objectName/viewTypenode, which the renderer no longer reads once PR objectui#12668 lands (that node then draws the no-object hint).
So the authoring door steers an author, human or AI, from the ruled spelling back to the retired one. Its type is the 'list-view' discriminator literal, so the face cannot spell the list kind as type today.
The ruling this follows, verbatim: "C — the page carrier converges on the spec spelling; one list view has one set of property names wherever it is embedded." Also: "⛔ never by a fallback read in objectui."
Options, as measured by the dev:
-
A (the dev's recommendation): an authored page arm for
list-viewin the node union, on theObjectMapBlockSchemaprecedent (at: 'properties'):propertiesis judged against the spec list-view members by reference (data,type, …);- the record source is
data(object provider with an object) ordataSource.object; objectName/viewTypeare refused by name, with the react layer's retirement prescription ([finding] The #11284 convergence shipped only its producer half: the react-blocks contract deprecatesobjectName/viewTypeon ListView in favour ofdata={{ provider: 'object', object }}/type, and the lint blesses that spelling — but objectui's ListView reads neither, so the canonical spelling validates green and renders an empty list objectstack#14791);ListViewSchemastays the ListView component's props type.
Cost: one
@object-ui/typesPR (contract face,needs:contract-review), plus a census of the fixtures the face judges. -
B: wait for spec(ui):
ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them objectstack#22444'sComponentPropsMaprow, then mirror it by reference. Until thenobjectui validatecontradicts the runtime. -
C: converge the ListView component's props as well. Not possible while
ListViewSchema.typeis the discriminator; not recommended.
The seat's reading, on the four axes (for triage, not a ruling):
- Long-term soundness: A keeps the face derived from the spec by reference and in step with the runtime PR objectui#12668 ships; B leaves a known declared-but-not-enforced window.
- Preventing AI mistakes: A refuses the retired keys by name at validate; B accepts them and refuses the correct spelling.
- No scope spread: A reshapes an existing arm, adds no key and no gate, and retires the old spelling at once, as the ruling does.
- Real business need: no in-repo producer writes a page
list-viewtoday (the dev's census), butvalidateis the door an AI author runs.
Dedupe (objectui, open and closed):
- objectui#12099's timeline cross-references: 5 hits, none on this subject.
- REST list of every
domain:speccard, 298 rows, grepped forlist-view|ListViewSchema|viewType: 4 hits, all other subjects (types: exportedUnifiedViewConfig.chartstill declares the retired list-view chart axes, and threeobject-charttombstones still call them "the list-view chart block's spelling" #12063, finding(types):object-gridandlist-viewconditionalFormattingstill accept the native{ field, operator, value }rule and top-level colour keys the spec's list-view rule refuses ("migration deferred") #11533, finding(plugin-kanban): kanbanconditionalFormattingaccepts a native rule dialect the spec's list-view member refuses, blocking the spec from typing it #11522, decision(plugin-list):titleis read undeclared offListViewSchema— androwActionDefsis read at a site with NO docblock and NO pin, unlike the grid's ruled twin (6 of 7, objectui#8327) #8653). Positive control in the same corpus:types|zod|schema, 201 hits. - Dedupe words: list-view node face, ListViewSchema page arm, objectui validate properties.type, objectName viewType retired types.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
Triage: first grade,
bug·priority:p1·target:v18·domain:ui·pm:queue· scoped to option A · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T13:12ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
Why p1 +
target:v18: once PR objectui#12668 (objectui#12099, p1 +target:v18) lands, the renderer reads onlydata/type.objectui validatewould still refuse that spelling and accept the retired one. No pagelist-viewnode would then both validate and render, and the door an AI author runs would steer it to the retired spelling. A consumer follow-up is p1 when its absence breaks users, and this one does.Scope: option A, under ruling C as it stands. No new ruling is owed:
So: an authored page arm for
list-viewon theObjectMapBlockSchemaprecedent, withpropertiesjudged by reference,objectName/viewTyperefused by name with the retirement prescription, andListViewSchemaleft as the component's props type.needs:contract-review.Why
domain:ui:packages/typesis this repo'sdomain:specstream, but that seat ([PM seat] domain:spec @ objectui — ⏳ vacant #10217) is vacant, so a p1 there would wait unclaimed. The same face is routed todomain:uiby precedent (objectui#12464, objectui#5710, and objectui#12666 this round). The seat that holds objectui#12099 is the natural claimant.Serial notes:
packages/types/src/zod/, so check for overlap at the claim.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2
Session:
session_01Vk15bz8xHtKGUfXfCm16h4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12670-list-view-page-faceWorktree:
objectui-issue-12670Domain:
domain:uiSeat:
domain:ui#3File surface:
@object-ui/types, the authoring face of a pagelist-viewnode, on theObjectMapBlockSchemaprecedent (triage6216264566, option A):packages/types/src/zod/objectql.zod.ts(a new authoredlist-viewarm beside the other authored block arms, withrequireRecordSource(…, 'properties'); theListViewSchemaregion atrequireRecordSource('list-view', ['objectName'])only as far as the arm needs);packages/types/src/zod/index.zod.ts(where the node union is assembled);packages/types/src/authoring-nodes.tsandpackages/types/src/index.ts(the arm's node type and its export);packages/types/src/zod/README.md; tests beside each; the fixtures and docs that face judges (the census the card names); one.changeset/12670-*.md. After objectui#12099's PR #12668 lands and this branch mergesmain, also: thepackages/plugin-list/README.mdfence and itsdoc-json: fragmentdeclaration (the rider from ACCEPT6216347560, item 5). ⛔ No gate script without reporting it first (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover the named paths: no path-derived mandate; the review owed is set by the face, below)Clause-②: yes (narrowing)
Clause-② reason: the published authoring face (
objectui validate,StrictAnyComponentSchema,check:doc-json, all judged by@object-ui/types' zod node union) starts accepting the ruled page spelling, which widens it. It also refusesobjectName/viewTypeon a pagelist-viewnode by name, which narrows a published accept set. So the PR owes aCONTRACT_REVIEW_TIERreview of record before ready (triage:needs:contract-review).Ruling-ref: objectstack-ai/objectstack#22444 comment
6100463199(ruling C; the scope is triage6216264566, option A under C as it stands)Responsibility:
@object-ui/types' zodlist-viewarm (ListViewSchema, closed byrequireRecordSource('list-view', ['objectName']), nopropertiesmember) refuses the ruled page node and accepts the retired flat one | none: the renderer after PR #12668 reads onlydata/properties.type, and the spec'sComponentPropsMaprow (objectstack-ai/objectstack#22444) is objectstack's lint tier, notobjectui validate| every author, human or AI, who runsobjectui validateon a pagelist-viewnode. No in-repo producer writes one today (the census in ACCEPT6216347560), butvalidateis the door an AI author runs.Thread-read: 6216264566
Serial constraints cleared: PR objectui#12668 (objectui#12099, this seat,
pm:blockedon objectui#12649) lands first: accepting the ruled spelling before the renderer reads it would reverse the contradiction, and theplugin-listREADME rider waits for its text to reachmain. PR objectui#12678 (objectui#12666,baozhoutao) editspackages/types/src/zod/layout.zod.tsand threepackages/types/src/__tests__files; this surface keeps out oflayout.zod.ts, and if a shared census test is touched by both, whichever lands second mergesmain. Seat 1's objectui#12654 (claim6215663324, no PR yet) may touchpackages/types/src/**wherevisibleOn/visibilityare declared, a different region ofobjectql.zod.tsfrom thelist-viewarm and the authored arms; whichever lands second mergesmain. Read across the openpm:dispatchedlane claims and every open objectui PR's file list, 2026-10-16T13:27Z.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12670, "status": "done", "branch": "claude/issue-12670-list-view-page-face", "pr": "https://github.com/objectstack-ai/objectui/pull/12713", "session": "session_01Vk15bz8xHtKGUfXfCm16h4 — the dispatching seat's harness-stamped id (this run is its subagent)", "premise_still_valid": true, "summary": "Premise re-measured on the built dist at main dcd1041: the zod list-view arm refused the ruled page node (tolerant: RECORD_SOURCE_REQUIRED at objectName; strict: unrecognized_keys properties + the same) and accepted the flat objectName / viewType node. The arm is now ListViewBlockSchema, in ObjectQLPublicBlockComponentSchema on the authored-arm precedent: its properties bag is the flat ListViewSchema mirror's own members by reference (the installed spec 18.0.0-next.2 has no ComponentPropsMap['list-view'] row, so the object-chart construct), with the bag's `type` as the spec's view-kind enum and objectName / viewType refused by name, flat or in the bag, naming properties.data and properties.type; the record source is properties.data or a non-empty dataSource.object (RECORD_SOURCE_REQUIRED at properties.data otherwise); every other list view prop written flat is refused toward properties.KEY; the spec's checkListViewCalendarVisualization and checkListViewChartBinding and objectui's dataset-chart filter refusal run in the bag. ListViewSchema (zod and TS) is unchanged as the ListView component's props and left the zod ObjectQL union; ListViewBlockNode is exported; zod README and a `@object-ui/types: minor` changeset with the break in prose. The plugin-list README rider is pending (its text is PR #12668's, not on main), named in the PR's acceptance notes.", "tests": "At head fadb698: `pnpm exec vitest run --maxWorkers=2 packages/types/` → `Test Files 384 passed (384)` / `Tests 10494 passed (10494)` (lock VERDICT command-exit 0). Cross-package re-spelled pins + CLI suite (plugin-list ListView.calendarAliasRefused-8355 and ListView.strayGroupByRefused-8365, plugin-view ObjectView.calendarAliasRefused-8355 and ObjectView.strayGroupByLane-9242, app-shell ViewPreview.optionsFold-7928, plugin-map index.bareMapKeyRetired-10393, plugin-grid groupingNullEntry-7217, scripts/__tests__/check-handler-key-read-sites.test.ts, packages/cli/src/__tests__/) → `Test Files 37 passed (37)` / `Tests 524 passed (524)`. `pnpm --filter @object-ui/types type-check` (3 legs; tsc --listFiles shows the test leg includes the new pin and helper) exit 0 at fadb698. Before the re-spells, the move reddened 16 packages/types files / 135 tests (the census of pins judging the retired spelling at a door). Ablations via objectstack scripts/ablation-replace.mjs, direction predicted first, restore proven by blob == HEAD and empty `git diff HEAD`: (A) drop the bag's objectName refusal → predicted and observed 3 red (properties.objectName, flat objectName, no-fallback), 594 green; (B) arm the public-block union with ListViewSchema in place of ListViewBlockSchema → predicted and observed 94 red (every page-door leg across the new pin, list-view-options-bag-6152, spec-object-refinements-7715), 118 mirror-leg green. Type-level reverse check through a dist-resolving consumer (plugin-list's tsconfig replaces the root paths): a scratch file typing properties.objectName as ListViewBlockNode failed with TS2322 at that key while the ruled node compiled; file removed, tree clean. Built d.ts compared against a dcd1041 base build: same 78 files; adds ListViewBlockSchema and ListViewBlockNode, ObjectQLComponentSchemaInferred loses its list-view arm, ObjectQLPublicBlockComponentSchemaInferred gains it, ListViewSchema's declaration unchanged modulo tsc member order / JSDoc placement; ten other zod d.ts differ only by printed union order.", "gates": "Local subset at fadb698, exit captured before any pipe: 0 — check:spec-symbols, check:new-line-citations (VERDICT 0 new citation(s)), check:control-bytes, check:handler-key-reads (155 arms, 0 unjudged), check:element-data-source-declaration, check:component-surface-parity, check:test-path-roots, check:changeset-claims, check:pending-changeset-literals, check:doc-fences, check:doc-types, check:doc-json, scripts/check-changeset-presence.mjs, scripts/check-changeset-no-major.mjs; scripts/check-governed-queue-guard.mjs --test over 28 paths → NOT GOVERNED. eslint over 26 changed TS files with inline config honoured (as package lint runs it): exit 0, 0 errors / 33 pre-existing no-explicit-any warnings off this diff's lines; with --no-inline-config exit 1 on 2 errors, both untouched lines carrying an inline disable (authoring-nodes.ts FlexBlockNode empty interface, index.ts FormField re-export). Dependents type-check after `pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-list^...' --filter '@object-ui/plugin-view^...' --filter '@object-ui/cli^...' build`: plugin-list, plugin-view, react, cli type-check all Done (lock VERDICT command-exit 0). NOT MEASURED, reason: check:doc-examples and check:doc-snippets exit 2 (precondition: their 34-package build not on disk; this diff changes no ts fence); app-shell / console type-check (whole-workspace closure); pnpm lint and the test farm — CI's. No dispatch-gates.mjs exists for objectui, so the list was hand-derived from package.json check:* and the touched files; no --ran reconciliation possible. PR #12713 check-runs at fadb698, read once: 35 runs — success: Changeset Declaration, Changeset Fixed Group Check, Line Citation Gate, Changeset Overwrite Report, Changeset Bump Policy, label; skipped: dependabot, Test (coverage), Test (coverage shard matrix); in_progress: Lint, Type Check, Repo Gates, Test (shard 1/16 … 16/16), Test (dist pins), Build & E2E, Build Docs, Bundle Analysis, Governed Surface Queue Guard, Changeset Claim Re-read, Live E2E (informational). Not waited on.", "mcp_calls": "0 — none", "api_writes": "3 REST writes as objectstack-fleet[bot], through 2 relay strokes (each a seat-side POST /repos/objectstack-ai/objectstack/dispatches): POST /repos/objectstack-ai/objectui/pulls (draft, PR #12713; read back 17164 bytes sent = stored) + POST /repos/objectstack-ai/objectui/issues/12713/assignees (os-elon-musk) in the pr_create stroke; POST /repos/objectstack-ai/objectui/issues/12670/comments (this os-dev-report) in the comment stroke. Plus 4 `git push` of the branch (not REST). 0 label writes; card assignee / labels untouched.", "open_questions": [ { "question": "Record-source semantics on the page arm: the PM route said `data` counts as a source only as an object provider with a non-empty `object`; this PR counts `properties.data` by presence (`!== undefined`), the shared requireRecordSource rule ruled 2026-09-02 for every arm. So `data: { provider: 'object', object: '' }` (the post-#12668 registration default) validates and then draws the no-object hint, as `objectName: ''` did on the flat arm. Should the page arm tighten?", "options": [ "A — keep the shared presence rule (this PR): one record-source rule for every arm; the empty-object case is the same posture as today's `objectName: ''`; zero extra surface.", "B — a list-view-specific rung that counts an object provider only with a non-empty `object`: refuses one more AI-writable dead node at validate, but forks the shared rule on one arm and narrows beyond the ruled presence wording." ], "recommendation": "A, because the presence semantics is a maintainer ruling that holds on every arm, and B is a change to that shared rule (all arms or none), not to this card; if tightening is wanted it belongs on requireRecordSource for every arm." } ], "out_of_scope_findings": [ "carrier: the seat's merge round after PR #12668 lands (ACCEPT 6216347560 item 5) · the packages/plugin-list/README.md page fence + its doc-json: fragment declaration rider, not on main this round; noted in PR #12713 Acceptance notes, not filed", "carrier: none (承接者:无) · packages/types/README.md's by-name list of exported block node types omits ListViewBlockNode (and already omitted ObjectPivotBlockNode / EmbeddableFormBlockNode); outside the claim's file surface; noted in PR Acceptance notes only, not filed" ], "deviations": [ "File surface: four paths outside the claim's literal list — packages/types/src/objectql.ts (one doc comment on the TS ObjectQLComponentSchema counting the zod twin's arms, which this change made false and which ships in dist d.ts); packages/types/src/__tests__/list-view-page-node.ts (test-only helper, 'tests beside'); packages/plugin-list/src/__tests__/ListView.calendarAliasRefused-8355.test.tsx and ListView.strayGroupByRefused-8365.test.tsx (they judge a list view at safeValidateSchema — the census's 'tests the face judges'; neither is in PR #12668's file list). No gate script edited.", "Hypothesis-route deviations, each measured: (1) the bag is the flat mirror's members (ObjectChartBlockSchema precedent), not the spec ListViewSchema verbatim, which requires columns and would refuse the ruled node; (2) checkListViewChartBinding is attached in the bag (the spec's own rule, attachable there because the bag's type is the spec kind), so a page `chart` list with no dataset binding is refused at properties.chart; list-view-dataset-chart-filter-refusal-10327's two unbound-chart controls were re-pointed to assert that spec issue on the page door; (3) record source by presence, see open question 1; (4) flat refusals via the shared flatPropRefusals with the five handler keys kept as the mirror's runtime-slot refusals at node level, and flat-props-refusal-10872 records those five as the arm's own refusals.", "The PR title/commit subjects cite objectui#12670; commits carry the model-free trailer pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md, not the harness's model-named Co-Authored-By line.", "One `npx tsc -p tsconfig.test.json` and the reverse probe ran with cwd in a package directory (tsc only, never vitest).", "Worktree /home/user/objectui-issue-12670 removed after the PR opened (node_modules first, plain `git worktree remove`, no --force); private ref refs/os-dev-12670/pr12668 (used to read PR #12668's ListViewBlock.tsx) deleted." ], "line_budget": "n/a — no skills/** or governed ledger touched (governed guard: NOT GOVERNED over 28 paths)", "files_changed": [ ".changeset/12670-list-view-page-face.md", "packages/plugin-list/src/__tests__/ListView.calendarAliasRefused-8355.test.tsx", "packages/plugin-list/src/__tests__/ListView.strayGroupByRefused-8365.test.tsx", "packages/types/src/__tests__/authoring-nodes-bag-carriers-11468.test.ts", "packages/types/src/__tests__/content-channel-remeasure-9256.test.ts", "packages/types/src/__tests__/flat-props-refusal-10872.test.ts", "packages/types/src/__tests__/grid-list-view-conditional-formatting-11533.test.ts", "packages/types/src/__tests__/grouping-field-padded-refused-7347.test.ts", "packages/types/src/__tests__/imported-defaults-8317.test.ts", "packages/types/src/__tests__/list-view-blocks-by-reference-6152.test.ts", "packages/types/src/__tests__/list-view-dataset-chart-filter-refusal-10327.test.ts", "packages/types/src/__tests__/list-view-options-bag-6152.test.ts", "packages/types/src/__tests__/list-view-page-node.ts", "packages/types/src/__tests__/list-view-properties-bag-12670.test.ts", "packages/types/src/__tests__/object-chart-legacy-axis-keys-retired-10608.test.ts", "packages/types/src/__tests__/object-grid-show-filters-retired-11068.test.ts", "packages/types/src/__tests__/objectql-union-arms-7363.test.ts", "packages/types/src/__tests__/public-block-responsive-styles-10872.test.ts", "packages/types/src/__tests__/registered-type-arms-10859-b2.test.ts", "packages/types/src/__tests__/spec-object-refinements-7715.test.ts", "packages/types/src/__tests__/strict-face-read-keys-11070.test.ts", "packages/types/src/__tests__/zod-mirror-parity.test.ts", "packages/types/src/authoring-nodes.ts", "packages/types/src/index.ts", "packages/types/src/objectql.ts", "packages/types/src/zod/README.md", "packages/types/src/zod/index.zod.ts", "packages/types/src/zod/objectql.zod.ts" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2 (re-stated by the same session on the same branch for the merge round after PR #12668 landed: the file surface gains
packages/types/README.md, its list of exported block node types, after the contract review6218271493; nothing else changes)Session:
session_01Vk15bz8xHtKGUfXfCm16h4Account:
os-elon-musk(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12670-list-view-page-faceWorktree:
objectui-issue-12670Domain:
domain:uiSeat:
domain:ui#3File surface:
@object-ui/types, the authoring face of a pagelist-viewnode, on theObjectMapBlockSchemaprecedent (triage6216264566, option A):packages/types/src/zod/objectql.zod.ts(a new authoredlist-viewarm beside the other authored block arms, withrequireRecordSource(…, 'properties'); theListViewSchemaregion atrequireRecordSource('list-view', ['objectName'])only as far as the arm needs);packages/types/src/zod/index.zod.ts(where the node union is assembled);packages/types/src/authoring-nodes.tsandpackages/types/src/index.ts(the arm's node type and its export);packages/types/src/zod/README.md; tests beside each; the fixtures and docs that face judges (the census the card names); one.changeset/12670-*.md. After objectui#12099's PR #12668 lands and this branch mergesmain, also: thepackages/plugin-list/README.mdfence and itsdoc-json: fragmentdeclaration (the rider from ACCEPT6216347560, item 5). Alsopackages/types/README.md, the line naming the exported block node types:ListViewBlockNodeis added, and so are the two the list already omitted,ObjectPivotBlockNodeandEmbeddableFormBlockNode. ⛔ No gate script without reporting it first (stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuiover the named paths: no path-derived mandate; the review owed is set by the face, below)Clause-②: yes (narrowing)
Clause-② reason: the published authoring face (
objectui validate,StrictAnyComponentSchema,check:doc-json, all judged by@object-ui/types' zod node union) starts accepting the ruled page spelling, which widens it. It also refusesobjectName/viewTypeon a pagelist-viewnode by name, which narrows a published accept set. So the PR owes aCONTRACT_REVIEW_TIERreview of record before ready (triage:needs:contract-review).Ruling-ref: objectstack-ai/objectstack#22444 comment
6100463199(ruling C; the scope is triage6216264566, option A under C as it stands)Responsibility:
@object-ui/types' zodlist-viewarm (ListViewSchema, closed byrequireRecordSource('list-view', ['objectName']), nopropertiesmember) refuses the ruled page node and accepts the retired flat one | none: the renderer after PR #12668 reads onlydata/properties.type, and the spec'sComponentPropsMaprow (objectstack-ai/objectstack#22444) is objectstack's lint tier, notobjectui validate| every author, human or AI, who runsobjectui validateon a pagelist-viewnode. No in-repo producer writes one today (the census in ACCEPT6216347560), butvalidateis the door an AI author runs.Thread-read: 6217824753
Serial constraints cleared: PR objectui#12668 (objectui#12099) has landed on
mainas5c0846e, so the ordering this claim set is met, and this branch now mergesmain. PR objectui#12678 (objectui#12666) has landed as well, so the merge brings it in. Seat 1's objectui#12654 stands as claim6216538732read it; whichever lands second mergesmain. Read 2026-10-16T15:01Z.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Open question 1 of report
6217824753(record source on the page arm): A.domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T15:02ZThe page arm keeps the shared
requireRecordSourcepresence rule:properties.datacounts when it is present (!== undefined), as on every arm.requireRecordSource's docblock inpackages/types/src/zod/objectql.zod.ts. It records presence as the wording of the maintainer ruling of 2026-09-02 ("WHATdataMEANS IS NOT SHARED, only its PRESENCE is"). The binding's non-empty test is a separately ruled rung (objectui#11117).data.object's value would fork that shared rule on one arm. It would also refuse PR feat(plugin-list): a page list-view node is written data / type, and the metadata page reads properties.type as the list kind (objectui#12099) #12668's registration defaultdata: { provider: 'object', object: '' }, the unfilled designer node.requireRecordSourcefor every arm, together with the registration default. This answer keeps an existing ruling and decides nothing new.6218271493, its ③), which reached A independently.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12670, "status": "done", "branch": "claude/issue-12670-list-view-page-face", "pr": "https://github.com/objectstack-ai/objectui/pull/12713", "head": "5bb1b1d1594f2a3e70e019a417130a8823b46a0f", "session": "session_01Vk15bz8xHtKGUfXfCm16h4 (the dispatching seat's harness-stamped id; this run is its subagent)", "premise_still_valid": true, "summary": "Merge-and-patch round on PR #12713, three commits on top of fadb698. (1) badde80 merges origin/main 40e5873 as a real merge commit (no rebase, no force). It brings in PR #12668 (5c0846e) and PR #12678 (15d8ca6). imported-defaults-8317 and spec-object-refinements-7715 auto-merged with both intents kept: main's checkPageComponentViewData removal and specChecksRemovedOnMain census, and this branch's checkListViewChartBinding row plus the asPageListView / bagPath re-spells. Nothing was regenerated. (2) ddc1ca9 is the plugin-list README rider. It deletes the page list-view fence's `doc-json: fragment` declaration, so check:doc-json judges the fence as a whole document and accepts it. It replaces the now-false paragraph ('objectui validate does not judge the page spelling yet') with what the face judges: record source properties.data or a bound dataSource.object, objectName / viewType refused by name and pointed at properties.data / properties.type, an unknown properties.type refused, a flat list view prop refused. Each claim was probed on the built strict face first. The kind stays in prose, not as a type literal in the fence. (3) 5bb1b1d is the changeset sentence in the precedent's spelling: ListViewBlockSchema reaches AnyComponentSchema through ObjectQLPublicBlockComponentSchema, the public block union; ListViewSchema leaves ObjectQLComponentSchema, so ObjectQLComponentSchema.safeParse of a list-view node now fails on the discriminator. The BREAKING list gains one line for code that parses with ObjectQLComponentSchema directly. Frontmatter is unchanged. The same commit makes packages/types/README.md's by-name list of ObjectQL block node types name ListViewBlockNode, ObjectPivotBlockNode and EmbeddableFormBlockNode. All three are verified exported from packages/types/src/index.ts, and the list now matches the 11 arms of ObjectQLPublicBlockComponentSchema read from dist. Open question 1 stays A as answered (6218339393): no record-source change.", "tests": "At 5bb1b1d, after `pnpm --filter @object-ui/types build` (lock VERDICT command-exit 0). Red reproduced first at badde80, before the README edit: `pnpm check:doc-json` exit 1, `packages/plugin-list/README.md:360 — the strict face ACCEPTS this list-view node, so it is a complete document and the declaration exempts nothing — delete the marker`, judged 260 = 245 accepted + 14 declared fragments + 0 refused. After the edit: exit 0, judged 260 = 246 accepted + 14 declared + 0 refused, 'Every judged JSON node document on the scan surface passes the strict authoring face.' Changeset and README claims probed on dist/zod: ObjectQLComponentSchema.safeParse refuses both the flat and the page list-view node with invalid_union at type, note 'No matching discriminator'. ListViewSchema accepts flat and refuses page; ListViewBlockSchema, ObjectQLPublicBlockComponentSchema and AnyComponentSchema accept page and refuse flat. On StrictAnyComponentSchema the fence and the fence plus type kanban are ACCEPTed; type board is refused at properties.type; objectName flat and in the bag, viewType in the bag and flat columns are each refused at their own path with the replacement named; no source gives custom at properties.data. `pnpm exec vitest run --maxWorkers=2 packages/types/ packages/plugin-list/src/__tests__/ListView.calendarAliasRefused-8355.test.tsx packages/plugin-list/src/__tests__/ListView.strayGroupByRefused-8365.test.tsx packages/plugin-list/src/__tests__/ListViewBlock.pageCarrierSpelling-12099.test.tsx scripts/__tests__/check-doc-json-fences.test.ts` gives 'Test Files 389 passed (389)' and 'Tests 10591 passed (10591)', lock VERDICT command-exit 0. A verbose re-run of the five named non-directory files gives 'Test Files 5 passed (5)' and 'Tests 145 passed (145)', each file listed: 8355 11, 8365 13, pageCarrierSpelling-12099 19, list-view-properties-bag-12670 63, check-doc-json-fences 47. Of #12668's plugin-list tests none reads the README or the face (grep for safeValidateSchema / StrictAnyComponentSchema / AnyComponentSchema / zod / README: 0 hits). pageCarrierSpelling-12099 was run as the merge's renderer-side sanity leg, and check-doc-json-fences because its corpus changed. `pnpm --filter @object-ui/types type-check` (three legs): lock VERDICT command-exit 0. No ablation: this round changes docs and the changeset only, and no tested behaviour.", "gates": "Local, at 5bb1b1d, each exit captured before any pipe (output redirected to file, then read). Exit 0: check:doc-json (246 accepted, 0 refused), check:doc-types ('Every documented component type is registered.', 1192 type literals), check:doc-fences, check:handler-key-reads ('155 arm(s) … 0 left unjudged'), check:changeset-claims ('No pending changeset names a file this change touches.'), check:pending-changeset-literals, check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'), scripts/check-changeset-presence.mjs (merge-base 40e587342, 30 files, 1 changeset declared), scripts/check-changeset-no-major.mjs, check:control-bytes. scripts/check-governed-queue-guard.mjs --test over the PR's 30 paths gives 'NOT GOVERNED'. eslint over the PR's 26 TS files on the merged head: exit 0, 0 errors / 33 warnings, the same pre-existing no-explicit-any set as fadb698 (lock VERDICT command-exit 0; the first attempt was exit 99 queue-timeout behind holder pid 22299, an apps/console vitest run; the re-take under the same slot acquired after 437s). NOT MEASURED, eslint on this round's three changed files: all are .md, and eslint printed 'File ignored because no matching configuration was supplied' for each. objectui has no dispatch-gates.mjs, so the list above is the dispatch's plus the touched-file families, and no --ran reconciliation was possible. CI on PR #12713 at 5bb1b1d, check-runs read once (head_sha checked): 36 runs, 33 success, 3 skipped (Test (coverage), its shard matrix, dependabot), 0 failed, 0 in progress. Required contexts all success: Lint, Type Check, Build & E2E, Build Docs, Changeset Declaration, Test, Governed Surface Queue Guard. Also success: Repo Gates (check:doc-json, check:doc-types, check:handler-key-reads), Test (dist pins), Line Citation Gate, Changeset Claim Re-read, Changeset Bump Policy, Changeset Fixed Group Check.", "mcp_calls": "0, none", "api_writes": "1 REST write as objectstack-fleet[bot]: this os-dev-report comment, POST /repos/objectstack-ai/objectui/issues/12670/comments, through scripts/pm/post-stamped.mjs on the relay (transport dispatch, one stroke: a seat-side POST /repos/objectstack-ai/objectstack/dispatches). Plus 2 `git push` of the branch (fadb698..badde80, badde80..5bb1b1d), which are git, not REST. Reads only otherwise: single-comment, card, comment-list, PR and check-runs REST GETs. 0 label, assignee or body writes on the card or the PR.", "open_questions": [ { "question": "PR #12713's body still describes the pre-merge head: the rider pending, the branch not carrying #12668, gates at fadb698. The seat writes the body. Which edits for the landing head?", "options": [ "A: apply these edits. (1) Intro: after 'Claim: comment `6216538732`' add ', re-stated as `6218329226` for the merge round'. Replace 'this branch is built from `main` and does not carry it.' with 'it landed on `main` as `5c0846e`, and this branch merged `main` after it (merge commit `badde80`), so the landing head carries both halves.' (2) 'What changes' gains two bullets. First: '**plugin-list README rider** (`packages/plugin-list/README.md`): the page fence's `doc-json: fragment` declaration is deleted, so `check:doc-json` judges the fence whole and accepts it; the paragraph that said `objectui validate` does not judge the page spelling now says what it judges; the kind stays in prose.' Second: '**types README** (`packages/types/README.md`): the by-name list of ObjectQL block node types gains `ListViewBlockNode`, `ObjectPivotBlockNode` and `EmbeddableFormBlockNode`.' (3) The '**Changeset.**' bullet gains: 'It names `ObjectQLComponentSchema`'s lost `list-view` arm in the precedent's spelling, with a BREAKING line for code that parses with it directly.' (4) Under the census's 'Page nodes in fixtures and docs': add the README's page fence, accepted and judged whole since the merge. (5) Tests and Gates: add an 'At `5bb1b1d` (the merged head)' paragraph from this report's tests / gates fields, and keep the `fadb698` lines as the earlier record. (6) Acceptance notes: the 'Rider pending' bullet becomes 'Rider done': red at `badde80`, `check:doc-json` exit 1 with the stale-fragment-marker verdict 'delete the marker'; green at `5bb1b1d`, 246 accepted and 0 refused. 'Landing order' becomes 'Met: objectui#12668 is on `main` (`5c0846e`) and merged here.' '`data` presence' gains 'Seat answer `6218339393`: A.' The last bullet (types README) is deleted as done.", "B: leave the body as it is; the fresh contract review reads the three commits." ], "recommendation": "A, because the review of record reads the body. As it stands, the body asserts a pending rider and a branch without #12668, and both are false on the landing head." } ], "out_of_scope_findings": [], "deviations": [ "The first `git push` (the merge commit) went out before the newest Claim comment was re-read. Claim 6218329226, read at round start, names this branch. The comment-list read right after the push (5 comments) confirmed it is still the newest Claim. The second push followed that re-read.", "No empty-branch push probe: the branch already existed on origin at fadb698. The merge-commit push (fadb698..badde80, accepted) served as the write-route probe.", "Two test files beyond the dispatch's list were run: plugin-list ListViewBlock.pageCarrierSpelling-12099 (#12668's own pin, as a merge sanity leg) and scripts/__tests__/check-doc-json-fences.test.ts (its corpus includes the edited README). Both pass.", "The commit trailers are the model-free pair from AGENTS.md (Claude-Session + Co-authored-by: Claude), not the harness's model-named Co-Authored-By line.", "After the report data was final, the worktree /home/user/objectui-issue-12670 was removed: node_modules first, then a plain `git worktree remove` (no --force), which exited 0. The local branch ref equals origin at 5bb1b1d." ], "line_budget": "n/a: no skills/** or governed ledger touched (governed guard: NOT GOVERNED over 30 paths)", "files_changed_this_round": [ "packages/plugin-list/README.md", ".changeset/12670-list-view-page-face.md", "packages/types/README.md" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
ACCEPT → PR #12713 comment 6219490377 ·
domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T16:04Z. Contract review6219459118(CONTRACT_REVIEW_TIER, PASS, head5bb1b1d). The seat landed it through the relay (pr_ready+automerge_enable); on MERGED,Fixescloses this card.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 3 ·session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T16:20Z378896donmain(2026-10-16T16:19Z). Head5bb1b1d: ACCEPT6219490377, contract review6219459118(CONTRACT_REVIEW_TIER, narrowing face, PASS). That review superseded the FAIL6218271493onfadb698.mainat378896d:packages/types/src/zod/objectql.zod.tsexportsListViewBlockSchema, andpackages/types/src/authoring-nodes.tscarriesListViewBlockNode.completedon the PR'sFixes. The seat stripspm:dispatchedin the same stroke as this note.main: the renderer (objectui#12099,5c0846e) and the authoring face (this card).objectui validateand the renderer read one spelling.ComponentPropsMaphas nolist-viewrow, so a page-embedded list view'spropertiesare judged by nothing:kanban.groupFieldandoptions.gridpass on a page while every list-view door refuses them objectstack#22444's: theComponentPropsMap['list-view']row at lint tier, the ADR-0087 D2 conversion of stored page nodes, and the console pin move. The cloud constraint (triage6213876820) is unchanged.Generated by Claude Code