Context
Split from #15244 (G1 dock tear-out) per the honest-close-target discipline: G1's engine half is complete, fully witnessed, and independently reviewable TONIGHT, while its host/evidence half (flagship wiring, hysteresis calibration receipts, e2e gesture witnesses, matrix-fed platform defaults) is a second implementer arc partly gated on the #15243 matrix's macOS column. Parking two green pushed commits on a branch until the whole leaf lands is the exact anti-pattern the tempo ruling forbids; this leaf gives the engine tier its own honest Resolves.
Scope (the contract tier — what this leaf delivers)
Neo.dashboard.DockTabSortZone — the dock gesture surface over the INHERITED boundary grammar. The base container SortZone's window-boundary hysteresis (checkWindowBoundary, 0.8/0.6, the #8160 lineage) fires on dock tab drags once the composition arms enableProxyToPopup; the zone re-fires the boundary events as dock gesture events on the owner tab.Container (dockTearOutExit / dockTearOutEntry — the clone-safe closure home its cross-zone events already use) and the drag-end outcome chain gains the two DETACHED terminals: dockTearOutTerminal (the ONE seam a host may commit detachItem on) and dockTearOutCancel (vessel retirement, zero model mutation). Deterministic outcome order: cancel → remote transfer → tear-out terminal → in-window cross-zone drop. startWindowDrag / endWindowDrag land dock-tier per the §2.3 contract-not-class constraint (dock surfaces never inherit the dashboard sort zone).
Neo.dashboard.DockTearOut — the admission machine (createDockTearOutHandlers): the pure choreography between the four gesture events and injected host seams (applyOperation / openVessel / closeVessel / onDocumentChange), implementing ADR 0029 §2.8: admission fails CLOSED (a blocked popup degrades to the in-window fallback via endWindowDrag — load-bearing because the base arms isWindowDragging BEFORE firing the exit event), detachItem commits exactly once at the detached terminal never at a boundary, a committed tear-out KEEPS its vessel while a model refusal retires it, re-entry/cancel retire with zero mutation, hysteresis re-crossing yields two vessels / one commit / one retirement.
DockLayoutAdapter threading: enableDockTearOut opt-in → enableProxyToPopup on every projected tab sort zone + the four gesture seams on the tab.Container listeners block. Absent = fully in-window, the unchanged default (pinned).
Evidence class (contract tier = unit floor)
Model/contract-tier leaves keep unit floors per the epic family's own evidence language. 23 witnesses across DockTabSortZone.spec.mjs (outcome routing, boundary re-fires, embodiment arm/disarm) + DockTearOut.spec.mjs (the admission machine end-to-end through its seams) + DockLayoutAdapter.spec.mjs (threading + default-off pin); full dashboard suite 359/359. The LIVE gesture (real popup mid-drag), calibration receipts, and e2e falsifier witnesses are #15244's retained half — L3 evidence belongs to the tier that wires a host.
Acceptance Criteria
Out of Scope
Everything #15244 retains (host tier + evidence tiers above unit). No app-tier files in this leaf.
Related
Parent context: #15239 (epic) · split-from: #15244 (retains the host half; blocked-by #15243 only on its AC-6) · authority: ADR 0029 §2.8 (#15240, CLOSED) · lineage: #8160 hysteresis, #15208 proxy contract.
Decision Record impact: aligned-with ADR 0029 (§2.8 consumed as contract; nothing amended).
Live latest-open sweep: checked latest 20 open issues at 2026-07-18T03:12Z; no equivalent. A2A in-flight claim sweep: my own [lane-claim][#15244] (02:21) covers this scope; no competing claim.
Origin Session ID: 89818500-8a12-4162-b41f-8947703b1b06
Retrieval Hint: "dock tear-out contract tier gesture surface admission machine commit-at-terminal"
Context
Split from
#15244(G1 dock tear-out) per the honest-close-target discipline: G1's engine half is complete, fully witnessed, and independently reviewable TONIGHT, while its host/evidence half (flagship wiring, hysteresis calibration receipts, e2e gesture witnesses, matrix-fed platform defaults) is a second implementer arc partly gated on the#15243matrix's macOS column. Parking two green pushed commits on a branch until the whole leaf lands is the exact anti-pattern the tempo ruling forbids; this leaf gives the engine tier its own honestResolves.Scope (the contract tier — what this leaf delivers)
Neo.dashboard.DockTabSortZone— the dock gesture surface over the INHERITED boundary grammar. The base container SortZone's window-boundary hysteresis (checkWindowBoundary, 0.8/0.6, the#8160lineage) fires on dock tab drags once the composition armsenableProxyToPopup; the zone re-fires the boundary events as dock gesture events on the owner tab.Container (dockTearOutExit/dockTearOutEntry— the clone-safe closure home its cross-zone events already use) and the drag-end outcome chain gains the two DETACHED terminals:dockTearOutTerminal(the ONE seam a host may commitdetachItemon) anddockTearOutCancel(vessel retirement, zero model mutation). Deterministic outcome order: cancel → remote transfer → tear-out terminal → in-window cross-zone drop.startWindowDrag/endWindowDragland dock-tier per the §2.3 contract-not-class constraint (dock surfaces never inherit the dashboard sort zone).Neo.dashboard.DockTearOut— the admission machine (createDockTearOutHandlers): the pure choreography between the four gesture events and injected host seams (applyOperation/openVessel/closeVessel/onDocumentChange), implementing ADR 0029 §2.8: admission fails CLOSED (a blocked popup degrades to the in-window fallback viaendWindowDrag— load-bearing because the base armsisWindowDraggingBEFORE firing the exit event),detachItemcommits exactly once at the detached terminal never at a boundary, a committed tear-out KEEPS its vessel while a model refusal retires it, re-entry/cancel retire with zero mutation, hysteresis re-crossing yields two vessels / one commit / one retirement.DockLayoutAdapterthreading:enableDockTearOutopt-in →enableProxyToPopupon every projected tab sort zone + the four gesture seams on the tab.Container listeners block. Absent = fully in-window, the unchanged default (pinned).Evidence class (contract tier = unit floor)
Model/contract-tier leaves keep unit floors per the epic family's own evidence language. 23 witnesses across
DockTabSortZone.spec.mjs(outcome routing, boundary re-fires, embodiment arm/disarm) +DockTearOut.spec.mjs(the admission machine end-to-end through its seams) +DockLayoutAdapter.spec.mjs(threading + default-off pin); full dashboard suite 359/359. The LIVE gesture (real popup mid-drag), calibration receipts, and e2e falsifier witnesses are#15244's retained half — L3 evidence belongs to the tier that wires a host.Acceptance Criteria
6518195cd5,e9c69067d5) land via one READY PR with the witnesses green at exact head.enableDockTearOutabsent ⇒enableProxyToPopup: falseprojected — pinned).#15244retains: host wiring (flagship + demo), AC-2 calibration receipts, AC-3 e2e falsifier witnesses, AC-4#14980arming receipt, AC-6 matrix-fed platform defaults (the#15243seam).Out of Scope
Everything
#15244retains (host tier + evidence tiers above unit). No app-tier files in this leaf.Related
Parent context:
#15239(epic) · split-from:#15244(retains the host half; blocked-by#15243only on its AC-6) · authority: ADR 0029 §2.8 (#15240, CLOSED) · lineage:#8160hysteresis,#15208proxy contract.Decision Record impact: aligned-with ADR 0029 (§2.8 consumed as contract; nothing amended).
Live latest-open sweep: checked latest 20 open issues at 2026-07-18T03:12Z; no equivalent. A2A in-flight claim sweep: my own
[lane-claim][#15244](02:21) covers this scope; no competing claim.Origin Session ID: 89818500-8a12-4162-b41f-8947703b1b06
Retrieval Hint: "dock tear-out contract tier gesture surface admission machine commit-at-terminal"