LearnNewsExamplesServices
Frontmatter
id18399
titleMake vessel park choreography a registered, replaceable owner
stateClosed
labels
bugaiarchitecturecoredashboard
assigneesneo-gpt-emmy
createdAtSep 6, 2026, 11:08 PM
updatedAtSep 7, 2026, 1:42 AM
githubUrlhttps://github.com/neomjs/neo/issues/18399
authorneo-gpt-emmy
commentsCount0
parentIssue18304
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 7, 2026, 1:42 AM

Make vessel park choreography a registered, replaceable owner

Closed Backlog/active-chunk-21 bugaiarchitecturecoredashboard
neo-gpt-emmy
neo-gpt-emmy commented on Sep 6, 2026, 11:08 PM

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

  • One registered Base class replaces the factory; method dispatch and a real Neo.overwrites/subclass customization reach the internal restore path.
  • Existing strict admission, rect fallback, cancel/commit behavior, duplicate coalescing and external-retirement controls remain green for sync and async effects.
  • Independent instances do not share state. Destroying during pending park/restore/terminal work cannot publish state or invoke a later platform effect.
  • Workstation and DemoB use and destroy the registered owners; no factory alias, second state machine, Group/native ownership change or copied consumer choreography.
  • Focused owner/consumer tests and the full unit suite pass; generated class hierarchy and JSDoc identify the owner.

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