scene.environment was null for seven rounds. diffuse = albedo * (1 - metalness),
so a metal is nothing but reflected surroundings — and 13 of the 27 shipped GLB
materials are metallicFactor >= 0.8 (16 at >= 0.5, 21 with no MR texture). Round
6's GLB_EMISSIVE_FLOOR = 0.42 was cosmetics over a lighting hole.
- env.ts (new): procedural 128x64 half-float equirect through PMREMGenerator.
Zero bytes shipped, no asset fetch. Dark industrial room per codex 8; key/fill
blob directions passed in from index.ts's real lights, never duplicated.
- GLB materials take envMap explicitly (three overrides material.envMapIntensity
with scene.environmentIntensity on the scene-fallback path), so the assets can
be dosed at 2.6 while six rounds of hand-tuned world art keep 0.5.
- emissive floor 0.42 -> 0.18: re-tuned, not retired. Still the "never a hole"
guarantee and still what carries a machine through a brownout.
- registry.init no longer awaits probeAll: renderer.init 284ms -> 28ms, ready at
339ms -> 88ms. Placement juice suppressed on asset-version bumps so the factory
doesn't re-place itself a second into every boot; a def change still pops.
- era.ts: eraIndex now breaks a contested unlock FIRST-tech-wins, matching
LANE-UI's indexTech. It was LAST-tech-wins despite round 4's NOTES claiming
otherwise; the tests found it.
- registry.test.ts (new): 31 tests, this lane's first. 481 -> 512 repo tests.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>