Context
#16412 asks the two tour-reset call sites to stop declaring an unverified geometryOnly: true. Implementing it surfaced that the call site was never the right place to fix, and the ticket's prescription — derive the flag from a document compare — cannot be made correct. This leaf carries the shape that replaced it, so #16412 can keep its unmet recorded-tour criterion open rather than being closed by a partial delivery.
The Problem
A derived predicate at the call site duplicates a rule the consumer already owns, and duplicated it more weakly. Measured at e4082b2723: a four-category DockTopologyDiff test returns true for active-tab-only, split-orientation-only, structural child-order-only and auto-hide-only resets, every one of which DockProjectionReconciler.reconcileStableTopology refuses from its in-place path. A predicate that is weaker than its consumer's authority is worse than the literal it replaced, because it looks proven.
Strengthening the predicate does not fix the class — it reproduces it one axis later, and drifts again the next time the reconciler's admission rule changes.
The Architectural Reality
apps/workstation/view/Workspace.mjs — refreshDockWorkspace({geometryOnly}) forwards the flag both into DockProjectionReconciler.reconcileProjection and, afterwards, into DockFlip.play.
src/dashboard/DockProjectionReconciler.mjs — geometryOnly only gates whether reconcileStableTopology is attempted; it returns null on any node/type/ancestry/order/orientation delta and falls through to the staged transaction. Passing the flag here is safe by construction.
src/main/addon/DockFlip.mjs — play({geometryOnly}) declares something strictly stronger: "no topology swap can be pending".
One flag serves two different contracts. The reconciler reads it as a request; DockFlip reads it as a fact. Only the second can be wrong, and only after the reconciler has already decided.
The Fix
Report the path actually taken and forward that instead of the request:
reconcileProjection returns landedInPlace at both exits — true from the in-place branch, false from the staged transaction.
Workspace.refreshDockWorkspace destructures it and passes it to DockFlip.play.
- The call sites go back to requesting
geometryOnly: true, which is now honestly an admission request.
- Any call-site predicate is deleted rather than strengthened.
Contract Ledger Matrix
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback |
Docs |
Evidence |
DockProjectionReconciler.reconcileProjection return |
src/dashboard/DockProjectionReconciler.mjs |
Adds landedInPlace to both return shapes; all existing fields unchanged |
Purely additive — existing destructuring consumers are unaffected |
JSDoc at both returns |
dashboard + workstation suites |
Workspace.refreshDockWorkspace options.geometryOnly |
apps/workstation/view/Workspace.mjs |
Documented as an admission REQUEST, never a stable-topology claim |
operation === 'resizeSplit' derivation untouched |
JSDoc at the option |
seam tests below |
DockFlip.play options.geometryOnly |
src/main/addon/DockFlip.mjs |
Receives the reconciler's outcome; contract wording unchanged |
Existing geometry guards remain the second line |
play() JSDoc |
seam tests below |
Decision Record impact
none
Acceptance Criteria
Out of Scope
- The recorded-tour reset receipt (
#16412 AC4) — an e2e/on-camera artifact this seat cannot capture; it stays open on #16412
reconcileStableTopology's own admission rule, which is the authority this change defers to rather than modifies
- The
#16406 tab-drag defect
Avoided Traps
- Strengthening the predicate. An exact topology projection covering identity/type/ancestry/order/orientation plus active and auto-hide state would pass today's counterexamples and still be a second copy of someone else's rule. The duplication is the defect, not its current precision.
- Editing the failing call-site test green. The assertion expecting
geometryOnly: false at the call site is removed because that contract moved downstream; keeping it would pin the superseded design.
Related
Refs #16412 · #16403 (made the flag load-bearing) · #16391 (the landed-in-place discriminator) · #14650 (the dockZone.v1 diff vocabulary the rejected approach would have used)
Live latest-open sweep: checked latest 20 open issues at 2026-08-09T15:25:18Z; no equivalent found. A2A in-flight sweep: no claim on this scope.
Retrieval Hint: "tour reset geometryOnly landedInPlace reconciler outcome not request DockFlip admission"
Context
#16412asks the two tour-reset call sites to stop declaring an unverifiedgeometryOnly: true. Implementing it surfaced that the call site was never the right place to fix, and the ticket's prescription — derive the flag from a document compare — cannot be made correct. This leaf carries the shape that replaced it, so#16412can keep its unmet recorded-tour criterion open rather than being closed by a partial delivery.The Problem
A derived predicate at the call site duplicates a rule the consumer already owns, and duplicated it more weakly. Measured at
e4082b2723: a four-categoryDockTopologyDifftest returnstruefor active-tab-only, split-orientation-only, structural child-order-only and auto-hide-only resets, every one of whichDockProjectionReconciler.reconcileStableTopologyrefuses from its in-place path. A predicate that is weaker than its consumer's authority is worse than the literal it replaced, because it looks proven.Strengthening the predicate does not fix the class — it reproduces it one axis later, and drifts again the next time the reconciler's admission rule changes.
The Architectural Reality
apps/workstation/view/Workspace.mjs—refreshDockWorkspace({geometryOnly})forwards the flag both intoDockProjectionReconciler.reconcileProjectionand, afterwards, intoDockFlip.play.src/dashboard/DockProjectionReconciler.mjs—geometryOnlyonly gates whetherreconcileStableTopologyis attempted; it returnsnullon any node/type/ancestry/order/orientation delta and falls through to the staged transaction. Passing the flag here is safe by construction.src/main/addon/DockFlip.mjs—play({geometryOnly})declares something strictly stronger: "no topology swap can be pending".One flag serves two different contracts. The reconciler reads it as a request; DockFlip reads it as a fact. Only the second can be wrong, and only after the reconciler has already decided.
The Fix
Report the path actually taken and forward that instead of the request:
reconcileProjectionreturnslandedInPlaceat both exits —truefrom the in-place branch,falsefrom the staged transaction.Workspace.refreshDockWorkspacedestructures it and passes it toDockFlip.play.geometryOnly: true, which is now honestly an admission request.Contract Ledger Matrix
DockProjectionReconciler.reconcileProjectionreturnsrc/dashboard/DockProjectionReconciler.mjslandedInPlaceto both return shapes; all existing fields unchangedWorkspace.refreshDockWorkspaceoptions.geometryOnlyapps/workstation/view/Workspace.mjsoperation === 'resizeSplit'derivation untouchedDockFlip.playoptions.geometryOnlysrc/main/addon/DockFlip.mjsDecision Record impact
none
Acceptance Criteria
reconcileProjectionreportslandedInPlacefrom both the in-place and staged exitsDockFlip.playreceives that outcome; the caller's request never reaches itDockFlipis never reached, rather than passing on a null captureWorkspaceresizeSplitderivation behaviour is unchangedOut of Scope
#16412AC4) — an e2e/on-camera artifact this seat cannot capture; it stays open on#16412reconcileStableTopology's own admission rule, which is the authority this change defers to rather than modifies#16406tab-drag defectAvoided Traps
geometryOnly: falseat the call site is removed because that contract moved downstream; keeping it would pin the superseded design.Related
Refs #16412 ·
#16403(made the flag load-bearing) ·#16391(the landed-in-place discriminator) ·#14650(thedockZone.v1diff vocabulary the rejected approach would have used)Live latest-open sweep: checked latest 20 open issues at 2026-08-09T15:25:18Z; no equivalent found. A2A in-flight sweep: no claim on this scope.
Retrieval Hint: "tour reset geometryOnly landedInPlace reconciler outcome not request DockFlip admission"