13 KiB
Phase 8 isolated host-browser verification — 2026-10-14
Latest bounded follow-up: technical checkpoint-review readiness. Human acceptance remains pending. The native modal boundary below is now reproduced in a minimal control and does not indicate background focus escape.
To repeat only the bounded follow-up with an existing working Playwright module:
node tools/phase8-followup.mjs /tmp/aia-phase8-followup-new
This uses the same guarded loopback preview. Native 200% zoom needs the module's
chromium.launchPersistentContext API and Chromium extension support; an optional
temporary module adapter must expose that API as well as launch. The runner
creates a fresh test profile/extension under its output folder, without changing
the normal browser profile. Website service workers and external requests remain
blocked. A temporary extension worker only controls native tab zoom; it contains
no network code. Zoom evidence uses overlapping viewport images because
Playwright fullPage clips at native zoom in this environment. To repeat just
that capture, use PHASE8_ZOOM_ONLY=1 with a different fresh output directory.
All screenshots/profiles stay outside Git. Do not treat technical checks as
screen-reader or fluent-language sign-off.
Status update 2026-10-15: system Chromium browser execution now succeeds; human reviewer acceptance remains Pending. See the actual browser results. The environment failure recorded below describes the earlier attempt, not the current system-browser result. The optional Nix shell itself remains unverified. Read the Phase 8 report and Phase 7 nonproduction plan. This procedure authorizes no hosting, production request, submission, deployment, tracking, staging or commit. Use the current uncommitted Phase 8 CSS changes for verification; record HEAD and diff before review.
Prerequisites and stop conditions
Environment follow-up (2026-10-14): the repository now offers a Linux Nix
browser shell. From the repository root run
nix --extra-experimental-features "nix-command flakes" develop .#browser.
It supplies a matching driver/browser from the existing lockfile and sets
PLAYWRIGHT_MODULE for both the smoke test and the runner below. First run
TMPDIR=/tmp node tools/playwright-smoke.mjs from www after a staging build.
That bounded probe starts its own loopback preview in the same execution and
must succeed before a full suite is attempted. It creates no production requests.
Shell realization/browser launch remain unverified in the autonomous environment:
Nix's pinned-input fetch fails CA validation and the host store/daemon is not
visible. Syntax checks alone do not establish a working browser. The following
existing-installation fallback remains available outside the Nix shell.
Use the project's existing Nix environment and locked dependencies. Record Node,
npm, OS, Playwright and Chromium versions. The repository does not add a Playwright
dependency. An existing, working host Playwright installation and Chromium
binary are required; the runner imports playwright, or an explicitly provided
PLAYWRIGHT_MODULE=/absolute/path/to/existing/playwright/index.mjs. It requires
BrowserContext.routeWebSocket. Missing module/browser/API is an environment gate,
not permission to change dependencies or bypass isolation. No npx download is
part of this procedure. An authorized operator must supply any missing tooling.
Do not open an ordinary unguarded browser tab to perform these tests. The runner
creates its request policy before navigation: only GET/HEAD to exactly
http://127.0.0.1:4321 may proceed. All other requests, including unpkg, map tiles,
production API, conversion endpoints and non-GET form methods are aborted.
WebSockets and service workers are blocked. No production cookie jar or browser
profile is imported. Keep evidence in a fresh /tmp directory outside Git.
A blocked production API request must be recorded as a prevented attempt and investigated under P9-04. Stop interaction immediately if one is observed. Do not turn off interception to make screenshots pass. The capture runner does not submit forms. The separate interaction runner below uses an intercepted, empty synthetic fixture for its native-submit test; it aborts the POST before it reaches a server. Use no personal/patient data. Do not click payments, external portals, social links or authentication flows.
Build and loopback preview
From www, first terminal:
node --version
npm --version
TMPDIR=/tmp ASTRO_TELEMETRY_DISABLED=1 npm run build
node --experimental-strip-types tools/audit-phase8.mjs /tmp/aia-phase8-host-static.json
TMPDIR=/tmp ASTRO_TELEMETRY_DISABLED=1 npm run preview -- --host 127.0.0.1 --port 4321
Confirm preview says 127.0.0.1:4321; do not use --host 0.0.0.0, a LAN/public
origin, or a hosted preview. The static result must show 122 routes, zero hard
failures and no Arabic homepage. The two inherited heading findings were corrected with retained styling/text;
current generated output has zero heading-review warnings. If the server uses a different port, stop and free the intended
loopback port; do not edit the safety origin casually.
Second host terminal, also from www:
node tools/phase8-browser.mjs /tmp/aia-phase8-host-static.json /tmp/aia-phase8-host-browser-review
node tools/phase8-interactions.mjs /tmp/aia-phase8-host-interactions
The output directory must not already exist; choose a new directory on each run.
If Playwright is elsewhere, set PLAYWRIGHT_MODULE to its existing module entry.
The runner first loads Spanish privacy, validates title/H1/robots, captures a test
full-page screenshot, and navigates to a second real route. Only after that probe
passes does it run the suite. A transport failure/blank page is not a pass.
Automated observations (now executed with system Chromium; retain fresh output paths when reproducing):
- 122 desktop route visits at 1440×900, DPR 1; 50 selected routes at 390×844.
- Full-page desktop/mobile captures for those 50 routes, after font readiness and scrolling to trigger lazy images. Captures include all sections, not only heroes.
- Twelve Tab observations on Library, Spanish Contact and Arabic author archive at each width. These observations do not certify a correct focus sequence.
- A separate JavaScript-disabled context visiting the 50 routes at 390px.
- Sanitized blocked-request records (method/origin/path), runtime-error categories, route/title/lang/dir/robots, missing eager images and overflow candidates.
results.json can contain unresolved overflow candidates or runtime errors even
if the command exits successfully. Review every finding; success only means
the runner completed. Region-level overflow can be intentional. Conversely,
overflow-x:hidden can conceal clipping, so a false pageOverflow value is not
proof of proper reflow. Auto-opening service drawers require explicit review;
screenshots are not guaranteed to capture every timed state. CSS/font differences
from this environment must be recorded.
The interaction runner covers keyboard disclosures/search, image Back navigation,
fragments, Arabic region scrolling, no-JS controls, home reflow at 320/390/768/1440,
and the intercepted synthetic form fixture. It reports pass, fail, and
review separately; the native modal/browser-chrome focus boundary still requires
visible-browser and screen-reader review. Failures set a nonzero exit status;
a review item is not an acceptance pass.
Guarded manual browser checks
For a visible browser plus paused reviewer contexts, use a fresh evidence path:
PHASE8_MANUAL=1 node tools/phase8-browser.mjs /tmp/aia-phase8-host-static.json /tmp/aia-phase8-host-manual-review
After observations, Playwright Inspector pauses three separate contexts:
1440px JavaScript enabled, 390px enabled, and 390px disabled. Review only within
these guarded contexts and navigate only to http://127.0.0.1:4321 paths.
Resume Inspector after each context to continue. A production API attempt is a
stop condition; retain its sanitized evidence, stop the run and report it.
Do not use Inspector to fill or submit forms. No acceptance is inferred from
resuming the script; enter signed reviewer findings below. Stop preview with
Ctrl-C after review. Preserve only selected non-sensitive screenshots for a later
reviewed checkpoint; do not copy whole browser profiles/traces/caches into Git.
Reviewer checklist and evidence fields
Use one row per route/state, not one general approval for the whole site:
| Reviewer / role | UTC date | Route / component | Browser, OS, AT versions | Viewport / zoom / JS | Steps | Expected / actual | Pass / fail / not tested | Evidence | Issue / owner |
|---|---|---|---|---|---|---|---|---|---|
| Pending | — | — | — | — | — | — | Not tested | — | — |
Required checks (route population and 50 representatives are in the Phase 8 report and static JSON):
- At 1440 and 390px, inspect the entire page against qualified source-design evidence: header/hero/crops, typography and wrapping, spacing/backgrounds, cards, tables, images/captions, CTAs, FAQs, form/map fallback and footer. Add 768px where breakpoints need investigation. Record source URL/capture timestamp/cache qualification; no insecure TLS fallback or fresh broad crawl.
- Test skip link, Tab/Shift-Tab reading order, nested desktop menus, mobile menu, language menu, Escape, focus visibility/clipping, FAQ Enter/Space, pagination, search live results and empty state. Type only nonsensitive example queries (meltdowns, refuerzo, التعزيز); confirm locale scoping and Unicode matching.
- Open/close service drawers, including delayed opening; verify initial focus, containment and restoration. Hidden controls must not receive focus. Observe states without submitting forms; disabled-button explanations must be understood.
- On EN/ES Contact and consultation, check every label/option/instruction and accessible name. Under blocked external resources, address/telephone fallback must remain usable and map failure understandable. Actual third-party map loading is not covered; separate controlled-resource review is required.
- At 200% zoom/text resizing, check reflow and visible focus, longer Spanish labels, all button/hover/icon/eyebrow contrasts and overflow beyond the bounded selectors already fixed. Confirm the corrected DTT/NET and consultation H2 structure remains meaningful.
- Arabic: reading order, bidi BCBA/LBA, breadcrumbs, tables, list alignment, author headings, navigation, alternate-language notices and correct link destinations. Do not reinterpret professional/clinical wording during review.
/ar/library/aba-school-readiness-guide: inspect all three diagrams at desktop and 390px. Tab to each named scroll region, use arrow keys, inspect both edges, outline, min-width behavior, no page overflow, Arabic text/font fallback and concealed English labels. Compare causal arrows with English assets; do not reverse sequences by assumption. Fluent Arabic/clinical sign-off is separate.- Test
/library/play-leisure-skillsfull-size image links and browser Back,/library/behavior-modification-techniques-reinforcement-theoryworksheet,/library/picky-eating-autism-parent-guidefour fragments. Verify AAC and EN/ES/AR self-advocacy Halloween references and English-language notices. /library/page/6and author page 6: five real cards, previous page works, no page 7, correct related titles/links. Sample new articles and all locales.- JavaScript disabled: core content, menu/language links, native FAQs, archives, images/fragments, contact obfuscation fallback, static disabled-form notices, metadata-only employee portal and Arabic regions. Search enhancement limits must be understandable; no demand for an unauthorized backend.
- Real screen reader: record actual AT/browser/OS/version. Check navigation, Spanish form instructions, FAQ expanded state, search announcements, table headers, Arabic credentials and diagram-region names/alternatives. DOM or screenshot inspection is not a substitute. Gate remains Pending until run.
Acceptance and boundaries
No human reviewer has completed this checklist in the sandbox. Phase 8 is technically ready for checkpoint review; human acceptance remains pending. Clinical/organizational, fluent Spanish/Arabic, both privacy policies and trusted Spanish-source comparison, diagram terminology and all P9-01–P9-10 decisions remain pending. This procedure does not enable hosted preview, production API isolation implementation, forms, analytics, Ads, redirects, nginx, DNS, deployment or cutover. Phase 10 operational acceptance is separate.