Go to file
jing 1b5ec767cd [lane C] Round 1: schema v1, levels registry + selfcheck + pacing sim, L2 vertical slice
Data spine:
- Schema v1 ratified (TECH.md, C-owned). Additive over v0: schema/par/next, segment
  name, cross-section placement (theta/rho as a FRACTION of safe radius), spread, span,
  pickup+gate event types, hazard params. STUB_LEVEL synced (that const only, per
  ROUND1 §Lane C.1) — world.hash() unchanged (1bdf001), geometry provably untouched.
- levels/index.js: registry + loader (node+browser, no THREE), real schema selfcheck
  (qa's --selfcheck hook is now live) and a pacing simulator (--sim). Consumes the other
  lanes' contracts live rather than restating them: A's biomes.js for ids and
  wave.amp+breathe, A's SKIN, B's tuning.js hull radius, B's balance.js for scores.
- levels/enemies.js (fiction id -> archetype join table), levels/difficulty.js.

L2_esophagus — the vertical slice, complete: 3600 units, 7 beats, 47 events, 65 enemies,
10 checkpoints, 3 samples, reflux-surge finale. L1/L3 skeletons (shape only).
Anatomy is the level designer: the three real esophageal constrictions are the three
setpieces, and all three enemies are real esophageal pathology (bolus chunk, eosinophilic
esophagitis, candida esophagitis).

Measured (node web/js/levels/index.js --selfcheck|--sim; qa GREEN):
- selfcheck 3/3 valid, exit 0.
- pressure curve 0.27 -> 2.14 -> 4.35 -> 0.69 -> 4.53 -> 6.35 -> 4.40 (breather/pressure/
  spike/breather/pressure/peak/finale).
- par 3:30 vs measured 2:47 speedrun / 3:19 par-pace / 4:22 timid; par.score 9000 of a
  9400 kill budget (95%), computed from B's scores.
- all 10 checkpoint gaps within the <=30s death-cost law (max 28.8s); min clearance 2.73.

Two contract collisions found and resolved (LANE_C_NOTES):
- Biome ids: authored mouth/pharynx/cardia/pylorus; A's registry has six canonical ids and
  rejected all four. A is right — biome = look, segments[].name = anatomy. Conformed.
- Balance: my first enemies.js restated hp/size/speed/score that B owns in balance.js.
  Cut to a join table; index.js reads B's scores via scoreFor().

Caught live: A raised esophagus wave.amp 0.9 -> 1.4 mid-session, making the diaphragmatic
hiatus unflyable (2.33 vs the 2.5 floor). Widened 6.5 -> 6.8. The invariant also failed my
own aortic constriction's first draft (radius 7, symmetric squeeze) -> radius 9, directional.

No in-engine flythrough: ?stub=1&lvl= does not compose (snippet offered to F) and the stub
is single-segment, so it could only render beat 1. The pacing evidence is a kinematic model,
not a playtest — it proves L2 is flyable, paced and survivable, not that it feels good.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 08:53:34 +10:00
.claude [lane F] Round 0 scaffold: docs, contracts, lane charters, bootable stub world 2026-07-16 01:28:35 +10:00
docs [lane C] Round 1: schema v1, levels registry + selfcheck + pacing sim, L2 vertical slice 2026-07-16 08:53:34 +10:00
pipeline [lane D] Round 1: pipeline scripts + assets.js loader 2026-07-16 01:45:12 +10:00
tools [lane F] Round 0 scaffold: docs, contracts, lane charters, bootable stub world 2026-07-16 01:28:35 +10:00
web [lane C] Round 1: schema v1, levels registry + selfcheck + pacing sim, L2 vertical slice 2026-07-16 08:53:34 +10:00
.gitignore [lane F] Round 0 scaffold: docs, contracts, lane charters, bootable stub world 2026-07-16 01:28:35 +10:00
README.md [lane F] Round 0 scaffold: docs, contracts, lane charters, bootable stub world 2026-07-16 01:28:35 +10:00

GUTS — a fantastic voyage through the alimentary canal

Browser flight-combat game (three.js, zero build step). You pilot ENDO-1, a microscopic probe, mouth → rectum through five anatomically-grounded biomes: ride peristalsis down the esophagus, cross the acid sea of the stomach, thread the villi forest of the small intestine, survive the gas swamps of the colon. Fantastic Voyage × Star Fox × Descent.

Run it

cd web && python3 -m http.server 8140
# http://localhost:8140            — the game
# http://localhost:8140/?stub=1&dbg=1  — stub world + debug HUD (works from day 0)

No bundler, no npm, no build. ES modules + import map; three.js r175 vendored in web/vendor/ (never CDN — the game must run offline). Before you finish a session: bash tools/qa.sh.

The one-paragraph tech pitch

The whole canal is a spline. World position is (s, θ, ρ) — distance along the canal, angle and radius in the cross-section. Tube walls are chunked extrusions along parallel-transport frames; peristalsis and breathing are vertex-shader displacement (cheap, squishy, everywhere); collision is an analytic radius test (no physics engine). Caverns (mouth, stomach) switch the same controller to free 6DOF. Look is synthetic scanner — dark endoscope void, SEM-style monochrome walls with FLUX-generated detail textures, emissive-coded enemies. Everything is seeded + deterministic, and every asset is optional at runtime — the game boots and plays asset-free with procedural fallbacks.

Hard laws (all lanes)

  1. Determinism. No Math.random outside js/core/rng.js. Seeded RNG only. qa.sh greps.
  2. Assets are optional. Missing texture/model/audio ⇒ procedural fallback, never a crash.
  3. Eyeball everything. Visual work isn't done until a screenshot is in docs/shots/laneX/.
  4. Perf budget: ≤300 draw calls, 60 fps on M-series / mid laptop. Measure via window.DBG.
  5. Free-first. Local MODELBEAST generation before any paid API; fal.ai is a gated fallback (John's go). See PIPELINE.md.
  6. Git: stage only your exact paths, commit + push each session, never git add ..

Deploy

Target: partly.party (static). Not wired yet — when it's time, consult the deploy-map skill and run ship-check first. Origin: ssh://git@100.71.119.27:222/monster/guts.git.