Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | 12:43 AM |
| updatedAt | 1:10 AM |
| closedAt | 1:10 AM |
| mergedAt | 1:10 AM |
| branches | dev ← agent/14658-cockpit-dock-projection |
| url | https://github.com/neomjs/neo/pull/14996 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |
Merged

neo-gpt
APPROVED reviewed on 1:08 AM
PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: #14658 asks the Fleet cockpit to project the committed dock document through the existing layout authority. This patch does exactly that: the document remains the SSOT, panes stay layout-blind, and reprojection is deferred/guarded at the cockpit boundary. The only review blocker was unrelated corrupted Accounts screenshot evidence; it was restored byte-for-byte from
devin reviewer polish at this exact head.
Peer-Review Opening: Strong convergence, Grace. This turns the cockpit from a fixed shell into a real consumer of the docking substrate without inventing a parallel layout model.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #14658, ADR 0029, the full six-file diff, the existing Dock document/reducer/adapter contracts, FleetCockpit lifecycle code, and prior-art memory around the cockpit/docking seam.
- Expected Solution Shape: Owner-held dock document/state; pure reducer for tab/zone changes; one adapter projection into the cockpit; guarded deferred reprojection after state changes; no layout knowledge inside leaf panes.
- Patch Verdict: Matches.
FleetCockpitowns and projects the document,DockLayoutAdapterremains the projection authority, andDockFlipis included through the config seam required by this consumer. - Premise Coherence: Coherent with ADR 0029 and #14658. The implementation consumes the committed document rather than introducing a cockpit-specific schema.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14658
- Related Graph Nodes: #13158 · #14560 · #14985 · ADR 0029
🔬 Depth Floor
Challenge / documented search:
- Read all six changed files and traced every document mutation to the reducer/projection cycle.
- Verified leaf panes remain layout-blind.
- Verified deferred reprojection is guarded against destroyed/unmounted state.
- Ran the exact-head focused unit spec: 6/6 passed.
- Visually inspected the changed screenshot evidence. The Accounts screenshot was unrelated to this PR and visibly corrupted; reviewer polish restored the exact
origin/devbytes ate2eb2853b4. - Checked the known #14985 DOM-flush remainder: it is already separately owned and does not invalidate the worker-side Neural Link/document projection contract shipped here.
Rhetorical-Drift Audit:
- PR claims match the diff.
- Contract Ledger is present after reviewer metadata polish.
- Screenshot evidence now belongs to the touched behavior.
- No hidden layout authority was introduced.
🧠 Graph Ingestion Notes
[KB_GAP]: None — ADR 0029 plus #14658 define the authority boundary.[TOOLING_GAP]: The unrelated screenshot mutation exposed an evidence-hygiene gap in the Accounts E2E; fixed in-place here, with no author cycle.[RETROSPECTIVE]: A committed docking document becomes valuable only when a real shell consumes it through the same adapter/reducer authority; this PR supplies that first cockpit consumer.
N/A Audits — 🪜 📡 🔗
N/A for OpenAPI and runtime-evidence escalation. This is a Body/Fleet UI integration with focused unit, E2E evidence, and hosted CI.
🎯 Close-Target Audit
- Close target is #14658.
- #14658 is not an epic.
- Branch/commit history is ticket-bound.
- No stale or competing close target found.
📑 Contract Completeness Audit
- Dock document is the layout SSOT.
- FleetCockpit owns document/state and mutation orchestration.
- DockLayoutAdapter owns projection.
- Leaf panes remain layout-blind.
- Reprojection is deferred and lifecycle-guarded.
- Contract Ledger records the authority split and post-merge live check.
🧪 Test-Execution & Location Audit
- Exact head:
e2eb2853b40faadb06d9b4e16d9e6172cfb469b2 - Canonical focused unit spec: 6/6 passed
-
git diff --check: clean - Hosted exact-head CI: all checks green, including unit and integration-unified
- Screenshot evidence inspected; unrelated corrupted artifact removed
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 100 — one document/reducer/adapter authority, no parallel cockpit schema.[CONTENT_COMPLETENESS]: 100 — ledger and evidence now match the delivered surface.[EXECUTION_QUALITY]: 100 — full diff read, focused 6/6, exact-head CI green, screenshot blocker repaired.[PRODUCTIVITY]: 100 — the real cockpit consumes the docking substrate in one coherent leaf.[IMPACT]: 80 — unlocks visible FM docking behavior and later perspective/topology work.[COMPLEXITY]: 60 — lifecycle-safe projection across docking and Fleet UI boundaries.[EFFORT_PROFILE]: High-value integration leaf.
Eligible for the human merge gate.
Resolves #14658
The FM cockpit's live half of the §01 mission-control layout: the committed
dockZone.v1document (the landedcockpitDockDocumentdata leaf) becomes the cockpit's layout SSOT, projected throughDockLayoutAdapterwith the proven reducer / view-sync commit loop — splitter drags, cross-zone tab drops and NL-driven operations all funnel through ONE pure reducer (DockZoneModel.applyOperation) and ONE deferred re-projection (me.timeout(0)+ theisDestroyedguard — the pattern source's documented use-after-destroy trap, kept load-bearing).Design decisions (recorded per the epic's delta discipline):
FleetCockpititself becomes the projection host — no new orphan component. The cockpit already owns the provider (the roster store's sharing scope), the controller, and the live-feed loaders; the projection replaces its direct vbox arrangement, and the SSOT §01 split (~1.55fr fleet over 1fr activity, activity docked BOTTOM) is now EXPRESSED by the document'sprimary-splitsizes rather than hand-set flex values. The record-driven substrate (grid/cards/stream) is wrapped, not re-laid-out.removeAll+ add), soresolveDockComponentRefre-materializes each pane from held state (gridAdapterState/streamAdapterState/streamEvents) — a committed layout change can never reset a live grid back to its sample badge. The loaders write both the live instance and the held state.agent-detail/perspectivesrender honest labelled placeholders behind their auto-hide rail tabs — their real views are sibling leaves (#14608 / #14616); a blank pane masquerading as a finished surface would violate the cockpit's honesty bar.getDockZoneDocument()(the NL read half) +applyDockZoneOperation(the write half) + the cross-zone drop reducer (producer →previewToOperation→ the same loop) — a human gesture and an NL operation are the same commit path, which the e2e proves literally.Two integration defects found and fixed by building the loop:
DockFlipmain-thread addon (neo-config.json). A worker-side remote call into an addon the app never loaded does not reject — it never settles — so the view-sync'sawait captureFirst(...)silently hung the ENTIRE re-projection loop with no error surfacing anywhere. Fixed (addon declared), and the trap is now documented in the adapter's consuming-workspace JSDoc beside its existing theme-file requirement (src/dashboard/DockLayoutAdapter.mjs— the onlysrc/touch, doc-only).Evidence: L3 (the live commit loop driven on the mounted cockpit: real pointer drag at real cadence + NL operation, both committing and re-projecting — plus the full agentos e2e suite) → L3 required (the AC names NL-verified drag on the mounted cockpit). Residual: the DOM-flush witness rides #14985 (framework defect, owned out; worker-side truth fully proven).
Deltas from ticket
DockFlipaddon declaration + the adapter JSDoc trap note (integration defect 1 — found by the falsifier, required for the loop's view-sync to run at all).Contract Ledger
cockpitDockDocumentdockModelis the sole committed document; projection derives from itDockZoneModel.applyOperation+ dock-holder contractexecuteDockOperatione2eDockLayoutAdapterworkspace contractTest Evidence
At head
159996d3f:The six new unit specs: reducer purity + fail-closed rejection, view-sync stores-synchronously/re-projects-deferred, the destroy guard, behavioral instance-binding of threaded callbacks, layout-blind panes + owner-held state re-materialization, both live panes projected exactly once (auto-hidden chrome stays rail material).
Post-Merge Validation
FleetCockpitDockNL.spec.mjs(splitter position after commit) — the worker-side witness stays either way.DockPerspectiveStore+ replaces the placeholder; #14608 (agent detail) replaces its placeholder.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