21 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, requirements-completed, duration, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | requirements-completed | duration | completed | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 06-turn-by-turn-guidance-live-driving | 08 | web-capture-harness |
|
|
|
|
|
|
|
|
|
48min | 2026-10-24 |
Phase 6 Plan 8: The Verification Close — Replay Captures + THE ONE REAL DRIVE Gate Summary
The shell is proven on film: the ?drive= fixture-replay knob streams the committed corridor/missed-turn drives through the LIVE pump and seven capture legs freeze the cockpit — banner with real OSM street names, collapsed-default list with the NEXT lamp, the calm no-red REROUTING state, the bottom-register abandon confirm, the trip-end deletion card, the dark-theme chassis — beside the mockup in the DSGN-02 guidance gallery — while two real device-gate bugs were caught and fixed before the road: the abandon confirm evaporating on a live fix, and the puck/freshness freeze that would have flipped SIGNAL LOST mid-drive; the ONE REAL DRIVE itself is now the BLOCKING human gate (06-DEVICE-GATE.md).
Performance
- Duration: 48 min
- Started: 2026-10-24T12:10:00Z (approx; fresh dispatch after verified-dead prior passes)
- Completed (automated half): 2026-10-24T12:58:00Z approx
- Tasks: 1 of 2 (task 1 complete + committed; task 2 = the BLOCKING device gate — awaiting the human)
- Files: 14 (7 created, 7 modified) + the checkpoint file
Accomplishments
- The ?drive= replay knob (task 1, step 1):
installMockWebAppreadsdrivefrom location.search (harness-only module), validates the name through a slug guard + defensive fixture shape check against the committedweb/test/fixtures/drives/*.json, and replacesnavigator.geolocationwith a replay source. The REAL pump arms its REALcreateGuidanceWatchagainst it — the unmodified D-15 throttle and D-04 machine consume the committed stream; no test-only bypass of validation (the threat model's trust-boundary law). The clock starts lazily at the first watch arm (the route draw) and plays REAL-TIME;window.__ARAHARAH_DRIVE = { pause(), resume(), name }freezes/resumes emission mid-stream. An unknown name emits one honest token (ARAHARAH-DRIVE state=unknown) and falls back — never a crash, never arbitrary data (T-06-08). - The seven guidance legs (task 1, step 2), exactly per the UI-SPEC capture table:
shell-guidance-active.png—?mock=android&dest=merdeka-118&fixpair=central-market-to-merdeka-118&drive=corridor-follow: bannerGUIDE // NEXT+ white85 M+ beigeJALAN TUN SAMBANTHAN+ orange arrow on the plate, compacted strip (data-guidance="active"), the guidance card (GUIDEregister, Merdeka 118,4 MIN · 1.9 KM · ETA HH:MM, progressbar, END TRIP), collapsed-default LIST toggle, matte-black chassisrgb(26,26,26).shell-guidance-list.png— scripted banner tap →aria-expanded=true,CLOSEtoggle, the NEXT row lamp + real text rows.shell-guidance-rerouting.png—drive=missed-turn-excursioncaptured INSIDE the REROUTING window (the stub holds the merge answer 5s):GUIDE // REROUTING,—dash, the calm copy, the blinking gantry, the last glyph held — zero functional-red computed colors in the banner or card.shell-guidance-confirm.png— scripted END TRIP → the bottom-register confirm card (GUIDE // CONFIRM,Abandon route?,YES, ABANDONprimary,CONTINUE) — no red.shell-guidance-tripend.png— scripted YES, ABANDON → the center-register trip-end card with the visible deletion clause; banner/list cleared; the full-height strip returned.shell-guidance-dark.png—scheme=dark: the theme-slot honesty check + the chassis Rams-constant.guidance-gallery-compare.png— the DSGN-02 composite besideactive_route_guidance/screen.png(the composer generalized with mockup params; legs 8/13 byte-identical behavior).
- The engine-A-shaped route stub: the shell's route consult rides
/api/routethrough the composed ladder; the guidance legs intercept it with an answer built from committed data — the pair's ODbL geometry + the drive's recorded maneuverIdx/kinds + street names snapped off the LOCAL road graph at each post-maneuver segment midpoint (engine A's deriveSteps semantics). Reroute requests get a merge model from the requesting fix (the replay controller's buildRerouteModel semantics), held 5s so the calm window is photographable. The REALvalidatedResultstill runs on every answer. - D-15 console hygiene carried into captures: every guidance leg scans its WHOLE console capture for coordinate-bearing lines (
assertNoCoordinateLines) — the legs assertARAHARAH-GUIDE state=<state>tokens and the ABSENCE of coordinates; the replay source itself logs nothing per fix (T-06-04: no new logging). - Two device-gate bugs caught and fixed BEFORE the road (see Deviations):
- The D-09 confirm card evaporated on the next accepted fix (renderCockpit rebuilt the guidance card over the ONE exit guard) — G7b pins the survival.
- The pump's accepted fixes never touched the chain's surfaces: the puck froze at the boot fix while the camera rode the snapped line (the UI-SPEC's recorded call: "the puck … carr[ies] progress"), and
lastFixstayed at boot so the 45s staleness law would falsely flip SIGNAL LOST mid-drive and re-run the chain — one injectedupdatePuckdep composeslastFix = fix+marker.update(the RAW fix; the camera rides the SNAPPED foot) +setStale(false). G7c pins the call + main.ts's composition.
- Suite state: web 148 passed / 0 failed (146 baseline untouched-green + G7b + G7c), bot 125/125, routing 65/65; all typechecks clean;
npm run web:capture20/20 (all 13 prior legs unbroken); zero new dependencies.
Task Commits
- task 1: the replay knob + the seven legs + the gallery (with the two Rule-1 fixes committed separately first)
fca2a90fix(06-08): the D-09 confirm card survives a live fix — renderCockpit guards the card rebuild (G7b RED→GREEN, atomic test+fix)d0d5a7dfeat(06-08): the ?drive= fixture-replay knob — the D-16 browser leg's fix source17bb950feat(06-08): the seven guidance capture legs + the DSGN-02 guidance galleryed86196art(06-08): the seven committed guidance captures — the shell proven on filmb83a88efix(06-08): the pump's accepted fixes ride the chain's surfaces — puck + freshness (G7c)5eeccdfart(06-08): regenerate the guidance captures — the puck rides the line
Files Created/Modified
web/src/mock/telegram-mock.ts— the ?drive= knob: fixture glob (root-absolute pattern), slug + shape validation, the replay geolocation (real-time schedule, lazy clock, pause/resume), the honest unknown-fallback tokenweb/scripts/capture.mjs— the guide wait mode, the stub installer, the seven legs, the generalized composer, the coordinate + computed-color scans, the expected list at 20web/src/route/route.ts— the confirm-card renderCockpit guard (G7b) + the updatePuck dep call per accepted fix (G7c)web/src/main.ts— updatePuck wiring: lastFix refresh + marker.update + setStale(false), the camera untouchedweb/index.html— the runner-page knob comment (docs-only; the knob is read inside the mock module)web/test/route-surface.test.mjs— G7b + G7c (147→148)web/screenshots/*.png— the seven committed captures.planning/phases/06-turn-by-turn-guidance-live-driving/06-DEVICE-GATE.md— the blocking gate's protocol + checklist
Decisions Made
See key-decisions: real-time replay, the Playwright-side stub, graph-snapped street names, and the two fix-over-paper-over calls.
Deviations from Plan
Auto-fixed Issues
1. [Rule 1 - Bug] The D-09 confirm card evaporated on a live fix
- Found during: task 1's confirm-leg design (traced the live-drive path before filming)
- Issue:
renderCockpitrebuilt the guidance card over the open confirm on every accepted fix — the ONE PX-03 exit guard survived only between fixes; G7 tested confirm without a subsequent fix so the gate never saw it. The real drive's step 6 (END TRIP on a live road, fixes every ~2–5s) would have hit it within one watch tick. - Fix: renderCockpit skips the card rebuild while
confirmOpen; banner/list still re-render. G7b pins: confirm mounts → live fix → confirm still shown → YES ABANDON still tears down. - Files modified: web/src/route/route.ts, web/test/route-surface.test.mjs
- Commit:
fca2a90
2. [Rule 1+2 - Bug/critical gap] The pump's fixes never rode the chain's surfaces (frozen puck + false SIGNAL LOST)
- Found during: task 1's active-leg design (the puck's visual trail on the probe capture) + the 45s staleness trace
- Issue: the UI-SPEC's recorded call pins "the puck … carr[ies] progress", but the pump's onWatchFix moved only the camera — the puck froze at the boot fix and the driver would lose it within seconds; and
lastFixnever refreshed during guidance, so the strip's 45s staleness law would flip SIGNAL LOST (red) mid-drive and re-run the chain (a marker jump + a 60s nudge poll on the road). - Fix: one injected dep (
updatePuck) called per accepted fix; main.ts composeslastFix = fix+marker.update(raw fix) +setStale(false); the camera untouched (the guidance camera owns the viewport). G7c pins the dep call + the main.ts source-scan composition. - Files modified: web/src/route/route.ts, web/src/main.ts, web/test/route-surface.test.mjs
- Commit:
b83a88e
3. [Rule 3 - Blocking] The route consult needed a steps-bearing answer for the legs to exist at all
- Found during: the first capture run (every guidance leg failed: the fixture-backend fallback's
steps: []model puts the arrive mark at 0m → instant arrival → teardown before any assert) - Issue: the plan's interfaces name only the mock's fix source; but the LIVE pump's cockpit needs maneuver marks the fixture backend never serves (D-10's honesty law — fixture steps stay empty).
- Fix: the engine-A-shaped
/api/routestub in capture.mjs (Playwright interception, installed pre-goto): consult = the drive model (committed geometry + recorded maneuverIdx/kinds + graph-snapped street names), reroutes = merge models held 5s. No index.html behavior change, nothing shipped; the client-side validation still gates every answer. - Files modified: web/scripts/capture.mjs
- Commit:
17bb950(rode the legs commit)
4. [Rule 3 - Blocking] Vite 8's import.meta.glob matches no relative pattern escaping src/
- Found during: the knob build (the eager glob compiled to
Object.assign({})— zero fixtures) - Fix: the root-absolute pattern
/test/fixtures/drives/*.json(verified by the dev-server probe; all four drives inline into the harness bundle, production tree-shake verified clean in both directions).
Judgment calls within plan laws (not deviations)
- The replay's pause() freezes EMISSION only; the shell's wall clock keeps running (the machine's grace windows inflate across a pause) — legs that pause close before any machine timing matters; documented in the mock's header.
- The unknown-name token (
ARAHARAH-DRIVE state=unknown) is the knob's ONLY console line (the plan's sanctioned honest token); a successful load is silent — diagnostics ridewindow.__ARAHARAH_DRIVE.name.
Auth Gates
None — the capture run is offline (harness stubs + Playwright interception); no Telegram/network credentials needed.
Known Stubs
Task 2 (the ONE REAL DRIVE) is NOT RUN — by design, never faked. It is the phase's declared exit gate (D-16) and a checkpoint:human-verify gate="blocking" task: physical GPS, real road geometry, and human legibility/haptic judgment are the declared device-gate protocol. .planning/phases/06-turn-by-turn-guidance-live-driving/06-DEVICE-GATE.md carries the full checklist (Parts A/B/C). The phase stays OPEN until the drive's per-step verdict lands; a FAIL holds it open (the Phase 3 UNVERIFIED precedent). Everything automatable on the path is green: web 148/148, bot 125/125, routing 65/65, captures 20/20.
Threat Surface Scan
No new surface beyond the plan's <threat_model>: the replay knob feeds the REAL pump with committed, attributed fixtures (unknown names fail honest — the Tampering mitigation); the guidance legs assert state tokens and scan their whole console for coordinate-bearing lines (the D-15 hygiene law carried into captures — T-06-04); no new production logging (the knob is harness-only, tree-shaken from web/dist — verified in both directions this plan); the real-drive protocol rides the product's own privacy posture (no location history exists; the KV spot-check proves the post-trip deletion on real infrastructure). No threat flags.
Issues Encountered
- The prior 06-08 dispatches died without landing work (verified quiet + clean before starting); this session started fresh and landed the whole automated half.
- Concurrent processes are writing the shared tree again (.planning/*, AGENTS.md, README, mockup code.html files, a bot command file) — every commit staged ONLY this plan's files individually; none of the concurrent files were touched.
- Node lives under nvm; every shell command sourced
~/.nvm/nvm.shfirst (all prior plans' precedent).
User Setup Required
For the device gate itself: nothing beyond the standing deploy posture (npm run deploy -w bot; the R2 graph already uploaded; the R2 dashboard activation possibly still pending — see 06-DEVICE-GATE.md's executor notes).
Next Phase Readiness
- The blocking checkpoint (task 2): Parts A (gallery), B (the drive), C (the street-source ratification) await the user; the verdict rides 06-08-SUMMARY.md's update + 06-DEVICE-GATE.md.
- The phase verifier: D-16's three legs now have their evidence — recorded drives (06-02), captures (this plan), the drive pending (the gate). The two new fixes (G7b/G7c) are pinned by gates, not claims.
- Phase 7: the gallery artifact + the recorded calls are the DSGN-02 close-out material.
Phase: 06-turn-by-turn-guidance-live-driving Automated half completed: 2026-10-24; the ONE REAL DRIVE awaits the user (BLOCKING)
Self-Check: PASSED
- All 7 committed captures verified present on disk + in git (
ed86196,5eeccdf); all 6 plan commits verified in git log (fca2a90,d0d5a7d,17bb950,ed86196,b83a88e,5eeccdf) — zero deletions in any of them. - Acceptance greps re-run at close:
import.meta.globover/test/fixtures/drives/*.json+ the__ARAHARAH_DRIVEsurface present in telegram-mock.ts; all 7 UI-SPEC leg names present in capture.mjs asserting ARAHARAH-GUIDE tokens. npm test -w web148/148 (G7b + G7c included), bot 125/125, routing 65/65, all typechecks clean;npm run web:capture20/20 with the coordinate-hygiene scan green on every guidance leg.- STATE.md and ROADMAP.md untouched by this executor (per the dispatch's explicit instruction; their working-tree diffs are other processes' concurrent writes).
- The prior dispatch's "quiet tree" note held this time: every commit staged only this plan's files.
Checkpoint resolution (orchestrator, 2025-10-25)
ONE REAL DRIVE APPROVED (Parts A/B/C). Bug round 1 (a69fe31) fixed the
destination card's no-forward gap + localized the header title. Verification:
06-VERIFICATION.md — phase 6 PASSED. Escalation on record: ALT landmarks (c2)
= next-milestone lever.