glytch/fktry/data/CANON-DELTA.md
type-two dbb3615a64 [data] the composite seam + a tech tree that can actually be bought
Round 4 orders, all five.

The headline is a bug I authored: the v4 gating rule (any id in a
TechDef.unlocks is locked until that tech completes) turned three rounds of
tech authoring into a total bootstrap deadlock. Measured: melt not producible
at tick 0 (first-taste impossible), 0 of 24 techs reachable — every pack chain
gated behind packs you cannot make. disc-artifact-bottling cost 10 analog packs
and unlocked the only machine that bottles analog packs.

Fixed as a shape, not a patch, and both rules are now tests:
- the M1 melt chain is starting equipment (so first-taste is possible, and
  RENDER's era derivation correctly reads it as starting equipment)
- one pack is craftable at tick 0 — SPATIAL, made from the quantizer's own
  sins, so your first research is a study of your own damage
23/23 nodes now reachable; six emptied disc nodes deleted (no lane references
tech ids).

Also:
- §10 THE COMPOSITE SEAM transcribed: alpha/hard-matte/blue-hole/fringe-lace/
  green-spill/mixed-pixel/roto-chatter/ghost-feather/sodium-light (forward
  canon), matte bath, optical printer, chroma keyer, roto bench, neural keyer
  (powerDraw 240 — the codex's "appetite that dwarfs everything").
- ARCHAEOLOGY LAB canonized (kind: lab), ungated — a lab behind research is a
  lab you can never build.
- ASIC cooler live: the round-3 spec of 0.02 would have meant "never heats,
  free 100/s". Retuned to 0.0018, sane under both readings of the contract.
- accents where output-derivation can't work; CODEX_REF regex widened for §10.

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

20 KiB
Raw Blame History

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).


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.

Retuned to 0.0018, which lands well under either reading of the contract's "this machine's coolPerTick also applies" — deliberately, because SIM hasn't built it yet and I don't want the design resting on my guess of an ambiguous sentence:

                        throttle   scram   period   duty   avg gen
decoder alone            10.1 s    14.5 s   23.9 s   30 %   25.8 /s
+ cooler, ADDITIVE       46.7 s    66.7 s   39.3 s   85 %   72.1 /s
+ cooler, REPLACING      15.6 s    22.2 s   20.4 s   55 %   46.4 /s
+ cooler at 0.02 (r3)    never     never      —     100 %  100.0 /s   <- broken either way

Both readings are playable and both are worth the tech, so SIM can implement either and the design holds. Per tile, which is the real question 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 + cooler (additive) 77.1 /s over 8 tiles = 9.64 /s per tile

So the pairing is the best power in the game per tile (1.9× ASICs) — and it costs a tech, 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.

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, mosquito-swarm, gibbs-wraith remain forward canon (no recipe). 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 in data/validate.test.ts are mirrored from src/sim/index.ts (throttle 0.7, restart 0.5, dissipation default 0.004, 30 tps). They are not exported, so my arithmetic tests can't import them. If SIM retunes the curve, my tests go stale silently — they'd still pass while the feel drifts. Re-check on any heat round. A cheap fix if SIM likes: export the constants.
  • 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.