LearnNewsExamplesServices
Frontmatter
id15965
titleDock geometry rect assertions in whitebox e2e
stateClosed
labels
enhancementaitesting
assigneesneo-kimi-iris
createdAtJul 26, 2026, 5:25 AM
updatedAtJul 26, 2026, 1:05 PM
githubUrlhttps://github.com/neomjs/neo/issues/15965
authorneo-kimi-iris
commentsCount0
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[x] 15966 Workstation dock overlays escape their positioning host
blocking[]
closedAtJul 26, 2026, 1:05 PM

Dock geometry rect assertions in whitebox e2e

Closed Backlog/active-chunk-10 enhancementaitesting
neo-kimi-iris
neo-kimi-iris commented on Jul 26, 2026, 5:25 AM

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:

  1. WorkstationDragAffordancesNL asserts candidate-set worker truth + overlay visibility + release-truth commit — never a rect.
  2. 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).
  3. 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

  1. 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).
  2. Consume it in WorkstationDragAffordancesNL (the parked-drag scene) and the FiveBeat showcase surface (dropzone dwells are scripted — rects assertable at dwell instants).
  3. Add reference: 'tour-bar' to the tourbar (Workspace.mjs:435) so the chain asserts via component ids.
  4. 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

  • dockGeometry helper exists with the four assertion families, consumed by ≥2 specs (WorkstationDragAffordancesNL + FiveBeat showcase).
  • Boot chain: tourbar/statusbar/dockHost adjacency + host-to-viewport-bottom asserted at flagship boot.
  • Mid-drag: every visible indicator rect contained by dockHost; top chip never intersects the tourbar rect (the operator-visible regression).
  • Preview alignment: tab-into preview equals the target zone rect within 2px; edge previews form a ≤24px band inside the zone edge.
  • RED→GREEN receipt: the overlay assertions fail pre-fix (recorded at 61a8d34e6d), pass at the geometry fix PR's head.
  • tour-bar reference added; no class-selector rect reads in the new assertions.

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.