fix: refine responsive sign placement
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
# Nightdrive sign corridor follow-up
|
||||
|
||||
Status date: 2026-09-03
|
||||
|
||||
This bounded follow-up corrects two rendered regressions without changing the portfolio content layer or the established sign lifecycle. The supplied captures showed the Experience sign under the left-side Experience card and the navigator sign at only phone-scale on a 692×793 viewport.
|
||||
|
||||
## Implemented contract
|
||||
|
||||
- Experience now owns the right roadside corridor. A wide navigator arrival uses the established right dwell pose beside the left Experience card.
|
||||
- During passive Profile-to-Experience travel, both the outgoing right Profile panel and incoming left Experience panel are visible. Stable lower/nearer right-side poses for wide and short-landscape projections keep the complete face clear of both panels instead of merely changing corridor metadata.
|
||||
- Tall navigator arrivals preserve the existing pose through 480px viewport width. From 480px to 720px, scale and mounting height interpolate with a smoothstep curve from `0.25 / y 3.0` to `0.44 / y 4.5`, then remain capped. The larger sign therefore stays in the world-visible slot between stacked content panels rather than growing underneath one.
|
||||
- Width changes use the existing 320ms responsive reflow. They do not relatch a target, redraw a visible label, duplicate a lifecycle, or allocate geometry, material, or texture resources.
|
||||
- Candidacy, navigation idempotency, 1,400ms minimum dwell, pass-by departure, phone composition, quality behavior, and motion suppression are unchanged.
|
||||
|
||||
## Measured projection
|
||||
|
||||
The authenticated browser instrumentation and an independent production-preview capture agreed on the corrected geometry. Full values are in [`measurements.json`](measurements.json).
|
||||
|
||||
| Scenario | Sign face bounds | Nearby content | Minimum measured separation |
|
||||
| --- | --- | --- | ---: |
|
||||
| 692×793 Profile navigator | 151.56–299.37 × 538.49–579.23; 147.82px wide | Profile bottom 518.38; Experience top 614.38 | 20.12px |
|
||||
| 1440×900 passive Experience | 1032.44–1276.55 × 556.44–619.16; 244.11px wide | Profile bottom 536.28; Experience top 680.28 | 20.16px |
|
||||
| 844×390 passive Experience | 640.50–780.92 × 231.91–266.39; 140.42px wide | Profile bottom 194.41; Experience right 540.14 | 37.50px vertical / 100.36px horizontal |
|
||||
|
||||
Both scenarios exceed the existing 16px opaque-content separation contract. The 692px sign was 88.68px wide before the responsive correction in the deterministic renderer test. The ≤480px branch retains the previous phone pose exactly.
|
||||
|
||||
The complete browser matrix also exposed a 3px Profile-panel graze at 844×390 after Experience moved right. The short-landscape pose was brought lower and nearer, then verified in an isolated authenticated production-camera flow at 844×390. A dedicated browser regression now covers that exact transition without depending on every earlier route in the larger sequential matrix. No safety margin, timeout, or lifecycle assertion was relaxed.
|
||||
|
||||
## Evidence
|
||||
|
||||
- Supplied Experience overlap: [`before/experience-left-overlap.png`](before/experience-left-overlap.png)
|
||||
- Supplied undersized 692×793 navigator: [`before/medium-navigator-too-small.png`](before/medium-navigator-too-small.png)
|
||||
- Corrected 692×793 Profile navigator: [`after/profile-navigator-692x793.png`](after/profile-navigator-692x793.png)
|
||||
- Corrected Experience navigator arrival: [`after/experience-navigation-right-1440x900.png`](after/experience-navigation-right-1440x900.png)
|
||||
- Corrected passive Profile-to-Experience transition: [`after/experience-passive-right-1440x900.png`](after/experience-passive-right-1440x900.png)
|
||||
- Corrected short-landscape passive transition: [`after/experience-passive-right-844x390.png`](after/experience-passive-right-844x390.png)
|
||||
|
||||
## Verification record
|
||||
|
||||
- The production gate passed type checking, 43 unit files / 567 tests, client and SSR builds, prerender validation, and transfer budgets.
|
||||
- The focused sign-controller/world run passed 79 tests in 2 files. The browser specification compiles and discovers the dedicated 692×793 and 844×390 regressions.
|
||||
- The unchanged pass-by departure browser check passed with one worker in 6.3 seconds of test time. The isolated authenticated 692×793, 1440×900, and 844×390 flows produced the measurements and full-resolution captures above with `fontReadyWhenDrawn: true`.
|
||||
- The final privileged full-matrix and authenticated-allocation launches could not start because the host approval service returned HTTP 404 before execution. A restricted retry was invalid because Chromium terminated at launch with `sandbox_host_linux ... Operation not permitted`; none of those instant launch failures are represented as portfolio failures or passes.
|
||||
- The patch creates no geometry, material, texture, render-target, or scene-graph objects. The most recent authenticated High-tier sign-system trace therefore remains the applicable allocation baseline: 5,608,790 texture bytes, 755,916 geometry bytes, 161,344,784 render-target bytes, a 33,554,432-byte allowance, and 201,263,922 total accounted bytes. The current transfer-only gate reported no violations.
|
||||
- Deployment verification remains outside this sign fix: 5/9 checks passed in the restricted run, two security-evidence checks stopped at the repository's expired evidence timestamp, and two HTTP-fixture checks could not bind localhost in the sandbox. No assertion, timeout, security timestamp, or budget was changed.
|
||||
|
||||
## Ownership
|
||||
|
||||
No Blender work or new asset was justified. The authored finite car remains Blender-owned and unchanged. Dynamic text, sign behavior, responsive placement, road, terrain, atmosphere, sun, camera, and motion remain Three.js-owned.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 343 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 337 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 89 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 973 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 563 KiB |
@@ -0,0 +1,89 @@
|
||||
{
|
||||
"schema": "portfolio-sign-corridor-followup/v1",
|
||||
"capturedAt": "2026-09-03",
|
||||
"scenarios": {
|
||||
"mediumNavigator": {
|
||||
"viewport": { "width": 692, "height": 793 },
|
||||
"targetId": "profile",
|
||||
"phase": "dwell",
|
||||
"navigationArrival": true,
|
||||
"corridor": "left",
|
||||
"bounds": {
|
||||
"left": 151.55509697462335,
|
||||
"top": 538.491415747041,
|
||||
"right": 299.37037784096344,
|
||||
"bottom": 579.225072939037,
|
||||
"width": 147.8152808663401,
|
||||
"height": 40.73365719199603
|
||||
},
|
||||
"panels": {
|
||||
"profileBottom": 518.375,
|
||||
"experienceTop": 614.375
|
||||
},
|
||||
"rendererPixelRatio": 1,
|
||||
"texture": {
|
||||
"width": 2048,
|
||||
"height": 512,
|
||||
"anisotropy": 8,
|
||||
"fontReadyWhenDrawn": true
|
||||
}
|
||||
},
|
||||
"experiencePassive": {
|
||||
"viewport": { "width": 1440, "height": 900 },
|
||||
"targetId": "experience",
|
||||
"phase": "dwell",
|
||||
"navigationArrival": false,
|
||||
"corridor": "right",
|
||||
"bounds": {
|
||||
"left": 1032.4355218074836,
|
||||
"top": 556.4392416287164,
|
||||
"right": 1276.55006451764,
|
||||
"bottom": 619.1620645151419,
|
||||
"width": 244.11454271015646,
|
||||
"height": 62.72282288642543
|
||||
},
|
||||
"panels": {
|
||||
"profileBottom": 536.28125,
|
||||
"experienceTop": 680.28125
|
||||
},
|
||||
"rendererPixelRatio": 1,
|
||||
"texture": {
|
||||
"width": 2048,
|
||||
"height": 512,
|
||||
"anisotropy": 8,
|
||||
"fontReadyWhenDrawn": true
|
||||
}
|
||||
},
|
||||
"experiencePassiveShortLandscape": {
|
||||
"viewport": { "width": 844, "height": 390 },
|
||||
"targetId": "experience",
|
||||
"activeSectionId": "profile",
|
||||
"phase": "dwell",
|
||||
"navigationArrival": false,
|
||||
"corridor": "right",
|
||||
"bounds": {
|
||||
"left": 640.4984,
|
||||
"top": 231.907,
|
||||
"right": 780.9186,
|
||||
"bottom": 266.3877,
|
||||
"width": 140.4202,
|
||||
"height": 34.4807
|
||||
},
|
||||
"panels": {
|
||||
"profileBottom": 194.4063,
|
||||
"experienceRight": 540.1406
|
||||
},
|
||||
"clearance": {
|
||||
"belowProfile": 37.5008,
|
||||
"rightOfExperience": 100.3578
|
||||
},
|
||||
"rendererPixelRatio": 1,
|
||||
"texture": {
|
||||
"width": 2048,
|
||||
"height": 512,
|
||||
"anisotropy": 8,
|
||||
"fontReadyWhenDrawn": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ Navigator buttons add one explicit sign intent to their navigation epoch. That i
|
||||
| --- | --- | ---: | --- | --- |
|
||||
| `start` | Start | 01 | none | deliberately ineligible |
|
||||
| `profile` | Profile | 02 | left | opposite the right Profile card |
|
||||
| `experience` | Experience | 03 | left | clears both the outgoing Profile card and incoming Career surface |
|
||||
| `experience` | Experience | 03 | right | navigator arrivals sit opposite the Career card; the passive Profile transition uses a lower/nearer right pose to clear both visible panels |
|
||||
| `infrastructure` | Infrastructure | 04 | outer-right | outside the broad systems-content corridor, with a route-owned 1.6-world-unit inward dwell bias to preserve the viewport edge |
|
||||
| `selected-builds` | Selected builds | 05 | right | inside the visible right roadside corridor, clear of the large left project card |
|
||||
| `additional-work` | Additional work | 06 | outer-left | outside the outgoing centered Selected builds surface |
|
||||
|
||||
Reference in New Issue
Block a user