# Lane B — progress log

## 2026-07-16 · Round 1 — flight + first blood, on the stub

Built the whole Lane B round-1 slice against `?stub=1`: `flight/{tuning,input,player,ship,emissive}.js`
and `combat/{balance,weapons,enemies,index}.js`. Round-1 asks 1–4 all landed; arena/6DOF deferred to
round 2 as instructed.

**Shipped**
- Tube controller in spline space `(s, x, y)`: flow-locked forward motion, throttle as a spring-back
  lean, boost + i-frames, banking chase cam on the parallel-transport frame, arcade wall response
  (shove + graze damage, never a hard stop).
- Twin-stick input (WASD/left-stick = disc, mouse/right-stick = aim, Shift/Ctrl = throttle), gamepad
  supported. Throttle deliberately not on WASD.
- Lysozyme cannon (pooled, instanced, heat-limited with hysteresis lockout) + antacid torpedo emitting
  `level:neutralize`. Enemy framework + floater/seeker/turret + turn-rate-limited homing darts.
- Coat/hull model and the full bus surface E builds against.

**Measured** (deterministic fixed-timestep stepper): flow-lock exact (3 s at flow 14 → s=44.0);
boost peak 30.8 u/s; heat cycle 4 s fire → 2 s lockout; wall slam 13.3 coat at 11.3 u/s impact with
forward speed untouched; **10 combat draws at 55 live enemies** (budget ≤80); ~5.7k combat tris;
0.10 ms/frame CPU; **0 leaks** across 20 create→dispose cycles. fps deliberately not claimed — rAF
doesn't run in the automated pane. Evidence in `docs/shots/laneB/`.

**Findings escalated** (detail in LANE_B_NOTES):
1. **`tools/qa.sh` gate #1 never checks anything** — `node --check` silently exits 0 on ESM. I shipped
   a real SyntaxError past a GREEN qa. Fix + verification handed to F.
2. **Surf is structurally broken** — the peristalsis wave (13.64 u/s) is slower than the player
   (19.6 u/s), so level 2's signature mechanic is a trap: riding a crest loses to mashing throttle.
   Not tunable from my lane (measured: identical ~3.0 u gained at gain 0.4/0.75/1.2). Escalated to
   A/F with two options and a request for `biome.waveSpeed`.
3. **Custom ShaderMaterials need `#include <colorspace_fragment>`** — without it ART_BIBLE's hostile
   amber `#ff5a2a` reaches the display as rgb(255,26,6). Fixed in mine; F's stub and A's walls inherit it.
4. `flowPulse` missing from the TECH contract; nobody owns the `level:event` emitter; `world.sample()`
   allocates on the hot path; `player:state`/`combat:state` bus additions needed for E's HUD.

**Blocked on nothing.** Built entirely against the stub per instructions; boot.js still has no player
wiring (F's file), so `web/js/flight/dev.html` is a dev harness that boots stub+player+combat. It
retires the moment F pastes the snippet in NOTES §→ Lane F #1.
