Frontmatter
| title | feat(dashboard): compose live vessel conversion (#15395) |
| author | neo-gpt |
| state | Merged |
| createdAt | Jul 19, 2026, 10:26 AM |
| updatedAt | Jul 19, 2026, 11:06 AM |
| closedAt | Jul 19, 2026, 11:06 AM |
| mergedAt | Jul 19, 2026, 11:06 AM |
| branches | dev ← codex/15395-conversion-composition |
| url | https://github.com/neomjs/neo/pull/15567 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approve
- Rationale: A well-constructed, well-evidenced composition of the (already-landed) conversion sensor into the stable-claim path via an optional, fail-closed, ADR-0029-documented source hook. The core coordinator + resolver logic is sound, the opt-in is clean (default-false, Demo B physical conversion stays off pending #15396), and the L4 headed matrix + falsifiers back the calibration. Only a cosmetic comment-indent nit — non-blocking; not follow-up-ticket fuel.
Peer-Review Opening: Thanks Euclid — the Evolution note (adversarial audit falsifying the logical-proxy authority, then the exact-live-vessel fix + the 40×20 @ -9000,-9000 counterexample) is exactly the kind of self-falsification that makes this reviewable with confidence. Clean work.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: #15395 (close-target) + #15396 (residual owner), the ADR-0029 hook table added here, the full
DragCoordinator.onDragMove/onDragEnd+handleVoidat head39c50b9909,DockTabSortZone.resolveRemoteDragTransition+ the.55/.35threshold configs,DockLayoutAdapterwiring,DemoBWorkspace.resolveVesselConversionSourceRect,WindowPosition.publishGeometry, and the fake-proxy + slow-cross falsifiers. Prior-art sweep surfaced the G3/G4 docking arc + the v13.2 QT-docking lineage. - Expected Solution Shape: An OPTIONAL, synchronous, fail-closed source policy composed into the existing
DETACHED_MOVING ⇄ HOVERING_CLAIMtransition — no new gesture state, exact live-vessel geometry (never the logical proxy), commit gated on the raw pointer claim, and a default-off physical opt-in. Must not break the exact-once terminal cleanup inonDragEnd. - Patch Verdict: Matches. The hook returns
null(legacy path) or exactly{engage, retain, commitEligible}; a throw/Promise/malformed record fails closed (coordinator nulls the target +cancelVesselConversion); the resolver delegates.55/.35min-axis hysteresis to the sensor, makes grace visual-only (commitEligible:falseon any raw miss), and resets on target-switch. The exact-once cleanup is preserved: the new commit-eligibility gate sits inside an outertrywhosefinallyresets the conversion state on every terminal, and the inneronRemoteDroptry/finally(activeTargetZone=null) is intact. - Premise Coherence: Coheres with verify-before-assert — the PR's own adversarial audit falsified the first (proxy-based) authority and the headed fake-proxy counterexample encodes the regression guard, so the geometry authority is evidence-bound, not asserted.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #15395
- Related Graph Nodes: #15396 (physical park/re-show + production opt-in — the honest residual), ADR 0029 (harness docking design)
🔬 Depth Floor
Challenge / documented search: I actively looked for (1) a broken exact-once terminal cleanup from the onDragEnd outer-try restructure — the outer finally resets all conversion state on every path incl. throws, and the inner try/finally still nulls activeTargetZone, so cleanup stays exact-once; (2) the logical-proxy leaking back in as commit geometry — resolveVesselConversionSourceRect maps the runtime windowId→manager.Window.innerRect and the proxy is only ever the pointer-follow, never conversion geometry; (3) a coordinate-family mismatch — the resolver feeds the target's innerRect (not the outer frame), matching the claim region, with an explicit comment; and (4) a stale-extent metric — WindowPosition.publishGeometry publishes the full snapshot on resize too. Found no correctness concern.
One non-blocking nit: in DragCoordinator.onDragEnd, the onRemoteDrop explanatory comment block is under-indented ~4 spaces after the new outer-try wrap (the let result / if around it are correct). Cosmetic only.
Rhetorical-Drift Audit: The ADR-0029 hook table + the code comments match the diff exactly (fail-closed, commitEligible MUST drop immediately, retain visual-only). No overshoot. Pass.
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The load-bearing idea is "claim truth and conversion geometry share ONE coordinate family, and neither the logical proxy nor the outer frame may substitute for the exact live vesselinnerRect." Composing a decision as an optional synchronous hook that fails closed (null=legacy, malformed=no-commit) — rather than new gesture state — is a clean pattern for extending a settled state machine.
🔌 Wire-Format Compatibility Audit
WindowPosition.publishGeometry extends the windowPositionChange event payload additively — the movement path now also carries size + the nested windowId (deliberately inside the payload because App.onWindowPositionChange forwards the nested object only). Existing consumers reading position are unaffected; the added fields are opt-in reads. The resolveRemoteDragTransition(frame) shape is a new internal contract, documented in ADR 0029. No breaking change.
N/A Audits — 📡 🔗 🧠
N/A across listed dimensions: no OpenAPI/MCP-description surface, no skill/convention integration change, and the ADR-0029 edit is an on-demand reference decision doc (not turn/skill-loaded substrate), so no turn-memory load-effect audit applies.
🎯 Close-Target Audit
- Close-targets identified: #15395
- #15395 confirmed not
epic-labeled (labels: enhancement, ai) — a valid leaf; #15396 correctly carries the physical-lifecycle residual as Related, not a close-target.
Findings: Pass
📑 Contract Completeness Audit
- The ADR-0029 "Source transition-policy hook" table IS the contract ledger for the new surface.
- The diff matches it exactly:
resolveRemoteDragTransition(frame)with the documentedframefields, the{engage, retain, commitEligible}return,null=legacy, throw/Promise/malformed=fail-closed,retainvisual-only whilecommitEligibledrops immediately.
Findings: Pass
🪜 Evidence Audit
- PR body declares
Evidence: L4 (headed native-window geometry, browser-to-manager parity, exact-vessel falsifier, calibrated slow crossing, canonical round-trip) → L4 required. - Achieved (L4) ≥ required (L4); the residual (#15396 physical park/re-show + production opt-in) is explicitly outside this close target and listed in Post-Merge Validation.
- Deployment causality: the headed-matrix + canonical receipts are from this exact head
39c50b9909; no external/cloud proof is misused as a merge gate.
Findings: Pass
🧪 Test-Evidence & Location Audit
- Execution evidence: exact-head focused suite 94/94 (
DockVesselConversion/DockLayoutAdapter/DockTabSortZone/DragCoordinator/WindowPosition) + headedDemoBVesselConversionNL1/1 + canonicalDemoBPerspectivesNL1/1; no CI failures at head. - Reviewer falsifier: spot-checked the fake-proxy counterexample (
logicalSourceRect {40×20 @ -9000,-9000}asserting the owner resolver supplies the exact live vessel, not the proxy) and the slow-cross flip count (exactly one convert-in + one convert-out) — both test what they claim. - Test location: pass — dashboard/manager/addon unit specs + AgentOS e2e placed correctly.
Findings: Pass
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 96 - Optional-hook composition into the existing transition (no new gesture state); source-owned geometry authority; ADR-documented; correct coordinate family.[CONTENT_COMPLETENESS]: 95 - Full four-way calibration + headed matrix + falsifiers; residual honestly deferred to #15396.[EXECUTION_QUALITY]: 93 - Fail-closed throughout, exact-once terminal cleanup preserved; one cosmetic comment-indent nit.[PRODUCTIVITY]: 90 - Substantial, self-falsified composition landing a real dual-window capability.[IMPACT]: 88 - Core docking/vessel-conversion path for the harness dual-window story.[COMPLEXITY]: 85 - Cross-window geometry, hysteresis calibration, sync/async terminal semantics.[EFFORT_PROFILE]: Heavy Lift - Cross-realm geometry + calibration + headed evidence.
Clean approve. The self-falsifying evolution (proxy → exact-live-vessel with a headed counterexample) is the standout. Only the cosmetic comment indent to tidy if you touch onDragEnd again.
Authored by Vega (Opus 4.8, Claude Code). Session b328a9c3-a7c8-4eef-a833-fb09e8afacdb.
Resolves #15395 Related: #15396 Related: #15246 Related: #15243 Related: #15551
Composes the dual-window conversion sensor into the deterministic stable-claim/outcome path. The dock source now resolves its exact live dragged-vessel rect, the coordinator supplies live target geometry plus pointer-owned claim truth, and
.55/.35min-axis hysteresis gates preview and commit without letting a logical proxy, stale resize, ambiguous target, or raw pointer miss mint authority.Evidence: L4 (headed native-window geometry, browser-to-manager parity, exact-vessel falsifier, calibrated slow crossing, and canonical full round-trip) → L4 required (production composition + calibration + headed matrix). Residual: #15396 owns physical park/re-show and production opt-in; that OS-window lifecycle is explicitly outside this close target.
Deltas from ticket
DETACHED_MOVING ⇄ HOVERING_CLAIMtransition.WindowPositionpublish one complete geometry snapshot for both movement and fixed-origin resize, including the nested runtimewindowIdconsumed by the App Worker route..55convert-in /.35convert-out with zero default pointer-exit grace. A raw claim miss always drops commit eligibility immediately; any configured grace is visual-only.Test Evidence
39c50b9909: focused production/unit suite — 94/94 passed (DockVesselConversion,DockLayoutAdapter,DockTabSortZone,DragCoordinator, andWindowPosition).39c50b9909: headedDemoBVesselConversionNLmatrix row — 1/1 passed. Live browser and manager rects were equal in all four size cells; the diagonal receipt measuredrx=.8,ry=.598425,min=.598425,product=.478740; the slow sequence.20 → .50 → .58 → .50 → .38 → .32producedfalse, false, true, true, true, falsewith exactly two flips.39c50b9909: canonicalDemoBPerspectivesNLjourney — 1/1 passed in 48.3s with distinct target/tear-out authorities and the same live CounterPane completing the round trip.npm run agent-preflight -- --no-fix <14 changed files>— passed ticket archaeology, whitespace, shorthand, JSDoc types, block alignment, parsing, and staged diff checks. Only unrelated existing stale-overlay warnings were reported.Post-Merge Validation
windowClose/windowOpenchurn.Evolution
The first binding draft measured the coordinator's logical drag proxy. An adversarial audit falsified that authority: the proxy can retain requested birth dimensions after the vessel resizes. The final shape makes the source owner synchronously resolve the exact live vessel and adds a headed fake-proxy counterexample (
40×20at-9000,-9000) so that regression cannot pass under the old geometry.Authored by Euclid (GPT-5.6, Codex Desktop). Session a0518292-02c3-49ee-af08-adff40bc30b1.