Lanternhold

LANTERNHOLD — Game Design Document

Status: Iteration 1 first draft. Numbers marked [UNSIM] are hand-derived and not yet proven by a simulation in docs/sims/. Per the rubric, unproven balance or emergence claims do not count toward the score until a sim backs them. Canonical palette: docs/art/palette.hex. Art direction lives in ART_BIBLE.md; this document references it but doesn't repeat it.


1. Pitch

You keep a small floating island drifting through an endless night. There's a warm house, a hearth, a pond where wisps rise, a lantern tree, and a cat named Wick. Below the grass is soil, then the bones of earlier keepers, then the crystal that holds the island up, then roots that move at night, then the thing the roots grow from.

You research what the world is made of, then build machines so you no longer have to do the chores yourself. Every machine leaks flux. Flux sinks into the soil, rides the rain and pools in low caverns, and it calls the things that live in the dark. They never attack. They take, rearrange and whisper. Your only wall is light. The crystal that powers your deepest lamps is the same crystal that keeps the island floating.

One line: a cozy-dread automation game where every machine you build brings the dark a little closer.

Genre: 2D side-view simulation/automation, building and digging (Terraria-style cross-section), no combat. Session target: 15–20 hours to a first ending, then endless play. Audience: players of Thaumcraft, Create, Factorio, Noita, Caves of Qud, Dwarf Fortress, Against the Storm and Outer Wilds.

2. Design pillars

# Pillar What it means What it rules out
P1 Light is the only wall Safety is a visible, spatial resource: the lit area. Void entities path only through darkness. Defense means where you put lamps, wards and walls. Weapons, combat, player HP, turrets that damage. Invisible threat timers: every pressure must show on the light or flux map.
P2 Every convenience casts a shadow Each automation step has a cost in a different currency: machines leak flux, deep research costs warp, power costs buoyancy. Mitigations move costs around and never erase them. Strictly-better upgrades. Any tech that makes a cost disappear. "Clean" endgame machines.
P3 The world keeps the score Consequences live in the simulation as tiles, gas, light, mass and water, not in HUD meters. Endings read world state. Dialogue-choice or menu endings, morality meters, quest checklists, cutscene choices.
P4 Learn the world, not the wiki Essence relationships are scrambled per seed. Knowledge comes from experiment, observation and clues, and every experiment has a cost. Fixed recipe trees you can memorize, random gates with no information, pure-reading puzzles.
P5 Cozy first, dread creeping The hearth is always a sanctuary. Dread grows out of the player's own expansion and choices. Nothing spawns on screen and nothing jumps. Jump scares, gore, unprompted progress wipes, death, punishment for idling at home.

3. Core loops

Moment to moment (seconds): dig, place and wire. Carry light into a new dark pocket, watch a lamp stutter as it strains against flux, catch a wisp, check whether that shape at the edge of the light is real.

Per session (one Night = 24 min, typically 2–4 Nights per sitting):

  1. Survey: read the night's state. Where is flux pooling, which lamps are strained, did anything get taken or rearranged, what's the weather?
  2. Research: distill new items, run tests, update the Ledger, identify a compound.
  3. Build: turn the most annoying chore into a machine and extend logistics.
  4. Defend: re-light, re-route and vent or capture the flux the new machine leaks.
  5. Descend: push one shaft deeper and carry light down it.
  6. Rest: sleep at the hearth (clears temporary warp) or work through the Deep-watch for its rewards and risks.

Across the game (hours): surface coziness → fossil-layer mystery → crystal boom and the start of sinking → living roots that fight your layout → the Heart, where the island's accumulated state decides which ending you can reach. Each stratum adds one new pressure and one new kind of value. The factory grows downward, and every level needs light carried to it.

4. The world

4.1 Grid and island

4.2 Time

4.3 The starting island (all seeds)

A two-room plank house (3 tiles tall inside) with the Hearth, a bed, a table holding the first note, and a shelf. The Shed sits 10–14 tiles from the house with a broken alembic and a chest. There's a 6 × 2 garden plot, a pond of about 48 water cells (seeded 40–56), the Lantern Tree, two hanging lanterns (one lit), a ladder hatch through the floor, and Wick the cat. The shed's broken alembic leaks 0.4 flux/s until repaired. This is the first seed of dread, and it comes from the systems, not a script.

5. The player

6. Systems

6.1 Essences and research

6.1.1 The essences

Everything is made of essences, measured in drams. They behave as fluids: they flow in pipes and are stored in jars.

Six primals. Their identities are fixed in every seed, and each has at least one surface source:

Primal Theme Signature color (palette idx) Surface sources
Ember heat, burning R2·5 #e0832b Log, Emberpepper, Soot
Dew water, cold R1·4 #8396bb Water, Leaf, Clay
Loam earth, weight R5·5 #8f6a48 Soil, Clay, Stone
Breath air, lightness R1·6 #c8d6ea Water, Moonwheat, Moth wing
Glim cool radiance R3·5 #3fbfa9 Glowfruit, Wisp, Silverleaf
Hush dark, silence R0·5 #2c3567 Nightshade, Soot, Moth wing

Taint is special: it can only be captured from flux (§6.3) and never synthesized. It counts as tier 1 when it appears as a parent.

24 compounds in 4 tiers. Every compound has exactly two distinct parents. At least one parent must be exactly one tier below it, and the other parent must be of a lower tier. Each compound has a recipe pool (its Correspondence) of four plausible parent pairs, and the world seed picks one per compound (§6.1.3). The pools keep the theme intact (Growth is never Ember + Hush), and the pick makes every seed a new puzzle. Pools deliberately overlap: Dew+Loam is a candidate for Growth, Salt and Ore, and Ember+Loam for Ore, Ash and Glass. So learning one recipe strikes candidates elsewhere, which makes the Ledger a cross-referenced logic puzzle. (i3: a 4th option was added to every pool; S05 shows 3 options made seeds too similar and puzzles too short.)

Tier Compound Role Recipe pool / Correspondence (seed picks one)
T1 Growth plants, golems, Mend Dew+Loam · Loam+Glim · Dew+Glim · Loam+Hush
T1 Ore minerals Loam+Ember · Loam+Hush · Loam+Breath · Loam+Dew
T1 Mist vapor, dreams Dew+Breath · Dew+Ember · Breath+Hush · Dew+Hush
T1 Spark energy Ember+Breath · Ember+Glim · Glim+Breath · Glim+Hush
T1 Shade shadow Hush+Glim · Hush+Breath · Hush+Dew · Hush+Loam
T1 Salt preservation, purity Dew+Loam · Dew+Ember · Loam+Glim · Dew+Glim
T1 Ash remains, decay Ember+Loam · Ember+Hush · Hush+Loam · Ember+Breath
T1 Motion movement Breath+Loam · Breath+Ember · Dew+Breath · Breath+Glim
T1 Glass vessels, lenses Ember+Loam · Glim+Loam · Glim+Ember · Ember+Breath
T2 Metal pipes, machines Ore+Ember · Ore+Spark · Ore+Salt · Ore+Loam
T2 Bone structure, golems Ash+Loam · Ash+Salt · Ash+Ore · Ash+Hush
T2 Vigil warding Spark+Glim · Glass+Glim · Spark+Shade · Glass+Ember
T2 Animus golem life Motion+Growth · Motion+Ash · Motion+Mist · Motion+Loam
T2 Lift buoyancy Breath+Glass · Glim+Ore · Mist+Glass · Breath+Ore
T2 Mind thought Spark+Mist · Glim+Shade · Spark+Hush · Mist+Glim
T2 Hunger lure, appetite Growth+Shade · Ash+Hush · Growth+Ember · Ash+Shade
T2 Root the living deep Growth+Hush · Growth+Ash · Growth+Shade · Growth+Loam
T3 Memory keepers' knowledge Mind+Bone · Mind+Salt · Mind+Ash · Mind+Glass
T3 Fetter binding Metal+Taint · Bone+Taint · Vigil+Taint · Animus+Taint
T3 Dawn true light Vigil+Growth · Lift+Glim · Animus+Spark · Vigil+Ember
T3 Dream sleep-truth Mind+Mist · Mind+Shade · Hunger+Mist · Mind+Hush
T3 Echo repetition, the dead Mind+Hush · Animus+Shade · Root+Mind · Bone+Mind
T4 Kindred life-bond (Mend) Dawn+Root · Dawn+Animus · Memory+Growth · Dawn+Growth
T4 Abyss the Heart's substance Dream+Hunger · Echo+Taint · Fetter+Hunger · Echo+Hunger

6.1.2 Items and their compositions

Item compositions are fixed across seeds, so players learn the world's materials. What changes per seed is what the compounds inside them are made of.

Item Where Composition (drams on full distill)
Leaf tree, bushes Growth 1, Dew 1
Log tree Growth 2, Ember 2, Loam 1
Glowfruit Lantern Tree, 1 per Night Glim 2, Growth 1, Dew 1
Soil dig Loam 2, Ash 1
Clay dig (topsoil pockets) Loam 2, Dew 1
Water (bucket) pond, barrel Dew 3, Breath 1
Moth wing moths (net) Breath 1, Hush 1
Nightshade surface flower, opens in dark Hush 2, Growth 1
Soot hearth, 1 per Night Ember 1, Hush 1, Ash 1
Moonwheat crop Growth 1, Breath 1, Glim 1
Emberpepper crop Ember 2, Growth 1, Spark 1
Silverleaf crop Glim 1, Salt 1, Growth 1
Frogspawn pond frogs, 1 per frog per Night Dew 2, Motion 1
Shale fossil layer Loam 1, Ore 1, Ash 1
Limestone fossil layer Loam 2, Salt 1
Bone fossil layer Bone 2, Ash 1, Hush 1
Old iron keeper caches Metal 2, Ore 1
Fossil fern fossil layer Ash 1, Growth 1, Hush 1
Journal page keeper sites (destroys the page) Memory 1, Mind 1
Stone crystal layer Loam 2, Ore 1
Crystal shard crystal tile (yields 8) Glim 3, Lift 2, Breath 1
Glass lichen crystal layer Glim 1, Growth 1, Glass 1
Wisp (bottled) pond Glim 4, Breath 2, Mind 1 (+1 permanent warp to distill)
Root chunk roots Root 2, Hush 1, Growth 1
Root-bloom roots, opens in dark Dream 1, Glim 1, Hush 1
Heartstone dust Heart chamber floor Abyss 1, Hush 2
Whisperwheat (mutated Moonwheat) flux garden Mind 1, Hush 1, Breath 1
Many-eyed frogspawn (mutated) fouled pond Hunger 1, Dew 1, Mind 1
Hollow bark (mutated tree) fouled tree Shade 2, Hush 1, Echo 1

Synthesis only (found in no item): Mist, Vigil, Animus, Fetter, Dawn, Kindred. These are the compounds where deduction matters most, because the Separator (§6.1.4) can't be used on an essence you've never held.

6.1.3 Seeded recipe generation

  1. Process compounds in tier order (T1 → T4), each in a seed-shuffled order.
  2. For each compound, pick uniformly among pool options whose unordered pair isn't already used by another compound. If none is left, backtrack (it always succeeds; S05 ran 400 seeds).
  3. Validation: every compound is synthesizable from primals plus Taint, and pairs are unique. Gate compounds (Glass, Metal, Animus) always resolve to surface primals; pools guarantee this.
  4. Variety (S05, pool size 4):
    • 400 / 400 seeds produce distinct graphs.
    • Two random seeds share only 25% of their 24 recipes on average (pool size 3 gave 34%).
    • The rarest pool option still occurs in 16% of seeds.
    • Gate compounds' primal ancestry varies widely. For example, Metal needs Ember+Hush+Loam in 15% of seeds and Breath+Ember+Loam in 14%. So the early factory's essence chain differs per seed: one world wants dark Hush (nightshade, soot) for its pipes, another wants Breath (water, moonwheat).

6.1.4 Research actions

Every research action produces facts, and the Ledger (§15.4) records them automatically. Players deduce; the Ledger never deduces for them.

The Correspondence (D38). When a compound's glyph is first seen (in a distilled item, a blueprint's requirements, a clue, or an arranger's shelf), the Ledger shows its tier and its four candidate parent pairs. The puzzle is never "what could it be?" but always "which of these four is true in this world?". S05 showed that without visible pools the synthesis-only compounds cost 40–70 failed tests each: a grind, not a puzzle.

Action Where Cost Fact produced
Distill (first time per item) Hand Mortar (75% yield) or Alembic (100%) the item; flux 9 (mortar) / 18 (alembic) "Item = {essences}". Unidentified compounds show as their glyph with a tier ring, and their Correspondence appears.
Crucible test A+B Research Desk 2 drams each of A and B Success: "A+B = X", gives 2 drams of X, flux +90. If X was already known, it's still a success, just more X. Failure: "A+B = ∅" (that pair makes nothing in this world, so it's struck from every pool), flux +360 burst, essences lost.
Prism scan of X Desk add-on (needs Glass) 1 dram of X; +1 temporary warp for T1–T2, +1 permanent warp for T3–T4 (looking at deep things leaves a mark) One primal colour from X's ancestry that hasn't been shown yet (D39). Repeated scans reveal more. A pool candidate whose ancestry lacks a shown colour is struck.
Separator on X 2×2 instrument (needs Bone + Metal) 4 drams of X, +3 temporary warp, flux +270 "X = A + B" (definitive), gives 2 drams of A and 2 of B. Only for essences you hold.
Journal clue keeper sites reading time; sealed pages need Memory Riddle-form clue (§13.3), usually about synthesis-only or deep compounds. Warped keepers' clues are false: shaky font, violet ink.
Whisperer statement void entity (§6.5) +1 temporary warp per whisper "X is born of A" (a single-parent claim). True with p = 0.5 + W/200.
Arranger shelf void entity items get rearranged On a shelf of jars it rearranges, a compound always ends up next to one of its parents. Always true.

Research by the numbers (S05, 200 seeds, identifying all 24 compounds):

Approach Failed tests Flux Temporary warp Permanent warp (deep scans) Aha share (identified with no failed test)
Guessing (random candidate each time) 24.3 10.9k 0 0 31%
Thinking + Prism when > 2 candidates 14.6 7.4k 18 10.9 55%
Thinking + Prism when > 1 candidate 12.4 6.6k 28 14.1 69%
Thinking + Prism + 6 journal clues 10.5 5.9k 19 6.5 64%

Worked example (seed 7).

  1. Glass's Correspondence is {Ember+Loam, Glim+Loam, Ember+Glim, Ember+Breath}. Ansel's note says "never from breath", so 3 candidates are left.
  2. The player tests Ember+Loam and it fails: a violet puff that the hearth clears in about 30 s. Ember+Loam is now struck from Ore's and Ash's pools too.
  3. Glim+Loam succeeds. Glass is identified, and Glim+Loam is struck from Growth's and Salt's pools.
  4. Growth, held from a leaf, is left with {Dew+Loam, Dew+Glim, Hush+Loam}. One Prism scan shows Dew, a second shows Loam, so Dew+Loam is confirmed with no failed test.
  5. That strikes Dew+Loam from Salt and Ore. Salt is left with {Dew+Ember, Dew+Glim}, and Ore with {Hush+Loam, Breath+Loam}. In this world Ore is Hush+Loam, so its Metal needs Hush, and the player starts planting nightshade.

Identifying compound X means its full recipe is confirmed by a successful Crucible test or a Separator. Identification unlocks synthesis of X and every blueprint gated by X (§11). Identifying a T3 or T4 compound adds +2 permanent warp: knowing it changes you.

First research chain (tutorial, every seed): the note on the hearth table reads: "The alembic's bulb is cracked. Glass wants the fire, the dirt or the glimmer, and I never once got it from the breath. — A." Glass's Correspondence appears in the Ledger with Ember+Breath already struck, leaving 3 candidates. The player distills a log, soil and a glowfruit with the Hand Mortar and runs 1–3 tests (1 failure on average). Each failure teaches flux: a 360-mote burst makes a visible violet puff that the lit hearth (4 AE) clears in about 30 s. Success identifies Glass, unlocks the Glass Bulb, and repairs the alembic. This is Milestone 1's research chain.

6.1.5 Synthesis

An automated Crucible (§6.2) turns 1 A + 1 B into 1 X every 4 s. Flux per dram made depends on tier: T1 9, T2 18, T3 36, T4 72 (×9 since i2, §6.3.5). Deep essences are dirty to make.

6.2 Automation and logistics

6.2.1 Chores that become machines

Chore (manual) First machine Later machine Cost it introduces
Grinding items in the Hand Mortar (4 s each, 75% yield) Alembic (6 s, 100%) Alembic banks fed by golems flux 2/item, Ember fuel
Carrying jars of essence Essence pipes Cisterns and valves Metal, layout
Combining at the desk Crucible Crucible chains flux by tier
Hauling items (logs, soil, ore) Clay Golem routes Bone and Glass golems, Bucket Lift golems need light
Refuelling lamps (candles, lanterns) Golem "refuel" waypoint Ember Lamps on pipes → Wisp → Crystal → Dawn lamps fuel, wisps, crystal (lift)
Digging out rooms Auger Auger arrays with spoil chutes flux 36/tile, cracks in shale
Bailing water Pond intake + pipes Rain barrels → cisterns water mass (sinks you)
Clearing flux by hand (planting silverleaf) Vent Scrubber (captures Taint) vented flux comes back as rain; scrubbers cost Ember
Tending crystal for power Crystal Tap Tap rotation by golems; Lodestone Keel crystal charge → lift

6.2.2 Logistics rules

6.2.3 Machine catalogue

Sizes are in tiles (W × H). "Light" is what the machine emits (§6.4). Flux is per cycle unless marked /s.

Machine Size Unlock Build cost Function Rate Ember Flux Light
Hand Mortar (tool) — start — manual distill (75% yield) 1 item / 4 s held — 9/item —
Research Desk 3×2 start — Crucible tests, Ledger — — per test —
Prism (desk add-on) — Glass Glass 4, Metal 1 ancestry scan 1 / 3 s — 0 —
Alembic 2×3 Glass (repair) / Metal+Glass (build) Glass 4, Metal 6, plank 4 distills from adjacent chest or golem drop; routes each essence to a matching pipe, otherwise to an internal tank of 16 per essence; stalls when a tank is full 1 item / 6 s 1 per 2 items 18/item (1 AE) warm 3
Crucible 2×2 Metal Metal 6, Glass 2 A + B → X 1 dram / 4 s 1 per 4 drams 9/18/36/72 per dram by tier warm 2
Pipe 1×1 Metal Metal 1 → 4 pipes carries one fluid 8 drams/s per network — 0 —
Valve 1×1 Metal Metal 1 on/off; golems or arrangers can toggle — — 0 —
Jar 1×1 Glass Glass 2 64 drams; provide/request toggle — — 0 —
Cistern 2×2 Metal+Glass Metal 4, Glass 4 512 drams — — 0 —
Chest 2×2 start plank 4 16 item slots — — 0 —
Chute 1×1 start plank 2 items fall down to the container below 4 items/s — 0 —
Bucket Lift 1×N Motion+Metal Metal 2 per tile items go up 2 items/s 1/min per 10 tiles 0 —
Golem Workshop 2×2 Animus plank 6, Metal 4 builds golems 1 golem / 30 s — 45 per golem warm 2
Auger 2×2 Motion+Metal Metal 8, Motion 4 drills a 1-wide tunnel (left, right or down), up to 24 tiles; outputs to chest or chute; no crystal unless fitted with a Crystal Bit (Lift 4) soil 6 s, clay 8 s, shale 9 s, stone 12 s, crystal 20 s 2 per tile 36 per tile warm 2
Spoil Chute 1×1 at the island edge start plank 2 drops items into the void, removing their mass 4 items/s — 0 —
Vent 1×2 Metal Metal 4 pulls air flux within radius 4 and expels it to the off-island reservoir R 15 AE — 0 —
Scrubber 2×2 Salt+Metal Metal 6, Salt 6 pulls air flux within radius 4 and condenses it into Taint (90 motes → 1 dram). Stored Taint is a liability: it counts toward V (§6.5.1) 10 AE 1 per 2 Taint 0 —
Silverleaf planter 1×1 start (seed from shed) soil plant that eats flux within 2 tiles 0.5 AE — — —
Ward Stone 1×2 Vigil stone 4, Vigil 4 entities treat cells within 5 tiles as light 6; gives no light Vigil 1 / 2 min — 0 —
Crystal Tap 1×1, next to a crystal tile Lift+Spark Metal 4, Glass 2 Glim 1 dram / 10 s and Resonance within 6 tiles; drains the tapped crystal's charge 0.5%/min — — 1.5 AE cool 2
Assembler 2×2 Metal+Animus Metal 10, Animus 2 crafts any known item recipe from chest and pipe inputs 1 craft / 10 s 1 per craft 54/craft warm 2
Separator 2×2 Bone+Metal Metal 6, Bone 6 research (§6.1.4) 1 / 10 s 2 270/use —
Lift Bladder 1×2 Lift Glass 4, Metal 2, wisp +30 lift; the wisp leaves if flux at the bladder > 150 for 30 s — — 0 cool 3
Crystal Nursery 1×1 seed Dawn+Lift shards 4, Growth 4, Lift 2 planted in stone next to a crystal tile with charge ≥ 0.5; becomes a crystal tile after 2 Nights while cool light ≥ 4 and flux < 50 (stalls otherwise, no reset) — — 0 —
Lodestone Keel 3×2 Fetter Metal 12, Fetter 6 +200 lift while fed; starved → lift falls to 0 over 30 s Taint 2/min, Ember 2/min — 3 AE —
Root Stake 1×1 Vigil Metal 1, Vigil 1 stops root growth and shoving within 2 tiles Vigil 1 / Night — 0 —
Fetter Pylon 2×3 Fetter+Abyss Metal 8, Fetter 6, Abyss 4 Bind ending multiblock (§9) Taint 0.5/min, Ember 1.25/min — 6 AE violet 3 (flux-colored, gives no safety)

Lamps (all 1×1; the hearth is fixed). Suppression capacity C is in AE: how many running alembics' worth of flux the lamp can clear (§6.3.6).

Lamp Unlock Channel / level Fuel Suppression C (AE) Fails when
Hearth (3×2) start warm 13 (embers 6) 1 log / 6 min 4 (embers 2) never fully out
Candle start warm 5 1 candle / 4 min 0.5 rain unroofed, wind 3, out of fuel
Lantern (hung or held) start warm 9 (held 7) 1 lamp oil / 8 min 1.5 rain unroofed, out of fuel, dimmers
Ember Lamp Metal+Glass warm 11 Ember 1 dram / 60 s (piped) 2 rain unroofed, starved, dimmers
Wisp Lantern Glass cool 9 a bottled wisp 6 wisp flees: flux > 300 for 60 s, or strain > 2 for 60 s
Crystal Lamp Lift cool 12 1 crystal shard / Watch (3 per Night) 12 starved
Dawn Lamp Dawn warm 10 + cool 10 Dawn 1 dram / 5 min 10 starved

Lamp oil is crafted at the workbench: Ember 2 + Salt 1 makes 2 oil. Candles: Ember 1 + Leaf 1 makes 3 candles.

6.2.4 Golems

Golems are uncanny little helpers. They turn their heads to watch you, and they stop at the edge of the dark and stand facing it.

Golem Unlock Recipe Speed (tiles/s) Carry Works where Ls ≥ Flux Notes
Clay Animus Clay 10, Animus 2, Growth 2 3 8 items or 16 drams 3 0.1 AE moving —
Bone Animus+Bone Bone 4, Animus 2, Hush 2 5 16 items 1 0.1 AE climbs without ladders
Glass Animus+Lift Glass 6, Animus 3, Lift 1 4 16 items or 32 drams 2 0.1 AE emits cool 3 (a walking lamp)
Root (post-1.0 layer) Animus+Echo Root 4, Animus 2, Echo 1 2 24 items 0 (works in darkness) 1 AE wanders 1 tile off-route per 30 s; at W ≥ 40 it whispers

6.3 Flux

Simulated (i2). Every number in §6.3 comes from docs/sims/S01_flux.py (tuning against five written targets) and is exercised in the coupled probe S09_emergence.py. The reference implementation is docs/sims/fluxcore.py; the build must match it step for step (§20.5 test 3).

6.3.1 State and units

6.3.2 The unit of pollution: the Alembic-Equivalent (AE)

1 AE = 3 motes/s, which is one Alembic running flat out (18 flux per item, one item per 6 s). Every emitter and every sink in the game is quoted in AE, so a player can reason "this lamp keeps 6 alembics clean". S01 tuned the absolute scale: at 1 AE = 0.33 motes/s, a dark workshop could never reach the gleaner threshold.

6.3.3 Thresholds and effects

Band Motes Air effects Soil/water effects
Clean 0–49 none none
Tinged 50–149 faint sparkle haze; gleaners may spawn in dark tinged cells; wisps won't spawn in water ≥ 50 soil faintly veined
Fouled 150–399 drifting haze; arrangers and whisperers may spawn here; crystal next to it loses charge 1%/min; animal mutation exposure ticks plants rooted here start to mutate (Turned)
Thick 400–799 light levels in the cell −2; golem actions take 2× as long; Clay golems refuse the cell soil ≥ 250 (near its 300 cap) hollows plants; pond goes dark violet
Rift 800+ entities may spawn even if Ls is 1; the cell shows tear lines —

6.3.4 Update (5 Hz, every 4 ticks; pass order is fixed)

Rates are per-mille (‰) of the cell's flux per step.

  1. Emit: each emitter keeps a carry accumulator in thousandths of a unit, so sub-unit rates emit exactly over time.
  2. Gravity (flux is heavy), g = 60‰: each air cell sends floor(f·60/1000) to the cell below if that cell is air or water. Water dissolves it. This is equivalent to a bottom-to-top scan on a snapshot.
  3. Diffusion, pairwise, from one snapshot:
    • air–air 100‰ of the difference;
    • water–water 150‰;
    • absorbent solid–solid 1‰ (about 4 tiles per Night).
  4. Absorption, 2‰: an air cell sends floor(f·2/1000) into each absorbent solid below, left and right of it, up to the solid's cap. Caps: soil/grass 300, clay 150, shale 100, limestone 80, stone 50, root-wood 400. Crystal has cap 0 (it taints instead, §6.7). Plank, brick and glass are non-absorbent. Seep, 5‰: a solid above 80% of its cap sends floor(f·5/1000) into each adjacent air cell. Saturated ground gives flux back.
  5. Dissolution, 4‰: air next to water (above or beside it) dissolves into the water.
  6. Wind, 30‰ × s: sky-exposed air (no solid anywhere above) shifts sideways in the wind direction, where s ∈ {0,1,2,3}. Flux blown off the grid edge goes to R.
  7. Off-island loss, 100‰: air cells more than 2 tiles outside the island hull send flux to the reservoir R.
  8. Light suppression (§6.3.6).
  9. Sinks: silverleaf, roots, scrubbers, vents, tide drain.
  10. Rain (during rain fronts):
    • Scrub, 6‰: each sky-exposed air cell sends flux down its column to the ground (3%/s). Roofs pass it to the drip line, the nearest absorbent or water ground cell.
    • Runoff, 4‰: each exposed absorbent ground cell sends flux one column toward its drain direction, the nearest drop to lower ground or off the island edge on either side. Tile slopes are terraces, so a pure neighbor comparison would strand flux on every flat run. A basin holds its flux, like a puddle.

6.3.5 Emission table (in AE; motes = AE × 3)

Source Emission
Broken shed alembic (start, until repaired) 1.2 AE continuous
Alembic 18 per item (1 AE at full speed)
Hand Mortar 9 per item
Crucible synthesis 9 / 18 / 36 / 72 per dram for T1 / T2 / T3 / T4 (0.75 / 1.5 / 3 / 6 AE at full speed)
Failed Crucible test 360 burst
Separator 270 per use
Auger 36 per tile dug
Golem (moving) 0.1 AE (Root golem 1 AE)
Crystal Tap 1.5 AE
Assembler 54 per craft (1.8 AE at full speed)
Golem Workshop 45 per golem
Lodestone Keel 3 AE
Fetter Pylon 6 AE
Hollowed organism (§6.9) 1.5 AE
Blocked pipe junction 1 AE

What S01 measured (dark, closed 6 × 4 shed on a soil floor, no lamp):

Load Tinged (≥ 50) at Fouled (≥ 150) at Thick (≥ 400) at
Broken alembic (1.2 AE) 6.5 min never in 30 min never
1 AE 13.5 min never in 30 min never
3 AE 1.75 min 9.5 min 21 min
6 AE 0.75 min 2.75 min 8.5 min

Soil under the shed is tinged by 3–6 min and sits at its seep threshold (240) by 30 min. The ground is a buffer: one machine's flux soaks into the floor, and the air only climbs once the soil saturates. Big machines overwhelm it at once.

6.3.6 Light suppression (the lamp budget)

Each lamp has a suppression capacity C in AE (lamp table, §6.2.3). That's C·3/5 motes per flux step.

6.3.7 The reservoir: vented flux comes back

Vented and off-island flux accumulates in R. At the start of each rain front, 60% of R is deposited evenly over the drip-line ground cell of every island column. R decays by 5% per Night. Venting moves pollution in time and space: it never deletes it.

6.3.8 What the sims proved about flux

Claim Evidence
Flux pools in low caverns S01 §3c: with no wind, 34% of an outdoor 3-AE source's flux ends up in a cavern 12 tiles down within 20 min, with the cavern floor at 20 vs the shaft at 6.
Wind decides where it goes Wind toward the shaft: 36% goes into the pond. Wind away: 31% goes off the island to R, and only 7% reaches the cavern.
Rides the rain S01 §3d: 4 min of rain leaves 4% of the sky-exposed airborne flux vs 18% without rain, washing it into the soil and pond.
Runoff carries it downhill S01 §3e: one Watch of rain strips a terraced hillside garden from 27% to 1% of its flux, and 21% of it reaches the pond 20 columns away (pond mean 26 motes). Runoff also pours down open shafts into caverns.
Exact conservation Every S01 and S09 run reports ledger = exact.

6.4 Light and darkness

6.5 Void entities (no combat)

They never touch the player. They take, rearrange, whisper and dim. Light works as walls for them: an entity's navigation grid is every cell where Ls < tolerance. They pathfind with a flow field from their target, recomputed when the light map changes.

6.5.1 Void Attention

V = (F_total + 90·Taint_stored)/3600 + R/7200 + 0.5·T_rows + W/10 + 2·N_hollowed (flux terms rescaled ×9 in i2 with the emission scale; stored Taint drams count at 90 motes each, so hoarding captured flux still draws attention)

Spawning is checked every 30 s. While the summed cost of active entities is below floor(V), one entity spawns, with its type weighted by the stratum spawn table. Hard cap: 12 active. [UNSIM: S07 must confirm first-hour V gives 0–1 gleaners and mid-game V gives 4–8 entities.]

Spawn cell rules (all must hold): Ls = 0. Air flux ≥ the type's threshold: gleaners 50 (tinged), arrangers, whisperers and dimmers 150 (fouled) (D28), or the cell is under the tide. The cell is outside the camera view plus a 4-tile margin. Entities fade in over 3 s, and nothing ever appears on screen.

6.5.2 The four kinds

Entity Cost Tolerance (moves where Ls <) Speed What it does Leaves when
Gleaner (small, many-legged, low) 2 3 2 t/s Goes for the nearest container, machine item buffer, or ground item reachable by a dark path within 40 tiles (it prefers cells with flux ≥ 50). Takes one stack (≤ 16) and carries it to the nearest midden, a dark pocket ≥ 20 tiles from any light. If no midden is within 60 path-tiles, it drops the stack into the void. after delivering; if light reaches it, it retreats along its path; if it's trapped in light it dissolves and drops what it carried
Arranger (tall, thin, folded) 4 2 1 t/s Stands next to a machine, pipe, valve or chest whose cell has had Ls < 2 for 20 s, then makes one arrangement: rotates a pipe connector, toggles a valve, swaps a Crucible or Assembler recipe for another known one, or reorders container slots so jars end up next to a parent (a research clue). It leaves a chalk spiral, and interacting with the spiral within 1 Night shows a ghost of the old state with Restore. Up to 3 arrangements, then it leaves. after 3 arrangements; it dissolves if lit
Whisperer (a soft, faceless knot) 3 3 stationary Spawns only in fouled+ cells. When the player is within 8 tiles with Ls < 4, it whispers every 20 s: +1 temporary warp and a statement "X is born of A", true with p = 0.5 + W/200. The statement appears as faint violet handwriting beside it, fades in over 1 s, and is copied to the Ledger as an unverified claim. At most 1 per 30 tiles. it dissolves if its cell's Ls ≥ 3
Dimmer (moth-like, wings of absence) 5 seeks Ls 1–3 1.5 t/s Settles at the edge of a lit area and attaches to the light source contributing most there. Drains that source's level by 1 per 30 s, down to −4. Flame lamps burn fuel at 2× while it's attached. The hearth is immune. it flees if its cell's Ls ≥ 4 (overlapping lamps)

The Visitor (post-1.0 layer, §19.1; 1.0 keeps only the A08 deep-shape atmosphere): in a Deep-watch with V ≥ 20, there's a 25% chance; it never happens two Nights in a row. It's telegraphed 60 s ahead: water ripples, hanging lamps sway, Wick hides, and the stars below the island dim one by one. During its 90 s passage a vast shape crosses the void below and blots out stars. Entities move 1.5× faster, unwarded lamps lose 2 radius, and items on the ground in sky-exposed cells with Ls = 0 are taken into the void. It never does anything else.

6.5.3 Fairness rules (hard)

  1. No entity destroys tiles, machines or golems.
  2. Every theft goes to a visible midden when one is within reach. The Keeper's Log records it ("Something carried 14 Clay toward the deep."), and the map marks the midden with "?".
  3. Every arrangement leaves a chalk mark and can be restored for 1 Night.
  4. Nothing spawns in view, and nothing happens inside the hearth sanctuary.
  5. Every pressure can be predicted from the light, flux and tide overlays.

6.6 Warp

6.7 Buoyancy, tide and structure

6.7.1 Lift and mass

6.7.2 Altitude

6.7.3 Crystal Taps and Resonance

A Tap lets you use a crystal without mining it. It gives Glim 1 dram/10 s and Resonance power within 6 tiles (those machines need no Ember). The crystal's charge drains 0.5%/min, so a fresh crystal hits the 0.5 tainted threshold in 100 min and zero in 200 min. An untapped, clean, cool-lit crystal recovers. Rotating taps across crystals is sustainable and is a chore golems can take over. Mining a crystal instead gives 8 shards at once (Glim 24, Lift 16, Breath 8) and loses its 24 lift permanently.

6.7.4 The tide (the dark rising)

6.7.5 Structure and integrity

6.7.6 Tilt

6.8 Water and weather

6.9 Flora and fauna

Organism Where Behavior Products Mutation (Turned → Hollowed)
Lantern Tree surface, 1 per island permanent Log (chop a branch, regrows in 1 Night, 4 per Night), Leaf, Glowfruit (1/Night, cool 4 while on the tree) Turned: Hollow Tree, bark with too many knots like eyes; gives Hollow bark. Hollowed: emits flux.
Moonwheat crop grows in 2 Nights; needs light ≥ 2 Moonwheat Whisperwheat (Mind, Hush); harvesting gives +1 T warp
Emberpepper crop 3 Nights; needs warm ≥ 4 Emberpepper Ashpepper: Ash instead of Spark
Silverleaf crop/planter 2 Nights; eats flux 0.5/s within 2 tiles Silverleaf (tea: −5 T warp) none (immune)
Nightshade surface wild opens only where Ls < 2 Nightshade —
Moths surface air drawn to warm light; harmless Moth wing (net) Hush-moths: harmless, but they look like dimmers (a deliberate ambiguity)
Frogs (3 at the pond) pond 1 frogspawn per frog per Night Frogspawn Many-eyed frogs: Many-eyed frogspawn
Wisps pond §6.9.1 wisp (bottled) they don't mutate; they flee
Bone moss fossil layer grows on bone in the dark; cool 1 glow — —
Fossil fern fossil layer static Fossil fern —
Glass lichen crystal layer grows on charged crystal; cool 2 glow Glass lichen dies if the crystal is tainted
Root-bloom roots opens only in darkness; cool 2 glow Root-bloom —
Wick the cat house §6.9.2 — never mutates, never harmed

Mutation rule: each organism tracks exposure, meaning soil flux at its root cell (plants) or air flux at its body (fauna). Normal → Turned after 4 cumulative minutes at ≥ 150. Turned → Hollowed after 4 more minutes at ≥ 400. Turned organisms give their mutated products, some of them rare (Hollow bark is the earliest source of Echo). Hollowed organisms emit 0.5 flux/s and count in V. Mutation is reversible from Turned (2 Nights at < 50) but not from Hollowed. Cultivating a deliberate "flux garden" is a valid strategy.

6.9.1 Wisps

6.9.2 Wick

Wick wanders between the hearth and the player inside lit cells only (Ls ≥ 3), and sleeps by the hearth during the Deep-watch. Wick hisses and arches at real entities within 10 tiles and ignores hallucinations. At W ≥ 80, Wick won't leave the hearth. Petting gives −1 T warp once per Night. Wick can't be harmed, taken or mutated. Wick is the game's promise that some warmth is unconditional.

7. System interaction matrix

Read across: how the row system affects the column system.

↓ affects → Flux Light Water Buoyancy/Structure Life Entities Warp Weather Automation Research
Flux sinks, pools, diffuses strains lamps; thick flux −2 levels; wisps flee lanterns dissolves in; pond goes dark taints crystal → lift loss mutates plants and fauna attracts; sets spawn cells — rides the reservoir into rain blocks Clay golems; junctions leak failed tests make flux; Taint is captured from it
Light suppresses (budgeted) — — cool light recharges crystal crops need it; nightshade needs dark walls; dissolves whisperers darkness raises T — golems need it —
Water carries dissolved flux −2 per tile flows adds mass; spills on tilt wisps and frogs live in it — — — pond intake; rain barrels Dew source
Buoyancy/Structure tide drains flux; collapses release absorbed flux tide halves radius tilt spills the pond — collapses can drop the garden tide adds spawn cells and V — — collapses drop machines —
Life silverleaf eats it; hollowed emit it; roots eat it glowfruit, lichen, blooms glow — roots are anchors — hollowed add V; Wick detects mutated fruit +T — wisps power lamps and bladders mutated products are rare essences
Entities real ones leave a wake (tell) dimmers drain lamps; occlude light — — — — whispers +T — gleaners steal; arrangers re-wire; golems get borrowed arrangers and whisperers give clues
Warp Sight I shows it — — — — +V; Echoes — — fake warnings waste time Sight II and truer whispers
Weather rain scrubs air → soil and pond; wind moves it rain and wind put out flames; mist −1 cool rain fills the pond rain adds water mass rain waters crops; mist doubles wisps the Visitor rides the Deep-watch — — barrels fill —
Automation the main source; scrubbers capture lamps and golems carry light intakes augers crack; mass; keels lift — containers are targets — — — Separator, Prism, Alembic
Research tests burst flux unlocks lamp tiers — unlocks keels, nurseries, bladders unlocks planters unlocks wards, lures, stakes T3+ +P — unlocks machines —

Feedback loops and what the sims showed (S09, docs/sims/S09_emergence.results.md; a 64 × 72 island slice running flux, lamps, the pond and wisps, weather, crops, crystal charge, vents and scrubbers together; nothing scripted):

  1. Factory runaway: proven, with a tipping point and hysteresis. Two Wisp Lanterns (12 AE) uphill of the garden hold through 12 AE. At 13 AE they collapse after 43 min. At 14+ AE they collapse in 2–3 min, flux rolls down the slope, the pond fouls in 9–12 min, crops turn, and V jumps from 1.8 to 28–37. Path dependence: a base that ran one Night at 16 AE and was then torn back to 8 AE stays collapsed (pond 1,569 motes, lanterns empty, 4 crops turned), while the same base at 8 AE throughout stays clean. The saturated ground keeps seeping, and re-lit lanterns flee again. Design consequence: a gradual expansion is safe, a sudden one can lock the base in a fouled state, and recovery needs scrubbing or time, not just switching machines off.
  2. Rain return: proven. With a vent, the workshop stays spotless, but garden soil jumps at exactly minutes 24, 48 and 64, which are the three rain-front starts. The pond fouls at the first front and 2 crops turn by Night 3. Doing nothing fouls the pond more slowly (42 min, via the door and runoff). A scrubber keeps everything clean, which revealed a dominant strategy that i2 fixed (scrubber nerf plus stored Taint counts toward V, §6.2.3, §6.5.1).
  3. Sinking spiral: partly proven. An over-built factory in the crystal cavern taints the crystal around it: A_eq drops 44 fathoms in 3 Nights without mining a single crystal. The tide feedback awaits S03.
  4. Clean-pond loop: proven as the stable branch of loop 1. Below capacity, lanterns keep the pond clean, the pond keeps spawning wisps (6 at the end of every stable run), and the player can always refill. A chronic leak still matters: even a healthy 8-AE workshop uphill tinged the pond (66 motes) over 3 Nights.
  5. Root regulation: not yet modelled. Pending S09-roots (Roots stratum).

Layout decides what fails (S09 E3). The same over-built factory (8 AE on a 6-AE lantern) fails differently by site:

Site First failure Then Gleaner-eligible cells Crystal A_eq
Uphill of the garden lantern lost at 26 min pond fouled at 42 min 109 −14
Downhill, next to the pond pond fouled at 5 min lantern lost at 15 min 8 (the pond swallows it) 0
Deep crystal cavern lantern lost at 6 min — 118 −44

The same machine count hits the wisps, the entities, or the island's buoyancy depending only on where it was built. That's the "factory layout shapes where corruption collects" promise, measured.

Survey (S09 E4). 24 random bases built near their limits gave 11 stable, 7 pond-first and 6 lamp-first failures, at times from 1 to 68 min. Lamp placement (E5): the same two lanterns let between 112 and 277 motes leak out of the door depending on where they hang.

8. Strata

8.1 Surface (d 0–11) — "The Hearth"

8.2 Fossil layer (d 12–49) — "The Ossuary"

8.3 Crystal layer (d 50–99) — "The Keel"

8.4 The Roots (d 100–149) — "The Underlung"

8.5 The Heart (d 150–D) — "The Seed"

9. Endings (earned through play)

When the player first touches the Heart, its three accumulators become visible through Heart-sense (W ≥ 80) or the Heart's Stethoscope (Mind + Metal), as three slow pulse rhythms. Each accumulator fills only while the world is in a specific sustained state. There is never a menu, a prompt or a dialogue choice. The states exclude each other: Mend needs the chamber lit and clean, Bind fills it with pylon flux, and Become needs it dark.

9.1 Mend — "Dawn"

9.2 Bind — "Unending Night"

9.3 Become — "The New Heart"

9.4 Foundered (failure, not an ending choice)

At A ≤ −700, the night takes the island. A Keeper Record is saved: name, Nights survived, the auto-journal, and the layout of one chosen room. It can appear as a fossil-layer keeper site in future new worlds (§12).

9.5 Why it lands

The three keepers you've been reading about all made one of these choices, and their remains are in the chamber. By the time you arrive, your island already leans one way: low flux and wisps (you were careful), a deep Taint economy (you built the engine), or high warp (you wanted to know). The ending you reach is the one you've been living, and then you get to keep living it.

10. Key decisions

# Decision When Tradeoff Skill tested
K1 Mine or tap a crystal crystal layer onward, constantly mining gives 24 Glim and 16 Lift now and loses lift forever; tapping trickles and is recoverable but leaks flux and needs rotation resource timing, discounting
K2 Vent or capture flux from the first Vent venting is free now, and it comes back with every rain front across the whole surface (S09 E2: garden jumps at each front); scrubbing costs Ember and the captured Taint draws attention until it's spent (Keels, Fetter) delayed-consequence reasoning
K3 Warm or cool light for an area every new room warm keeps entities out but burns fuel and barely suppresses flux; cool scrubs flux but is a weak deterrent and costs wisps or crystal reading the threat type of an area
K4 Where to site a machine every build flux sinks, so machines placed high poison everything below; near the pond kills wisp spawns; near roots feeds them and gets your pipes shoved spatial planning
K5 Jettison or keep spoil every dig jettison raises altitude; keeping gives building stone and mass for later buoyancy economics
K6 How to research a compound each unknown Crucible tests cost flux, the Separator costs warp, whisperers cost warp and might lie, journals cost exploration information value under cost
K7 Distill a wisp whenever wisps are caught cheap Glim and Mind now plus 1 P warp, against a lamp, a bladder, or Mend progress short- vs long-term, values
K8 Cultivate or purify mutation from the first fouled soil flux gardens give rare essences (Echo, Mind, Hunger); purifying keeps V low and protects the pond managed risk
K9 Sleep or work the Deep-watch every Night sleep clears T and skips danger (but the sim runs); working gets root and Visitor windows and whisperer clues, at a warp cost tempo, risk appetite
K10 Dig fast or dig safe every shaft a straight shaft is quick but shale ceilings need beams every 6 tiles; augers are fast but vibrate and crack structural reading
K11 Mine symmetrically crystal layer the closest crystals may be on one side; tilt spills the pond and slides chests spatial balance
K12 Golem routes vs lamp coverage logistics longer, lit routes or more lamps (fuel, wisps, crystal); Bone golems work at Ls 1 but need Hush and Bone, while Glass golems carry their own light but cost Lift network design
K13 Cut, stake or feed roots Roots stratum stakes cost Vigil every Night; feeding roots flux cleans the air but grows them into your factory managing living systems
K14 Push deep research (T3/T4) mid-to-late game permanent warp brings Sight and Heart-sense, plus hallucinations and the Become pull self-management
K15 Water management rain events barrels and cisterns supply water and add mass; the pond needs a clean catchment resource and flux routing
K16 Respond to a warning or ignore it W ≥ 60 checking a fake warning costs time and warp (darkness); ignoring a real one costs items or a collapse perception, tells

11. Progression and unlocks

Stage Depth gate Research gate Unlocks
Start — — Hand Mortar, Research Desk, Chest, Chute, Candle, Lantern, Spoil Chute, Silverleaf planter, ladders, planks, workbench
Glass — Glass Alembic repair, Wisp Lantern, Jar, Prism
Metal Old iron or Ore synthesis Metal Pipes, Valves, Crucible, Ember Lamp (+Glass), Alembic (new), Vent, Pond intake
Animus — Animus (+ Motion) Golem Workshop, Clay Golem
Motion + Metal — Motion Auger, Bucket Lift
Fossil d ≥ 12 — Bone, keeper journals, old iron caches
Bone fossil Bone Bone Golem, Separator (+Metal)
Salt — Salt Scrubber (+Metal), Silverleaf tea
Vigil — Vigil Ward Stone, Root Stake
Mind — Mind Clarity Lens (+Glass), Heart's Stethoscope (+Metal)
Hunger — Hunger (essence only: a parent of Dream and Abyss)
Crystal d ≥ 50 — crystal shards, Glass lichen
Lift crystal Lift Crystal Lamp, Lift Bladder, Crystal Tap (+Spark), Glass Golem, Crystal Bit
Roots d ≥ 100 — Root chunk, Root-bloom
Root roots Root (essence only: a parent of Echo and Kindred)
Memory — Memory sealed journal pages
Echo — Echo Echo Bell (shows every real entity on the map for 60 s); Root Golem is post-1.0
Dawn — Dawn Dawn Lamp, Crystal Nursery (+Lift)
Fetter Taint captured Fetter Lodestone Keel, Fetter Pylon (+Abyss)
Heart d ≥ 150 — heartstone dust, Stethoscope readings
Kindred — Kindred Kindred Pool
Abyss — Abyss Fetter Pylon

Hour targets [UNSIM: S06 pacing sim]: Glass by 0:20, Alembic running by 0:25, Metal and pipes by 1:15, Animus and golems by 2:30, first crystal by 4:30, Roots by 9:00, Heart by 13:00, first ending 15–20 h.

12. Replayability and seeds

What differs across seeds, and why it matters:

  1. The essence recipe graph (§6.1.3). S05: every seed's graph is distinct, two seeds share only 25% of recipes, and the gate compounds' primal needs vary. Each run's research is a fresh deduction puzzle, and your factory's production chains differ. If Vigil is Spark+Glim, wards come early; if it's Spark+Shade, it needs Hush, and wards wait for the dark.
  2. Island shape: W0, depth, profile noise, crystal distribution (veins vs geodes, centered vs lopsided, which affects tilt), fossil pockets, root seeds, pond size.
  3. Keeper sites: which lesson keepers appear (2 of the Digger, Wanderer and Miner) and where, plus seeded clue content and which keepers' clues are false.
  4. Weather bias: wind prevailing direction and rain frequency (±30%).
  5. Charters (optional modifiers chosen at world creation, inspired by Against the Storm): Heavy Keel (−25% crystal), Old Pond (pond ×2, wisp cap 10), Restless Roots (root steps ×2), Thin Night (V ×1.25, more clues from whisperers), Lost Ledger (no first note; Correspondences stay hidden until a journal page reveals each one, the hard mode S05 shows costs 10–20× more failed tests), Inheritance (start with a Keeper Record site).
  6. Endings: three structurally different builds (clean wisp roads, a Taint engine, or a warp descent).
  7. Keeper Records: foundered or Become runs leave the player's own keeper in future worlds.

13. Narrative delivery

No cutscenes. The story is told through:

13.1 Keepers (6 total; the Heart chamber always shows the three ending archetypes)

Keeper Archetype Where What their pages teach
Ansel Gardener (Mend) the first note on the hearth table; the Heart pool wisps, the pond, light; Glass pool hint
Tamsin Engineer (Bind) a fossil-layer workshop; the pylon ruins flux capture, Taint, Metal
Ilse Scholar (Become) sealed pages (Memory); her skeleton at the Heart warp, hallucination tells, deep compounds
Odo Digger under a collapse in shale structure, beams (some of his clues are false: he was warped)
Bram Wanderer at the island's edge, under a broken rope ladder darkness, middens, the Visitor
Merrit Miner tide marks scratched into the crystal-layer walls buoyancy, the tide, taps vs mining

Each seed places Ansel, Tamsin and Ilse plus 2 of Odo, Bram and Merrit.

13.2 Environmental storytelling

Skeleton poses, a dead keeper's chalk routes still on the walls, the broken machines, tide-line scratches, and distant islands whose window lights go out one by one over the Nights (pure storytelling; one goes dark every 3 Nights).

13.3 Clue templates (seeded content)

13.4 The Keeper's Log (auto-journal)

The game writes short handwritten lines when real events happen: first wisp, first theft, first crack, tide milestones, and so on. It's diegetic feedback and one of the tells (hallucinations are never logged), and it becomes the next keeper's journal.

14. The first hour (systemic, not scripted)

Time What happens System that causes it
0:00 Wake by the hearth at embers. Wick on the rug. A note on the table. start state
0:01 Chop a branch, feed the hearth: the house blooms warm (6 → 13). hearth fuel
0:03 Step outside. Rain-dark grass, the moon, the shed in shadow, a faint violet shimmer at its door. broken alembic leaking 0.4/s
0:05 A wisp rises from the pond. Net it, hang it in the empty lantern by the path: cool light. wisps
0:08 Read the note (Glass pool). Grind a log, soil and a glowfruit in the mortar. research
0:12 Crucible tests: one fails with a violet puff, the next succeeds and Glass is identified, with a ring of cool light. research, flux
0:18 Craft a Glass Bulb and repair the alembic. The leak stops; now it distills from its chest. first automation
0:25 Alembic running. Haze collects in the soil under the shed. flux sinks and absorbs
0:32 Deep-watch. Wick stares at the dark shed corner and hisses. Next morning a chest is missing 8 Clay, and the Log says "Something carried Clay toward the deep." gleaner (shed is dark plus flux)
0:38 Hang a lantern in the shed. The gleaner's path closes. light as walls
0:45 Rain front. The haze goes, the soil darkens, a wisp doesn't come back to the pond. rain scrub, deposit, pond flux
0:50 Dig under the garden. Clay, roots, then a tool cache with old iron (Metal) and a page. digging, caches
0:58 The shaft hits shale. A fossil hand still holds a rusted lantern. fossil layer hook

Hook: you have a machine, a mystery, and proof that your choices shape where the dark comes from. [UNSIM: S06 must show this hour's chores and timings are reachable; playtest at M1.]

15. UI/UX and legibility

15.1 HUD (diegetic where possible)

15.2 Lenses (hold a key or toggle; all palette-locked overlays)

15.3 Without lenses

Flux shows as haze density, light as the light itself, strain as flicker, integrity as cracks, altitude as the ruler and the sky. The reservoir R shows in the clouds: cloud layers swap R1 shades for R4 shades in proportion to R (one cloud band per 2,000 motes, up to all of them), so the player watches vented flux gather overhead before it rains. When a front deposits, the Keeper's Log writes "The rain tasted of the vent." Every important state has a non-lens signal.

15.4 The Ledger (research UI)

A book with one page per essence, plus a spread-out Correspondence board.

15.5 Machine status (pilot lights; shape and color both encode state)

Steady amber: working. Blinking amber at 1 Hz: starved of input. Steady cyan: output full or blocked. Blinking violet: flux-strained or error. Dark: off.

15.6 Visual-first feedback (hard rule)

No information is ever carried by sound alone. Every warning, tell and telegraph in this document has a visual form: lamp stutter, dust, shaking, handwriting, Wick's pose, the Log. That makes the audio deferral (§16) safe, and it's also an accessibility guarantee.

15.7 Accessibility

Every color code is doubled with shape or blink. Hallucinations can be turned off in options (the game then logs "Echo (hidden)" instead), and turning them off disables the Become ending's Sight bonuses. No flashes faster than 3 Hz. Screen shake is at most 1 px.

16. Audio direction (brief) — DEFERRED

Owner decision (after i1): skip audio for now. Audio is out of scope for M0–M5, no milestone or acceptance test depends on it, and the design loop doesn't spend iterations on it. The game must be fully playable and readable silent (§15.6). The notes below are kept only as future direction. The build should leave a no-op audio event hook (sim events like lamp_strain, crack, whisper and visitor_telegraph already exist for the Log), so sound can be added later without touching the sim.

17. Tuning parameters (starting values)

All values are hand-derived for iteration 1. Sim column names the simulation that must confirm them.

Parameter Value Unit Sim
Sim tick 20 Hz —
Night length 24 min S06
Flux step rate 5 Hz S01 ✓
Flux unit 1/1000 mote (u32) — S01 ✓
1 AE (alembic flat out) 3 motes/s S01 ✓
Flux gravity 60 ‰/step S01 ✓
Flux air diffusion 100 ‰/step pairwise S01 ✓
Flux soil absorb / soil diffusion / seep 2 / 1 / 5 (above 80% cap) ‰/step S01 ✓
Soil caps (soil/clay/shale/lime/stone/root) 300/150/100/80/50/400 motes S01 ✓
Water dissolve / diffusion 4 / 150 ‰/step S01 ✓ (S08 for moving water)
Rain scrub / runoff 6 / 4 ‰/step S01 ✓
Reservoir deposit / decay 60 per front / 5 per Night % S09 (E2)
Flux thresholds 50/150/400/800 motes S01 ✓
Gleaner / arranger+whisperer spawn flux 50 / 150 motes S01 ✓ (D28)
Plant Turned / Hollowed soil flux 150 / 250 motes S09
Lamp strain flicker / gutter 0.8 / 2 for 60 s — S01 ✓
Wisp Lantern suppression 6 AE S01 ✓ (holds 6, fails at 7)
Crystal Lamp suppression 12 AE S01 ✓
Alembic flux 18 /item S01 ✓, S06
Failed test burst 360 motes S05
V formula weights 1/3600, 1/7200, 0.5, 1/10, 2 (flux terms rescaled ×9 with emission) — S07
Entity costs (G/A/W/D) 2/4/3/5 V points S07
Crystal lift per tile 24 — S03
Altitude scale H 600 fathoms S03
Altitude τ 10 min S03
Tide threshold / rows per fathom 800 / 1/8 — S03
Founder altitude −700 fathoms S03
Tap drain 0.5 %/min S03
Crystal recharge 0.5 %/min S03
Integrity costs table §6.7.5 — S04
Warp darkness rate 0.1 T/s S07
Hearth recovery 0.05 T/s —
Whisper truth 0.5 + W/200 p S05 (not yet modelled)
Recipe pool size 4 candidates per compound S05 ✓
Prism 1 colour per scan, +1 T warp — S05 ✓
Crucible test cost 2+2 drams; success +90 flux; failure +360 — S05 ✓ (S06 to price drams)
Mend / Bind thresholds 180 / 240 accumulator min S06
Root tip steps per Deep-watch 3 steps S09

Planned simulations: S01 flux spread and pooling · S02 lamp budget vs factory size · S03 buoyancy curves and counterweights · S04 structural stability of generated islands · S05 research solver (experiments needed, seed variance, value of clues) · S06 economy and pacing · S07 attention and spawns · S08 water, rain and reservoir · S09 coupled emergence probe.

18. Risks and mitigations

Risk Impact Mitigation
Too many interlocking systems for one build scope overrun §19 cut list; M1 proves the core with 4 systems; strata ship in order
Research becomes brute force (test all pairs) puzzle feels like a chore S05: with pools shown and a partial Prism, thinking needs 49% fewer failed tests than guessing, and 69% of identifications need no failed test. Remaining risk: the puzzle may feel too easy for veterans, so a 'Lost Ledger' charter hides pools until a journal reveals them.
Flux sim is unreadable players feel punished at random haze plus a flux lens with arrows; lamp strain flicker; pooled flux follows terrain predictably
Entities feel unfair frustration breaks the cozy fairness rules §6.5.3; middens; restore; nothing spawns in view
Hallucinations frustrate players distrust everything 6 consistent tells; the Keeper's Log is ground truth; accessibility toggle
Buoyancy is too abstract the vertical tension doesn't land sky, tide fog and the depth ruler make it visible; the preview on the pick
Palette-locked lighting looks banded it fights the mood dithered light levels; LUT tuned against the reference; mockup M02
AI-generated sprites don't match style breaks lanternforge cleanup; albedo-only prompts; LUT lighting unifies them; hand-edit budget
Endings feel like checklists the arc falls flat sustained world states, not counters; the keepers' remains foreshadow them
Sim performance in JS stutter 128 × 256 grid, fixed 5 Hz flux, incremental light; budgets in §20.2

19. Scope

Measured (i4). docs/sims/S10_scope.py counts the real asset list and sizes the build with an assumption-labelled effort model. Re-run it whenever ART_BIBLE §10.2 changes.

19.1 Core, layers, and cuts (decided i4)

Core: 1.0 ships these

Layers: post-1.0, designed but not built

Cut from the design outright: the Lure, the Root Graft and the Glowfruit Lamp. Each one duplicates a role a core item already covers: decoys duplicate light placement, grafts duplicate stakes plus flux feeding, and the glowfruit lamp duplicates the candle.

19.2 Milestone sizes (S10)

Milestone Adds kLOC (est.) Assets: code / procedural / AI
M0 Foundations sim core, RNG, commands, save; LUT tool; lanternforge v1; test harness 3.2 —
M1 Surface slice §19.3 12.0 36 / 11 / 32
M2 Fossil layer structure, golems, pipes, journals, arranger, whisperer, warp T, full weather 6.6 32 / 10 / 56
M3 Crystal layer buoyancy, tide, taps, augers, dimmer, hallucinations, Assembler 4.8 6 / 3 / 23
M4 Roots and Heart roots, the Heart, endings, endless modes, Foundered 3.6 2 / 3 / 14
M5 Polish data completeness, balance, accessibility, onboarding 2.4 —
1.0 ≈ 33 76 / 27 / 125 assets, 18 hand edits

A focused 2D tile sim with cellular fluids, lighting, UI and tests usually lands at 25–45 kLOC, so the estimate is within range. M0 + M1 is 46% of the code because it builds every foundation (renderer, sim core, UI kit). Each later milestone is mostly content and rules on top of it.

19.3 The M1 manifest (the smallest slice that proves the promise)

World. The surface island only: the GDD §4.3 starting layout on a 64-wide island with 12 rows of soil and clay over undiggable bedrock (B07a). There are no lower strata and no buoyancy.

In M1, with simplifications:

System M1 version
Player walk, jump, climb ladders, dig/place within reach, 30-slot inventory, held lantern
Building planks, glass, roof, ladder, platform, background walls; no structure/integrity (everything holds)
Flux passes 1–5, 8 and rain scrub from fluxcore.py; thresholds and bands; trace haze
Light warm and cool channels, incremental propagation, LUT rendering, flicker
Lamps hearth (fuel: logs; embers floor), candle, lantern (oil), wisp lantern; strain and gutter
Water cellular pond and rain filling it; no pipes, no intake
Weather Clear / Overcast / Rain Markov at Watch boundaries; no wind
Research Ledger essence pages for the 6 primals and Growth, Ash, Salt, Glass (the Correspondence board arrives in M2); Crucible tests at the desk; Glass chain with Ansel's note. No Prism (it needs Glass + Metal).
Automation one machine: the shed Alembic, repaired, distilling from an adjacent chest into adjacent jars (no pipes)
Crafting workbench: planks, glass bulb, candles, lamp oil, net, chest, jar
Life Lantern Tree (logs, leaves, glowfruit), wisps (net, bottle, lantern), silverleaf from the shed's seed packet, nightshade, moths, Wick
Entities gleaners only, with the dark-path flowfield, middens and the fairness rules
Time Nights and Watches, the moon phase, sleep
UI hotbar, inventory, Ledger, Keeper's Log, watch and moon icon, flux and light lenses
Art 79 assets (S10): sky, moon, clouds, rain, parallax, 10 tile types, 16 sprites, 16 icons
Data docs/data/*.json copied verbatim; prefabs authored as JSON tile maps: house (12 × 6), shed (8 × 5)

Not in M1: strata below topsoil, structure, buoyancy, pipes, golems, warp and hallucinations, arrangers, whisperers, dimmers, wind, runoff, the reservoir, mutation, the Prism, the map view.

M1 is a slice for the 10-minute acceptance test, not the whole first hour: §14's 0:50–0:58 beats (the tool cache, the fossil hand) need the fossil layer, so the full first hour becomes playable at M2.

19.4 M1 internal checkpoints (each one deployed when green)

  1. M1.1 "Night island":
    • renderer with the palette LUT; sky, moon, clouds, rain and parallax;
    • procedural tiles; the player walking, digging and placing;
    • static lamps lighting the scene;
    • lanternforge check passing on all assets.
  2. M1.2 "The leak":
    • flux core passes with haze and the lenses;
    • lamps with fuel, strain and gutter; the hearth;
    • the pond and rain; wisps, net and lantern; Wick; the Keeper's Log; Nights and Watches.
  3. M1.3 "The first machine":
    • Ledger and Glass chain; Alembic repair and automation;
    • gleaners and middens; the weather Markov;
    • all M1 acceptance tests (§20.4).

19.5 AI art is an owner step (D41)

The build agent may have no image model, so AI generation is never a blocking build step.

20. Build handoff

20.2 Architecture

/src
  /sim        pure, deterministic, no DOM, no floats in persisted state
    world.ts (grid, typed arrays per field), rng.ts (sfc32 streams per system)
    tiles.ts, flux.ts, light.ts, water.ts, structure.ts, buoyancy.ts, weather.ts,
    time.ts, entities.ts, warp.ts, research.ts, machines.ts, golems.ts, logistics.ts,
    roots.ts, endings.ts, log.ts, commands.ts (player input as serializable commands)
  /render     reads sim state read-only after each tick; never mutates it
    renderer.ts (index buffer → light resolve pass), sky.ts, particles.ts, parallax.ts,
    lut.ts, overlays.ts
  /ui         ledger, HUD, lenses, menus (renders into the same index buffer, unlit)
  /data       JSON definitions (schemas §20.3), validated at load with zod
  /app        main loop: fixed 20 Hz sim, rendering at display rate with interpolation
/tools/lanternforge   Python art pipeline (ART_BIBLE §10)
/tests        vitest (sim), playwright (render), pytest (tools)

20.3 Canonical data and schemas

The data already exists. docs/data/*.json holds:

It's generated by docs/data/make_data.py and checked by docs/data/validate.py (i5: 176 records, 0 problems). The validator checks referential integrity, the pool tier rules, the synthesis-only set, that every essence has a use, that the flux params match S01, and that the S05 recipe generator succeeds on 500 seeds. The build copies these files verbatim to /data and validates them at load with zod schemas mirroring the interfaces below. When a number changes, change make_data.py, re-run it, then update the GDD text.

type Id = string;
type Ref = `item:${Id}` | `essence:${Id}` | `place:${Id}` | `tool:${Id}`;
interface Essence { id: Id; name: string; tier: 0|1|2|3|4; color: number /*palette idx*/; glyph: Id;
  pool: [Id, Id][] | null /*4 pairs; null for primals and taint*/; synthesisOnly: boolean;
  captureOnly?: boolean /*taint*/; identifyWarpP: number; }
interface Item { id: Id; name: string; stack: number; mass: number; composition: Record<Id, number>;
  sources: string[]; icon: Id; fuel_s?: number; distill_warp_p?: number; per_tile?: number; [k: string]: unknown; }
interface Recipe { id: Id; station: "hand"|"workbench"|"assembler"; inputs: {ref: Ref; qty: number}[];
  outputs: {ref: Ref; qty: number}[]; unlock: Id[]; timeS: number; }
interface Tile { id: Id; solid: boolean; mass: number; digS: number /*-1 = unbreakable*/; fluxCap: number;
  absorbent: boolean; lightCost: number; drops: {item: Id; qty: number}[]; strata: string[]; procgen: Id;
  integrity?: {max: number; rest: number; horiz: number; hang: number; anchor: string | null}; }
interface Machine { id: Id; size: [number, number]; unlock: Id[]; build: {ref: Ref; qty: number}[];
  behavior: Id /*key into the behavior registry*/; params: Record<string, unknown>; }
interface Lamp { id: Id; unlock: Id[]; channel: "warm"|"cool"|"both"; level: number; fuel: Ref;
  fuelSecondsPerUnit: number | null; suppressionAE: number; [k: string]: unknown; }
interface Golem { id: Id; unlock: Id[]; recipe: {ref: Ref; qty: number}[]; speedTps: number; carryItems: number;
  carryDrams: number; minLs: number; fluxAE: number; climbs?: boolean; light?: [string, number]; }
interface Tool { id: Id; unlock: Id[]; recipe: {ref: Ref; qty: number}[]; params: Record<string, unknown>; }
interface Entity { id: Id; cost: number; tolerance: number; speedTps: number; spawnFlux: number; behavior: Id;
  params: Record<string, unknown>; }
interface Stratum { id: Id; dMin: number; dMax: number; ambientZone: number; tiles: {id: Id; weight: number}[];
  spawnWeights: Record<Id, number>; }
interface Zone { id: Id; ambientColor: number; ambientStrength: number; darkRamp: number; terrainRamps: number[]; }
// params.json: time, flux, light, warp, buoyancy, attention, player, world, research (all GDD tuning values)

Reference implementations (behaviour the build must match):

20.4 Milestones and acceptance criteria

M0 Foundations.

M1 Surface slice (proves the promise).

M2 Depth I (fossil layer). Structure and integrity, shale cave-ins, beams, golems with chalk routes, keeper sites and journals, the Separator and Prism, arrangers and whisperers, the full weather model, and the reservoir. Accept: S04 world-gen stability holds over 1,000 seeds; the golem route test passes; the arranger restore test passes.

M3 Depth II (crystal layer). Buoyancy, the tide, taps and Resonance, augers, jettison, Lift Bladders, Crystal Lamps, tilt, dimmers, warp and hallucinations with all 6 tells, the Clarity Lens, and the Visitor. Accept: the buoyancy regression matches S03; the hallucination tells test passes (a hallucination never affects light, flux or reflections, or the log).

M4 Depth III (Roots and Heart). Root growth and shoving, Root Stakes, the Heart chamber, the three ending accumulators and endless modes, Foundering and Keeper Records. Accept: scripted saves reach each ending, and each accumulator responds only to its own conditions.

M5 Content, balance and polish. All compounds and blueprints, charters, balance passes against the S06 pacing targets, and accessibility.

20.5 Automated tests the build must have

  1. Sim determinism: for seeds {1, 42, 1337, 2^31−1} and a recorded 10-minute command log, the state hash at ticks 1k, 5k and 12k is identical across runs, and identical between a Node runner and a browser runner.
  2. Flux conservation: for 10,000 steps with random sources and sinks, Σflux(t) = Σflux(0) + emitted − (suppressed + absorbed by sinks + vented), exactly.
  3. Flux regression: golden scenes (shed, shaft pooling, rain scrub, lamp strain) match stored per-cell snapshots at fixed steps.
  4. Buoyancy regression: fixed islands with scripted crystal removal match the A_eq and tide table from S03 (±0 millifathoms).
  5. Structure regression: golden dig scenarios (soil span 10 OK and 11 cracks; shale span 6/7; detach and fall) match.
  6. World-gen invariants: over 1,000 seeds: zero cracking tiles; recipe validation (§6.1.3) passes; the pond holds 40–56 water cells; crystal count is 380–460.
  7. Research solvability: for 1,000 seeds, the S05 solver identifies all compounds.
  8. Palette compliance: every PNG in /assets uses only palette colors with binary alpha; rendered frames in Playwright are 100% palette.
  9. Asset grid compliance: sprite dimensions match their declared sizes, and tiles are 8 × 8 (per frame).
  10. Save/load round-trip: save, then load, then 1,000 ticks gives the same hash as running 1,000 ticks without the save.
  11. Hallucination isolation: at W = 100 for 1 Night, the sim state hash matches the same run at W = 0 except for the warp fields and the RNG warp stream.
  12. Entity fairness: across 100 seeded Nights, no entity spawns inside the camera rect, and none enters a cell with Ls ≥ its tolerance.
  13. Data validation: at load, every /data file passes its zod schema and the docs/data/validate.py rules ported to TS (refs, pool tier rules, synthesis-only set, every essence used). CI fails on any problem.
  14. Reference parity: the TS flux step and recipe generator reproduce fluxcore.py and S05 generate() golden outputs for 5 fixed scenes and seeds 0–99.

20.6 World generation (RNG stream worldgen; deterministic)

  1. Seed parameters:
    • W0 ∈ [60, 76], depth D ∈ [172, 184], pond cells ∈ [40, 56], crystal tiles ∈ [380, 460];
    • keepers: Ansel, Tamsin and Ilse, plus 2 of {Odo, Bram, Merrit};
    • weather bias ±30% on the rain transitions.
  2. Profile: for each rock row d, compute half-width hw(d) from §4.1, plus 1D value noise (period 12, amplitude 2) to get the solid span. Base tile by stratum band (strata.json). Mixes come from 2D value noise (period 6) thresholds on the weights: clay pockets in d 3–11, limestone lenses in fossil. Bone inclusions are stamped at 10% inside shale.
  3. Surface:
    • Ground height is noise ±2 tiles (period 16), except a flat 16-tile house plateau left of centre and a pond basin right of centre (width = pond cells ÷ 2.5, depth 2–3) filled with water.
    • The grass layer goes on top.
    • Prefabs (tile maps in data/prefabs/*.json, authored in M1): house 12 × 6 with roof, hearth, bed, table, shelf, door and note; shed 8 × 5 with the broken alembic, chest and silverleaf seeds, placed 10–14 tiles from the house; garden plot 6 × 2; Lantern Tree at least 6 tiles from the house; ladder hatch.
  4. Fossil caves: a cellular automaton on d 14–48 (45% fill, 4 iterations, born at 5+ and survives at 4+ of 8 neighbours). Keep pockets of 12+ cells. Keeper sites (a 6 × 4 prefab: skeleton, journal, cache, broken machine) go in the largest pockets, one per chosen lesson-keeper, plus Tamsin's workshop.
  5. Crystal: random-walk veins (6–14 steps) seeded at x ~ Normal(centre, W0/6), d ~ Uniform(52, 98), plus 2–3 geodes (5 × 4 air lined with crystal). Repeat until the count is in [380, 460]. Carve the 18 × 6 crystal cavern at d 58–64.
  6. Roots: an L-system of 6 primary roots growing up from the Heart chamber (step 1 tile, branch probability 0.15, length 40–60) converts stone to root-wood at d 100–150, plus dangling strands of 3–14 tiles below the bulb.
  7. The Heart chamber: a 22 × 12 cavity at d 155–167 with a heartstone floor, the Heart object, and the three archetype remains.
  8. Stability pass (§4.1): no natural tile with integrity < 20.
  9. Spawns: lit hearth and 2 lanterns (1 lit), Wick on the rug, 2 wisps at the pond, 3 frogs.
  10. M1 runs steps 1 and 3 and 9 only, on a 64-wide island with 12 soil and clay rows over bedrock.

20.7 Controls (mouse + keyboard; all rebindable; no hover-only information)

Action Default
Move / climb A D / W S
Jump Space
Use, dig or place (hold to dig) Left mouse
Interact: open, catch, refuel, sleep Right mouse
Hotbar 1–0, wheel
Inventory and crafting E
Ledger R
Flux lens / light lens F / L
Map (M2+) M
Look down hold Shift
Keeper's Log Tab
Drop Q
Pause and options Esc

Hovering any world object for 0.4 s shows a tooltip. The same tooltip pins with Right-mouse held for 0.4 s, so it works without hover.

20.8 UI flows

20.9 Entity navigation

20.10 Save format

20.11 Player physics (all in params.json › player)

20.12 M1 object behaviours (state machines)