Compare commits

..
66 Commits
Author SHA1 Message Date
44r0n7andClaude Opus 5.5 64ff8310f3 Keep the task board, notes and agent instructions out of the repo
They stay on the owner's machine: .kandown/, tasks/, docs/kandown.md, NOTES.md, CLAUDE.md and
AGENTS.md are ignored, and the README and project map say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:59:24 -04:00
44r0n7andClaude Opus 5.5 0a8847594e A loaded world starts around the player first, the rest a few areas a tick (t21)
- Areas within 150 grains of the bot start at once; the others 12 a tick, nearest first, and any
  the bot flies toward start straight away. A Huge world is fully started after 17 s.
- Huge world, first 600 ticks: average 15.2 -> 5.5 ms/tick, worst 79.7 -> 16.2.
- New test/t_load.js.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:41:57 -04:00
44r0n7andClaude Opus 5.5 7fa1056e09 Refactor: merge duplicated rules, split the largest files by topic (t21)
- One helper each for wall and mold refunds, tube edges and lanes, pipe text, piece dimensions,
  font lookup, reach circles and surface averaging.
- previews, smooth, notebook, materials, worldgen and selection split into topic files
  (preview-drill, preview-selection, smooth-shaders, notebook-market, notebook-blueprints,
  material-tables, worldgen-helpers, selection-pickers, selection-panels).
- Every suite's output identical apart from timings; seeds make the same worlds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:35:12 -04:00
44r0n7andClaude Opus 5.5 9937683a2c Faster roof scan and heat pass with identical results (t21)
- The roof is rescanned only in area columns that changed since the last scan: a quiet Huge
  world goes from 4.60 to 1.88 ms per scan (every 20 ticks).
- The heat pass skips react() for solids and powders below their first reaction threshold:
  Huge world digging 2.54 -> 2.34 ms/tick, quiet 1.39 -> 1.18.
- Every suite's output is identical apart from timing lines; seeds make the same worlds.
- test/t_sim_optimizations.js checks the dirty roof against a full scan and the heat loop
  against the reference loop byte for byte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:18:50 -04:00
44r0n7andClaude Opus 5.5 cce81e4eca Piles near the bot sort, and 20 times faster; burning fuel keeps the slow pace (t21)
- SORTP 0.003 -> 0.06: ore sinks through 8 rows of ash in about 7 s near the bot.
- wakeBotPowder(): every 8 ticks, areas with loose grains within 100 grains of the bot get a
  sorting chance; far away, resting piles still sleep.
- Sinking through burning fuel stays at 0.003, so buried burning piles still char and furnace
  beds behave as tuned. World generation settles at the old rate: seeds are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 22:05:03 -04:00
44r0n7andClaude Opus 5.5 9be04471ee Physics test pass for sand, molten metal and gases; stuck gas finishes, steam is not deleted (t21)
- New test/t_physics.js: heaps, sorting, sinking, world edges; molten copper levelling, setting,
  quenching, slag over copper, cavity filling; smoke, steam, fire, sealed pockets, the top row.
- Gas in a sealed pocket kept its area asleep and never faded or condensed: gas() keeps its area
  awake while it lasts.
- A rain drop or blown grain landing on steam deleted the steam's water: it goes to the clouds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 21:55:04 -04:00
44r0n7andClaude Opus 5.5 ea1dd387b1 Water pours off ledges several times faster, raining clouds spread boiled-off water (t21)
- Liquids step up to 8 cells a tick toward a drop (fewer the thicker they are), and a top-layer
  grain looks 4 times as far for one, so pools empty and thin film drains. A 100-wide pool
  empties in about 50 s; the old code left 24-650 grains stranded on wide ledges.
- Only a top-layer grain stepping sideways wakes the row ahead, so settled lakes still sleep.
- World generation settles at the old speed: seeds make the same worlds as before.
- Cooled steam under a roof no longer stays steam for ever (its heat area slept).
- Raining clouds keep drifting at half pace and rain over a band either side, so a waterfall into
  a hot shaft no longer rains straight back on its own lake.
- New test/t_water.js; t_weather rain-location checks; t_conveyors counts steam in flight;
  t_molds seeds the random burning-bed check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 20:44:06 -04:00
44r0n7andClaude Opus 5.5 99d04b4972 Bar rack blocks: store 50 bars each, F lets them out oldest first (t1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:53:09 -04:00
44r0n7andClaude Opus 5.5 f34c34aa73 Bars snap to a 2-grain grid and tip into gaps, so piles stack without air (t1)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:41:04 -04:00
44r0n7andClaude Opus 5.5 d2eb388729 Backlog: merge related tasks into four and rewrite them
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:28:00 -04:00
44r0n7andClaude Opus 5.5 c8d397e19a Minimap with zoom in the bottom right, full map on M; cards move to the bottom centre (t32)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:23:43 -04:00
44r0n7andClaude Opus 5.5 945e5205b8 New worlds get generated camp names like new claims (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:00:22 -04:00
44r0n7andClaude Opus 5.5 66543bbd4b Progress bar and steps while generating, loading, opening claims and travelling; saving chip (t30)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:54:06 -04:00
44r0n7andClaude Opus 5.5 4d5fca6dae New claims get camp names from their seed, renameable from the Claims tab; add t30 (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:38:26 -04:00
44r0n7andClaude Opus 5.5 c302b0cf42 No deep ore in rock hot enough to light or melt it; reloaded worlds settle again (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:25:13 -04:00
44r0n7andClaude Opus 5.5 28893c93bc New claims: open another claim once one is paid off, travel between them (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 18:06:01 -04:00
44r0n7andClaude Opus 5.5 282e9ce9ab Huge world size, and saves are gzip-compressed (about 60x smaller) (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 17:51:42 -04:00
44r0n7andClaude Opus 5.5 06f8f90f19 Waste rock pays: richer granite and basalt grinding, bulk rock orders (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 17:39:30 -04:00
44r0n7andClaude Opus 5.5 9682cab6d4 Deeper is richer: about 4.7x the ore in a world, shallow layers unchanged (t3)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 17:30:51 -04:00
44r0n7andClaude Opus 5.5 c7256557bb Brick press: clay lumps into green bricks that fire into Bricks (t28)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:55:54 -04:00
44r0n7andClaude Opus 5.5 b76f4516b7 Saw cuts wood chunks into Planks; stone bricks are now Stone blocks (t4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:50:35 -04:00
44r0n7andClaude Opus 5.5 94891db349 Grinders look like a pair of grinding wheels, Saws like a round blade (t4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:43:15 -04:00
44r0n7andClaude Opus 5.5 f4eddfb82b Remove the Refiner and Stone cutter; old saves refund them on load (t4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:39:27 -04:00
44r0n7andClaude Opus 5.5 8d9e9c546b Grinder and Saw hopper blocks replace the Refiner and Stone cutter in the menu (t4)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:06:51 -04:00
44r0n7andClaude Opus 5.5 01403bb95e Pneumatic nozzle: air streaks while sucking and blowing (t25)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:27:18 -04:00
44r0n7andClaude Opus 5.5 c95cc48340 The Vacuum is renamed the Pneumatic nozzle, with a title row in its card (t26)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:18:52 -04:00
44r0n7andClaude Opus 5.5 67b6aba6eb Tool messages show as toasts, the card status line is gone (t27)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:14:46 -04:00
44r0n7andClaude Opus 5.5 196ce5ce62 Bag: hint and Clear selection stay visible under the list (t20)
The hint and Clear button were inside the scrolling bag list, so a long
Ctrl list scrolled them away. They now sit in a footer under the list, and
Clear is a full-width, highlighted "Clear selection" button.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 14:29:02 -04:00
44r0n7andClaude Opus 5.5 d643718c48 Vacuum: deselect what is blown out, Ctrl + wheel scrolls the bag, Ctrl+click fix (t20)
Blowing out the last of a selected material removes it from the selection,
so an emptied selection picks up what you click again. Ctrl + wheel never
zooms the page and scrolls the bag list under the mouse. A bag click while
Ctrl is held adds to the selection even if the click lacks the Ctrl flag.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 14:16:47 -04:00
44r0n7andClaude Opus 5.5 2cf9cb843c Vacuum: one selection for pick-up and blow, full list while Ctrl is held (t20)
With anything selected a drag takes only the selection; with nothing
selected it takes what you click. Right click blows the selected materials
in the bag. Holding Ctrl lists every material found so far under "Not in
bag". Selections stay when materials run out; Clear button, clicking the
only selected row, or gamepad B clears.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:57:43 -04:00
44r0n7andClaude Opus 5.5 c1a085ebb1 Vacuum: pick up what you click, blow out what's in hand (t20)
A drag takes only the material it starts on (Shift: everything). The blow
selection is the hand: click or Q/E for one material, Ctrl+click for a mix.
Empty materials leave the hand, an empty hand blows nothing, and a pickup
fills an empty hand. Removes the pick-up marks and the F vacuum menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:34:44 -04:00
44r0n7andClaude Opus 5.5 14194cb4be Fog of war: unexplored is black, fades ease into it with no stepped rim (t17)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 12:59:00 -04:00
44r0n7andClaude Opus 5.5 a18dcda8a4 Fog of war: wider fades and a grainy edge instead of stepped lines (t17)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 12:39:13 -04:00
44r0n7andClaude Opus 5.5 1f56d27ded Fog of war reveals the ground around the bot through rock (t17)
Also: board rule to write tasks from chat in our own words, task
descriptions rewritten that way, and a note on lost web-board descriptions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 12:29:08 -04:00
44r0n7andClaude Opus 5.5 ec687b8c6c Vacuum: holding Shift shows the blow-everything mix on the card and in the bag (t19)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:59:05 -04:00
44r0n7andClaude Opus 5.5 209d065f4e Vacuum: Shift blows everything, Ctrl+click in the bag, one-line menu rows (t16)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 02:52:56 -04:00
44r0n7andClaude Opus 5.5 aa46406c92 Vacuum menu on F replaces the pick-up modes (t16)
Pick-up takes everything unless something is marked; F with the Vacuum
(when nothing in reach can be used) or the card chips open a menu with
pick-up and blow toggles per material. The bag rows lose their buttons.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 02:28:56 -04:00
44r0n7andClaude Opus 5.5 255824ec6d Vacuum controls: pick-up modes and separate pick-up and blow marks in the bag (t6, t15)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:54:12 -04:00
44r0n7andClaude Opus 5.5 cc6f98a932 Record the owner's decisions for t1, t4 and t6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:42:02 -04:00
44r0n7andClaude Opus 5.5 152a2af6df Fog of war: underground is black until the bot has seen it (t8)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:37:34 -04:00
44r0n7andClaude Opus 5.5 a730a7d73c Material menu for walls and molds, opened with F (t5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:26:29 -04:00
44r0n7andClaude Opus 5.5 f3cedcacc8 Name box in the New world panel (t10)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:19:25 -04:00
44r0n7andClaude Opus 5.5 36f82712ab Setting to stop the camera drifting toward the pointer (t7)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:15:36 -04:00
44r0n7andClaude Opus 5.5 41663761fb tools/serve.py: build, serve and rebuild on change (t9)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:07:08 -04:00
44r0n7andClaude Opus 5.5 f822db8c50 Loading a world clears cards left from the last one (t11)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 01:04:25 -04:00
44r0n7andClaude Opus 5.5 11f6357c09 Move the to-do list from NOTES.md to a kandown board
Each note is a task in tasks/ with the owner's words under ## Context; the
board rules are in .kandown/kandown_work.md and docs/kandown.md explains how
kandown works here.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:44:22 -04:00
44r0n7andClaude Opus 5.5 dc873ecb8b Several worlds: a Worlds list with load, rename and delete; old save migrates to World 1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:20:18 -04:00
44r0n7andClaude Opus 5.5 9df161046d Screw tubes carry bars, one whole bar at a time
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:09:33 -04:00
44r0n7andClaude Opus 5.5 9340bc132b Screw tubes use all their lanes: grains spread sideways inside a tube
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 00:00:05 -04:00
44r0n7andClaude Opus 5.5 ddfe78cf01 Build card describes the build tool in general, not the selected piece
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:42:38 -04:00
44r0n7andClaude Opus 5.5 c50444b333 World sounds are heard in a radius around the bot, not the view
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:40:08 -04:00
44r0n7andClaude Opus 5.5 daf91891fc F on an ingot mold does nothing and says nothing
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:37:49 -04:00
44r0n7andClaude Opus 5.5 92f33b11c9 Docs: the snapping sound confirmed in the owner's world (water boiling on hot deep rock)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:18:49 -04:00
44r0n7andClaude Opus 5.5 b70bb1f640 Silo: pixel-art version for the pixel look
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:16:27 -04:00
44r0n7andClaude Opus 5.5 2b68b5d583 World sounds are local: fade with distance and pan (distant sizzles snapped constantly)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:08:10 -04:00
44r0n7andClaude Opus 5.5 10911d4c86 Fewer, smaller messages: mold percentages, markers for machine heat, short status lines
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 23:03:45 -04:00
44r0n7andClaude Opus 5.5 a15af6ef9f Ingot molds empty themselves (no F); removing a mold returns its set metal
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 22:53:38 -04:00
44r0n7andClaude Opus 5.5 9bbddc1e20 Build tool: compact top-left card again; status row moved off the build bar
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:24:46 -04:00
44r0n7andClaude Opus 5.5 f953a9cc51 Replace is held G instead of Ctrl (Ctrl+W/Ctrl+D were hit while flying)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 20:16:59 -04:00
44r0n7andClaude Opus 5.5 97c5ca4668 Ask before leaving the page while a world is open (Ctrl+W closed the game)
Ctrl (replace) + W (fly) hits the browser's close-tab shortcut, which a page
cannot block. A beforeunload prompt now catches it. Autosave on hiding the
tab no longer depends on the audio context.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:47:27 -04:00
44r0n7andClaude Opus 5.5 fec4f3bfe1 Build menu: hover popup with full info, top-left card hidden while building
The short description row became a status row for the selected piece
(variant, Replace, ghosts, messages). Gamepad shows the selected tile's popup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:21:23 -04:00
44r0n7andClaude Opus 5.5 caa2463fda Belts: a backed-up heap stands still instead of the top sliding over the bottom
carryColumn stops at the first blocked grain on a belt, so a heap whose front
is backed up (a screw tube taking less than the belt brings, or a wall) no
longer shears. New t_conveyors checks and a belt-heap screenshot scene.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:07:28 -04:00
44r0n7andClaude Opus 5.5 de677b49c5 Ingot molds drop bars out of the bottom on their own
Bars no longer get thrown up into the furnace, and F is no longer needed to
collect them. Blocked bars wait in the trough; the short stub stays for the
next firing; F is optional upkeep (clean, chip slag, rake).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 19:00:12 -04:00
44r0n7andClaude Opus 5.5 6676d99c66 Build menu: Shift+Q/E switch tabs, G no longer picks (middle mouse does)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:12:51 -04:00
44r0n7andClaude Opus 5.5 ce7df82b01 Run browser tests locally: Playwright 1.64.1 in .venv, scripts switch to it on their own
The browser tests and screenshot tools now work with plain python3 on a machine whose
system Python refuses pip installs: tools/use_venv.py re-runs them with the repo's .venv.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 16:50:15 -04:00
44r0n7andClaude Opus 5.5 b270c4e818 Deepgrain Foundry: move from a claude.ai artifact to a local repository
The game as of artifact version 24, ready for local development with
coding agents.

- Source split from three large files into 52 small ones under src/sim,
  src/render and src/ui, joined in the order in src/manifest.json by
  build.py. The joined code is unchanged apart from comments; every
  headless suite gives the same output, and screenshots in both looks
  are pixel-identical to before.
- Light tidying with no change in behaviour: one movement scan loop,
  shared hazard-stripe and belt shader helpers, unused code removed, a
  shared check helper for the test suites.
- World files can be exported as an ordinary download outside claude.ai.
- Tests: broken old scripts removed, experiments moved to tools/,
  test/run_all.py added. Tools: shot.py (repeatable screenshots),
  where.py, map.py.
- Docs: AGENTS.md, CLAUDE.md, NOTES.md (the owner's to-do inbox),
  docs/PROJECT_MAP.md, DESIGN.md, TESTING.md, systems notes, the
  owner's requests and an agent log.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K9kLmYADKSEjuwUN3rFxDA
2026-10-23 16:05:31 -04:00
44 changed files with 9 additions and 1325 deletions
+7 -2
View File
@@ -6,5 +6,10 @@ node_modules/
.DS_Store
.venv/
# kandown web app: one 6.5 MB file that `kandown init` / `kandown update` regenerate
.kandown/kandown.html
# kept on this machine only: the kandown task board, the old notes inbox and agent instructions
.kandown/
tasks/
docs/kandown.md
NOTES.md
CLAUDE.md
AGENTS.md
-9
View File
@@ -1,9 +0,0 @@
daemon.json
daemon.lock
.undo/
# Local extension state. Which extensions you enabled and which you trusted is a
# per-machine decision, and a committed copy is ignored at load time anyway
# (see docs/EXTENSIONS.md).
extensions/enabled.json
extensions/trust.json
-56
View File
@@ -1,56 +0,0 @@
# Kandown
File-based kanban for this project. Zero install, zero backend, plain markdown on disk.
## Layout
```
.kandown/ # config, web UI, workflows, skills
├── kandown.html # single-file web app — open this in your browser
├── kandown.json # project preferences, columns, appearance
├── kandown_work.md # optional project agent instructions
├── workflows/ # optional local workflow packages
├── skills/ # optional local Markdown skill packages
└── README.md # this file
tasks/ # source of truth — one .md file per task
├── t1.md
├── t2.md
└── archive/ # archived tasks live here
```
## Usage
1. Open `.kandown/kandown.html` in Chrome, Edge, Brave or Opera (File System Access API required)
2. Click **Select folder** and pick the **project root** (the parent of `.kandown/`), then grant read/write permission
3. That's it
The app remembers the last 10 projects you've opened — no need to re-select the folder each time.
## Settings
Open Settings from the app header to tune this project. Board columns are stored in `.kandown/kandown.json` at `board.columns`. Each task chooses a column with its frontmatter `status`.
## Editing without the app
Everything is plain markdown. Edit files directly in your IDE, Obsidian, or vim. Click **Reload** in the app (or press `R`) to see changes.
The task editor includes a markdown-backed subtask checklist. Add steps with **Add subtask**, press **Enter** to insert another step, and expand a step to edit its description or report. Changes are saved back to the task file automatically.
## For AI agents
Run `kandown work` for the current agent protocol and live board context. Each task file in `tasks/` is its own source of truth. Moving a task means editing its frontmatter `status`.
## Keyboard shortcuts
| Key | Action |
|---|---|
| `⌘K` / `Ctrl+K` | Command palette |
| `⌘1` / `Ctrl+1` | Board view |
| `⌘2` / `Ctrl+2` | List view |
| `N` | New task |
| `R` | Reload |
| `/` | Focus search |
| `Esc` | Close drawer / palette |
| `⌘S` | Save current task |
| `⌘⌫` | Delete task (with confirmation) |
-74
View File
@@ -1,74 +0,0 @@
{
"version": 1,
"preferred": "claude",
"cascade": {
"unassignedBehavior": "skip",
"sameSessionChain": false
},
"agents": [
{
"id": "claude",
"name": "Claude Code",
"bin": "claude",
"interactive": true,
"description": "Anthropic Claude (interactive session)",
"aliases": ["claude", "claudecode", "anthropic", "claudeai"]
},
{
"id": "codex",
"name": "OpenAI Codex",
"bin": "codex",
"interactive": true,
"description": "OpenAI Codex CLI",
"aliases": ["codex", "openaicodex"]
},
{
"id": "gemini",
"name": "Gemini CLI",
"bin": "gemini",
"interactive": true,
"description": "Google Gemini CLI",
"aliases": ["gemini", "geminicli", "googlegemini"]
},
{
"id": "goose",
"name": "Goose",
"bin": "goose",
"interactive": false,
"description": "Block open-source AI agent",
"aliases": ["goose", "blockgoose"]
},
{
"id": "aider",
"name": "Aider",
"bin": "aider",
"interactive": true,
"description": "Git-aware AI pair programmer",
"aliases": ["aider"]
},
{
"id": "opencode",
"name": "OpenCode",
"bin": "opencode",
"interactive": true,
"description": "SST AI coding TUI",
"aliases": ["opencode", "sstopencode"]
},
{
"id": "cursor",
"name": "Cursor",
"bin": "cursor",
"interactive": true,
"description": "Cursor IDE (opens project; paste prompt)",
"aliases": ["cursor"]
},
{
"id": "pi",
"name": "Pi",
"bin": "pi",
"interactive": true,
"description": "Earendil Works pi coding agent",
"aliases": ["pi", "piearendil", "picodingagent"]
}
]
}
-107
View File
@@ -1,107 +0,0 @@
{
"ui": {
"language": "en",
"theme": "dark",
"skin": "kandown",
"font": "inter",
"background": "solid",
"onboardingCompleted": true,
"categoryChips": true
},
"agent": {
"suggestFollowUp": false,
"maxSuggestions": 3,
"workOutput": {
"detailMode": "complete",
"boardDigest": {
"showColumnCounts": true,
"showTasks": true,
"showPriority": true,
"showAssignee": true,
"showBlockedBy": true,
"showNextActionable": true
}
}
},
"workflow": {
"active": "guided-feature",
"skills": [],
"trackingCadence": "balanced"
},
"board": {
"columns": [
"Backlog",
"Todo",
"In Progress",
"Review",
"Done"
],
"defaultPriority": "P3",
"defaultOwnerType": "human",
"columnColors": {
"backlog": "red",
"todo": "blue",
"in progress": "orange",
"review": "violet",
"done": "yellow"
},
"columnMeta": {
"Backlog": {
"role": "backlog",
"instructions": "Capture unscheduled work here. Keep enough context to decide whether it belongs in this workflow."
},
"Todo": {
"role": "ready",
"instructions": "Only move work here when its required inputs, acceptance criteria, dependencies, and approvals are ready."
},
"In Progress": {
"role": "active",
"instructions": "Execute the current workflow phase, update the checklist as work happens, and record blockers immediately."
},
"Review": {
"role": "review",
"instructions": "Finished work waits here for the owner to check in the game. Only the owner moves it to Done; if it isn't fixed, the owner moves it back with feedback."
},
"Done": {
"role": "terminal",
"instructions": "Only accept work whose criteria and required review are satisfied. Preserve the completion report and evidence."
}
},
"stackDefaultState": "collapsed"
},
"tui": {
"defaultView": "list",
"showDetailPane": true,
"listSort": "status",
"listSortDir": "asc",
"columns": {
"age": true,
"status": true,
"priority": true,
"owner": true,
"deps": true,
"tags": false,
"assignee": true
}
},
"fields": {
"priority": true,
"assignee": false,
"tags": true,
"dueDate": false,
"ownerType": false,
"tools": false
},
"notifications": {
"browser": false,
"sound": true,
"soundId": "soft",
"statusChanges": false,
"taskEdits": false,
"subtaskCompletions": true,
"editDebounceMs": 2000
},
"extensions": {
"restricted": true
}
}
-30
View File
@@ -1,30 +0,0 @@
## Deepgrain Foundry: working the board
The board is the owner's to-do list. `docs/kandown.md` explains how kandown works here.
- **Work on tasks only when the owner asks** ("do the next task", "do t8"). Don't pick up work
on your own.
- **Kinds of task.**
- **Todo**: things to build or fix.
- **Backlog, tagged `discussion`**: give options with trade-offs and a recommendation, in
chat, and write nothing in code until the owner decides. Then record the decision.
- **Backlog, tagged `idea`**: ideas for later. Leave them alone unless asked.
- Questions get answers.
- **Keep the owner's words.** Never rewrite or tidy text the owner wrote in a task file, and don't
rename tasks the owner made. Add what you learn as `## Subtasks` with `report:` lines, or in
the `report` field.
- **Writing tasks from chat.** When you write a description, task or subtask from what the owner
said in chat, write it fully in your own words as a clear description of what they want. Don't
label it as the owner's, add dates, or quote them.
- **When a task is finished**, move it to **Review** (that is "done, please check") and set the
`report` field: what changed, and how to check it in the game. Never move a task to Done:
the owner does that after checking it. If the owner moves it back with feedback, keep the
feedback and work from it.
- **Log your work.** Add an entry at the top of `docs/agent-log.md` with the date, the task id
and title, what changed, the files touched, the tests run, and anything left open.
- **Record decisions.** When the owner decides something about the design, add it to the
decisions list in `docs/DESIGN.md` with the date and the reason they gave.
- **Commit task files with the work** they describe. The owner may be editing tasks too: stage
only the task files you changed.
- **New tasks the owner asks for**: `kandown create "title" --to Todo` (add `-t discussion` or
`-t idea` for Backlog), then describe the task under `## Context`.
-180
View File
@@ -1,180 +0,0 @@
# Deepgrain Foundry: instructions for coding agents
Deepgrain Foundry is a 2D falling-sand factory game in the style of Sandustry, set in a
Terraria-like side-view world. Every grain of sand, ore, water and fire is simulated. The player
flies a small bot, digs with a resonance drill, vacuums up loose material, builds furnaces,
belts, tubes and machines from blocks, casts metal in molds and sells goods at a trade dock to
pay off a land claim. It runs in the browser as one self-contained HTML page, built from small
JavaScript files with no dependencies.
The owner (the user) directs the work and is the real playtester. You build, test and report.
## Start of every session
1. Run `kandown work`. It prints the user's task board and the rules for working it (see
"Working from the task board" below).
2. Read `docs/PROJECT_MAP.md` before searching the code. It says where everything lives. Its
index lists every top-level function and variable by file.
3. Before changing how the game plays, read the relevant part of `docs/DESIGN.md`. Many choices
were made deliberately and are recorded there with the reason.
4. Look at the top of `docs/agent-log.md` for what was done recently.
## Honesty and accuracy
These rules matter more than speed.
- **Do not guess or assume.** If you have not checked something, say so. Keep "I tested this and
it works" separate from "this should work".
- **Prove it with the game.** Run the tests. For anything visible, take a screenshot and look at
it before saying it looks right (see "Testing"). A passing test only covers what it checks.
- **Never invent names.** Look a function or variable up in the project map's index, or search
for it (`rg name src`), before you use it or talk about it.
- **When you are not confident, check more than one source.** Use the web for anything outside
this repository: browser APIs, Playwright, WebGL, real-world materials and temperatures,
physics, how other games do something. Confirm important facts with at least two independent
sources, and give the links.
- **Report problems plainly.** Say when a test fails, when something is only partly done, or when
you could not reproduce a problem. Never weaken or delete a test just to make it pass. If a
test's expectation is outdated because the design changed on purpose, update it and say why.
- **Ask when it matters.** If a request is unclear and getting it wrong would waste a lot of work,
ask first. If the choice is small or easy to undo, take the sensible reading, say which one you
took, and carry on.
## Working from the task board
The user's to-do list is a kandown board: one Markdown file per task in `tasks/`. **Read
`docs/kandown.md` before using it**: it says how the board works here, which commands are safe
(never run `kandown <command> --help`: it runs the command), and what a task file looks like.
The rules for working the board are in `.kandown/kandown_work.md`, and `kandown work` prints
them. In short:
- Work on tasks only when asked. Todo tasks are built; Backlog tasks tagged `discussion` get
options with trade-offs and a recommendation, and nothing is built until the user decides.
- Never reword the user's words in a task's `## Context`. Add your notes as subtasks with
`report:` lines, or in the `report` field.
- When a task is finished, move it to **Review** with a `report` saying what changed and how to
check it in the game. Only the user moves tasks to Done.
- **Log your work.** Add an entry at the top of `docs/agent-log.md` with the date, the task,
what changed, the files touched, the tests run, and anything left open.
- **Record decisions.** When the user decides something about the design, add it to the
decisions list in `docs/DESIGN.md` with the date and the reason they gave.
## Commands
```sh
python3 build.py # build dist/index.html from src/ (takes a second)
python3 tools/serve.py # build, serve at http://localhost:8000, rebuild on src/ changes
python3 test/run_all.py # all headless test suites, in parallel (about a minute)
python3 test/run_all.py pipes # only suites whose name contains "pipes"
python3 test/run_all.py --browser # also the browser tests (rebuilds first; about 3 more minutes)
node test/t_pipes.js # one suite
python3 tools/shot.py shots/x.png --setup tools/scenes/clear-sky.js --js "..." --ticks 60
python3 tools/where.py 7614 # which source line is line 7614 of dist/index.html
python3 tools/map.py # regenerate the index in docs/PROJECT_MAP.md
```
You need Node (tested with 22) and Python 3. Playwright for Python and its Chromium live in
`.venv/` in the repo (not committed); set up as in README.md → Develop. The browser scripts and
`tools/shot.py` switch to `.venv` by themselves (`tools/use_venv.py`), so the commands above work
with plain `python3`.
## How the code is put together
- `build.py` joins the files listed in `src/manifest.json`, in order, into one classic script
inside `src/shell.html`. The output is `dist/index.html`. There are no modules and no
import/export: every file shares one global scope.
- **Order matters only for code that runs when the page loads.** A function can call a function
from any file. But a top-level `const`/`let` must come before top-level code that uses it. New
files go into the manifest in the right place: simulation first, then render, then UI.
- `'use strict'` at the top of `src/sim/base.js` applies to the whole bundle.
- **`src/sim/` must never touch the DOM** (no `document`, `window`, canvas or `localStorage`).
The headless tests load only these files, and keeping the simulation pure keeps a later port to
Rust or WebAssembly possible.
- **Keep files small and on one topic.** Aim for under about 400 lines. Split a file that grows
past that along a clear seam, add the new file to the manifest, and rebuild. Then run
`python3 tools/map.py` and update the hand-written part of the project map.
- **Errors point at real files.** In Node tests, stack traces name the source file and line. In
the browser they point into `dist/index.html`; use `tools/where.py` to find the source line
(`tools/shot.py` does this for you).
## Rules for the simulation
- **Performance.** The simulation runs 60 ticks a second over millions of cells.
- Use the existing typed arrays.
- Do not allocate objects or arrays inside per-cell loops.
- Only chunks that are awake (32×32 grains) are simulated. After changing cells directly,
wake them; `setCell` already does.
- Measure before and after anything in a hot path (`tools/perf.py`,
`tools/experiments/factory_cost.js`).
- **Determinism.** Randomness in `src/sim/` comes only from `rnd()` (seeded) or `mulberry32`.
Never use `Math.random` there. The headless tests rely on this: the same code gives the same
output, line for line.
- **Save compatibility.** The user has saved worlds they care about. Material ids, block codes
(`BP_*`), part ids (`P_*`) and machine type names are stored in saves.
- Never renumber or reuse them. Add new ones at the end (raise `NMAT` for materials).
- New saved fields need a default when an older save lacks them. Migrations go in
`deserializeWorld` (`src/sim/save.js`).
- Only raise `SAVE_VERSION` if old saves truly cannot be read any more, and tell the user first.
- **Undo.** Every building action the player takes must be undoable. Wrap it in
`undoRecord(label, fn)`. The functions that place and remove things record their own steps
with `undoNote`. The bot building ghosts is never an undo step of its own.
## Checklists
**A new material.** It needs:
- an id constant in `src/sim/materials.js` (at the end, before `NMAT`, and raise `NMAT`);
- a `def(...)` entry with a plain description;
- its price in `PRICE` (`src/sim/economy.js`) if it can be sold;
- its place in `BAG_ORDER` (`src/ui/state.js`) if it can go in the bag;
- its place in `MARKET_GROUPS` (`src/ui/notebook.js`) if it is sold;
- any special tables it belongs to: `CASTMETAL`, `SOLIDMETAL`, `METAL_TIER`, `BAR_OF`,
`WALL_OF`/`WALL_LIST`, `REFINE`, `HOTLIQ`, `DROSS`.
Check its colour in both looks.
**A new buildable piece.** It needs:
- an entry in `PIECES` (`src/sim/pieces.js`) with cost and description;
- a block code or machine footprint;
- placing and removing that support undo and Ctrl-replace;
- a tile in `BUILD_CATS` and an icon in `PIECE_ICONS` (`src/ui/build-menu.js`);
- hover info (`hoverInfo` in `src/ui/info.js`);
- drawing in `src/render/` (pixel look, and a smooth-look class if it needs one);
- saving and loading of any state it keeps;
- a line in the controls help (`controlsHtml` in `src/ui/notebook.js`) if it adds controls;
- a headless test.
**Text the player reads** (descriptions, toasts, hover info, help):
- plain words and short sentences;
- what it does and how to use it;
- °C for temperatures, "grains" for cells, "blocks" for the 4×4 build grid;
- no programmer words.
Match the existing descriptions in `PIECES` and the material `def`s.
## Testing
`docs/TESTING.md` has the details: the harness, how to write a suite, the browser tests,
screenshots and the pitfalls. The essentials:
- Every change to the simulation gets a headless check in a `test/t_*.js` suite. Write the
check first when fixing a bug, and see it fail.
- **Test in the pixel look** (the default in the tools). Use the smooth look only when checking
graphics, and then check both looks.
- Look at your screenshots. Open the PNG and check it shows what you meant, especially after
changing anything drawn.
- Before you say you are finished, run `python3 test/run_all.py`. After changing anything in
`src/ui/` or `src/render/`, run `python3 test/run_all.py --browser` too.
- **For a refactor** that should not change behaviour, save the suites' output before and after
and diff them. The headless suites are deterministic, so any difference is a real change (lines
with timings in ms excepted).
## Git
- Small commits, one change each, with a message that says what changed for the player or
developer. Run the tests first.
- `dist/` and `shots/` are build output and are not committed.
- Never commit secrets: tokens, passwords, or keys.
- Work happens one agent at a time. If running several agents side by side is set up later,
this section will say how they coordinate.
This project uses Kandown. Before task work, run `kandown work` and follow its output. <!-- kandown:agent-ref -->
-10
View File
@@ -1,10 +0,0 @@
@AGENTS.md
## Claude Code notes
- To look at a screenshot, open the PNG with the Read tool. Do this every time you change
anything drawn, and before you call it done.
- Use WebSearch and WebFetch for anything outside this repository, per the honesty rules above.
- Keep `docs/agent-log.md`, the task files in `tasks/` and `docs/PROJECT_MAP.md` current, as
described above.
They are how the next session, yours or another agent's, picks up the work.
-3
View File
@@ -60,9 +60,6 @@ The source is small JavaScript files with no dependencies or bundler:
## Documents
- `AGENTS.md` / `CLAUDE.md`: how coding agents work on this project.
- `tasks/`: the to-do list, a [kandown](https://kandown.dev) board (`kandown` opens it; see
`docs/kandown.md`).
- `docs/PROJECT_MAP.md`: where everything is.
- `docs/DESIGN.md`: what the game is meant to be, and the decisions made.
- `docs/TESTING.md`: tests, screenshots and pitfalls.
+2 -2
View File
@@ -8,8 +8,8 @@ top part by hand when the structure changes.
## Layout
```
AGENTS.md, CLAUDE.md instructions for coding agents
tasks/, .kandown/ the owner's to-do list: a kandown board (docs/kandown.md)
AGENTS.md, CLAUDE.md instructions for coding agents (local only, not in git)
tasks/, .kandown/ the owner's to-do list: a kandown board (docs/kandown.md; local only, not in git)
build.py joins src/ into dist/index.html (one self-contained page)
src/manifest.json the build order: simulation files, then browser files
src/shell.html page markup (HUD, menus, dialogs); CSS and JS are put in at the markers
-107
View File
@@ -1,107 +0,0 @@
# kandown: the task board
The owner's to-do list is a [kandown](https://kandown.dev) board: one Markdown file per task in
`tasks/`, with settings in `.kandown/`. It replaced `NOTES.md` on 2026-10-24. This page records
how it works here, as checked on kandown 0.52.0. The full upstream documentation is one file at
https://kandown.dev/llms-full.txt (any docs page also works with `.md` added to its URL).
## Start of a session
```sh
kandown work # the rules, our project instructions and the board, as Markdown (~1,900 tokens
# with 14 tasks)
kandown work t8 # the same, focused on one task
```
Our project rules are in `.kandown/kandown_work.md`; `kandown work` includes them under
"Project Instructions". `AGENTS.md` ends with the one-line pointer `kandown init` added; keep it.
## Columns
| Column | Role | What goes here |
|---|---|---|
| Backlog | backlog | Discussion notes (tag `discussion`) and ideas for later (tag `idea`) |
| Todo | ready | The owner's tasks |
| In Progress | active | What an agent is working on now |
| Review | review | Finished work waiting for the owner to check in the game ("done, please check") |
| Done | terminal | Checked by the owner. Only the owner moves tasks here |
## Commands
Task commands work offline and print data only on stdout (messages go to stderr), so they are
safe to capture. Set `KANDOWN_NO_UPDATE=1` in scripts.
```sh
kandown list # the board as a table; --json for data (no report field in it)
kandown show t8 # one task file as it is on disk
ID=$(kandown create "Title" --to Todo -t discussion) # prints only the new id, e.g. t15
kandown move t8 "In Progress" # quote column names with spaces; "archived" archives
kandown doctor # checks kandown.json and every task's frontmatter
kandown # the owner's board: web page plus terminal UI (starts a daemon)
kandown daemon stop # stop that daemon
```
- **`--help` is not safe.** `kandown init --help` ignored the flag and ran `init` in the current
folder, which also started a daemon. Use `kandown help` or the docs, never `<command> --help`.
- `kandown init` starts the web daemon unless given `--no-open`. With an existing empty `tasks/`
it created no sample tasks.
- `kandown create` names the file from the id and the title: `tasks/t8_fog_war_unexplored.md`.
Find it with `tasks/<id>_*.md`; don't rename it.
- `kandown create` has no body option: write the body into the file after creating it.
- `depends_on` blocks a move to Done until the listed tasks are done.
- **Descriptions typed on the web board can be lost.** On 2026-10-24 the owner created t16–t19
on the web board with descriptions; the files were saved with a title and no body. The owner
believes it is a bug in the web daemon (not investigated). A task with only a title may have
had a description: ask the owner, then write their words under `## Context` yourself.
## A task file
```markdown
---
id: t8
title: Fog of war for unexplored areas
status: Review
created: 2026-10-24
updated: 2026-10-24T04:41:46Z
tags: [discussion]
report: |
(agent) What changed, in a few lines.
To check: how the owner sees it in the game.
---
## Context
- The owner's note, word for word.
## Subtasks
- [x] A step
report: What actually happened.
```
- Only `id`, `title` and `status` are required. Unknown keys are kept.
- **`report`** is the completion summary the board shows prominently. A multi-line `report: |`
block works (kandown's parser reads block scalars); `kandown doctor` accepts it.
- `## Context` holds why the task exists: here, the owner's own words. `## Subtasks` is a
checklist whose items can carry a `report:` line.
- Editing files directly is supported; the board notices changes. Run `kandown doctor` after.
## Files
| Path | Committed | What it is |
|---|---|---|
| `tasks/*.md`, `tasks/archive/` | yes | The tasks; the folder is the whole state, no index |
| `.kandown/kandown.json` | yes | Columns, column instructions, workflow, which fields show |
| `.kandown/kandown_work.md` | yes | Our project rules for agents |
| `.kandown/agents.json`, `README.md`, `.gitignore` | yes | Written by `kandown init` |
| `.kandown/kandown.html` | no (`.gitignore`) | The 6.5 MB web app; `kandown init` / `kandown update` rebuild it |
| `.kandown/daemon.json` | no (`.kandown/.gitignore`) | The running daemon's port and access token |
## Codex and kandown
`kandown list` and `kandown doctor` were checked inside Codex's `workspace-write` sandbox and
work; the other task commands also only read and write files in the repo. Not checked under
Codex: the web daemon (`kandown`
with no command), which serves a page on a local port. Codex's `workspace-write` sandbox blocks
network sockets (it is why headless Chrome crashed under Codex until runs passed
`-c sandbox_workspace_write.network_access=true`).
-14
View File
@@ -1,14 +0,0 @@
---
id: t12
title: Exotic and sci-fi ores for late game
status: Backlog
created: 2026-10-24
updated: 2026-10-24T23:27:52Z
tags: [idea]
order: 0
archived: true
---
## Context
- we can add more exotic/sci-fi ish ores and materials for more late game.
-19
View File
@@ -1,19 +0,0 @@
---
id: t24
status: Backlog
order: 4
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:27:52Z
title: Water Fixes
archived: true
---
# Context
Water never seems to run out in certain conditions when its running off the edge. maybe it actually does but it takes a while and i just didnt notice. Please do a full test suite of water physics and make sure it asks as it should in all conditions.
## Subtasks
- [ ] water physics fixes
- [ ]
@@ -1,19 +0,0 @@
---
id: t31
title: Choose between several claims and sizes when opening a new claim
status: Backlog
created: 2026-10-24
updated: 2026-10-24T23:27:52Z
order: 6
archived: true
---
## Context
- Opening a new claim today always gives a random world the same size as the current one. Instead, offer a few claims to choose from, each with its own size and character: different ores, features and terrain, so every new claim feels distinct and worth picking. This builds on t13 (world generation options and planet presets) and is best done after it, using its options to make the claims differ.
## Subtasks
- [ ] When opening a new claim, offer a short list of claims to pick from (for example three), each showing its size, price and what makes it special
- [ ] Claims differ in world generation: richer or rarer ores, unusual features, different terrain, using the t13 options
- [ ] Each offered claim has its own down payment and debt to match its size and riches
-17
View File
@@ -1,17 +0,0 @@
---
id: t10
title: World name box for a new world
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 4
report: |
(agent) The New world panel now has a Name box above Seed. It starts filled with the next
"World N" and selected, so you can type over it; leave it empty to get "World N". Enter in
the Name or Seed box starts the world. The name shows in the Worlds list and the pause menu.
To check: title > New world, type a name, Enter. Pause (Esc) shows the name at the top.
---
## Context
- add world name edit box to new world.
-18
View File
@@ -1,18 +0,0 @@
---
id: t11
title: Welcome and first milestone shown again on an older world
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
tags: [bug]
order: 5
report: |
(agent) Fixed: loading a world now clears the cards in the lower right, so cards from the
world you were just in (Welcome, first milestone) no longer carry over.
To check: make a new world, quit to the title, load an older world from Worlds. No Welcome
or milestone card should show. A brand-new world still shows its Welcome card.
---
## Context
- when making a new world then going back to tile and selecting a previously created world. the bottom right welcome and first milestone messages are still shown after loading the older world where you have already completed those.
-21
View File
@@ -1,21 +0,0 @@
---
id: t13
title: Distinct worlds: generation options, planet presets, exotic ores and a choice of claims
status: Backlog
created: 2026-10-24
updated: 2026-10-24T23:55:44Z
tags: [idea]
order: 0
---
## Context
- Every world is generated the same way today, and a new claim is just another random world the same size as the last. Make worlds and claims feel distinct: options when generating a world, planet presets that change how a world looks and what is in it, exotic late-game ores that only some worlds have, and a choice of claims to open, each with its own size, character and price. (Merged from t12 exotic ores and t31 choosing claims.)
## Subtasks
- [ ] Generation options in the new-world dialog: how much ore, caves, water and mountains, and how deep the world goes
- [ ] Planet presets that change the look and the climate: different trees, water, dirt and rock colours, for example a frozen world, a desert world and a volcanic world
- [ ] Exotic, sci-fi ores and materials for the late game, found only on some planets or very deep, each with a use
- [ ] Opening a new claim offers a few claims to choose from (for example three), each showing its size, preset, notable ores, down payment and debt
- [ ] Claim prices match their size and riches
-19
View File
@@ -1,19 +0,0 @@
---
id: t14
title: Redesign drill upgrades
status: Backlog
created: 2026-10-24
updated: 2026-10-24T23:55:44Z
tags: [idea]
order: 1
---
## Context
- The Resonance drill is upgraded today by casting drill bits in a Bit mold, which doesn't make sense for a drill that shatters rock with pulses. Redesign how upgrades work as a whole. Earlier ideas from the design notes: an amplifier, a tuning fork and harmonics for the drill, a Grav pick tool and mining charges.
## Subtasks
- [ ] Decide what the drill's upgrades are (power, reach, width, tuning, harder rock) and how each is earned or built, replacing the Bit mold
- [ ] Decide whether other upgrades (the bag/tank, Flask, thermal lens) follow the same system
- [ ] Old saves keep the upgrades they already have
-14
View File
@@ -1,14 +0,0 @@
---
id: t15
status: Done
order: 7
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: material selection menu for vacuum tool
report: |
(agent) The owner chose to fold this into t6: the bag rows are the vacuum's material
selection (⬇ pick up, ⬆ blow) instead of a separate menu. Check it with t6.
---
-35
View File
@@ -1,35 +0,0 @@
---
id: t16
status: Done
order: 12
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: vacuum tool rework, again
report: |
(agent) Fewer modes. Left click picks up everything, or only what you've marked once you mark
something; Shift takes everything for one click. F with the Vacuum (when nothing in reach can be
used, like a mold or gate) opens the Vacuum menu: one line per material with ⬇ (pick up) and ⬆
(blow), plus Pick up everything and Blow one at a time. Clicking the Pick up / Blow out chips on
the card opens it too. Bag: click a name to blow only it, Ctrl+click to add it to the blow mix,
Ctrl+right-click to add it to pick-up (a small ⬇ shows what's marked). Shift + right click blows
an even mix of everything loose in the bag. Q/E still cycles, R still marks under the cursor.
To check: Ctrl+click coal and copper ore in the bag and blow a mix; Ctrl+right-click copper ore
and vacuum a mixed pile; Shift + right click to blow everything; press F for the compact menu.
---
## Context
- The vacuum still has too many modes. Replace them with a menu on F, like the wall menu, where each material has a Pick up and a Blow toggle. Take the ⬇/⬆ buttons off the bag rows. Pick-up has only two states: everything when nothing is marked, or only the marked materials.
## Subtasks
- [x] Pick-up: everything unless something is marked (no mode variable)
- [x] Vacuum menu on F and on the card chips; bag row buttons removed
- [x] Text, tests and screenshots up
- [x] shift to blow all
report: Shift + right click (while not flying) blows an even mix of everything loose in the bag; bars are left out. What you've chosen to blow doesn't change.
- [x] Ctrl+click bag items to select several for pick-up and blow
report: Ctrl+click a bag name adds it to (or takes it out of) what you blow; Ctrl+right-click does the same for pick-up. Plain click still blows only that one.
- [x] Compact the F menu: one line per item
report: One row per material: swatch, name, count, a ⬇ and a ⬆ button under Pick up / Blow headings.
-28
View File
@@ -1,28 +0,0 @@
---
id: t17
status: Done
order: 13
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: fog of war changes
report: |
(agent) The bot now sees into the ground around it, through rock: fully clear out to 12 grains,
then fading out softly by 24, with a grainy edge instead of a hard or stepped one. It moves with the bot and
stays revealed afterwards, like the rest of the fog. Line of sight down tunnels and into caves
works as before (out to 48 grains).
To check: start or load a world, dig down, and look at the ore and caves showing in the rock
around the bot as you go.
---
## Context
- Fog of war only reveals open areas the bot can see into, so you can't tell what's in the ground around you or where to dig. Also reveal the ground around the bot, through rock, out to about 20 grains with a soft edge. Ground revealed this way looks fully clear, the same as ground seen in the open.
## Subtasks
- [x] Reveal ground within about 20 grains of the bot, through rock, with a soft edge
- [x] Blend the fog edges more: they look sharp and stepped
report: The ring around the bot now fades over 12 grains (clear to 12, gone at 24) instead of 4, rays fade 8 grains into rock and over the last 16 of their range, the surface fades over 16 grains, and partly seen grains get a little per-grain noise so the edge looks grainy instead of stepped.
- [x] Remove the jagged grey edge, and make unexplored ground black
report: Fading now eases into black along a curve, the grain noise is strongest mid-fade and gone at the edges, sight into rock always fades over 8 grains from however bright it arrived, and unexplored ground (and off the map) is pure black instead of dark grey.
-25
View File
@@ -1,25 +0,0 @@
---
id: t19
status: Done
order: 9
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: vacuum blow all visual
report: |
(agent) With the Vacuum, holding Shift (while not flying) now shows what Shift + right click
will blow before you click: the card's Blow out line reads "Everything · mix of N", every bag
row that will be blown lights up, and the swatches by the cursor show the whole mix. Let go of
Shift and it goes back to your chosen material. It also shows while you're blowing everything.
To check: with a few things in the bag and one chosen to blow, hold Shift and watch the card and
bag; then hold Shift with WASD and see it doesn't change (Shift is boost then).
---
## Context
- Show what Shift + right click will blow before you click. While Shift is held with the Vacuum, or while blowing everything, every bag row that will be blown lights up, the card's Blow out line reads "Everything · mix of N", and the swatches by the cursor show the whole mix.
## Subtasks
- [x] Card shows "Everything · mix of N" while Shift is held
- [x] Bag rows that will be blown light up
-26
View File
@@ -1,26 +0,0 @@
---
id: t1
title: Ingot stacking and storage
status: Review
created: 2026-10-24
updated: 2026-10-24T23:53:08Z
tags: [discussion]
order: 0
report: |
(agent) Bars now pile neatly: a bar that lands snaps into line, and one hanging mostly over a gap
tips into it, so piles have no air holes. For storage there's a new Bar rack block ($40) in the
Machines tab. Each block holds 50 bars of any kind; stack blocks in a column for more. Bars that
land on top go in, the hover shows the counts by kind, and F opens the gate at the bottom so
bars come out one at a time, oldest first, onto a belt below. Taking a block back gives its
bars to you. Please try a rack under an ingot mold's belt and see if the stacking feels right.
assignee: claude
---
## Context
- stacking ingots is a little odd, they dont stack neatly. so putting them all in the same place means it will get full but have lots of air space. what can we do about this? WHat in real life might be the solution for storing ingots?
## Subtasks
- [x] Bars that come to rest snap to a 2-grain grid, and a bar with less than half of itself supported tips into the gap beside it, so piles have no air gaps
- [x] Rack blocks: 1-block pieces stacked into a column, 50 bars each; bars dropped on top go in (any kind, counted by kind), F opens a gate at the bottom that lets them out one at a time, oldest first
-42
View File
@@ -1,42 +0,0 @@
---
id: t20
status: Done
order: 14
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: vacuum/blow tool rethink
report: |
(agent) The Vacuum has one selection for picking up and blowing out. With anything selected, a
left drag takes only the selected materials, wherever it starts; with nothing selected it takes
what you click (or the first loose grain it reaches). Right click blows the selected materials
that are in the bag, as a mix. Click a bag name or Q/E selects one, Ctrl+click adds or removes.
Hold Ctrl and the bag also lists everything you've found, under "Not in bag", so you can select
materials you don't have yet. Blowing out the last of a material deselects it (one picked
before you had any stays selected). Ctrl + wheel scrolls the bag list. Clear the
selection with the Clear selection button under the bag list, by clicking the only selected row, or gamepad B.
Shift takes or blows everything.
To check: hold Ctrl, Ctrl+click two materials you don't have, then sweep a mixed pile (only
those come up); blow a coal + ore mix until the coal runs out (ore keeps going, coal is
deselected); Ctrl + wheel over the bag; Clear, then drag on something (only that comes up).
---
# Context
I dont like the current tool. I want to completely rethink how to pick up and drop materials in the game. maybe a vacuum isnt the best tool. maybe it is. I just want to discuss some options for picking up and dropping the materials in the game. it dont need to be super complicated, but i do need to be able to selectively pick up and drop materials. lets brainstorm multiple ideas for tools maybe multiple tools or just one. i want it to be simple and intuitive.
## Subtasks
- [x] discuss with user in claude code when asked about it, to work out exactly what the user wants
- [x] Pick up what you click: a drag that starts on a material sweeps up only that material, and Shift takes everything
- [x] One bag item (or a Ctrl+click mix) is in hand; Q/E or clicking a bag row changes it, and right click blows it out
- [x] When the last of something in hand is blown out, it leaves the hand; an empty hand says so instead of blowing
- [x] Picking something up with an empty hand puts it in hand
- [x] Remove the pick-up marks (R, Ctrl+right-click, the "Only marked" chip) and the F vacuum menu
- [x] One selection for both: a drag picks up only the selected materials (or what you click when nothing is selected), and right click blows out the selected ones in the bag
- [x] Holding Ctrl lists every material found so far in the bag, below a "Not in bag" divider, so several can be selected before any are picked up
- [x] Blowing out the last of a selected material deselects it; materials selected before you have any stay selected
- [x] An easy way to clear the selection (a Clear button, clicking the only selected row, gamepad B)
- [x] Ctrl + wheel over the bag scrolls the list instead of zooming the page
- [x] Ctrl+click adds to the selection on setups where the click arrives without the Ctrl flag
- [x] The bag hint and a wider, more visible Clear selection button stay visible below the list instead of scrolling away
-32
View File
@@ -1,32 +0,0 @@
---
id: t21
status: Review
order: 0
priority: P3
created: 2026-10-24
updated: 2026-10-25T02:42:10Z
title: Code health: refactor, speed up and test the physics
report: |
(agent) Done in six commits; all tests pass. Water: it did run out, just slowly. Pools now pour
off ledges several times faster (a 100-wide pool empties in about 50 s) and leftover film drains;
rain from steam spreads out downwind, so a waterfall into a hot shaft no longer refills its own
lake. Found and fixed: steam or smoke trapped in a pocket never finished, and rain landing on
steam deleted water. Piles near the bot now sort, quickly. Faster with identical results: the
roof scan (4.6 -> 1.9 ms on a quiet Huge world) and the heat pass. A loaded world starts around
the bot first (Huge, first 10 s: 15 -> 5.5 ms a tick, worst 80 -> 16 ms). Seven duplicates merged
and six large files split. Seeds make the same worlds as before. Please check: pour a pond off a
ledge; stand by a pile of ore on ash; load a Huge world and fly around in the first 20 s.
assignee: claude
---
## Context
- The code has grown fast. Clean it up and make it faster without changing how the game plays, and give the physics a full test pass, starting with water: water running off the edge of the world never seems to run out (it may only be slow; find out, and fix it if it really doesn't). (Merged from t24 water fixes.)
## Subtasks
- [x] Remove duplicated code and split the largest modules into smaller files
- [x] Profile the simulation and rendering on a Huge world and speed up the slowest parts
- [x] A full test pass over water physics in every situation (pools, flows, falls off the world edge, pumps and pipes, freezing and boiling); fix what is wrong
- [x] The same kind of pass over sand, molten metal and gases where tests are thin
- [x] Fix issues found along the way, and test every piece of gameplay the changes touch
-21
View File
@@ -1,21 +0,0 @@
---
id: t25
status: Done
order: 11
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: visual effect for vac/blow tool
report: |
(agent) While sucking, short teal streaks of air swirl in toward the nozzle ring; while blowing,
amber streaks run from the bot toward the cursor and widen to the nozzle width. They're on top
of the grains already flying in and out, and they turn off with "Sparks and debris" in
settings. Please check whether they're too faint, too busy or too fast.
---
## Subtasks
- [ ] add visual effects for suck and blow
- [ ]
- [x] While sucking, short teal streaks of air swirl in toward the nozzle ring
- [x] While blowing, amber streaks push out from the bot toward the cursor and spread into a cone
-18
View File
@@ -1,18 +0,0 @@
---
id: t26
status: Done
order: 10
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: rename and make name visible somewhere the vac/blow tool
report: |
(agent) The tool is now the Pneumatic nozzle. Its card starts with a title row (the name and the
nozzle width), and the hotbar tooltip, Welcome, milestones, notebook and empty-bag hint all use
the new name. Please check the wording reads well in the notebook and the Welcome card.
---
## Subtasks
- [x] The tool is called the Pneumatic nozzle in the hotbar tooltip and in all player text
- [x] Its tool card starts with a title row showing the name and the nozzle width
-22
View File
@@ -1,22 +0,0 @@
---
id: t27
status: Done
order: 8
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: add toast for vac/blow tool
report: |
(agent) Every tool's messages now show as toasts at the top of the screen; the red line in the
tool card is gone. Errors have a red edge, info messages a teal one. Holding a button that keeps
repeating a message (blowing with nothing selected, the Igniter out of reach) keeps one toast up
instead of piling them. Please check the toasts are readable and don't get in the way.
---
## Subtasks
- [ ] when blowing without any items selected there is a message in red in the box on the top left, instead move it to a toast.
- [ ] same for any other messages from the tool
- [ ] s
- [x] Every tool's messages show as toasts, and the red line in the tool card goes away
- [x] A message that repeats while a button is held refreshes one toast instead of stacking up
-24
View File
@@ -1,24 +0,0 @@
---
id: t28
title: Brick press for clay bricks
report: |
(agent) The Brick press ($60) is in the Machines tab next to the Saw. Every 8 clay lumps resting
on it become a Green brick that drops out underneath. Drop green bricks into a fire hotter than
about 900°C (blow them in, belt them in, or put the press over a fire) and they turn into Bricks.
2 Bricks build a brick wall block, they sell for about $9, and builders order them. Please try
pressing and firing a batch, and check that the press's moving plate reads well.
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 16
---
## Context
- Clay bricks should be made the same way as the Saw's stone blocks: a 1-block hopper piece takes grains on top and drops an item below. A Brick press squeezes clay lumps into green bricks, and like real bricks they then have to be fired to become Bricks.
## Subtasks
- [x] Brick press block: every 8 clay lumps resting on it make a Green brick that drops out underneath
- [x] A Green brick that gets hotter than about 900°C fires into a Brick
- [x] Bricks build brick wall blocks (2 per block) and sell; builders order them
-11
View File
@@ -1,11 +0,0 @@
---
id: t29
status: Done
order: 20
priority: P3
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
title: add minimap
---
-19
View File
@@ -1,19 +0,0 @@
---
id: t2
title: Construction materials as export products
status: Backlog
created: 2026-10-24
updated: 2026-10-24T23:55:44Z
tags: [discussion]
order: 2
---
## Context
- Decide what the factory ultimately makes for sale. Smelting ore, grinding rock and casting bars are the basics; the products worth exporting should be real construction materials, the things an actual building site orders. Some exist already (stone blocks, planks, bricks, glass bricks, metal bars); this is about designing the full set and how each is made.
## Subtasks
- [ ] List candidate products a building site buys (for example steel beams, rebar, pipe, wire, glass panes, cement and concrete, roof tiles) and pick the ones that fit the game
- [ ] For each, decide its recipe from materials in the game and which machine or mold makes it
- [ ] Builders' orders and prices for them, so making finished products pays better than selling raw bars
-25
View File
@@ -1,25 +0,0 @@
---
id: t30
title: Progress meters while generating, loading and saving
report: |
(agent) Making a world, opening a claim, loading a save and travelling now show the loading
screen with a title, a bar that moves and the step it's on (shaping the land, laying rock and
ore, settling loose ground, unpacking, building the world...). The game stays responsive while a
Huge world generates, and worlds come out exactly as before. A small "Saving…" chip appears at
the bottom right only if a save takes longer than about a sixth of a second. Please try a Huge
world, Continue, a new claim and travel, and say whether the saving chip should stay.
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 18
---
## Context
- Making a world, opening a new claim, travelling between claims and loading a save can take several seconds on big worlds (a Huge world takes about 6 s to generate), and the screen gives little sign of what is happening. Show a progress bar with a short message for each step. Saving is quick today, but a small indicator would help there too, especially for Huge worlds.
## Subtasks
- [x] Generating a world shows a progress bar that moves and names the step (terrain, ores, caves, water, trees…)
- [x] Loading a save, opening a new claim and travelling show progress (reading, unpacking, building the world)
- [x] Saving shows a small, unobtrusive indicator while it runs
-26
View File
@@ -1,26 +0,0 @@
---
id: t32
title: Minimap with zoom, and a full map
report: |
(agent) A minimap sits in the bottom-right corner, centred on your bot, with − and + zoom and a
Map button. M opens the full map of the world: scroll to zoom, drag to pan, "Centre on bot",
and markers for you and the trade dock. Unexplored ground is black on both. The onboarding
cards now pop up at the bottom centre, mute moved to Shift+M, and "Show minimap" in settings
hides it. It costs about 0.1 ms a frame. Please try it on a Huge world, and say whether the
minimap's size and position work.
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 17
---
## Context
- Big worlds and several claims make it easy to lose your way. Add a small minimap in the bottom-right corner, with zoom buttons and a button that opens a full map of the world. The full map opens with M too (mute moves to Shift+M and stays in settings). Onboarding cards move from the bottom right to the bottom centre to make room. Unexplored ground stays black on both maps.
## Subtasks
- [x] Minimap in the bottom-right corner around the bot, with + and − zoom and a button for the full map
- [x] Full map (M): the whole world, zoom with the wheel or buttons, drag to pan, markers for the bot and the dock
- [x] Both maps respect fog of war and keep up with digging and building without slowing the game
- [x] Onboarding cards move to the bottom centre; mute moves to Shift+M
-17
View File
@@ -1,17 +0,0 @@
---
id: t33
title: Make solid ground easy to tell apart from loose grains on top of it
status: Todo
created: 2026-10-25
updated: 2026-10-25T02:04:28Z
---
## Context
- When loose material (rubble, dirt, ore) lies on top of or against solid rock, the two are hard to tell apart in the smooth look: the loose grains blend into the rock under them, so it's unclear where the solid ground starts and what is still to dig. The owner's screenshot: `/home/aaron/Pictures/Screenshots/Screenshot_20261024_214546.png` (a dug-out area around the bot where loose copper-coloured rubble covers the rock).
## Subtasks
- [ ] Find what makes them blend (similar colours, lighting, the smooth look's edge blending, no outline between loose and solid)
- [ ] Give loose grains and solid ground a clear visual difference (for example an edge or shading on solid rock, a different texture or brightness for loose grains), in both looks
- [ ] Check it in dark caves, under the bot's lamp, and with the thermal lens
-21
View File
@@ -1,21 +0,0 @@
---
id: t34
title: Limit how far the nozzle blows to the same reach as sucking
status: Todo
created: 2026-10-25
updated: 2026-10-25T02:26:51Z
---
## Context
- Blowing with the Pneumatic nozzle has no range limit: with the cursor outside the reach circle around the bot, blown grains still fly all the way to the cursor, and the farther you aim, the farther they go. Sucking only works inside the circle. Blowing should be limited to the same reach.
- Cause: `nozzle()` in `src/sim/vacuum.js` works out a distance capped at the reach, but `toolBlow()` aims every grain at the cursor itself rather than at that capped point.
## Subtasks
- [ ] Aim blown grains at the cursor only when it's inside the reach; outside it, aim at the edge of the reach in the cursor's direction
- [ ] Make the blow preview show where grains will land when the cursor is out of reach
- [ ] Check thrown bars still match (they already aim at the capped point)
- [ ] Add a check: blowing at a cursor far outside the reach lands nothing beyond it
-21
View File
@@ -1,21 +0,0 @@
---
id: t35
title: Diagonal screw tubes
status: Todo
created: 2026-10-25
updated: 2026-10-25T02:35:19Z
---
## Context
- Screw tubes only run straight: up, down, left or right. Add diagonal tubes, and let them be placed diagonally (dragging a line at 45° lays a diagonal run), so grains and bars can be carried up or down a slope without stair-stepping straight pieces.
## Subtasks
- [ ] Decide how a diagonal tube looks and fits the 4×4 block grid (a block per diagonal step, or a dedicated diagonal piece)
- [ ] Move grains and bars along diagonal tubes, including joining onto and off straight tubes and belts
- [ ] Placing: dragging at 45° lays a diagonal run; R picks the diagonal directions when placing a single piece
- [ ] Copy, cut, paste, undo and blueprints handle diagonal tubes
- [ ] Tests for carrying sand and bars up and down a diagonal run, and for the joins
-21
View File
@@ -1,21 +0,0 @@
---
id: t36
title: Diagonal wall blocks with a smooth sloped face
status: Todo
created: 2026-10-25
updated: 2026-10-25T02:45:20Z
---
## Context
- Walls can only be placed on the square block grid, so a sloped wall is a staircase of blocks. Grains catch on every step instead of sliding down, which makes funnels and hoppers clog. Add diagonal wall placement, and wall pieces whose face is a flat 45° slope, so loose material slides smoothly down a funnel wall.
## Subtasks
- [ ] Add sloped wall pieces: half-block triangles in the four orientations, so a run of them makes a flat 45° face
- [ ] Dragging a wall line at 45° lays a diagonal run of sloped pieces; R picks the orientation for a single piece
- [ ] Grains, liquids and bars slide down the flat face without catching (check powder sliding and the STICK rule against a straight 45° line)
- [ ] Works with every wall material; refunds, copy, cut, paste, undo and blueprints handle the new pieces
- [ ] Tests: sand poured into a V funnel of sloped walls all comes out the bottom; the same funnel built from square steps for comparison
-30
View File
@@ -1,30 +0,0 @@
---
id: t3
title: World feels small; resources run out
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
tags: [discussion]
report: |
(agent) Built all four. New worlds hold about 4.7x the ore: the top layers are as before, and
ore gets steadily richer and veins bigger as you go deeper (copper, coal and tin now reach the
deep layers too; gold and silver grew least so they stay valuable). Grinding granite and basalt
finds about twice the ore, and builders order those rocks by the bagful. There's a Huge size, and
saves are now compressed (a Medium world dropped from 29 MB to under 0.5 MB). Once a claim is
paid off, the notebook's new Claims page opens another claim for $5,000 down and $40,000 owed
(then $80,000...). Your money, bag, upgrades and discoveries come along, buildings stay put, and
you can travel back. Existing worlds only get the richer ore if you start a new world or claim.
order: 19
---
## Context
- the world still seems quite small. i dont know if thats because the bot moves so fast, the bot can mine too fast, or the grains should be smaller... i would like to make the worl seem huge to the player and give them loads of resources to mine for a long game. as is, you could mine all the resources from the map pretty quickly and end up having to start a new world and new game as a result. or maybe there is some other solution that i havent thought of yet. need to brainstorm this.
## Subtasks
- [x] Deeper is richer: ore gets more common and comes in bigger veins the deeper you dig, for about five times the ore in a world; the shallow layers stay as they are
report: Removed coordinate stretching and balanced thresholds per ore. Medium seed 424242 gives coal 170437 (5.09×), copper 127298 (4.80×), iron 361683 (4.66×), zinc 53527 (4.54×), tin 38551 (4.99×), silver 12166 (3.34×), gold 5858 (3.48×): 769520 total (4.73× the original 162519). Shallow ore positions/types match the original hash. Pixel screenshot /tmp/t3-balanced-ore.png inspected: rounded lenses, no diagonal ore streaks. Build/map regenerated; run_all.py --browser all passed (world 46, play 244, smooth 8 checks). Part 1 awaits owner review; remaining parts stay open.
- [x] Waste rock pays: granite and basalt are worth grinding for ore, and builders buy them in bulk
- [x] A Huge world size, with saves compressed so big worlds stay small on disk
- [x] New claims: once a claim is paid off, open another for $5,000 down and a bigger debt, keeping money, bag, upgrades and knowledge; travel between your claims from the notebook
-35
View File
@@ -1,35 +0,0 @@
---
id: t4
title: Hopper blocks instead of fixed-size hoppers
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
tags: [discussion]
order: 15
report: |
(agent) Built. Grinder ($60) and Saw ($90) are 1-block pieces in the Machines tab. Grains
resting on top are worked and the result drops out underneath, so a row of them between two
walls is a hopper of any width, and each block adds speed (two Grinders = one old Refiner, one
Saw = one old Stone cutter). A Saw stacked on a Grinder cuts the stone and grinds everything
else. If the space underneath fills up the block stops; hover it to see why. The Refiner and
Stone cutter are gone from the menu; ones already built keep working. Please try a wide grinder
hopper fed with the nozzle, a Saw on a Grinder, and an old save that has a Refiner.
Follow-ups: the old Refiner and Stone cutter code is removed (a save that still has one loads
and refunds it). Grinders now look like a pair of grinding wheels and Saws like a round blade.
The Saw also cuts wood chunks into Planks, and its stone output is now called a Stone block.
Clay bricks moved to their own task, t28 (Brick press).
---
## Context
- instead of buildings like the refiner which have a fixed size hopper, just make a block the same size as a wall tile that looks like grinding wheels where the user can place multiple side by side to create a wide hopper. the same thing should be done for the other buildings like that.
## Subtasks
- [x] Grinder block (does what the Refiner does) and Saw block (Stone cutter), 1 block each; side by side they make a wider, faster hopper
- [x] Refiner and Stone cutter leave the build menu; built ones in old saves keep working
- [x] Remove the Refiner and Stone cutter code; an old save that still has one loads with the machine taken out and its cost refunded
- [x] Grinders look like two grinding wheels and Saws like a round blade, turning while they work
- [x] The Saw also cuts wood chunks into Planks, which build wood walls and sell
- [x] Rename the Saw's "Stone brick" to "Stone block", so only fired clay is called a brick
- [x] The Saw's description and "stopped" hover say to put a belt or an open drop under it
-18
View File
@@ -1,18 +0,0 @@
---
id: t5
title: Material selection menu
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 1
report: |
(agent) New material menu for walls and molds. With the Build tool on a wall block or a mold,
press F (or click the material chip on the Build card) to open it. Each material shows how
much you have, what this piece costs in it and the heat it stands (melts at / burns at /
won't melt). Ones you have come first; ones you can't afford are dimmed. R still cycles.
To check: Build (3), Wall block, F, pick Clay. Then a mold piece, F again.
---
## Context
- for buildings that need a material selection, lets make a new material selection menu
-27
View File
@@ -1,27 +0,0 @@
---
id: t6
title: Rework the vacuum/blower tool
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
tags: [discussion]
order: 6
report: |
(agent) Built (t15 folded in). With the Vacuum (2) selected, each bag row has ⬇ (pick it up)
and ⬆ (blow it out); click a name to blow only that. The tool card shows "Pick up" with a
mode chip: What I click / Only marked / Everything (T or click the chip cycles). R over a
grain marks it for pick-up and switches to Only marked; unmark the last one and it goes back.
"Blow out" shows what right click blows (Q/E cycles one material; ⬆ on several = even mix).
To check: mark coal and copper ore with ⬆ and blow a mix into a furnace; mark one thing with R
and vacuum a mixed pile; press T to try Everything.
---
## Context
- lets rework the vacuum/blower tool. the selecting, ticking, etc of the items for filtering and otherwise. its a little confusing and difficult to understand. lets ocme up with a simpler ui/ux, intuitive while still containing the same core functions like filtering what you pickup and drop and allowing pickup/drop all or filtered.
## Subtasks
- [x] Bag rows get separate pick-up and blow marks (no more shared ticks)
- [x] Tool card chip: pick up everything / only marked / same as the first click
- [x] R over a grain toggles its pick-up mark; blowing uses the rows marked to blow
-17
View File
@@ -1,17 +0,0 @@
---
id: t7
title: Option to turn off smooth pan following the mouse
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 2
report: |
(agent) New setting: Settings > Display > "Camera looks toward the pointer". Turn it off and
the camera stays centred on the bot instead of drifting toward the mouse (or right stick).
It is on by default for new players; your choice is saved in the browser.
To check: turn it off, move the mouse to a screen corner while flying: the view shouldn't move.
---
## Context
- the smooth pan following the mouse should be an option in options. i personally dont like it much.
-20
View File
@@ -1,20 +0,0 @@
---
id: t8
title: Fog of war for unexplored areas
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 3
report: |
(agent) Fog of war. Underground is black until the bot has seen it: it sees in straight
lines through air, water and gas, about 48 grains, and a few grains into the rock it looks
at. What you've seen stays seen and is saved with the world. The sky and surface start
seen. Hover info says "Unexplored" in the black. Settings > Game > Fog of war turns the
drawing off (exploration is still kept). Older worlds: the area around everything you've
built and around the bot is revealed when loaded.
To check: new world, dig down, look along a tunnel and into a cave. Try both looks.
---
## Context
- There should be a 'fog of war' for unexplored areas.
-23
View File
@@ -1,23 +0,0 @@
---
id: t9
title: Script to run the local server for testing
status: Done
created: 2026-10-24
updated: 2026-10-24T23:25:51Z
order: 0
report: |
(agent) New: python3 tools/serve.py builds the game, serves it at http://localhost:8000 and
rebuilds by itself when anything in src/ changes. Pages aren't cached, so a normal refresh
shows the new build. If 8000 is taken (an old server still running), it uses 8001 and says so.
To check: stop your old server (Ctrl+C), run python3 tools/serve.py, open the address it
prints, change something in src/, refresh. Ctrl+C stops it.
---
## Context
- i need a script to run the local server for testing.
## Subtasks
- [x] Add the server and update the command references and map.
- [x] Check serving, rebuilds, port fallback and shutdown; run the headless suites.