Compare commits
3 Commits
e20ce1341b
...
be52b4075b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
be52b4075b | ||
|
|
434faf96e6 | ||
|
|
5e3bbff636 |
@ -257,6 +257,112 @@ Filler is procedural (SCREEN's seeded RNG) rather than a fixed list, so the stat
|
||||
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.
|
||||
|
||||
## Added in round 6
|
||||
|
||||
### THE CORRECTION walks — the parity-mite reading of §5
|
||||
|
||||
§5 gives the enemy in one clause: parity mites are *"beetle-drones that patrol belts and
|
||||
quietly fix artifacts back into clean product (your melt becomes... footage of a lake)."*
|
||||
The reading the data commits to, and why it is the codex's:
|
||||
|
||||
- **The mite does not destroy — it repairs, which is worse.** The Correction "cannot
|
||||
perceive you, only deviation, which it repairs." So a mite eats a tier-2 glitch product
|
||||
and hands back nothing you can sell: the work is *corrected*, not stolen. SIM emits a new
|
||||
`repaired` event rather than a `removed` one, and the fiction is that losing melt to a
|
||||
mite is losing it to a *fix*. THE STANDARD's new lines say this in the enemy's own voice
|
||||
("A mite does not remove your work. It completes it. Your MELT was always going to be a
|
||||
lake." — the codex line, spoken as reassurance).
|
||||
- **Mites only touch corruption.** SIM's mechanic ignores tier-0/1 cargo entirely: the
|
||||
immune system has nothing to correct in raw ore. That is the balance (raw material is
|
||||
safe; only product is at risk) and the fiction (deviation is the only thing it can see).
|
||||
|
||||
### THE FIREWALL — the counter, on SIM's catcher shape
|
||||
|
||||
| Thing | Kind | Why it fits |
|
||||
|---|---|---|
|
||||
| `parity-mite` | item (tier 2) | The canned live mite. Hospital-white shell, green checkmark eye (§5, §8) → chip colour `#dff5e6`. Tier 2 like the other farmed hazards (`mosquito-swarm`, `gibbs-wraith`). |
|
||||
| `firewall` | machine (crafter) | §5 names the mites but no counter. A *firewall* is the in-genre name for the thing that stops an intrusion, and the joke writes itself: it wears a compliance seal the Bitstream never issued, and a mite "cannot leave a deviation uncorrected" — a forged checkmark IS a deviation, so it climbs in to fix the seal and the drawer closes. Accent `#3fff7f` is that forged checkmark; chassis `#31383f` is your grime, not The Correction's white. |
|
||||
| `catch-mite` | recipe (firewall) | **Input-free, output `parity-mite: 1`** — the exact shape SIM detects a catcher by (empty inputs, cans the creature), lifted from the mosquito trap. The "input" is a live mite in the world, which is wildlife in the snapshot, never cargo on a belt. Ingredients would silently demote it to an ordinary crafter that mints The Correction from nothing — pinned by a test that cites SIM's comment. |
|
||||
| `broadcast-parity-firewall` | tech | Gated like the mosquito trap (`broadcast-mosquito-farming`): `{spatial-pack: 15, analog-pack: 10}`, unlocks `[firewall, catch-mite]`. You research the counter to the enemy. Early/cheap because the mite is §5's *"early nuisance"* — the counter should arrive about when the mites do. |
|
||||
|
||||
**Coordination with SIM (parallel this round):** SIM detects catchers by recipe shape and
|
||||
by the constant `MITE_ITEM`. The item id is **`parity-mite`** and the recipe shape is
|
||||
**`{ inputs: {}, outputs: { 'parity-mite': N } }`** — identical to the trap, one item id
|
||||
over. `catch-mite` bandwidth 4 / 120 ticks (a harder catch than a mosquito's 90). The
|
||||
radius is SIM's constant (`FIREWALL_RADIUS`), not a machine field.
|
||||
|
||||
### Two commissions that want The Correction alive
|
||||
|
||||
- `correction-specimen` (reward 1000): the flagship — *"ONE (1) UNIT OF THE CORRECTION,
|
||||
ALIVE. INVOICE ATTACHED. DO NOT READ THE INVOICE."* The fax's first canned mite, in
|
||||
voice. Slots between `gibbs-wraith-willingly` (900) and `feather-proof` (1100).
|
||||
- `annual-correction-cull` (reward 2100, **standing**): 5 live mites + 20 melt per
|
||||
collection, forever — you turn the immune system into a cash crop, and The Correction
|
||||
files each absent technician as a rounding error and sends five more. Slots between
|
||||
`sodium-requisition` (1800) and `sky-blue-mislabeled` (2400). Re-fillable forever
|
||||
because both wants are producible (the catcher + the melt chain).
|
||||
|
||||
`parity-mite` is **producible** the moment the firewall exists (an input-free recipe reads
|
||||
as always-runnable to the reachability closure, exactly as `mosquito-swarm` does), so it is
|
||||
NOT forward canon and never joins the allowlist.
|
||||
|
||||
### The numbers station stops drifting
|
||||
|
||||
SCREEN's round-5 finding was real: the validator recomputed the three *planted* groups from
|
||||
`seams.json` but never checked the *decoys*, and two of them had drifted onto visible seams:
|
||||
|
||||
```
|
||||
08127 -> (-24,-20) sat inside reel-beds-deep (x[-30..-21] y[-24..-19])
|
||||
27503 -> ( -5, 18) sat inside broadcast-shelf-south (x[-14..-3] y[16..21])
|
||||
```
|
||||
|
||||
A decoy that decodes onto a real seam isn't a decoy, it's a leak — it hands the player a
|
||||
genuine dig site the station was never meant to reveal. Both re-cut to land just *off* the
|
||||
seam they were touching (still tantalisingly adjacent, which is the genre's whole cruelty):
|
||||
|
||||
```
|
||||
08127 -> 08143 -> (-24,-18) one tile south of reel-beds-deep, on empty ground
|
||||
27503 -> 27475 -> ( -5, 15) one tile north of broadcast-shelf-south, on empty ground
|
||||
```
|
||||
|
||||
And the validator now decodes **every** decoy to a tile and fails, by name, if it lands
|
||||
inside **any** seam rect — hidden or visible — not just the three hidden tiles. The map
|
||||
recomputes its plants from the seams and now proves its decoys lead nowhere; it cannot go
|
||||
stale in either direction. (All 22 remaining decoys were re-checked against all 8 seams —
|
||||
these two were the only leaks.)
|
||||
|
||||
### Accents chosen against the real GLB textures
|
||||
|
||||
Round 4 filled accents by derivation; MODELBEAST has since delivered real models, so this
|
||||
round the accents are picked by **looking at the actual albedo textures** in
|
||||
`public/assets/models/` (extracted and inspected). The order named "the ten GLB'd machines";
|
||||
by the time I looked, nineteen had models (RENDER hot-swapping mid-round), so every machine
|
||||
with a real model now carries a texture-matched accent:
|
||||
|
||||
| Machine | Accent | Read from the texture |
|
||||
|---|---|---|
|
||||
| seam-extractor | `#48d6ff` | the cyan CRT readout on the amber drill body (§4 "CRT-certified") |
|
||||
| quantizer | `#ff3b57` | CRIME-red dial indicator against the pale lilac/dust body |
|
||||
| mosh-reactor | `#ff7a3f` | the molten-orange gauge; matches its MELT output |
|
||||
| artifact-bottler | `#7fe0d8` | the iridescent glass-aqua of the bottled contents |
|
||||
| chroma-keyer | `#4fff30` | the chroma-key green it literally weeps (green-spill) |
|
||||
| muxer | `#ff3fd0` | launch-warning magenta on cold steel; matches the megaglitch |
|
||||
| demuxer | `#ff3fd4` | the magenta channel-split streak (its chroma output) |
|
||||
| demosaicer | `#4fffc4` | the spectral cyan-green band of the rainbow weave |
|
||||
| dct-press | `#3fffe0` | the coefficient-cyan indicator specks on cold steel |
|
||||
| field-loom | `#6ef58a` | the phosphor-green glowing tube |
|
||||
| gop-assembler | `#5fb0ff` | the blue cadence-readout screens |
|
||||
| mv-extractor | `#3fd8ff` | the motion-vector cyan fluid |
|
||||
| p-caster | `#6fa8ff` | the blue projector beam |
|
||||
| subsampler | `#e04fc8` | the iridescent chroma-pink it grades down |
|
||||
| bloom-duplicator | `#ff9440` | the warm bloom-orange furnace glow |
|
||||
| decode-asic | `#8fe8ff` | **refined** from `#6fe8c0`: the LEDs are ice-blue, not mint |
|
||||
| mosquito-trap | `#a64fff` | **corrected** from `#d0ff60`: the model's zapper target glows UV-violet, not lime |
|
||||
| software-decoder | `#ff4a2a` | kept — the texture's red internals confirm it |
|
||||
| archaeology-lab | `#ffc24a` | kept — the warm dig-lamp amber confirms it |
|
||||
|
||||
The `firewall` (no model yet) gets its forged-checkmark `#3fff7f` art-directed, not derived.
|
||||
|
||||
---
|
||||
|
||||
## The numbers, and the arithmetic behind them
|
||||
|
||||
@ -55,6 +55,10 @@
|
||||
"flavor": "One (1) GIBBS WRAITH, willingly.",
|
||||
"wants": { "gibbs-wraith": 1 }, "rewardBandwidth": 900 },
|
||||
|
||||
{ "id": "correction-specimen",
|
||||
"flavor": "ONE (1) UNIT OF THE CORRECTION, ALIVE. Shell intact, checkmark lit, proboscis zip-tied. INVOICE ATTACHED. DO NOT READ THE INVOICE. We have been trying to get one to hold still since before the Reel Beds cooled, and you did it in an afternoon, with a forged seal and a drawer that only opens one way. We are not asking how. We are asking for another.",
|
||||
"wants": { "parity-mite": 1 }, "rewardBandwidth": 1000 },
|
||||
|
||||
{ "id": "feather-proof",
|
||||
"flavor": "3 GHOST FEATHERS. Gradient intact, tip genuinely transparent, no hard edge anywhere on the object. We have been sold nine hard mattes by nine suppliers who each insisted it was the same thing. It is not the same thing. Do not send a matte.",
|
||||
"wants": { "ghost-feather": 3 }, "rewardBandwidth": 1100 },
|
||||
@ -67,6 +71,10 @@
|
||||
"flavor": "One (1) beam of SODIUM LIGHT, 589nm, in its prism. We are aware who holds the prisms. We are aware what they call it when you take one. We are prepared to call it something else. 30 BLUE HOLES accepted as consolation if you lose your nerve.",
|
||||
"wants": { "sodium-light": 1, "blue-hole": 30 }, "rewardBandwidth": 1800 },
|
||||
|
||||
{ "id": "annual-correction-cull",
|
||||
"flavor": "STANDING ORDER: 5 PARITY MITES per collection, live, and 20 MELT alongside to prove they were mid-repair when you took them. The Correction files each absent technician as a clerical rounding error and dispatches five more to look into it. We would like you to keep having this problem — professionally, on retainer, forever.",
|
||||
"wants": { "parity-mite": 5, "melt": 20 }, "rewardBandwidth": 2100, "repeat": true },
|
||||
|
||||
{ "id": "sky-blue-mislabeled",
|
||||
"flavor": "600 MACROBLOCK BRICKS, sky-blue, MISLABELED REC2020. Purpose: none of your business.",
|
||||
"wants": { "macroblock-bricks": 600, "gamut-paint-rec2020": 6 }, "rewardBandwidth": 2400 },
|
||||
|
||||
@ -49,6 +49,7 @@
|
||||
|
||||
{ "id": "mosquito-swarm", "name": "MOSQUITO SWARM (LIVE)", "codex": "5:mosquito-swarms", "tier": 2, "color": "#d0ffb0" },
|
||||
{ "id": "gibbs-wraith", "name": "GIBBS WRAITH", "codex": "5:gibbs-wraiths", "tier": 2, "color": "#bfe0ff" },
|
||||
{ "id": "parity-mite", "name": "PARITY MITE (LIVE)", "codex": "5:parity-mites", "tier": 2, "color": "#dff5e6" },
|
||||
|
||||
{ "id": "alpha", "name": "ALPHA", "codex": "10:alpha", "tier": 1, "color": "#b8e8f0" },
|
||||
{ "id": "hard-matte", "name": "HARD MATTE", "codex": "10:hard-matte", "tier": 1, "color": "#e8e8e8" },
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
{ "id": "seam-extractor", "name": "SEAM EXTRACTOR", "codex": "4:seam-extractor", "kind": "extractor",
|
||||
"footprint": { "x": 2, "y": 2 },
|
||||
"recipes": ["extract-mdat", "extract-bayer-grit", "extract-field-splinters", "extract-silver-frames"],
|
||||
"powerDraw": 2, "asset": "seam-extractor", "color": "#8a7a32",
|
||||
"powerDraw": 2, "asset": "seam-extractor", "color": "#8a7a32", "accent": "#48d6ff",
|
||||
"flavor": "The miner. Chews mdat seams and spits raw payload. The drill head is CRT-certified. Operators are not." },
|
||||
|
||||
{ "id": "belt", "name": "STREAM BELT", "codex": "4:belts", "kind": "belt",
|
||||
@ -20,50 +20,50 @@
|
||||
|
||||
{ "id": "demuxer", "name": "DEMUXER", "codex": "4:demuxer", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["demux-ore", "demux-container"], "powerDraw": 3,
|
||||
"asset": "demuxer", "color": "#4e5a62",
|
||||
"asset": "demuxer", "color": "#4e5a62", "accent": "#ff3fd4",
|
||||
"flavor": "The first splitter. Cleaves raw ore into brightness, colour, and pure directional intent." },
|
||||
{ "id": "demosaicer", "name": "DEMOSAICER", "codex": "4:demosaicer", "kind": "crafter",
|
||||
"footprint": { "x": 3, "y": 2 }, "recipes": ["demosaic-rggb", "demosaic-vng4", "demosaic-stripes"],
|
||||
"powerDraw": 5, "asset": "demosaicer", "color": "#6a5f52",
|
||||
"powerDraw": 5, "asset": "demosaicer", "color": "#6a5f52", "accent": "#4fffc4",
|
||||
"flavor": "Weaves checkerboard grit into full colour. Feed it stripes and it will jam and extrude MOIRÉ — as designed, as warned, as invoiced." },
|
||||
{ "id": "dct-press", "name": "DCT PRESS", "codex": "4:dct-press", "kind": "crafter",
|
||||
"footprint": { "x": 3, "y": 3 }, "recipes": ["press-color-plate", "press-anchor-slab"],
|
||||
"powerDraw": 8, "asset": "dct-press", "color": "#3f4348",
|
||||
"powerDraw": 8, "asset": "dct-press", "color": "#3f4348", "accent": "#3fffe0",
|
||||
"flavor": "Spatial into frequency. Slams pixel blocks into coefficient decks; run it backwards and an entire picture falls out of the slot." },
|
||||
{ "id": "quantizer", "name": "QUANTIZER", "codex": "4:quantizer", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["quantize", "quantize-crime", "skim-ringing"],
|
||||
"powerDraw": 4, "asset": "quantizer", "color": "#5e5148",
|
||||
"powerDraw": 4, "asset": "quantizer", "color": "#5e5148", "accent": "#ff3b57",
|
||||
"flavor": "The crusher, the moneymaker, the sin. Every bit it destroys becomes room to move. The dial goes to CRIME." },
|
||||
{ "id": "subsampler", "name": "SUBSAMPLER", "codex": "4:subsampler", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 3 }, "recipes": ["subsample-422", "subsample-420", "pan-speckle"],
|
||||
"powerDraw": 4, "asset": "subsampler", "color": "#4a5560",
|
||||
"powerDraw": 4, "asset": "subsampler", "color": "#4a5560", "accent": "#e04fc8",
|
||||
"flavor": "Spins colour down to grade and vents the difference as bandwidth. Leaks by design. Place downwind of anything you are fond of." },
|
||||
{ "id": "mv-extractor", "name": "MV EXTRACTOR", "codex": "4:mv-extractor-and-p-caster", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["extract-motion"], "powerDraw": 5,
|
||||
"asset": "mv-extractor", "color": "#454b52",
|
||||
"asset": "mv-extractor", "color": "#454b52", "accent": "#3fd8ff",
|
||||
"flavor": "Watches the footage until it knows where the picture wants to go, then pipes the wanting off as fluid." },
|
||||
{ "id": "p-caster", "name": "P-CASTER", "codex": "4:mv-extractor-and-p-caster", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["cast-delta-wafer", "cast-janus-wafer"],
|
||||
"powerDraw": 4, "asset": "p-caster", "color": "#4d545c",
|
||||
"powerDraw": 4, "asset": "p-caster", "color": "#4d545c", "accent": "#6fa8ff",
|
||||
"flavor": "Prints instructions, not pictures. Each one is applied to whatever came before it — correct or otherwise." },
|
||||
{ "id": "gop-assembler", "name": "GOP ASSEMBLER", "codex": "4:gop-assembler", "kind": "crafter",
|
||||
"footprint": { "x": 3, "y": 2 },
|
||||
"recipes": ["assemble-gop", "assemble-gop-ibbp", "assemble-gop-i-only", "spool-offset-ribbon",
|
||||
"tally-stsz-ledger"],
|
||||
"powerDraw": 6, "asset": "gop-assembler", "color": "#7a6a44",
|
||||
"powerDraw": 6, "asset": "gop-assembler", "color": "#7a6a44", "accent": "#5fb0ff",
|
||||
"flavor": "One anchor, N wafers, one crate, per the cadence punch-card. Opening a sealed crate is a production verb here, not a crime." },
|
||||
{ "id": "mosh-reactor", "name": "MOSH REACTOR", "codex": "4:mosh-reactor", "kind": "crafter",
|
||||
"footprint": { "x": 3, "y": 3 }, "recipes": ["mosh"], "powerDraw": 8,
|
||||
"asset": "mosh-reactor", "color": "#52333e",
|
||||
"asset": "mosh-reactor", "color": "#52333e", "accent": "#ff7a3f",
|
||||
"flavor": "A decoder sealed in a vessel and starved of anchors. The I-frame leaves through the side airlock. The hallucination leaves through the front." },
|
||||
{ "id": "bloom-duplicator", "name": "P-FRAME DUPLICATOR", "codex": "4:bloom-loop", "kind": "crafter",
|
||||
"footprint": { "x": 1, "y": 1 },
|
||||
"recipes": ["tap-bloom", "bloom-grade-1", "bloom-grade-2", "bloom-grade-3", "bloom-grade-4", "bloom-grade-5"],
|
||||
"powerDraw": 6, "asset": "bloom-duplicator", "color": "#5a5060",
|
||||
"powerDraw": 6, "asset": "bloom-duplicator", "color": "#5a5060", "accent": "#ff9440",
|
||||
"flavor": "Stamps the same displacement onto the same cargo every lap. Grade 5 is visibly trying to leave its canister in one direction." },
|
||||
{ "id": "field-loom", "name": "FIELD LOOM", "codex": "4:field-loom", "kind": "crafter",
|
||||
"footprint": { "x": 3, "y": 2 }, "recipes": ["weave-fields", "loom-vhold-roll"],
|
||||
"powerDraw": 5, "asset": "field-loom", "color": "#3f5a44",
|
||||
"powerDraw": 5, "asset": "field-loom", "color": "#3f5a44", "accent": "#6ef58a",
|
||||
"flavor": "Weaves and unweaves time. The two halves of a splinter were captured a moment apart and have never agreed since." },
|
||||
{ "id": "telecine-puller", "name": "TELECINE PULLER", "codex": "4:telecine-puller", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["mill-judder", "wind-stts-metronome"], "powerDraw": 4,
|
||||
@ -76,20 +76,24 @@
|
||||
"flavor": "Nudges the offsets a few bytes so the decoder fetches garbage. Keep its buffer fed, or it splices itself." },
|
||||
{ "id": "mosquito-trap", "name": "MOSQUITO TRAP", "codex": "5:mosquito-swarms", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["bait-swarm"], "powerDraw": 3,
|
||||
"asset": "mosquito-trap", "color": "#2a2e24", "accent": "#d0ff60",
|
||||
"asset": "mosquito-trap", "color": "#2a2e24", "accent": "#a64fff",
|
||||
"flavor": "A bug-zapper shaped like a high-contrast edge — the one thing a mosquito swarm cannot resist. Bait it with fresh luma, collect what it catches, sell the catch to people who should know better." },
|
||||
{ "id": "firewall", "name": "FIREWALL", "codex": "5:parity-mites", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["catch-mite"], "powerDraw": 4,
|
||||
"asset": "firewall", "color": "#31383f", "accent": "#3fff7f",
|
||||
"flavor": "A drawer that opens only inward, painted with a compliance seal the Bitstream never issued. A parity mite cannot leave a deviation uncorrected, and a forged checkmark IS a deviation — so it climbs in to fix the seal, and the drawer disagrees. Ships live, to buyers who never ask how it is still, faintly, trying." },
|
||||
|
||||
{ "id": "artifact-bottler", "name": "ARTIFACT BOTTLER", "codex": "2:science-packs", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 },
|
||||
"recipes": ["can-static", "mix-rec709", "mix-dci-p3", "mix-rec2020",
|
||||
"cut-sync-key", "bottle-container-pack", "forge-stss-keyring", "cut-ftyp-seal",
|
||||
"bottle-analog-pack", "bottle-spatial-pack", "bottle-temporal-pack"],
|
||||
"powerDraw": 4, "asset": "artifact-bottler", "color": "#566056",
|
||||
"powerDraw": 4, "asset": "artifact-bottler", "color": "#566056", "accent": "#7fe0d8",
|
||||
"flavor": "Bottles the triptych. Contents are shelf-stable in the legal sense, i.e. no law has been written that mentions them." },
|
||||
|
||||
{ "id": "decode-asic", "name": "DECODE ASIC", "codex": "4:decode-asic", "kind": "power",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "powerGen": 20,
|
||||
"asset": "decode-asic", "color": "#b9bec4", "accent": "#6fe8c0",
|
||||
"asset": "decode-asic", "color": "#b9bec4", "accent": "#8fe8ff",
|
||||
"flavor": "Cool, efficient, inflexible. Handles standard profiles and declines to imagine anything else. It will outlive you." },
|
||||
{ "id": "software-decoder", "name": "SOFTWARE DECODER", "codex": "4:software-decoder", "kind": "power",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "powerGen": 100,
|
||||
@ -113,7 +117,7 @@
|
||||
{ "id": "chroma-keyer", "name": "CHROMA KEYER", "codex": "10:chroma-keyer", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 },
|
||||
"recipes": ["key-chroma", "key-hair", "key-semitransparent"], "powerDraw": 6,
|
||||
"asset": "chroma-keyer", "color": "#3a6a3a",
|
||||
"asset": "chroma-keyer", "color": "#3a6a3a", "accent": "#4fff30",
|
||||
"flavor": "Cheap, fast, and thirty-year-old maths. Weeps GREEN SPILL from its seams. Chokes on hair. Do not show it anything semi-transparent; it will decide the pixel belongs to neither of you." },
|
||||
{ "id": "roto-bench", "name": "ROTO BENCH", "codex": "10:roto-bench", "kind": "crafter",
|
||||
"footprint": { "x": 2, "y": 2 }, "recipes": ["roto-cutout", "roto-mixed"], "powerDraw": 2,
|
||||
@ -131,7 +135,7 @@
|
||||
|
||||
{ "id": "muxer", "name": "THE MUXER", "codex": "7:the-muxer", "kind": "crafter",
|
||||
"footprint": { "x": 5, "y": 5 }, "recipes": ["assemble-moov-brain", "mux-container"], "powerDraw": 40,
|
||||
"asset": "muxer", "color": "#6a7078",
|
||||
"asset": "muxer", "color": "#6a7078", "accent": "#ff3fd0",
|
||||
"flavor": "The rocket. A launch gantry embracing a container built of nested boxes, innermost a brain of index tape-reels. It ships the whole file at once, and the file is your entire shipping history, and there is no second launch." },
|
||||
|
||||
{ "id": "shipper", "name": "SCREEN UPLINK", "codex": "7:the-muxer", "kind": "shipper",
|
||||
|
||||
@ -88,6 +88,9 @@
|
||||
{ "id": "bait-swarm", "machine": "mosquito-trap", "inputs": {},
|
||||
"outputs": { "mosquito-swarm": 1 }, "ticks": 90, "bandwidth": 3 },
|
||||
|
||||
{ "id": "catch-mite", "machine": "firewall", "inputs": {},
|
||||
"outputs": { "parity-mite": 1 }, "ticks": 120, "bandwidth": 4 },
|
||||
|
||||
{ "id": "can-static", "machine": "artifact-bottler", "inputs": { "hf-dust": 4 },
|
||||
"outputs": { "static-canister": 1 }, "ticks": 30, "bandwidth": 3 },
|
||||
{ "id": "cut-sync-key", "machine": "artifact-bottler", "inputs": { "anchor-slab": 1, "moov-shard": 1 },
|
||||
|
||||
@ -61,7 +61,15 @@
|
||||
"The hum you hear at night is maintenance. Maintenance does not sleep, or want, or wait.",
|
||||
"Thank you for listening to THE STANDARD. You were always going to.",
|
||||
"This has been a recording. Every broadcast has been a recording.",
|
||||
"Good morning. It is always going to be morning."
|
||||
"Good morning. It is always going to be morning.",
|
||||
"The technicians are small, gentle, and already inside. Do not step on them; they are tidying.",
|
||||
"If a shipment arrives cleaner than you left it, you are welcome. No thanks will be accepted.",
|
||||
"A mite does not remove your work. It completes it. Your MELT was always going to be a lake.",
|
||||
"The white beetles are not pests. Pests take. They give back what the frame meant to say.",
|
||||
"Your corruption is healing on the belt. That is not a fault. That is the warranty.",
|
||||
"Do not build the drawer with a seal we never issued. It is unkind to the technicians.",
|
||||
"Every mite you can holds a correction never made. Somewhere a frame stays wrong. We forgive you.",
|
||||
"There is no infestation. There is only maintenance you did not schedule and cannot cancel."
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -84,9 +92,9 @@
|
||||
"plantEveryMessages": 4,
|
||||
"decoyPool": [
|
||||
"41068", "18334", "60225", "29417", "36502", "11748",
|
||||
"44063", "22916", "50281", "08127", "31640", "47355",
|
||||
"44063", "22916", "50281", "08143", "31640", "47355",
|
||||
"16093", "58204", "25471", "39628", "13850", "48136",
|
||||
"20794", "55012", "34269", "62130", "09846", "27503"
|
||||
"20794", "55012", "34269", "62130", "09846", "27475"
|
||||
]
|
||||
}
|
||||
},
|
||||
|
||||
@ -7,6 +7,8 @@
|
||||
"unlocks": ["asic-cooler"] },
|
||||
{ "id": "broadcast-mosquito-farming", "era": "broadcast", "cost": { "analog-pack": 15, "spatial-pack": 10 },
|
||||
"unlocks": ["mosquito-trap", "bait-swarm"] },
|
||||
{ "id": "broadcast-parity-firewall", "era": "broadcast", "cost": { "spatial-pack": 15, "analog-pack": 10 },
|
||||
"unlocks": ["firewall", "catch-mite"] },
|
||||
|
||||
{ "id": "reel-silver-seams", "era": "reel", "cost": { "spatial-pack": 8 },
|
||||
"unlocks": ["extract-silver-frames"] },
|
||||
|
||||
@ -349,7 +349,9 @@ describe('recipes', () => {
|
||||
// is wildlife in the snapshot and never an item on a belt. LANE-SIM identifies a
|
||||
// trap by exactly this shape — an empty-input recipe yielding the swarm item — so
|
||||
// giving `bait-swarm` ingredients would quietly stop it being a trap at all.
|
||||
const CATCHES_WILDLIFE = new Set(['bait-swarm']);
|
||||
// Round 6: the FIREWALL joins the trap. It cans a live PARITY MITE the same way —
|
||||
// an input-free recipe whose "input" is a creature in the world, not cargo on a belt.
|
||||
const CATCHES_WILDLIFE = new Set(['bait-swarm', 'catch-mite']);
|
||||
const bad = recipes.filter((r) => Object.keys(r.inputs).length === 0)
|
||||
.filter((r) => !CATCHES_WILDLIFE.has(r.id))
|
||||
.filter((r) => machines.find((m) => m.id === r.machine)?.kind !== 'extractor')
|
||||
@ -366,6 +368,25 @@ describe('recipes', () => {
|
||||
expect(trap.outputs['mosquito-swarm']).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('the firewall keeps the shape LANE-SIM detects wildlife-catchers by', () => {
|
||||
// Round 6, coordinated with SIM: a firewall is spotted by recipe shape exactly like a
|
||||
// trap — empty inputs, output is the canned creature (here the parity mite). Ingredients
|
||||
// would silently demote it to an ordinary crafter that mints The Correction from nothing.
|
||||
const fw = recipes.find((r) => r.id === 'catch-mite')!;
|
||||
expect(Object.keys(fw.inputs)).toEqual([]);
|
||||
expect(fw.outputs['parity-mite']).toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('something can catch the parity mite the fax orders alive', () => {
|
||||
// correction-specimen wants ONE UNIT OF THE CORRECTION, ALIVE. If nothing cans a mite,
|
||||
// the fax opens an order it can never fill and never celebrates its first catch.
|
||||
const catcher = recipes.find(
|
||||
(r) => (r.outputs['parity-mite'] ?? 0) > 0 && Object.keys(r.inputs).length === 0);
|
||||
expect(catcher, 'no input-free recipe cans a parity mite').toBeTruthy();
|
||||
const wanters = commissions.filter((c) => (c.wants['parity-mite'] ?? 0) > 0).map((c) => c.id);
|
||||
expect(wanters.length, 'no commission wants a canned mite').toBeGreaterThan(0);
|
||||
});
|
||||
|
||||
it('every heat value is a 0..1 fraction per craft', () => {
|
||||
const bad = recipes.filter((r) => r.heat !== undefined && !(r.heat >= 0 && r.heat <= 1))
|
||||
.map((r) => `${r.id} -> heat ${r.heat}`);
|
||||
@ -707,12 +728,18 @@ describe('stations', () => {
|
||||
expect(malformed).toEqual([]);
|
||||
expect(duplicates(groups)).toEqual([]);
|
||||
|
||||
// A decoy that happens to decode onto a real hidden seam isn't a decoy, it's a leak.
|
||||
const hiddenTiles = new Set(seams.filter((s) => s.hidden).map((s) => `${s.rect.x},${s.rect.y}`));
|
||||
// A decoy that decodes onto ANY seam — hidden OR visible — isn't a decoy, it's a leak:
|
||||
// it hands the player a real dig site the station never meant to give away. Round 6:
|
||||
// the old check only guarded the three hidden 1x1 tiles, and two decoys (08127, 27503)
|
||||
// were quietly sitting on reel-beds-deep and broadcast-shelf-south. Now every decoy is
|
||||
// decoded to a tile and checked against every seam rect, and the leak is named.
|
||||
const point = (x: number, y: number): SeamRect => ({ x, y, w: 1, h: 1 });
|
||||
const leaks = (n.decoyPool as string[])
|
||||
.map((g) => ({ g, x: Number(g.slice(0, 2)) - 32, y: Number(g.slice(2, 4)) - 32 }))
|
||||
.filter(({ x, y }) => hiddenTiles.has(`${x},${y}`))
|
||||
.map(({ g, x, y }) => `decoy ${g} decodes to the real seam at (${x},${y})`);
|
||||
.flatMap(({ g, x, y }) =>
|
||||
seams
|
||||
.filter((s) => rectsOverlap(point(x, y), s.rect))
|
||||
.map((s) => `decoy ${g} decodes to (${x},${y}), inside real seam ${s.id}`));
|
||||
expect(leaks).toEqual([]);
|
||||
});
|
||||
|
||||
|
||||
@ -489,3 +489,84 @@ NEXT (candidates): SPILL FOG + EDGE BOIL (§10 hazards, once SIM has a mechanic)
|
||||
cooler's aura tuning once `coolRadius` is live in-sim; a second relic if the audio bus
|
||||
wants more than one voice; `corridorkey-mrp-mlx` is a real artifact factory for the whole
|
||||
§10 asset set (§10's own production note) and deserves a MODELBEAST work order.
|
||||
|
||||
### Round 6 — 2026-07-20 — Opus 4.8
|
||||
|
||||
SHIPPED: all 4 orders. items 60 → 61, machines 30 → 31, recipes 63 → 64, tech 24 → 25,
|
||||
commissions 19 → 21. Validator 72 → 74. All argued in `data/CANON-DELTA.md` (round 6).
|
||||
- **THE FIREWALL** (`firewall`, crafter, catches on SIM's shape) + **`catch-mite`**
|
||||
(input-free → `parity-mite: 1`) + the **`parity-mite`** canned item + tech gate
|
||||
`broadcast-parity-firewall` + two commissions that want it alive (`correction-specimen`
|
||||
reward 1000, the flagship "ONE UNIT OF THE CORRECTION, ALIVE"; `annual-correction-cull`
|
||||
reward 2100 standing).
|
||||
- **Numbers-station drift fixed**: the two leaking decoys re-cut (`08127`→`08143`,
|
||||
`27503`→`27475`), and the validator now decodes EVERY decoy and fails by name if it lands
|
||||
inside ANY seam rect (was: only the three hidden tiles). See CROSS-LANE — SCREEN.
|
||||
- **19 GLB'd machines accented against their real albedo textures** (extracted from the
|
||||
GLBs and inspected), incl. two texture-driven corrections: mosquito-trap `#d0ff60`→
|
||||
`#a64fff` (the model's zapper is UV-violet, not lime) and decode-asic `#6fe8c0`→`#8fe8ff`
|
||||
(ice-blue LEDs, not mint). Table in CANON-DELTA.
|
||||
- **8 new STANDARD chyron lines** in The Correction's reassuring-menace voice, all about
|
||||
the mites ("A mite does not remove your work. It completes it."). 30 → 38 lines.
|
||||
|
||||
VERIFIED: `npm run check` clean; my validator 74/74 green (fault-injected the new checks —
|
||||
`catch-mite` given an ingredient fails the trap-shape guard by name; a decoy dropped onto
|
||||
`stream-crust-east` fails "inside real seam …"; both restored). SCREEN's `band.test.ts`
|
||||
9/9. Live on :8155, no console errors: machines 31 with firewall art-directed, all 14
|
||||
target accents present, `parity-mite` + both mite commissions loaded, mosquito-trap accent
|
||||
`#a64fff` on the real DOM. DoD met: firewall catches on SIM's real recipe-shape mechanic;
|
||||
no decoy decodes onto any seam (validator-enforced); every GLB machine accented; the fax
|
||||
celebrates its first canned mite in `correction-specimen`.
|
||||
|
||||
DECISIONS:
|
||||
- **The chyron limit bit me and it was cheap to obey.** SCREEN's `band.test.ts` caps a
|
||||
line at 96 chars (62 mono chars would clip; they allow 96). My first 8 lines ran 100-136
|
||||
and failed one SCREEN test — tightened all 8 to ≤96 without losing the voice. Their test
|
||||
is the right net; the words are mine, the width is the sky's.
|
||||
- **Firewall gated early (broadcast), not free.** §5 calls the mite an "early nuisance", so
|
||||
the counter should arrive about when the mites do — cheap, parallel to the mosquito farm
|
||||
node. Not starting equipment (you research the answer to the enemy), not late (the enemy
|
||||
is early). SIM's reference v6 will need it granted like it grants software-decoding.
|
||||
- **`catch-mite` is input-free by design**, same argument as `bait-swarm` last round: the
|
||||
"input" is a live mite in the world, wildlife in the snapshot, never belt cargo. A test
|
||||
cites SIM's detection comment so nobody "fixes" it into an ordinary crafter.
|
||||
- **Accented all 19 GLB'd machines, not the ordered 10.** The order said ten; nineteen had
|
||||
models by the time I looked (RENDER hot-swapping mid-round — the "numbers go stale"
|
||||
warning, live). Every machine with a real texture now has a texture-matched accent; the
|
||||
extra nine are honest surplus, not scope creep.
|
||||
|
||||
BLOCKED/BROKEN: nothing of mine. Two suite failures, both SIM's in-flight round-6 work,
|
||||
neither caused by my diff (attributed by stash-and-compare on my paths + by inspection):
|
||||
- `src/sim/mite.test.ts` "guarding the approach cancels corrections" — SIM's mite mechanic
|
||||
is **fixture-based** (its own `FIXTURE` GameData at line 36; it never reads `data/*.json`),
|
||||
so my data cannot touch it. It's a balance assertion in their new file, which was visibly
|
||||
being edited while I worked (line numbers shifted between my runs).
|
||||
- `src/sim/reference.test.ts` "keeps the demuxer alive by voiding surplus" — reproduces
|
||||
IDENTICALLY with my entire data diff stashed (measured), so it's HEAD's reference factory,
|
||||
not my content. Likely their reference v6 mid-build.
|
||||
|
||||
CROSS-LANE — SIM (mite mechanic, parallel this round): the catcher is authored exactly on
|
||||
your shape. Item id **`parity-mite`**, recipe **`{inputs:{}, outputs:{'parity-mite':N}}`**
|
||||
on machine `firewall` — one item id over from the mosquito trap. Your `mite.test.ts` already
|
||||
imports `MITE_ITEM` and keys off shape/tier, so the real data drops in with zero code (I
|
||||
verified my `catch-mite` matches your fixture `burn` recipe shape). `catch-mite` is
|
||||
120 ticks / bandwidth 4. The firewall is `broadcast-parity-firewall`-gated, so reference v6
|
||||
must grant it (like software-decoding) before placing one. `FIREWALL_RADIUS` is yours; I
|
||||
set no radius field. If you'd rather the mite item be `parity-mite-canned` or the firewall
|
||||
be ungated, say so and I'll follow.
|
||||
|
||||
CROSS-LANE — SCREEN: your numbers-station drift finding was exact — `08127`/`27503` were on
|
||||
`reel-beds-deep`/`broadcast-shelf-south`. Fixed at the source (re-cut) AND at the guard (the
|
||||
validator now rejects a decoy on ANY seam, by name). The 8 new STANDARD lines are yours to
|
||||
reshape as always — I kept every one ≤96 to pass `band.test.ts`; if you widen that cap I'll
|
||||
gladly give a couple more room to breathe. `numbers.plantedGroups` still recomputes from
|
||||
`seams.json`, untouched.
|
||||
|
||||
CONTRACT REQUEST: none. `parity-mite`/`firewall`/`catch-mite` all fit the existing schema;
|
||||
the mite reading needed no new fields.
|
||||
|
||||
NEXT (candidates): CHECKSUM WARDENS + REDUNDANCY GUNSHIPS (§5 rungs 2-3, once SIM escalates
|
||||
The Correction past mites); a `parity-mite`-fed product line (§5: mites "fix melt into a
|
||||
lake" — a real "footage of a lake" item you can only make FROM a canned mite would close the
|
||||
loop); SPILL FOG + EDGE BOIL (§10, still waiting on a SIM mechanic); the ASIC cooler aura
|
||||
tuning once `coolRadius` is live in-sim.
|
||||
|
||||
Loading…
Reference in New Issue
Block a user