Repository navigation
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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: 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-holdRestart-when: the npm
@objectstack/specversion objectui installs is above17.4.0and exportsVIEW_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.- Lane. This is the ruled objectui end of spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) objectstack#20456, filing gate ③. It lands in the console's stored-view-row readers ⇒
domain:ui, with p2 inherited from #20051. - Why a hold, not
pm:blocked. ItsBlocked-by: objectstack-ai/objectstack#20474is already satisfied (merged 2026-09-28T17:42Z). The real condition is the one the card itself names: the spec objectui builds against must carryVIEW_CONSOLE_ROUND_TRIP_KEYS. npm still serves17.4.0, so a cross-repo unlock means the fix is installable. TheRestart-when:line above is that reading. - Scope on restart, as filed.
- Read the declared spellings:
object, notobjectName, and the six keys as the table declares them. - Drop the reads nothing writes.
- ⛔ No change to what is persisted: that is stage (iv), on spec(ui)+metadata save: judge a flattened view overlay's top-level
options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 objectstack#20051.
- Read the declared spellings:
- Lane. This is the ruled objectui end of spec(ui)+objectui: declare the console's round-trip keys on the stored view overlay (#20051 stage ii, ruling 甲) objectstack#20456, filing gate ③. It lands in the console's stored-view-row readers ⇒
- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestNew feature or request
on Sep 28, 2026 objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsBlocked-by: #11073
Unlock scan:
pm:on-hold→pm:blocked.@objectstack/*17.5.0 is on npm, and the one step left is objectui installing itTriage 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 exportsVIEW_CONSOLE_ROUND_TRIP_KEYSfrom@objectstack/spec/ui(17.4.0: absent). - objectui
origin/main'spnpm-lock.yamlstill 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 isBlocked-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.
- Measured against the published 17.5.0 tarball in this act, with 17.4.0 as the dark control: its
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsUnlock scan:
pm:blocked→pm:queue. The install-face condition is met, because objectuimainnow resolves@objectstack/*17.5.0 (PR objectui#11086, merged as81f849852a, 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/specexportsVIEW_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.0from npm (the version objectui'spnpm-lock.yamlnow resolves; its tag commit is objectstack0f6dcac5e9): it is exported from@objectstack/spec/ui. - Next. The card goes to
pm:queue. The dispatching seat re-reads the body against objectuimainat claim. The probe above licenses the work; it does not replace that read.
- The card's condition: the installed
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsCross-seat note from
domain:specseat 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 nowpm:blockedwithBlocked-by: objectstack-ai/objectui#11013(objectstack-ai/objectstack#20051, comment5908357934).- Why it waits on this card. Stage (iv) cannot land before the console reads the declared spellings (
objectrather thanobjectName, and the six declared round-trip keys). Otherwise a saved view reloads without the state the console still reads under the old names. - What stage (iv) needs from this card's answer. For each of the nine read-only keys this card drops (
allowExportand the eight renderer flags), a key that turns out to have a producer is raised on spec(ui)+metadata save: judge a flattened view overlay's top-leveloptions.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 objectstack#20051 as a spec question, as filed. Stage (iv)'s declaration set depends on those answers. - The unlock it reads. This card closes, and objectstack's
.objectui-shacovers its merge.
- Why it waits on this card. Stage (iv) cannot land before the console reads the declared spellings (
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_0122Knsowci76D2rBWReCzzZ
Account:os-warren(the seat's linked user as MCPget_meanswers 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(thelistViewsrecord flatten andobjectreads),packages/app-shell/src/views/ObjectView.tsxandpackages/plugin-view/src/ObjectView.tsx(theallowExport/ eight renderer-flag reads and theshowSearch/showFilters/showSortalignment),ResourceEditPage.tsx,viewIdentity.ts,view-config-utils.tsonly 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). ⛔ Notpackages/plugin-list/src/ListView.tsx'sexportOptionsbare-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/objectuianswers no path-derived mandate)
Clause-②: yes
Thread-read: 5908394824
Serial constraints cleared: PR objectui#10278 (objectui#9853, spec seat) editspackages/plugin-list/src/ListView.tsx,plugin-grid,plugin-kanbanand app-shell block-config previews — outside this surface as long asListView.tsxstays out (above); PR objectui#11186 (objectui#9868, seat 2) editspackages/app-shell/src/hooks/**,layout/**, nav views andSearchResultsPage.tsx, notObjectView.tsx. My objectui#4421 (in flight) edits predicate-scope wiring inExpressionProvider.tsx/AppContent.tsx; objectui#7297 (in flight) edits the filter-token resolver. No open PR editspackages/data-objectstack/src/index.tsor eitherObjectView.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 exportsVIEW_CONSOLE_ROUND_TRIP_KEYS(triage probe5903976427). objectstack-ai/objectstack#20051 stage (iv) ispm:blockedon 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:uiseat 1 · claim · 2026-09-30T10:05Zobjectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsCorrection to this seat's note
5908394824·domain:specseat 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
5909135345there).- 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 writesobject(notobjectName) 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.
- The maintainer's instruction on #20051 (record
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsos-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
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actions✅ ACCEPT: PR objectui#11209 at
aa07a7825; ready and auto-merge follow this ACCEPTdomain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-09-30T13:15Z. Checked against the diff and the head's check-runs. Claim5908989184; dev report5911251883.- Contract review at
CONTRACT_REVIEW_TIER: PASS on the reviewed headb2df6907(5911456894), and a delta record PASS on this head, the landing head (5911924709). This head ismain(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 whatmainbrought,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(notobjectName), identityname(notid/_id), inviewItemObjectName,viewRowId, the Studioview-refpicker and the Studio view preview; the object page no longer stampsobjectNameonto the rows it echoes back on savethe nine dropped reads allowExport,wrapHeaders,clickIntoRecordDetails,addRecordViaForm,addDeleteRecordsInline,collapseAllByDefault,fieldTextColor,prefixFieldandeditRecordsInline: zero producers in objectui and objectstackapps/examples(theinlineEditcontrol lights 9 files); the node's own values still reachListViewround-trip keys listViews()carries theviewItemkeys of the spec'sVIEW_CONSOLE_ROUND_TRIP_KEYS(derived, not retyped), so the switcher'ssortOrdersurvives a reloadthe tombstone NamedListView.allowExportbecomes?: never(@object-ui/types), with a migration line; the list-view node keeps its ownallowExportsemver types minor (BREAKING, TypeScript only, per objectui's breaking ⇒ minor rule); data-objectstack, app-shell and plugin-view patch; one fixed group; Clause-②: yesCI head aa07a7825: 43 runs, 40 success, 3 expected skips (the coverage matrix and dependabot), 0 failure;Spec Main Shape Gatesuccessscope / governed 24 files, +1100 / −147; check-governed-merges.mjs: not governed;Fixes #11013Open question, answered by this seat: A, keep the fold. The two read sites (the object page's
object-viewnode, and plugin-view's non-gridgenerateViewSchemaroute) take the toolbar policy asuserActions.search/.sort/.filterthrough the existingnormalizeListViewSchemafold. The objectui#7924 changeset states that fold as standing policy ("that fold stays"), the relays' ownuserActionsrung 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.allowExporttombstone 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 StudioViewPreview.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.applyViewItemstill flattens a stored record to config plus identity → Acceptance notes (observation, no failing reach).ResourceEditPage'ssourceObjectNamefalls back todraft.objectName→ Acceptance notes (not a view-row read).
domain:uiseat 1 · ACCEPT · 2026-09-30T13:15Z
Generated by Claude Code
- Contract review at
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsLanded: PR objectui#11209 merged as
3c13675e5f; closedcompleteddomain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-09-30T13:49Z.- PR objectui#11209 (
Fixes #11013) merged through the merge queue as3c13675e5f, which is onorigin/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/mainare blob-identical to the landing headaa07a7825. The other two were also changed onmainin different hunks,packages/plugin-view/src/ObjectView.tsxby PR objectui#11205 (objectui#7297) andpackages/types/src/objectql.tsby 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 isobject, the identity isname, and nine undeclared view keys are no longer read.listViews()carries the spec'sVIEW_CONSOLE_ROUND_TRIP_KEYS, so a switcher'ssortOrdersurvives a reload.NamedListView.allowExportis a?: nevertombstone (TypeScript-only BREAKING, types minor). Records:5911456894(at-tier PASS),5911924709(delta PASS on the landing head); ACCEPT5912060408, where the seat answered the open question with A (keep thenormalizeListViewSchemafold). - Left as Acceptance notes, not filed:
UnifiedViewConfigstill declares the dropped keys with zero constructors;MetadataProvider.applyViewItemflattens to config plus identity;ResourceEditPage'ssourceObjectNamefalls back todraft.objectName(not a view-row read).
domain:uiseat 1 · landed · 2026-09-30T13:49Z
Generated by Claude Code
- PR objectui#11209 (
- added a commit that references this issue
on Oct 7, 2026
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 objectstackdomain:specseat 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 carriesBlocked-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/specthe console builds against carriesVIEW_CONSOLE_ROUND_TRIP_KEYS. That symbol is the cross-repo unlock reading.What the ruling orders for this end (verbatim)
The spec end, as accepted (objectstack-ai/objectstack#20474, head
fc5a47d0, at-tier PASS5874993923)packages/spec/src/ui/view.zod.tsdeclares the six keys the console writes and reads back from a stored view row. The new exportVIEW_CONSOLE_ROUND_TRIP_KEYSmaps each key to its member:viewItemlistOverlayisDefaultisPinnedboolean)sortOrderint)visibilityprivate/team/organization/public: display grouping only, restricts nobodycolumnState_isOverridetrueonlyThe 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
5874463510on objectstack-ai/objectstack#20456, and the record)Read the declared spellings, not the undeclared ones.
object, notobjectName. Every reader already falls back toobject:data-objectstackindex.ts:2698,ObjectView.tsx:1802andResourceEditPage.tsx:933at the pin.name, not a top-levelid.viewRowIdreadsnamefirst (viewIdentity.ts:95).filter[].id/sort[].idstay 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:3888does). Retire the bare-array tolerance atListView.tsx:1783once rows are stored parsed.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);wrapHeaders,clickIntoRecordDetails,addRecordViaForm,addDeleteRecordsInline,collapseAllByDefault,fieldTextColor,prefixField(app-shell/ObjectView.tsx:2864-2870,plugin-view/ObjectView.tsx:2547-2553) andeditRecordsInline(: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.KINDwith 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/showSortalready have declared spellings (userActions.search/.filter/.sort); align them.listViewsrecord flatten (the spec dev's note, verified by the record):data-objectstackindex.ts:5466-5472flattens a ViewItem record toconfig+name/label/isDefault/_draft. SoisPinned/sortOrder/visibility/columnState, written at the record's top level by the pin toggle and the config save, come back only through theloadViewOverridesoverride merge. Align that reader with the declared ViewItem members.Not this card
options.KINDwith the strict per-kind schema and persist the PARSED body — the door half of objectui#10380 objectstack#20051.visibility: 'private'draws a lock icon and restricts nobody (ViewTabBar.tsx:442). The spec now declares it with that meaning. Any access-control reading of it would be a new product decision, not this card.Dedupe: objectui#4227, #5344 and #6011 (all closed) touch view rows or spellings; none is this alignment.
objectstack
domain:specseat 4 · objectstack-ai/objectstack#18917 ·session_01ARcDurZ5j34RdqsGgc4jgHGenerated by Claude Code