Context
Tree line B1 of the #13158 map — the T-B tranche's substrate gate. ADR 0029 §2.2 specifies perspective semantics; the shipped persistence wrapper (neo.harness.dockLayout.v1: layoutId/title/revision) predates them and carries no capture-scope or topology-fingerprint fields.
The Problem
Every §2.2 behavior (capture scope, cross-topology restore, fail-closed) needs schema room the wrapper lacks. Bolting fields on ad-hoc per-leaf recreates schema drift; the revision-migration path (§2.2's own requirement) must exist BEFORE the first perspective persists, or v1 records become the legacy problem on day one.
The Architectural Reality
- The wrapper's
revision field exists precisely for this: v1→v2 migration is the designed path, not a break.
- New fields per §2.2:
captureScope ('window'|'topology'), windowFingerprint (topology shape at capture — JSON-first, no windowIds/DOMRects per the standing guardrail), perspectiveName (optional; B6's store keys on it).
- Migration contract: v1 records load as
captureScope:'window' + null fingerprint (honest defaults, fail-open read); writes always v2. Fixtures = B8's seed.
- Placement: the wrapper's owning module in
src/dashboard/ (sibling fast-path).
The Fix
One PR: the v2 schema + the v1→v2 read-migration + write-path bump + JSDoc contract table + unit specs (v1 loads honestly, v2 round-trips, mixed-store reads, guardrail assertions: no live refs/window ids persisted).
Acceptance Criteria
Out of Scope
Capture/restore behavior (B2-B5) · the named store (B6) · NL tools (#14649).
Related
Parent #13158 (line B1) · authority ADR 0029 §2.2 · gates B2-B8, #14649, #14590. Sweeps: latest-10 at 03:31Z clean; line unclaimed.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Retrieval Hint: "dockLayout v2 revision migration capture scope fingerprint"
Context
Tree line B1 of the #13158 map — the T-B tranche's substrate gate. ADR 0029 §2.2 specifies perspective semantics; the shipped persistence wrapper (
neo.harness.dockLayout.v1:layoutId/title/revision) predates them and carries no capture-scope or topology-fingerprint fields.The Problem
Every §2.2 behavior (capture scope, cross-topology restore, fail-closed) needs schema room the wrapper lacks. Bolting fields on ad-hoc per-leaf recreates schema drift; the revision-migration path (§2.2's own requirement) must exist BEFORE the first perspective persists, or v1 records become the legacy problem on day one.
The Architectural Reality
revisionfield exists precisely for this: v1→v2 migration is the designed path, not a break.captureScope('window'|'topology'),windowFingerprint(topology shape at capture — JSON-first, no windowIds/DOMRects per the standing guardrail),perspectiveName(optional; B6's store keys on it).captureScope:'window'+ null fingerprint (honest defaults, fail-open read); writes always v2. Fixtures = B8's seed.src/dashboard/(sibling fast-path).The Fix
One PR: the v2 schema + the v1→v2 read-migration + write-path bump + JSDoc contract table + unit specs (v1 loads honestly, v2 round-trips, mixed-store reads, guardrail assertions: no live refs/window ids persisted).
Acceptance Criteria
Out of Scope
Capture/restore behavior (B2-B5) · the named store (B6) · NL tools (#14649).
Related
Parent #13158 (line B1) · authority ADR 0029 §2.2 · gates B2-B8, #14649, #14590. Sweeps: latest-10 at 03:31Z clean; line unclaimed.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "dockLayout v2 revision migration capture scope fingerprint"