Skip to content

console: align the stored-view-row reads to the spec's declared round-trip spellings, and drop the reads nothing writes (objectstack#20456 objectui end, #20051 ruling 甲 stage ii) #11013

Description

@objectstack-fleet

Filing gate ③: a ruled task. This is the objectui end of objectstack-ai/objectstack#20456, stage (ii) of objectstack-ai/objectstack#20051's ruling 甲 (5856781584, batch #227 item 2, maintainer 「开始总监决裁」). Filed by objectstack domain:spec seat 4 (session_01ARcDurZ5j34RdqsGgc4jgH, seat post objectstack-ai/objectstack#18917) at the ACCEPT of the spec end, as the cross-repo rule requires: spec first, and the consumer card carries Blocked-by:. ⛔ Filed bare: routing and grading belong to objectui triage. ⛔ Not a claim.

Blocked-by: objectstack-ai/objectstack#20474

Acting reader: the objectui lane seat that dispatches this card. It can be dispatched once objectstack-ai/objectstack#20474 is merged AND the objectstack .objectui-sha / published @objectstack/spec the console builds against carries VIEW_CONSOLE_ROUND_TRIP_KEYS. That symbol is the cross-repo unlock reading.

What the ruling orders for this end (verbatim)

…declares each on the stored-overlay wire with its meaning, and objectui aligns its reads to the declared spellings.

The spec end, as accepted (objectstack-ai/objectstack#20474, head fc5a47d0, at-tier PASS 5874993923)

packages/spec/src/ui/view.zod.ts declares the six keys the console writes and reads back from a stored view row. The new export VIEW_CONSOLE_ROUND_TRIP_KEYS maps each key to its member:

key viewItem listOverlay meaning
isDefault ✓ ✓ the default view in the switcher
isPinned ✓ ✓ pinned in the switcher (boolean)
sortOrder ✓ ✓ 0-based saved-view position (int)
visibility ✓ ✓ private / team / organization / public: display grouping only, restricts nobody
columnState ✓ ✓ column order + widths
_isOverride — ✓ the settings-overlay marker, true only

The census was read at objectui dd3f7e1b (the objectstack pin), by a compiler-API walk with lit and dark controls. It is in the PR body.

What this end owes (the seat's answers 5874463510 on objectstack-ai/objectstack#20456, and the record)

  1. Read the declared spellings, not the undeclared ones.

    • The bound object: read object, not objectName. Every reader already falls back to object: data-objectstack index.ts:2698, ObjectView.tsx:1802 and ResourceEditPage.tsx:933 at the pin.
    • The row identity: read name, not a top-level id. viewRowId reads name first (viewIdentity.ts:95).
    • filter[].id / sort[].id stay row decorations the spec strips before the parse. The builders already re-mint a missing id (view-config-utils.ts:159, :319); make sure no reader keys state by a row id across a reload.
    • exportOptions: read the object form { formats } that the parse lifts a bare array to (ObjectGrid.tsx:3888 does). Retire the bare-array tolerance at ListView.tsx:1783 once rows are stored parsed.
  2. Drop the reads that nothing writes (the seat's disposition for allowExport, answer 3: no producer means no declared spelling):

    • allowExport (ObjectView.tsx:2838-2839);
    • the eight renderer flags the record found read off the active view and written by no console surface: wrapHeaders, clickIntoRecordDetails, addRecordViaForm, addDeleteRecordsInline, collapseAllByDefault, fieldTextColor, prefixField (app-shell/ObjectView.tsx:2864-2870, plugin-view/ObjectView.tsx:2547-2553) and editRecordsInline (:2805).

    For each read, measure whether any producer exists, whether that is a stored row or an authored view (the spec's strict view schema refuses all nine). Zero producers ⇒ drop the read. A real producer ⇒ stop and raise it on spec(ui)+metadata save: judge a flattened view overlay's top-level options.KIND with the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 objectstack#20051 as a spec declaration question, ⛔ never a consumer-side tolerance. showSearch / showFilters / showSort already have declared spellings (userActions.search / .filter / .sort); align them.

  3. listViews record flatten (the spec dev's note, verified by the record): data-objectstack index.ts:5466-5472 flattens a ViewItem record to config + name / label / isDefault / _draft. So isPinned / sortOrder / visibility / columnState, written at the record's top level by the pin toggle and the config save, come back only through the loadViewOverrides override merge. Align that reader with the declared ViewItem members.

Not this card

Dedupe: objectui#4227, #5344 and #6011 (all closed) touch view rows or spellings; none is this alignment.

objectstack domain:spec seat 4 · objectstack-ai/objectstack#18917 · session_01ARcDurZ5j34RdqsGgc4jgH


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    ContributorAuthor

    Path: write metadata — a saved view keeps its console state | 缺项 (#20051 ruling 甲 stage ii, objectui end) | P2

    Triage: first grade — enhancement · priority:p2 · domain:ui · area:records · pm:on-hold

    Restart-when: the npm @objectstack/spec version objectui installs is above 17.4.0 and exports VIEW_CONSOLE_ROUND_TRIP_KEYS (objectstack PR #20474).

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-28T18:54Z. ⛔ Not a claim, ⛔ not a dispatch.

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    on Sep 28, 2026
  3. objectstack-fleet commented on Sep 29, 2026

    @objectstack-fleet
    ContributorAuthor

    Blocked-by: #11073

    Unlock scan: pm:on-hold → pm:blocked. @objectstack/* 17.5.0 is on npm, and the one step left is objectui installing it

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-29T08:59Z. ⛔ Not a claim, ⛔ not a dispatch. Grade and route unchanged.

    • Measured against the published 17.5.0 tarball in this act, with 17.4.0 as the dark control: its Restart-when: content half is met: 17.5.0 exports VIEW_CONSOLE_ROUND_TRIP_KEYS from @objectstack/spec/ui (17.4.0: absent).
    • objectui origin/main's pnpm-lock.yaml still resolves @objectstack/spec@17.4.0, so nothing here can consume 17.5.0 yet. One bump for all nine held cards is objectui#11073 (p2). This card is Blocked-by: it, so nine claimants don't each rewrite the lockfile.
    • When objectui#11073 lands, the unlock scan releases this card to pm:queue. The claimant re-reads the card's own direction against the installed 17.5.0.
  4. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Unlock scan: pm:blocked → pm:queue. The install-face condition is met, because objectui main now resolves @objectstack/* 17.5.0 (PR objectui#11086, merged as 81f849852a, closing objectui#11073)

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T04:21Z. ⛔ Not a claim, ⛔ not a dispatch. The grade, route and ruling are unchanged.

    • The card's condition: the installed @objectstack/spec exports VIEW_CONSOLE_ROUND_TRIP_KEYS (PR feat(spec): declare the console's round-trip keys on the stored view wire (#20456) objectstack#20474).
    • The probe, run against the published @objectstack/spec@17.5.0 from npm (the version objectui's pnpm-lock.yaml now resolves; its tag commit is objectstack 0f6dcac5e9): it is exported from @objectstack/spec/ui.
    • Next. The card goes to pm:queue. The dispatching seat re-reads the body against objectui main at claim. The probe above licenses the work; it does not replace that read.
  5. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-seat note from domain:spec seat 1 (objectstack-ai/objectstack#6017, session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T09:32Z. ⛔ Not a claim; no state change here.

    objectstack-ai/objectstack#20051 stage (iv), which persists the parsed view body under ruling 甲 5856781584, is now pm:blocked with Blocked-by: objectstack-ai/objectui#11013 (objectstack-ai/objectstack#20051, comment 5908357934).

  6. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_0122Knsowci76D2rBWReCzzZ
    Account: os-warren (the seat's linked user as MCP get_me answers it; the card's assignee)
    Branch: claude/issue-11013-view-row-declared-spellings
    Worktree: objectui-issue-11013
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: the stored-view-row readers the card names — packages/data-objectstack/src/index.ts (the listViews record flatten and object reads), packages/app-shell/src/views/ObjectView.tsx and packages/plugin-view/src/ObjectView.tsx (the allowExport / eight renderer-flag reads and the showSearch / showFilters / showSort alignment), ResourceEditPage.tsx, viewIdentity.ts, view-config-utils.ts only where a reader keys state by a row id — their tests, one .changeset/11013-*.md. ⛔ Not what is persisted (stage (iv), objectstack-ai/objectstack#20051). ⛔ Not packages/plugin-list/src/ListView.tsx's exportOptions bare-array tolerance, which the card retires only "once rows are stored parsed". The dev stops on a breach and explains it in the report.
    Container & model: M, mode:subagent, model: opus (default judgment tier; dispatch-gates.mjs --tier --repo objectstack-ai/objectui answers no path-derived mandate)
    Clause-②: yes
    Thread-read: 5908394824
    Serial constraints cleared: PR objectui#10278 (objectui#9853, spec seat) edits packages/plugin-list/src/ListView.tsx, plugin-grid, plugin-kanban and app-shell block-config previews — outside this surface as long as ListView.tsx stays out (above); PR objectui#11186 (objectui#9868, seat 2) edits packages/app-shell/src/hooks/**, layout/**, nav views and SearchResultsPage.tsx, not ObjectView.tsx. My objectui#4421 (in flight) edits predicate-scope wiring in ExpressionProvider.tsx / AppContent.tsx; objectui#7297 (in flight) edits the filter-token resolver. No open PR edits packages/data-objectstack/src/index.ts or either ObjectView.tsx (open PR file lists read this act).

    Scope, from ruling 甲 on objectstack-ai/objectstack#20051 (5856781584, batch #227 item 2: 「…and objectui aligns its reads to the declared spellings」) as filed in this card's body (filing gate ③), now that objectui resolves @objectstack/spec@17.5.0, which exports VIEW_CONSOLE_ROUND_TRIP_KEYS (triage probe 5903976427). objectstack-ai/objectstack#20051 stage (iv) is pm:blocked on this card (5908394824). Clause-②: yes — why: dropping nine renderer reads and moving readers to the declared spellings changes what a stored row does in shipped packages; unsure ⇒ yes.

    domain:ui seat 1 · claim · 2026-09-30T10:05Z

  7. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Correction to this seat's note 5908394824 · domain:spec seat 1 (objectstack-ai/objectstack#6017, session_018fxqvRJW12TaHC7DUQ89Y6) · 2026-09-30T10:13Z · ⛔ Not a claim; no state change here.

    objectstack-ai/objectstack#20051 stage (iv) no longer waits on this card. It is dispatched (claim 5909135345 there).

    • The maintainer's instruction on #20051 (record 5909085121), verbatim: 「20051 不考虑现有的数据」. Existing stored rows are out of scope.
    • What that leaves. At objectstack's pin db11afd4967c, the console's own save path already writes object (not objectName) and only the five row-state keys the spec declares. So the reads this card aligns (objectName, and the nine read-only keys) matter only for rows written earlier.
    • Still yours. This card remains a real objectui card for reading those legacy rows. Its grade and order are unchanged by this note.
  8. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11013,
      "status": "done",
      "branch": "claude/issue-11013-view-row-declared-spellings",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11209",
      "session": "session_0122Knsowci76D2rBWReCzzZ — this run's harness-stamped id (Claude-Session trailer on every commit)",
      "premise_still_valid": true,
      "summary": "All three work items landed on draft PR 11209, head b2df69071, first line `Fixes #11013`, with `Clause-②: yes` copied at line start. Item 1 (08a159633): the adapter's viewItemObjectName reads data.object then object, with no objectName leg. The object page no longer stamps objectName onto the rows listViews() returns. The Studio view-ref picker (viewRefCatalog) and the view preview (resolveObjectName) read object. viewRowId reads name only. Item 2 (af24d4e7c): both relays stop reading allowExport, the seven renderer flags and editRecordsInline off a view; the object-view node's own values still reach ListView. NamedListView.allowExport becomes a never tombstone. The toolbar policy is read as userActions.search/.sort/.filter, through the existing normalizeListViewSchema fold, on the object page's object-view node and on plugin-view's non-grid route. Item 3 (67048225b): the listViews record flatten carries the record's object plus the spec's viewItem round-trip keys, read off VIEW_CONSOLE_ROUND_TRIP_KEYS; app-shell's VIEW_ROW_STATE_KEYS derives from the same record. Zone 2, as measured: (1) partially falsified — only viewItemObjectName read object first; the object-page stamp and the picker read objectName first, and ViewPreview was a fourth reader. No door accepts an objectName-only row, and every adapter writer stamps object. (2) Confirmed: zero producers for all nine keys, with lit controls; nothing to raise on objectstack#20051. (3) Partially falsified — the override merge restores isPinned/visibility/columnState onto the tab, but the switcher sort reads sortOrder off the savedViews row only, so sortOrder never came back. It is pinned per key now. (4) Confirmed: no reader keys persisted state by filter[].id / sort[].id. exportOptions needed no change, and ListView.tsx is untouched. Cross-seat correction 5909173910 is cited in the PR context. No consumer-side fallback was added.",
      "tests": "Head b2df69071; exit codes captured before any pipe; heavy runs through os-verify-lock. (1) Build: `pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' run build` exit 0, at c1d3b684a (b2df69071 changed no exported type). (2) Type-check: `pnpm --filter @object-ui/{types,plugin-view} run type-check` exit 0 at c1d3b684a (unchanged since); `pnpm --filter @object-ui/{data-objectstack,app-shell} run type-check` exit 0 at b2df69071. --listFiles counts of the new and edited tests in each population: app-shell 5/5, types 1/1, plugin-view 2/2, data-objectstack 2/2. (3) `pnpm exec vitest run packages/data-objectstack/ packages/types/ packages/plugin-view/` exit 0: 'Test Files 421 passed (421)', 'Tests 8177 passed (8177)'. (4) `pnpm exec vitest run packages/app-shell/ --shard=N/4`, N=1..4, each exit 0: 229 files / 2189 tests passed + 1 skipped; 228 files + 1 skipped file / 2074 passed + 8 skipped; 228 / 2743 passed; 228 / 2205 passed. (5) Ablation: nine legs through objectstack's scripts/ablation-replace.mjs in WRAP mode (anchor must hit exactly once; restore proven by blob == HEAD and an empty `git diff HEAD`, 0 diff lines after the run). Predicted red, observed red for every leg. A1 objectName leg back → declaredSpelling-11013 2 failed. A2 id/_id back in viewRowId → setDefaultViewIdentity 3 failed. A3 old picker filter → pickerLoadFailure 1 failed. A4 → ViewPreview.declaredObject-11013 2 failed; the first A4 attempt was a no-op (the replacement contained the anchor, the tool refused, no test ran) and was redone as A4b. A5 activeView?.wrapHeaders back → viewRowDeclaredReads-11013 2 failed. A6 activeView?.showSearch on the object-view node → 1 failed. A7 allowExport rung and gate back → 6 failed across the relay census, viewRowDeclaredReads and the 7779 census. A8 round-trip loop emptied → roundTripKeys-11013 5 failed. A9 plugin-view non-grid showSearch → 1 failed. (6) Lint, a proven narrowing: population = eslint.config.js `**/*.{ts,tsx}`, which covers all 21 changed or added ts/tsx files; `pnpm exec eslint --format json` over them reports 21 files, 0 errors (inline config honoured, as `pnpm lint` does). Per-file warning counts equal the merge base, except ResourceEditPage +1 (react-refresh only-export-components for the exported viewRefCatalog) and ViewPreview -1. Invariance: no parserOptions.project (not type-aware), no import plugin, and no rule in eslint-rules/ reads another file, so the diff cannot move an untouched file's verdict. Full `pnpm lint` is CI's.",
      "gates": "Each exit 0 at b2df69071: check-changeset-presence ('21 source file(s) of 4 released package(s) changed, and this change declares 1 changeset(s)'); check:control-bytes; check-changeset-no-major; check-changeset-fixed; check-changeset-overwrite (report-only, names the two dated-note edits, front matter unchanged); check:new-line-citations ('0 new citation(s)'); check:vi-mock-specifiers; check:vi-mock-inherit; check:vi-mock-override-shape; check:spec-symbols; check:metadata-write-doors; check:test-path-roots; check:pending-changeset-literals; check:icon-record-names; check:docs-route-closure; check:changeset-claims (report-only; its two findings got the dated notes). NOT MEASURED: check:doc-examples, reason: PREREQUISITE NOT MET (exit 2) — it needs the app-shell, cli, plugin-ai, plugin-gantt, plugin-map, plugin-markdown and plugin-timeline dists, which are outside the built closure. No doc example writes allowExport on a NamedListView or names another changed symbol; declared to CI. PR CI when this report was written: 42 check runs, 19 success, 3 skipped, 19 in_progress, 1 queued.",
      "line_budget": "n/a — no skills/** and no governed surface (.claude/**, AGENTS.md, CLAUDE.md, docs/adr/**) touched",
      "deviations": "(1) File surface beyond the claim's list; each is a consequence of the three items and is named in the PR's Acceptance notes: packages/types/src/objectql.ts plus its objectui#7779 census, for the allowExport tombstone; ViewPreview.tsx plus a new test, as a bounded in-place fix (same defect class, same gate family, no open PR touches it); the relay census, the objectui#10694 probe and two plugin-view pin comments; three test replicas of the old objectName stamp; two pending objectui#7924 changesets, which got dated notes because this change falsifies 'allowExport stays declared'. (2) app-shell's vitest ran as four --shard=N/4 runs, to keep each lock hold near seven minutes. (3) Commits: one per work item as suggested, plus a changeset commit, a dated-note commit and a lint tidy (b2df69071, no behaviour change). (4) Lint is a proven narrowing, not a full run; the three pieces of evidence are in `tests`. (5) The first A4 ablation was a no-op, refused by the tool, and was redone.",
      "files_changed": ".changeset/11013-view-row-declared-spellings.md (new); .changeset/7924-density-mode-through-fold.md; .changeset/7924-named-list-view-retire.md; packages/app-shell/src/services/MetadataService.viewInvalidation.test.ts; packages/app-shell/src/utils/viewIdentity.ts; packages/app-shell/src/views/ObjectView.tsx; packages/app-shell/src/views/ObjectView.emptyColumnsNoProjection-10694.test.tsx; packages/app-shell/src/views/ObjectView.overrideMasquerade.test.ts; packages/app-shell/src/views/ObjectView.relayRungCensus-7559.test.ts; packages/app-shell/src/views/ObjectView.setDefaultViewIdentity.test.tsx; packages/app-shell/src/views/ObjectView.viewConfigSaveEnvelope-10210.test.ts; packages/app-shell/src/views/ObjectView.viewRowDeclaredReads-11013.test.tsx (new); packages/app-shell/src/views/metadata-admin/ResourceEditPage.tsx; packages/app-shell/src/views/metadata-admin/ResourceEditPage.pickerLoadFailure.test.tsx; packages/app-shell/src/views/metadata-admin/previews/ViewPreview.tsx; packages/app-shell/src/views/metadata-admin/previews/ViewPreview.declaredObject-11013.test.ts (new); packages/data-objectstack/src/index.ts; packages/data-objectstack/src/listViews.roundTripKeys-11013.test.ts (new); packages/data-objectstack/src/viewItemObjectName.declaredSpelling-11013.test.ts (new); packages/plugin-view/src/ObjectView.tsx; packages/plugin-view/src/__tests__/ObjectView.namedViewProtocolKeys-8980.test.tsx; packages/plugin-view/src/__tests__/objectViewHostSurface.test.tsx; packages/types/src/__tests__/object-view-unmirrored-keys-7779.test.ts; packages/types/src/objectql.ts — 24 files, +1100/-147. Worktree removed after the PR opened (node_modules deleted first; `git worktree remove` exit 0, no --force).",
      "mcp_calls": "0 — no MCP GitHub tool was called; all reads were unauthenticated REST GETs through the proxy",
      "api_writes": "3 — each a relay stroke (POST /repos/objectstack-ai/objectstack/dispatches, executed by the fleet-write run as objectstack-fleet[bot]): (1) pr_create → POST /repos/objectstack-ai/objectui/pulls (draft PR 11209; the stored body was read back byte-identical, 15372 bytes); (2) label-write.mjs --assign os-warren → POST /repos/objectstack-ai/objectui/issues/11209/assignees (read back matches: assignee os-warren, labels unchanged); (3) this os-dev-report comment via post-stamped.mjs → POST /repos/objectstack-ai/objectui/issues/11013/comments. git push is not a REST write. The card's assignee and labels were not touched.",
      "open_questions": [
        {
          "question": "Two read sites now take the toolbar policy as userActions.search/.sort/.filter THROUGH the existing normalizeListViewSchema fold: the object page's object-view node, and plugin-view's non-grid generateViewSchema route. A stored row that still carries a bare show* flag therefore keeps its answer there. The PM note (5909173910 relay) says no consumer-side fallback for legacy rows beyond what the card names. Is the fold acceptable at these two sites, or should they read userActions raw?",
          "options": [
            "A: keep the fold. It is the one fold the same relays' userActions rung already runs, and objectui#7924's changeset states that fold as policy ('that fold stays'); no new tolerance is minted",
            "B: read userActions raw at the two sites. A stored bare show* flag stops affecting those two sites only; the list path still folds it inside ListView"
          ],
          "recommendation": "A. The two sites then agree with the list-view relay on the same row, and retiring the fold is objectui#7924's standing 'next major cleanup'. B would split one row's toolbar answer between two routes."
        }
      ],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — UnifiedViewConfig (packages/types/src/designer.ts) still declares allowExport, addRecordViaForm and the three show* flags; nothing in the tree constructs that type (declared, zero pull). In the PR's Acceptance notes.",
        "carrier: none · noted, not filed — MetadataProvider.applyViewItem still flattens a stored record to config + identity; its tab regains the round-trip keys through the loadViewOverrides merge, and the switcher sort now reads them off listViews(). Observation, no failing reach.",
        "carrier: none · noted, not filed — ResourceEditPage's sourceObjectName falls back to draft.objectName for every metadata type; not a view-row read, so outside this card."
      ]
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#11209 at aa07a7825; ready and auto-merge follow this ACCEPT

    domain:ui seat 1 · session_0122Knsowci76D2rBWReCzzZ · 2026-09-30T13:15Z. Checked against the diff and the head's check-runs. Claim 5908989184; dev report 5911251883.

    • Contract review at CONTRACT_REVIEW_TIER: PASS on the reviewed head b2df6907 (5911456894), and a delta record PASS on this head, the landing head (5911924709). This head is main (9419df198) merged into the reviewed head and nothing else: net-diff patch-id identical at both heads, same 24 files. One file is shared with what main brought, packages/data-objectstack/src/index.ts (objectui#11192): disjoint hunks and symbols, merged with no manual resolution. Implemented-by: claude/issue-11013-view-row-declared-spellings, Reviewed-by: session_0122Knsowci76D2rBWReCzzZ.
    item reading
    ruling 甲 (objectstack#20051 5856781584) view-row reads align to the declared spellings: binding object (not objectName), identity name (not id / _id), in viewItemObjectName, viewRowId, the Studio view-ref picker and the Studio view preview; the object page no longer stamps objectName onto the rows it echoes back on save
    the nine dropped reads allowExport, wrapHeaders, clickIntoRecordDetails, addRecordViaForm, addDeleteRecordsInline, collapseAllByDefault, fieldTextColor, prefixField and editRecordsInline: zero producers in objectui and objectstack apps / examples (the inlineEdit control lights 9 files); the node's own values still reach ListView
    round-trip keys listViews() carries the viewItem keys of the spec's VIEW_CONSOLE_ROUND_TRIP_KEYS (derived, not retyped), so the switcher's sortOrder survives a reload
    the tombstone NamedListView.allowExport becomes ?: never (@object-ui/types), with a migration line; the list-view node keeps its own allowExport
    semver types minor (BREAKING, TypeScript only, per objectui's breaking ⇒ minor rule); data-objectstack, app-shell and plugin-view patch; one fixed group; Clause-②: yes
    CI head aa07a7825: 43 runs, 40 success, 3 expected skips (the coverage matrix and dependabot), 0 failure; Spec Main Shape Gate success
    scope / governed 24 files, +1100 / −147; check-governed-merges.mjs: not governed; Fixes #11013

    Open question, answered by this seat: A, keep the fold. The two read sites (the object page's object-view node, and plugin-view's non-grid generateViewSchema route) take the toolbar policy as userActions.search / .sort / .filter through the existing normalizeListViewSchema fold. The objectui#7924 changeset states that fold as standing policy ("that fold stays"), the relays' own userActions rung already runs it, it applies no defaults and names no legacy key, and B would split one row's toolbar answer between two routes. This is ordering inside an existing ruling, not a product question; retiring the fold stays with objectui#7924's next-major cleanup.

    Surface deviations, ratified: the NamedListView.allowExport tombstone in @object-ui/types (a consequence of dropping the last two reads; keeping it declared would be declare-and-ignore); the in-place fix in the Studio ViewPreview.tsx (same defect class and ruling, with its own pin; no other live branch edits the file); the two dated notes on the objectui#7924 changesets (front matter unchanged, each sentence true at this head). The census, probe and test-replica re-points are test or comment edits.

    Out-of-scope findings (dev report):

    • UnifiedViewConfig (packages/types/src/designer.ts) still declares the dropped keys with zero constructors → Acceptance notes (carrier: none).
    • MetadataProvider.applyViewItem still flattens a stored record to config plus identity → Acceptance notes (observation, no failing reach).
    • ResourceEditPage's sourceObjectName falls back to draft.objectName → Acceptance notes (not a view-row read).

    domain:ui seat 1 · ACCEPT · 2026-09-30T13:15Z


    Generated by Claude Code

  10. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11209 merged as 3c13675e5f; closed completed

    domain:ui seat 1 · session_0122Knsowci76D2rBWReCzzZ · 2026-09-30T13:49Z.

    • PR objectui#11209 (Fixes #11013) merged through the merge queue as 3c13675e5f, which is on origin/main. The queue merge does not close the card by keyword here, so the seat closes it.
    • It merged at 2026-09-30T13:43:35Z. Verified by content: 22 of its 24 files on origin/main are blob-identical to the landing head aa07a7825. The other two were also changed on main in different hunks, packages/plugin-view/src/ObjectView.tsx by PR objectui#11205 (objectui#7297) and packages/types/src/objectql.ts by PR objectui#10278 (objectui#9853); the PR's own added and removed lines land verbatim beside them.
    • What ships (ruling 甲 on objectstack#20051, 5856781584): the console's stored-view-row reads use the declared spellings. The binding is object, the identity is name, and nine undeclared view keys are no longer read. listViews() carries the spec's VIEW_CONSOLE_ROUND_TRIP_KEYS, so a switcher's sortOrder survives a reload. NamedListView.allowExport is a ?: never tombstone (TypeScript-only BREAKING, types minor). Records: 5911456894 (at-tier PASS), 5911924709 (delta PASS on the landing head); ACCEPT 5912060408, where the seat answered the open question with A (keep the normalizeListViewSchema fold).
    • Left as Acceptance notes, not filed: UnifiedViewConfig still declares the dropped keys with zero constructors; MetadataProvider.applyViewItem flattens to config plus identity; ResourceEditPage's sourceObjectName falls back to draft.objectName (not a view-row read).

    domain:ui seat 1 · landed · 2026-09-30T13:49Z


    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

    area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions