Files
Portfolio/docs/reviews/visual-qa.md

40 KiB
Raw Blame History

Portfolio visual QA

Status date: 2026-09-05

Automated capture contract

tests/browser/visual-regression.spec.ts renders the production client from validated public inputs and captures transient Playwright evidence; it does not commit machine-fragile pixel baselines. It asserts layout and perceptual invariants that would detect a materially blank, washed-out, over-saturated, overflowing, or content-obscuring composition.

Required viewport captures:

  • 320×568 and 390×844 mobile portrait;
  • 844×390 mobile landscape;
  • 768×1024 tablet portrait;
  • 1280×720, 1440×900, 1920×1080, and 2560×1440 desktop.

Required state captures:

  • default live scene at every viewport above;
  • Static and reduced motion;
  • audio running;
  • scene/media failure fallback;
  • optional social profiles missing;
  • Contact arrival.

Each default viewport asserts:

  • no horizontal overflow and all primary surfaces inside the viewport;
  • dark professional composition with restrained chromatic accent coverage;
  • no panel background imagery, filters, glowing text, or content scanlines;
  • intentional widths for each desktop layout family, including 68% diagram/toolkit corridors and a 46% destination capped at 42rem, plus readable mobile single-column widths;
  • only approval-bound project image elements, with authored captions and text alternatives; no project video is published in the current manifest.

Static receives a two-capture perceptual-stability assertion. Contact arrival must resolve the Contact heading, route HUD, ARRIVED state, identity, and visible email action together.

Automated evidence status

Area Result
Eight required viewport compositions PASS in Chrome for Testing 151.0.7922.34
Static stability PASS; average normalized two-capture difference stayed below 0.001
Reduced-motion poster PASS
Audio-running controls/composition PASS
Failure fallback PASS
Missing-social Contact fallback PASS
Contact arrival composition PASS
Current installed Chromium flash sequences PASS; see docs/accessibility/flash-analysis.md

Focused evidence is generated by:

npm run test:browser -- tests/browser/visual-regression.spec.ts

The final 2026-09-02 complete browser run passed 167 checks with 43 deliberate project/capability skips. Two desktop heading-focus geometry checks reached the correct target but timed out under the four-worker run; both files then passed 9/9 unchanged with one worker, including the two affected checks. The 16 visual checks ran once in the available current Chromium project; the duplicate mobile-project visual cases were skipped intentionally.

Content, SEO, and media acceptance — 2026-09-05

The final focused desktop/mobile Chromium matrix passed 94 checks with 26 intentional project/capability skips and no failures. It covered semantics, keyboard operation, no-JavaScript output, reduced motion, forced colors, reflow, responsive layout, approved-media policy and failure behavior, and the visual-regression oracle. The compiled preview retained all eight locked sections in order.

One broad compiled-preview review covered 1440×900 desktop, 320×568 mobile, 200%-zoom-equivalent layout, Static, reduced motion, keyboard-only, no-JavaScript, and print-relevant views. The opening view communicated Luca's name and equal systems/software role immediately. Infrastructure preserved a readable request-flow diagram and made the Nextcloud migration the primary operations proof. The private medication tracker remained the primary developer visual through its three approved screenshots and captions. Footy Tracker clearly described collaboration, Luca's contribution, measured results, and limitations without publishing the rights-unconfirmed broadcast frame. Opinion Dynamics remained a supporting project with two explained charts and an exact-values table. Contact kept email as the dominant action.

No high-impact visual or content defect was found. On the shortest 320×568 and 200%-zoom-equivalent opening views, the fixed drive controls occupy the lower viewport edge and can sit beside the end of the opening action row. The row and all following content remain scroll-reachable, keyboard-reachable, and clear of focus obscuration; the reflow and target-geometry gates passed. This is recorded as a non-blocking compact-height tradeoff rather than a reason for a preference-driven layout iteration.

The compact 320×568 capture initially revealed that the fixed drive controls occupied 43.5% of the viewport and obscured the opening content. The mobile-only control grid reduced that surface to 24.0%; a regression guard now caps it at 34%. After the trace-driven fixed section navigation landed, the captures exposed the decorative HUD intersecting the navigation at phone widths and the controls at 768×1024. A shared exact navigation-height variable now keeps the fixed navigation and visible compact HUD edge-adjacent, reserves their space in the header, and leaves the controls independent. The final measured bounds were 0–93px navigation and 93–125px HUD at 320×568, and 0–45px navigation and 45–77px HUD at 768×1024. Fixed-navigation focus now uses an inward standards outline so the indicator remains visible inside the viewport. Passive-section coverage now positions the target safely beyond the actual 35% activation line rather than relying on a relative offsetTop or exact fractional equality.

A one-sampled-pixel accent floor was relaxed from 0.001 to 0.0005 after the capture remained visibly intentional and the original value missed by only 0.00002; the dark and maximum-accent limits remain unchanged.

The final integrated review identified two high-confidence gaps. The GPU ledger now includes the composer and bloom render targets reported by the post-processing owner, and the infrastructure case study now includes a visible trust-boundary/request-flow key plus its adjacent text equivalent. The requested Contact wording was checked against the implementation plan and retained exactly because it already matches the approved current copy. The full runtime budget gate passed with no violations after recording the actual High-tier allocation, including 161,344,784 render-target bytes.

The post-review resize pass now synchronizes the native navigation disclosure whenever the compact breakpoint changes: shrinking closes the overlay before it can cover the identity card, while widening restores the complete desktop navigator. The soundtrack's required user gesture is labeled PLAY SOUNDTRACK because the visual drive is already running and browser audio cannot begin before an explicit action.

Nightdrive reconstruction evidence

The September Nightdrive convergence pass replaced the shallow procedural composition with a unified shader world and an original Blender-authored grand tourer. Exact opening captures are retained at 1440×900, 1280×720, 768×1024, and 390×844 under docs/reviews/evidence/nightdrive-iteration/final/, together with Infrastructure, Selected builds, Contact, acceleration, and Static states. The matching pre-change and reference captures remain in the adjacent baseline/ directory.

The continuity refinement is retained separately under docs/reviews/evidence/nightdrive-iteration/refinement/. It includes opening frames at 390×844, 844×390, 768×1024, 1440×900, and 2560×1440; acceleration and 700ms coast frames; a readable Profile sign; the same sign reconciled after a skipped target; an empty browser-error log; and the authenticated High-tier allocation trace. These captures specifically cover the portrait, short-landscape, tablet, standard desktop, and ultrawide cases that exposed finite haze/sky edges.

The final live composition uses a 66° cruise FOV, a 79° maximum acceleration FOV, a 438-unit road/terrain depth, a 20.4-unit road-and-shoulder width, a 34-unit maximum side-ridge relief, and a 44-unit shader-sun radius. The atmosphere's base gradient and two horizon banks are now clip-space layers, so they cover every aspect ratio and every point in the camera's FOV range without exposing rectangular geometry. Three low-frequency silhouette bands bridge the sun into the procedural terrain, while one deterministic instanced roadside-anchor batch adds parallax without per-frame instance allocation.

Terrain and road still share one wrapped world-distance state, but visible response no longer fans out from one undifferentiated acceleration value. Scroll velocity is normalized to viewport height, filtered with a 180ms attack and 1050ms release, and protected from delayed-frame spikes. A persistent render-dynamics owner applies separate attack/release curves to road flow, chase-camera response, streaks, bloom, and suspension. The camera position, look target, roll, and 66–79° FOV are damped; the car now has a dark contact shadow, road-level underglow, lower self-emission, and chapter-coupled key/fill lighting. The content layer and its approved geometry were not changed in this refinement.

The sign controller still latches only one canonical next target and keeps its minimum readable dwell clock-driven. It now owns a transition generation, retargets only while concealed, starts a clean departure when the authoritative section has passed a readable sign, coalesces multi-section jumps without queueing, and preserves explicit-navigation, history-restoration, initial-positioning, reverse, reduced-motion, and Static suppression semantics.

The original vehicle source is assets/blender/nightdrive-grand-tourer.blend. The optimized src/assets/nightdrive-grand-tourer.glb is 410,408 bytes, with 8 mesh/material groups, 11,560 triangles, no textures, and no animations. Its metadata records original authorship and no third-party providers or assets. The runtime hierarchy preserves the requested chase-car, car-body, rear-glass, rear-light-bar, and underglow names without per-frame traversal or hierarchy mutation.

The pre-refinement Three.js DevTools profile measured 19 draw calls, 15,658 triangles, 4,490 lines, 160 points, 12 programs, 22 geometries, 22 materials, 2 textures, and approximately 1.5 MB of directly inspected scene memory. A five-second inspection recorded 8.1 ms average and 12.4 ms p95 frame time with no spikes or jank. That durable profile remains docs/reviews/evidence/nightdrive-iteration/final/devtools-profile.json; it is retained as the measured baseline rather than mislabeled as a new inspector capture. The refinement adds five deliberately bounded draw submissions by construction—three silhouette bands, one instanced anchor batch, and one car contact shadow—and the current automated browser/error and allocation checks pass.

The refreshed authenticated 1440×900 High-tier allocation trace passed at device DPR 2 and renderer pixel ratio 1.5. It recorded 844,340 geometry bytes, 1,064,960 texture bytes, and 161,344,784 render-target bytes; the budget evaluator passed with no violations under its 32 MiB runtime allowance. Transfer checks also passed with a 221,206-byte first-live-scene payload after Brotli accounting. The focused 25-check scene, sign, responsive-visual, fallback, and flash-safety run passed completely. The longer scripted interaction trace was updated to the current icon-only controls and authenticated tier ledger, but this host's headless High/DPR path exceeded its 75-second harness timeout during CDP wheel dispatch, so no valid long-trace result is claimed from that run.

The final ownership split remains deliberate. Blender should continue to own only the finite car because silhouette, bevels, clean normals, wheel forms, material groups, and LOD/export discipline justify authored geometry. Terrain, road, sky, horizon banks, distant silhouettes, roadside anchors, sun, stars, streaks, signs, camera, palette, and scroll response should stay in Three.js because they depend on infinite wrapping, dynamic text, responsive framing, reversible route state, and performance-tier control. The added depth layers strengthen that conclusion: their deterministic instancing, chapter coupling, and FOV-safe screen/world-space behavior would become less flexible as baked GLB scenery, while the measured geometry increase is only 2,996 bytes. No additional Blender export is justified.

Nightdrive cohesion continuation

The 2026-09-03 cohesion pass is retained under docs/reviews/evidence/nightdrive-iteration/cohesion-pass/. Its before/ directory preserves the five opening families captured before this pass; final/ contains the corresponding 390×844, 844×390, 768×1024, 1440×900, and 2560×1440 openings plus dedicated cruise/acceleration horizons, opening/later-chapter suns, acceleration/release/coast particles, three reverse-scroll frames, sign approach/readable/departure/reconciliation states, Static and reduced-motion states, and empty browser-error logs. The supplementary later-chapter sun frame keeps the focal point unobstructed, while the first later-chapter frame proves that it remains subordinate when content crosses it.

The investigation found four shared causes rather than unrelated tuning defects. First, the road, terrain, and atmospheric layers received a monotonic distance value but multiplied the accumulated phase by the current speed, so easing back toward cruise could make the computed phase decrease. Second, road and terrain geometry ended at the same z = -410 plane, where opaque black distance fades formed a visible cap; the sun was also in front of the silhouette stack, preventing atmospheric occlusion. Third, sign lifecycle state and sign pose were split: reverse input could cancel a readable approach, target changes could cut short the 1,400ms dwell, departure assumed the dwell pose even when it began during approach, and resize immediately replaced live poses. Fourth, the original sign face used non-normalized shape UVs and then sat behind its replacement housing, which explained the blank/soft face independently of lifecycle behavior.

The world now has one 794-unit depth contract (z = 34 through z = -760) and one linear 330–705 fog interval shared by native materials and analytic shaders. Road and terrain extend through that envelope, converge through the same fog and horizon light, and no longer use an opaque black endpoint. Asphalt combines low-amplitude broad and fine deterministic variation with longitudinal wear, shoulder breakup, and restrained atmospheric pickup. Lane and shoulder contrast fade into the same horizon instead of disappearing at a separate boundary. The five final viewport captures and both 66° cruise/79° acceleration captures show no finite mesh edge, black cap, floating road, shoulder seam, or exposed camera angle.

The sun is now a layered shader focal point at z = -720, with broad and fine internal variation, a shaded limb, restrained scan bands, a muted halo, and a separate horizon-light bleed. Distant silhouettes at z = -675 write depth and partially occlude the disc; terrain edges, road pickup, fog, and chapter warmth use the same palette response. Opening and later-chapter evidence shows the richer disc without clipped edges, broad bloom, flare sprites, or content-competing saturation.

The sign remains runtime-authored Three.js geometry. A clipped beveled housing, backplate, bracket, brace, narrow supports, and planted footing supply finite construction detail, while the 1024×288 mipmapped canvas face keeps chapter text sharp and runtime-owned. Cyan is limited to a small practical corner marker and amber to the route accent. The controller keeps one canonical target, lets concealed signs retarget immediately, preserves visible labels, defers stale departure until the minimum dwell expires, coalesces jumps, and starts departure from the actual current pose. Visible viewport changes are deferred until concealment, avoiding teleportation or revival. Focused browser evidence and sign-lifecycle-trace.json record only Profile through a forced multi-section jump (staleLabelMutated: false). Another Blender asset was not justified: the sign's dynamic text, lifecycle, responsive pose, and quality-tier behavior benefit more from stable runtime geometry than from a baked GLB.

travel-distance.ts is now the only physical travel-phase owner. It advances from elapsed time, maintains an 18-unit-per-second forward cruise floor, adds filtered speed/energy response, caps delayed-frame contribution, and never subtracts document deltas. Road, terrain, streaks, anchors, and other travel uniforms consume that direct phase; scroll direction is still available to non-diegetic anticipation but cannot reverse the world. forward-motion-trace.json sampled six live WebGL distance uniforms 74 times while document scroll reversed from 1,800px to 1,280px. Every uniform remained monotonic, advanced through acceleration, release, coast, and reverse scroll, and had a positive minimum observed delta of approximately 2.772 units. Streak visibility is proportional and fades through release; deterministic jitter keeps anchor recycling outside conspicuous regions and avoids synchronized rows. The existing lateral waves were not changed.

Fresh verification produced these results:

  • Type checking passed.
  • The complete unit/build gate passed 43 files and 525 tests; the focused world, sign-controller, and drive-controller run passed 64 tests in 3 files.
  • The complete four-worker browser matrix reported 172 passed checks, 43 deliberate skips, and one existing desktop heading-focus geometry timeout. That exact check passed unchanged in 2.9 seconds with one worker. The newly added sign/navigation cases passed unchanged in both desktop and mobile projects with one worker.
  • Deployment verification passed 9 tests in 3 files. Its first sandboxed attempt could not bind its local HTTP fixture (EPERM); the unchanged test passed when rerun with the required local-network permission.
  • The authenticated High-tier runtime budget passed with no violations at 1440×900, device DPR 2, and renderer ratio 1.5. It measured 748,476 geometry bytes, 1,589,248 texture bytes, 161,344,784 render-target bytes, a 33,554,432-byte non-render-target allowance, and 197,236,940 total accounted bytes. Peak scene-image concurrency was 1 and video concurrency was 0.
  • Transfer verification passed with a 222,464-byte Brotli-accounted first-live-scene payload. The environment chunk measured 699,501 raw / 145,875 Brotli bytes, application JavaScript 79,894 transfer bytes, and the unchanged authored car GLB 410,408 raw / 76,589 transfer bytes.
  • Browser console capture remained empty in both recorded checks. Static, reduced motion, WebGL failure/fallback, accessibility/keyboard, responsive, and flash-safety cases are included among the passing browser checks.
  • git diff --check passed.

The unchanged 20-second interaction harness still does not yield a valid long trace on this host, so no interaction latency or frame-cadence result is claimed. Its independent mobile-low run loaded content under the prescribed throttle but stayed in data-scene-state="loading" beyond the fixed five-second scene-ready window. Its independent desktop-high run again reached the Toolkit CDP action but exceeded the fixed 75-second test timeout, matching the previously documented host behavior. Neither assertion or budget was weakened. The authenticated allocation trace, deterministic live-uniform trace, responsive screenshots, and browser assertions are the measured evidence for this pass; physical-browser, cross-engine, and audience checks remain outstanding below.

Nightdrive sign reliability and legibility pass

The 2026-09-03 sign-only continuation is retained under docs/reviews/evidence/nightdrive-iteration/sign-reliability-pass/. Its README.md records the exact per-route candidacy/corridor mapping, lifecycle contract, responsive pose families, texture contract, measured face sizes, and evidence index. The supplied Profile-overlap scenario remains in before/; corrected left/right content relationships, five viewport families, DPR 1/2/3 states, Low/High tiers, lifecycle/adverse-input states, Static, reduced motion, and empty console evidence are separate and do not overwrite earlier review sets.

The investigation identified shared controller, projection, and texture causes. Large deltas and multi-boundary samples were previously discarded before reconciliation; dwell was timed from the original latch instead of the first actual readable frame; every desktop sign inherited one right-side pose; a resize/quality rebuild omitted the latched responsive profile; the former departure could cross the camera plane; and the 1024×288 source did not match the face ratio and could be cached before the intended font was ready. These were fixed within the Three.js sign boundary. No content, CSS, navigation, HUD, control, car, road, terrain, sun, atmosphere, camera, or forward-motion redesign was introduced.

The final controller accepts only forward passive-scroll candidates with motion enabled. A normal next route becomes eligible within 0.55vh; a boundary crossing resolves to the eligible route actually reached. Concealed labels may retarget, visible labels never mutate, jumps retain only the latest relevant pending target, and completed transitions cannot spam on small oscillations. The clock-driven phases are 300ms anticipate, 650–900ms approach, at least 1,400ms dwell measured from the first actual dwell frame, 700ms lateral/receding departure, and 350ms cooldown. A visible approach now completes approach plus the entire dwell even after reversal or passing its target; the refreshed trace observed 1,483.4ms between its first sampled dwell frame and departure after reverse input. Initialization, explicit/skip/direct navigation, history restoration, Static, reduced motion, and hidden-document transitions remain intentionally suppressed or reset.

Route metadata places Profile, Additional work, and Toolkit in left/outer-left corridors; Experience and Contact in right corridors; and Infrastructure and Selected builds in outer-right corridors. The wide, tall, and short pose families are latched per lifecycle and survive scene-quality rebuilds. Browser projection assertions require the complete readable face to remain inside viewport edges and clear of the active panel, adjacent opening panel, navigation, controls, and HUD. Final measured face widths were 150.64px at 390×844/DPR 3, 134.49px at 844×390, 182.76px at 768×1024, 195.05px at 1440×900, and 312.09px at 2560×1440. The Profile and Experience desktop frames were measured on opposite sides of their corresponding content panels.

The sign face is now an exact 4:1 plane with a 2048×512 sRGB canvas texture, trilinear mipmaps, linear magnification, and up to 8× available anisotropy. The bundled Geist Mono faces are awaited before the first draw, and the face bypasses tone mapping to avoid post-process color distortion. Every recorded dwell reported fontReadyWhenDrawn: true; source sampling headroom ranged from 6.56 to 15.23 texture pixels per rendered face pixel across the recorded viewport/DPR matrix. Label redraw and texture upload occur only when a concealed target changes. Geometry, materials, texture, projection vectors, and mounting remain stable render-owned objects; test-only projection inspection runs only in the authenticated test build.

Fresh verification produced these final results:

  • The production build gate passed type checking, all 43 unit files / 538 tests, client and SSR builds, prerender verification, and the transfer check.
  • The focused controller test passed 30/30. The final focused controller/world/lifecycle/drive/resource group passed 179 tests in 5 files, including the strengthened visible-approach dwell assertions.
  • The final complete four-worker browser matrix passed 178 checks with 44 deliberate project skips and no failures. An earlier pre-final run produced one known desktop heading-focus timeout under load; the exact unchanged test passed with one worker in 2.1 seconds, and it also passed in the final four-worker matrix.
  • The focused desktop/mobile sign-and-journey run passed 13 checks with the one intentional duplicate responsive-matrix skip. Its responsive loop exercised the automatic Low cap at 390px, Medium cap at 768/844px, and High cap at 1440/2560px. The final complete matrix independently passed the same sign, passive-scroll, explicit-navigation/restoration, keyboard/accessibility, responsive, Static/reduced-motion, fallback, and flash-safety paths.
  • Deployment verification passed 9 tests in 3 files. Its sandboxed attempt could not bind the local HTTP fixture (listen EPERM); the unchanged suite passed with local-network permission.
  • The final authenticated 1440×900 High-tier allocation gate passed with device DPR 2 and renderer ratio 1.5. It measured 5,608,790 texture bytes, 748,476 geometry bytes, 161,344,784 render-target bytes, a 33,554,432-byte allowance, and 201,256,482 total accounted bytes. Peak scene-image concurrency was 1 and video concurrency was 0.
  • Transfer verification passed with a 222,897-byte Brotli-accounted first-live-scene payload. The environment chunk measured 701,690 raw / 146,308 transfer bytes, application JavaScript 80,343 transfer bytes, and the unchanged car GLB 410,408 raw / 76,589 transfer bytes.
  • browser-console.json contains an empty error array, and git diff --check passed before final review.

The independent long interaction harness remains invalid on this host and no frame-cadence or input-latency number is claimed. Its desktop High/DPR run again reached the Toolkit target lookup but exceeded the fixed 75-second timeout; its mobile Low/DPR run remained in scene loading until the fixed five-second deadline and entered the tested static failure path. Neither timeout, assertion, scene-ready deadline, nor budget was changed. Three.js DevTools also reported no connected app for the final preview, so the earlier DevTools draw-call profile remains baseline evidence rather than being relabeled as a new result.

No new Blender asset was justified. The finite authored car remains Blender-owned and unchanged. Dynamic sign text, route candidacy, lifecycle, responsive placement, road, terrain, atmosphere, sun, camera, and motion remain Three.js-owned. Physical-device, Firefox, Safari/WebKit, Edge, assistive-technology, and audience review remain the honest manual limitations below.

Navigator recovery follow-up

The later navigator failure shared one state-ownership cause: explicit, initial, and history-restoration samples were correctly concealed but incorrectly written into the passive traversal's completed-sign ledger. A navigator jump could therefore disqualify the expected sign, and returning to Start did not re-arm it. Suppressed navigation now clears that traversal ledger without changing the suppression contract. A following wheel, touch, or scroll-key epoch can select the correct next sign again, while completed signs remain suppressed throughout uninterrupted passive travel so small boundary oscillations still cannot spam them.

The focused controller regression failed against the previous implementation because Profile remained null after a completed lifecycle and an explicit Contact-to-Start round trip, then passed after the ownership correction. The real-browser regression clicks a section, returns to Start, and verifies that the Profile sign is emitted on the next passive scroll. It passed in both desktop and mobile projects. The final four-worker browser matrix passed 180 checks with 44 deliberate project/capability skips and no failures, including navigation, history, keyboard, accessibility, responsive, Static, reduced-motion, fallback, visual, and flash-safety coverage.

Sign passing and navigator-trigger continuation

The final 2026-09-03 signs-only continuation supersedes the earlier sign-pass route, navigator, resize, texture, and departure details above. Durable evidence is retained under docs/reviews/evidence/nightdrive-iteration/sign-passing-refinement/; its README.md is the canonical evidence index and records the complete route/trigger/pose contract. The supplied Profile-overlap baseline remains separate from the corrected viewport, DPR, quality, lifecycle, adverse-input, navigator, Static, reduced-motion, and empty-console evidence.

The investigation found six shared causes. Navigator actions exposed only a generic explicit-navigation source, so preserving skip/direct/history suppression also concealed intentional navigator arrivals. Completed-route state was not generation-bound, allowing an older departure to poison a traversal restarted at Start; reverse hysteresis re-armed only one route; and cooldown discarded legitimate same-label work from a newer traversal. The old desktop placement model did not account for the outgoing opaque panel or route-specific viewport-edge pressure. Perceived face softness came from the combined source aspect, font-readiness, UV, filtering, color-space, tone-mapping, bloom, projection, and DPR path rather than texture dimensions alone. Finally, departure mostly reduced opacity in place, which produced the reported slide-transition effect instead of a physical roadside pass.

The controller now consumes a navigator request exactly once through a monotonic navigation epoch and canonical destination. Start is ineligible; navigator Profile through Contact are eligible. Another click on the same already-active destination is idempotent, including after the first lifecycle completes. A different destination may replace a concealed label immediately or become the sole pending label behind a readable sign; returning to the visible target cancels the obsolete pending label. If a passive portrait sign is already readable when its matching navigator link is activated, the same object is promoted to the safe navigator pose over 320ms—without a redraw, replay, or teleport. Initial positioning, direct fragments, history restoration, skip links, the non-navigator Explore shortcut, Static, reduced motion, and hidden-document reset remain sign-suppressed; the next passive traversal is re-armed where appropriate.

Passive candidacy requires enabled motion, forward document direction, positive input, and the canonical upcoming route. The trigger maxima are 0.55vh for wide layouts, 0.23vh for portrait, and 0.38vh for short landscape; an actual boundary crossing wins and reconciles directly to the route reached. A qualifying reverse retreat beyond the trigger plus 0.20vh starts a new traversal and re-arms that route and every later route. Visible/cooldown state carries the traversal generation, preventing stale completion or same-label cooldown races. The clock contract is 300ms anticipate, 650–900ms approach, at least 1,400ms dwell measured from the first actual readable sample, 700ms pass-by departure, and 350ms cooldown. Delayed frames cannot skip dwell, stopping input cannot freeze a live sign, reverse input cannot move it physically backward, and a visible label never mutates.

The final route corridors are Profile left, Experience right, Infrastructure outer-right with a route-owned 1.6-world-unit inward dwell bias, Selected builds right, Additional work outer-left, Toolkit outer-left, and Contact outer-right. Projection assertions cover all seven passive transitions and require the complete dwell face to stay at least 8px inside the viewport, 16px outside visible opaque content, and 8px outside fixed controls. The responsive renderer—not stale lifecycle metadata—owns the current wide/tall/short pose. Visible resize and passive-to-navigator changes share one bounded pose transition and do not revive, duplicate, or strand the object.

The refined sign remains stable Three.js-owned geometry: one clipped/beveled housing, inset face panel, backplate, rear rails, paired narrow posts and braces, fasteners, and planted footings. It uses 20 renderable parts, 13 geometries, 7 materials, and one texture. The 4:1 face is a 2048×512 sRGB canvas texture with premultiplied alpha, trilinear mipmaps, linear magnification, up to 8× supported anisotropy, awaited Geist Mono fonts, and a non-tone-mapped face material. It redraws/uploads only when a concealed label changes. Recorded source headroom ranged from 6.06 to 13.54 texels per rendered face pixel across 390×844/DPR 3 Low through 2560×1440 High, and every recorded draw reported fontReadyWhenDrawn: true.

The new departure keeps constant world scale and moves the planted sign toward the chase camera while sweeping it out through its authored roadside edge. At 1440×900 the Profile face grew in projection from 211.09px at dwell to 410.98px at progress 0.500 while remaining fully opaque and moving left from 402.91px to 71.74px. At progress 0.643 it was already crossing the edge (left −342.88px, width 675.49px) before the restrained opacity falloff began at 0.920. The result reads as the car overtaking a fixed roadside object rather than a card fading in place.

Fresh verification on 2026-09-03 passed type checking, the production preview build, all 43 unit files / 566 tests, and the focused sign/navigation/world set (4 files / 117 tests). The first complete four-worker browser matrix completed 189 passes and 48 intentional project skips; its sole failure was the 1440×900 Toolkit→Contact safety-margin sample under parallel load. A second frozen repeat completed 188 passes and the same 48 skips: the seven-transition assertion passed that time, while a different responsive sign sample timed out during page.evaluate and an unrelated hydration test sampled the transient Motion: preparing label. The exact unchanged seven-transition test passed with one worker in 39.9s, the responsive sign and navigator-promotion checks passed unchanged with one worker in 16.8s and 4.5s, and the hydration check passed unchanged alone in 1.8s. These are retained as observed load-only matrix flakes rather than hidden by timeout or assertion changes. The authenticated High-tier allocation gate passed at a renderer ratio of 1.5 with 5,608,790 texture bytes, 755,916 geometry bytes, 161,344,784 render-target bytes, a 33,554,432-byte runtime allowance, and 201,263,922 total accounted bytes. The transfer gate passed with 80,974 bytes of initial application JavaScript and 223,856 bytes for the first live scene; it reported no violations. The saved console capture contains no browser errors.

Two pre-existing harness limitations remain explicit. Deployment verification passed 7/9 tests; both failures stop at the repository's expired execution-security-evidence timestamp before portfolio behavior is exercised. The long-drive performance harness did not produce a valid trace: desktop exhausted its fixed 75s timeout while resolving the visible Toolkit navigation target, and mobile stayed in scene loading until the five-second live-scene deadline selected the static fallback. No performance number is inferred from either invalid run, and no timeout, lifecycle assertion, or budget was weakened.

No additional Blender asset was justified. The finite authored car remains Blender-owned and unchanged. Dynamic sign text, candidacy, lifecycle, responsive placement, road, terrain, atmosphere, sun, camera, and motion remain Three.js-owned.

Experience corridor and medium-width navigator follow-up

The 2026-09-03 screenshot follow-up corrected two projection defects found after the sign-passing merge. Experience had regressed to the left corridor and was rendered underneath its left-side card. It now owns the right corridor. The passive Profile-to-Experience transition uses stable lower/nearer wide and short-landscape poses because its outgoing right Profile panel and incoming left Experience panel can be visible simultaneously; the 1440×900 dwell face measured 1032.44–1276.55 × 556.44–619.16px, leaving 20.16px to the outgoing panel and 61.12px to the incoming panel. A complete browser run found a separate 3px graze at 844×390. The corrected production-camera frame measured 640.50–780.92 × 231.91–266.39px, leaving 37.50px below Profile and 100.36px right of Experience; a dedicated browser regression now exercises that exact transition without weakening the 16px content margin or lifecycle timing.

Tall navigator signs had also retained the 390px phone pose throughout the entire portrait family, leaving the 692×793 face only 88.68px wide. The phone pose is now preserved through 480px, then its scale and mounting height interpolate smoothly to a capped medium pose at 720px. At 692×793 the Profile face measured 147.82px wide at 151.56–299.37 × 538.49–579.23px, with 20.12px below Profile and 35.15px above Experience. Browser assertions cover both the projected size and 16px content separation. The correction adds no new render resources or visible-phase texture work. Durable before/after captures and exact measurements are indexed in sign-corridor-followup/README.md.

Direction review checklist

  • Information uses near-black opaque panels rather than neon glass.
  • Cyan and amber remain accents; content does not use glow or scanlines.
  • Scene stays decorative and excluded from the accessibility tree.
  • Clip-space sky and horizon banks cover portrait through ultrawide at both 66° and 79° FOV without a finite-plane seam.
  • Road, terrain, anchors, and streaks consume one monotonically advancing travel phase and continue through reverse document input and coast.
  • Road flow, camera, streaks, bloom, and suspension use independent persistent response curves and settle through a visible coast.
  • Readable stale signs preserve their clock-driven dwell and depart from their live pose; concealed candidates may retarget; multi-section jumps do not queue or mutate stale labels.
  • The desktop road corridor and alternating panels preserve the chase composition.
  • Mobile becomes a readable single column and keeps the world subordinate.
  • The original car is Blender-authored; the infinite road/world remain procedural Three.js and are not AI-generated project artwork.
  • Systems and software each receive primary evidence sections.
  • The infrastructure flow exposes a visible legend and a complete text equivalent.
  • The GPU budget accounts for composer and bloom render targets without changing ownership or disposal.
  • Contact remains a clear destination with email as the primary action.
  • Only approved project/social derivatives are published; the manifest and compiled asset closure match exactly, and rights-unconfirmed media remains omitted.

The checked items above describe code/invariant inspection, not unsupported human audience approval.

Manual/platform review

  • Inspect the generated current-Chromium captures at 100% scale for text collisions, clipping, accidental tangencies, and scene/content contrast.
  • Repeat in current Firefox, desktop Safari/WebKit, and Edge.
  • Repeat the named current/previous-stable browser matrix available to release CI.
  • Inspect portrait and landscape on the physical iPhone 13 and Pixel 6, including browser chrome and safe areas.
  • Execute NVDA+Firefox and VoiceOver+Safari scripts recorded in the accessibility documents.
  • Bind and inspect the approved project/social derivatives against their exact manifest records, captions, and text alternatives.
  • Complete the three-person audience record in docs/reviews/audience-validation.md.

No unavailable platform or human checkpoint is silently converted into a pass.