# LANE A — World (canal geometry, biome shaders, arenas)

Mission: the alimentary canal itself — a living, pulsing, deterministic tube-world that
implements THE WORLD CONTRACT (TECH.md) exactly, looks like the ART_BIBLE, and stays inside
the perf budget. You own `web/js/world/**` and nothing else.

## Core design (settled)

- **Centreline spline** per level, generated from C's level JSON (`segments[].curviness`,
  seeded via `core/rng.js`): sum of seeded low-frequency sine/fbm offsets along the main
  axis — smooth, no self-intersection, byte-identical per seed. Arclength-parameterized
  lookup table (s → t) so `sample(s)` is O(1)-ish.
- **Parallel-transport frames** (not Frenet — Frenet flips on inflections and will make B's
  camera roll-snap; this is the classic tube-racer bug, don't ship it).
- **Tube chunks:** extruded rings, ~2 rings/unit × 64–96 radial segs, chunked every ~40
  units; stream a window of chunks around `playerS` (build/dispose, leak-clean). Bake
  `(s, θ)` into UV2 for the shader.
- **Radius law:** `radius(s) = base · (1 + wobble·fbm(s))`, plus per-biome features (villi
  band in small intestine as InstancedMesh cones on the wall — instanced, one draw).
- **Wall shader** (ShaderMaterial, ART_BIBLE recipe): biome tint × detail texture
  (luminance, from D via `assets.get`, flat-tint fallback) + fresnel rim + fog-to-void.
  **Peristalsis in the vertex shader:** `disp = A·max(0, sin(k·s − ω·t))³` traveling wave +
  small fbm breathing, along inward normal. Export the *same* phase function to JS
  (`world.flowPulse(s, t)`) so B can boost players riding a wave crest and E can pulse audio.
- **Arenas:** displaced icospheres (seeded fbm) with the same wall shader; `arenaAt` gives
  B the 6DOF clamp bounds. Stomach arena has an "acid level" plane (animated, emissive
  `#c8ff3a`) whose height C's events can move.
- **Collision truth:** `wallRho(s,θ)` = geometric radius − max displacement amplitude −
  skin margin. `collide()` for arena mode + hazards. Cheap, analytic, no physics lib.

## You owe others

- The world contract, frozen after round-1 sign-off (changes after that: propose in NOTES,
  F referees). `world.hash()` golden determinism hash + a qa selfcheck.
- `?fly=1` noclip camera so everyone can inspect your work without Lane B.
- `js/world/biomes.js` — the palette/params registry (values from ART_BIBLE; C's JSON
  references biomes by id).

## You consume

C's level JSON (schema TECH.md), D's textures via `assets.get` (never hard-require),
F's `core/{rng,bus,flags}.js`, stub as reference implementation of the contract.

## Laws

Determinism (no Math.random, no Date.now in geometry paths — shader time comes from
`world.update(dt)` accumulation). Perf: tube worst-view ≤150 draws (leave headroom for B/E).
Dispose-clean streaming (renderer.info deltas cited in NOTES). Screenshot evidence every
round (`docs/shots/laneA/`), each biome as it lands.
