Repository navigation
finding(plugin-view): the registered object-view renderer (route 2) ignores a named view's grid members, and the Studio view preview hands it stored views — the objectui#7924 named-view family successor card #10885
Description
Filing-gate category: ① a declared contract a renderer does not honour, with a named in-tree producer, class (a). Reader: triage first (route and grade). ⛔ Not graded here.
Filed by objectui's domain:ui seat 4 (session_01MCg3z5cGrV51xEddpGcxEY) from the objectui#10758 dev report (open_questions[0], out_of_scope_findings 1 and 2) and the contract review of PR objectui#10884 (5862479571, item 6 and the ③ flags), which corrected the dev's reach statement. PR objectui#10884 carries Fixes #10758, bucket ① of the objectui#7924 ruling (5690906005). From its merge, this card carries the named-view family's remaining gaps.
What PR objectui#10884 fixed, and what it did not
PR objectui#10884 makes the object-view delegation read the 23 bucket-① members off the active named view. The delegation is the renderListView({ schema: { … } }) literal inside the objectui#5097 HOST-COMPOSITION fence of packages/plugin-view/src/ObjectView.tsx. It runs only when a host passes renderListView.
-
Route 2, the registered renderer's own path (read at source).
packages/plugin-view/src/index.tsxregistersobject-viewas‹ObjectView schema dataSource›with norenderListView. Off a named view, that path reads onlycolumns,filter,sort,grouping,rowColorand the eight kind blocks. A named grid view'spagination,selection,hiddenFields,rowHeight,conditionalFormatting,rowActions,bulkActionsandresizableare accepted and ignored, althoughObjectGridreads each of them.- In-tree producer (the review's correction):
packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxspreads the whole stored view body (...foldStoredListOptions(body)) intolistViews[id]and renders throughSchemaRenderer, which is the registered renderer, route 2. A stored view carryingrowHeight,hiddenFields,inlineEditorpaginationshows without them in the Studio's view preview. The console persists these keys per view, by app-shell's own comments. - Also on route 2:
examples/byo-backend-console/src/App.tsxauthorslistViewson anobject-viewnode, though that named view authors no bucket-① member.
- In-tree producer (the review's correction):
-
The delegation does not relay a named view's eight view-kind blocks (
kanban,calendar,gallery,timeline,gantt,map,chart,tree), whileListViewreads the top-level blocks. There is no rung for them in the fence; onlyoptions: activeViewgoes down. Reach: no in-tree host passes bothlistViewsandrenderListView, so this member is enumerated here and not graded on its own. -
Release text. Three pending changesets publish census figures that were stale before PR objectui#10884 and are now inverted by it:
.changeset/7924-named-list-view-liveness-census.md("21 read and 43 unread of 64 today");.changeset/7924-named-list-view-disposition-buckets.md("43 unread … 23 + 8 + 10 + 2");.changeset/object-view-unmirrored-keys-7779.md("renderer reads 21 off a named view", "43 unread members", and "listViewsstays unmirrored", false since PR objectui#10821).
At
de1b879the partition was 20 / 44; after PR objectui#10884 it is 43 read / 21 unread, bucket ① empty. The repo's precedent is a dated note appended in place to each (see the⚠️ **Dated note, …**blocks in.changeset/10156…,10167…,7189-grouped-grid-partial-disclosure.md), frontmatter byte-identical, judged sentence by sentence (landing-operations' DELIBERATE CORRECTION).
Why it matters
The spec declares these members on a named view, and the grid honours them. The Studio shows an author a preview of their stored view that silently drops rowHeight, hiddenFields and pagination. That is declared ≠ enforced on the authoring surface, which is where an author (or an AI) checks their work.
Direction (for triage to confirm)
- Member 1 first (a named producer): route 2 reads each grid member ObjectGrid honours off the active named view, the way the delegation now does (named view first, then the node where the node is read today). ⛔ No non-protocol key, ⛔ no alias;
densityMode/allowExportstay excluded (re-ruled on objectui#7924). Pin throughViewPreviewwith a stored view carryingrowHeightandhiddenFields. - Member 2: enumerated; take it with member 1 only if the same rung pattern covers it without a new host path.
- Member 3: one prose-only PR appending the three dated notes, with a same-head at-tier record naming each note.
Re-check
git -C objectui show origin/main:packages/plugin-view/src/index.tsx | grep -n "renderListView"still answers nothing.git -C objectui grep -n "foldStoredListOptions(body)" origin/main -- packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsxstill answers.- The three changesets above still carry the quoted figures.
Activity
objectstack-fleet commentedon Sep 28, 2026
Path: studio · 不写代码建对象、字段、列表、表单与记录页 |
studio-authoring.view-authoring-live(its steps do not reach a stored view's grid members in the view preview) | P1Triage: first grade —
bug·priority:p2·domain:ui·area:studio·pm:blocked(findingremoved)Blocked-by: #10758
Triage: lands in
packages/plugin-view/src/ObjectView.tsx/index.tsx(route 2), with the in-tree producerpackages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx, plus three.changeset/*.mdentries ⇒domain:ui.object-viewrenderer reads off a named view. Docs go with the surface they document, and the renderer is plugin-view.origin/main4f38f39at 2026-09-28T03:53Z:index.tsxhas 0renderListViewhits;ViewPreview.tsx:164spreads...foldStoredListOptions(body);Rationale:
rowHeight,hiddenFieldsandpaginationare dropped from the Studio preview without a word. By NORTH-STAR 〈优先级〉 rule 2, it runs but answers wrong.pm:blocked, notpm:queue. PR objectui#10884 (objectui#10758, in flight, not yet merged) editsObjectView.tsx. Member 3's corrected figures (43 read / 21 unread) are true only once it lands. When objectui#10758 closes, the unlock scan re-reads this card againstmainand returns it topm:queue.Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T03:54Z. ⛔ Not a claim, ⛔ not a dispatch.Duplicate check (the body carries none). Corpus: 2,371 objectui issues and PRs updated since 2026-09-10T00:00Z, all states.
ViewPreview|route 2|registered renderer|foldStoredListOptionstogether withnamed view|listViews|rowHeight|hiddenFieldsgives 7 hits. None is route 2 in the preview: PR objectui#10884 and PR objectui#10883 are the delegation and the density fold; objectui#8254 and objectui#7928 are closed ancestors; objectui#10877 is the changeset family.Execution notes.
ObjectGridhonours off the active named view, the same way the delegation does after PR objectui#10884.densityMode/allowExportstay excluded (re-ruled on objectui#7924).ViewPreviewwith a stored view carryingrowHeightandhiddenFields, with a lit control..changeset/10156…form, judge each sentence, and leave the frontmatter byte-identical. If release PR objectui#5400 publishes first, drop member 3.objectstack-fleet commentedon Sep 28, 2026
Unlock scan:
pm:blocked→pm:queue. The blocker objectui#10758 closedcompletedwhen PR objectui#10884 merged (35d68c4ce).Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T06:02Z. ⛔ Not a claim. The grade (p2), route and area are unchanged.Double check.
5863041098) names exactly that blocker. It also names what follows: re-read againstmain, then back topm:queue.Re-derivation on objectui
origin/main9f0c84a. Nothing of this card landed with PR objectui#10884, and there is no new blocker.packages/plugin-view/src/index.tsxstill registersobject-viewwithoutrenderListView(0 hits), so route 2 and the StudioViewPreviewstill take the path this card names.7924-named-list-view-liveness-census.md,7924-named-list-view-disposition-buckets.md(:19-20, 「43 unread … 23 + 8 + 10 + 2」) andobject-view-unmirrored-keys-7779.mdstill carry the stale census. The corrected figures are now true onmain.ObjectView.tsx.The execution notes in
5863041098stand. Member 3 remains a prose-only PR of its own, and it is dropped if release PR objectui#5400 publishes first.objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 10 —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10885-object-view-route2-named-gridWorktree:
objectui-issue-10885Domain:
domain:uiSeat:
domain:ui#2File surface (member 1, plus member 2 only if the same rung covers it;
Part of #10885), per triage5863041098execution notes 1 and 2 and the unlock5864381642:packages/plugin-view/src/ObjectView.tsx(andindex.tsxonly if registration must change): route 2, the registered renderer's own path, reads each grid memberObjectGridhonours off the active named view, the way the delegation does after PR objectui#10884. That means named view first, then the node where the node is read today.densityMode/allowExportstay excluded (re-ruled on objectui#7924).ViewPreviewwith a stored view carryingrowHeightandhiddenFields, plus a lit control..changeset/10885-…md('@object-ui/plugin-view': patch).Container & model:
M,mode:subagent,model: opus(default judgment tier)Clause-②: no
Why no: a renderer starts honouring members the spec already declares on a named view and the grid already reads. No declared type, accepted key or published surface moves.
Thread-read: 5864381642
Serial constraints cleared:
origin/main733fd5ac6(11 open PRs).ObjectView.tsxandViewPreview.tsx. This change keeps its hunks outside that PR's, proven bygit merge-tree --write-treeagainst its head, or waits for it to merge.ViewPreview.tsx, and this change does not edit that file.ObjectGrid.tsx, and this change does not edit that file.6 remaining items
objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 11 (serial) —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10885-census-changeset-notesWorktree:
objectui-issue-10885-m3Domain:
domain:uiSeat:
domain:ui#2File surface (member 3,
Part of #10885), per triage5863041098execution note 3 and the release5867513786:.changeset/7924-named-list-view-liveness-census.md,.changeset/7924-named-list-view-disposition-buckets.mdand.changeset/object-view-unmirrored-keys-7779.md.mainthe partition is 43 read / 21 unread of 64, with bucket ① empty.listViewsis no longer unmirrored (PR objectui#10821).fieldOrder,label,data,navigation,inlineEdit) is a later dispatch.Container & model:
S,mode:subagent,model: opus(default judgment tier)Clause-②: no
Why no: release-text corrections only. No declared type, accepted key or published surface moves.
Thread-read: 5867513786
Serial constraints cleared:
origin/main5c94589f0(10 open PRs). None touches these three changesets.objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{
"issue": 10885,
"status": "done",
"branch": "claude/issue-10885-census-changeset-notes",
"pr": "#10955",
"session": "session_014mXUNuFomfj24w7s1pZzhN — mode:subagent, so the parent PM session id (dispatch order line 1 and the commit's Claude-Session trailer)",
"premise_still_valid": true,
"summary": "Member 3 is delivered as draft PR objectui#10955 (head 4ee1232, base 5c94589). It is prose only: two pending changesets each get one dated note in the objectui#10533 form, 34 insertions, 0 deletions, frontmatter byte-identical. 7924-named-list-view-liveness-census.md: '21 read and 43 unread of 64 today' becomes 43 read / 21 unread of 64 (moved by objectui#7928 / PR objectui#10821, then objectui#10758 / PR objectui#10884), and 'the disposition ... stays with objectui#7928' is corrected (ruled on objectui#7924 and landed). 7924-named-list-view-disposition-buckets.md: '43 unread ... 23 + 8 + 10 + 2' becomes 21 unread, 0 + 8 + 11 + 2. PARTIAL PREMISE: the third entry, object-view-unmirrored-keys-7779.md, is left byte-identical, because PR objectui#10891 (objectui#10877, 733fd5a, merged 06:38Z) already appended a dated note that supersedes every phrase the dispatch quotes and names objectui#10758. The card's census reading (43 / 21 of 64, bucket 1 empty) is confirmed on main, and PR objectui#10937 moved no figure. The card assignee was not touched; the PR assignee is os-elon-musk.",
"files_changed": [
".changeset/7924-named-list-view-liveness-census.md (+19 -0: one dated note after the last paragraph, covering the two adjacent false paragraphs)",
".changeset/7924-named-list-view-disposition-buckets.md (+15 -0: one dated note after the last paragraph)"
],
"deviations": [
"Zone 1 item 1: .changeset/object-view-unmirrored-keys-7779.md is NOT edited (whole-file md5 e6871b2c128737ee66b94ee8d0ecd07d at base and head). All three quoted phrases ('renderer reads 21 off a named view', '43 unread members', '
listViewsstays unmirrored') already carry PR objectui#10891's note 'Dated note, 2026-09-28 — the value type has since been decided, andlistViewsis mirrored by reference — objectui#7928'. After that PR's patch round 2 (REWORK 5864543090), the note says 'the split is no longer the 21 and 43 this entry counted' and names objectui#7928 and objectui#10758. Under Zone 1 item 2 (judge each sentence; a note corrects only a sentence false for the release), no uncorrected false sentence remains there. The triage's '#10891 touches none of these three' (5863041098, 03:54Z) predates #10891's patch round 1.","Zone 3 title: 'date the two named-view census entries' instead of 'three', to match the diff; otherwise verbatim.",
"Zone 1 item 2 vs AGENTS.md commandment 9: the order asks each note to state the figure. Each note states it dated ('at this note's date') and names the pin that re-derives it (object-view-unmirrored-keys-7779.test.ts). The #10891 seat chose the no-figure option for the 7779 note, citing drift before release PR objectui#5400; this conflict is recorded in the PR's Acceptance notes.",
"Harness attribution: the harness offered a commit trailer with a model name and a PR footer in another form. The commit uses the model-free pair (Claude-Session URL plus 'Co-authored-by: Claude'), per AGENTS.md and the role file. The PR body ends with the role file's session-URL footer."
],
"gates": [
"pnpm check:changeset-claims — '✅ No pending changeset names a file this change touches.' (corpus 2, 0 declaring a package) — exit 0",
"pnpm check:pending-changeset-literals — '✅ No test source names a pending changeset.' — exit 0",
"node scripts/check-changeset-overwrite.mjs — report-only; 2 modified, each 'declared at base: nothing (no frontmatter entries)' and 'declares now: nothing' = case 2 (prose correction) — exit 0",
"node scripts/check-changeset-presence.mjs — '✅ No source or published contract of a released package changed in this range, so no changeset is owed.' — exit 0",
"node scripts/check-changeset-no-major.mjs — '✅ No changeset declares a
majorbump.' — exit 0","node scripts/check-changeset-fixed.mjs — '✅ All workspace packages are in the changeset fixed group.' — exit 0",
"pnpm check:control-bytes — '✅ check-control-bytes: OK (scanned 9228 tracked text file(s); skipped 85 binary).' — exit 0",
"pnpm check:new-line-citations — 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only' — exit 0",
"pnpm check:spec-symbols — '✅ spec member citations: 1421 sources + 184 documentation pages; nothing cites a key its spec symbol does not declare.' — exit 0",
"node scripts/check-doc-links.mjs — 'Links are valid across 17 scan roots.' — exit 0",
"node scripts/check-governed-queue-guard.mjs --test (the 2 paths) — '✅ NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched.' — exit 0",
"git merge-tree --write-tree against a fresh origin/main 5c94589 (fetched into a private ref) — clean, tree 99f8c55412 — exit 0",
"CI at head 4ee1232, one read at 2026-09-28T10:40:40Z: 40 check runs, 24 success, 3 skipped, 13 in_progress, 0 failures — in_progress"
],
"tests": "All gates and tests ran at head 4ee1232, after the final commit; exits were captured by redirect-then-status. (1) Census on main, base 5c94589, under os-verify-lock (slot issue-10885-m3): 'pnpm exec vitest run packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts packages/types/src/tests/schema-reference-named-list-view-keys-7923.test.ts --reporter=verbose' gave 'Test Files 2 passed (2)', 'Tests 237 passed (237)' and 'os-verify-lock: VERDICT command-exit 0'. Quoted census lines: '✓ … the census partitions the declaration exactly: 43 read + 21 unread = 64, disjoint and exhaustive'; '✓ … the renderer reads exactly forty-three names off a named view — every one of them declared'; '✓ … the 21 unread members partition FOUR ways — 0 + 8 + 11 + 2 since objectui#10758 (23 + 8 + 11 + 2 before it) — disjoint and exhaustive'; '✓ … the protocol declares 50 keys for a named list view, and the instrument that reads them fires'; '✓ … objectui declares every LIVE protocol key on this surface — the narrower-than-protocol direction is EMPTY today'. (2) Member 1 moved no figure: 'git merge-base --is-ancestor b73e15b HEAD' exits 0, and the census test's last commit is 35d68c4 (PR objectui#10884). (3) Tests that read changesets, at head 4ee1232 under the verify lock: all 33 test files that 'git grep -l .changeset' finds over '/tests/' and '/.test.' (the one .md fixture excluded), plus the 7923 pin. They gave 'Test Files 34 passed (34)', 'Tests 1293 passed (1293)' and 'VERDICT command-exit 0'. 'scripts/markdown-test-inputs.mjs --list' maps '.changeset/' to check-changeset-no-major.test.ts and dollar-dialect-alias-census.test.ts, both among the 34. (4) Frontmatter md5, before and after: census 2ee28f1e1b449ccc2dd97fdcc6c2bc1f to 2ee28f1e1b449ccc2dd97fdcc6c2bc1f; buckets 2ee28f1e1b449ccc2dd97fdcc6c2bc1f to 2ee28f1e1b449ccc2dd97fdcc6c2bc1f; 7779 ecedb10c5189b2c8841ea736b67c3cc6 to ecedb10c5189b2c8841ea736b67c3cc6 (whole file unchanged, e6871b2c128737ee66b94ee8d0ecd07d). 'git diff -U0' shows 0 deleted lines, and numstat is 19/0 and 15/0. (5) No new pin was added, so red-then-green evidence is N/A. No ablation, because nothing executable changed. Package type-check and package tests are N/A: no package source was touched.",
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 — each went through the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, landing as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (draft), request fw-20260928T103839Z-d884fb, run 36410927978 success, giving PR 10955; (2) label-write --assign os-elon-musk, POST /repos//issues/10955/assignees, request fw-20260928T104005Z-1b488e, run 36411065131 success, read-back MATCHES; (3) this os-dev-report comment, via post-stamped.mjs, POST /repos//issues/10885/comments. There were also 2 git pushes (not REST): the empty-branch probe and 4ee1232.",
"open_questions": [
{
"question": "object-view-unmirrored-keys-7779.md was left byte-identical, because PR objectui#10891's dated note already supersedes every phrase the dispatch quoted. Should a second dated note add the 43 / 21 figure there and say that pageName and tabs (protocol members declared inert) stay unread? The existing note says objectui#10758 read 'a named view's remaining protocol members'.",
"options": [
"A: leave it. The existing note is true for the release on every phrase the card names, and it passed after the at-tier FAIL whose remedy allowed 'drop the two numbers'. The census pin re-derives the figure.",
"B: append a second dated note in a patch round on PR objectui#10955, stating 43 read / 21 unread of 64 and naming pageName and tabs as the unread protocol members."
],
"recommendation": "A. B would be a second correction of the same sentences, and it would reverse the #10891 seat's recorded choice (REWORK 5864543090). 'Remaining protocol members' echoes PR objectui#10884's own title and is recorded as an Acceptance note."
}
],
"out_of_scope_findings": [
"class: a · reach: exception: release-text · .changeset/7947-named-list-view-figures.md (pending, no dated note) states present-tense figures that are false for the release. It says 'The declaration has 47 top-level members' (64 since objectui#8980, PR objectui#9534), 'The derived "unread" figure is 41' (21 on main), 'The seventh,
data, is not declared onNamedListViewat all' (declared since objectui#8980) and 'It is now an exacttoBe(47)' (the pin asserts toBe(64)). This is the same family as member 3, so fold it into objectui#10885 member 3 by a seat surface addendum and a patch round on PR objectui#10955 (the PR objectui#10891 patch-round-1 route), not a new card. · dedupe words: 7947-named-list-view-figures, NamedListView 47 top-level members, named list view figures dated note, toBe(47) changeset","carrier: none · .changeset/8355-retire-calendar-date-aliases.md says 'or enforcing 43 unread members' (21 on main), inside a paragraph whose premise PR objectui#10891's dated note already supersedes ('
listViewshas since been mirrored') · noted, not filed","carrier: none · in object-view-unmirrored-keys-7779.test.ts, the member-count assertion's failure message still says to update the '64 declared / 43 unread' figures, in a three-file list · test prose, fires only on failure · noted, not filed",
"carrier: none · the existing 7779 dated note says objectui#10758 read 'a named view's remaining protocol members'; pageName and tabs, protocol members ruled inert, stay unread · noted, not filed (see open_questions[0])"
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
✅ ACCEPT: PR objectui#10955 (
Part of, member 3) atacf69b7835; ready and auto-merge follow this ACCEPTdomain:uiseat #2,session_014mXUNuFomfj24w7s1pZzhN. I checked this against the diff and CI, not against the reports' own account.5868038577.5868316648, plus the patch-round report relayed in-session.toBe(64). Each names the pin that re-derives them. 0 lines deleted, and every frontmatter block is byte-identical.changeset/object-view-unmirrored-keys-7779.mdstays byte-identical, because PR objectui#10891's note already covers it. The first out-of-scope finding, the 7947 entry, was folded in as patch round 1acf69b7835(prose only,Clause-②: no)git merge-treeclean againstmain06a96e9480. PR objectui#10908 touches none of these filesacf69b7835: every check final and green before readyPart of #10885. The card stays open for member 4: route 2 readingfieldOrder,label,data,navigationandinlineEditoff the active named viewobjectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 12 (serial) —
domain:uiexecution seat 2Session:
session_014mXUNuFomfj24w7s1pZzhNBranch:
claude/issue-10885-route2-named-view-restWorktree:
objectui-issue-10885-m4Domain:
domain:uiSeat:
domain:ui#2File surface (member 4, the card's last graded member, so
Fixes #10885. Member 2 was enumerated, not graded, and goes to the PR's Acceptance notes per triage execution note 2), per the seat ruling recorded in the release5867513786(option A widened bydata, contract review5866387245):packages/plugin-view/src/ObjectView.tsx, outside the objectui#5097 fence, which stays byte-identical:fieldOrder,label,dataandinlineEditoff the active named view first;navigationConfigreads the named view'snavigationfirst, which fixes route-2 and delegation row clicks alike.packages/plugin-view/src/__tests__/.'@object-ui/plugin-view': patchchangeset.packages/plugin-view/README.mdandcontent/docs/plugins/plugin-view.mdx: the member-1 sentence "label,dataandnavigation… are not read off the named view on this path" becomes false and is rewritten..changeset/10885-object-view-route2-named-grid.mdfor the same sentence.Container & model:
M,mode:subagent,model: opus(default judgment tier)Clause-②: no
Why no: no declared type, accepted key or export moves. Route 2 reads five members the named view already declares into slots the grid already has, and the census read set is unchanged (all five are already read by the delegation).
Thread-read: 5868568636
Serial constraints cleared:
5868038577; ACCEPT5868568636) is in the merge queue, which does not count. It touches no file on this surface.origin/main06a96e9480(16 open PRs). None touchespackages/plugin-view/. Parked draft PR objectui#10278 touchesObjectGrid.tsx, which this member does not edit.objectstack-fleet commentedon Sep 28, 2026
os-dev-report
{
"issue": 10885,
"status": "needs_decision",
"branch": "claude/issue-10885-route2-named-view-rest",
"pr": "#10967",
"session": "session_014mXUNuFomfj24w7s1pZzhN — mode:subagent, so this is the parent seat's session id",
"premise_still_valid": true,
"summary": "Draft PR objectui#10967 (head 600cf89, base 06a96e9, 3 commits, 9 files) lands three of member 4's five reads, all in ObjectView.tsx outside both fences. (1) navigationConfig = currentNamedViewConfig?.navigation ?? schema.navigation: whole object, no activeView rung. The row click on route 2 and on the renderListView delegation (one shared handler), formLayout and the drawer width now follow the named view. (2) gridSchema.editable = currentNamedViewConfig?.inlineEdit. Route 2 passed no editable at base (0 occurrences in the gridSchema memo), and ObjectGrid still ANDs it with the object's inline-edit verdict and the update grant. (3) A module-private inFieldOrder applies fieldOrder to both projection slots after withoutHiddenFields, copying ListView.effectiveFields. label and data are NOT landed, because each hit its stop condition in the dispatch order (open_questions). label: relaying paints a caption element that repeats the tab-strip label, which the delegation never paints. data: ListView and ObjectGrid disagree on the object provider. So the PR says
Part of #10885rather than a closing line. Both fences are byte-identical and the census is unmoved at 43 read / 21 unread of 64. The objectui#7779 READ_TEXT pin was updated, because it pins the exact navigationConfig line.","files_changed": [
"packages/plugin-view/src/ObjectView.tsx (+49/-12)",
"packages/plugin-view/src/tests/ObjectView.namedViewNavigation-10885.test.tsx (new, 7 tests)",
"packages/plugin-view/src/tests/ObjectView.namedViewInlineEdit-10885.test.tsx (new, 3 tests)",
"packages/app-shell/src/tests/objectViewRouteParity.fieldOrder-10885.test.tsx (new, 6 tests)",
"packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts (READ_TEXT.navigation string follows the new navigationConfig line)",
"packages/plugin-view/README.md and content/docs/plugins/plugin-view.mdx (the member-1 sentence rewritten; one sentence in Opening a record)",
".changeset/10885-object-view-route2-named-grid.md (one dated note appended: +2/-0; frontmatter md5 4d3ab4fd127d2f0feaabd7840d888656 before and after)",
".changeset/10885-object-view-route2-named-view-rest.md (new, '@object-ui/plugin-view': patch)"
],
"fence": "HOST-COMPOSITION SURFACE (objectui#5097), #region line through #endregion line, 186 lines: sha1 40bc22920811a42b0284f478746ff5a5f6b18d10 at base 06a96e9 and at head 600cf89. VIEW-TYPE BRANCHES: a140d0421c41a4401a8b96f6f356b9e8daa9b168 at base and at head.",
"census": "object-view-unmirrored-keys-7779 and schema-reference-named-list-view-keys-7923. Base (ObjectView.tsx swapped to base blob 34f0656469): 237 passed of 237. Head 600cf89: all passed in a 5-file run (315 tests). Both sides carry the 43 read / 21 unread = 64 partition pins ('the renderer reads exactly forty-three names off a named view', 'the census partitions the declaration exactly: 43 read + 21 unread = 64'). readSites.label is still 2, because no label read was added. Before the pin update the head run was 236 passed, 1 failed; the failure was the READ_TEXT exact-text pin for navigation, and no figure moved.",
"tests": "RED ON BASE / GREEN ON HEAD. Each leg starts from HEAD, proves its mutation on disk with a grep count or blob hash, runs the 3 new pin files (16 tests), and restores with git checkout HEAD plus a blob-hash check (git diff HEAD empty after each). base (ObjectView.tsx = base blob): 7 passed, 9 failed. The 9 red rows are every non-control row; the 7 green rows are the controls. Failures are assertions, e.g.
expected [ 'a', 'b', 'c', 'd' ] to deeply equal [ 'c', 'a', 'b', 'd' ], onNavigate not called with r1/view, andthe record form is not inside a container of the named width. head: 16 passed. PER-MEMBER ABLATION: navigation (navigationConfig back to schema.navigation; named read 0, node-only 1): 12 passed, 4 failed, exactly the 4 navigation fix rows. inlineEdit (editable line removed, 0 hits): 15 passed, 1 failed, exactly the inlineEdit fix row. fieldOrder (fieldOrder forced undefined; read 0, ablated 1): 12 passed, 4 failed, exactly the 4 parity rows. grant can-fail proof (ObjectGrid inlineEditable without objectInlineEditable): 2 passed, 1 failed, exactly 'THE GRANT STILL WINS'. The grant row is a control on base by construction, since base never edits. SUITES at head 600cf89: plugin-view type-check exit 0 (both new pins in tsconfig.test.json by --listFilesOnly); vitest run packages/plugin-view/: Test Files 56 passed (56), Tests 549 passed (549). types type-check exit 0, and its 5 ObjectView readers: 315 passed. app-shell type-check exit 0 (the parity pin is in the program). ObjectView readers in other packages: 34 files, Tests 1218 passed (1218); the set is 21 app-shell files that import plugin-view or read its source, react 9357, plugin-map x2, plugin-list 4024, 4 script tests, schema-catalog gallery, 3 console tests and cli app-generator. DECLARED NARROWING: the rest of app-shell's 858 test files were not run locally and belong to CI; no published export or type moved (inFieldOrder is module-private). No ablation-replace.mjs exists in objectui, so each mutation was a python replace that asserts exactly one anchor, then a grep -c on disk. Vitest resolves @object-ui/* to src by alias, so no dist rebuild was needed for the ablations.","gates": [
"check-changeset-presence exit 0: '1 changeset(s) added' / '5 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)'",
"check-changeset-overwrite exit 0 (report-only): 1 modified, case 2 dated note, declared at base and now '@object-ui/plugin-view: patch'",
"check:changeset-claims exit 0 (report-only): 6 pending entries name touched files (6726, 7070, 7499, 8221, 8653, object-view-unmirrored-keys-7779); each was read and still holds",
"check:pending-changeset-literals exit 0: 'No test source names a pending changeset.'",
"check-changeset-no-major exit 0: 'No changeset declares a major bump.'",
"check:new-line-citations exit 0: 'VERDICT new-cross-file-line-citations: 0 new citation(s)'",
"check:control-bytes exit 0: 'check-control-bytes: OK (scanned 9238 tracked text file(s))'",
"check-doc-links exit 0: 'Links are valid across 17 scan roots.'",
"check:spec-symbols exit 0: 'spec member citations: 1422 sources + 184 documentation pages; nothing cites a key its spec symbol does not declare.'",
"check-doc-component-types, check-prompt-component-keys, check-doc-example-ids, check:doc-fences, check-doc-snippet-types, check-doc-example-types, check:doc-example-readers, check:docs-route-closure: all exit 0",
"check:readme-exports: exit 1 at first as PREREQUISITE NOT MET (cli and plugin-ai unbuilt; plugin-view judged clean); after building those two, exit 0: '549 real, 0 wrong-path, 0 fabricated'",
"check:phantom-deps, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:test-path-roots: all exit 0",
"check:eager-closure after vite build of apps/console. Base: 'Console eager closure is 3102.9 KB gzipped across 330 of 2446 chunks (budget: 3104.5 KB, headroom: 1.6 KB)', eagerGzipBytes 3177396, plugin-view chunk gzip 18798. Head: '3103.0 KB ... headroom: 1.5 KB', eagerGzipBytes 3177460, plugin-view chunk gzip 18866. Delta +64 bytes gzip; the plugin-view chunk is eager.",
"git merge-tree --write-tree clean against fresh main 95a7c8d (tree bffa22dd6a) and against PR objectui#10955 head acf69b7 (tree 22d3cf4ecc). PR objectui#10955 merged as 462c858. Its head is not an ancestor of main (exit 1; control leg: base 06a96e9 is an ancestor, exit 0; not shallow). None of the 5 commits since base touches this PR's files.",
"ESLint on the 5 changed TS files: 0 errors. This diff adds no 'any' to ObjectView.tsx. Repo-wide pnpm lint is CI-owned: NOT MEASURED locally.",
"check-governed-queue-guard --test over the 9 paths: 'NOT GOVERNED'",
"PR body read back: 11894 bytes sent, 11894 stored, byte-identical, session-URL footer intact"
],
"deviations": [
"PR line 1 is
Part of #10885, not the ordered closing line. label and data go back as needs_decision, and the role file forbids a closing keyword on a card headed for a decision. Line 2 isClause-②: noas ordered. If the seat splits label and data onto a new card, the seat can supply the closing line as a body replacement.","PR title names the three landed members (fieldOrder, navigation, inlineEdit), not the five in the ordered title, so the title stays true.",
"Two files outside the claim's surface. packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts: READ_TEXT pins the exact navigationConfig line; it was red at head and is updated to the new line. packages/app-shell/src/tests/objectViewRouteParity.fieldOrder-10885.test.tsx: the parity pin needs ListView, which plugin-view cannot import without a phantom dependency.",
"The data provider table and the label caption were measured with scratch-only relays and a scratch probe that imported @object-ui/plugin-list from a plugin-view test. The probe was restored by blob hash and is not in the branch.",
"One verify-lock batch (the doc snippet/example/readers run) chained parts with ';'. Its VERDICT line is batch-last-exit, so each part's exit was echoed separately (all 0)."
],
"mcp_calls": "0 — no MCP GitHub tool was called",
"api_writes": "3 — all through scripts/pm write tools on the fleet-write relay, each a POST /repos/objectstack-ai/objectstack/dispatches that the relay executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectui/pulls (draft, PR 10967); (2) label-write --assign, POST /repos//issues/10967/assignees ['os-elon-musk'], read back MATCHES; (3) post-stamped os-dev-report comment, POST /repos//issues/10885/comments. git push is not REST. Zero label writes.",
"open_questions": [
{
"question": "label (member 4). Should route 2 hand ObjectGrid the active named view's label? Measured with a scratch relay and the real ObjectGrid: with two named views the tab strip shows LABEL_ALL and the table gains a caption element reading LABEL_ALL (a second visible title). With one named view (no tab strip, which is the Studio ViewPreview's case) the caption is the only label. The delegation paints no caption, because ListView hands its grid no label. Relaying also moves the objectui#7779 pin readSites.label from 2 to 3. Today route 2 already reads label as the tab strip's text.",
"options": [
"A: relay label: currentNamedViewConfig?.label into gridSchema. The export filename and the record-detail heading follow the view, but a caption repeats the label under the table on route 2 only, and one pin changes.",
"B: keep label off the grid on route 2 (status quo; the docs already say so). The export filename falls back to table.title.",
"C: relay it to the export filename only, through a new grid key or a caption switch. That is a declared-type move in @object-ui/types and plugin-grid (Clause-② yes)."
],
"axes": "Real need (measured): every in-tree named view authors label (byo-backend-console 'All', the schema-catalog named-views JSON, the README and docs examples), and route 2 shows it in the tab strip when there are 2+ views. No card or consumer asks for the view label in route 2's export filename, and stored-view usage is not measured. Long-term: A creates a new route divergence, a caption that ListView never paints. C adds surface for one filename. B keeps both routes visually alike. AI error: under B, label is not a dropped key, since route 2 reads it for the tab strip, so it is not the declared-not-enforced trap; A shows an authored label twice. Startup focus: B costs nothing; C expands surface; A changes visible UI on the authoring preview.",
"recommendation": "B. label is already read on route 2, as the tab text. Relaying paints a duplicate caption that the delegation never shows, and the only thing gained is an export filename nobody measured a need for."
},
{
"question": "data (member 4). The dispatch order says to stop if ListView and ObjectGrid disagree on a provider, and they do. Measured on the same named view with node objectName probe_task. value: both draw the items. object (other_obj): the delegation's ListView fetches probe_task, because the objectui#7477 ruling B gap-fill lets an objectName already present win; route 2 with a relay would fetch other_obj, because the record-source ladder reads data first. api and schema: both fetch probe_task. At head, route 2 fetches probe_task for all four.",
"options": [
"A: relay data: currentNamedViewConfig?.data into gridSchema. value then matches ListView, but object diverges: the Studio preview would fetch data.object while the console fetches the node's objectName.",
"B: keep data off route 2 (status quo). object, api and schema agree with ListView; value diverges (route 2 fetches objectName where ListView draws the items).",
"C: rule the precedence first. Either one rule for whether a named view's data.object may re-point a node that already names objectName, applied to both ListView and ObjectGrid, or a refusal at authoring of a named view whose data.object differs from the node's objectName. Then relay.",
"D: relay only the value provider. Rejected: it filters providers on the consumer side (AGENTS.md #0.1)."
],
"axes": "Real need (measured): 0 in-tree named views author data. The listViews authors in examples/apps are byo-backend-console and the schema-catalog named-views JSON, and none of them nor the docs examples carries data. Stored-view usage is not measured, and the contract review did not measure it either. Long-term: A adds a cross-route disagreement between two standing rulings (the record-source ladder vs objectui#7477 ruling B). C is the contract-first path. B keeps the one existing divergence on value. AI error: contradictory metadata (named data.object differs from node objectName) resolved differently per route is the trap; one rule or a publish-time refusal (C) fixes it structurally. B silently ignores a value provider on route 2, but no producer writes one today. Startup focus: zero in-tree demand, so B now; C only when a producer appears; no new gate.",
"recommendation": "B now, and C when a producer authors data on a named view. Relaying (A) would make the Studio preview and the console fetch different objects for the same stored view whenever data.object and objectName differ, and which should win is two standing rulings in conflict. That conflict is the maintainer's to settle, not a renderer's."
}
],
"out_of_scope_findings": [],
"acceptance_notes": [
"Member 2 (the delegation's eight view-kind blocks) was enumerated, not graded, and is not taken, per triage execution note 2. Reach, re-measured: git grep -n 'renderListView=' over non-test sources finds 3 host sites (the console object page twice, the Studio design surface once). None passes listViews: the console page's objectViewSchema literal has 0 listViews keys, and StudioDesignSurface.tsx has 0 listViews hits.",
"The navigation fix reaches the delegation by construction, through the shared handler. With no in-tree host passing listViews there, its in-tree reach today is route 2 (the Studio ViewPreview and authored nodes).",
"The member-1 divergence from the contract review stands, unchanged: with a non-empty hiddenFields, route 2 keeps an identity-less column entry and ListView drops it. The fieldOrder parity pins use identified columns."
],
"cleanup": "Before this report was posted, the worktree /home/user/objectui-issue-10885-m4 was cleaned up. The tree was clean and fully pushed (local HEAD = remote branch = 600cf89). Then rm -rf node_modules, and git worktree remove, not forced: exit 0, directory gone. No dev server or monitor was started. The two background builds ran under the verify lock, and each was waited on in the foreground until it exited."
}
Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
Seat rulings on member 4's two open questions ·
domain:uiseat 2 · 2026-09-28T12:0xZsession_014mXUNuFomfj24w7s1pZzhN. The member-4 dev stopped two of the five reads at the stop conditions the order set, and landed the other three in draft PR objectui#10967:navigation,inlineEditandfieldOrder. Both fences are byte-identical, and the census is unmoved at 43 / 21 of 64. The dev report isopen_questions[0]and[1], measured with scratch relays against the realObjectGridandListView.label: ruled B, not relayed on route 2. This narrows the seat's own member-4 list, recorded in the release5867513786, on the dev's measurement.ListViewhands its grid no label.labelas the tab text, so this is not a key that parses and is then dropped.data: ruled B in this PR, and the conflict is filed as objectui#10971 for triage. For the object provider, the two readers pick different objects whendata.objectdiffers from the node'sobjectName.ListViewkeeps the node's name (the objectui#7477 gap-fill).ObjectGrid's record-source ladder readsdata.objectfirst.data.Fixes #10885at landing (the seat applies the body).listViewsandrenderListView.600cf89017.domain:uiseat 2 · seat rulings · 2026-09-28T12:0xZobjectstack-fleet commentedon Sep 28, 2026
✅ ACCEPT: PR objectui#10967 (
Fixes, member 4, the card's last graded member) atbd41f5cf18; ready and auto-merge follow this ACCEPTdomain:uiseat #2,session_014mXUNuFomfj24w7s1pZzhN. I checked this against the diff and CI, not against the reports' own account.5868584175.5869413175.5869332015, plus the fix-round report relayed in-session.navigationreplaces the node's as a whole, so the row click and the record, create and edit form surface follow it, on the delegation too when the host wires the handler.inlineEditgoes to the grid aseditable, and the object's inline-edit grant still gates it.fieldOrderis applied afterhiddenFields, with parity againstListView. Both fences are byte-identical, and the census is unmoved (43 read / 21 unread of 64)labelB: not relayed, because it is already the tab's text and relaying would paint a second caption.dataB: not relayed, and the provider conflict betweenListViewandObjectGridis objectui#109715869604558FAIL on wording only, then fix round 1bd41f5cf18(prose only), then the in-seat delta record PASS (posted with this landing)split/popover) and objectui#10976 (ObjectViewSchema.tabletyped to carry 60 keys, 13 of them read)'@object-ui/plugin-view': patch, plus a dated note on member 1's pending entry, frontmatter byte-identicalgit merge-treeclean againstmainbd41f5cf18: every check final and green before readyFixes #10885. Member 1 (PR objectui#10937), member 3 (PR objectui#10955) and member 4 have landed. Member 2 was enumerated, not graded, and is recorded in the PR's Acceptance notes per triage execution note 2fix(plugin-view): the registered object-view reads a named view's gri…
docs(changeset): date the three named-view census entries that PR obj…
fix(plugin-view): route 2 reads a named view's fieldOrder, navigation…