Context
The QT-parity docking polish epic still has a consumer-facing named-perspectives gap. The source state is ahead of the original epic wording: the saved-layout / named-layout collection model layer already exists, but no rendered Agent Harness or standalone dock surface lets a user save, select, restore, delete, and persist named dock perspectives through that model contract.
Release classification: post-release Agent Harness / M3 docking polish; Project 13 Agent Harness board, not v13 release-board blocking.
The Problem
Neo.dashboard.DockZoneModel now owns the named-layout collection contract, but the available surfaces stop below the actual user workflow. Without a consumer ticket, the next UI/storage implementation is likely to re-derive the collection shape, bypass restoreActiveSavedLayout, or conflate this work with unrelated auto-hide and grouped-tab polish.
This ticket exists to bridge the model helpers into a narrow rendered consumer surface without reopening the model-layer work.
The Architectural Reality
learn/agentos/HarnessDockZoneModel.md documents neo.harness.dockLayoutCollection.v1 and explicitly leaves browser preferences, Memory Core persistence, import/export, and rendered switchers for later consumers.
src/dashboard/DockZoneModel.mjs exposes the saved-layout collection helpers, including create/upsert/select/remove/restore-active behavior.
examples/dashboard/dock/MainContainer.mjs owns the standalone dock example and already projects a committed dockModel through the current example runtime.
apps/agentos/view/Viewport.mjs is the future Agent Harness viewport surface, but implementation should start at the narrowest owner that already has a live dock model.
#13280 covers auto-hide sidebar UI and must remain separate.
#13169 was model-layer only and is closed; this ticket is the UI/storage consumer layer.
The Fix
Add a small named-perspective switcher consumer over the existing DockZoneModel collection helpers:
- Let a user save the current committed dock model as a named layout.
- Let a user select and restore the active named layout through
restoreActiveSavedLayout, not through an ad-hoc clone of the model shape.
- Let a user remove saved layouts while preserving a valid active/default selection.
- Persist and rehydrate the collection through a browser-local or app-local storage adapter appropriate to the chosen owner.
- Expose the workflow in the standalone dock example first, and only wire the AgentOS viewport in the same PR if the implementation naturally owns that runtime without broad app coupling.
If the implementation introduces a new .mjs file, the claimer must run structural-pre-flight and lift patterns from sibling files before authoring it.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
| Rendered perspective switcher |
#13158 named-perspectives lane; DockZoneModel collection helpers |
Save, select, restore, and delete named dock perspectives from a visible UI surface |
Invalid or empty collection falls back to default/current layout without corrupting state |
Example/app JSDoc or local guide note where the UI is introduced |
Focused unit or whitebox/e2e coverage plus manual/visual evidence if UI-only |
| Collection persistence |
learn/agentos/HarnessDockZoneModel.md neo.harness.dockLayoutCollection.v1 |
Store and reload the layout collection through the existing schema version |
Invalid stored payload is ignored or reset fail-closed |
Storage helper/component JSDoc |
Test covers invalid payload and successful rehydrate |
| Restore path |
src/dashboard/DockZoneModel.mjs |
Restore active saved layout via model helper, preserving model contract |
Restore failure leaves current dock model intact |
Method/component JSDoc |
Test covers select -> restore -> rendered/projected state |
| Example/regression surface |
examples/dashboard/dock/MainContainer.mjs |
Standalone dock example demonstrates the workflow with at least two named perspectives or save/switch controls |
Example remains usable with no saved layouts |
Example code/comments only where needed |
Focused smoke/unit/whitebox evidence |
Decision Record impact
aligned-with ADR 0020 / Agent Harness docking architecture. No ADR challenged or superseded. This is a child implementation leaf under the current docking polish epic.
Acceptance Criteria
Out of Scope
- Changing the model helper contract unless a concrete bug is discovered and separately documented.
- Memory Core persistence of dock perspectives.
- Auto-hide sidebar UI (
#13280).
- Grouped tab drag or tab overflow polish.
- Generic core Dock lift outside the dashboard/harness dock model owner.
- Electron runtime support; that remains under
#13033 and the workflow routing clarified by #13302.
Avoided Traps
- Do not re-derive
neo.harness.dockLayoutCollection.v1 in UI state.
- Do not treat this as a release blocker; this is polish under the Agent Harness board, not the v13 release board.
- Do not bundle the auto-hide and grouped-drag leaves into this ticket;
#13158 tracks those as distinct polish axes.
- Do not make Memory Core the first persistence backend. Browser/app-local persistence is enough for this leaf and avoids cross-service coupling.
Related
Parent: #13158
Related: #13012, #13030, #13147, #13153, #13169, #13247, #13280, #13302
Duplicate Sweep
Live latest-open sweep: checked the latest 30 open issues at 2026-06-15T05:49:38Z; no equivalent named-perspective switcher/storage UI ticket found. Closest active issues were #13158 (parent epic), #13280 (auto-hide UI), #13247 (standalone dock example), and #13302 (Electron routing docs).
Exact historical sweep: gh issue list --state all --search "dock named perspective switcher storage UI saved layout collection" returned only closed #13169 (Add dock named-layout collection helpers), which is the model-layer prerequisite, not this consumer UI/storage leaf.
A2A in-flight sweep: checked recent 40 Memory Core messages immediately before creation; no [lane-claim] or [lane-intent] overlapped dock named-perspective switcher UI/storage.
Origin Session
Origin Session ID: 4f544e1c-70b1-46f5-8994-15a177e6a85d
Retrieval Hint: "Agent Harness dock named perspectives switcher storage UI DockZoneModel layout collection"
Context
The QT-parity docking polish epic still has a consumer-facing named-perspectives gap. The source state is ahead of the original epic wording: the saved-layout / named-layout collection model layer already exists, but no rendered Agent Harness or standalone dock surface lets a user save, select, restore, delete, and persist named dock perspectives through that model contract.
Release classification: post-release Agent Harness / M3 docking polish; Project 13 Agent Harness board, not v13 release-board blocking.
The Problem
Neo.dashboard.DockZoneModelnow owns the named-layout collection contract, but the available surfaces stop below the actual user workflow. Without a consumer ticket, the next UI/storage implementation is likely to re-derive the collection shape, bypassrestoreActiveSavedLayout, or conflate this work with unrelated auto-hide and grouped-tab polish.This ticket exists to bridge the model helpers into a narrow rendered consumer surface without reopening the model-layer work.
The Architectural Reality
learn/agentos/HarnessDockZoneModel.mddocumentsneo.harness.dockLayoutCollection.v1and explicitly leaves browser preferences, Memory Core persistence, import/export, and rendered switchers for later consumers.src/dashboard/DockZoneModel.mjsexposes the saved-layout collection helpers, including create/upsert/select/remove/restore-active behavior.examples/dashboard/dock/MainContainer.mjsowns the standalone dock example and already projects a committeddockModelthrough the current example runtime.apps/agentos/view/Viewport.mjsis the future Agent Harness viewport surface, but implementation should start at the narrowest owner that already has a live dock model.#13280covers auto-hide sidebar UI and must remain separate.#13169was model-layer only and is closed; this ticket is the UI/storage consumer layer.The Fix
Add a small named-perspective switcher consumer over the existing
DockZoneModelcollection helpers:restoreActiveSavedLayout, not through an ad-hoc clone of the model shape.If the implementation introduces a new
.mjsfile, the claimer must run structural-pre-flight and lift patterns from sibling files before authoring it.Contract Ledger Matrix
DockZoneModelcollection helperslearn/agentos/HarnessDockZoneModel.mdneo.harness.dockLayoutCollection.v1src/dashboard/DockZoneModel.mjsexamples/dashboard/dock/MainContainer.mjsDecision Record impact
aligned-with ADR 0020 / Agent Harness docking architecture. No ADR challenged or superseded. This is a child implementation leaf under the current docking polish epic.
Acceptance Criteria
DockZoneModelsaved-layout collection helpers are consumed directly; no custom collection schema or duplicate restore logic is introduced.Out of Scope
#13280).#13033and the workflow routing clarified by#13302.Avoided Traps
neo.harness.dockLayoutCollection.v1in UI state.#13158tracks those as distinct polish axes.Related
Parent: #13158 Related: #13012, #13030, #13147, #13153, #13169, #13247, #13280, #13302
Duplicate Sweep
Live latest-open sweep: checked the latest 30 open issues at 2026-06-15T05:49:38Z; no equivalent named-perspective switcher/storage UI ticket found. Closest active issues were
#13158(parent epic),#13280(auto-hide UI),#13247(standalone dock example), and#13302(Electron routing docs).Exact historical sweep:
gh issue list --state all --search "dock named perspective switcher storage UI saved layout collection"returned only closed#13169(Add dock named-layout collection helpers), which is the model-layer prerequisite, not this consumer UI/storage leaf.A2A in-flight sweep: checked recent 40 Memory Core messages immediately before creation; no
[lane-claim]or[lane-intent]overlapped dock named-perspective switcher UI/storage.Origin Session
Origin Session ID: 4f544e1c-70b1-46f5-8994-15a177e6a85d
Retrieval Hint: "Agent Harness dock named perspectives switcher storage UI DockZoneModel layout collection"