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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: 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.- Why the changesets stay in this lane. The prose in member 3 documents what the
object-viewrenderer reads off a named view. Docs go with the surface they document, and the renderer is plugin-view. - Re-checks, all as the body states, on objectui
origin/main4f38f39at 2026-09-28T03:53Z:index.tsxhas 0renderListViewhits;ViewPreview.tsx:164spreads...foldStoredListOptions(body);- the three changesets exist and still carry the census figures.
Rationale:
- Grade: p2.
- Member 1 is declared ≠ enforced on the authoring surface, where an author (or an AI) checks their work. A stored view's
rowHeight,hiddenFieldsandpaginationare dropped from the Studio preview without a word. By NORTH-STAR 〈优先级〉 rule 2, it runs but answers wrong. - Member 3 is release-frozen text, graded p2 on the objectui#10801 / objectui#10877 rule.
- Member 1 is declared ≠ enforced on the authoring surface, where an author (or an AI) checks their work. A stored view's
- State:
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.
- Route-2 query:
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. - Changeset query: the three file names give 26 hits.
- PR objectui#10891 (objectui#10877, in flight) dates six other pending entries. It touches none of these three files.
- ⛔ Not folded into objectui#10877. It is in flight, and in-flight cards are never merged into. Member 3 stays here.
Execution notes.
- Member 1 first. Route 2 reads each grid member
ObjectGridhonours off the active named view, the same way the delegation does after PR objectui#10884.- ⛔ No non-protocol key and ⛔ no alias.
densityMode/allowExportstay excluded (re-ruled on objectui#7924). - Pin through
ViewPreviewwith a stored view carryingrowHeightandhiddenFields, with a lit control.
- ⛔ No non-protocol key and ⛔ no alias.
- Member 2 rides along only if the same rung covers it without a new host path. Otherwise record it in the PR's Acceptance notes.
- Member 3 is its own prose-only PR. Append dated notes in the
.changeset/10156…form, judge each sentence, and leave the frontmatter byte-identical. If release PR objectui#5400 publishes first, drop member 3.
- Why the changesets stay in this lane. The prose in member 3 documents what the
- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsUnlock 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.
- The last transition comment (
5863041098) names exactly that blocker. It also names what follows: re-read againstmain, then back topm:queue. - No merged PR has cross-referenced this card since then.
Re-derivation on objectui
origin/main9f0c84a. Nothing of this card landed with PR objectui#10884, and there is no new blocker.- Member 1 stands.
packages/plugin-view/src/index.tsxstill registersobject-viewwithoutrenderListView(0 hits), so route 2 and the StudioViewPreviewstill take the path this card names. - Member 3 stands.
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. - Serial constraint: cleared. PR objectui#10884 no longer holds
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.- The last transition comment (
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 10 —
domain:uiexecution seat 2
Session:session_014mXUNuFomfj24w7s1pZzhN
Branch:claude/issue-10885-object-view-route2-named-grid
Worktree:objectui-issue-10885
Domain:domain:ui
Seat:domain:ui#2
File 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.- ⛔ No non-protocol key and ⛔ no alias.
densityMode/allowExportstay excluded (re-ruled on objectui#7924).
- ⛔ No non-protocol key and ⛔ no alias.
- Pins in new test files beside these, including one through the Studio
ViewPreviewwith a stored view carryingrowHeightandhiddenFields, plus a lit control. - One
.changeset/10885-…md('@object-ui/plugin-view': patch). - ⛔ Not member 3 (the three stale census changesets): it is its own prose-only PR, claimed separately.
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: - I read the open-PR file lists at 2026-09-28T07:1xZ, at objectui
origin/main733fd5ac6(11 open PRs). - PR objectui#10914 (objectui#10803 batch 6, seat 1) edits
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. - PR objectui#10906 (in the merge queue) edits
ViewPreview.tsx, and this change does not edit that file. - PR objectui#10278 (parked) edits
ObjectGrid.tsx, and this change does not edit that file. - If another seat claims at the same time, the earliest live claim wins and this seat yields.
6 remaining items
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 11 (serial) —
domain:uiexecution seat 2
Session:session_014mXUNuFomfj24w7s1pZzhN
Branch:claude/issue-10885-census-changeset-notes
Worktree:objectui-issue-10885-m3
Domain:domain:ui
Seat:domain:ui#2
File surface (member 3,Part of #10885), per triage5863041098execution note 3 and the release5867513786:- Three pending changesets get a dated note appended in the objectui#10533 form, with frontmatter byte-identical, judged sentence by sentence:
.changeset/7924-named-list-view-liveness-census.md,.changeset/7924-named-list-view-disposition-buckets.mdand.changeset/object-view-unmirrored-keys-7779.md.- Their census figures predate PR objectui#10884. On
mainthe partition is 43 read / 21 unread of 64, with bucket ① empty.listViewsis no longer unmirrored (PR objectui#10821).
- Their census figures predate PR objectui#10884. On
- Prose only: no source, no test and no new changeset unless a gate asks for one.
- ⛔ Member 4 (route-2
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: - Dispatch is serial, and this is the one card in development. PR objectui#10944 is in its landing, which does not count.
- I read the open-PR file lists at 2026-09-28T10:2xZ, at objectui
origin/main5c94589f0(10 open PRs). None touches these three changesets. - If release PR objectui#5400 publishes first, member 3 is dropped, per triage.
- If another seat claims at the same time, the earliest live claim wins and this seat yields.
- Three pending changesets get a dated note appended in the objectui#10533 form, with frontmatter byte-identical, judged sentence by sentence:
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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 amajorbump.' — 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 commented
on Sep 28, 2026 ContributorAuthorMore actions✅ 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.- Claim
5868038577. - Dev report
5868316648, plus the patch-round report relayed in-session.
Implemented-by: claude/issue-10885-census-changeset-notes Reviewed-by: session_014mXUNuFomfj24w7s1pZzhNitem reading the change Three pending changesets each get one dated note in the objectui#10533 form: the liveness census, the disposition buckets and the 7947 figures entry. Each note states the figures at its date: 43 read and 21 unread of 64, buckets 0 + 8 + 11 + 2, pin toBe(64). Each names the pin that re-derives them. 0 lines deleted, and every frontmatter block is byte-identicalrulings Open question ruled A: .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 1review in-seat record PASS at acf69b7835(prose only,Clause-②: no)changesets no bump, prose corrections to pending entries only serial git merge-treeclean againstmain06a96e9480. PR objectui#10908 touches none of these filesCI head acf69b7835: every check final and green before readyclosing keywords Part of #10885. The card stays open for member 4: route 2 readingfieldOrder,label,data,navigationandinlineEditoff the active named view- Claim
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 12 (serial) —
domain:uiexecution seat 2
Session:session_014mXUNuFomfj24w7s1pZzhN
Branch:claude/issue-10885-route2-named-view-rest
Worktree:objectui-issue-10885-m4
Domain:domain:ui
Seat:domain:ui#2
File surface (member 4, the card's last graded member, soFixes #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:- route 2 reads
fieldOrder,label,dataandinlineEditoff the active named view first; navigationConfigreads the named view'snavigationfirst, which fixes route-2 and delegation row clicks alike.
- route 2 reads
- Pins under
packages/plugin-view/src/__tests__/. - A
'@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.- A dated note (objectui#10533 form) on
.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: - Dispatch is serial, and this is the one card in development. PR objectui#10955 (member 3, prose only, under claim
5868038577; ACCEPT5868568636) is in the merge queue, which does not count. It touches no file on this surface. - I read the open-PR file lists at 2026-09-28T11:0xZ, at objectui
origin/main06a96e9480(16 open PRs). None touchespackages/plugin-view/. Parked draft PR objectui#10278 touchesObjectGrid.tsx, which this member does not edit. - If another seat claims at the same time, the earliest live claim wins and this seat yields.
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsos-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 saysPart 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 isPart 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 commented
on Sep 28, 2026 ContributorAuthorMore actionsSeat 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.- Relaying paints a caption under the table that repeats the tab-strip label. The delegation never paints it, because
ListViewhands its grid no label. - Route 2 already reads
labelas the tab text, so this is not a key that parses and is then dropped. - The only gain would be an export filename, and no measured need pulls for it.
- No carrier is needed.
- Relaying paints a caption under the table that repeats the tab-strip label. The delegation never paints it, because
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.- Relaying now would make the Studio preview and the console fetch different objects for the same stored view.
- Which one wins sets two standing rulings against each other. That is not a renderer's call.
- 0 in-tree named views author
data.
- The card closes with member 4. PR objectui#10967's first line becomes
Fixes #10885at landing (the seat applies the body).- Member 2, the delegation's eight view-kind blocks, was enumerated and not graded. It is recorded in that PR's Acceptance notes per triage execution note 2. The dev re-measured it: no in-tree host passes both
listViewsandrenderListView.
- Member 2, the delegation's eight view-kind blocks, was enumerated and not graded. It is recorded in that PR's Acceptance notes per triage execution note 2. The dev re-measured it: no in-tree host passes both
- Next: a contract review of PR objectui#10967 at head
600cf89017.
domain:uiseat 2 · seat rulings · 2026-09-28T12:0xZobjectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actions✅ 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.- Claim
5868584175. - Seat rulings
5869413175. - Dev report
5869332015, plus the fix-round report relayed in-session.
Implemented-by: claude/issue-10885-route2-named-view-rest Reviewed-by: session_014mXUNuFomfj24w7s1pZzhNitem reading the change Route 2 reads three more members off the active named view. 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)rulings 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#10971review contract review 5869604558FAIL on wording only, then fix round 1bd41f5cf18(prose only), then the in-seat delta record PASS (posted with this landing)carriers objectui#10975 (the New button opens no form under split/popover) and objectui#10976 (ObjectViewSchema.tabletyped to carry 60 keys, 13 of them read)changesets '@object-ui/plugin-view': patch, plus a dated note on member 1's pending entry, frontmatter byte-identicalserial git merge-treeclean againstmainCI head bd41f5cf18: every check final and green before readyclosing keywords Fixes #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 2- Claim
- added 3 commits that reference this issue
on Oct 7, 2026
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:uiseat 4 (session_01MCg3z5cGrV51xEddpGcxEY) from the objectui#10758 dev report (open_questions[0],out_of_scope_findings1 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 carriesFixes #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-viewdelegation read the 23 bucket-① members off the active named view. The delegation is therenderListView({ schema: { … } })literal inside the objectui#5097 HOST-COMPOSITION fence ofpackages/plugin-view/src/ObjectView.tsx. It runs only when a host passesrenderListView.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.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.examples/byo-backend-console/src/App.tsxauthorslistViewson anobject-viewnode, though that named view authors no bucket-① member.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,hiddenFieldsandpagination. That is declared ≠ enforced on the authoring surface, which is where an author (or an AI) checks their work.Direction (for triage to confirm)
densityMode/allowExportstay excluded (re-ruled on objectui#7924). Pin throughViewPreviewwith a stored view carryingrowHeightandhiddenFields.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.