Commit Graph

5 Commits

Author SHA1 Message Date
jing
a99f733452 [lane A] MODELBEAST dresses the molecules: 5 matcaps, and the canal picks space-filling
The right axis wasn't "generate or don't" — it was WHICH HALF. Geometry stays
procedural because a molecule's shape is already known exactly. **Material is
exactly a generation problem**, and it's the whole difference between a textbook
diagram and a game object. So MODELBEAST made the materials.

5 greyscale matcaps, flux_local, 69 seconds, $0.00, 68 KB total:
  mol_glass (O,N) — the big win: oxygen is a red glass marble with internal glow
  mol_matte (C)   — graphite soot; carbon reads as the scaffold it is
  mol_chrome (Co) — B12's cobalt is now a chrome bearing in a cage
  mol_molten (P)  — ATP's phosphate tail is incandescent AND pulses (uTime, free)
  mol_pearl (H)   — satin white; hydrogens stop shouting

The trick is Lane D's own law applied to spheres: author the LUMINANCE, tint
in-shader. derive_maps already greyscales every matcap, so one glass ball serves
oxygen AND nitrogen at their own CPK hues — 5 balls dress the whole periodic
table we care about. They pack into one strip atlas indexed per-vertex by aMat,
so **a molecule is still exactly 1 draw call** however many materials it's made
of (7 molecules = 7 draws, unchanged). ?matcap=0 falls back to the built-in
fake-lit path: the assets-optional law holds.

SPACE-FILLING WINS FOR PICKUPS, and the canal decided it, not me. New
`repr: 'space-filling'` draws every atom at its real van der Waals radius with no
sticks. A/B'd at real pickup size against the real L2 wall, same camera:
ball-and-stick goes spindly and dissolves; the solid blob holds its silhouette —
and it's CHEAPER (21k vs 26k tris, no bond cylinders). Recommendation to B:
space-filling in flight, ball-stick for hero/UI/collect close-ups where the
chemistry is worth reading. Evidence: round2_molecule_materials.png (3-way).

Two defects found by rendering it, both mine, both fixed:
- Tint x luminance darkens TWICE: CPK carbon is 0.4 and a matte ball averages
  0.5, so soot x soot vanished — the first pass sank glucose, caffeine and the
  cobalt into the background. Floored the matcap at 0.22, the same floor the
  fallback's key light always had.
- The molten matcap was my own bad prompt: I asked for an "incandescent white hot
  CORE" and got exactly that — a black ball with a hot spot, so phosphorus lost
  its orange. Re-rolled for the whole sphere to glow (attempt 2 of the <=2
  PIPELINE allows). Lesson for the kit, next to the organ/tissue one: a matcap is
  a LUMINANCE LOOKUP, so a dark-dominant ball makes a dark-dominant object.

Also corrected the doc's own framing — v1 said "I'm authorised to burn GPU and
I'm not going to", which was the wrong axis, not just the wrong tone.

qa GREEN; 16/16 texture provenance verified (synced the FIXED batch json up
first this time, so the box couldn't clobber it on the way back).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 21:31:24 +10:00
jing
9f42a2e9ab [lane A] Molecules as pickups: real gut chemistry, procedural, 1 draw each
PROTOTYPE + proposal, not wired into boot. Pickups are B's systems, their
economy is C's, object art is D's — this is a renderer and an argument, offered
to all three. Bench: web/dev/laneA_molecules.html · docs/MOLECULES.md

THE PITCH: the pickups already in L2 ARE molecules. C authored `nutrient`,
`mucin`, `B12` and `antacid ammo` before any of this existed — those are the real
biochemistry of a digestive tract, and glucose/cobalamin/bicarbonate are real
compounds with known shapes. We don't need to invent a pickup language; we need
to stop hiding the one the fiction handed us. GUTS is already a science game (an
eosinophil is a real white blood cell, candida a real yeast, the hiatus a real
choke point) — it just doesn't LOOK like one, because everything on screen is
tinted tissue.

THE RULE THAT MAKES IT WORK: CPK is the scanner. Everything identified is drawn
in the standard element palette (O red, N blue, P orange, metals pink);
everything else stays monochrome tissue. Against six biomes of tinted wall a CPK
molecule is the ONLY saturated foreign colour on screen — it reads as artificial,
valuable and targetable with NO HUD marker. Proof: round2_molecules_in_canal.png.
That's the ART_BIBLE's synthetic-scanner fiction paying rent, and it hands Lane E
a free HUD palette.

WHY PROCEDURAL AND NOT MODELBEAST — and I'm authorised to burn the GPU: a
molecule's shape is already known exactly. Glucose is a hexagonal ring because it
IS one. FLUX+TRELLIS gives a plausible blob in 3-8 min that a chemist clocks as
wrong and that can never be re-derived. Ball-and-stick from an atom list is exact,
rebuilds in ms, and is ONE DRAW CALL per molecule (measured: 7 molecules = 7
draws / 26.5k tris). The split is a principle: small molecules = procedural
(exact geometry known); proteins/enzymes = MODELBEAST blobs (real ones are
3000-atom blobs nobody reads — and PIPELINE says blobby organics are TRELLIS's
sweet spot); cells/creatures = MODELBEAST, D's lane, unaffected.

BUILT: water (chaff) · bicarbonate (antacid ammo — HCO3- + HCl is the real
neutralisation, it genuinely fizzes CO2) · glucose (nutrient/score) · caffeine
(overdrive — really gut-absorbed, needs no tutorial) · ATP (boost — the orange
triphosphate tail IS the charge, a pickup that's a diagram of its own mechanic) ·
capsaicin (burn hazard — long greasy tail reads wrong on sight) · B12 (rare
treasure — a cobalt in a corrin cage, the only metal vitamin; C authored it as a
pickup already). Size is a free rarity signal: `unit` mode keeps TRUE relative
sizes, so water is a speck and B12 a chandelier.

Found by rendering it, which is why the bench exists: fuseRing returns vertices
starting adjacent to B, and bonding them from A instead draws a chord across the
ring — still a valid 5-cycle so nothing errors, it just looked like a squashed
pentagon. Fixed in caffeine + ATP's adenine, adjacency documented.

Stated plainly: geometry is idealised (correct connectivity/rings/bond orders,
believable angles, authored flat) NOT crystallographic — real glucose is a chair,
not a hexagon. The B12 is a simplified corrin core. Untested above ~7 on screen;
fifty would want instancing.

qa GREEN.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 19:52:33 +10:00
jing
111ade7d12 [lane A] The swept room + the acid sea, built — and it corrected me four times
The shape read in LANE_A_NOTES was written from reading code, so I built it to
find out if it was true. Flyable: web/dev/laneA_world.html?dbg=1&assets=1&lvl=swept
Nothing here is imposed on anyone: every addition is additive and a level that
opts out behaves exactly as today. C can bin the whole proposal and lose nothing.

WHAT THE PROTOTYPE DISPROVED (my own cost estimates, all four):
- "radial resolution must scale with radius" — wrong. 64 segments is a 0.05u
  circle error at r=70. The arena needs it because it fbm-displaces; the tube's
  wave is smooth in theta. No change made.
- "cap geometry at the span ends" — a thinko. The canal is continuous; a room is
  a fat part of it. Only the fundus dome caps, and it stays an icosphere.
- cost — cheaper than feared: 9 draws / 98k tris worst-frame for a radius-70
  cathedral vs 8 / 74k for the L2 corridor. No leak over a full sweep.
- "one schema flag" — held. `segments[].mode: "open"` is the entire ask.

THE TWO REAL COSTS, NEITHER PREDICTED:
1. D's `tile[0]` is a COUNT, not a density — only a texel size if radius never
   changes. Measured 6.1:1 smear at r=70. The wall now derives the count from
   each ring's own arc length (aRadius attr + uThetaSpan); D's authored numbers
   keep their exact meaning at their reference radius, no re-authoring. That fix
   then laid a seam down the canal (a fractional count can't wrap) -> rounded to
   an integer, seam gone. Not a no-op on corridors: L2's hiatus takes 3 repeats
   where it took 4, which is the texel size correctly holding still as the pipe
   narrows. Eyeballed.
2. MY OWN PINCH GUARD WAS WRONG and would have blocked C. The fixture scored
   1.30 and "failed" the >1.5 law; it was never bent. stats() divided the
   tightest turn ANYWHERE by the widest radius ANYWHERE — 996 units apart, a
   bend in the radius-13 pylorus against the radius of the sea. Locally its
   worst point is 6.4. pinchRatio is now min over s of turnRadius(s)/radius(s).
   Provably one-directional (global <= local by construction) so nothing that
   passed can fail; real levels GAINED headroom: L2 3.32->4.16, L3 1.91->6.99,
   L1 2.11->6.06. This mattered — the guard is what backs the round-1 promise
   that C never has to think about curvature.

THE ACID SEA (world/acid.js, `level.acid {from,to,height,biome}`):
Flat emissive #c8ff3a, level and NOT tube-following — that's the mechanic. The
best find of the session: `height` is ONE NUMBER that tunes the level. Measured:
-18 -> 0% of the sea floor is dry shallow, -55 -> 14%, -62 -> 48%. So C's "position
IS the resource" falls out of the radius wobble they already author — the mucus
shallows are just "where the wall rises above the waterline", nothing to place —
and rising acid literally drowns them: free escalation, same scalar their event
pump drives. Also disproved my own claim: the centreline stays level (+/-1u over
700u), so shallows come from radius wobble, NOT the canal's bends. C must author
vertical bends deliberately if they want depth by anatomy.

Stated plainly, not papered over: the waterline is prototype quality (the plane
meets faceted rings and the shoreline steps). Acid does not drain the coat —
depthAt(pos) is the hook and the cost is Lane B's call. Nothing drives height but
DBG until C's events do.

qa GREEN incl. the new provenance gate; spline selfcheck green; L2 corridor
re-eyeballed for regression. Rulings requested from F in NOTES §-> Lane F.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 18:04:16 +10:00
jing
ecf43940ec [lane A] Round 2 close-out: colorspace re-eyeball, stomach shape read, ruling #5
Finishes the lane A round-2 list that f0982e7 (the rescued first half) left open:

- Biome-tint re-eyeball under the colorspace law (#4 second half). Verdict: all
  six ART_BIBLE tints stand, biomes.js untouched — the wash was wall_material's
  round-1 constants, tuned on the raw framebuffer. Retuned: rim pow 2.2->3.0,
  rim gain 0.9->0.35, textured curve (0.35+d*.95)*.9 -> 0.12+d*0.60, procedural
  d*.8 -> d^2*.65, sheen .10->.04, matcap .22->.14. Rationale documented
  in-shader. Verified on a new six-biome contact sheet (?lvl=biomes, SIX_BIOMES
  fixture — kept as permanent kit), the real L2 hiatus, and an arena interior.
  Evidence: round2_tint_*.png x6 + two *_retuned frames. qa GREEN.

- Stomach-arena shape read for C (#7): recommend the spline-swept room (arena =
  "open" mode over an s-span; fundus dome stays a welded icosphere; chained
  spheres rejected — crease rings + union collision for a worse look). Full
  argument NOTES §-> Lane C + round2_stomach_arena_sketch.svg. Triplanar
  deliberately deferred: the swept room obsoletes it where it mattered.

- Ruling #5: harness -> web/dev/laneA_world.html (+DBG.post to the house shot
  sink); _fixture.js stays — the spline selfcheck asserts against it, now
  documented in-file. launch.json: guts-a on 8145.

- NOTES + progress written for both halves; ROUND2 mid-round box updated: lane
  A's round-2 list is closed, only round-3 items remain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 17:14:30 +10:00
jing
efea7d98f3 [lane D] Round 1: first texture pack + audio proof, exact-tiling pipeline
Textures (6 walls + normals + wet matcap, $0, ~64s on the m3ultra MPS):
- FLUX ignores "seamless tiling" (seam_error 3.7-17.9); a 4-way cosine
  partition-of-unity blend of the four half-rolls fixes it exactly -> 0.87-1.32
- levels-normalised the pack to one exposure (means were 0.18-0.32); these are
  detail maps multiplied into a biome tint, so per-prompt exposure read as a
  broken tint rather than as dark tissue
- prompt-kit experiment rejected + recorded: PROCITY's "uniform coverage" clause
  in the STEM cured centred subjects but flattened the pack; framing words now
  live only in the two subject prompts that needed them

Audio (1 bed + 4 sfx, 4.2s render, 0.61/10MB, ogg+m4a dual-ship):
- bed-esophagus 24.000s, loop seam 0.32 (wrap step 3x smaller than inner step)
- cascaded lowpass poles: one-pole at 900Hz left 16kHz only ~25dB down = hiss
- rewrote the spectrogram sheet (per-clip peak, log freq) — the first one was a
  saturated rectangle, and evidence you can't read is not evidence

assets.js: miss ledger + misses() — Lane A found that a drifted slug falls back
procedurally forever with no error. Each distinct miss now announces itself.

Also: shot_sink.py (canvas -> docs/shots/laneD, correctly named) and a dev
texture viewer that imports the stub world read-only for the eyeball law.

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