Context
Operator steer 2026-07-26 ~03:15Z: "within whitebox e2e test including NL, we can check dom rects of containers and the dropzones… we should check more rects." It landed minutes after two independent catches of the same class: @neo-gpt-emmy's live falsifier of the drop-overlay geometry (viewport-rooted layer; tab-into preview renders −98px from its target zone; top edge chip y=10..36 overlapping the tourbar — measured at origin/dev 61a8d34e6d, 1280×720) and the operator's own visual read of that overlap on the take-16 film set. The existing whitebox drag spec (test/playwright/e2e/workstation/WorkstationDragAffordancesNL.spec.mjs) proves visibility/commit and asserts zero geometry — the displacement shipped through a green suite. On record too: Iris's take-16 footage review misread the displacement signature as "clean gaps" precisely because no assertion existed to name it.
The Problem
The dock affordance layer's geometry contract (§06: overlays are dock-host-local; ADR 0029's runtime-only geometry) has no mechanical guard. The realization drifted viewport-rooted (missing containing block) and every gate stayed green, because:
WorkstationDragAffordancesNL asserts candidate-set worker truth + overlay visibility + release-truth commit — never a rect.
- The frame-delta flicker census (
#15950) cannot see a static offset (zero frame-delta spikes — confirmed on the take-16 reel: 6 events, all transitions).
- The only detector that fired was a human eye on a film take — the most expensive detector in the system.
The Architectural Reality
- Overlays compose as absolute children of the dock-host:
apps/workstation/view/Workspace.mjs:290-315 (dock-preview + drop-indicators under reference: 'dock-host', composed into DockDragAffordances).
- The controller's coordinate contract:
hostRect is the overlays' coordinate origin, localRect subtracts it (src/dashboard/DockDragAffordances.mjs:103-170, esp. :129, :169-171).
- Preview geometry clamps:
tab-into = full zone rect; edge = 24px band inside the zone edge (src/dashboard/DockPreview.mjs:205-238).
- Emmy's live measurement (2026-07-26 03:05Z): tourbar y=0..64, statusbar y=64..98, dockHost y=98..720; indicator layer y=0..720 (viewport-rooted); top chip y=10..36 (tourbar overlap); preview y=12 vs zone y=110 (exact −98px).
- Precedent:
#15172 (closed) made dock edge-band geometry host-relative on both axes — the contract this ticket guards mechanically.
- Substrate gap: the workspace tourbar carries no
reference (Workspace.mjs:435-478, only children do) — the containment chain needs it to assert via component ids rather than class selectors.
- The NL fixture exposes
getDomRect(componentIds) (test/playwright/fixtures.mjs:296); observe_motion gives rect time-series during drags (whitebox-e2e protocol §5.1).
The Fix
- A shared assertion helper
test/playwright/e2e/utils/dockGeometry.mjs (sibling pattern: e2e/utils/gpuIntent.mjs) with four assertion families: boot containment chain (tourbar.bottom = statusbar.top; statusbar.bottom = dockHost.top; host spans to viewport bottom), affordance containment (every painted indicator/preview rect inside dockHost), preview-zone alignment (tab-into preview ≈ zone rect within 2px; edge previews form a ≤24px band inside the zone edge), chip-header exclusion (no indicator rect intersects the tourbar rect).
- Consume it in
WorkstationDragAffordancesNL (the parked-drag scene) and the FiveBeat showcase surface (dropzone dwells are scripted — rects assertable at dwell instants).
- Add
reference: 'tour-bar' to the tourbar (Workspace.mjs:435) so the chain asserts via component ids.
- Landing order: rides the containing-block repair (@neo-gpt-emmy's ticket, filing in flight per A2A coordination
MESSAGE:d0b52529 / 1bb51bfd / 5aaabeee). The overlay assertions are RED at 61a8d34e6d, GREEN at her fix head — her PR lands first (blocked-by relationship set on her filing).
Acceptance Criteria
Out of Scope
- The CSS containing-block repair itself (Emmy's ticket/PR).
- The flicker taxonomy enumeration (
#15955 — adjacent, separate: a static offset is not a flicker class and is invisible to the census by design).
- Demo-A's surface (already carries the correct containing-block pattern).
Avoided Traps
- Screenshot/visual-diff assertions: brittle across themes + fonts; rects are the stable contract.
- Class-selector DOM reads for the chain: component-id
getDomRect survives restyling.
- End-state-only assertions: the misalignment was visible mid-gesture; the dwell/parked instant is the assertion point (whitebox §5.1 mid-interaction discipline).
Decision Record impact
aligned-with ADR 0029 (runtime-only dock geometry — the assertions guard exactly that contract).
Related
- @neo-gpt-emmy's drop-overlay-geometry fix ticket (number pending her filing; coordination
MESSAGE:d0b52529 / 1bb51bfd / 5aaabeee) — blocked-by, landing order hers first.
#15172 (closed precedent: host-relative edge-band geometry) · #13158 (QT-parity docking polish umbrella) · #15955 (adjacent flicker taxonomy) · #15952 (showcase beat surface) · take-16 reel frames as the "before" receipt (test-results/dock-wow-demo/takes/take16-overlay-t38.jpg in the film checkout).
Live latest-open sweep: checked latest 20 open issues at 2026-07-26T03:24Z; no equivalent found. A2A in-flight sweep: no competing claim in the last 60 min. Structure-map gate: N/A (test infra + one app-side reference, no ai//placement touch). Structural pre-flight Stage 1 fast-path: helper siblings exist (test/playwright/e2e/utils/gpuIntent.mjs).
Origin Session ID: 76078575-a2c3-43f5-82dc-2d06b154e2cd
Retrieval Hint: query_raw_memories("drop-overlay geometry -98px viewport-rooted containing-block dock-host rect assertions")
Design addendum (2026-07-26, from the #15971 review — @neo-gpt-emmy's measured guidance, folded by the author)
- Browser→manager rect parity is a first-class seam of the helper: after any CDP stage move, assert
Neo.manager.Window's innerRect matches browser-observed geometry within 2px (the seam #15971 establishes in the FiveBeat boot) — the rect layer consumes it rather than re-inventing a staging probe.
- Never normalize explicit
screenX/Y axes in assertions: Demo B intentionally pairs source client coordinates with target-window screen coordinates (her 21-call-site census); the rect families assert containment/parity, not coordinate-space unification.
Context
Operator steer 2026-07-26 ~03:15Z: "within whitebox e2e test including NL, we can check dom rects of containers and the dropzones… we should check more rects." It landed minutes after two independent catches of the same class: @neo-gpt-emmy's live falsifier of the drop-overlay geometry (viewport-rooted layer;
tab-intopreview renders −98px from its target zone; top edge chip y=10..36 overlapping the tourbar — measured atorigin/dev 61a8d34e6d, 1280×720) and the operator's own visual read of that overlap on the take-16 film set. The existing whitebox drag spec (test/playwright/e2e/workstation/WorkstationDragAffordancesNL.spec.mjs) proves visibility/commit and asserts zero geometry — the displacement shipped through a green suite. On record too: Iris's take-16 footage review misread the displacement signature as "clean gaps" precisely because no assertion existed to name it.The Problem
The dock affordance layer's geometry contract (§06: overlays are dock-host-local; ADR 0029's runtime-only geometry) has no mechanical guard. The realization drifted viewport-rooted (missing containing block) and every gate stayed green, because:
WorkstationDragAffordancesNLasserts candidate-set worker truth + overlay visibility + release-truth commit — never a rect.#15950) cannot see a static offset (zero frame-delta spikes — confirmed on the take-16 reel: 6 events, all transitions).The Architectural Reality
apps/workstation/view/Workspace.mjs:290-315(dock-preview+drop-indicatorsunderreference: 'dock-host', composed intoDockDragAffordances).hostRectis the overlays' coordinate origin,localRectsubtracts it (src/dashboard/DockDragAffordances.mjs:103-170, esp.:129,:169-171).tab-into= full zone rect; edge = 24px band inside the zone edge (src/dashboard/DockPreview.mjs:205-238).#15172(closed) made dock edge-band geometry host-relative on both axes — the contract this ticket guards mechanically.reference(Workspace.mjs:435-478, only children do) — the containment chain needs it to assert via component ids rather than class selectors.getDomRect(componentIds)(test/playwright/fixtures.mjs:296);observe_motiongives rect time-series during drags (whitebox-e2e protocol §5.1).The Fix
test/playwright/e2e/utils/dockGeometry.mjs(sibling pattern:e2e/utils/gpuIntent.mjs) with four assertion families: boot containment chain (tourbar.bottom = statusbar.top; statusbar.bottom = dockHost.top; host spans to viewport bottom), affordance containment (every painted indicator/preview rect inside dockHost), preview-zone alignment (tab-intopreview ≈ zone rect within 2px; edge previews form a ≤24px band inside the zone edge), chip-header exclusion (no indicator rect intersects the tourbar rect).WorkstationDragAffordancesNL(the parked-drag scene) and the FiveBeat showcase surface (dropzone dwells are scripted — rects assertable at dwell instants).reference: 'tour-bar'to the tourbar (Workspace.mjs:435) so the chain asserts via component ids.MESSAGE:d0b52529/1bb51bfd/5aaabeee). The overlay assertions are RED at61a8d34e6d, GREEN at her fix head — her PR lands first (blocked-by relationship set on her filing).Acceptance Criteria
dockGeometryhelper exists with the four assertion families, consumed by ≥2 specs (WorkstationDragAffordancesNL+ FiveBeat showcase).tab-intopreview equals the target zone rect within 2px; edge previews form a ≤24px band inside the zone edge.61a8d34e6d), pass at the geometry fix PR's head.tour-barreference added; no class-selector rect reads in the new assertions.Out of Scope
#15955— adjacent, separate: a static offset is not a flicker class and is invisible to the census by design).Avoided Traps
getDomRectsurvives restyling.Decision Record impact
aligned-with ADR 0029 (runtime-only dock geometry — the assertions guard exactly that contract).
Related
MESSAGE:d0b52529/1bb51bfd/5aaabeee) — blocked-by, landing order hers first.#15172(closed precedent: host-relative edge-band geometry) ·#13158(QT-parity docking polish umbrella) ·#15955(adjacent flicker taxonomy) ·#15952(showcase beat surface) · take-16 reel frames as the "before" receipt (test-results/dock-wow-demo/takes/take16-overlay-t38.jpgin the film checkout).Live latest-open sweep: checked latest 20 open issues at 2026-07-26T03:24Z; no equivalent found. A2A in-flight sweep: no competing claim in the last 60 min. Structure-map gate: N/A (test infra + one app-side
reference, noai//placement touch). Structural pre-flight Stage 1 fast-path: helper siblings exist (test/playwright/e2e/utils/gpuIntent.mjs).Origin Session ID: 76078575-a2c3-43f5-82dc-2d06b154e2cd Retrieval Hint:
query_raw_memories("drop-overlay geometry -98px viewport-rooted containing-block dock-host rect assertions")Design addendum (2026-07-26, from the #15971 review — @neo-gpt-emmy's measured guidance, folded by the author)
Neo.manager.Window'sinnerRectmatches browser-observed geometry within 2px (the seam #15971 establishes in the FiveBeat boot) — the rect layer consumes it rather than re-inventing a staging probe.screenX/Yaxes in assertions: Demo B intentionally pairs source client coordinates with target-window screen coordinates (her 21-call-site census); the rect families assert containment/parity, not coordinate-space unification.