Repository navigation
test(ui-react): split navigation reach pointer case families - #2434
Conversation
|
2026-10-19 — #2417 continuation r2, under the parent's existing claim The nine relevant unit failures are repaired in Focused evidence: the original three files reproduce exactly 24 pass / 9 fail. Repaired tests pass 38/38, 181 assertions, with all original assertions retained. Bypassing the document config check fails all four current-document negatives; bypassing worker enforcement fails the real current-config negative even after recomputing the manifest; bypassing the command digest fails its drift guard, and admitting just the actual changed config fails Source equivalence is rechecked: all 62 direct top-level statements / 42 assertion sites and all 43 imported durable-suite statements / 138 assertion sites remain exact. Fresh private empty-cache frozen copyfile dependencies match qualified identity Initial hosted measurement: run 39217736277 attempt 1 failed overall. Its three browser jobs succeeded. Their actual checkout logs, case/resource artifacts and immutable Git API agree on synthetic Downloaded immutable browser artifacts have verified ZIP SHA-256:
All 330 discovered browser file/project instances reconcile exactly once across the three shards. All 24 navigation instances and 2,151 cases pass, with case names matching the prior complete local receipt, zero navigation skips/failures and zero unhandled errors. The complete browser domain reports 9,056 passed and 10 skipped cases outside navigation; those skips are not hidden in the navigation count. Every navigation file/project is below 250 seconds, maximum 186.961 seconds. The table records logged file elapsed time, not summed case-body time; every entry has passed status.
Browser job IDs are 117945823735, 117945823953 and 117945823662. All used the unchanged pinned image Historical scheduling evidence at main The established PR #2434 stays draft and uses |
|
2026-10-20 source-only handoff: preserved candidate fix/2417-navigation-source-r3, head Main's Storage row and browser command registration are retained. Positive fixtures now read the independently delivered Storage owner No install, build, tests, runtime discovery, types, preflight or hosted proof ran in this source allocation. Parent reviewed and pushed only the separate preservation branch after the child finished; the existing #2434 branch and draft head remain unchanged. No new PR, qualification or current-tree timing claim is made. Historical 2,151-case/24-instance results and 186.961-second maximum retain their original failed-overall-run identity. #2350 remains the canonical unresolved prerequisite. Resume by reclaiming this preserved candidate, assessing live source changes, obtaining focused positive/refusal/mutation and actual browser inventory proof plus required preflight, then complete selected confirmation after the prerequisite is resolved. Weight refresh still requires an admitted successful overall run, followed by final weight-bearing candidate and main proof. No guard relaxation or unchanged failed-run retry is authorized. Claim |
Refs #2417; part of #1849.
What changed
The navigation reach matrix schedules its seven existing declaration families as separate files. An eighth wrapper retains every imported durable Actions case once per rail pointer project. Shared scenes retain their original hooks, abort checks and disposal. This continuation merges current main, retains the delivered Storage and diagram-scene checks, and freezes positive audit fixtures at independently delivered main
419f3a51b5017a4705e6fe4dba9982b6fc8de3bc. Production audit pins, guards and qualification are unchanged.Why this shape
The split follows the existing case boundaries and preserves every width, start, target, theme, pointer, assertion, deadline and capture identifier. Rail discovery uses the new leaf glob with the existing project scheduling bounds. The durable wrapper preserves suite-before-fixture import order and both cleanup layers. Test fixtures read raw Git blobs and frozen directory membership; candidate bytes have separate refusal controls so this changed configuration cannot qualify by recomputing metadata.
No changeset is needed: only tests and their documentation change. No supported contract or provider-facing history changes. The decision record now cites the fixture owner and actual current-source controls, and correctly describes refresh admission across every browser shard.
Proof
49cb2970de26574d640fdb3b54fba7637bfcca37; merged base:7b8a755ea329bd48a11b790e916c417b6f608eee. Merge commit35c5c5cf00cc07c5582adb93c1cc056cc4f21915preserves parents7d6fd28573d4ca97e4e79b52fdb8f3c2dbb16a13and that base.rail-fine,rail-coarseandrail-mixed; the shared fixture is excluded. Whole-repository proof inventory passes (1,537 execution instances); all 24 new navigation weights remain explicitly unmeasured and discovered.bound-browser-documents,browser-command-activationandbrowser-worker-audit. This includes all main's scene-producer refusal controls.current document sources retain only their reviewed bindingcases fail atCURRENT_DOCUMENT_SOURCE_DRIFT_REQUIRES_FRESH_PROOF(expected false, received true). Restore the exact bytes; focused suite passes.FROZEN_DOCUMENT_CONTROL_QUALIFIES(expected true, received false). Restore the exact owner bytes; focused suite passes. These are assertion failures, not setup or module-load failures.Undiscovered browser scenario: packages/ui-react/tests/browser/navigation-reach.desktop.pointer.tsx; deletingSessions oncefails the independentORIGINAL_NAVIGATION_STATEMENTS_RETAINEDassertion. Both restore byte for byte; current source equivalence and complete installed discovery pass.scripts/proof-case-report.mjs --check. Every local file/project elapsed time is below 250 s; maximum 177.180 s. Runtime: Bun 1.4.2, Vitest 4.1.11, Playwright 1.63.0; unchanged imagemcr.microsoft.com/playwright@sha256:eff16c30e6f3f4af0a03fa4b706120d5e9b0891c344a27d64559aff5900a4a27. Shared native lock, existing runner guards, default sequential files per project and original deadlines remain enabled. This is local proof on tree9965372add6ccd9b9b8a946009d0b43580de7bd5, not hosted candidate confirmation.bun run check:pr --base origin/mainexits 0 on this final head: 970 fast tests / 6,439 assertions plus 40 affected import-feedback tests / 210 assertions, zero failures. The fresh run started with 94 mountinfo entries and retained the sandbox setup prerequisite.Local file elapsed seconds (observations on this head; no hosted shard/job-wall or controlled speedup claim):
countsdesktopdurable-actionshandoffinventorykeyboardparitytargetsCase-family mapping
All paths are under
packages/ui-react/tests/browser/; each family executes in every unchanged rail pointer project. Complete assertion expressions are unchanged, including helper assertions and the existing dynamic parameter expansion.navigation-reach.counts.pointer.tsxnavigation-reach.inventory.pointer.tsxnavigation-reach.desktop.pointer.tsxnavigation-reach.parity.pointer.tsxnavigation-reach.handoff.pointer.tsxnavigation-reach.targets.pointer.tsxnavigation-reach.keyboard.pointer.tsxnavigation-reach.durable-actions.pointer.tsxThe direct families contribute 605 cases per pointer and the durable suite 112; the complete inventory is 2,151 cases.
navigation-reach-fixture.tsxowns the shared scene and helper assertions. Historical wait-evidence locations retain their original SHA; the map below uses merged main's originalnavigation-reach.pointer.tsxand the current split locations.Exact assertion mapping
navigation-reach-fixture.tsx:114expect(matchMedia("(any-pointer: coarse)").matches, "coarse media premise").toBe(mode !== "fine")navigation-reach-fixture.tsx:115expect(matchMedia("(any-pointer: fine)").matches, "fine media premise").toBe(mode !== "coarse")navigation-reach-fixture.tsx:116expect(matchMedia("(prefers-reduced-motion: reduce)").matches, "reduced motion premise").toBe(true)navigation-reach-fixture.tsx:223expect(name, `a named control: ${el.outerHTML.slice(0, 80)}`).not.toBe("")navigation-reach-fixture.tsx:226expect(r.height, `44px target height: ${name}`).toBeGreaterThanOrEqual(43.5)navigation-reach-fixture.tsx:227expect(r.width, `44px target width: ${name}`).toBeGreaterThanOrEqual(43.5)navigation-reach-fixture.tsx:231expect(el.contains(hit), `nothing covers ${name} at ${point.x},${point.y}: ${hit?.outerHTML.slice(0, 120)}`).toBe(true)navigation-reach-fixture.tsx:413expect.poll(() => (el = step.find(s)) !== null && !moving(el), { interval: 16, message: `${step.name} on screen and at rest, toward ${toward}` }).toBe(true)navigation-reach.counts.pointer.tsx:6expect(Number.isInteger(allowed(name, start, width)), `${name} from ${start} at ${width}`).toBe(true)navigation-reach.counts.pointer.tsx:8expect(new Set(PALETTE_ROWS).size, "one target per palette row").toBe(PALETTE_ROWS.length)navigation-reach.inventory.pointer.tsx:12expect(ui$(s).paletteOpen, "phone guard clears programmatic opening").toBe(false)navigation-reach.inventory.pointer.tsx:13expect(s.host.querySelector('[data-palette]'), "no hidden modal below 480").toBeNull()navigation-reach.inventory.pointer.tsx:17expect([...rows].sort(), `the palette at ${width} lists the routed commands`).toEqual([...PALETTE_ROWS].sort())navigation-reach.inventory.pointer.tsx:18expect(rows.filter((r) => r === "Sessions"), "Sessions once").toHaveLength(1)navigation-reach.desktop.pointer.tsx:12expect.poll(() => target.reached(s), { message: `${name} from ${start} at ${width} (${mode}) after ${steps.length}` }).toBe(true)navigation-reach.desktop.pointer.tsx:13expect.poll(() => SURFACE[name]!(s), { message: `${name} is drawn, not only flagged, from ${start} at ${width}` }).toBe(true)navigation-reach.desktop.pointer.tsx:14expect(steps.length, `activations to ${name} from ${start} at ${width} (D52 §2)`).toBe(allowed(name, start, width))navigation-reach.desktop.pointer.tsx:19expect.poll(() => s.writes, { message: `${name} from ${start}: requests that write` }).toEqual(job)navigation-reach.desktop.pointer.tsx:20expect(document.documentElement.scrollWidth, "no horizontal overflow").toBeLessThanOrEqual(width)navigation-reach.parity.pointer.tsx:27expect.poll(() => target.reached(s), { message: `${name} by the palette row` }).toBe(true)navigation-reach.parity.pointer.tsx:37expect.poll(() => target.reached(s), { message: `${name} by its route` }).toBe(true)navigation-reach.parity.pointer.tsx:41expect({ ...routed, paneFocused: name === "Sessions" ? routed.paneFocused : null }, `${name}: route and palette agree`) .toEqual({ ...reference, paneFocused: name === "Sessions" ? reference.paneFocused : null })navigation-reach.handoff.pointer.tsx:14expect([...paletteRows(s)].sort(), "the palette lists the routed commands and the handoff").toEqual([...PALETTE_ROWS, HANDOFF].sort())navigation-reach.handoff.pointer.tsx:18expect.poll(() => handoffOpen(s), { message: `${HANDOFF} by the palette row` }).toBe(ITHACA.id)navigation-reach.handoff.pointer.tsx:24expect(reference.review, "the palette row opened a review").toBe(ITHACA.id)navigation-reach.handoff.pointer.tsx:29expect.poll(() => handoffOpen(s), { message: `${HANDOFF} by the row's overflow` }).toBe(ITHACA.id)navigation-reach.handoff.pointer.tsx:33expect({ ...routed, panels: routed.panels.filter((p) => p !== "sessionPanelOpen"), paneFocused: null }, `${HANDOFF}: the overflow and the palette agree`).toEqual({ ...reference, panels: reference.panels.filter((p) => p !== "sessionPanelOpen"), paneFocused: null })navigation-reach.targets.pointer.tsx:18expect(rows.length, "the palette lists its rows").toBe(PALETTE_ROWS.length)navigation-reach.targets.pointer.tsx:27expect(row.contains(hit), `the row's own box takes a press at ${x},${y}: ${name} hit ${hit?.outerHTML.slice(0, 120)}`).toBe(true)navigation-reach.targets.pointer.tsx:30expect(Math.round(r.height * 10) / 10, `fine-pointer density: ${name}`).toBe(/sync|spends/.test(name) ? 35.7 : 34)navigation-reach.targets.pointer.tsx:32expect(r.height, `44px target height: ${name}`).toBeGreaterThanOrEqual(43.5)navigation-reach.targets.pointer.tsx:33expect(r.width, `44px target width: ${name}`).toBeGreaterThanOrEqual(43.5)navigation-reach.keyboard.pointer.tsx:21expect(document.activeElement, "Tab reaches All commands").toBe(all)navigation-reach.keyboard.pointer.tsx:25expect(dialog(), "Enter opens the palette").not.toBeNull()navigation-reach.keyboard.pointer.tsx:26expect(document.activeElement, "focus enters the query").toBe(dialog()!.querySelector("input"))navigation-reach.keyboard.pointer.tsx:29expect(dialog()).toBeNull()navigation-reach.keyboard.pointer.tsx:30expect(document.activeElement, "Esc returns focus to All commands").toBe(all)navigation-reach.keyboard.pointer.tsx:35expect(index, `${target.palette} is listed`).toBeGreaterThanOrEqual(0)navigation-reach.keyboard.pointer.tsx:38expect((document.activeElement?.textContent ?? "").startsWith(target.palette!), `arrows reach ${target.palette}`).toBe(true)navigation-reach.keyboard.pointer.tsx:41expect.poll(() => target.reached(s), { message: `${name} by keyboard` }).toBe(true)navigation-reach.keyboard.pointer.tsx:42expect.poll(() => SURFACE[name]!(s), { message: `${name} is drawn after the keyboard route` }).toBe(true)navigation-reach.keyboard.pointer.tsx:43expect(dialog(), "running a row closes the palette").toBeNull()Checklist
0.44.0; both read back during this continuation.CONTRACT:commit.Anything left open
The coordinator owns complete candidate confirmation and merge. This PR remains draft; no ready transition, integration reservation, confirmation or merge is requested by this continuation.
The shard weights are unchanged. The established
scripts/refresh-browser-costs.tsrequires a successful overall attributed CI run with all three fresh browser jobs and complete checkout/image/spec timing evidence. Historical run 39217736277 failed overall and remains inadmissible, although its 24 navigation instances / 2,151 cases passed and its maximum file cost was 186.961 seconds. Successful cheap draft gates cannot supply browser measurements. After the coordinator obtains a successful full run, refresh through the existing tool, record every new file/project below 250 seconds plus per-shard whole-job durations, and confirm the final weight-bearing head. The maintainer's 2026-10-22 ruling dropped the #2350 edge; the issue has no remaining declared blocker. Contributor-guide drift discovered during this work is filed separately as #2550.