fix: make nightdrive signage reliable and legible

This commit is contained in:
2026-09-03 02:34:15 +03:00
parent a03d4d8dba
commit cce018d3cb
39 changed files with 4635 additions and 196 deletions

View File

@@ -0,0 +1,88 @@
# Nightdrive sign reliability and legibility evidence
Status date: 2026-09-03
This directory records the bounded Three.js roadside-sign pass. The portfolio content, panels, navigation, HUD, controls, car, road, terrain, sun, atmosphere, camera, and forward-travel direction were not redesigned.
## Shared causes found
The supplied Profile failure was not one isolated coordinate defect:
1. The former candidate gate discarded large deltas and multi-boundary samples before lifecycle reconciliation. Slow threshold crossings and rapid arrival therefore followed different paths, and the latter could skip the relevant destination.
2. Dwell time was derived from the original latch time. A delayed frame could consume the readable interval before the first dwell frame, while no further input could leave another sign frozen indefinitely.
3. Every desktop label inherited one right-side pose. Profile therefore competed directly with its right-side content card, while one immediate responsive remap could move a live sign to a different pose family.
4. The 1024×288 source was stretched onto a 3.93:1 face, could be drawn before the intended font was ready, and was small enough relative to the projected dwell face to look soft after perspective, mip selection, and post-processing.
5. The former departure could advance toward and through the camera plane. A late departure frame consequently expanded instead of receding.
6. A scene rebuild copied the lifecycle fields but omitted the latched responsive profile, so a quality/resize rebuild could silently replace a live composition.
## Canonical route contract
Only forward `passive-scroll` samples with motion enabled are eligible. The opening route is deliberately ineligible. A normal sample selects the next route once its heading is within 0.55 viewport heights of the activation line. A sample that crosses a section boundary selects the eligible section actually reached. Large and multi-section jumps coalesce to that latest relevant destination rather than queueing intermediate labels.
| Route target | Face label | Marker | Corridor | Trigger | Dwell placement intent |
| --- | --- | --- | --- | --- | --- |
| `start` | Start | 01 | none | ineligible | no sign |
| `profile` | Profile | 02 | left | ≤0.55vh or actual arrival | opposite the right Profile card |
| `experience` | Experience | 03 | right | ≤0.55vh or actual arrival | opposite the left Career card |
| `infrastructure` | Infrastructure | 04 | outer-right | ≤0.55vh or actual arrival | outside the broad systems content corridor |
| `selected-builds` | Selected builds | 05 | outer-right | ≤0.55vh or actual arrival | outside the projects content corridor |
| `additional-work` | Additional work | 06 | left | ≤0.55vh or actual arrival | away from the dominant content surface |
| `toolkit` | Toolkit | 07 | outer-left | ≤0.55vh or actual arrival | outside the toolkit content corridor |
| `contact` | Contact | 08 | right | ≤0.55vh or actual arrival | opposite the Contact destination content |
The controller owns exactly one visible target. A concealed sign can retarget immediately. A visible label is immutable; a newer candidate is coalesced as the pending target. Completed targets are suppressed for the current journey so small oscillations cannot spam them. A stale readable target completes its minimum dwell before departing. Initialization, explicit navigation (including skip links and direct fragments), history restoration, Static mode, and reduced motion remain intentionally suppressed. Visibility loss resets transient lifecycle state.
## Lifecycle contract
| Phase | Duration | Behavior |
| --- | ---: | --- |
| Anticipate | 300ms | target/profile latch; sign remains concealed at its horizon pose |
| Approach | 900ms, reduced by at most 250ms with acceleration | elapsed-time interpolation from horizon to dwell; opacity reaches full early in approach |
| Dwell | at least 1,400ms from the first actual dwell sample | fixed readable pose; reverse/passed/stale input cannot shorten the minimum |
| Depart | 700ms | exits laterally and recedes 32 world units; never reverses through the car or crosses the camera |
| Cooldown | 350ms | prevents immediate replay; retains only the latest valid pending target |
The controller continues sampling without input while a sign is live, so release cannot freeze it. A delayed first dwell frame starts the dwell clock at that observed frame rather than skipping readability. Resize/orientation and scene-quality rebuilds preserve the latched `wide`, `tall`, or `short` profile until the lifecycle is concealed; the newly measured family applies to the next sign.
## Responsive pose and texture contract
`short` applies below 560px height in landscape, `tall` below a 1.05 aspect ratio, and `wide` otherwise. Each family has inner left/right and outer left/right roadside poses. Dwell face-width assertions are 120px at 390×844, 130px at 844×390, 150px at 768×1024, 180px at 1440×900, and 240px at 2560×1440. Every readable face must stay at least 8px inside the viewport, 16px clear of active and adjacent opaque content, and 8px clear of fixed navigation, controls, and HUD.
The face is an exact 4:1 plane backed by a 2048×512 4:1 canvas. It uses sRGB, trilinear mipmaps, linear magnification, up to 8× renderer-supported anisotropy, and a non-tone-mapped face material. The bundled Geist Mono marker and label weights are awaited before the first draw. A target change redraws only while concealed; there is no per-frame canvas redraw or texture replacement. The housing, clipped bevel, backplate, bracket, brace, narrow post, and dynamically compensated footing remain stable render-owned Three.js objects.
## Measured browser matrix
All recorded dwell frames reported a 2048×512 texture, 8× anisotropy, and `fontReadyWhenDrawn: true`.
| Scenario | CSS face width | Renderer ratio | Source texels per rendered face pixel | Content separation |
| --- | ---: | ---: | ---: | --- |
| 390×844 portrait, device DPR 3 / High | 150.64px | 1.25 | 10.87 | pass |
| 844×390 short landscape, DPR 1 / High | 134.49px | 1 | 15.23 | active + adjacent pass |
| 768×1024 tablet, DPR 1 / High | 182.76px | 1 | 11.21 | pass |
| 1440×900 desktop, DPR 1 / High | 195.05px | 1 | 10.50 | pass |
| 1440×900 desktop, device DPR 2 / High | 195.06px | 1.5 | 7.00 | pass |
| 1440×900 desktop, DPR 1 / Low | 195.06px | 1 | 10.50 | pass |
| 2560×1440 ultrawide, DPR 1 / High | 312.09px | 1 | 6.56 | pass |
The ratios above divide the 2,048 source texels by CSS face width × renderer ratio. They describe source sampling headroom; they are not an invented GPU-inspector measurement.
## Evidence index
- Before: [`before/profile-overlap-1280x720-dpr1.25.png`](before/profile-overlap-1280x720-dpr1.25.png)
- Desktop Profile/right-card separation: [`after/profile-desktop-1440x900-dpr1-high.png`](after/profile-desktop-1440x900-dpr1-high.png)
- Desktop Experience/left-card separation: [`after/experience-desktop-1440x900-dpr1-high.png`](after/experience-desktop-1440x900-dpr1-high.png)
- Responsive: [`after/profile-portrait-390x844-dpr3-high.png`](after/profile-portrait-390x844-dpr3-high.png), [`after/profile-short-844x390-dpr1-high.png`](after/profile-short-844x390-dpr1-high.png), [`after/profile-tablet-768x1024-dpr1-high.png`](after/profile-tablet-768x1024-dpr1-high.png), [`after/profile-ultrawide-2560x1440-dpr1-high.png`](after/profile-ultrawide-2560x1440-dpr1-high.png)
- DPR/quality: [`after/profile-desktop-1440x900-dpr2-high.png`](after/profile-desktop-1440x900-dpr2-high.png), [`after/profile-desktop-1440x900-dpr1-low-quality.png`](after/profile-desktop-1440x900-dpr1-low-quality.png), [`after/profile-desktop-1440x900-dpr1-high-quality.png`](after/profile-desktop-1440x900-dpr1-high-quality.png)
- Lifecycle: [`lifecycle/profile-anticipate.png`](lifecycle/profile-anticipate.png), [`lifecycle/profile-approach.png`](lifecycle/profile-approach.png), [`lifecycle/profile-dwell.png`](lifecycle/profile-dwell.png), [`lifecycle/profile-depart.png`](lifecycle/profile-depart.png)
- Adverse input: [`lifecycle/profile-reverse-during-approach.png`](lifecycle/profile-reverse-during-approach.png), [`lifecycle/profile-dwell-after-reverse.png`](lifecycle/profile-dwell-after-reverse.png), [`lifecycle/repeated-tiny-input-dwell.png`](lifecycle/repeated-tiny-input-dwell.png), [`lifecycle/rapid-multi-section-reconciliation.png`](lifecycle/rapid-multi-section-reconciliation.png)
- Visible resize: [`lifecycle/resize-visible-before.png`](lifecycle/resize-visible-before.png), [`lifecycle/resize-visible-after-844x390.png`](lifecycle/resize-visible-after-844x390.png)
- Suppressed modes: [`after/static-mode-1440x900.png`](after/static-mode-1440x900.png), [`after/reduced-motion-390x844-dpr3.png`](after/reduced-motion-390x844-dpr3.png)
- Machine-readable measurements: [`browser-matrix.json`](browser-matrix.json), [`lifecycle/trace.json`](lifecycle/trace.json), [`browser-console.json`](browser-console.json)
The lifecycle trace records target, phase, progress, opacity, projected face bounds, active section, direction, responsive profile, texture state, renderer ratio, reverse handling, repeated-small-input dwell, rapid multi-section reconciliation, visible resize, and the captured departure frame. Its rapid reconciliation contains only `Selected builds`; the visible Profile label never mutates.
Three.js DevTools was unavailable for the final local preview (`No Three.js app connected`), so no replacement draw-call or inspector-memory result is claimed here. Allocation and transfer impact are verified by the repository's authenticated runtime-budget and production-build harnesses instead.
## Asset ownership
No additional Blender asset was justified. The sign needs dynamic labels, route candidacy, lifecycle motion, responsive placement, and quality-tier integration; lightweight stable Three.js geometry preserves those controls without another GLB or asset transfer. The finite authored car remains Blender-owned and unchanged. Dynamic sign text and behavior, responsive placement, road, terrain, atmosphere, sun, camera, and motion remain Three.js-owned.

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 980 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 748 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 424 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

View File

@@ -0,0 +1,3 @@
{
"errors": []
}

View File

@@ -0,0 +1,461 @@
{
"generatedAt": "2026-09-02T23:06:25.825Z",
"scenarios": [
{
"name": "desktop Profile beside right panel",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 3817.9,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 416.97990319603,
"top": 421.80306615142877,
"right": 612.0313301500913,
"bottom": 469.98894347500817,
"width": 195.0514269540613,
"height": 48.185877323579405
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 777.59375,
"top": 681,
"right": 1382.390625,
"bottom": 1139.28125
},
"separatedFromPanel": true,
"screenshot": "after/profile-desktop-1440x900-dpr1-high.png"
},
{
"name": "desktop Experience beside left panel",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "experience",
"frame": {
"now": 3028.7,
"targetId": "experience",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "profile",
"direction": 0,
"visible": true,
"corridor": "right",
"viewportProfile": "wide",
"bounds": {
"left": 862.8430142691166,
"top": 422.07400076838144,
"right": 1055.992547838176,
"bottom": 469.2669788703455,
"width": 193.14953356905949,
"height": 47.19297810196406
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 57.59375,
"top": 680.28125,
"right": 719.984375,
"bottom": 1830.875
},
"separatedFromPanel": true,
"screenshot": "after/experience-desktop-1440x900-dpr1-high.png"
},
{
"name": "portrait Profile",
"viewport": {
"width": 390,
"height": 844
},
"deviceScaleFactor": 3,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 2975.5,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"viewportProfile": "tall",
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"bounds": {
"left": 45.214151854185765,
"top": 393.78359453769036,
"right": 195.85026402457592,
"bottom": 431.69356317041803,
"width": 150.63611217039016,
"height": 37.90996863272767
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1.25
},
"panel": {
"left": 16,
"top": 651,
"right": 374,
"bottom": 1187.109375
},
"separatedFromPanel": true,
"screenshot": "after/profile-portrait-390x844-dpr3-high.png"
},
{
"name": "short landscape Profile",
"viewport": {
"width": 844,
"height": 390
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 2876.2,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"viewportProfile": "short",
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"bounds": {
"left": 299.66361248256146,
"top": 191.1365135995139,
"right": 434.1535837811257,
"bottom": 225.4414949799874,
"width": 134.48997129856423,
"height": 34.30498138047349
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 303.828125,
"top": 286.03125,
"right": 810.21875,
"bottom": 700.40625
},
"adjacentPanel": {
"left": 33.75,
"top": -138,
"right": 523.265625,
"bottom": 174.03125
},
"separatedFromPanel": true,
"screenshot": "after/profile-short-844x390-dpr1-high.png"
},
{
"name": "tablet Profile",
"viewport": {
"width": 768,
"height": 1024
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 2441.6,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"viewportProfile": "tall",
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"bounds": {
"left": 202.26939254304233,
"top": 477.7671107266057,
"right": 385.03157389039734,
"bottom": 523.7621386015365,
"width": 182.762181347355,
"height": 45.99502787493083
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 276.46875,
"top": 792.828125,
"right": 737.265625,
"bottom": 1254.640625
},
"separatedFromPanel": true,
"screenshot": "after/profile-tablet-768x1024-dpr1-high.png"
},
{
"name": "ultrawide Profile",
"viewport": {
"width": 2560,
"height": 1440
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 5781.4,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 795.1606507914319,
"top": 674.7812815235544,
"right": 1107.2526954957643,
"bottom": 751.8792940365541,
"width": 312.09204470433247,
"height": 77.09801251299973
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 1382.390625,
"top": 1107,
"right": 2457.578125,
"bottom": 1510.15625
},
"separatedFromPanel": true,
"screenshot": "after/profile-ultrawide-2560x1440-dpr1-high.png"
},
{
"name": "desktop high DPR Profile",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 2,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 4315.7,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 416.97709613178563,
"top": 421.7626066451545,
"right": 612.0323349380212,
"bottom": 469.94872191078514,
"width": 195.0552388062356,
"height": 48.18611526563063
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1.5
},
"panel": {
"left": 777.59375,
"top": 681,
"right": 1382.390625,
"bottom": 1139.28125
},
"separatedFromPanel": true,
"screenshot": "after/profile-desktop-1440x900-dpr2-high.png"
},
{
"name": "desktop low quality",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 1,
"quality": "low",
"targetId": "profile",
"frame": {
"now": 2293.1,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 416.975431797155,
"top": 421.73866114795436,
"right": 612.032925818174,
"bottom": 469.92491685811837,
"width": 195.057494021019,
"height": 48.186255710164005
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 777.59375,
"top": 681,
"right": 1382.390625,
"bottom": 1139.28125
},
"separatedFromPanel": true,
"screenshot": "after/profile-desktop-1440x900-dpr1-low-quality.png"
},
{
"name": "desktop high quality",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 3370.4,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 416.9769832458706,
"top": 421.76098148986165,
"right": 612.0323751296199,
"bottom": 469.9471062962213,
"width": 195.05539188374934,
"height": 48.18612480635966
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 777.59375,
"top": 681,
"right": 1382.390625,
"bottom": 1139.28125
},
"separatedFromPanel": true,
"screenshot": "after/profile-desktop-1440x900-dpr1-high-quality.png"
},
{
"name": "resize before visible phase",
"viewport": {
"width": 1440,
"height": 900
},
"deviceScaleFactor": 1,
"quality": "high",
"targetId": "profile",
"frame": {
"now": 4038.1,
"targetId": "profile",
"phase": "dwell",
"progress": 1,
"opacity": 1,
"activeSectionId": "start",
"direction": 0,
"visible": true,
"corridor": "left",
"viewportProfile": "wide",
"bounds": {
"left": 416.9840276279932,
"top": 421.8626810680434,
"right": 612.0298349796249,
"bottom": 470.0482063315882,
"width": 195.04580735163165,
"height": 48.185525263544775
},
"texture": {
"width": 2048,
"height": 512,
"anisotropy": 8,
"fontReadyWhenDrawn": true
},
"rendererPixelRatio": 1
},
"panel": {
"left": 777.59375,
"top": 681,
"right": 1382.390625,
"bottom": 1139.28125
},
"separatedFromPanel": true,
"screenshot": "lifecycle/resize-visible-before.png"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 354 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 KiB

View File

@@ -108,6 +108,33 @@ Fresh verification produced these results:
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`](evidence/nightdrive-iteration/sign-reliability-pass/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.
## Direction review checklist
- [x] Information uses near-black opaque panels rather than neon glass.