Commit Graph

14 Commits

Author SHA1 Message Date
type-two
a3784c0371 [lane B+C] L5 Large Intestine: the dark, the gas, and The Blockage — the campaign is complete
The last level. 6 segments, 3200 units, 51 events, and the end of the game: `next: null`.

THE GAS. GDD: "flammable gas pockets: shooting inside one detonates it (hurts everyone —
risk/reward)". Built literally, as an entity whose kill() throws a blast:
  - one cannon pellet sets it off (hp 10) — the hazard has to be hair-trigger or "don't shoot
    near it" is not a constraint;
  - the blast reaches 16 units, FALLS OFF with distance, wipes foes, hurts YOU, and chains
    through other pockets, so a corridor of them is a fuse;
  - foe:false, so the pocket itself scores nothing — you are paid for what the blast KILLS,
    which makes the reward self-balancing.
Measured: one pellet into a line of four detonated all four; a blast took 4 virions and paid
240; the player takes 30.3 coat point-blank, 15.4 at mid range and 0 at 20 units. "Detonate
from max range" — which C's Blockage spec calls optimal play — is a real, measurable skill.

And the cruelty that makes the level: fog 0.075 is the densest in the game and there are no
real-time lights in GUTS, so THE POCKETS ARE THE LIGHTING. Clearing a room safely also clears
the lights. No new rendering path was added for the dark; the biome's fog and the emissives
already did it.

THE BLOCKAGE (LANE_C_NOTES §Boss specs 3) — 5 armoured plates -> 4 tumbling chunks -> the core
under a 30s doom timer, with gas pockets seeded into every phase, so the boss's own room is its
worst weakness. First cut ran 25.7s, shorter than the mid-game Guardian, which is the wrong
shape for a finale — its windows are continuous by spec, so hp went 120/130/150 -> 220/230/280.
Now: 49.7s brute-forcing the plates, 30.2s using the gas. The room is the weapon, and the
difference is 40%.

The reputation loop lands here as designed: two biofilm gates, the second sixty units from the
final boss. Five levels of deciding whether to shoot the cyan resolve into three phage escorts
and a full coat, or nothing at all, in the dark, at the door.

Registering L5 also closes two dangling threads — L4's ileocecal valve and LS_appendix's exit
both pointed at it and now resolve.

C's tooling: 6/6 levels valid, sim par 540 vs par-pace 505 (reachable, with room for the boss),
pressure 1.33/4.09/3.21/5.75/4.12, min clearance 8.30 vs the 2.5 law. par.score corrected
7000 -> 4000 and a missing checkpoint added at 3060 (the 30s law caught a 34.8s gap I had left
between the boss and the gate).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 11:35:28 +10:00
type-two
87a4803bde [lane A+B+C] L3 Stomach: the acid sea, and pH as a resource you can see
The last skeleton. L3 has been 4 events since round 1, waiting (in its own status field) on
"the pH field" and a boss framework; both exist now, so the level is authored: 46 events,
2500 units, the sea, and the Guardian at the end of it.

THE PH MECHANIC, finally load-bearing. Lane A built an acid plane in round 2 and left two
hooks on it — depthAt() labelled "B:" and set() labelled "C's event pump drives this" — and
nothing had ever called either. Now:
  - player.js scales the biome's ambient coat drain by SUBMERSION. Stomach 2.2/s x5 = 11/s
    under the surface (measured: 8/s net of regen, and regen is off for 2.5s after any hit,
    so it is brutal mid-fight); x0.15 above it, which is effectively safe air.
  - a new `acid` level event names a target height and boot eases the sea toward it in step(),
    so a RISING TIDE is a beat C can author. L3 uses two: -14 -> -6 mid-sea, then -6 -> +2 in
    the antrum, where the surface goes ABOVE the centreline and the safe lane simply stops
    existing. Measured: the identical spot (y -5) goes from 0/s to 9.67/s across that tide.
This is the GDD's "mucus shallows are safe lanes" expressed as DEPTH rather than wall-hugging,
which is better on two counts: it reads instantly (you can SEE the surface) and it makes the
vertical axis matter in the one level that is a room. Every collectible worth having is under it.

Gated on the sea's s-span, not on depthAt alone — depthAt returns a bare -1 outside the span
and that is indistinguishable from "1 unit above the surface", so reading it naively would have
quietly scaled ambient drain on every level in the game. Caught before it shipped.

Level: cardia (still teal, so the fundus can REVEAL the sea) -> fundus (the teaching room:
huge, low tide, nothing kills you fast) -> body (the sea proper, tide rises while you are in
it) -> antrum (no safe air left, only speed) -> pyloric antrum (the Guardian). H. pylori is
taught alone in the dome and tested in a rising sea; pepsin swarms scale 3 -> 6; bezoar_chunk
is a new catalogue row for the stomach's traffic.

L3 has NO commensals and no biofilm gate, which is anatomically exact — acid sterilises, which
is why H. pylori is famous for surviving it. So BIOME STANDING goes quiet for nine minutes and
comes back in L4, which makes L4's colonies read as relief rather than furniture.

C's sim: par 540s vs par-pace 555s ("requires pushing above par-pace"), pressure
3.75/1.50/2.44/2.16, min clearance 7.15 vs the 2.5 law, all 21 checkpoint gaps under 30s.
par.score corrected 9000 -> 5500, because 9000 was above everything the level can actually pay.

Deferred, and said out loud rather than quietly dropped: churn cyclones. A vortex that flings
the player is a FORCE and no hazard in the tree applies one; it wants the same A/B work as the
Guardian's arena churn and should land with it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 00:26:31 +10:00
type-two
f9aeaf259f [lane B+C] L1 Oral Cavity: the tutorial, and the Mast Cell — the boss you win by not shooting
L1 has been a 2-event skeleton since round 1, waiting (in its own status field) on "Lane B's
arena-mode controller". That exists now, so C's round2_plan is built as written: molar
crush-cycles, the saliva tide, amylase droplets, the three samples exactly where C put them
(behind the molars / under the tongue / a tonsillar crypt), and the epiglottis exam. 24 events.

The teaching order is the level: move (orbs, no current) -> LOOK (the arena opens and you can
stop, which no other level allows) -> shoot (one droplet, then two) -> coat (the molar ring
grazes you, mucin is right there) -> RESTRAINT -> flow returns (the tide, the funnel) -> the
exam. Every verb alone, in the calmest room in the game, before anything is asked of it. Two
hazards are deliberately re-used rather than invented: the molar crush IS a ring_gate and the
saliva tide IS a non-lethal surge, so L2's gates and its reflux finale become callbacks instead
of new ideas.

THE MAST CELL (LANE_C_NOTES §Boss specs 5) sits at the exact midpoint. A sentinel immune cell:
cyan, no attack, no chase, inert aura (auraDps 0 — it shares the floater's drift branch and its
aura does literally nothing). Fly past and the encounter just ends. Shoot it and it degranulates
— droplets close in from the walls (which is how "the cavity swells shut" is expressed, because
a runtime tube radius is not in Lane A's contract), the coat bleeds, and past half health the
airway closes on a 25s timer. You always get through. The only question is what you get through.

It needed a new boss `kind: 'sentinel'` with its own update path, because forcing a thing with
no rings and no windows through the phase machine would have been worse than a branch. Damage is
the failure state, so every number describes a consequence rather than a fight.

Verified, all three player choices: SPARE -> "spared", coat untouched at 100, karma +25, score 0.
SHOOT -> "degranulated", coat 100->56. KILL -> "anaphylaxis-survived", coat 100->6. Score is 0 in
every case: shooting it buys literally nothing, so no medal can ever reward the mistake.

Two bugs the testing paid for: `def.phases[0]` crashed on a boss that has no phases, and the
first degranulation drain (5/s) was UNDER the player's 8/s coat regen — measured coat going
80 -> 100 during a histamine cascade, i.e. the punishment was healing you. Now 14 and 22, which
are net -6/s and -14/s against regen.

L1 is no longer a skeleton: its checkpoint-gap and zero-samples warnings are gone, and the
campaign now opens on a real tutorial instead of an empty mouth with a gate at the end.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-26 00:13:52 +10:00
type-two
a318cf09f7 [lane B+C+F] The Appendix Sovereign: the secret boss, and a reputation you cannot fake
Two boss specs written to C's format (LANE_C_NOTES §Boss specs, round 3 additions) and the
first of them built. Both extend the roster along C's own law — one boss, one pressure — onto
the two axes the game had systems for and no boss pointed at: reputation (§4 Sovereign) and
restraint (§5 Mast Cell, specced only).

THE SOVEREIGN. The appendix is not vestigial: it is a biofilm reservoir where the gut's flora
shelter and re-seed the colon after a purge, and the whole fight is that fact. It is the only
boss whose existence is decided before you arrive — read once on entry:
  karma >= 70  THE COMMUNION — no fight at all. Full coat, a permanent phage escort. The
               reward for five levels of restraint is being spared a boss.
  karma >= 30  THE TOLL — P1 only.
  below        THE SOVEREIGN — three phases. P1's matrix is immune to the cannon and only the
               antacid torpedo disperses it (a mature biofilm's whole defining trait); P2 is a
               quorum bloom that re-armours when the room gets crowded; P3 is a 20s reseed run.
And the mechanic that makes it this boss: the lair is seeded with YOUR OWN FLORA, and it feeds
on dysbiosis — every commensal your stray fire kills re-armours a plate, live, mid-fight.

KARMA vs STANDING — a real bug found in testing, and worth the extra number. `standing` is a
SPENDABLE meter: a full bar is consumed to bud an ally, dropping to a 50 floor. That meant a
perfect player could never HOLD >= 70, so the Communion was almost unreachable — verified: a
symbiotic pilot showed standing 50 and was demoted to "toll". `karma` is the same inputs with
nothing spending it. The Sovereign's tier and gates' `secretTo` branches read karma; E's bar
still reads standing.

Also: boss.js generalised to a registry, which was the claim its header made — the Sovereign
needed zero changes to enemies.js. LS_appendix (3 segments, 800 units, 16 events), reached from
L4's ileocecal valve via `secretTo`/`secretNeed` — anatomically exact, the appendix hangs off
the cecum right past that valve. The secret is hidden behind conduct, not behind a wall.

C's selfcheck caught par.time as a free medal and the fix improved the design: par 160 sits
under the timid traversal, so only a Communion run (which has no fight) can beat it. The time
medal rewards the same conduct the level is about.

Verified: all three tiers branch correctly (communion = 0 nodes + 4 phages; toll = 1 phase;
full = 3 phases, 4 armoured); killing a commensal mid-fight re-armours a plate (reason
"dysbiosis"); the valve routes karma 100 -> LS_appendix and karma 0 -> L5. Levels 5/5 valid.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 23:25:36 +10:00
type-two
1e4775ab12 [lane C] L4 Small Intestine: the long maze — the campaign doubles in length
The first new level since L2, and the campaign's endurance beat. 7 segments, 6000 units,
63 events, ~10 minutes. Authored entirely from systems that already exist — no new engine work.

The three acts are anatomy, not invention: duodenal bulb -> descending duodenum (the ampulla,
where bile enters) -> jejunum -> deep jejunum -> ileum -> terminal ileum -> ileocecal valve.
Giardia really colonises the duodenum/jejunum and Peyer's patches really concentrate in the
ileum, so the difficulty curve IS the gut's own immune gradient: you fly from the quiet
absorptive end into the lymphoid end and the walls get angrier.

Identity vs L2: flow 8-10 against L2's 12-20, curviness up to 0.70, fog 0.050. L2 punishes bad
reflexes; L4 punishes bad reading. Segmentation ring gates (the small bowel's real motility)
teach at 70% open and test at 43% in an 8-unit lumen.

Three catalogue rows carry the new fiction onto existing archetypes — chyme_clump (floater),
neutrophil_hunter (seeker), bifido_colony (flora). The ileocecal biofilm gate at s5500 is the
first time the reputation loop pays out at a level's END rather than mid-level.

C's own tooling verifies it: selfcheck 4/4 valid, and --sim reports par 600s vs par-pace 576s
("par is reachable at par-pace throttle"), a pressure curve of 1.00/1.43/1.90/2.46/1.65/2.69/
1.63, min clearance 3.62 vs the 2.5 law, all 22 checkpoint gaps <= 29.3s. Driven end-to-end
in-engine: all six entity types spawn, biofilm fires at 5500, valve gate completes to L5.

The GDD's Tapeworm miniboss is not here — no boss framework exists yet. It goes in at ~5500
when that lands; the level notes say so.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-25 22:27:41 +10:00
type-two
3c059f20db [lane B+C+F] The biofilm gate: the reputation cash-out, "it helps you in level 5" made real
The deeper payoff of the flora loop. A new `biofilm` level event: cross one and combat checks
BIOME STANDING — high enough (>= need), the native flora PART the biofilm, budding a wave of phage
allies + refilling coat, then spending the goodwill; too low, it stays sealed and you run the
gauntlet raw. Emits `biofilm {opened}` so E can voice both.

- combat/index.js: biofilmGate(ev) on the level:event pump (fields need/allies/coat).
- levels/index.js: the selfcheck knows the `biofilm` type now (validates need 0..100).
- L2: one demoed at s2500 — the opening flora/akkermansia/beacon let you BANK standing, and the
  gate cashes it into a phage escort right before the hiatus + reflux finale.

The mechanism is complete; L5 also gets the fast-route/Appendix branch when that level + world
support land. Verified in-engine: high standing -> opened, 3 phages, coat 50->90; low -> sealed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 00:16:12 +10:00
type-two
fce26abfab [lane B+C] Three more microbes: the swarm, the driller, and the reward beacon
Roster round-2, batch 2 — three new archetypes, mostly reusing existing behaviour branches:
- virion (norovirus): a tiny fast swarmer, its own pool of 40 so a cloud reads as a swarm.
  Shares the seeker branch (chase + dissolve on contact). The arithmetic threat. -> L5.
- driller (H. pylori): a TANKY corkscrewer (hp 50). Seeker chase + a rotating perpendicular
  drift (the helix), and it does NOT dissolve on contact — it grinds you and keeps drilling,
  so you must out-damage it. A new behaviour branch. -> L3 stomach; previewed in L2 at s2240.
- beacon (Faecalibacterium): the reward-state commensal. Shares the commensal branch, heals
  AND gives the biggest standing (25) with no coat cost. A bright cyan octahedral gem, the
  special one of the family. -> L5; previewed in the L2 breather at s1580.

Verified in-engine: driller corkscrews + survives contact; virion is tiny + dissolves; beacon
heals coat and spikes standing to 50% in two tends. Three clean distinct silhouettes (gem /
cone / dot-swarm).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 00:03:34 +10:00
type-two
b2d9b46c30 [lane B+C] Giardia: the latch, and boost becomes a dodge
The first foe with an ATTACH state machine, and the first that gives boost a defensive job.
Giardia chases like a seeker, CLAMPS its ventral suction disc onto your hull, and drains coat
while it rides — until a boost's i-frames throw it (or it lets go after attachMax, then can't
re-grab for reattachCd). The counterplay is timing a boost, not out-running it.

- enemies.js: `latcher` archetype — a two-state (chase / attached) branch. Attached, it rides
  player.pos + a spin offset and drains `drain`/tick; ps.iframeT > 0 (boost) detaches and flings
  it clear. Amber tetrahedron (the trophozoite), so a clinging one reads on the hull.
- levels/enemies.js: ARCHETYPES += latcher; catalogue `giardia_latch` (biome small_intestine).
- L2: one Giardia previewed on the open thoracic run (s1940) — it belongs to L4's villi maze,
  but the grab works in a flow tube, so it teaches the boost-dodge verb now.

Verified: it chased + clamped, drained coat 100->84 while attached, and a simulated boost
(iframeT) shook it off.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:45:21 +10:00
type-two
b0abbaf76b [lane B+C] C. difficile: the kill that isn't clean
A foe whose corpse keeps hurting — the definitive colon enemy. C. diff drifts with a corrosive
aura like any floater, but on death it leaves a SPORE_CLOUD: a static acid-green zone that
damages anything in it for ~5s, then disperses. Killing it costs you the ground it died on
(shoot the cloud to clear it, or fly around).

- enemies.js: two archetypes. `cdiff` (amber octahedron, shares the floater drift+aura branch)
  drops a `spore_cloud` in kill(), placed at the death spot. `spore_cloud` (acid-green per the
  readability law, foe:false so the phage ignores it and clearing it never scores) is static,
  damages on contact, and counts down a `life`. Entities gained a `life` field (only the cloud
  uses it).
- levels/enemies.js: ARCHETYPES += cdiff; catalogue `cdiff_bloom` (biome large_intestine —
  registered for L5's encounter pass, not shoehorned into the esophagus).

Verified: killing a cdiff dropped a cloud at its death spot; sitting in it dropped coat 100->89;
the cloud expired after its life. Amber octahedron vs acid-green blob — clean read.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:38:15 +10:00
type-two
aae1ebdcfd [lane B+C] Akkermansia: spend coat to summon allies sooner
The cleverest node in the reputation loop — a commensal that eats your mucus. Brushing it
COSTS coat but fills BIOME STANDING fast (gain 12 vs flora's 5): the "spend coat for a quicker
phage ally" trade against flora's safe heal-and-slow.

- enemies.js: flora's branch generalised to a shared COMMENSAL branch, sign-flipped by data
  (cfg.coat gifts, cfg.coatCost nibbles); flora:tended now carries `gain`. New `mucus_grazer`
  archetype — cyan (still flora, readability law), but a dodecahedron amoeba-blob so the coat
  cost reads as a different bug, not a betrayal by the healing rod.
- combat/index.js: standing gain comes from the event's `gain`.
- levels: ARCHETYPES += mucus_grazer; catalogue `akkermansia`; L2 teaches it at s210, right
  after the flora reef so the same-colour / opposite-trade contrast lands.

Verified: brushing it dropped coat 100->88 while standing hit 36% in 3 tends (4x flora's rate);
distinct blob vs the flora capsule.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 20:30:17 +10:00
type-two
71b0663b77 [lane B+C] The phage ally: tend the flora and the biome fights for you
The first ALLY, and the reputation loop that earns it — "don't shoot the biome, it helps you"
(V2_IDEAS) made mechanical.

- combat/enemies.js + balance.js: the `phage` archetype. A friendly seeker that hunts the
  nearest FOE (not the player) and rams it — a bacteriophage bursts its host after `bursts`
  hits. Fast (26 > every foe) so it catches things, fragile (hp 8) so it is spent, not a wall.
  Entities now carry a `foe` flag (foes true; flora + phage false); kill() generalised so ANY
  ally scores nothing and never combos. Fallback silhouette is a bare icosahedron = the phage's
  real icosahedral capsid. Teal (EMISSIVE.ally), distinct from cyan "don't shoot" flora.

- combat/index.js: BIOME STANDING — one run-scoped float. flora:tended raises it, flora:harmed
  drops it 25; at the symbiotic threshold the biome BUDS a phage near you (capped 3, 3s cooldown),
  spending standing. Emits `standing {value}` for a future Lane E meter.

- levels/enemies.js: ARCHETYPES += phage; catalogue `phage`.

Verified deterministically in-engine: tending flora budded a phage, which hunted a spore_pod foe
(30hp) and rammed it dead; three-colour readability holds (amber foe / teal ally / cyan friend).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 16:36:03 +10:00
type-two
0ac11ae040 [lane B+C+D] Microbes, friend and foe: the GLB loader, a friendly commensal, and a distinct-mesh yeast
The round-2 microbe pass, vertical slice. Cross-lane (integrator call): the point was one
thread proven end to end — art pipeline in, friend and foe out.

- core/assets.js (D): the GLB loader, finally wired. GLTFLoader was vendored but never
  imported and the manifest had 0 models, so enemies.js's `glb?.geometry` hook was dead code.
  Now every manifest model preloads (AWAITED — pools set geometry at construction, a late load
  can't retrofit an InstancedMesh) into ONE BufferGeometry normalized to a unit bounding
  sphere; get('models',n).geometry lights up the hook. Optional-asset law intact: any failure
  -> no geometry -> procedural fallback.

- combat/enemies.js + balance.js (B): two new archetypes.
    flora     — the FIRST FRIEND. Cyan (ART_BIBLE: flora reads friendly). Drifts like a
                floater but its aura HEALS (sheds coat), never harms. Shootable — and shooting
                it is the reputation trap: kill() gives no score, no combo, emits flora:harmed.
                Verified: the aura fires player.refill({coat}); a shot flora scores 0.
    spore_pod — a foe yeast cluster: the floater's drift+aura, but its OWN pool so its blobby
                GLB will not reskin the food-debris floater.
  Pool geometry now scales a GLB by the archetype radius (GLBs ship unit-normalized).

- levels/enemies.js (C): ARCHETYPES += flora, spore_pod; catalogue entries lacto_drifter
  (Lactobacillus) + yeast_pod (Candida). L2 gets a light teach beat in the calm opening — a
  friendly reef at s180, one yeast at s300, both off the racing line.

Ships playable as glowing primitives (a capsule + an icosahedron), exactly like the rest of
the round-1 roster; the Trellis/Hunyuan meshes drop in via the manifest with no code change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-19 15:13:30 +10:00
jing
2e85ec0622 [lane C] Round 2 WIP (session cut off): schema v2, surf-aware pacing, chase analysis, --probe
Landed before the cut: schema v2 (segments[].wave.amp override, validated — breathe stays
biome-owned); hiatus re-authored tight AND calm (radius back to 6.5, amp 0.6, 3.3u steady
clearance); par 210 -> 180 with full rationale (below throttle-only par-pace, above a surf
run — the medal teaches the mechanic); finale surge 21 -> 24 so surfing is the stylish
escape (required 1.20x); surf profile reads A's live CREST_FACTOR; chaseAnalysis() +
escapability laws in validate; NEW --probe builds A's real canal and measures clearance
against the model (all L2 segments clear the 2.5 floor, hiatus 3.75); isMain guard +
importSpline shim — fixes A's selfcheck process.exit killing C's mid-run (qa.sh had been
green on one level out of three).

Cut off before: fly-through of the integrated build (blocked on B), pickup economy handover
(B proposed numbers in balance.js meanwhile — reconcile), L1 encounter design doc, GDD boss
folding, NOTES. Committed by F to protect the shared tree; levels selfcheck 3/3 GREEN.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:26:42 +10:00
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