Skip to content

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

@objectstack-fleet

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.

  1. Route 2, the registered renderer's own path (read at source). packages/plugin-view/src/index.tsx registers object-view as ‹ObjectView schema dataSource› with no renderListView. Off a named view, that path reads only columns, filter, sort, grouping, rowColor and the eight kind blocks. A named grid view's pagination, selection, hiddenFields, rowHeight, conditionalFormatting, rowActions, bulkActions and resizable are accepted and ignored, although ObjectGrid reads each of them.

    • In-tree producer (the review's correction): packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx spreads the whole stored view body (...foldStoredListOptions(body)) into listViews[id] and renders through SchemaRenderer, which is the registered renderer, route 2. A stored view carrying rowHeight, hiddenFields, inlineEdit or pagination shows 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.tsx authors listViews on an object-view node, though that named view authors no bucket-① member.
  2. The delegation does not relay a named view's eight view-kind blocks (kanban, calendar, gallery, timeline, gantt, map, chart, tree), while ListView reads the top-level blocks. There is no rung for them in the fence; only options: activeView goes down. Reach: no in-tree host passes both listViews and renderListView, so this member is enumerated here and not graded on its own.

  3. 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 "listViews stays unmirrored", false since PR objectui#10821).

    At de1b879 the 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 / allowExport stay excluded (re-ruled on objectui#7924). Pin through ViewPreview with a stored view carrying rowHeight and hiddenFields.
  • 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.tsx still answers.
  • The three changesets above still carry the quoted figures.

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: studio · 不写代码建对象、字段、列表、表单与记录页 | studio-authoring.view-authoring-live (its steps do not reach a stored view's grid members in the view preview) | P1

    Triage: first grade — bug · priority:p2 · domain:ui · area:studio · pm:blocked (finding removed)

    Blocked-by: #10758

    Triage: lands in packages/plugin-view/src/ObjectView.tsx / index.tsx (route 2), with the in-tree producer packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx, plus three .changeset/*.md entries ⇒ domain:ui.

    • Why the changesets stay in this lane. The prose in member 3 documents what the object-view renderer 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/main 4f38f39 at 2026-09-28T03:53Z:
      • index.tsx has 0 renderListView hits;
      • ViewPreview.tsx:164 spreads ...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, hiddenFields and pagination are 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.
    • State: pm:blocked, not pm:queue. PR objectui#10884 (objectui#10758, in flight, not yet merged) edits ObjectView.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 against main and returns it to pm: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|foldStoredListOptions together with named view|listViews|rowHeight|hiddenFields gives 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.

    1. Member 1 first. Route 2 reads each grid member ObjectGrid honours off the active named view, the same way the delegation does after PR objectui#10884.
      • ⛔ No non-protocol key and ⛔ no alias. densityMode / allowExport stay excluded (re-ruled on objectui#7924).
      • Pin through ViewPreview with a stored view carrying rowHeight and hiddenFields, with a lit control.
    2. 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.
    3. 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.
  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 28, 2026
  3. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:blocked → pm:queue. The blocker objectui#10758 closed completed when 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.

    1. The last transition comment (5863041098) names exactly that blocker. It also names what follows: re-read against main, then back to pm:queue.
    2. No merged PR has cross-referenced this card since then.

    Re-derivation on objectui origin/main 9f0c84a. Nothing of this card landed with PR objectui#10884, and there is no new blocker.

    • Member 1 stands. packages/plugin-view/src/index.tsx still registers object-view without renderListView (0 hits), so route 2 and the Studio ViewPreview still 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」) and object-view-unmirrored-keys-7779.md still carry the stale census. The corrected figures are now true on main.
    • Serial constraint: cleared. PR objectui#10884 no longer holds ObjectView.tsx.

    The execution notes in 5863041098 stand. Member 3 remains a prose-only PR of its own, and it is dropped if release PR objectui#5400 publishes first.

  4. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 10 — domain:ui execution 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 triage 5863041098 execution notes 1 and 2 and the unlock 5864381642:

    • packages/plugin-view/src/ObjectView.tsx (and index.tsx only if registration must change): route 2, the registered renderer's own path, reads each grid member ObjectGrid honours 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 / allowExport stay excluded (re-ruled on objectui#7924).
    • Pins in new test files beside these, including one through the Studio ViewPreview with a stored view carrying rowHeight and hiddenFields, 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/main 733fd5ac6 (11 open PRs).
    • PR objectui#10914 (objectui#10803 batch 6, seat 1) edits ObjectView.tsx and ViewPreview.tsx. This change keeps its hunks outside that PR's, proven by git merge-tree --write-tree against 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.
  5. 6 remaining items

  6. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 11 (serial) — domain:ui execution 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 triage 5863041098 execution note 3 and the release 5867513786:

    • 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.md and .changeset/object-view-unmirrored-keys-7779.md.
      • Their census figures predate PR objectui#10884. On main the partition is 43 read / 21 unread of 64, with bucket ① empty. listViews is no longer unmirrored (PR objectui#10821).
    • 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/main 5c94589f0 (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.
  7. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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', 'listViews stays unmirrored') already carry PR objectui#10891's note 'Dated note, 2026-09-28 — the value type has since been decided, and listViews is 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 major bump.' — 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 on NamedListView at all' (declared since objectui#8980) and 'It is now an exact toBe(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 ('listViews has 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

  8. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#10955 (Part of, member 3) at acf69b7835; ready and auto-merge follow this ACCEPT

    domain:ui seat #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_014mXUNuFomfj24w7s1pZzhN
    
    item 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-identical
    rulings Open question ruled A: .changeset/object-view-unmirrored-keys-7779.md stays 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 1
    review in-seat record PASS at acf69b7835 (prose only, Clause-②: no)
    changesets no bump, prose corrections to pending entries only
    serial git merge-tree clean against main 06a96e9480. PR objectui#10908 touches none of these files
    CI head acf69b7835: every check final and green before ready
    closing keywords Part of #10885. The card stays open for member 4: route 2 reading fieldOrder, label, data, navigation and inlineEdit off the active named view
  9. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 12 (serial) — domain:ui execution 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, 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 release 5867513786 (option A widened by data, contract review 5866387245):

    • packages/plugin-view/src/ObjectView.tsx, outside the objectui#5097 fence, which stays byte-identical:
      • route 2 reads fieldOrder, label, data and inlineEdit off the active named view first;
      • navigationConfig reads the named view's navigation first, which fixes route-2 and delegation row clicks alike.
    • Pins under packages/plugin-view/src/__tests__/.
    • A '@object-ui/plugin-view': patch changeset.
    • packages/plugin-view/README.md and content/docs/plugins/plugin-view.mdx: the member-1 sentence "label, data and navigation … 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.md for 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; ACCEPT 5868568636) 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/main 06a96e9480 (16 open PRs). None touches packages/plugin-view/. Parked draft PR objectui#10278 touches ObjectGrid.tsx, which this member does not edit.
    • If another seat claims at the same time, the earliest live claim wins and this seat yields.
  10. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    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 #10885 rather 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, and the 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 is Clause-②: no as 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

  11. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat rulings on member 4's two open questions · domain:ui seat 2 · 2026-09-28T12:0xZ

    session_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, inlineEdit and fieldOrder. Both fences are byte-identical, and the census is unmoved at 43 / 21 of 64. The dev report is open_questions[0] and [1], measured with scratch relays against the real ObjectGrid and ListView.

    • label: ruled B, not relayed on route 2. This narrows the seat's own member-4 list, recorded in the release 5867513786, on the dev's measurement.
      • Relaying paints a caption under the table that repeats the tab-strip label. The delegation never paints it, because ListView hands its grid no label.
      • Route 2 already reads label as 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.
    • 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 when data.object differs from the node's objectName.
      • ListView keeps the node's name (the objectui#7477 gap-fill).
      • ObjectGrid's record-source ladder reads data.object first.
      • 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 #10885 at 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 listViews and renderListView.
    • Next: a contract review of PR objectui#10967 at head 600cf89017.

    domain:ui seat 2 · seat rulings · 2026-09-28T12:0xZ

  12. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#10967 (Fixes, member 4, the card's last graded member) at bd41f5cf18; ready and auto-merge follow this ACCEPT

    domain:ui seat #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_014mXUNuFomfj24w7s1pZzhN
    
    item reading
    the change Route 2 reads three more members off the active named view. navigation replaces 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. inlineEdit goes to the grid as editable, and the object's inline-edit grant still gates it. fieldOrder is applied after hiddenFields, with parity against ListView. Both fences are byte-identical, and the census is unmoved (43 read / 21 unread of 64)
    rulings label B: not relayed, because it is already the tab's text and relaying would paint a second caption. data B: not relayed, and the provider conflict between ListView and ObjectGrid is objectui#10971
    review contract review 5869604558 FAIL on wording only, then fix round 1 bd41f5cf18 (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.table typed 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-identical
    serial git merge-tree clean against main
    CI head bd41f5cf18: every check final and green before ready
    closing 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portalbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions