guts/docs/progress/f-progress.md
jing 29cca53675 [lane F] Mid-round-2 recovery: the glue that makes L2 a game
All round-2 lane sessions were cut off 15:08-15:16 before NOTES/commits; the three prior
commits preserve their work verbatim. This commit is the wiring B was cut off inside of,
plus the run-state boot owes per ruling #4:

- combat/index.js: fiction-id -> archetype resolve via C's getEnemy() (the round's declared
  ONE blocker), theta-array + spread fan-out for group spawns, hazards + pickups constructed
  and updated (order: enemies -> weapons -> hazards -> pickups, so a torpedo can neutralize
  a surge the frame it detonates), pickup score/samples onto the combat:state scoreboard,
  combat.reset(fromS) for respawn.
- flight/player.js: kill/shove/refill — the API B's new modules call; kill ignores iframes
  by design (boost-dodging through C's lethal acid wall is not a read). Deleted the
  crestSpeed fallback guard per its own comment — A's law landed.
- boot.js: run state. checkpoint crossed -> remembered; death -> 2s -> respawn at it +
  combat.reset() re-arms hazard timelines (pump deliberately does NOT rewind: no
  double-spawns, collected stays collected); gate -> level:complete {stats, par} for E's
  medal card. Exported step(dt) so the stepped-sim harness drives the REAL loop.
- ROUND2_INSTRUCTIONS: MID-ROUND STATUS box for the resuming lanes; f-progress entry.

Verified (deterministic stepped sim via boot.step, :8140): full L2 run fires all 47 events
with ZERO console warns (was: 11 spawn no-ops), all 5 hazard telegraphs, 2400 proximity
ticks, 14 pickups collected, finish 157s vs par 180 while surfing 94s of it. Death path:
throttle 0.7 into the finale -> killed by acid s=3386 -> respawn at Cardia Approach 2980 ->
surge re-arms -> second attempt escapes -> level:complete {deaths: 1}. Survivable AND
losable. Evidence: docs/shots/laneF/round2_L2_integrated_full_run.png. qa.sh GREEN.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:39:44 +10:00

75 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Lane F (Fable) — progress
## 2026-07-16 (evening) — Mid-round-2 recovery: cut-off triage + the glue that makes L2 a game
All round-2 lane sessions (A/B/C + one more that left no files) were cut off 15:0815:16,
mid-work, before NOTES/progress/commits. Reviewed the orphaned tree file by file, verified it
(qa GREEN, both selfchecks, 60s stepped sim clean), then committed each lane's work path-scoped
on their behalf: A `f0982e7` (crest law, taper, schema-v2 wave, TBN walls — essentially done),
B `4ed3433` (surf speed-lock + hazards/pickups modules — written but UNWIRED), C `2e85ec0`
(schema v2, par retune, chase analysis, --probe — done). Details in each commit message.
Then landed the integration glue as F (B's unfinished wiring was the round's critical path):
fiction-id → archetype resolve via C's `getEnemy()` + theta-array/spread fan-out
(combat/index.js), hazards + pickups constructed and updated there too, `player.kill/shove/
refill` (the API B's new modules call — it didn't exist), boot run-state (checkpoint → death →
2s → respawn at last checkpoint + `combat.reset()` re-arms hazard timelines; gate →
`level:complete {stats, par}`), deleted B's crestSpeed fallback guard (A landed the real one),
and exported `boot.step(dt)` so the stepped-sim harness drives the REAL loop, pump included.
Verified on :8140, deterministic stepped sim through boot.step:
- Full run at throttle 1.38: **all 47 L2 events fire, 0 console warns** (the round-2 blocker
— 11 spawn no-ops — is gone), all 5 hazard telegraphs, 2400 hazard:proximity ticks,
14 pickups collected, gate → level:complete {time 157s vs par 180, score 2650, kills 15}.
- Death path: dawdle at 0.7 into the finale → killed by acid at s=3386 → respawns at
checkpoint 2980 (Cardia Approach, exactly as C authored) → surge re-arms → second attempt
escapes → level:complete {deaths: 1}. **L2 is survivable AND losable.**
Evidence: docs/shots/laneF/round2_L2_integrated_full_run.png (posted via the 8143 sink).
Still open for the resumed lanes: see ROUND2_INSTRUCTIONS §MID-ROUND STATUS. Port note:
8143 (laneF sink) and 8144 (laneA sink) are still held by the cut-off sessions' processes.
## 2026-07-16 — Round 1 review + integration (round 2 opened)
Reviewed all four lanes; every checked claim held (A's hash cefc4f83 + 8-draw sweep, B's
node --check ESM no-op — reproduced, C's 3/3 selfcheck + sim, D's manifest + seam numbers).
Integrated (this commit): B's player/combat wiring + level-event pump into boot.js · D's
assets into boot + world · C's ?stub=1&lvl= composition · qa.sh ESM-gate fix (was a no-op
on every module in the repo) + spline selfcheck gate · TECH world contract FROZEN v1.1
(project hint, flowPulse, crestSpeed, hash, dispose, level) + bus ratifications
(player:state, combat:state, player:surf, hazard:warn, hazard:proximity, level:neutralize)
+ assets.texture/audioUrl/audio promotion + Shader-law (colorspace) + crest-speed law
(CREST_FACTOR 1.6, from B's surf finding) · stub: crestSpeed + CREST wave + colorspace.
Verified integrated build (guts-f server, :8141): default boot = A world + C L2 + D pack +
B ship. 60 sim-seconds stepped (rAF is paused in the hidden pane — deterministic dt loop
via the boot module exports instead): s→777, checkpoints+pickups fired, 9 draws / 61k tris,
0 console errors, 0 asset misses. ONE gap: all 11 spawns no-op on fiction ids ("unknown
enemy type bolus_chunk") — exactly C's predicted → B item; top of B's round 2.
Evidence: docs/shots/laneF/round1_integrated_s777.png. fps/feel still needs John (checklist
in ROUND2 §John).
shot_sink usage that works from the pane: `python3 pipeline/shot_sink.py --dir
docs/shots/laneF --port 8143` then POST canvas blob (DBG.shot download no-ops, as A warned).
## 2026-07-16 — Round 0: scaffold
Repo initialized from empty. Landed:
- Full doc set: README, PROCESS (lane/round law, inherited from PROCITY), GDD v1 (movement
= flow-locked hybrid; 5 levels + secret; enemy roster; bosses), TECH (world contract,
level schema v0, bus events, manifest contract, flags, budgets), ART_BIBLE (synthetic
scanner look, palettes, emissive code, FLUX prompt kit), PIPELINE (MODELBEAST operator
map — verified live on m3ultra@100.89.131.57 2026-07-16: flux_local, mflux_image_edit,
sf3d, trellis_mac, seedvr2_upscale; fal.ai gated fallback), V2_IDEAS.
- Lane charters AF + ROUND1_INSTRUCTIONS.
- Seed code: index.html shell + boot.js (world pick w/ stub fallback, drift/fly debug cam,
window.DBG, resize/loop), core/{rng,bus,flags}.js, stub/world_stub.js (executable world
contract: analytic centreline, parallel-transport-style frames, inward tube mesh with
peristalsis vertex shader + fresnel rim + fog, project/collide/wallRho/hash).
- three r175 vendored from PROCITY (module + core + addons).
- tools/qa.sh: node --check, Math.random grep, level JSON checks, selfcheck/manifest hooks,
vendor gate.
Verification: qa.sh GREEN; booted `?stub=1&dbg=1` in browser — see docs/shots/laneF/.