# Lane A — progress log

## 2026-07-16 · Round 1 — the canal, v0

Built `web/js/world/`: spline + parallel-transport frames + arclength LUTs, chunked streaming
tube, synthetic-scanner wall shader with vertex peristalsis, biome registry, arena shells v0,
noclip flycam, headless selfcheck, dev harness. Contract per TECH.md §THE WORLD CONTRACT,
drop-in for the stub.

**The game boots it.** `/?dbg=1` (no `?stub`) runs Lane A's world on C's `L2_esophagus`,
3600 units, hash `cefc4f83`, zero console errors. C's registry landing mid-round is what
unblocked `boot.js`'s `pickWorld()`; no shell change was needed.

Measured (dev.html, C's real L2 + D's real pack, 1920×1080, `renderer.info`):
draws **8** worst-frame over a full-canal sweep (budget ≤150) · tris **74,420** (≤500k) ·
geometries 6 → 6 across a full sweep and back, **no leak**, 0 after `dispose()` ·
load **<120 ms** (<2 s) · pinch ratio L2 3.32 / L3 1.89 (>1.5). fps deliberately **not**
claimed — the screenshot pane runs tabs hidden, which pauses rAF, and `gl.finish()` didn't
sync; needs a real window. Determinism: node and browser agree on the hash.

Three defects the checks caught that eyeballing would not have:
- **Tube folded through itself** on a wide+curvy join (turn radius 9.9 vs tube radius 17.2).
  Root cause: centreline amplitude authored in units. Fixed by solving amplitudes from a
  curvature budget, so `curviness` means "fraction of the pinch limit" and C can't author one.
- **Arena at 720 tris** — three's polyhedron `detail` is `20*(detail+1)^2`, not `20*4^detail`.
  Now solved for ~3u spacing from the arena's own radius.
- **Acid sea rendered as a black rectangle** — biome fog is tuned for 100u corridors, C's arena
  is 360u across. Arena fog is now sized to the room.

Also caught, and both would have rotted silently: the browser served a **stale cached
`biomes.js`**, so the first evidence set was shot at the old wave amplitude (re-shot); and D's
texture keys (`wall_smallint_a`) don't match my biome ids (`small_intestine`), which under the
assets-optional law fails to procedural forever with no error (slug map added, standardisation
proposed to D).

Decisions: peristalsis phase `K(s) = ∫k ds` with `k = OMEGA/flow(s)` ⇒ crest speed == local flow
(so "surf the crest" == "ride the current") · esophagus wave amp 0.9 → 1.4, measured, moves
`wallRho` for B · chunk seams align to biome joins, arenas own their span · one uv attribute,
tiling derived in-shader · colorspace left matching the stub, F to rule.

Evidence → `docs/shots/laneA/`: `round1_real_game_boot` (boot.js running Lane A's world),
`round1_L2_textured` / `round1_L2_procedural_fallback` (same pose, with and without D's pack —
the assets-optional law), `round1_L2_curve`, `round1_L2_wave_crest`, `round1_L3_arena_acid_sea`.

Open for round 2: triplanar arena shells + acid plane, villi band, normal/matcap TBN, sphincter
seam geometry. Full detail + per-lane asks in `LANE_A_NOTES.md`.
