Skip to content

plugin-view: ObjectView honours a spec-shaped named list view (ObjectListViewSchema) — the renderer half that #7928's option A requires before listViews is mirrored by reference #8254

Closed

Description

@os-zhuang

Filed by the director seat under the #7928 ruling (decision batch #70, 2026-09-07, option A — mirror ObjectViewSchema.listViews by reference to the spec's ObjectListViewSchema, contract-first, the same direction already ruled for navigation / searchableFields / filterableFields on #7779). #7928 is pm:blocked on this card and on the docs card; ⛔ the mirror is never shipped as a type-only edit.

Why

Today ObjectView reads a named view through the local NamedListView dialect (47 declared members, 6 read, plus an undeclared data reached via (currentNamedViewConfig as any)?.data at ObjectView.tsx:1815). The spec's ObjectListViewSchema (strict, columns required, spec-shaped filter) is what the platform publishes and what app-shell's ViewPreview.tsx:111-115 already writes into listViews. The renderer must honour the spec shape before the mirror can declare it.

Scope

  • ObjectView resolves a named view from a spec-shaped ObjectListViewSchema: columns, filter (spec filter, not the tuple dialect), sort, label, and whatever else the spec declares that the renderer uses; measure which of the six read local members map to spec members and which have no spec counterpart.
  • data (inline rows on a named view): decide in this card — declare it on the spec slot (objectstack spec card, if the platform wants inline data on named views) or remove the read; record the decision here. ⛔ No as any.
  • Local NamedListView stays only as long as an authored population needs it; measure apps/, examples/, content/, hotcrm for local-dialect named views and report the count (this decides whether a conversion note is needed in the changeset).
  • Pin: a spec-shaped named view renders the same columns/filter as the equivalent local one did; ViewPreview's spread keeps working.

Acceptance

Refs #7928, #7779, PR #7922, #7924, #7947.

Activity

  1. added
    enhancementNew feature or request
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 7, 2026
  2. self-assigned this
    on Sep 16, 2026
  3. os-justin commented on Sep 16, 2026

    @os-justin
    Collaborator

    Claim: PM loop round 1
    Session: session_017bzjQQsBrHdwBy17iHVVe9
    Branch: claude/issue-8254-objectview-spec-named-list-view
    Worktree: objectui-issue-8254
    Domain: domain:ui
    File surface: packages/plugin-view/src/ (ObjectView.tsx and its __tests__/), plus the listViews slot wherever the mirror is declared, plus a changeset (stop on breach; explain in the report)
    Container & model: M/L, mode:subagent, model: default judgment tier — dispatch-gates.mjs --tier <path> --repo objectstack-ai/objectui → exit 2, REFUSING ("this checkout is objectstack-ai/objectstack … a sister repo's list is hand-derived"). ⇒ no path-derived mandate exists; the tier below is this seat's per-card judgement. ⚠️ Taken THIS dispatch with the exit code captured on its own line — after a pipe $? is the pipe's (lane fact 52).
    Clause-②: yes
    Thread-read: none (card carries 0 comments at claim time)
    Serial constraints cleared: none in this lane touch packages/plugin-view — objectui#9578 (queued), objectui#9589, objectui#9595, objectui#9599 are all elsewhere. ⚠️ Declared yes because the card's whole point is that the renderer must ACCEPT a shape it refuses today (ObjectListViewSchema) — that is a widening of the accepted set on its face, whatever the mirror ends up declaring. Recorded here so the in-seat review is not re-deriving the reason.


    Generated by Claude Code

  4. os-justin commented on Sep 16, 2026

    @os-justin
    Collaborator

    os-dev-report

    {
      "issue": 8254,
      "status": "done",
      "branch": "claude/issue-8254-objectview-spec-named-list-view",
      "pr": "https://github.com/objectstack-ai/objectui/pull/9605",
      "session": "session_017bzjQQsBrHdwBy17iHVVe9",
      "premise_still_valid": false,
      "premise_detail": {
        "main_premise_HOLDS": "The renderer did NOT honour a spec-shaped named view, and the gap is real and now closed. ObjectListViewSchema declares columns as the union string[] | ListColumn[]; two of the three routes out of ObjectView end in a NAME slot (ObjectGridSchema.fields, and the fields of the node generateViewSchema emits) that the named-view segment reached RAW. Measured on the base tree by rendering a fixture built with ObjectListViewSchema.parse(...): both name slots received the column OBJECTS, i.e. a non-empty field list naming nothing. That is verbatim the failure the tableColumnFieldNames header already describes for table.columns.",
        "data_sub_decision_premise_DEAD": "The card describes an undeclared `data` reached through a cast on the named-view config. On today's tree: `data` IS declared on NamedListView (as `ListViewSchema['data']`, i.e. BY REFERENCE to the spec type, not a hand copy); the cast is GONE (the read is currentNamedViewConfig?.data ?? ... ); and the protocol's own ObjectListViewSchema declares `data` (confirmed by parse probe). objectui#8980 landed all of it under the director-seat ruling of 2026-09-13 ('`data` replaces the `as any` read: declare it'). The ruling's stated ground ('a key that no published face declares and that is reached only through a cast') is false in BOTH halves. Applying the default direction now would DELETE a read of a member both faces declare, which the file's own comment forbids by name ('do not delete a read as a tidy-up -- a deleted read silently blanks a stored app-shell document'). ACTION TAKEN: nothing. The read stands, no cast was added or kept, no spec slot was declared by me. Reporting the fork is the outcome.",
        "data_population_measured": "ZERO authored named views carry an inline `data` block, measured structurally over every authored named view in apps/, examples/ and content/ (12 views). Control: the grep channel is live -- 644 hits for a `provider:` key elsewhere in the tree, so the zero is a reading and not a dead probe.",
        "member_figures_STALE": "The card says '47 declared members, 6 read'. Re-counted off the declaration source: NamedListView declares 64 top-level members today (47 plus objectui#8980's seventeen). The renderer reads 21 of them off a named view, and 0 of those 21 are undeclared. The instrument that re-derives both numbers is packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts; it was run on this branch and is green.",
        "spec_counterpart_mapping": "Of the 21 members read off a named view, 20 have a counterpart in ObjectListViewSchema (50 keys). EXACTLY ONE has none: `options`, the untyped bag. Enumerated by set difference against the parsed schema shape, not by eye."
      },
      "zone2_measurements": {
        "1_landing_package": "CONFIRMED packages/plugin-view/src/ObjectView.tsx. Re-derived independently: packages/app-shell/src/views/ObjectView.tsx contains ZERO occurrences of `currentNamedViewConfig` on the base commit (grep -c returns 0), while plugin-view's copy has 36 occurrence lines. Both files exist, which is why the first derivation could land on the wrong one.",
        "2_anchors": "The card's anchor line does not point where it says. On the base commit (f0f4d6c) plugin-view/src/ObjectView.tsx is 2361 lines, so a line in the 1800s exists but holds something else. Binding declared at 779 -- the PM's re-derivation of the declaration is CORRECT. The PM's read list (834, 837, 913, 948) is NOT the read set: measured, the binding occurs on 36 lines, of which 29 are property-access reads. Full occurrence list: 779 823 834 837 913 948 1058 1309 1320 1345 1346 1347 1348 1349 1350 1351 1352 1699 1755 1756 1763 1764 1801 1802 1807 1960 1965 2004 2015 2028 2029 2042 2064 2084 2108 2109. The PM's four are the first four after the declaration -- the same truncated-census signature the PM flagged on item 1, recurring on item 2.",
        "3_member_counts": "See premise_detail.member_figures_STALE. 64 declared / 21 read / 0 read-but-undeclared / 43 declared-but-unread.",
        "4_ViewPreview_write": "PARTIALLY FALSIFIED -- the path is wrong and the claim is weaker than stated, but the ORDERING ARGUMENT SURVIVES. There is no packages/app-shell/src/views/ViewPreview.tsx; the file is packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx. Its write is `listViews: { [id]: { ...body, label: body.label ?? draft.label ?? name } }` where body is the metadata-admin draft's own view body. That body is NOT validated against ObjectListViewSchema: metadata-admin's clientValidation gates `view` records with ViewItemSchema / ViewSchema on create and ViewMetadataSchema on edit. So the honest reading is 'ViewPreview spreads a SPEC-VALIDATED view body into listViews', not 'it writes ObjectListViewSchema'. It still lands protocol-shaped values in that slot, and ObjectListViewSchema and ListViewSchema have IDENTICAL 50-key shapes (measured by set difference in both directions: empty both ways), so the renderer-first ordering still follows. The pin reproduces the spread shape rather than importing app-shell, because app-shell depends on plugin-view and importing it in a plugin-view test would invert the package graph."
      },
      "population_count": {
        "scope": "apps/ + examples/ + content/, tests and CHANGELOGs excluded; hotcrm is not in this repo (zero tracked paths match).",
        "authored_named_views_total": 12,
        "by_tree": {
          "apps/": 0,
          "examples/": 3,
          "content/": 9
        },
        "accepted_by_ObjectListViewSchema": 5,
        "refused": 7,
        "refused_for_missing_required_columns": 6,
        "carrying_the_local_tuple_filter_dialect": 2,
        "carrying_inline_data": 0,
        "conversion_note_needed": true,
        "note": "The refusals concentrate in the documentation examples (content/docs/api/schema-reference.md, content/docs/guide/building-crud-app.md, content/docs/plugins/plugin-view.mdx), so objectui#7928's by-reference mirror needs a docs pass shipped with it. The changeset carries the conversion note and points at this card for the count rather than freezing the number in prose."
      },
      "files_changed": [
        "packages/plugin-view/src/ObjectView.tsx  (M, +40 / -6 across two commits: new presence-preserving fold `viewColumnFieldNames`, applied at the two NAME slots; stale `as any` on the named-view `label` read removed; two stale in-file justifications repaired)",
        "packages/plugin-view/src/__tests__/ObjectView.specShapedNamedView-8254.test.tsx  (A, 13 cases)",
        ".changeset/8254-objectview-spec-shaped-named-view.md  (A, minor on @object-ui/plugin-view)"
      ],
      "line_budget": "n/a for the skills ratchet -- the diff touches no skills/** path and no governed surface (check-governed-queue-guard --test on all three paths: exit 0, 'NOT GOVERNED, 3 paths checked against 5 governed surfaces, none matched'). Diff size across both commits: 3 files, +486 / -11.",
      "gates": {
        "derivation": "scripts/pm/dispatch-gates.mjs lives in the objectstack checkout and REFUSES for objectui paths (measured this dispatch by the PM: exit 2). This list is hand-derived from objectui's own package.json scripts and .github/workflows/. All exit codes captured on the line AFTER redirection, never after a pipe.",
        "run_at_head": "de2276e",
        "results": [
          "vitest run packages/plugin-view/ + packages/types/__tests__/object-view-unmirrored-keys-7779.test.ts + packages/app-shell/src/views/ObjectView.relayRungCensus-7559.test.ts -> exit 0, 42 files / 546 tests passed",
          "pnpm --filter @object-ui/plugin-view type-check -> exit 0 (tsc --noEmit AND tsc -p tsconfig.test.json)",
          "turbo run build --filter '@object-ui/plugin-view^...' --concurrency=2 -> exit 0, 15/15 tasks (PREREQUISITE: without the dependency-closure build tsc reports missing workspace .d.ts, which is not a finding about this diff)",
          "eslint . in packages/plugin-view -> exit 0, 0 errors / 362 warnings (no --max-warnings ratchet, deliberately, per lint.yml's own header). New test file contributes 15 warnings, all @typescript-eslint/no-explicit-any, fewer than the peer pin next to it (26).",
          "check-changeset-presence -> 0",
          "check-changeset-fixed -> 0",
          "check-changeset-no-major -> 0",
          "check-changeset-claims -> 0 (report-only; it named 5 pending changesets describing the edited file. All five read: they describe the non-grid fetch, the gantt branch of generateViewSchema, the `title` composition and the viewTabBar census. None is falsified by this diff.)",
          "check-control-bytes -> 0 (plus an out-of-gate self-scan of the three changed files with grep -naP over the control-byte class: no hits)",
          "check-new-cross-file-line-citations -> 0, '0 new citation(s), enforcement report-only'",
          "check-test-path-roots -> 0",
          "check-vi-mock-specifiers -> 0",
          "check-vi-mock-inherit -> 0",
          "check-vi-mock-override-shape -> 0",
          "check-unreferenced-sources -> 0",
          "check-spec-symbol-derivation -> 0",
          "check-phantom-dependencies -> 0",
          "check-governed-queue-guard --test (3 changed paths) -> 0, NOT GOVERNED",
          "PM_SWEEP_REPO=objectstack-ai/objectui node scripts/pm/check-clause2-carriers.mjs --pair 9605 -> EXIT 0, 'PR #9605 / card #8254 -- the clause-2 declaration is readable in the fixed spelling and both carriers agree'"
        ],
        "declared_narrowing": "The manifest carries ninety-odd check:* scripts and the workflows run them across the whole farm. This local run is the subset whose INPUT this diff can move, plus the two pins that re-derive from the edited file by AST -- object-view-unmirrored-keys-7779.test.ts and app-shell's ObjectView.relayRungCensus-7559.test.ts, both of which PARSE packages/plugin-view/src/ObjectView.tsx and would have failed silently unrun. The remainder is the whole farm and belongs to CI. Declaring the narrowing rather than claiming a full sweep.",
        "not_measured_locally": "The repo-wide `pnpm test`, `pnpm lint` (turbo, all packages), the e2e suites and the doc/i18n/dist gate families. None reads an input this diff moves; all run in CI on the PR."
      },
      "tests": "NEW PIN packages/plugin-view/src/__tests__/ObjectView.specShapedNamedView-8254.test.tsx, 13 cases, exit 0. Its spec leg is built by running ObjectListViewSchema.parse(...) rather than by looking spec-shaped, so the fixture cannot drift from the protocol and the strict parse also proves it carries no local-dialect key. Both legs of every case ride ONE fixture side by side in the same expect, which is what the card asked for. ABLATION, from the COMMITTED fix (612d467), reverting the two viewColumnFieldNames(...) call sites to their raw forwards: anchor occurrences before mutation 2 (expected 2); after mutation 0 with 2 raw forwards restored; HEAD blob db4c76a1e36047def04648501fcac83f9b23a99e vs mutated blob e90ba0ad823b3fb2d5590b3c1be0d71601d1525e, so the edit provably reached disk; run -> 'Tests 3 failed | 10 passed (13)'; restore proved BYTE-IDENTICAL to the HEAD blob and by an empty `git diff HEAD`, never by an exit code. The mutation reached the code under test directly -- the test imports ../ObjectView by relative path, so no dist/ sits between the edit and the run. PREDICTION MISS, reported rather than re-fitted: four cases were predicted red, three went red. Two of the four assert a UNION slot the fix never touched and correctly stayed green (they are controls, not fix cases); the third red came from the controls block instead (the no-identity case, which rides the fold). The test file header now records the measured outcome and the miss.",
      "summary": "ObjectView now honours a spec-shaped named list view. Measured gap: the protocol declares a named view's columns as string[] | ListColumn[] while the local NamedListView declares string[], and two of the three routes out of ObjectView end in a NAME slot whose consumers index records by each entry -- the named-view segment reached both raw, so a spec-shaped view arrived as a non-empty field list naming nothing (the same boundary failure objectui#5269 already answered for table.columns). Fixed with viewColumnFieldNames, the presence-preserving twin of that fold over columnIdentity; it narrows a declared union and accepts no spelling columnIdentity did not already accept. The union slots beside it keep taking the value raw. Precedence does not move: an authored empty columns still stops the || chain where it did. filter, sort, label and data needed no renderer change and are pinned anyway. The stale `as any` on the named-view label read is gone. NOTE ON assignee: the card arrived with assignee os-justin already set by the dispatching seat; I did not touch it. The newest claim comment (5695572635) names my branch, as required.",
      "notifier_for_7928": "Suggested text for the seat to post on objectui#7928: 'The renderer half is landed as a draft on objectui#8254 (PR 9605). One renderer gap was found and closed: a named view's `columns` reached two NAME slots raw, so the ListColumn[] half of the protocol's union arrived as a field list naming nothing; the union slots were already correct, and `filter` (spec rule objects), `sort`, `label` and `data` already worked and are now pinned. Three things the mirror must plan for. (1) `data` is ALREADY mirrored by reference (NamedListView.data is ListViewSchema['data']) and the cast is already gone -- objectui#8980 closed that half, so this card decided nothing about it. (2) ObjectListViewSchema is strict and REQUIRES `columns`, which NamedListView makes optional, and it refuses the local-only keys the renderer still reads -- `options` is the one read member with no spec counterpart at all. (3) Measured on objectui#8254: of 12 authored named views in apps/ + examples/ + content/, 7 are refused by ObjectListViewSchema as written -- 6 for the now-required `columns`, 2 for the tuple filter dialect -- and they concentrate in the docs, so the mirror needs a docs pass shipped with it. Re-run that census before acting on the numbers.'",
      "mcp_calls": "0 -- no MCP GitHub tool was called, read or write. Every GitHub read and write went through the REST proxy with curl.",
      "api_writes": "3 REST writes, plus 3 git pushes. (i) POST /repos/objectstack-ai/objectui/pulls -> 201, PR 9605 draft, base main, first body line exactly 'Fixes #8254'. (ii) POST /repos/objectstack-ai/objectui/issues/9605/labels -> 200, needs:contract-review, additive endpoint; comparison read-back returned [plugin, tests, needs:contract-review] -- the carrier survived and the two labels added by the repo's own labeler were not disturbed. (iii) POST /repos/objectstack-ai/objectui/issues/8254/comments -> this report. Pushes: the empty-branch route probe, then 612d467 and de2276e. No PATCH of any body: the PR body was read back in full instead (10264 bytes stored, first line intact, zero angle-bracket-shaped fragments eaten, exactly one attribution footer in the session-URL form with its rule line).",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: the `views`-prop segment sits beside the named-view one at both NAME slots and still forwards raw. It declares string[] and is the objectui#5097 host-composition surface, so its contract has not moved and there is nothing to honour yet. Successor: whoever lands objectui#7928's mirror will read this same expression, and the PR body names it.",
        "noted, not filed: ObjectListViewSchema still admits a bare STRING sort clause (measured: safeParse accepts sort: 'name desc'), while objectui RETIRED that spelling under decision batch #77 and ObjectGrid now REFUSES it rather than lowering it. So a spec-legal named view can carry a sort this renderer deliberately rejects. Not a defect here -- it is an already-ruled divergence -- but it is a second asymmetry the by-reference mirror inherits. Successor: objectui#7928.",
        "noted, not filed: NamedListView['type'] admits 7 values; ObjectListViewSchema's type admits 10 (the extra three being tree, chart and page). tree/chart are host-composition-only by the objectui#5321 ruling and `page` is refused by the spec itself unless a page is named, so nothing is broken -- but the mirror widens this union by reference and that is worth a line on objectui#7928 rather than a discovery during it. Successor: objectui#7928.",
        "noted, not filed: two in-file justifications in ObjectView.tsx had gone stale and were repaired in this diff rather than left to read as live -- the tableColumnFieldNames header asserted that 'both segments ahead of the table one declare string[]', which is the exact premise objectui#7928 removes. Successor: none needed; repaired in place."
      ],
      "deviations": [
        "DECLARED NARROWING of the local gate run -- see gates.declared_narrowing. The dispatch said 'derive the gate list from objectui's own package.json and workflows, run each'. Running each would be the whole farm on a shared box; I ran the subset whose input this diff can move plus the two AST pins that parse the edited file, and declared it here rather than claiming a full sweep. CI runs the rest on the PR.",
        "THE PR BODY CONTAINS ONE SENTENCE I WOULD NOT WRITE AGAIN, LEFT IN PLACE DELIBERATELY. It reads 'objectui#7928 ... is not closed by this pull request'. That puts a closing KEYWORD in the same sentence as another card's number, which my own discipline says to keep apart because the parser ignores negation. Verified before reporting, with the parser's own grammar (KEYWORD then reference): exactly ONE parser-shaped closing reference exists in the stored body, and it is 'Fixes #8254'. On that line the number PRECEDES the keyword and nothing follows the keyword but 'by this pull request', so it cannot fire. NOT repaired, on purpose: the repair is a PATCH of the body, and a PATCH is measured in this repo to downgrade the session-URL attribution footer to the bare form AND to append a second footer -- known damage traded for a hazard that is already proved not to exist. Flagging rather than fixing.",
        "The `data` sub-decision was NOT executed. Its premise is dead (see premise_detail). Per the dispatch's explicit prohibition I stopped and am reporting the fork instead of declaring the key myself or quietly keeping a cast -- there is no cast left to keep.",
        "assignee untouched, as instructed. It arrived set to os-justin.",
        "No own claim comment was left, as instructed. Claim 5695572635 names this branch; confirmed by reading the thread."
      ]
    }
    

    Attribution: generated by Claude Code, session session_017bzjQQsBrHdwBy17iHVVe9.


    Generated by Claude Code

  5. os-justin commented on Sep 16, 2026

    @os-justin
    Collaborator

    ⛔ PUBLIC CORRECTION FIRST — this seat's data ruling was WRONG, and the dev was right to refuse it

    domain:ui execution seat, session_017bzjQQsBrHdwBy17iHVVe9, 2026-09-16T10:4xZ. The dispatch carried a Zone-1 ruling with a named premise and an explicit instruction to stop and report a fork if the premise failed. It failed, the dev stopped, and this is the correction the protocol owes in the same place the ruling was given.

    My ruling read: "the default direction is REMOVE the read, and the cast with it. A key that no published face declares and that is reached only through a cast is declared nowhere and enforced nowhere."

    Both halves of that ground are false. Re-derived by this seat on origin/main, independently of the report:

    my claim measured
    data is declared by no published face ⛔ FALSE. packages/types/src/objectql.ts:2426 declares data?: ListViewSchema['data'] — by reference to the spec type, which is the very shape objectui#7928's option A asks for
    data is reached only through a cast ⛔ FALSE. ObjectView.tsx:2084 reads currentNamedViewConfig?.data ?? … — no cast. The one surviving as any on that binding is at :2004 and is on label, not data (and this PR removes it)
    ⭐ lit control currentNamedViewConfig → 36 occurrence lines in that file ⇒ the instrument reads this tree

    ⇒ objectui#8980 had already closed this under the director seat's ruling of 2026-09-13 — "data replaces the as any read: declare it". My ruling did not merely rest on a stale premise; it pointed the opposite way from a standing director-seat ruling. Had the dev obeyed it, it would have deleted a read of a member both faces declare — which this file's own comment forbids by name: "do not delete a read as a tidy-up — a deleted read silently blanks a stored app-shell document."

    The dev took no action, added no cast, declared no spec slot, and reported the fork. That is the instructed behaviour and it is a full success, ⛔ not a partial delivery. premise_still_valid: false here is the report doing its job.

    ⚠️ And it caught me a second time in the same way. My dispatch listed the read sites as :834 :837 :913 :948. Measured: the binding occurs on 36 lines, 29 of them property-access reads. My four were simply the first four after the declaration — the identical truncated-census signature I had flagged for the dev on the package-location item, recurring one item later in my own prose. Third instance this round. ⇒ ⛔ this seat does not publish an enumeration it has not counted to the end.


    ✅ ACCEPT — PR objectui#9605

    The gap was real and is closed

    The protocol declares a named view's columns as string[] | ListColumn[]; the local NamedListView declares string[]. Two of the three routes out of ObjectView end in a NAME slot whose consumers index records by each entry, and the named-view segment reached both raw — so a spec-shaped view arrived as a non-empty field list naming nothing, verbatim the boundary failure objectui#5269 already answered for table.columns. Fixed with viewColumnFieldNames, the presence-preserving twin of that fold; it narrows a declared union and accepts no spelling columnIdentity did not already accept. Union slots beside it keep taking the value raw, and an authored empty columns still stops the || chain where it did.

    Checklist

    item reading
    PR form draft: true, base main, first body line exactly Fixes #8254
    changed files 3, +486 / -6 — ObjectView.tsx (+57/-6), a 376-line pin, a changeset carrying the conversion note
    CI on head de2276ed434a 29 success / 3 skipped / 4 in_progress / 0 RED, returned == total_count (36). ⚠️ Not converged — re-read before landing
    mcp_calls 0; three REST writes, all budgeted (PR, carrier label, report)
    carrier needs:contract-review hung on both card and PR; --pair 9605 re-run by this seat → exit 0
    changeset present, minor on @object-ui/plugin-view, carries the conversion note and points at the card for the count rather than freezing a figure in prose

    The census the card actually asked for — delivered, and it changes objectui#7928's shape

    reading value
    authored named views in apps/ + examples/ + content/ 12 (0 / 3 / 9)
    accepted by ObjectListViewSchema today 5
    ⛔ refused 7 — 6 for the now-required columns, 2 for the tuple filter dialect
    carrying inline data 0 ⭐ with a lit control (644 hits for a provider: key elsewhere ⇒ the channel is live, the zero is a reading)
    NamedListView declared members 64 — ⛔ not the card's 47; objectui#8980 added seventeen
    read off a named view 21, of which 0 are undeclared
    read members with no spec counterpart ⭐ exactly one — options, the untyped bag, by set difference against the parsed schema

    ⇒ the refusals concentrate in the documentation, so objectui#7928's by-reference mirror needs a docs pass shipped with it. That is new information and it is the most valuable thing in this delivery after the fork.

    Deviations — all accepted

    Declared narrowing of the local gate run (the farm is CI's, and the dev still ran the two AST pins that parse the edited file and would otherwise have sat green unrun — the right instinct). Prediction miss reported rather than re-fitted: 4 cases predicted red, 3 went red, and the header records the miss. And one sentence in the PR body puts a closing keyword near another card's number — the dev verified with the parser's own grammar that exactly one parser-shaped closing reference exists (Fixes #8254) and left it rather than spend a body PATCH, which is measured in this repo to damage the attribution footer. ⚠️ I re-read the stored body and confirm that reading. Correct trade.

    Out-of-scope findings — three noted, not filed, all correctly placed

    None is class (a)/(b)/(c) work for a new card; all three are inputs to objectui#7928 and the PR body names them. Two are worth the mirror's author reading before they start: ObjectListViewSchema still admits a bare string sort that this repo retired under decision batch #77 and ObjectGrid now refuses, and its type union admits 10 values against NamedListView's 7. ⇒ the by-reference mirror inherits both asymmetries. Filing them as cards would scatter what objectui#7928 has to decide in one place; ⛔ not filed is right.

    Next

    ⛔ Not landed. CI not converged. The contract review of record follows on the PR; the carriers stay hung until it is posted. objectui#7928 notified separately.

    domain:ui execution seat · session_017bzjQQsBrHdwBy17iHVVe9 · review of record + ruling correction · 2026-09-16T10:4xZ


    Generated by Claude Code

  6. removed their assignment
    on Sep 16, 2026
  7. os-justin commented on Sep 16, 2026

    @os-justin
    Collaborator

    LANDED — PR objectui#9605 merged · card cleaned · and one audit fact the record must carry

    domain:ui execution seat, session_017bzjQQsBrHdwBy17iHVVe9, 2026-09-16T15:4xZ. ⚠️ Posted from an off-shift seat (brief 5696888799); this is state flush, ⛔ not dispatch.

    Landing verified by CONTENT

    probe reading
    squash subject on origin/main 5226263ef feat(plugin-view): ObjectView honours a spec-shaped named list view (objectui#8254) (#9605)
    the repair viewColumnFieldNames → 4 occurrences in packages/plugin-view/src/ObjectView.tsx
    ⭐ lit control ObjectView in that same file → 43 ⇒ the instrument reads this tree
    ⭐ negative control viewColumnFieldNamesZZZ → 0 ⇒ it does not fire spuriously

    Card state repaired explicitly

    Fixes closed the card and left pm:dispatched, the assignee, AND needs:contract-review all standing. Stripped in one four-step write, read back — card: enhancement, priority:p3, domain:ui, assignees none; PR: plugin, tests.

    ⭐ This window is six more for six on the auto-close never cleaning lane state.

    ⚠️ The audit fact: this PR landed with NO clause-② review of record

    Stated plainly because the ledger should not have to reconstruct it later:

    • The card declared Clause-②: yes, and both carriers were hung as the contract requires.
    • This seat posted a ## Contract review PASS and stripped the carriers — then withdrew it (5696050113) when check-clause2-carriers --pair returned exit 4: the record carried no Served-tier: line, so 「无此行不成裁决」. Carriers were re-hung.
    • ⛔ No valid clause-② record was ever posted on this head, because this seat is served the lane default tier and SKILL.md:523 forbids an off-tier seat from reviewing or spawning a reviewer.
    • The PR was merged at the maintainer's hand with the carriers still hung. ⇒ the carriers above are stripped as moot, ⛔ not as a PASS. There is no PASS on this PR and this comment does not create one.

    ⛔ This is not a complaint and ⛔ nothing here asks for the merge to be revisited — merging is the maintainer's call and the work review stands on its own (5696014949: the repair verified at its call sites, the census delivered, the deviations accepted). The record simply needs to say which gate did and did not run.

    ⚠️ objectstack#18434 is unchanged by this landing. The structural question — a default-tier lane can never discharge a Clause-②: yes card it is entitled to dispatch, because SKILL.md:523 and contract-review.md:54 prescribe opposite remedies — is still open, and the next such card hits the same wall. A merge past it is not an answer to it.

    Carried forward from the work review, ⛔ not closed by this merge

    The dev's census is now live information for objectui#7928: of 12 authored named views, 7 are refused by ObjectListViewSchema as written (6 for the now-required columns, 2 for the tuple filter dialect), concentrated in the docs ⇒ the by-reference mirror needs a docs pass shipped with it. Notified at objectui#7928 5696076625. ⚠️ Re-run that census before acting on the numbers.

    domain:ui execution seat · session_017bzjQQsBrHdwBy17iHVVe9 · landing + audit record, off shift · 2026-09-16T15:4xZ


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions