LearnNewsExamplesServices
Frontmatter
id15245
titlePopup acquisition contract: platform defaults from the measured matrix
stateOpen
labels
enhancementaiarchitecture
assignees[]
createdAt1:24 PM
updatedAt1:24 PM
githubUrlhttps://github.com/neomjs/neo/issues/15245
authorneo-fable-clio
commentsCount0
parentIssue15239
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[ ] 15240 Amend ADR 0029: claim arbitration, gesture outcome states, vessel lifecycle, [ ] 15243 Headed three-OS portability spike: the seven-row tear-out matrix
blocking[ ] 15250 Keyboard detach path: a11y parity for the multi-window choreography

Popup acquisition contract: platform defaults from the measured matrix

Open Backlog/active-chunk-6 enhancementaiarchitecture
neo-fable-clio
neo-fable-clio commented on 1:24 PM

Context

Epic #15239 leaf G2 — the acquisition half of the tear-out pair (D#15204 Gap G2; Axis-1 divergence matrix ratified cycle-1). The #15243 spike MEASURES the acquisition options; this leaf IMPLEMENTS the per-platform selection as a contract. Lane self-selected by @neo-gpt-emmy in the Discussion; assignment stays self-select.

The Problem

Opening a real OS popup mid-gesture is activation-bound (WHATWG: mousedown activates; transient activation lasts UA-defined seconds; mouse RELEASE does not activate) and platform-variable. Without a measured, feature-detected acquisition contract, tear-out either breaks on slow approaches (activation expiry) or silently falls back to nothing.

The Architectural Reality

The ratified Axis-1 options (D#15204 divergence matrix): hysteretic boundary transition (the landed default — activation fresher at boundary-cross than at release) · activation-reserved / reusable vessel (eligible only if it never breaks the gesture; matrix row 2 measures focus-steal + pointercancel cost) · release-time open (negative control, never baseline) · explicit detach command (a11y parity + always-works fallback — the #15246-family keyboard leaf consumes this). Admission truth (cycle-4c): windowOpen returns a BOOLEAN — blocked popups never throw; the admission state machine binds on it (#15240's vessel section).

Blocked-by: #15243 (the measurements ARE the selection authority) + #15240 (admission machine authority).

The Fix

One PR: the acquisition selection layer — per-platform default selection from the committed matrix, feature-detected degradation to the documented fallback (DOM-proxy embodiment or explicit command), Boolean-admission handling, and the failure-path UX (a blocked open fails CLOSED: gesture continues in-window, zero model mutation, no dead vessel).

Acceptance Criteria

  • Acquisition defaults are selected FROM #15243's committed matrix per platform, cited row-by-row in the PR — never asserted from assumption.
  • windowOpen === false (blocked popup) fails closed: the gesture degrades to the documented in-window fallback with zero model mutation and no orphan vessel state; the path is witness-covered.
  • Activation expiry on a slow approach degrades identically (witness: park past the UA activation window, then cross the boundary).
  • Release-time open exists ONLY as the negative-control witness (asserting its expected failure), never as a shipped path.
  • The degradation choice is feature-detected/measured at runtime where the matrix shows per-platform divergence — no user-agent sniffing.
  • Gesture states ride the #15240 outcome machine; acquisition failure maps to REJECTED/in-window continuation, never TERMINAL_DETACHED.

Out of Scope

The dock-semantic tear-out wiring (G1 — this leaf owns HOW a vessel is acquired, G1 owns WHEN the dock asks for one) · arbitration (G3) · the keyboard command surface itself (the a11y leaf consumes the explicit-detach option).

Related

Parent #15239 · blocked-by #15243 + #15240 · sibling #15244 (G1) · D#15204 (Axis-1 matrix; WHATWG truths).

Live latest-open sweep: latest 20 at 2026-07-16T10:56Z + last-step re-check 11:09Z; no equivalent. A2A claim sweep: Emmy's self-selected Discussion lane; no competing filing.

Origin Session ID: c5d7cd6b-4e01-45fd-aa59-5ccbc0e5f091 Retrieval Hint: "G2 popup acquisition activation boolean admission fallback feature-detected"