frontend-patterns/research/evolution/cycles/2026-09-27-navigation-ownership.md
tegwick e484cae45f Preregister competing navigation ownership comparison
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0cffe-206f-7323-89d3-b20ca4cf4bf9
2026-09-27 00:30:14 +02:00

4.4 KiB
Raw Blame History

LEARN-0013 — Completion ownership under competing navigation

Status: preregistered before implementation/execution. 2026-09-27 Europe/Berlin. Codex author-model review; stream F, new comparison group F-navigation-ownership-v1. The multi-request question differs from the single-response focus protocol; do not pool rates. CAND-0009 URL-addressable State, CAND-0010 Progressive Enhancement, CAND-0016 Focus Return. No new candidate presumed.

Question and prior

Can the previous managed focus policy let old history/navigation completions replace newer selection, steal focus or report obsolete results? Prior single-request evidence supports continuation but leaves competing completions untested. Proposed guard: assign an owner/generation to navigation, reject stale completions before effects, and track focus ownership independently so an otherwise valid response need not move focus. Test outcome, not a blanket recommendation to cancel HTTP requests.

Compare the unchanged prior focus-policy.js with an authored guarded policy on one new controlled fixture. Use stable content target and persistent navigation controls so requests from different elements can compete. Hold responses at server barriers, then release in declared order. Browser history uses real Back with htmx snapshot eviction. Keep default transport alive to distinguish ignored completion from abort. If htmx prevents a race itself, record that rather than force a failure. A guarded miss/error or URL/content mismatch is failure, not permission to revise expectations.

Registered matrix

Two policies × two browsers (Chromium/Firefox), six cases = 24 rows. Baseline rows record the same obligation booleans as guarded rows; distinguish successful recording from meeting the obligations. Guarded rows assert all registered obligations. One trial each; preserve failures and any correction. No arbitrary sleeps. Tab/Enter activate links; browser Back uses history API through Playwright.

ID Ordered scenario Obligation after completion
O01 Back misses history cache; user moves to surviving search; release history Restore selected article/URL/title but preserve search focus and typed text
O02 Back miss held; newer article navigation completes; release old history Keep newer article/URL/title/status/focus; old history completion has no UI effect
O03 Older article request held; newer article completes; release older success Keep newer article/URL/title/status; no late focus theft
O04 Older request held and will fail; newer article completes; release old 503 Preserve newer result and feedback; no obsolete error replaces completion
O05 Older request held; newer request fails; then release older success Do not resurrect older intent; retain last committed view with newest failure feedback
O06 Older article held; Back restores cached view; release old success History is newer intent too: keep restored view/URL/title/status/focus

O05 starts from an already committed alpha view; O06 first visits beta to establish history. Distinguish committed route from pending browser-history URL. Capture intermediate and final state, actual requests and completion traces. Prefer public hooks; any history-XHR callback wrapping is explicitly pinned/experimental, not a portable production fix. No writes, server rollback, AT speech, production recurrence, nonzero swap delays, view transitions, redirect/error taxonomy or universal race proof.

Learning and stopping

45 active research minutes and 10 execution minutes before scope review. Monotonic single-agent elapsed session minus experiment/check subprocess durations; checkpoint inspection belongs to execution, no double count. Orientation and final administration outside window; tokens/cost unknown. Commit this plan before implementation/execution. Append one ledger outcome; retain all results and source hashes. If scope/criteria must change, preserve and disclose the original plan rather than rewriting it.

After this comparison, pause the navigation-fixture thread. Write a short synthesis: what changed versus prior claims, what remains unverified, and the next independent or broader evidence question. Hand residuals to WP-0003 T01/T02 and measurement work to WP-0006 T03. Do not automatically start another fixture hardening cycle. One cycle per distinct group cannot demonstrate diminishing returns. Live inference, if needed, uses llm-connect; none is planned here.