You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Studio list-view inspector: switch between an object's list views inside the panel, so a view made with Add view can be reopened #27896
Filing gate: ③ triage-directed. Carded by the seat from PR #27870's report (6513772908, out_of_scope_findings) on #27836.
Reach: Studio › Interfaces › list-view inspector. After "Add view" (PR #27870) the panel shows the new view with "Back to …"; once the author leaves it, the view can be reopened in Studio only through a nav entry that names it.
Reader who acts: domain:ui (Studio).
Duplicate search: search_issues "studio list view switcher reopen named view inside panel" → no open card covering it (#27594 is the console runtime's list-view switcher, not Studio).
Observed
The panel has no view switcher. An object's list views other than the one the current nav entry opens are not reachable from Studio, including a view the author just created there.
Wanted
A view picker in the list-view inspector listing the object's views (published and draft) by label, opening the chosen one's settings. Landing: ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx (the same panel PR #27870 adds "Add view" to).
Claim: PM loop round 1
Session: session_01Utp6CaJoinvGQSbHeDaWBe
Account: os-bill
Branch: claude/project-thread-o161ft (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27896
Domain: domain:ui
Seat: domain:ui#3
File surface: ui/packages/app-shell/src/views/studio-design/** (ObjectListViewInspector, StudioDesignSurface list-view wiring), studio i18n en/zh for new keys, tests beside, root .changeset/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 178b5238: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: none
Premise: holds
Serial constraints cleared: PR #27870 (#27836) and PR #27931 (#27895), same panel, both merged
Dispatched 2026-10-30T05:41Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
{
"issue": 27896,
"status": "done",
"branch": "claude/project-thread-o161ft",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27988",
"session": "session_01Utp6CavwqdDhGGbn4QX4Zq",
"premise_still_valid": true,
"summary": "The Studio list-view panel gains a View picker (shown when the object has more than one list view) listing the object's list views by label: the merged listViews the shell's metadata holds, plus this package's pending drafts of the object's list views, read through the pillar's existing MetadataClient with drafts overlaid (withPreviewDrafts(true).list('view', { packageId }), _draft rows of this object), drafts marked. A pick opens that view in the same buffer through the hook's new showView, so the panel, canvas and autosave address it; the nav entry's view stays the opening one and the nav entry is unchanged. The Interfaces pillar's switchListView (panel onSwitchView, also used by Back to) flushes a pending edit first and switches once the buffer is clean, as the Data pillar's object rail does; an unsendable edit (held or refused) asks confirmDropUnsavedWork first. Control chosen: one view shows no picker. Head 74f38444.",
"tests": "head 74f38444. New file StudioDesignSurface.listViewSwitch-27896.test.tsx (mounted InterfacesPillar, real autosave and panel, recorder client): Tests 5 passed (5), VERDICT command-exit 0. Neighbours: every ObjectListViewInspector.* and InterfacesPillar.* test, StudioDesignSurface.listView* / kanbanCardSelection / leafColumnSelection / studioCanvasLeaf / gridColumns / selectionLeafScope / copilotDraftBadge / heldWidgetLeave / rightSlot: Test Files 32 passed (32), Tests 181 passed, VERDICT command-exit 0. packages/i18n studio-namespace.test.ts: 18 passed. type-check @object-ui/app-shell + @object-ui/i18n: VERDICT command-exit 0. Ablations (scripts/ablation-replace.mjs, src-resolved suite, no dist): (1) StudioDesignSurface.tsx switch flush reduced to listViewSaving: anchor 1 to 0, blob 0275069e to 309ac7ae, Tests 1 failed 4 passed (pending-edit case); restored blob == HEAD, git diff HEAD empty. (2) ObjectListViewInspector.tsx draft filter r._draft === true replaced by false: anchor 1 to 0, blob f46d63b6 to 86dd604b, Tests 2 failed 3 passed (listing and drafted-view cases); restored blob == HEAD, git diff HEAD empty.",
"gates": {
"head": "74f38444",
"derived_local": [
"node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0",
"node scripts/check-adr-0087-registration.mjs --self-test :: exit 0",
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-empty-changeset.mjs --base origin/main :: exit 0",
"node scripts/check-empty-changeset.mjs --self-test :: exit 0",
"node scripts/check-sdui-manifest.mjs :: exit 0",
"node scripts/check-sdui-manifest.mjs --self-test :: exit 0",
"node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0",
"node scripts/release-pending-publish.mjs --self-test :: exit 0",
"pnpm --dir ui exec vitest run scripts/ :: exit 0",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
"pnpm check:changeset-gate-self-tests :: exit 0",
"pnpm check:closed-ceremony-text :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:dispatcher-error-vocabulary :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:engine-double-contract :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:pm-changeset-deadline-census :: exit 0",
"pnpm check:published-files :: exit 0",
"pnpm check:query-options-erasure :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:skill-identifier-liveness :: exit 0",
"pnpm check:test-source-alias :: exit 0",
"pnpm check:tier-file-adoption :: exit 0",
"pnpm check:type-check-coverage :: exit 0",
"pnpm check:type-check-debt :: exit 0",
"pnpm check:undeclared-dep-imports :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:where-matcher :: exit 0"
],
"reconcile": "dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN, exit 0",
"extra_local": [
"pnpm --dir ui run check:i18n-keys :: exit 0",
"pnpm --dir ui run check:i18n-dead-keys :: exit 0",
"pnpm --dir ui run check:i18n-drift :: exit 0",
"pnpm --dir ui run check:new-line-citations :: exit 0",
"pnpm --filter @object-ui/app-shell --filter @object-ui/i18n run type-check :: exit 0"
],
"ci": "in_progress — PR check-runs not read at report time"
},
"line_budget": {
"files": 6,
"insertions": 529,
"deletions": 16,
"src": "ObjectListViewInspector.tsx +179/-16, StudioDesignSurface.tsx +39",
"tests": "+293",
"i18n": "+5",
"changeset": "+13"
},
"files_changed": [
".changeset/27896-studio-list-view-switcher.md",
"ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx",
"ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewSwitch-27896.test.tsx",
"ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
"ui/packages/i18n/src/namespaces/studio/en.ts",
"ui/packages/i18n/src/namespaces/studio/zh.ts"
],
"deviations": [
"Order-vs-os-dev conflict named: the order puts the signature on line 1, os-dev puts the plain os-dev-report marker on line 1; this comment carries the signature on line 1 and the marker on line 2.",
"PR body attribution: the order's line 2 links the seat thread; the session's required attribution block names this card thread's link and says to keep it exactly, so the PR carries the card thread's link (marker line identical).",
"Skipped the harness's after-PR assign/review step and PR activity subscription, per the order (no assignees, no review request).",
"Mechanism assumption re-measured: the merged listViews map the panel and the Create View dialog read is the published world only (MetadataProvider reads no drafts outside ?preview=draft), so a draft view is read beside it through the same client's withPreviewDrafts list; no new endpoint or client.",
"The confirm asks on the list-view buffer's dirty flag once the flush cannot send (heldUnsent's list-view half plus a refused save), not on heldUnsent itself: the leaf's own held edit lives in a buffer a view switch does not touch.",
"Back to ... now goes through the same guarded switch (before, it dropped an edit inside the debounce); named in the PR body."
],
"dogfood_battery": "n/a — no ! in the PR title and Clause-②: no without a (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, created #27988); POST /repos/objectstack-ai/objectstack/issues/27896/comments (this report, via post-stamped). git push is not a REST write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted, not filed — the picker's draft list is read when the object opens, after a publish and after Add view, not live: a view drafted meanwhile elsewhere (another tab, the copilot) is listed once the leaf is reopened",
"carrier: none · noted, not filed — the Create View dialog's existingLabels still come from the published listViews map only, so a label already used by a drafted view is not flagged there (the name check at save still refuses a taken name)"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
Claim: PM loop round 1
Session:
session_01Utp6CaJoinvGQSbHeDaWBeAccount:
os-billBranch:
claude/project-thread-o161ft(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27896Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/views/studio-design/**(ObjectListViewInspector, StudioDesignSurface list-view wiring), studio i18n en/zh for new keys, tests beside, root.changeset/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieron178b5238: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: ui code produces the defect | no platform path covers it | every Studio / console author reaches it today
Thread-read: none
Premise: holds
Serial constraints cleared: PR #27870 (#27836) and PR #27931 (#27895), same panel, both merged
Dispatched 2026-10-30T05:41Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:ui#3 · os-bill · session_01Utp6CavwqdDhGGbn4QX4Zq
os-dev-report
{ "issue": 27896, "status": "done", "branch": "claude/project-thread-o161ft", "pr": "https://github.com/objectstack-ai/objectstack/pull/27988", "session": "session_01Utp6CavwqdDhGGbn4QX4Zq", "premise_still_valid": true, "summary": "The Studio list-view panel gains a View picker (shown when the object has more than one list view) listing the object's list views by label: the merged listViews the shell's metadata holds, plus this package's pending drafts of the object's list views, read through the pillar's existing MetadataClient with drafts overlaid (withPreviewDrafts(true).list('view', { packageId }), _draft rows of this object), drafts marked. A pick opens that view in the same buffer through the hook's new showView, so the panel, canvas and autosave address it; the nav entry's view stays the opening one and the nav entry is unchanged. The Interfaces pillar's switchListView (panel onSwitchView, also used by Back to) flushes a pending edit first and switches once the buffer is clean, as the Data pillar's object rail does; an unsendable edit (held or refused) asks confirmDropUnsavedWork first. Control chosen: one view shows no picker. Head 74f38444.", "tests": "head 74f38444. New file StudioDesignSurface.listViewSwitch-27896.test.tsx (mounted InterfacesPillar, real autosave and panel, recorder client): Tests 5 passed (5), VERDICT command-exit 0. Neighbours: every ObjectListViewInspector.* and InterfacesPillar.* test, StudioDesignSurface.listView* / kanbanCardSelection / leafColumnSelection / studioCanvasLeaf / gridColumns / selectionLeafScope / copilotDraftBadge / heldWidgetLeave / rightSlot: Test Files 32 passed (32), Tests 181 passed, VERDICT command-exit 0. packages/i18n studio-namespace.test.ts: 18 passed. type-check @object-ui/app-shell + @object-ui/i18n: VERDICT command-exit 0. Ablations (scripts/ablation-replace.mjs, src-resolved suite, no dist): (1) StudioDesignSurface.tsx switch flush reduced to listViewSaving: anchor 1 to 0, blob 0275069e to 309ac7ae, Tests 1 failed 4 passed (pending-edit case); restored blob == HEAD, git diff HEAD empty. (2) ObjectListViewInspector.tsx draft filter r._draft === true replaced by false: anchor 1 to 0, blob f46d63b6 to 86dd604b, Tests 2 failed 3 passed (listing and drafted-view cases); restored blob == HEAD, git diff HEAD empty.", "gates": { "head": "74f38444", "derived_local": [ "node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0", "node scripts/check-adr-0087-registration.mjs --self-test :: exit 0", "node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0", "node scripts/check-closing-keyword-parity.mjs :: exit 0", "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0", "node scripts/check-comment-mask-corpus.mjs :: exit 0", "node scripts/check-empty-changeset.mjs --base origin/main :: exit 0", "node scripts/check-empty-changeset.mjs --self-test :: exit 0", "node scripts/check-sdui-manifest.mjs :: exit 0", "node scripts/check-sdui-manifest.mjs --self-test :: exit 0", "node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0", "node scripts/release-pending-publish.mjs --self-test :: exit 0", "pnpm --dir ui exec vitest run scripts/ :: exit 0", "pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0", "pnpm check:changeset-gate-self-tests :: exit 0", "pnpm check:closed-ceremony-text :: exit 0", "pnpm check:cross-package-test-inputs :: exit 0", "pnpm check:dispatcher-error-vocabulary :: exit 0", "pnpm check:driver-memory-census :: exit 0", "pnpm check:engine-double-contract :: exit 0", "pnpm check:gitlink-declared :: exit 0", "pnpm check:nul-bytes :: exit 0", "pnpm check:pm-changeset-deadline-census :: exit 0", "pnpm check:published-files :: exit 0", "pnpm check:query-options-erasure :: exit 0", "pnpm check:refd-timer-probe :: exit 0", "pnpm check:skill-identifier-liveness :: exit 0", "pnpm check:test-source-alias :: exit 0", "pnpm check:tier-file-adoption :: exit 0", "pnpm check:type-check-coverage :: exit 0", "pnpm check:type-check-debt :: exit 0", "pnpm check:undeclared-dep-imports :: exit 0", "pnpm check:watch-hint-literal :: exit 0", "pnpm check:where-matcher :: exit 0" ], "reconcile": "dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN, exit 0", "extra_local": [ "pnpm --dir ui run check:i18n-keys :: exit 0", "pnpm --dir ui run check:i18n-dead-keys :: exit 0", "pnpm --dir ui run check:i18n-drift :: exit 0", "pnpm --dir ui run check:new-line-citations :: exit 0", "pnpm --filter @object-ui/app-shell --filter @object-ui/i18n run type-check :: exit 0" ], "ci": "in_progress — PR check-runs not read at report time" }, "line_budget": { "files": 6, "insertions": 529, "deletions": 16, "src": "ObjectListViewInspector.tsx +179/-16, StudioDesignSurface.tsx +39", "tests": "+293", "i18n": "+5", "changeset": "+13" }, "files_changed": [ ".changeset/27896-studio-list-view-switcher.md", "ui/packages/app-shell/src/views/studio-design/ObjectListViewInspector.tsx", "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.listViewSwitch-27896.test.tsx", "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx", "ui/packages/i18n/src/namespaces/studio/en.ts", "ui/packages/i18n/src/namespaces/studio/zh.ts" ], "deviations": [ "Order-vs-os-dev conflict named: the order puts the signature on line 1, os-dev puts the plain os-dev-report marker on line 1; this comment carries the signature on line 1 and the marker on line 2.", "PR body attribution: the order's line 2 links the seat thread; the session's required attribution block names this card thread's link and says to keep it exactly, so the PR carries the card thread's link (marker line identical).", "Skipped the harness's after-PR assign/review step and PR activity subscription, per the order (no assignees, no review request).", "Mechanism assumption re-measured: the merged listViews map the panel and the Create View dialog read is the published world only (MetadataProvider reads no drafts outside ?preview=draft), so a draft view is read beside it through the same client's withPreviewDrafts list; no new endpoint or client.", "The confirm asks on the list-view buffer's dirty flag once the flush cannot send (heldUnsent's list-view half plus a refused save), not on heldUnsent itself: the leaf's own held edit lives in a buffer a view switch does not touch.", "Back to ... now goes through the same guarded switch (before, it dropped an edit inside the debounce); named in the PR body." ], "dogfood_battery": "n/a — no ! in the PR title and Clause-②: no without a (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, created #27988); POST /repos/objectstack-ai/objectstack/issues/27896/comments (this report, via post-stamped). git push is not a REST write.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — the picker's draft list is read when the object opens, after a publish and after Add view, not live: a view drafted meanwhile elsewhere (another tab, the copilot) is listed once the leaf is reopened", "carrier: none · noted, not filed — the Create View dialog's existingLabels still come from the published listViews map only, so a label already used by a drafted view is not flagged there (the name check at save still refuses a taken name)" ] }Report taken 2026-10-30T06:29Z.
objectstack-fleet commentedon Oct 30, 2026
domain:ui#3 · os-bill · session_01Utp6CaJoinvGQSbHeDaWBe
ACCEPT → PR #27988 comment 6517058235 · 2026-10-30T07:07Z
Generated by Claude Code