glytch/fktry/data/CANON-DELTA.md
type-two f2da81a9cf [data] the ladder, the ground, and the broadcast schedule
Round 5 (MEGA), all eight orders.

THE COMMISSION LADDER — the fax is the tutorial. The queue used to open on
one MELT, i.e. "build eight machines correctly, in order, with no feedback
until the last one works". Now four rungs teach one mechanic each and never
say so: 20 raw ore (extractor->belt->uplink) -> 15 luma (the demuxer, and the
slurry is your problem) -> 18 hf-dust (waste is inventory) -> 1 melt
(graduation; first-taste keeps its id, reward 50->80). Measured against SIM's
real sim: rung 1 clears at tick 650 = 21.7s with 4 machine types, against a
3-minute budget.

data/seams.json — seam regions per stratum, richness, and a seam-free
relicReserve in the SE so SIM's seed-derived optical fossil always has
somewhere legal to land. stream-crust-west covers all three reference-factory
extractors, pinned by a test.

data/stations.json — the whole dial: FKTRY FM, THE STANDARD (30 lines of
Correction propaganda, 10 minutes before a repeat), NUMBERS, DEAD AIR. The
numbers station is a real treasure map: each 5-figure group is
[x+32][y+32][richness*9] and three of them are the hidden seams. The validator
recomputes them from seams.json, so the map cannot drift, and no decoy is
allowed to decode onto real treasure.

Also:
- mosquito trap: input-free recipe, the shape LANE-SIM detects traps by (my
  first pass took ingredients, which would have silently made it an ordinary
  crafter). Unblocks vaporwave-sunset after four rounds; FORWARD_CANON pruned.
- cooler final 0.0018 -> 0.001: the additive ruling made two coolers immortal.
  Now 1 doubles output, 2 nearly eliminates downtime, 3 is an absurd shrine.
- SIM's tuning constants imported; the hand-copies are retired.
- the optical fossil canon: §1's fossils "sing when excavated", so the world is
  silent until you dig up the severed audio bus. One margin hint, mid-ladder.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 13:47:08 +10:00

493 lines
29 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# CANON-DELTA — everything in `data/` that isn't in the codex yet
LANE-DATA owns this file. `../../docs/FKTRY_LORE.md` is canon; this is the ledger of
where the data has run ahead of it. The orchestrator absorbs these into the lore doc in
one pass later. Until then, **this is the single place canon-drift is allowed to live**.
Rule for adding an entry: the codex was silent, I invented in its voice, and I wrote
down *why it is consistent with the codex* — not just what I did. If a future lore pass
disagrees, the codex wins and the data changes.
---
## Canonized in round 1 (orchestrator: "CANONIZED", round 2 review)
| Thing | Kind | Why it fits |
|---|---|---|
| `press-anchor-slab` | recipe (dct-press) | The press run backwards is an IDCT, and an IDCT *is* a complete picture. §4 already runs the field loom and the telecine puller in reverse, so reversibility is established machine behaviour. This is where I-frames come from. |
| `color-plate` | item | §4 demosaicer literally outputs "a smooth colour sheet"; it needed an id. |
| `v-hold-roll` | item | §1 Broadcast Shelf has "v-hold faults that make whole regions periodically roll upward". Bottling one gives the ANALOG PACK's "combing + v-hold roll + static" triptych three real ingredients. |
| `artifact-bottler` | machine | §2 calls the science packs "a bottled artifact triptych" but names no bottling plant. Something has to hold the bottle. |
| `lane-splitter` | machine | The contract has `kind: 'splitter'` and belts need routing, but §4 only ever calls the DEMUXER "the first splitter" — which is a refinery, not a junction. |
## Added in round 2
### The container line (unblocks `stream-hex-splicing`)
§2 names the CONTAINER PACK's contents ("moov shard + offset ribbon + sync key") and §7
names the moov brain's parts, but nothing said where they come from. The chain now
mirrors what the parts actually *are* in a real container:
| Thing | Kind | Why it fits |
|---|---|---|
| `moov-shard` | item | The index, not the payload. |
| `offset-ribbon` | item | The stco map — a ribbon of byte offsets. |
| `sync-key` | item | The stss table lists which frames are keyframes, i.e. I-frames. |
| `demux-container` | recipe (demuxer) | The demuxer is the machine that separates index from payload. 8 ore → 2 shards: the index is a rounding error next to the mdat, which is the joke and also the truth. |
| `spool-offset-ribbon` | recipe (gop-assembler) | The assembler is the only machine that knows where each frame starts, because it put them there. |
| `cut-sync-key` | recipe (artifact-bottler) | Cut from an anchor slab, because stss is a list of anchors. |
| `bottle-container-pack` | recipe | Assembles the §2 triptych. |
Chicken-and-egg check: §4 says the hex splicer "Requires CONTAINER PACK research", so the
container line deliberately does **not** route through the splicer. It is demuxer →
assembler → bottler, all machines you already own.
### The bloom line
§3 sells bloom "by intensity grade; grade-5 bloom visibly tries to escape its canister in
one direction" — five grades, one item each, `bloom-grade-1..5`.
- `bloom-concentrate` is **kept** and redefined as the raw, ungraded draw-off from a loop
(`tap-bloom`). It was not deleted because LANE-SCREEN hardcodes it in
`src/screen/corruptionMap.ts:54` and its test — deleting it would have broken another
lane's suite mid-round. Grading now consumes it.
- The recipe id `bloom-grade-3` survives from round 1 but now produces the *item*
`bloom-grade-3`, so the id finally means what it says. `tap-bloom` is the renamed
round-1 `bloom-grade-3` recipe. **Deprecation notice:** no recipe id was retired, but
`bloom-grade-3` changed its inputs/outputs entirely. Nothing outside `data/` referenced
it (checked: only my own `tech.json`).
- Escalation is in delta wafers, not exotic inputs — a grade-5 canister is 2 raw bloom +
18 wafers of compounding, which is §4's "contents compound each lap" priced honestly.
## Added in round 3
### THE MUXER and the moov brain (§7, data-first — mechanics are M4's)
§7 names the parts and says each is "its own late-game production line", but never said
what makes them. Each part is now made by the machine that already owns that knowledge,
which is the whole joke: the container is assembled by the factory that made the mess.
| Thing | Made by | Why that machine |
|---|---|---|
| `stsz-ledger` | gop-assembler | The sample-size table. The assembler packed the crates, so it knows how big each one was. |
| `stco-map` | hex-splicer | The chunk-offset map — byte offsets are the splicer's entire domain. It nudges them for a living; here it writes them down honestly, under protest. |
| `stts-metronome` | telecine-puller | Time-to-sample is a cadence, and the puller is the cadence machine. Built from judder cams, so the metronome ticks 3:2. |
| `stss-keyring` | artifact-bottler | The sync-sample table is a list of I-frames, so it is literally forged from anchor slabs. |
| `ftyp-seal` | artifact-bottler | §7 names the ftyp seal as part of the container; it needed a source. |
| `moov-brain` | muxer | The four converge. 300 ticks. |
| `megaglitch` | muxer | `mux-container`: brain + seal + 500 mdat ore + 100 melt, 900 ticks. §7's "colossal composited corruption" priced like one. |
`muxer` is `kind: 'crafter'`, not `'shipper'` — it *builds* the megaglitch, and you still
have to ship the thing. 5×5, the biggest footprint in the game, per "hero structure".
### ASIC COOLER (spec'd, deliberately not yet mechanical)
§2 HEAT says heat is "Vented by ASIC coolers" — a machine the codex names and never
specifies. Authored now so the data is ready; **the mechanic is deferred to M4**, when
SIM builds auras. Gated behind `broadcast-asic-cooling` so it can't appear early.
- **Intended mechanic (SIM, when auras exist):** an adjacency aura — every machine whose
footprint touches the cooler's 2×2 gets the cooler's `coolPerTick` (0.02) instead of
its own. That turns the software decoder from a 30%-duty throb into something you can
*engineer around*: ring your decoders with coolers and pay for it in floor space and
build cost. This needs a contract change (`coolRadius?`, or a `kind: 'cooler'`) —
**not requesting it until SIM is ready to build it**, since a contract field nobody
reads is the same decorative trap heat just fell into.
- **Authored as `kind: 'power'` with `powerGen: 5`** because there is no cooler kind and
a lie is worse than a stretch: it is an ASIC, ASICs decode, decoding makes bandwidth.
It vents far more than it earns. If `kind: 'cooler'` ever lands, this moves.
- Its own `coolPerTick: 0.02` is inert today (nothing heats it) and is there to state the
intended aura strength in data rather than in prose.
## Added in round 4
### §10 THE COMPOSITE SEAM — transcribed
The codex grew §10, so most of this round is transcription rather than invention. Every
item and machine in §10 is now data. Deviations and judgement calls only:
| Call | Why |
|---|---|
| "Footage" = `anchor-slab` | §10's keyers key *footage*, but the codex never says what footage *is* as an item. The anchor slab is already "a complete, self-sufficient picture" (§2) — the only thing in the game you could point a keyer at. Every keyer takes slabs. |
| MATTE BATH's chemical = `static-canister` | §3 already says static canisters are "brine for preserving other artifacts". The bath needed a developer; the brine was sitting right there. |
| `ghost-feather` is made **only** by the neural keyer | §10: "every era below the neural keyer ruins it, so demand never dies." So the earlier machines *consume* it and ruin it — `bathe-feather` (feather → hard matte, "the machine does not apologize") and `key-hair` (feather → roto chatter). Both are jokes with a real cost, and both are the codex verbatim. |
| NEURAL KEYER `powerDraw: 240` | §10 says "24 VRAM — a bandwidth appetite that dwarfs everything else in the game", and "you don't unlock the neural keyer; you unlock the power plant it demands". 240/s is 12 decode ASICs, or ~9 software decoders after duty cycling. The whole M1 reference chain draws 96. It dwarfs the game, as ordered. |
| `sodium-light` has no recipe | §10: The Correction hoards the prisms. Forward canon; on the FORWARD_CANON allowlist. `sodium-requisition` commissions it anyway, with 30 BLUE HOLES accepted "if you lose your nerve". |
| ROTO BENCH is gated (disc), not free | §10 calls it "the economic floor under every keyer... the bench never does [fail]". Tempting to leave ungated, but ALPHA is "the rarest resource in the game" and an ungated bench hands it to you at tick 0. Gated cheaply (10 spatial) so the floor arrives early but the Composite Seam stays a mid-game fault. |
Optical printer ratios hurt, as ordered: 4 anchor slabs + 2 colour plates → **1** alpha and
4 fringe lace, over 240 ticks. It is the worst alpha-per-slab in the game and it fringes
every single run, which is exactly what the iron lung is for.
### THE ARCHAEOLOGY LAB (`kind: 'lab'`) — canonized
The codex has no lab: §6 only says "TECH TREE = MEDIA ARCHAEOLOGY. You research *downward*
(excavating older strata for analog secrets) and *upward* (deriving newer codecs)." So the
lab is the dig site — named for the verb the codex already uses, not a generic "research
station". Ungated starting equipment, because a lab behind research is a lab you can never
build (there is now a test named exactly that).
## Added in round 5
### THE COMMISSION LADDER — the fax is the tutorial
There is no tutorial in FKTRY and there should never be one. The fax machine is already
the game's voice, already tells you what to build, and is already sacred (§6: "do not ask
why it works"). So the first four commissions teach one mechanic each and the player never
knows they were taught.
| Rung | Wants | Teaches | Machine types needed |
|---|---|---|---|
| 1 `raw-payload` | 20 MDAT-ORE, raw | extractor → belt → uplink. The whole verb set. | 2 crafting (+belt, +uplink) |
| 2 `first-refinement` | 15 LUMA BARS | the demuxer — **and byproducts**: the slurry has to go somewhere and the fax does not care | 3 |
| 3 `dust-quota` | 18 HF DUST | the quantizer, and that **waste is inventory** | 4 |
| 4 `first-taste` | 1 MELT | graduation: the whole M1 chain, ore to reactor | 8 |
Rung 1's flavour is the instruction manual: *"A belt, a drill, an uplink to THE SCREEN —
that is the whole job."* Rung 2 hands you a byproduct and refuses to help. Rung 3 reframes
the garbage as product, which is the game's actual thesis. Rung 4 is the old opening
commission, reward bumped 50 → 80, now earned rather than assumed.
**Measured, not estimated** (throwaway probe against LANE-SIM's real sim, then deleted):
```
rung 1, built exactly as the fax describes — drill, 2 belts, uplink, one ASIC:
4 machine types. Cleared at tick 650 = 21.7 seconds.
```
The order was "completable inside 3 minutes with 4 machine types". It is completable in
**22 seconds**, which matters more than the budget suggests: the first fax must clear
before a new player decides nothing is happening.
Why this was needed at all: the queue used to open on `first-taste` — one MELT — which
requires ore → demuxer → quantizer → subsampler → p-caster → DCT press → GOP assembler →
mosh reactor. The game's first instruction was "build eight machines correctly, in order,
with no feedback until the last one works." That is the onboarding cliff.
### THE OPTICAL FOSSIL — why the world is silent until you dig
§1 buries the hook in one clause: the Reel Beds hold *"optical soundtrack fossils — wavy
photographic strips that **sing** when excavated."* Optical sound is a picture of a
waveform printed on film — the one place in this world where image and audio are the same
substance. So:
**The Bitstream has no audio because the audio track was severed from the container long
ago, and one length of it is still in the ground.** Everything before the fossil is found
is a video file with no sound: UI clicks and nothing else. Excavating it splices the audio
bus back into the file, and the whole band comes alive at once — the tuner, the stations,
the factory's own hum. The player doesn't unlock a feature; they repair the file.
This is why THE STANDARD's script includes *"Do not excavate. There is nothing in the
strata but strata"* and *"Anything that sings when you dig it up was never meant to be
heard."* The Correction runs a propaganda station warning you off the one artifact that
would let you hear the propaganda station for what it is. It is also why DEAD AIR's ghost
line is the only direct acknowledgement in the game that you found it.
The hint is one fax margin, mid-ladder, on `haunted-doorway` — *"[someone has drawn a sine
wave in the corner of this fax. it is not our department.]"* It points at nothing. A sine
wave is a sound and a drawing at the same time, which is exactly what the fossil is.
### THE MOSQUITO TRAP — the last forward-canon commission comes off the blocklist
§5 gives the trap in one line: *"Catchable in edge-baited traps"*, the asset note calling it
*"a bug-zapper shaped like a high-contrast edge target"*. Mosquitoes are quantization noise
made alive: they hatch from HF DUST and cluster on sharp edges. So the recipe is exactly
that sentence — **8 HF DUST + 1 LUMA BAR → 1 MOSQUITO SWARM (canned)**. The dust is where
they come from, the fresh luma bar is the sharp edge that baits them, and the whole thing
gives HF dust a third sink.
This unblocks `vaporwave-sunset`, which has wanted "3 MOSQUITO SWARMS (live)" since round 1
and been unfillable the entire time. `mosquito-swarm` leaves FORWARD_CANON; only
`gibbs-wraith`, `cinema-pack` and `sodium-light` remain, and all three are deliberate
(a wraith must come willingly, cinema needs the Fortress, and The Correction hoards the
prisms).
### `data/seams.json` — the ground
Schema is `{ relicReserve, seams: [...] }`; each seam is `{ id, era, resource, rect{x,y,w,h},
richness, hidden? }` on the -32..31 grid. Five ordinary seams, one per stratum, placed so
each era's codex-correct payload has a home: stream crust → mdat ore, disc mantle → bayer
grit (§2: "from the deepest camera-original seams"), broadcast shelf → field splinters,
reel beds → silver frames.
Two constraints drove the layout, both now tests:
- **The reference factory must stand on ore.** SIM's three 2×2 extractors sit at (-30,0),
(-30,-3) and (-30,3); `stream-crust-west` spans x[-31,-28] y[-5,6] and covers all three
with a tile to spare. Off-seam they'd idle with `'no seam'` and the demo would produce
nothing at all.
- **`relicReserve` is a seam-free corner** — x[12,31] y[12,31]. SIM plants the optical
fossil from the seed, 1828 tiles out, *never on a seam*. If seams creep across the whole
ring there may be nowhere legal left to put it, so the SE quadrant is kept deliberately
empty. A test fails the moment a seam intrudes.
`richness` is authored but currently unread — SIM's rule is boolean overlap this round. It
is there for when extraction rate goes data-driven, and it is what the numbers station
broadcasts as the last digit.
### `data/stations.json` — the broadcast schedule
Four stations, matching SCREEN's spec: **88.1 FKTRY FM** (generative, seeded, era-flavoured),
**AM 640 THE STANDARD** (30 chyron lines), **SW 6955 [UNLISTED]** (numbers), **108.0 DEAD AIR**.
THE STANDARD is The Correction with a transmitter, and the voice rule is that it never
threatens — it reassures, in a way that gets worse the longer you think about it. *"Your
file is being read by someone who loves it very much."* *"Loss is not loss. Loss is
compression that has finished negotiating."* *"Good morning. It is always going to be
morning."* 30 unique lines at the ~20s a chyron needs to be readable = 10 minutes before
a repeat, which is the DoD.
**The numbers station is a real treasure map.** Each 5-figure group encodes one coordinate:
```
[x + 32 as 2 digits][y + 32 as 2 digits][richness × 9 as 1 digit]
53079 -> x = 53-32 = 21, y = 07-32 = -25, richness 9/9 hidden-nitrate-vein
07579 -> x = 07-32 = -25, y = 57-32 = 25, richness 9/9 hidden-rainbow-pit
59399 -> x = 59-32 = 27, y = 39-32 = 7, richness 9/9 hidden-payload-lode
```
Three of the groups on air are the three `hidden: true` seams; the rest are decoys that
decode to empty ground. A player with a pencil gets three maximum-richness seams nobody
told them about. **The validator recomputes the planted groups from `seams.json`**, so if a
hidden seam ever moves and the broadcast doesn't, the test fails — the map cannot go stale.
It also checks no decoy accidentally decodes onto a real seam, because a decoy that points
at treasure isn't a decoy, it's a leak.
Filler is procedural (SCREEN's seeded RNG) rather than a fixed list, so the station never
loops — a hand-written pool of 24 would cycle in about two minutes and the genre's whole
menace is that it goes on forever.
---
## The numbers, and the arithmetic behind them
### The reference M1 chain (measured, not guessed)
Computed from `data/*.json` against the machine list in SIM's `meltChain()`
(`src/sim/sim.test.ts`), with the two recipes that test hand-dials applied:
```
idle draw (every machine's powerDraw) 57 /s
+ active recipe draw at full tilt 39 /s
= peak draw 96 /s
- compression paid back (quantize -6, 4:2:2 -4, 4:2:0 -8) 18 /s
= net peak demand 78 /s
```
**Units (RULED round 3):** `gen`/`draw` are bandwidth per **second**; `stored` and
`bufferCap` are bandwidth-**seconds**. My round-2 assumption held.
### Round 4: the tech tree was a total bootstrap deadlock
The v4 gating rule — *any id in a `TechDef.unlocks` is locked until that tech completes*
turned three rounds of tech authoring from decoration into a lock on the entire game. I
had written every node assuming gating didn't exist. Measured against the rule:
```
TICK 0, nothing researched:
melt producible? false <- first-taste, the opening commission, impossible
analog-pack producible? false
spatial-pack producible? false
temporal-pack producible? false
container-pack producible? false
RESEARCH CLOSURE: 0 of 24 techs reachable — every node stranded behind its own output
```
Every pack chain was gated behind packs you could not make. `disc-artifact-bottling` cost
10 analog packs and unlocked the only machine that can bottle an analog pack. The M1 melt
chain itself (mosh reactor, subsampler, `press-anchor-slab`) was gated, so the game opened
on an unbuildable factory and an unfillable commission, with no way to research out of it.
**The fix is a shape, not a patch.** Two rules now hold, and both are tests:
1. **The M1 melt chain is starting equipment** — ungated, so first-taste is possible at
tick 0. Ungating it also fixes RENDER for free: they derive a machine's era from the
tech that unlocks it and treat unmapped machines as starting equipment, which is exactly
what the M1 chain now is.
2. **One pack must be craftable at tick 0**, or research can never begin. That pack is the
**SPATIAL PACK** — macroblock bricks + ringing halos + slurry, all of which fall out of
the quantizer the player already owns. Your first research is a study of your own
damage, which is the most in-voice thing in the tree. Everything else chains off it:
spatial → analog → temporal → container → fortress.
Result: **23 / 23 nodes reachable**, unlock order tells a story (phosphor seams → field
loom → analog packs → telecine → temporal → container → fortress), and the only items
unreachable with the whole tree bought are the four declared forward-canon.
Six disc nodes were **deleted**, not repurposed, because their whole content became
starting equipment: `disc-artifact-bottling`, `disc-chroma-subsampling`,
`disc-macroblock-quarrying`, `disc-ringing-skim`, `disc-subsampling-420`,
`disc-mosh-reactor`. Grepped first — no lane references tech ids (RENDER reads
`unlocks` generically, never a specific node). Recorded here per the deprecation rule.
### Round 2's heat was decorative — what went wrong
Worth writing down, because it's a trap anyone can fall into. I sized round 2's
`heatPerTick: 0.0025` against *no* cooling. SIM then implemented heat with cooling shed
**every tick, active or not** (`HEAT_DISSIPATION = 0.004`). So the decoder shed 0.004 and
banked 0.0025: net **0.0015/tick**. It could never warm up. The number looked like a
mechanic and was a comment.
The lesson is now a test (`every heat source out-heats its own cooling`), and it caught a
second instance immediately: `chart-stco-map` banked 0.06 heat over 90 ticks while the
splicer shed 0.09 — I'd authored a fresh decorative number in this very round.
**Anything with a heat number must beat its own machine's cooling, or it isn't a
mechanic.** The validator now refuses both forms (per-tick machine heat, per-craft recipe
heat).
### The software decoder: `powerGen` 55 → 100, `heatPerTick` 0.0033, `coolPerTick` 0.001
Net while running = 0.0033 0.001 = **0.0023/tick**. Against SIM's curve (throttle 0.7,
scram 1.0, restart 0.5):
```
throttle, from cold 0.7 / 0.0023 / 30 = 10.1 s (target ~10 s)
scram, from cold 1.0 / 0.0023 / 30 = 14.5 s (target 13-15 s)
steady cycle, up 0.5 / 0.0023 / 30 = 7.25 s (heat 0.5 -> 1.0)
steady cycle, down 0.5 / 0.001 / 30 = 16.67 s (cools 1.0 -> restart 0.5)
period 23.9 s (target ~25 s)
duty 30.3 %
```
**Why the decoder cools slowly (0.001, vs the sim's 0.004 default):** it is an overclocked
tower PC held together with zip ties and prayer (§4). It is the worst-cooled object in the
factory. The ASIC has "a huge heatsink afro" and no heat source at all.
**Why powerGen had to nearly double.** SIM's hysteresis (scram at 1.0, restart at 0.5)
means any machine that throttles at ~10 s spends ~70% of its life cooling. At round 2's
55 gen that's an average of ~14/s — strictly worse than the ASIC's steady 20, so nobody
would ever build one and "burst gen" would be a lie. Averaged properly (generation is
throttled linearly 1.0 → 0.5 across the throttle window, and zero while scrammed):
```
un-throttled 0.2 / 0.0023 = 87.0 ticks at 100/s
throttled 0.3 / 0.0023 = 130.4 ticks at avg 75/s
energy per cycle = 100 x (87.0 + 130.4 x 0.75) = 18480 bandwidth-ticks
average = 18480 / 717 ticks = 25.8 /s
```
| | peak | duty | average | failure mode |
|---|---|---|---|---|
| DECODE ASIC | 20 /s | 100% | **20 /s** | none, forever |
| SOFTWARE DECODER | 100 /s | 30% | **25.8 /s** | total blackout, 16.7 s at a time |
Five ASICs at full song, one third of the time, in one 2×2 footprint. 29% more average
power for a supply that vanishes on a schedule you don't control — a real choice, and the
answer to "does anyone dare run two side by side" is still *no, not naked*: identical
decoders heat in lockstep and therefore black out in lockstep.
### `bufferCap: 240 → 300`
Re-derived against the retuned cycle, since the order was "one tank should cover one
decoder scram" and the scram window changed:
```
reference chain: peak draw 96 /s, compression pays back 18 /s -> net demand 78 /s
balanced plant: 3 ASIC (60/s steady) + 1 software decoder (25.8/s avg) = 85.8 /s ✓
decoder scrams: supply = 60 + 18 = 78 /s vs draw 96 /s -> deficit 18 /s
18 /s x 16.67 s = 300 bandwidth-seconds
bufferCap = 300 -> one tank rides out exactly one scram.
```
And it refills in time to do it again: while the decoder is up the plant makes 67/s more
than it spends, recharging 300 in **4.5 s** of the 7.25 s up-phase. That is the M2
sentence — **a buffer tank is what makes software decoders survivable** — and it now
closes.
### The ASIC cooler goes live: `coolPerTick 0.02 → 0.0018`, `coolRadius: 2`
Round 3 spec'd the aura at 0.02 while it was inert. **The moment it became mechanical that
number was catastrophic:** the decoder banks 0.0033/tick, so a 0.02 aura means net
0.0167 — it never heats at all, and a 2×2 cooler turns a 2×2 decoder into a permanent
free 100/s. A spec'd number and a live number are different objects; this is the second
time this round that a number only became wrong once something read it.
**Round 5, FINAL under the additive ruling.** Contracts v5 settled it: auras are additive,
capped at `HEAT_COOL_MAX`. That killed 0.0018 — additive, two coolers reach 0.0046 against
the decoder's 0.0033 gross, so a casual pair made it immortal. Final value **0.001**:
```
coolers cooling throttle at duty avg gen note
0 0.0010 10.1 s 30 % 25.8 /s bare decoder, as the codex demands
1 0.0020 17.9 s 61 % 51.5 /s the pairing — output doubles
2 0.0030 77.8 s 91 % 77.3 /s heavy investment, nearly continuous
3 0.0040 never 100 % 100.0 /s immortal: an absurd shrine to one PC
```
The shape is deliberate. One cooler is the worked example and it **doubles** the decoder's
average output — a real reward for engineering around heat. Two is a serious commitment
that nearly eliminates downtime. Three tips into immortality, which costs 12 tiles of
cooler wrapped around 4 tiles of decoder — visibly ridiculous, and in-voice: the codex's
software decoder is a tower PC "held together with zip ties and prayer", so a shrine of
coolers keeping one alive is the correct picture. Immortality is reachable, never casual.
Linear stacking means *some* number always cancels the heat; my job was choosing which
number, and making sure it isn't 2. Per tile, when both machines are 2×2:
```
2 decode ASICs 40.0 /s over 8 tiles = 5.00 /s per tile
1 software decoder, bare 25.8 /s over 4 tiles = 6.44 /s per tile
decoder + 1 cooler 56.5 /s over 8 tiles = 7.06 /s per tile (incl. the cooler's own 5)
```
So the pairing is the best power in the game per tile (1.4× ASICs) — and it costs two
techs, two machines, and the floor space to keep them adjacent. That is the reward for
engineering around heat instead of suffering it, which is what the cooler is *for*. The
bare decoder still beats a pair of ASICs per tile, but it does so in violent 30%-duty
bursts that a buffer tank has to absorb; the ASIC's 5.00 never wavers. Three ways to buy
power, three different failure modes.
### Research: is the first node affordable off a first-taste-era factory?
Worked path for the bootstrap pack, one bottler, one quantizer:
```
bottle-spatial-pack = 2 macroblock-bricks + 1 ringing-halo + 2 chroma-slurry, 60 ticks
2 bricks <- quantize-crime x1 (1 coefficient pack, 20 ticks)
1 halo <- skim-ringing x1 (3 coefficient packs, 40 ticks)
4 coefficient packs <- quantize x4 (4 luma, 120 ticks) <- 6 mdat ore
THE QUANTIZER IS THE BOTTLENECK: 20 + 40 + 120 = 180 ticks per spatial pack
= 10.0 packs / minute on one quantizer
```
Against the early nodes:
```
broadcast-phosphor-seams 5 spatial = 0.5 min
reel-silver-seams 8 spatial = 0.8 min
disc-roto-bench 10 spatial = 1.0 min
broadcast-field-loom 15 spatial = 1.5 min <- opens the ANALOG PACK
```
A player who has shipped their first melt already owns a quantizer and can afford the first
four nodes inside two minutes of production. That's the intent: **the opening research is
paid for with the quantizer's own sins** — you study your own damage. Later nodes scale to
tens of minutes and demand the analog/temporal/container chains, which is where the floor
space goes.
### `heat` on the hex splicer: `coolPerTick 0.001`, 0.08 per splice
Net 0.035 per craft after the 45 ticks of cooling → 28.6 crafts → **42.9 s** of continuous
splicing before it scrams (`chart-stco-map`: 50 s). A lesser fever than the decoder's
14.5 s, exactly as ordered. §4: "Requires ... a steady buffer feed or it splices *itself*"
— left running unattended, it stops itself.
---
## Open / deferred
- **The ASIC cooler's aura is spec'd, not built** (above). Until SIM has auras, heat is
survivable only by duty-cycling or by leaning on ASICs. Deliberate.
- `cinema-pack`, `gibbs-wraith`, `sodium-light` remain forward canon (no recipe;
`mosquito-swarm` retired from the list in round 5 when the trap landed). The
validator's FORWARD_CANON allowlist is the enforcement, and it has a companion test
asserting nothing sits on the list once it *is* producible. Round 3 retired
`container-pack`'s slot (round 2) and added none.
- Dials-as-recipes (quantizer Q, subsampler grades, GOP cadence) stays, per round-2 review.
- ~~The heat constants are mirrored by hand~~ **CLOSED (round 5)**: LANE-SIM exported them
in `src/sim/constants.ts` and the validator imports them. The copies are retired; if SIM
retunes the curve my arithmetic now fails loudly instead of asserting the old feel.
- The muxer, moov brain and megaglitch are data-only; no lane implements a victory
condition yet. The tech gate (`fortress-the-muxer`) keeps them out of reach meanwhile.