Context
The #18304 extensibility audit named VesselPark as an unregistered candidate. A fresh-process probe now verifies its specific gap: install Neo.overwrites.Neo.dashboard.dock.window.VesselPark.restore = () => false, create the existing handlers, park and convert out. The factory still returns true and calls the re-show effect once; the Neo namespace is absent.
The Problem
createVesselParkHandlers closes over one gesture's state and internal effect/restore methods. Its supplied platform callbacks are configurable, but applications cannot specialize the internal choreography through the ordinary Neo class/overwrite path. The two consumer classes already compose this shared module, so adding methods to Workspace would leave the sibling DemoB consumer behind.
The Architectural Reality
VesselPark owns only gesture-local admission and pending-transition state. Native window ownership stays with the Group; the host supplies strict parkVessel, reshowVessel, and disposeVessel effects. Workstation constructs two independent handler sets and DemoB one. Existing controls cover strict synchronous/asynchronous admission, restore on cancel, commit-only disposal, duplicate terminal coalescing and external retirement.
The Fix
Convert the existing window/VesselPark.mjs to a registered Base-derived Neo.dashboard.dock.window.VesselPark class with effect callbacks as configs, state per instance, and internal dispatch through methods. Preserve public handler/getter names and payloads. Replace the three factory calls with Neo.create and explicitly destroy each consumer-owned instance. Remove the factory export and lexical-helper implementation; keep a single choreography owner.
Destroy invalidates pending continuations and clears this gesture owner without calling native platform effects or taking over Group-owned windows. Tests must distinguish this from an asynchronous completion resurrecting disposed state.
Contract Ledger
| Surface |
Authority |
Behavior |
Refusal/default |
Docs |
Evidence |
| VesselPark owner |
Base/config/overwrite path |
Registered per-instance class; internal restore/effect decisions replaceable |
Required platform callbacks remain required |
Class/config/method JSDoc |
Actual overwrite and subclass probes |
| Park/out/terminal/retirement handlers |
Existing VesselPark contract |
Same strict effects, exact-once ordering and identity/rect payloads |
Refusal retains retry state; non-commit restores |
Existing choreography docs |
Existing sync/async regression controls |
| Consumer lifetime |
Workstation and DemoB composition |
Three independent Neo-created owners, retired with their host |
Destruction fences late continuations; no platform effect from destroy |
Teardown JSDoc |
Owner isolation and pending-destroy tests |
Acceptance Criteria
Out of Scope
Euclid's #18398 Participation/embodiment staging, native platform park/re-show bodies, geometry or arbitration changes, the human pointer-overlap journey, other factory conversions, getRefreshOptions, Brain/tooling work, or changes to merged PRs.
Avoided Traps
A registered wrapper over the old closure; singleton gesture state; importing dock behavior into the generic Group manager; making destruction acquire or close native windows; silently changing strict Boolean admission while changing ownership.
Decision Record impact: aligned-with ADR 0029; choreography and native authority unchanged.
Decision Record: existing ADR 0029 remains authoritative.
Related
Parent: #18304
Related: #18398
Related: #18388
Related: #18393
Live latest20open, own-assignment and latest30all-statusA2A checked at2026-09-06T21:06Z; no equivalent claim/ticket. VesselPark all-state search found parent/guide/older behavior work, not this conversion. MC query recovered the prior outcome-keyed cancel/restore contract (dd4e70cb-1f5f-4727-9db8-8ed50d3564b7); other queries returned noise. Existing assigned guide/film lanes do not implement this owner. Labels verified. Structure-map unavailable (exit1/nooutput); existing window module retained, no new source directory. Euclid notified of exact three creation calls/imports/teardown touchpoints; his staging methods remain separate.
Origin Session ID: 10c286a7-65e7-4f15-be8e-8dace71af32d
Retrieval Hint: VesselPark closure restore override strict admission pending destroy
Context
The #18304 extensibility audit named
VesselParkas an unregistered candidate. A fresh-process probe now verifies its specific gap: installNeo.overwrites.Neo.dashboard.dock.window.VesselPark.restore = () => false, create the existing handlers, park and convert out. The factory still returnstrueand calls the re-show effect once; the Neo namespace is absent.The Problem
createVesselParkHandlerscloses over one gesture's state and internal effect/restore methods. Its supplied platform callbacks are configurable, but applications cannot specialize the internal choreography through the ordinary Neo class/overwrite path. The two consumer classes already compose this shared module, so adding methods to Workspace would leave the sibling DemoB consumer behind.The Architectural Reality
VesselPark owns only gesture-local admission and pending-transition state. Native window ownership stays with the Group; the host supplies strict
parkVessel,reshowVessel, anddisposeVesseleffects. Workstation constructs two independent handler sets and DemoB one. Existing controls cover strict synchronous/asynchronous admission, restore on cancel, commit-only disposal, duplicate terminal coalescing and external retirement.The Fix
Convert the existing
window/VesselPark.mjsto a registered Base-derivedNeo.dashboard.dock.window.VesselParkclass with effect callbacks as configs, state per instance, and internal dispatch through methods. Preserve public handler/getter names and payloads. Replace the three factory calls with Neo.create and explicitly destroy each consumer-owned instance. Remove the factory export and lexical-helper implementation; keep a single choreography owner.Destroy invalidates pending continuations and clears this gesture owner without calling native platform effects or taking over Group-owned windows. Tests must distinguish this from an asynchronous completion resurrecting disposed state.
Contract Ledger
Acceptance Criteria
Out of Scope
Euclid's #18398 Participation/embodiment staging, native platform park/re-show bodies, geometry or arbitration changes, the human pointer-overlap journey, other factory conversions, getRefreshOptions, Brain/tooling work, or changes to merged PRs.
Avoided Traps
A registered wrapper over the old closure; singleton gesture state; importing dock behavior into the generic Group manager; making destruction acquire or close native windows; silently changing strict Boolean admission while changing ownership.
Decision Record impact: aligned-with ADR 0029; choreography and native authority unchanged. Decision Record: existing ADR 0029 remains authoritative.
Related
Parent: #18304 Related: #18398 Related: #18388 Related: #18393
Live latest20open, own-assignment and latest30all-statusA2A checked at2026-09-06T21:06Z; no equivalent claim/ticket. VesselPark all-state search found parent/guide/older behavior work, not this conversion. MC query recovered the prior outcome-keyed cancel/restore contract (
dd4e70cb-1f5f-4727-9db8-8ed50d3564b7); other queries returned noise. Existing assigned guide/film lanes do not implement this owner. Labels verified. Structure-map unavailable (exit1/nooutput); existing window module retained, no new source directory. Euclid notified of exact three creation calls/imports/teardown touchpoints; his staging methods remain separate.Origin Session ID: 10c286a7-65e7-4f15-be8e-8dace71af32d Retrieval Hint: VesselPark closure restore override strict admission pending destroy