frontend-patterns/research/experiments/navigation-history/README.md
tegwick e8ccb73a12 Test competing navigation ownership and review research thread
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a0cffe-206f-7323-89d3-b20ca4cf4bf9
2026-09-27 00:45:54 +02:00

76 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Navigation, history and representation-cache experiment
First prospective cycle: [preregistration](../../evolution/cycles/2026-09-27-navigation.md)
at commit `f3697c1`, before implementation/execution. [Review](../../reviews/NavigationHistoryExperiment.md).
Pinned htmx 2.0.11 and Playwright 1.63.0, authored public read-only HTTP fixture.
[Result](result.json) includes input hashes, exact browser versions/binary hashes,
request traces and final DOM/event observations. No real application/CDN or model call.
```bash
npm ci --ignore-scripts --cache /tmp/fep-npm-cache
PLAYWRIGHT_BROWSERS_PATH=/tmp/fep-playwright-browsers node node_modules/playwright/cli.js install firefox
PLAYWRIGHT_BROWSERS_PATH=/tmp/fep-playwright-browsers FEP_CHROMIUM_PATH=/path/to/chrome npm test
```
Firefox profile access required execution outside the workspace sandbox. Chromium
was an explicit preinstalled binary override, not claimed to be Playwright's bundled
revision. Default output `/tmp/fep-navigation-result.json`; `FEP_RESULT_PATH` overrides
it. The runner writes checkpoints to that output and a complete receipt on completion.
Choose a new output per run; committed receipts are never default outputs.
[Initial partial receipt](initial-partial.json) retains ten passing Chromium rows;
launch then failed because Firefox was not in Playwright's default cache. Setting the
existing browser-cache path fixed execution, without changing runner or criteria.
The full run repeated Chromium and completed Firefox: 20/20 registered checks, not
30 independent observations. N10 repeats explicit Node HTTP checks in each browser
group; those two rows are not evidence of browser-specific automatic revalidation.
N09 records the negative control, including non-reproduction if that ever occurs.
N01–N06 cover direct/native/enhanced/history/recovery paths; N07–N09 use actual browser
HTTP cache with no request interception. N08's final full fetch reaches the server
again in both browsers: correctness does not imply simultaneous retention of both
variants or optimal cache hit rate. Both N09 runs reuse the fragment without another
request. The server varies on both request selectors and computes ETags from response
bytes. htmx history requests explicitly disable HX-Request; the server separately
supports the history-restore header overriding fragment selection.
History eviction uses htmx 2.0.11's sessionStorage key, an experimental control tied
to the pinned implementation. No assertion of identical content freshness across
history, general offline availability, accessibility, script-late races, writes,
real intermediary correctness or independent full-pattern recurrence follows.
## Keyboard/focus follow-up
[Preregistered LEARN-0012](../../evolution/cycles/2026-09-27-navigation-focus.md),
[review](../../reviews/NavigationFocusExperiment.md), [receipt](focus-result.json).
Run the same browser environment with `node focus.mjs`. Output defaults to
`/tmp/fep-focus-result.json`; choose a fresh `FEP_RESULT_PATH` per execution.
The separate focus runner/policy preserve the earlier navigation/cache inputs and
receipt hashes. Same locked packages. 22 cases: native keyboard plus raw/managed
navigation, 503 feedback, held-response focus ownership, history and background work.
Raw rows observe behavior, so 22 passing rows do not mean raw and managed variants
meet identical focus/feedback obligations. See NF01–NF06. The policy is authored
experimental code; DOM focus and live-region text do not establish assistive-technology
announcements or conformance. History and request-race limits remain explicit.
## Competing completion follow-up and pause
[LEARN-0013 protocol](../../evolution/cycles/2026-09-27-navigation-ownership.md),
[review](../../reviews/NavigationOwnershipExperiment.md), [receipt](ownership-result.json).
Use the same browser environment with `node ownership.mjs`; choose a new
`FEP_RESULT_PATH` (default `/tmp/fep-ownership-result.json`). Six scenarios × two
policies × two browsers: 24 completed rows, all obligations met by guard 12/12 and
previous policy 0/12. These are deliberately adversarial cases, not general quality
scores. Server barriers impose schedules; client completions are observed without
aborting transport or claiming remote rollback.
The previous focus-policy.js remains byte-for-byte unchanged. New ownership-policy.js
uses a generation plus separate focus ownership; its history XHR handler wrapping is
explicitly tied to pinned internals. Initial runner/result retained under
ownership-initial.mjs / ownership-initial-result.json: four Firefox keyboard-helper
failures corrected by backward traversal, without changing policies or obligations.
Initial receipt's ownership.mjs hash corresponds to ownership-initial.mjs.
The [thread review](../../reviews/NavigationThreadReview.md) pauses fixture expansion
and hands the next evidence question to an independent pinned application source study.