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>
4.0 KiB
Lane D — progress log
2026-07-16 — Round 1: pipeline online, first texture pack, audio proof
Shipped all four round-1 items. $0.00 spent — everything generated locally on the m3ultra
box; no fal.ai candidates arose, so FAL_LIST.md still doesn't exist.
1. Scripts ported from PROCITY (--dry-run first, idempotent, resumable):
gen_textures.py (flux_local backend, provenance JSON), derive_maps.py (tiling + Sobel
normals + WebP), build_manifest.py, validate_manifest.py (qa gate 5, stdlib-only so it runs
on any box — hand-parses the WebP header rather than needing PIL), gen_audio.py.
Plus shot_sink.py, a small addition of my own: DBG.shot()'s <a download> lands as
unnamed half-written temp blobs in this browser pane, and naming evidence by guessing at file
sizes isn't evidence — so the page POSTs frames and they land correctly named.
2. First texture pack — 6 walls (2 each: esophagus / stomach / small intestine) + normals
- 1 wet-tissue matcap. 9.0–9.6 s per 1024² image, ~64 s for the pack. 1.7 MB shipped.
- Every raw FLUX image had a hard wrap seam (seam_error 3.7–17.9) despite the prompt asking for "seamless tiling texture". A 4-way cosine partition-of-unity blend of the four half-rolls fixes it exactly (weights sum to 1, are N-periodic, and each copy's seam sits where its own weight is 0) → 0.87–1.32, i.e. the seam is now indistinguishable from interior detail.
- Levels-normalised the pack to a common exposure: FLUX gave each prompt its own brightness (means 0.18–0.32), which under a multiplied biome tint reads as a broken tint, not dark tissue.
- Prompt-kit experiment rejected: adding PROCITY's "uniform coverage / edge to edge" clause
to the ART_BIBLE stem cured the centred-subject failures but flattened the whole pack and
collapsed three biomes into the same honeycomb. Reverted; framing words now live only in the
two subject prompts that needed them. Recorded in
gen_textures.pyso it isn't re-tried.
3. js/core/assets.js — manifest loader per the TECH contract: null-on-miss, never throws,
?localassets=0 empty boot, depot: resolution, dual-format audio probing. Added a miss
ledger after Lane A identified the silent-forever-fallback failure mode: each distinct miss
logs once and assets.misses() lists them.
4. Audio proof — bed-esophagus (24.000 s, loop seam 0.32 = inaudible) + 4 sfx
(pellet, hit-squelch, boost, pickup). Whole pack renders in 4.2 s. 0.61/10 MB budget,
ogg+m4a dual-shipped, verified with ffprobe.
- First spectrogram sheet was a saturated cream rectangle (fixed
(db+60)/70normalisation) — evidence you can't read is not evidence. Rewrote against each clip's own peak over 80 dB with a log frequency axis and Hz gridlines. - Caught by looking at it: the bed had strong energy to 16 kHz — my
lp1is one-pole (6 dB/oct), so a 900 Hz lowpass left 16 kHz only ~25 dB down. That's hiss, not a wet gut. Added cascaded poles; the bed is now properly muffled below ~1 kHz.
Eyeballed in engine (web/dev/laneD_texview.html, a dev harness that imports the stub world
read-only): all 6 walls under their own ART_BIBLE biome tints + the ?localassets=0 fallback →
docs/shots/laneD/round1_*.png.
- The find of the round: normal maps were rendering the tube near-black. I'd added the tangent-space sample to the view-space normal, which tilts every normal at the camera and kills the fresnel rim — and the rim is the biome's only real light. Rebuilt the TBN per-pixel from screen derivatives; the rim now traces every fold edge and the walls finally look like the ART_BIBLE's "SEM tissue + artificial rim light". Handed the working code to Lane A in NOTES, since they'd scheduled TBN work for round 2.
QA green. Committed only Lane D paths.
Next round: slug rename to biome ids (with A deleting their map — F to sequence), hero
meshes (ENDO-1 + C's three enemies), colon/mouth walls, full audio pack, port normalize.py +
glb_stat.py so the house GLB law is actually enforced.