Context
Tree line B6 (#13158 map). Captures (#14652/#14667) produce v2 records; this leaf gives them a HOME: the named store (save/load/list/rename/delete) the switcher UI (B7), the NL tools (#14649), and the demos consume.
The Problem
Without a store, perspectives are one-shot values. The store must be JSON-first (no live refs — the records already guarantee it), collision-explicit on names (rename-or-replace is a USER decision, never silent), and revision-aware (loads run the #14651 migration).
The Architectural Reality
Persistence rides the existing harness layout persistence seam (neo.harness.dockLayout.v1's storage home — same backend, keyed by perspectiveName); no new storage tech. Lifecycle events surface for UI binding. Placement: src/dashboard/ sibling.
The Fix
One PR: the store module (CRUD + list + exists), name-collision contract (structured, caller decides), migration-on-load wiring, unit specs (round-trip, collision, migration, delete-nonexistent fail-closed).
Acceptance Criteria
Out of Scope
Switcher UI (B7) · NL exposure (#14649) · capture/restore logic.
Related
Parent #13158 (line B6) · blocked_by #14651 · consumes #14652/#14667 outputs · consumed by #14649/B7/#14590. Sweeps: 03:47Z clean.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Retrieval Hint: "named perspective store CRUD collision migration"
Context
Tree line B6 (#13158 map). Captures (#14652/#14667) produce v2 records; this leaf gives them a HOME: the named store (save/load/list/rename/delete) the switcher UI (B7), the NL tools (#14649), and the demos consume.
The Problem
Without a store, perspectives are one-shot values. The store must be JSON-first (no live refs — the records already guarantee it), collision-explicit on names (rename-or-replace is a USER decision, never silent), and revision-aware (loads run the #14651 migration).
The Architectural Reality
Persistence rides the existing harness layout persistence seam (
neo.harness.dockLayout.v1's storage home — same backend, keyed by perspectiveName); no new storage tech. Lifecycle events surface for UI binding. Placement:src/dashboard/sibling.The Fix
One PR: the store module (CRUD + list + exists), name-collision contract (structured, caller decides), migration-on-load wiring, unit specs (round-trip, collision, migration, delete-nonexistent fail-closed).
Acceptance Criteria
Out of Scope
Switcher UI (B7) · NL exposure (#14649) · capture/restore logic.
Related
Parent #13158 (line B6) · blocked_by #14651 · consumes #14652/#14667 outputs · consumed by #14649/B7/#14590. Sweeps: 03:47Z clean. Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "named perspective store CRUD collision migration"