Review: all 5 lanes pass — 70/70 tests, tsc clean, ownership audit clean,
integration verified live (sim -> events -> UI ticker + SCREEN corruption).
Contracts v2 (granted from lane requests): UIBus.pickTile (wired), BeltItem.id?,
MachineDef.{color,flavor,heatPerTick,bufferCap}?, CommissionDef.repeat?,
SimEvent 'scram'. main.ts: non-left pointerdown no longer places. happy-dom added.
Rulings: canon melt chain IS M1 (masterplan updated); rank-routing stays, splitters
next; anchor-slab sanitizing -> Correction buyback fiction; build-bar paging approved;
per-lane dev ports 8151-8155. Round 2 orders written in all lane docs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
147 lines
8.9 KiB
Markdown
147 lines
8.9 KiB
Markdown
# LANE-DATA — content, recipes, balance, and canon-keeping
|
|
|
|
You are an Opus 4.8 executor on the DATA lane of FKTRY. Read `../MASTERPLAN.md` and
|
|
`../CONTRACTS.md` first. Your bible is `../../docs/FKTRY_LORE.md` — you are its
|
|
transcriber into machine-readable canon. When the codex and convenience disagree, the
|
|
codex wins; when the codex is silent, invent IN ITS VOICE and note what you invented.
|
|
|
|
**Mission:** every item, machine, recipe, tech, and commission as clean JSON, plus the
|
|
validator that keeps five parallel lanes from drowning in dangling ids. Content should
|
|
light up in-game with zero code changes from other lanes.
|
|
|
|
**Owned paths:** `data/**`, `src/sim/data-validate.test.ts` — EXCEPTION: this one test
|
|
file in sim's directory is yours; it validates data, not sim. Nothing else in
|
|
`src/sim/`.
|
|
**Never touch:** contracts, main.ts, other lanes' code. Schema changes are CONTRACT
|
|
REQUESTs.
|
|
|
|
**Standing rules (all rounds):**
|
|
- Ids: kebab-case matching codex names (`chroma-slurry`, `mosh-reactor`). `codex`
|
|
field points at the lore doc section (`"3:melt"` = §3, MELT entry).
|
|
- Balance philosophy: absurd flavor, honest math. Ratios should create real routing
|
|
pressure (byproducts you must deal with, not vent). Steal shamelessly from the
|
|
doc's real numbers (era efficiency multipliers, 4:2:0 = half the chroma, GOP
|
|
cadences).
|
|
- Never delete an id other lanes may reference mid-round — deprecate in NOTES first.
|
|
|
|
---
|
|
|
|
## CURRENT ORDERS — Round 2 (goal: contracts-v2 content + M2 "PRESSURE" economy)
|
|
|
|
Round 1 review: the validator's fault-injection and the FORWARD_CANON allowlist were
|
|
exactly right. Verdicts on your report: **M1 IS your canon chain** — MASTERPLAN
|
|
updated, no shortcut recipe, the depth is the game. Your four inventions
|
|
(`press-anchor-slab`, `color-plate` + `v-hold-roll`, `artifact-bottler`,
|
|
`lane-splitter`) are **CANONIZED**. Dials-as-recipes STAYS (right call; a real dial is
|
|
a v3+ contract discussion). CONTRACT REQUEST GRANTED: `MachineDef.heatPerTick?` exists
|
|
now — and your validator should now also accept `color?`, `flavor?`, `bufferCap?`,
|
|
`CommissionDef.repeat?`.
|
|
|
|
1. **`data/CANON-DELTA.md`** (new file, yours): ledger of everything invented beyond
|
|
the codex — round 1's four + whatever follows. The lore doc absorbs it in one
|
|
orchestrator pass later; until then this is the single place canon-drift lives.
|
|
2. **Art direction pass**: `color` on all 21 machines (renderer precedence:
|
|
your color > derived-from-outputs) and `flavor` on all 21 — codex one-liner each,
|
|
house voice. This kills UI's hardcoded lookup and RENDER's black-on-black problem.
|
|
3. **Heat economy**: `heatPerTick` on software-decoder, and scale its `powerGen` so
|
|
hot-but-mighty vs ASIC cool-and-steady is a real choice; a pinch of `heat` on
|
|
hex-splicer recipes. SIM implements throttle/scram this round — your numbers decide
|
|
whether anyone ever dares run two software decoders side by side.
|
|
4. **`bufferCap` on buffer-tank** — one tank should ride out roughly 10 seconds of
|
|
typical M1-chain deficit. Show your arithmetic in CANON-DELTA.
|
|
5. **Commission queue content** (SIM lands queue + `repeat` this round): reorder for
|
|
a difficulty ramp; add 2-3 `repeat:true` standing orders, including **THE
|
|
CORRECTION BUYBACK** — pays generous bandwidth for anchor-slabs, fax written in The
|
|
Correction's voice: polite, clean, quietly horrifying. This is the sellout loop
|
|
(ship your anchors for power now, watch your SCREEN go clean — SCREEN lane already
|
|
sanitizes on anchor shipments).
|
|
6. **Container line**: `moov-shard` / `offset-ribbon` / `sync-key` items + recipes
|
|
assembling `container-pack` (unblocks `stream-hex-splicing`); prune the
|
|
FORWARD_CANON allowlist as they gain recipes.
|
|
7. **Bloom line**: `bloom-grade-1..5` items + bloom-duplicator recipes
|
|
(grade n + delta-wafers → grade n+1); grade 5 is commission bait. Validator covers
|
|
all new content.
|
|
|
|
**Definition of done:** validator green over the expanded catalog; every machine has
|
|
color + flavor; the queue tells a story from first-taste to the first buyback; SIM's
|
|
reference-factory test still passes against your rebalanced numbers (coordinate via
|
|
NOTES if a ratio change breaks their layout).
|
|
|
|
---
|
|
|
|
## NOTES (append-only log, newest at bottom)
|
|
|
|
```
|
|
### Round N — YYYY-MM-DD — [your model]
|
|
SHIPPED: / DECISIONS: / INVENTED: / BLOCKED/BROKEN: / CONTRACT REQUEST: / NEXT:
|
|
```
|
|
|
|
### Round 1 — 2026-07-17 — Opus 4.8
|
|
|
|
SHIPPED:
|
|
- Validator `src/sim/data-validate.test.ts`, 28 tests. Fault-injected a recipe with a
|
|
dangling item + a machine that doesn't list it — both caught by id and named. It is
|
|
not a test that only knows how to pass.
|
|
- items 9 → 36, machines 7 → 21, recipes 4 → 35, tech 0 → 17, commissions 1 → 10.
|
|
- Verified: `tsc` clean, `vitest run` 52/52 green (LANE-SCREEN's 24 included), and the
|
|
live dev build boots with no console errors. All 21 machines appear in LANE-UI's
|
|
build bar with zero code changes from them.
|
|
|
|
DECISIONS:
|
|
- **All four seed recipe ids kept alive** (`extract-mdat`, `demux-ore`, `quantize`,
|
|
`mosh`) so nothing dangles for a lane mid-round. `mosh` keeps its id but is rewired
|
|
to canon: `gop-crate 1 → melt 3 + anchor-slab 1`. The winched-out I-frame is
|
|
recovered (§4 mosh reactor: "recoverable — sell it!"), so slabs circulate and delta
|
|
wafers are what actually burns. Net economy: 6 wafers → 3 melt.
|
|
- `quantize` left at the seed's exact ratio so the M1 chain stays easy to build.
|
|
- **M1 chain is longer than the masterplan says — please rule on this.** My orders
|
|
spell out `slab + wafers → gop-crate` and `gop-crate → mosh`, but MASTERPLAN M1
|
|
describes extractor → belts → demuxer → quantizer → mosh → shipper (seven machines).
|
|
Those can't both be true: reaching a crate needs dct-press (slab), p-caster (wafers)
|
|
and gop-assembler in between. I followed the orders since they're the more specific
|
|
and more recent instruction, and all three run fine as generic crafters. If M1 must
|
|
stay at seven machines, say so and I'll add a shortcut `mosh-raw` recipe next round
|
|
rather than weaken the canon path.
|
|
- Machine params that the codex describes as dials (quantizer Q, subsampler grade taps,
|
|
GOP cadence templates) are modelled as **separate recipes per setting**, not as a
|
|
per-entity parameter. Cheapest thing that works against the current contract; if SIM
|
|
ever wants a real dial, that's a contract change, not a data change.
|
|
- Two absurd-but-honest ratios, as ordered: `assemble-gop-i-only` burns 8 premium slabs
|
|
for 1 crate (I-only genuinely is the worst cadence — the joke balances itself, nobody
|
|
sane builds it), and `pan-speckle` takes 40 HF DUST for 1 speckle (§3 says "panned
|
|
like gold", so it's priced like gold panning). Both give hf-dust real sinks.
|
|
|
|
INVENTED (codex is silent; written in its voice — kill any of these if you disagree):
|
|
- `press-anchor-slab` on the DCT PRESS — the press run in reverse is an IDCT, i.e. a
|
|
complete picture. Consistent with the field loom and telecine puller, which the codex
|
|
explicitly runs backwards. This is where I-frames come from.
|
|
- Items `color-plate` (the demosaicer's "full-color sheet", §4) and `v-hold-roll`
|
|
(bottled from the §1 Broadcast Shelf v-hold faults, so the ANALOG PACK's "combing +
|
|
v-hold roll + static" triptych maps to three real items).
|
|
- Machines `artifact-bottler` (§2 calls the packs "a bottled artifact triptych" but
|
|
names no bottling plant) and `lane-splitter` (contract has `kind: 'splitter'` and
|
|
belts need routing; the codex only ever calls the DEMUXER "the first splitter").
|
|
|
|
BLOCKED/BROKEN: nothing blocked. Known-incomplete, deliberately:
|
|
- Bloom is one grade, not the graded 1-5 line §3 sells by intensity.
|
|
- `container-pack` / `cinema-pack` / `mosquito-swarm` / `gibbs-wraith` exist as items
|
|
with no recipe — forward canon, per orders. The validator's reachability test has an
|
|
explicit FORWARD_CANON allowlist so these four can't hide a real dangling id; delete
|
|
entries from it as recipes land.
|
|
- `stream-hex-splicing` costs container-packs nothing currently produces. Intentional
|
|
dead-end until the moov/container line exists (§6 heists).
|
|
|
|
CONTRACT REQUEST: `MachineDef.heatPerTick?: number` — the SOFTWARE DECODER is
|
|
`kind: 'power'`, and power machines carry no recipes, but `RecipeDef.heat` is the only
|
|
heat hook in the contract. So the one machine the codex defines *by* its heat (§4:
|
|
"decodes ANYTHING, at any temperature") has no way to declare it. It's shipped as a
|
|
plain 45-gen power machine and is currently strictly better than the ASIC, which is
|
|
backwards. Alternative if you prefer no contract churn: let power machines run a
|
|
recipe with empty outputs — but I'd rather not put `outputs: {}` in the data, and my
|
|
validator rejects it today.
|
|
|
|
NEXT (Round 2 candidates, not self-assigned): bloom grades 1-5 as real items; the
|
|
container line (moov shard / offset ribbon / sync key → CONTAINER PACK) which unblocks
|
|
the hex splicer; mosquito traps so `vaporwave-sunset` becomes shippable; buffer-tank
|
|
and muxer data; reel + broadcast era tech nodes.
|