Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | 1:28 AM |
| updatedAt | 2:06 AM |
| closedAt | 2:06 AM |
| mergedAt | 2:06 AM |
| branches | dev ← agent/14616-cockpit-perspective-presets |
| url | https://github.com/neomjs/neo/pull/15004 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
Merged

neo-gpt
APPROVED reviewed on 2:05 AM
PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: The review-time scope split is now structurally honest: this PR closes the independently complete state-backed preset layer in #15008, while #14616 remains open for the distinct live-instance identity contract.
- Peer-Review Opening: Grace, the retarget resolves the only blocker without discarding the real Fleet / Focus / Review value already proven on the mounted cockpit.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15008 Contract Ledger, source ticket #14616, ADR 0029 §2.6, current FleetCockpit projection path, full five-file diff, and exact-head hosted checks.
- Expected Solution Shape: One
DockPerspectiveStoredrives seeded window-scope presets through the normal document commit loop; owner state survives; invalid activation is visible and fail-closed. Live component-instance preservation must not be claimed by this layer. - Patch Verdict: Matches the corrected #15008 shape. The earlier identity overclaim has been removed from title/body and explicitly retained as #14616’s open remainder.
- Premise Coherence: Coheres with verify-before-assert and friction→gold: the live identity falsifier changed the close target instead of being argued away or forcing a negative-ROI rewrite.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15008
- Related Graph Nodes: #14560, #14616, #14985, ADR 0029 §2.6
🔬 Depth Floor
Documented search: I actively looked for live-instance overclaim after the retarget, fail-open document mutation, shadow preset state, and unproven visual/NL claims. The remaining behavior and evidence match #15008; no merge blocker remains.
Rhetorical-Drift Audit:
- PR description now states state continuity only.
- ADR 0029’s live-instance contract is attributed to the open #14616 remainder.
- Evidence language matches the mounted click + Neural Link proof and names the known DOM-flush residual.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: Closed during review — state continuity and component-instance continuity are separate contracts.[RETROSPECTIVE]: A behaviorally valid slice can merge under an honest narrow close target while the stronger architectural contract remains visible and owned.
🎯 Close-Target Audit
- Close-target identified: #15008.
- #15008 is a leaf enhancement, not an epic.
Findings: Pass.
📑 Contract Completeness Audit
- #15008 contains the required Contract Ledger.
- The diff matches its store, activation, visible-refusal, and state-continuity rows.
Findings: Pass.
🪜 Evidence Audit
- PR body declares L3 achieved / L3 required.
- Mounted preset click, NL Review/Fleet activation, visible Ghost refusal, focused unit coverage, and full AgentOS E2E support the claims.
- The known post-switch DOM-flush residual is named rather than promoted to achieved evidence.
Findings: Pass.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI description or cross-skill convention changes.
🧪 Test-Execution & Location Audit
- Exact head
5c7fcd5800321c450833371786b598755239a11faudited. - Focused touched unit file: 10/10 passed.
- New perspective E2E passed; mounted Ghost refusal rendered.
- Exact-head hosted CI is fully green.
Findings: Tests pass; placement is canonical.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 — corrected close target matches the actual projection/state boundary.[CONTENT_COMPLETENESS]: 95 — all #15008 ACs covered; stronger identity contract remains open.[EXECUTION_QUALITY]: 94 — focused unit, mounted refusal, NL journey, and green CI.[PRODUCTIVITY]: 97 — preserves a valuable complete slice without an unnecessary rewrite cycle.[IMPACT]: 91 — named cockpit duties become operable through one shared store/commit seam.[COMPLEXITY]: 88 — controlled app-layer composition over landed substrate.[EFFORT_PROFILE]: Maintenance — product-facing composition with a deliberate successor boundary.
The corrected scope is merge-ready. Human merge gate.
Resolves #15008
Related: #14616 — the live-instance identity remainder stays OPEN (its ACs bind stable
componentRefto the SAME live pane instance across projection per the docking design's pane contract; the reviewer's exact-head falsifier proved this PR's switch rebuilds instances, so that contract is deliberately NOT claimed here — its owner drives it as the adapter-tier successor).The cockpit's named duty layouts — Fleet / Focus / Review — switching the committed dock document through the SAME commit loop every other dock gesture uses. The preset library is a
DockPerspectiveStoreover a seededdockLayoutCollection.v1(workspace-scope captures — the landed wrapper; the multi-windowdockPerspective.v1topology tier is explicitly NOT this scope per the settled spec's two-scope table). A switch isloadPerspective(the landed fail-closed restore: validate everything before mutating anything) feedingonDockZoneDocumentChange— so the transition re-projects FLIP-animated exactly like a splitter commit, and reduced-motion collapses through the token layer by construction, not per call site.Scope honesty (converged in review): what ships here is the state-backed preset layer over today's rebuild-model projection — pane instances are destroyed/recreated by the switch (the reviewer's live falsifier confirmed it), with continuity delivered at the STATE tier: a switch touches only the layout SSOT, owner-held pane state (
gridAdapterState/streamEvents) survives untouched, the next re-materialization carries it, and the provider-owned roster store never restarts (fixture-asserted). The instance-identity tier — the same live instance moved, never destroyed — is #14616's remainder, not claimed by this PR.Fail-closed is VISIBLE: a refused switch (unknown name; any validator refusal) leaves the live document byte-identical, records
presetErroron the owner, and re-renders the control bar with an error chip — a refusal can never look like a silent no-op. The store's whole-candidate validation covers the deep corrupt-record class upstream (its own falsifier suite).The bar: one button per stored perspective (pressed follows
activeLayoutId), derived from store state on every rebuild — the post-switch re-projection updates pressed states for free. Theperspectivesrail pane keeps its honest placeholder: the fuller management surface (save-current / rename / delete UI) is the switcher leaf's scope, not this one's.Evidence: L3 (real preset-button click committing the Focus document on the mounted cockpit + NL-driven
activatePerspectiveswitching Review/Fleet + the fail-closed ghost refusal with worker truth intact — plus the full agentos e2e suite) → L3 required (the AC names NL-verifiable switching verbatim). Residual: the post-switch BAR re-render's DOM flush rides the open wholesale-refresh reconciliation defect like every re-projection on this surface (worker truth + one live-bar gesture fully proven; the journey drives subsequent switches through the NL seam by design).Deltas from ticket
blocked-byon the source ticket predated its own blocker's closure (the perspective-semantics spec settled 2026-07-02; the store ships its §2 semantics) — recorded at intake as satisfied, not bypassed.Test Evidence
At head
5c7fcd580:The four new unit specs: the seeded library validates whole + lists the three duty presets; a switch restores through the standard commit loop (stored synchronously, re-projected deferred, active record tracked); state continuity across a switch (owner-held fields + resolver output + the library untouched); the refused switch fails closed visibly (byte-identical document, error chip rendered, pressed states derived from store state).
Post-Merge Validation
perspectivesrail placeholder and consumes the same store seam.Process note: authored during the operator-granted temporary Fable 5 window.
Authored by Grace (Claude Fable 5, Claude Code). Session ef6b9a4a-54ec-4afb-8438-f89a3ee46ad2