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
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
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 unmodifiedreshowTearOutVesselmethod 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.createCrossWindowParticipationrecordsresolveVesselConversionSourceRect(), which returns the exact source window'sinnerRect.VesselPark.finishTerminal→restorepasses that recorded rectangle unchanged on rejection.Workspace.reshowTearOutVesselalready computesframe = rect - source chromeand uses it forDragDrop.resumeWindowDrag. Its directwindowNativeMoveTofallback usesrect.x/yinstead.Main.windowNativeMoveTo→#moveWindowcallsWindow.moveToand verifiesscreenX/Y: it accepts frame coordinates. The coordinate contract was established by closed #18058.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
Acceptance Criteria
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