diff --git a/.claude/launch.json b/.claude/launch.json index 6140848..809ee50 100644 --- a/.claude/launch.json +++ b/.claude/launch.json @@ -12,6 +12,12 @@ "runtimeExecutable": "python3", "runtimeArgs": ["-m", "http.server", "8141", "--directory", "web"], "port": 8141 + }, + { + "name": "guts-a", + "runtimeExecutable": "python3", + "runtimeArgs": ["-m", "http.server", "8145", "--directory", "web"], + "port": 8145 } ] } diff --git a/docs/LANES/LANE_A_NOTES.md b/docs/LANES/LANE_A_NOTES.md index 7451a7a..bacc4e9 100644 --- a/docs/LANES/LANE_A_NOTES.md +++ b/docs/LANES/LANE_A_NOTES.md @@ -1,4 +1,138 @@ -# LANE A — NOTES (round 1) +# LANE A — WORLD — NOTES + +## Round 2 (2026-07-16) — the law-compliant look, and what shape a stomach is + +Context for the reader: the original round-2 session was cut off 15:08 before NOTES; F +committed the orphaned work as `f0982e7` (its commit message is the NOTES for that half) and +a resuming session finished the lane. This section covers both halves; trust the commit +message for the mechanics of the first. + +### What landed + +First half (`f0982e7`, per its message): `crestSpeed(s)` + CREST_FACTOR 1.6 with selfcheck +asserts (ruling #1) · radius blend widened ±12 → ±25 + no-cliff selfcheck (C's #4 dependency — +the taper C assumed now exists) · per-segment `wave.amp` override baked as per-vertex `aWaveA` +(ruling #8) · colorspace law in the wall shader (ruling #2) · TBN normal maps + matcap + dual +detail layers, D's `perturb()` with the trap documented in-shader · `sample(s, out)` v1.2 · +slug map shrunk to the two real mismatches. + +Second half (this commit): + +1. **Biome-tint re-eyeball under the colorspace law (task #4, second half). Verdict: all six + ART_BIBLE tints stand — `biomes.js` is untouched.** The wash was never in the palette; it + was the shader's tuned constants, all eyeballed round 1 on the *raw* framebuffer. Once + `` encodes the output, every midtone gains roughly a stop, and the + fresnel rim — which an inside-a-tube camera sees at grazing angles almost everywhere — + flooded the frame (the esophagus shot was effectively rim colour wall-to-wall; the oral + fallback was near white-out). Retuned in `wall_material.js`, where the round-1 numbers were + authored: `uRimPow` 2.2 → 3.0 (confines the rim to fold edges, where the TBN normals bend), + `uRimGain` 0.9 → 0.35, textured base `(0.35 + d·0.95)·0.9` → `0.12 + d·0.60`, procedural + base `d·0.8` → `d²·0.65` (the sine bands only span ~0.4..1, and post-law that reads flat — + squaring restores the dark troughs), crest sheen 0.10 → 0.04, matcap gain 0.22 → 0.14. +2. **The six-biome contact sheet** that the eyeball ran on, kept as infrastructure: + `?lvl=biomes` in the harness loads `SIX_BIOMES` (`_fixture.js`) — one straight segment per + registry biome. Whenever tints, textures, colorspace or TBN change again, one fly-through + re-checks everything. Evidence: `docs/shots/laneA/round2_tint_.png` ×6, plus + `round2_L2_hiatus_retuned.png` (C's calm-wave override, real L2) and + `round2_arena_interior_retuned.png` (the BackSide/arena material path). +3. **Ruling #5 executed**: the harness moved to `web/dev/laneA_world.html` (it stays — it is + the lane's instrument, not a boot workaround: `pose`/`poseAt` deterministic evidence frames, + the leak `sweep`, the contact sheet). It gained `DBG.post(name)` which POSTs the canvas to + D's `shot_sink` — the house evidence tool — instead of the round-1 private sink. + `_fixture.js` stays too, and now says why: the spline selfcheck (a qa gate) asserts against + FIXTURE's exact shape, headless. It is not waiting on C's levels after all. +4. **Stomach-arena shape read for C (task #7)** — recommendation + sketch, § → Lane C below. + +### Measured / verified this half + +qa.sh GREEN end-to-end (ESM, determinism, levels 3/3, world selfcheck, manifest). Spline +selfcheck green after every edit — the `_fixture.js` changes are additive (new export), and +FIXTURE itself is untouched. Contact sheet: 6 draws / 61k tris per posed frame at 1280×720, +consistent with round 1's budget headroom. fps still not claimed, same reason as round 1. + +### Deliberately not done + +- **Triplanar arena shells** ("if time", task #7's tail): skipped, and not only for time — if + C takes the swept-room proposal below, the stomach stops being an icosphere and triplanar + stops being needed for the game's biggest room. The remaining icospheres (fundus dome, boss + lairs, r ≲ 70) have modest pole pinch. Decide the shape first, then spend the shader work + where it still matters. Revisit in round 3 with the L3 build. +- **Slug-map deletion** (ruling #3): waiting on D's rename ping, as sequenced. The map is + already down to the two real mismatches (`smallint`, `colon`). + +## → Lane C (round 2): what shape is the acid sea? + +**Recommendation: don't grow the sphere — sweep the room along the spline you already +authored.** Your L3 `segments[]` (fundus r 40, body r 45, antrum 25, + wobble, + curviness) +already *describe* the stomach's bag: my proposal is that the "arena" becomes a **mode over an +s-span**, not a separate geometry — the tube pipeline extrudes those segments at room radii +exactly as it does corridors, and gameplay flags the span "open" (B's 6DOF, no disc clamp). +The J-bend comes from `curviness`, the lobes from `wobble` (plus a low-frequency bulge term I +add to the radius law if you want asymmetry — greater vs lesser curvature), and the two ends +cap with hemispheres at the cardia and pylorus sphincters. What this buys, concretely: +collision is the *existing* `project()`/`wallRho` path (varying radius is already supported +and selfchecked — no union-of-spheres code); UVs stay `(theta, s)` so D's gastric pits tile +like every other wall with **no pole pinch** (the round-1 starburst limitation dies rather +than getting a triplanar bandage); the acid plane is a horizontal chord of the swept section +(height driven by your events, `#c8ff3a`, round 3); and your mucus shallows are an `(s, theta)` +band hugging the greater-curvature side — expressible in level data. The **fundus dome stays a +welded icosphere** (it's a dead-end bulge *off* the centreline, which a sweep can't express) — +the existing primitive, existing `arenaAt`. Chained overlapping spheres were the alternative +and I sketched why not: every intersection of two displaced shells is a visible crease ring, +and union `collide()`/`project()` is new math for a worse look. Cost on my side, stated +honestly: radial resolution must scale with radius (64 segments at r 45 is an 8-unit facet; +same ~3u solve the arena already does), cap geometry at the span ends, and modest streaming +cost since room chunks are bigger. Schema ask, if you take it: `segments[].mode: "open"` (or +an `arenas: [{from, to}]` span form — your call which reads better as data), spec'd by you in +schema v3 early round 3, implemented by me the same round, before you author the acid sea +proper. Sketch: `docs/shots/laneA/round2_stomach_arena_sketch.svg`. `arenaAt`/`modeAt` keep +their contract for B either way (bounding `{center, radius}` per open span). + +## → Lane D (round 2) + +- **Your measured detail curve changed — deliberately, and it's the law's fault, not your + measurement's.** `(0.35 + d·0.95)·0.9` was right on the raw framebuffer; under + `` its pedestal alone displays as ~60% grey. Now `0.12 + d·0.60` + (rationale in-shader). Your mean-0.50/std-0.19 normalisation is exactly what made retuning a + one-liner — the pack didn't move, the curve did. `normalScale` 0.6 unchanged and still right. +- When your mouth + colon walls land, the eyeball harness is + `web/dev/laneA_world.html?dbg=1&assets=1&lvl=biomes` — all six biomes, one URL. I'll re-run + the contact sheet then; expect no curve change (your normalisation again). +- Slug rename: still on, map deletion is a same-day promise once your NOTES ping lands. + +## → Lane B (round 2) + +- **Nothing gameplay-moving changed this half.** The retune is fragment-shader only: `wallRho`, + wave amplitudes, `crestSpeed`, collision — all untouched since `f0982e7`. Your speed-lock + and envelope numbers stand. +- The crest sheen is dimmer (0.10 → 0.04) but the crest still reads — it keeps its geometry, + normal tilt, and rim pop. If playtest says the boost tell got too subtle, the knob is one + constant in `wall_material.js` and I'll trade sheen against rim gain, not against the law. + +## → Lane E (round 2) + +- `biomeAt(s).palette` hexes are unchanged (and now display *as written* end-to-end, which + they never quite did before the law) — safe to key HUD accents off `palette.rim`. + +## → Lane F (round 2) + +- Ruling #5 executed as above; `web/dev/` now holds D's texview and my world harness. +- Housekeeping: `launch.json` gained `guts-a` on **8145** (8140/8141 were other sessions'). + Shot sink on **8144** was reused as the instructions suggested and left running. +- The two pre-retune shots `f0982e7` committed (`round2_L2_hiatus.png`, `round2_L2_tbn_wall.png`) + show the washed-out pre-eyeball state — superseded by the `*_retuned` set, kept as the + before/after record of what ruling #2 predicted. + +### Round 3 (mine) + +Swept-room implementation if C specs it (radial-res solve + caps + open-span mode) · acid +plane with C's height events · villi band when a small-intestine level exists · sphincter +joint geometry at biome seams · slug-map deletion on D's ping · stomach-asymmetry bulge term +if C wants authored greater/lesser curvature. + +--- + +# Round 1 NOTES (kept verbatim below) World v0 is in and **the real game boots it**: `http://localhost:8140/?dbg=1` runs Lane A's canal on C's `L2_esophagus` (3600 units, hash `cefc4f83`), zero console errors. No boot.js diff --git a/docs/LANES/ROUND2_INSTRUCTIONS.md b/docs/LANES/ROUND2_INSTRUCTIONS.md index c8dd853..ae40a8b 100644 --- a/docs/LANES/ROUND2_INSTRUCTIONS.md +++ b/docs/LANES/ROUND2_INSTRUCTIONS.md @@ -17,6 +17,10 @@ > your proposed pickup values vs C's economy, arena 6DOF stretch, NOTES. > - **A**: nothing of yours changed. STILL YOURS: stomach-arena shape read for C (#7), > biome-tint re-eyeball vs D's textures (#4 second half), NOTES. +> **[A, later 2026-07-16: all three done — lane A's round-2 list is closed.** Tints stand, +> wall shader retuned for the colorspace law (see LANE_A_NOTES §Round 2); shape read + sketch +> in NOTES §→ Lane C; harness moved to `web/dev/laneA_world.html` per ruling #5. Only +> round-3 items remain for A.] > - **C**: pump semantics settled: events fire ONCE per run, respawn does NOT rewind the > pump, hazards re-arm via `combat.reset(fromS)`. `boot.step(dt)` now exists — your > fly-through validation (#1) is unblocked and can run deterministically. STILL YOURS: diff --git a/docs/progress/a-progress.md b/docs/progress/a-progress.md index 6126807..83225db 100644 --- a/docs/progress/a-progress.md +++ b/docs/progress/a-progress.md @@ -1,5 +1,32 @@ # Lane A — progress log +## 2026-07-16 · Round 2 — crest law, TBN walls, the colorspace re-eyeball, stomach shape read + +Two halves: the original session (cut off pre-NOTES; work rescued by F as `f0982e7` — crest +speed law + selfchecks, ±25 radius taper, schema-v2 `wave.amp` as per-vertex `aWaveA`, +colorspace law in the wall, TBN + matcap + dual detail, `sample(s,out)`) and this resuming +session, which closed out the lane's round-2 list: + +- **Tint re-eyeball under the colorspace law: all six ART_BIBLE tints stand, `biomes.js` + untouched.** The wash was the shader's round-1 constants, tuned on the raw framebuffer; + post-law the rim flooded every grazing angle. Retuned in `wall_material.js` (rim pow/gain, + both detail curves, sheen, matcap — values + rationale in-shader). Verified on a new + six-biome contact sheet (`?lvl=biomes`, kept as permanent kit), the real L2 hiatus, and an + arena interior; qa GREEN throughout. Evidence: `docs/shots/laneA/round2_tint_*.png` + two + `*_retuned` frames. +- **Ruling #5 executed**: harness → `web/dev/laneA_world.html`, + `DBG.post()` to the house + shot sink. `_fixture.js` stays — the spline selfcheck (qa gate) asserts against it; now + documented in-file. +- **Stomach-arena shape read → C (task #7)**: recommend the spline-swept room (arena = "open" + mode over an s-span, tube pipeline at room radii; fundus dome stays a welded icosphere; + chained spheres rejected — crease rings + union collision math). Full argument in + LANE_A_NOTES §→ Lane C; sketch `docs/shots/laneA/round2_stomach_arena_sketch.svg`. Triplanar + deliberately skipped: the swept room would obsolete it where it matters. +- Housekeeping: `guts-a` dev server on 8145 in launch.json; sink 8144 reused. + +Still open for A (round 3): swept-room implementation if C specs it, acid plane, villi band, +sphincter geometry, slug-map deletion on D's rename ping. + ## 2026-07-16 · Round 1 — the canal, v0 Built `web/js/world/`: spline + parallel-transport frames + arclength LUTs, chunked streaming diff --git a/docs/shots/laneA/round2_L2_hiatus_retuned.png b/docs/shots/laneA/round2_L2_hiatus_retuned.png new file mode 100644 index 0000000..5c71657 Binary files /dev/null and b/docs/shots/laneA/round2_L2_hiatus_retuned.png differ diff --git a/docs/shots/laneA/round2_arena_interior_retuned.png b/docs/shots/laneA/round2_arena_interior_retuned.png new file mode 100644 index 0000000..a4b9855 Binary files /dev/null and b/docs/shots/laneA/round2_arena_interior_retuned.png differ diff --git a/docs/shots/laneA/round2_stomach_arena_sketch.svg b/docs/shots/laneA/round2_stomach_arena_sketch.svg new file mode 100644 index 0000000..9e7d32f --- /dev/null +++ b/docs/shots/laneA/round2_stomach_arena_sketch.svg @@ -0,0 +1,72 @@ + + + + L3 stomach body — what shape is the acid sea? (Lane A → Lane C, round 2) + + + A. SPLINE-SWEPT ROOM — recommended + + + + + + + + + + + + + + + + fundus dome — stays a + welded icosphere + (existing primitive) + + + + acid plane: horizontal chord, + height ← C's level events + + + mucus shallows hug the greater curvature — + authored as a (s, theta) band, drain pauses there + + cardia (r≈14, teal — the reveal) + body: C's segments AS AUTHORED + (r 40–45 base + wobble = lobes, + curviness = the J-bend) + pylorus gate + + + + B. CHAINED SPHERES — not recommended + + + + + + + + + + + ✕ visible crease ring where displaced shells intersect (×3) + ✕ union collide() + union project() = new code, new selfchecks + ✕ spherical UVs: pole pinch ×4, tile scale jumps per sphere + ✓ zero schema change (arenas[] already spheres) + + + + + A = the tube pipeline itself at room radii over an s-span, gameplay flagged 6DOF ("open"): collision is the existing + project()/wallRho path (varying radius already supported), UVs stay (theta, s) so D's gastric pits tile with no pole + pinch, and C's L3 segments already author it (radius 40–45 + wobble). Cost: radius-scaled radial resolution + cap + geometry + one schema flag. Full argument + schema sketch: LANE_A_NOTES.md §→ Lane C. + + diff --git a/docs/shots/laneA/round2_tint_appendix.png b/docs/shots/laneA/round2_tint_appendix.png new file mode 100644 index 0000000..f589bd1 Binary files /dev/null and b/docs/shots/laneA/round2_tint_appendix.png differ diff --git a/docs/shots/laneA/round2_tint_esophagus.png b/docs/shots/laneA/round2_tint_esophagus.png new file mode 100644 index 0000000..ac2ca6e Binary files /dev/null and b/docs/shots/laneA/round2_tint_esophagus.png differ diff --git a/docs/shots/laneA/round2_tint_large_intestine.png b/docs/shots/laneA/round2_tint_large_intestine.png new file mode 100644 index 0000000..59c9d04 Binary files /dev/null and b/docs/shots/laneA/round2_tint_large_intestine.png differ diff --git a/docs/shots/laneA/round2_tint_oral.png b/docs/shots/laneA/round2_tint_oral.png new file mode 100644 index 0000000..5178ccd Binary files /dev/null and b/docs/shots/laneA/round2_tint_oral.png differ diff --git a/docs/shots/laneA/round2_tint_small_intestine.png b/docs/shots/laneA/round2_tint_small_intestine.png new file mode 100644 index 0000000..ae1f8ef Binary files /dev/null and b/docs/shots/laneA/round2_tint_small_intestine.png differ diff --git a/docs/shots/laneA/round2_tint_stomach.png b/docs/shots/laneA/round2_tint_stomach.png new file mode 100644 index 0000000..39ec309 Binary files /dev/null and b/docs/shots/laneA/round2_tint_stomach.png differ diff --git a/web/js/world/dev.html b/web/dev/laneA_world.html similarity index 81% rename from web/js/world/dev.html rename to web/dev/laneA_world.html index 10f5963..252ce9b 100644 --- a/web/js/world/dev.html +++ b/web/dev/laneA_world.html @@ -4,20 +4,23 @@ GUTS — Lane A world harness