Context
Tree line B2 of the #13158 map. First behavior leaf of T-B: capturing the CURRENT window's dock state as a named perspective per ADR 0029 §2.2's single-window scope — the smallest capture that makes restore (B4) testable.
The Problem
Capture sounds trivial (serialize the document) but §2.2 makes it contractual: what enters the capture (layout truth only — the dockZone.v1 model state), what NEVER enters (render projections, runtime handles, pane-internal state — panes are layout-blind per §2.6, so their internals are not the layout's to save), and the v2 persistence fields (#B1) it must stamp (captureScope:'window', fingerprint).
The Architectural Reality
Pure-first: capturePerspective(document, {scope:'window', name}) → dockLayout.v2 record beside the reducer (sibling fast-path); the imperative shell (grabbing the live holder's document) reuses the #14625 holder-resolution contract. Blocked_by B1 (the v2 fields are its output shape).
The Fix
One PR: the pure capture fn + the holder-integrated call + unit specs (guardrail exclusions asserted — a capture containing a DOMRect/windowId/live ref is a failing spec; fingerprint correctness; name pass-through).
Acceptance Criteria
Out of Scope
Whole-topology scope (B3) · restore (B4/B5) · store (B6) · UI (B7).
Related
Parent #13158 (line B2) · blocked_by B1 leaf (#14651-class — the edge lands when both exist) · authority ADR 0029 §2.2/§2.6. Sweeps: 03:31Z clean.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4
Retrieval Hint: "perspective capture single window scope pure guardrails"
Context
Tree line B2 of the #13158 map. First behavior leaf of T-B: capturing the CURRENT window's dock state as a named perspective per ADR 0029 §2.2's single-window scope — the smallest capture that makes restore (B4) testable.
The Problem
Capture sounds trivial (serialize the document) but §2.2 makes it contractual: what enters the capture (layout truth only — the dockZone.v1 model state), what NEVER enters (render projections, runtime handles, pane-internal state — panes are layout-blind per §2.6, so their internals are not the layout's to save), and the v2 persistence fields (#B1) it must stamp (
captureScope:'window', fingerprint).The Architectural Reality
Pure-first:
capturePerspective(document, {scope:'window', name}) → dockLayout.v2 recordbeside the reducer (sibling fast-path); the imperative shell (grabbing the live holder's document) reuses the #14625 holder-resolution contract. Blocked_by B1 (the v2 fields are its output shape).The Fix
One PR: the pure capture fn + the holder-integrated call + unit specs (guardrail exclusions asserted — a capture containing a DOMRect/windowId/live ref is a failing spec; fingerprint correctness; name pass-through).
Acceptance Criteria
Out of Scope
Whole-topology scope (B3) · restore (B4/B5) · store (B6) · UI (B7).
Related
Parent #13158 (line B2) · blocked_by B1 leaf (#14651-class — the edge lands when both exist) · authority ADR 0029 §2.2/§2.6. Sweeps: 03:31Z clean.
Origin Session ID: fa2a6fd5-7488-4af6-a0d2-3855c86003e4 Retrieval Hint: "perspective capture single window scope pure guardrails"