- captureLeg accepts a per-leg viewport (default 390x844 unchanged)
- shell-guidance-landscape.png: corridor drive leg verbatim at 844x390 — the
@media (orientation: landscape) block exercised in a real browser
- shell-route-pending-landscape.png: the designed pending card in landscape
- both legs under the existing MIN_BYTES blank bar; capture 22/22 non-blank
- guide wait mode: the ARAHARAH-GUIDE state-token race (expectGuide
on_route|rerouting) + DOM text polls + the PX-02 theme-slot honesty
check + the D-15 coordinate-hygiene scan over the WHOLE leg's console
(assertNoCoordinateLines — state tokens only, never coordinates)
- the engine-A-shaped /api/route stub (per-leg Playwright interception,
installed pre-goto): POST #1 = the consult — the drive model built
from the committed fixture corpus + the drive's recorded maneuver
indices + street names snapToGraph'd off the LOCAL road graph (the
road the turn puts you on); later POSTs = reroutes — the merge model
held 5s so the calm REROUTING window is photographable; the REAL
http-source validation still runs on every answer
- legs 14-19 per the UI-SPEC capture table: active (banner slots +
compact strip + card + progressbar + LIST default), list (scripted
banner tap -> CLOSE + NEXT row lamp), rerouting (calm copy + dash +
gantry + NO functional-red computed colors), confirm (bottom register
+ both CTAs + no red), tripend (center card + deletion clause + chrome
cleared + strip returned), dark (matte-black chassis constant)
- leg 20: guidance-gallery-compare.png vs active_route_guidance/screen.png
(the composer generalized with mockup params; legs 8/13 unchanged)
- prior 13 legs unbroken: 20/20 non-blank captures
- SIGNALS + seen-map + diagnostics gain ARAHARAH-ROUTE; waitMode 'route'
races the state token, asserts expectState + expectText DOM text, and
applies the PX-02 theme-slot honesty check on themed legs
- captureLeg gains an interact(page) pre-shot hook (the alt leg's chip tap)
- five legs data-driven from the committed corpus (demoPair picked at
runtime — never a hardcoded pair literal): fixture / alt / pending /
dark / route-gallery-compare (composer refactored into composeCompare)
- expected list grows 8 → 13
- RED by construction: the ?fixpair knob does not exist yet, so the
default fix sits outside the demo pair's 200m tolerance → the drawn
legs must fail with state=pending
- BA7: the shipped JS must carry EVERY committed gazetteer id (the
web half of bot/web id-set parity, T-04-39) — RED against the
pre-gazetteer bundle, green after the resolver lands in the build
- BA8: the shipped JS carries NO deep-link crypto (JS assets only —
the official Telegram SDK is external, D-11/T-04-40)
- no-storage: explicit web/src/search memory-only + no-crypto pin
- capture.mjs: the ARAHARAH-DEST signal race + the 'dest' wait mode
(state=resolved asserted, then the rendered card's text is waited
on — the card mounts at live, T-04-42) + the shell-dest-preload
leg; 8/8 expected captures