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>
75 lines
4.1 KiB
JavaScript
75 lines
4.1 KiB
JavaScript
// world/_fixture.js (Lane A) — DEV FIXTURES, not shipping content.
|
|
// Lane C owns real levels (js/levels/*.json). FIXTURE survives C's levels landing because the
|
|
// spline selfcheck (a qa gate) asserts against its exact shape — headless, no three.js, no
|
|
// levels registry. Do not edit FIXTURE's segments without re-reading spline.js --selfcheck.
|
|
|
|
export const FIXTURE = {
|
|
id: 'A_FIXTURE',
|
|
name: 'Lane A fixture canal',
|
|
seed: 20260716,
|
|
segments: [
|
|
{ biome: 'esophagus', length: 300, radius: { base: 10, wobble: 0.25 }, curviness: 0.55, flow: 14 },
|
|
{ biome: 'esophagus', length: 240, radius: { base: 12, wobble: 0.35 }, curviness: 0.95, flow: 11 },
|
|
{ biome: 'stomach', length: 120, radius: { base: 16, wobble: 0.30 }, curviness: 0.20, flow: 4 },
|
|
],
|
|
arenas: [{ at: 620, radius: 55, biome: 'stomach' }],
|
|
events: [],
|
|
};
|
|
|
|
// The swept-room prototype (?lvl=swept in the harness) — Lane A's round-2 proposal to Lane C
|
|
// made flyable, so the shape argument is settled by looking instead of by reading.
|
|
//
|
|
// This is NOT L3 and does not touch it: C owns levels. It is the same anatomy (cardia ->
|
|
// fundus -> body/acid sea -> antrum -> pylorus) authored the way the proposal says a room
|
|
// should be authored — as the canal at room radii, `mode: "open"` where the disc clamp comes
|
|
// off — so C can fly it, hate it, and say why.
|
|
//
|
|
// Two numbers C should argue with:
|
|
// - **radius 70 for the sea**, not L3's arena radius 180. 180 units = a 36cm-wide stomach,
|
|
// which is 2.4x life size even by L3's own "1 unit : 1 mm" note; 70 gives ~14cm, which is
|
|
// a real full stomach and still a cathedral next to a ~2u ship. If the sea must be 180,
|
|
// say so and I'll measure that instead — it is one number.
|
|
// - **wave.amp 4.0 in the sea** (schema v2, ruling #8). The biome default 0.7 is sized for a
|
|
// radius-10 pipe and is literally invisible on a radius-70 wall. A room this size needs its
|
|
// churn authored, which is the per-segment override earning its keep.
|
|
export const SWEPT_STOMACH = {
|
|
id: 'A_SWEPT_STOMACH',
|
|
name: 'Lane A swept-room prototype (stomach)',
|
|
seed: 20260716,
|
|
segments: [
|
|
{ biome: 'esophagus', name: 'Cardia', length: 200, radius: { base: 12, wobble: 0.2 },
|
|
curviness: 0.3, flow: 8 },
|
|
// The flare. A segment join blends radius over ~±25u (round 2), so 12 -> 70 across one
|
|
// join would be a 58u climb in 50u of s: a funnel, not an anatomy. Give the flare its own
|
|
// short segment and it reads as the fundus opening out.
|
|
{ biome: 'stomach', name: 'Fundus flare', length: 220, radius: { base: 38, wobble: 0.22 },
|
|
curviness: 0.25, flow: 4, mode: 'open', wave: { amp: 2.2 } },
|
|
{ biome: 'stomach', name: 'Body (the acid sea)', length: 700, radius: { base: 70, wobble: 0.3 },
|
|
curviness: 0.45, flow: 3, mode: 'open', wave: { amp: 4.0 } },
|
|
{ biome: 'stomach', name: 'Antrum', length: 380, radius: { base: 26, wobble: 0.25 },
|
|
curviness: 0.35, flow: 6, mode: 'open', wave: { amp: 1.4 } },
|
|
{ biome: 'stomach', name: 'Pylorus', length: 160, radius: { base: 13, wobble: 0.15 },
|
|
curviness: 0.2, flow: 10 },
|
|
],
|
|
// The fundus dome stays an authored icosphere: it is a dead-end bulge OFF the centreline,
|
|
// which a sweep cannot express. Both kinds of room in one level, on purpose — that's the
|
|
// proposal's actual claim, not "spheres are bad".
|
|
arenas: [{ at: 300, radius: 46, biome: 'stomach' }],
|
|
acid: { from: 420, to: 1120, height: -18, biome: 'stomach' },
|
|
events: [],
|
|
};
|
|
|
|
// The tint contact sheet (?lvl=biomes in the harness): one straight-ish segment per registry
|
|
// biome, in registry order, generous radius so the wall — not the curve — is what you judge.
|
|
// Exists for the eyeball law: every biome tint gets re-checked against D's current pack in one
|
|
// fly-through whenever either side changes (tints, textures, colorspace, TBN…).
|
|
export const SIX_BIOMES = {
|
|
id: 'A_SIX_BIOMES',
|
|
name: 'Lane A biome contact sheet',
|
|
seed: 20260716,
|
|
segments: ['oral', 'esophagus', 'stomach', 'small_intestine', 'large_intestine', 'appendix']
|
|
.map((biome) => ({ biome, length: 200, radius: { base: 10, wobble: 0.2 }, curviness: 0.25, flow: 8 })),
|
|
arenas: [],
|
|
events: [],
|
|
};
|