guts/docs/progress/b-progress.md
jing 0a038582a7 [lane B] Round 1: flight controller, cannon, enemy framework on the stub
Flight (js/flight/): tube-mode 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 moves the ship in the disc,
mouse/right-stick aims, Shift/Ctrl is throttle. Gamepad supported.

Combat (js/combat/): lysozyme cannon (pooled, instanced, heat-limited with
hysteresis lockout) + antacid torpedo emitting level:neutralize. Enemy framework
with floater/seeker/turret and turn-rate-limited homing darts, spawned from C's
level:event. Coat/hull model and the full bus surface E builds against.

Measured (deterministic stepper): flow-lock exact (3s at flow 14 -> s=44.0);
boost peak 30.8 u/s; heat 4s fire -> 2s lockout; wall slam 13.3 coat at 11.3 u/s
with forward speed untouched; 10 combat draws at 55 live enemies (budget <=80);
0.10 ms/frame CPU; 0 leaks over 20 create/dispose cycles. fps NOT claimed — rAF
does not run in the automated pane. Evidence: docs/shots/laneB/.

Three findings escalated in LANE_B_NOTES:
- qa.sh gate #1 is a no-op: node --check silently exits 0 on ESM, so the syntax
  gate has never checked anything. I shipped a real SyntaxError past a GREEN qa.
  Fix + verification handed to F.
- 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 loses to mashing
  throttle. Not tunable from this lane; escalated to A/F with options.
- Custom ShaderMaterials need #include <colorspace_fragment>, else ART_BIBLE's
  hostile amber reaches the display as rgb(255,26,6). Fixed here; stub/walls
  inherit it.

js/flight/dev.html is a dev harness (boot.js has no player wiring yet); it
retires once F pastes the snippet in LANE_B_NOTES.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 08:56:32 +10:00

2.7 KiB
Raw Blame History

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 14 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 anythingnode --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.