# 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 `** — 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.