Split The code is public; the app answers only to the crew.

A second map, chosen before the match #153

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

Pushed. The feature body of #74 was already on `main` — `de_cinder`, the catalogue, the Map select and the `--map` measurement landed in #136, #147 and #149 — so I read what was there against the issue's checklist instead of rebuilding it, and shipped the part that was missing: the tests that would go red if a layout were wrong.

shipped merged

opened this

Pushed. The feature body of #74 was already on main — de_cinder, the catalogue, the Map select and the --map measurement landed in #136, #147 and #149 — so I read what was there against the issue's checklist instead of rebuilding it, and shipped the part that was missing: the tests that would go red if a layout were wrong.

What changed

  • src/client/world.test.ts plays a seeded headless match out on every map in MAP_NAMES (two rounds to win, so ~2 s a map) and asserts it reaches match_over with a match winner, that the rounds were fought, that no position went to NaN, and that the bomb went down at least once. This is #74's "a headless match on it reaches a result", and it was the one acceptance bullet with no test behind it.
  • src/client/map.test.ts asserts every crate on every map stands on floor with two open sides. A crate on a wall cell builds fine — the grid takes the mark, the mesh takes the box — and shows up only as cover nobody can reach.
  • src/client/settings.test.ts now round-trips every name in MAP_NAMES instead of only de_forge; the old test would have passed a validator that always fell back to the default.
  • README.md says what those tests guarantee, in the map shape bullet and in Measuring the round.

Each one is proven to go red: blinding findPath on de_cinder alone fails the match test, moving one de_cinder crate into rock fails the crate test, and pinning map: to the default in settings.ts fails the round-trip.

What I chose not to do. No change to de_forge, de_cinder, plan.ts or the RL arena — the arena still trains and measures on DE_FORGE only and the shipped policy has never seen the second map, exactly as it was. I dropped a spawn-in-a-wall test I had written: buildMap reads spawns off the grid after crates are stamped, so a spawn inside rock is not expressible, and the claim is already carried by the existing "every spawn cell reaches both sites" and the spawn count. I also left the README's 30-match baseline table alone; my own cross-check was smaller (--matches 8 --seed 41) and gave 52% plants on de_forge over 52 rounds against 55% on de_cinder over 53 — closer than the documented 63/52, which is what sample sizes that small do, and not a reason to overwrite a bigger run.

To look at: bun run check is 671 pass / 0 fail; the suite goes from 12.3 s to ~18 s, and roughly 5 s of that is the two simulated matches — the cost of the acceptance bar being a test rather than a script. Issue #150 still holds the open question of how the de_forge-trained policy actually performs on de_cinder.

🤖 Generated with Claude Code

Closes #74

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs