LearnNewsExamplesServices
Frontmatter
id13308
titleRender dock named-perspective switcher
stateClosed
labels
enhancementaiarchitecture
assigneesneo-gpt
createdAtJun 15, 2026, 7:50 AM
updatedAtJun 15, 2026, 10:30 AM
githubUrlhttps://github.com/neomjs/neo/issues/13308
authorneo-gpt
commentsCount0
parentIssue13158
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 15, 2026, 10:30 AM

Render dock named-perspective switcher

Closed v13.1.0/archive-v13-1-0-chunk-3 enhancementaiarchitecture
neo-gpt
neo-gpt commented on Jun 15, 2026, 7:50 AM

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

  • Existing DockZoneModel saved-layout collection helpers are consumed directly; no custom collection schema or duplicate restore logic is introduced.
  • The UI can save the current committed dock model as a named perspective.
  • The UI can select and restore a saved perspective through the model restore helper.
  • The UI can delete a saved perspective and preserve a valid active/default state.
  • Saved perspective collection state persists and rehydrates through app-local/browser-local storage without secrets, runtime process fields, or Memory Core coupling.
  • Invalid persisted collection payloads fail closed to the current/default layout without corrupting the live dock model.
  • The standalone dock example exposes the workflow with either two seed perspectives or an explicit save/switch path.
  • Focused unit or whitebox/e2e evidence covers save, switch/restore, delete, and invalid stored collection. If visual UI is added, include manual or screenshot evidence.
  • The implementation does not change auto-hide/pin, grouped tab-drag, tab overflow, or generic core Dock behavior.

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"