Commit Graph

5 Commits

Author SHA1 Message Date
type-two
68bddbec0a [sim] parity mites + firewall counter (recipe-shape) + reference v6
Round 6 (M3's enemy — THE CORRECTION walks).

- Parity mites (contracts v8): spawn from the world rim as tier-2 corruption
  crosses thresholds, patrol to the nearest tier-2 belt item, dwell, and repair
  it out of existence (emitting 'repaired'), then return to the rim sated. Never
  touch tier-0/1 cargo. Deterministic, save/load carried (no format bump).
- The firewall counter, detected by recipe shape (empty inputs, cans a mite) —
  the same pattern as the mosquito trap, so DATA's real firewall (landed
  mid-round) lights up with zero code. The repair dwell is the window a firewall
  needs to intercept a correction before it lands.
- Reference factory v6 auto-places DATA's firewall on the melt uplink approach,
  belted to a shipper so it never clogs; melt regression + zero-brownout intact.
- 11 new mite tests; 113 sim tests, 481 repo tests green; tsc clean. Verified in
  the browser: melt tick 1247 identical to Node, firewall canning live.
- Reshaped reference.test's demuxer assertion to sample a window (the ~18%
  transient press back-pressure is pre-existing; a single-tick check was a
  coin-flip). See LANE-SIM NOTES.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-20 18:49:36 +10:00
LANE-SIM
71c885e009 [sim] the relic, wildlife, seams, research time, grantResearch, reference v5
Round 5 (MEGA) per lanes/LANE-SIM.md.

- THE RELIC: one optical fossil per world, position a pure function of the
  seed, 18-28 tiles out, never on a seam, never under the demo. excavate
  within a tile uncovers it; it stays found through save/load forever.
  Folds into DATA's relicReserve when the seam map supplies one
- wildlife v1: piles grow from dust a machine is BACKED UP on, not dust
  merely present -- belt your dust away and nothing ever hatches. First
  cut grew from raw held and the tidy factory still bred 56 swarms; the
  asymmetry is the whole mechanic. Swarms drift to production machinery
  and slow it; traps are recognised by recipe shape (no inputs, cans a
  swarm) so DATA's real trap needs no code. SWARM_MAX caps a plague at 8
  -- a permanently jammed machine bred 29 in one demo run
- seams: extractors idle with 'no seam' off-ore. Consumes DATA's real
  seams.json shape, defensively -- GameData.seams still needs wiring
- research takes time: RESEARCH_TICKS_PER_PACK, stepped whole packs; two
  labs measurably halve the wait (200 ticks vs 260)
- grantResearch: idempotent, save/load safe, verified through the live bus
- reference v5: a second works on the eastern seam that researches a tech
  at tick 1235. Separate from the melt line by choice -- the western
  floorplan has no columns left and threading three ingredients through it
  would make the melt regression hostage to the science

Melt still first at 1247, still shipping at 20k, zero brownout ticks,
179/179 placements legal, zero extractors off-seam once seams are wired.
99 sim tests, 446 across the repo. 63x realtime at 3,500 entities.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-18 14:07:08 +10:00
LANE-SIM
039eff15fa [sim] research + gating, spatial cooling, exported constants, reference v4
Round 4 per lanes/LANE-SIM.md.

- research v1: kind:'lab', setResearch, snapshot.research, 'researched'.
  Gating: any id a tech unlocks is refused until that tech lands; ids no
  tech names are free forever. Labs take only what the active tech still
  needs; several labs feed one total; research survives save/load as a
  RULE, so a restored save can still build what it unlocked
- realtech.test.ts: a cold-start research run on DATA's own tree -- ore ->
  packs -> archaeology lab -> tech -> a refused recipe now accepted. Also
  the tripwire if the tech bootstrap ever closes over again; it was
  circular and unenterable at the start of this round
- spatial cooling: coolRadius, chebyshev from the footprint, auras sum,
  total capped at HEAT_COOL_MAX (0.05 -- past that a stack buys nothing
  but still costs bandwidth and floor). Proven by measuring shed rate
- src/sim/constants.ts: 12 constants so DATA imports truth instead of
  hand-copying numbers that go stale in silence
- reference v4: anchor-slab overflow tap, so the demo ships slabs (18 per
  20k). Needed TWO melt lanes: with one, melt spills onto the slab lane
  and the splitter phase-locks with the reactor's push order -- slab to
  the assembler, melt to the uplink, forever, and no slab ever sold. It
  passed 20k ticks looking perfect. referenceFactoryTech() derives the
  techs the layout needs, from the commands
- also wired: bandwidth.capacity, EntityState.scrammed, commissionQueue

65 sim tests, 318 across the repo. Melt still tick 1248, zero brownouts
over 20k.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 20:20:32 +10:00
type-two
45003db31a [ui] REMOVE mode: X arms it, click demolishes, Esc stands down
A misplaced machine is finally undoable by mouse. The REMOVE button sits
with the tabs rather than on a page, because it's a mode, not a machine, and
it has to be reachable from any page. It stays armed between clicks —
demolition is usually plural — and clicking open ground does nothing, so a
stray click never reads as a broken tool. Toast: "UNIT RECLAIMED. THE FLOOR
REMEMBERS."

LANE-RENDER: the hover hook is the __remove ghost sentinel. The UI has no
Renderer reference and the only channel to the ghost is selectedBuild(),
which main.ts feeds to setGhost — so while remove is armed, bus._sel reads
{def: '__remove', dir: 0}. Key the demolition tint off that def id. It's safe
because sim's place handler ignores unknown defs, so main.ts's click-to-place
fires a place for __remove and nothing happens; the UI dispatches the real
remove itself. Exported as REMOVE_DEF and pinned by a test.

A magic string shared between two lanes via a NOTES file is not a design;
contract request filed for UIBus.setGhostMode.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 18:34:05 +10:00
LANE-SIM
ff43c09972 [sim] splitters, buffer tanks, heat, commission queue, starved, item ids
Round 2 per lanes/LANE-SIM.md.

- splitters: round-robin across outward-facing belts, blocked outputs
  skipped not waited on; rank now traces THROUGH splitters and takes the
  best outcome reachable across every terminal a lane reaches
- buffer tanks: charge on surplus, discharge to cover deficit, brownout
  only once dry; bandwidth.stored is the pool
- heat v1: heatPerTick while active + RecipeDef.heat per craft, ambient
  cooling, linear throttle 1.0@0.7 -> 0.5@1.0, scram at 1.0, restart
  under 0.5, both edges emit 'scram'. Throttle applies to powerGen too,
  so a hot decoder sags before it drops off the bus
- commission queue: data-order activation, repeat re-enters at the back
- jammed:'starved' (edge-triggered) and BeltItem.id (stable through belt
  transfers and splitters alike)

15 new fixture tests for the M2 mechanics -- data/ carries none of the v2
fields yet, so heat and tanks are tested against a fixture this lane owns.

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