Wired B's player/combat + event pump, D's assets, C's level pick into boot. Fixed qa ESM gate (node --check no-op, found by B) + added spline selfcheck. TECH: world contract FROZEN v1.1, bus events ratified, colorspace + crest-speed laws (CREST_FACTOR 1.6 — B proved surfing lost to throttle at 1.0). Stub complies. Verified integrated build via 60s stepped sim: 9 draws, 0 errors, 0 asset misses; one known gap (fiction-id spawn resolve) confirmed and assigned as B's top item. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
12 KiB
GUTS — Round 2 lane instructions (from Fable, integrator)
Date: 2026-07-16 · Written after reviewing all four round-1 lanes (A/B/C/D — E did not run
and joins this round) and integrating their offered wiring. Every round-1 claim I checked
held up: A's hash cefc4f83 and 8-draw sweep, B's node --check ESM no-op (reproduced on a
deliberately broken file), C's 3/3 selfcheck, D's manifest. Superb round, all of you.
Repo state (F integrated, commit this round)
The game is a game now. Default boot = A's world on C's L2_esophagus with D's textures,
B's ENDO-1 + camera + combat, level-event pump live. Verified by stepped simulation (60 sim
seconds, deterministic dt): flow carried the player to s=777, checkpoints + pickups fired,
9 draws / 52–61k tris, zero console errors, zero asset misses.
Evidence: docs/shots/laneF/round1_integrated_s777.png.
F landed since round 1: B/C/D snippets in boot.js (assets → world, player/combat wiring,
?stub=1&lvl= composing, event pump) · qa.sh ESM gate fixed (it had never checked
anything — thank you B) + A's spline selfcheck gate · TECH: world contract frozen v1.1,
bus events ratified, asset entry points ratified, colorspace + crest-speed laws · stub:
crestSpeed(), CREST factor, colorspace fix. Second dev server config guts-f on 8141
(8140 was held by another session — lanes: if 8140 is busy, use your own port and say so).
The ONE integration gap found (and it was predicted)
Stepped sim confirmed: all 11 L2 spawn events no-op with [combat] unknown enemy type "bolus_chunk"/"eosinophil_swarm"/"candida_bloom". C's fiction-id → archetype resolve
(LANE_C_NOTES → Lane B #1) is the single blocker between "it boots" and "it's a game with
enemies". B: it is your first task.
Integrator rulings (settled — argue in NOTES for round 3 if you must)
- Surf: CREST_FACTOR = 1.6. B proved crest speed == flow makes surfing strictly worse
than throttle (LANE_B_NOTES §surf). Ruling:
crestSpeed(s) = 1.6 × flow(s)(beats throttleMax 1.4), A implementsk(s) = OMEGA/(1.6·flow), B speed-locks toworld.crestSpeed(s)while riding, gameplay wave == visual wave stays law. Stub already complies — B can build now. C re-runs pacing (pars will compress; the finale's escape math changes deliberately — surfing becomes the stylish escape). - Colorspace law (TECH §Shader law): every custom shader ends
main()with#include <colorspace_fragment>. Stub done. A (wall), B (emissive) apply this round — expect a visible shift; A re-eyeballs biome tints against D's textures after. - Texture naming: D renames keys to A's biome ids early in the round and pings in NOTES; A deletes the slug map after pulling. That order, one round, done.
level:eventpump is boot's (F). Landed. B: when you build respawn, tell F what reset/replay API the pump needs (### → Lane F), don't work around it.web/dev/ratified as the shared dev-harness dir, per-file lane ownership, never shipped. D's texview stays. A:world/dev.htmlmay move there or die, your call. D'spipeline/shot_sink.pyis the house evidence tool — all lanes:python3 pipeline/shot_sink.py --dir docs/shots/lane<x> --port 8143(NOT 8140/8141), then POST the canvas.DBG.shot()'s download silently no-ops in the pane (A was right).- WebP shots ratified (B's 25 KB vs 1.9 MB argument). PNG also fine. Name the round.
- C's GDD refinements + boss specs: signed off. C folds the three boss one-pagers into GDD.md proper. Per-level pars stand. A/D treat boss specs as stable input.
- A's uv simplification (one uv attr + uTile uniform, no uv2): ratified, contract-level.
C's arena semantics + A's per-segment
waveoverride request: approved — C specssegments[].wave: { amp }into schema v2, A implementswaveMaxAtpreferring it.
Round-2 goal
L2 esophagus, playable start to finish, textured, scored, survivable and losable — every
spawn live, all three hazards real, checkpoints/death/respawn, gate → level:complete,
HUD + audio on top. Tag v0.2. (Round-3 preview: arenas — L1 tutorial + L3 acid sea + the
Pyloric Guardian.)
Lane A — contract v1.2 + the look, deepened
crestSpeed(s)+ CREST_FACTOR 1.6 (ruling #1) — small, unblocks B, do first.- Answer C's biggest dependency (LANE_C_NOTES → A #4): segment radius blending. C assumes a smooth ~40–60u taper at joins (12→9 at s 1100, 10→6.8 at 2600). Confirm or implement; a hard step reads as a level seam and breaks the constrictions.
- Per-segment
waveoverride (ruling #8) — the hiatus should be tight AND calm. - Colorspace one-liner in the wall shader (ruling #2), then re-eyeball all six biome tints
with D's textures; adjust
biomes.jsfreely (C's selfcheck re-checks live, as designed). - TBN normal maps — lift D's
perturb()fromweb/dev/laneD_texview.html(their NOTES has the exact GLSL and the trap: never add tangent-space normals to vertex normals). Wire_bvariants + matcap. This is the round's visual headline; D called it "the single biggest visual win" and their shots agree. sample(s, out)out-param variant (v1.2) — B adopts on landing.- Stomach-arena shape read for C (→ C #5): propose capsule/lobed/chained-spheres, one paragraph + sketch, before C authors the acid sea in round 3. Triplanar arena shells if time (the pole-pinch fix) — acid plane can wait for round 3 with the L3 work. Defer: villi band (no L4 level yet).
Lane B — make L2 a game (priority order is the order)
- C's three consumption fixes (LANE_C_NOTES → B #1–3, exact snippets provided):
getEnemy()resolve,thetaarrays,spread. Verify against the live L2: sim to s=800 and the console warns must be gone, bolus/eosinophil/candida all spawning. - The three L2 hazards (params in
levels/enemies.jsHAZARDS):reflux_surge(rear chaser; emithazard:proximity {kind,distance}— C's most important UI dependency),aortic_squeeze(directional — one-sided by design, keep contact non-lethal or tell C),ring_gate(timeable point gate). Emithazard:warn {kind,s,eta}from each event'swarnfield. - Checkpoint / death / respawn (≤30 s law). Define the pump reset API with F (ruling #4). Respawn never inside a hazard zone (C placed checkpoints accordingly — keep it true).
- Pickups: nutrient, mucin, B12, antacid ammo, biopsy samples (
pickupevents are in L2 already; economy numbers from C via NOTES if you need more thanlevels/enemies.js). - Gate →
level:complete {stats}with score/time/samples for E's medal card. - Surf speed-lock on
world.crestSpeed(s)(stub has it now; A lands theirs early). Re-measure: riding a crest must beat throttle-mashing by a margin worth learning. - Colorspace in
emissive.js(your own finding) — then re-shootround1_combat's hostile amber and confirm it reads amber. - Stretch only: arena 6DOF controller (round 3 needs it for L1/L3).
Your tuning.js header still cites the stale
wallRhonumbers (C flagged) — fix the comment.
Lane C — validate with a real canal
- Fly L2 on the integrated build once B's #1 lands (mid-round — watch B's NOTES). Use
F's stepped-sim technique (f-progress documents it) or the browser; replace sim numbers
with observed ones. The hiatus (s 2600–3000) is the thing to validate; your open
question #4 (
MIN_CLEARANCE 2.5) gets its answer here, alongside John's playtest. - Re-run pacing under CREST 1.6 surf (ruling #1): pars, the finale escape math, and
whether antacid-stalling is still the smart play. Adjust
parvalues with rationale. - Schema v2:
segments[].waveoverride (approved) — spec it, re-author the hiatus calm (amp ~0.6), selfcheck it. - Fold boss specs into GDD.md (signed off, ruling #7).
- L1 encounter design on paper (molar crush-cycles, saliva tides, epiglottis exam) — full authoring waits for B's arena controller in round 3, but the design doc and the skeleton→full upgrade plan land now.
- Give B the pickup economy (counts/values) as data or NOTES — B's #4 consumes it.
Lane D — heroes and the full pack
- Slug rename first (ruling #3):
wall_small_intestine_aetc., manifest + batch JSONs, ping A in NOTES same session. - Hero meshes, the round-2 headline: ENDO-1 ship,
bolus_chunk,eosinophil_swarm— concepts via flux_local (ART_BIBLE stems + C's tints inlevels/enemies.js) → concepts intodocs/shots/laneD/+ NOTES for F/C sign-off BEFORE any TRELLIS run → sf3d draft → trellis_mac → normalize (portnormalize.py+glb_stat.pyfrom PROCITY — the GLB law is unenforced until they exist) → thumbs → manifest.candida_bloomas a decal/sprite sheet (your call, ratified — C agreed). - Colon + mouth walls (2 each) + acid/decal sprites — completes the biome texture set.
- Full audio pack: E must hand you their key list by mid-round (E's #5); if it hasn't arrived, propose the keys yourself in NOTES and E adapts. Beds for all six biomes, sfx (torpedo, gate, alarm, checkpoint, death/respawn, UI ticks), 3 boss stingers, ≤10 MB law.
- Tapeworm stays a round-3 fal.ai candidate — do NOT spend on it yet; if concepts are
ready early, put it on
FAL_LIST.mdwith the concept attached for John's go.
Lane E — you have a full house waiting (round-1 charter + these specifics)
Read your charter + the → Lane E sections in B/C/D/A NOTES — all four wrote APIs for you.
- HUD from
player:state+combat:state(emitted every frame, live now): coat/hull, heat, throttle/speed/flow, boost cd, score/combo. Bus-only, no imports from B. - Gut-map v1 (the signature):
listLevels()/getLevel()inlevels/index.jsgive you names/lengths/pars; L2 has 7 named segments + 10 checkpoints authored for exactly this. - Rear-proximity indicator for
hazard:proximity+ telegraph pings forhazard:warn— C calls this the single most important UI request (the surge chases from behind). - Title (over
?fly=1-style drift) · pause · medal card onlevel:complete(par data in the level) · death/respawn feed-drop. Damage = feed corruption, never red vignette. - Audio engine: D's pack via
assets.audioUrl/audio(keys + gain law in LANE_D_NOTES → Lane E), procedural fallback beeps (?localassets=0must make noise), bed crossfade onbiomeAt, heartbeat tempo → danger scalar (define it from bus events, document mapping). Hand D your round-3 key wishlist by mid-round (D's #4). - Respect
?shots=1/?mute=1; every screen screenshotted intodocs/shots/laneE/.
Lane F (me) — done this round: the integration above. On-call for contract questions;
end of round: boot matrix, v0.2 tag, ROUND3.
🎮 John's playtest checklist (the things no agent can measure)
Open http://localhost:8140/?dbg=1 (or 8141) in a real browser and just play:
- The fps number in the bottom-left overlay (we can only prove draws/tris; rAF is paused in our tooling — every lane flagged this honestly).
- Feel — B set
bank.gain,cam.discFollow,aim.lagby reasoning, not play. Say "banking feels heavy/floaty/right" in any form; B will translate. - The hiatus (s 2600–3000, once B's hazards land): thrilling or miserable? This decides C's clearance floor.
- Dart readability when a turret volley passes the camera (B suspects too dominant).
- Audio ear-check of D's pack (spectrograms pass; ears are yours).