LearnNewsExamplesServices
Frontmatter
id18514
titleWorkstation terminal restore drops the window chrome offset
stateClosed
labels
bugaitestingdashboard
assigneesneo-gpt-emmy
createdAtSep 9, 2026, 2:05 AM
updatedAtSep 9, 2026, 10:49 AM
githubUrlhttps://github.com/neomjs/neo/issues/18514
authorneo-gpt-emmy
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]
closedAtSep 9, 2026, 10:49 AM

Workstation terminal restore drops the window chrome offset

Closed v13.2.0/archive-v13-2-0-chunk-20 bugaitestingdashboard
neo-gpt-emmy
neo-gpt-emmy commented on Sep 9, 2026, 2:05 AM

Context

Workstation's rejected native conversion restores the vessel using its recorded content rectangle. The fallback after addon refusal currently uses that content origin as a native frame origin.

At 3ae4bcdc3396ae61832c0109ae85f0f3dba47f41, executing the unmodified reshowTearOutVessel method with controlled native-effect results reproduces the mismatch: content origin (400,300), chrome (5,67), terminal restore, no saved resize geometry. Addon recovery receives (395,233); when it refuses and no orphan owns recovery, the direct move receives (400,300) and returns success. This is an executed source-method probe with platform/admission stubs, not a browser receipt.

The Problem

The two branches promise the same restored content position but issue different frame coordinates. Existing live-resume coverage includes nonzero chrome; the terminal compensation witness does not publish source chrome, so it cannot expose this missing conversion.

The Architectural Reality

  • Workspace.createCrossWindowParticipation records resolveVesselConversionSourceRect(), which returns the exact source window's innerRect.
  • VesselPark.finishTerminal → restore passes that recorded rectangle unchanged on rejection.
  • Workspace.reshowTearOutVessel already computes frame = rect - source chrome and uses it for DragDrop.resumeWindowDrag. Its direct windowNativeMoveTo fallback uses rect.x/y instead.
  • Main.windowNativeMoveTo → #moveWindow calls Window.moveTo and verifies screenX/Y: it accepts frame coordinates. The coordinate contract was established by closed #18058.
  • Saved park/restore geometry already uses outer/frame dimensions and coordinates. Compensation must not subtract chrome a second time.

The Fix

Use the existing frame conversion for the terminal direct restore in apps/workstation/view/Workspace.mjs. Extend the existing Workstation unit witnesses to exercise nonzero source chrome both with and without saved resize geometry. Preserve native route admission, pending orphan refusal, compensation and strict-success cleanup.

Contract Ledger Matrix

Surface Authority Required behavior Refusal/recovery Docs Evidence
Workstation terminal restore position Existing innerRect → frame contract; Main native move Addon and direct fallback request the same frame position for one content rectangle Pending recovery prevents a competing move; failed effects retain retry state Existing method coordinate explanation Real Workspace method with controlled native effects, nonzero/zero chrome
Park compensation coordinates Existing saved outer geometry Keep the parked frame coordinates unchanged Refused restore retains geometry until strict success Existing compensation intent Failed move/resize and successful retry controls

Acceptance Criteria

  • A nonzero-chrome terminal fallback requests the content origin minus source chrome, both with and without saved resize geometry.
  • The regression witness fails against the pre-fix source and passes after the repair. Zero-chrome behavior remains unchanged.
  • Existing addon-success, pending-recovery refusal, compensation coordinates and strict-success cleanup retain their contracts. A rollback to parked geometry is not converted again.
  • Focused and broader Workstation unit checks pass using the custom unit config. State evidence limits explicitly; stubbed native calls do not claim a new real-window or whole-film acceptance.

Out of Scope

New native APIs/owners, the #18460 extraction/design, DemoB terminal policy, route-validation changes, physical recovery ownership, and closure of existing film/continuity defects. No new source module or engine change is needed.

Avoided Traps

Do not change Main's frame-coordinate API, patch manager geometry again, parameterize the mismatch as consumer policy, or alter compensation's already-frame-based coordinates. Keep the observed coordinate error distinct from popup placement races.

Decision Record impact

No ADR change; preserves the existing worker/native ownership and coordinate contracts.

Sweeps and ownership

Latest20 open issues and recent30 all-state A2A checked immediately before filing. Same-surface own #18458/#18504/#16498 bodies cover playback, receipt ownership and film composition, not this position repair. Problem-noun MC surfaced coordinate/rig history (sessions 93fd8de9-7231-4979-b906-c050bcfc25a4, 8ed4e592-9d66-4685-8d96-cdc423fd9613); current source and the explicit fallback probe distinguish this issue from those successful native journeys. KB lacked #18058; its live closed issue was read directly. Labels verified. Vega received the exact fork on the shared Workspace surface; no overlapping repair found.

Taking this as the only active implementation claim; earlier authored PRs remain at human merge gates.

Related: #18058 · #18460 · #18501

Origin Session ID: 153d2e0a-ebae-4087-bcd5-3c92d213132c

Retrieval Hint: Workstation terminal restore innerRect chrome direct fallback frame coordinates