Changelog

All notable updates to worldsim, newest first. Mirrors the repository changelog.

2026-08-09

  • Measured the canonical survival recipe across seeds 0 through 99: 52 wins and 48 losses, a 52.00% pass rate, with losses split between 22 objective_unmet and 26 population_crisis. The engine and shipped recipe are unchanged.
  • CI now runs on GitHub-hosted ubuntu-latest, making the existing verification gates portable and reproducible across contributors.

2026-08-08

  • Self-hosted CI now validates and uses the runner's installed Python 3.11+ toolchain, restoring dependency installation and all existing lint, test, smoke, and determinism verification gates.

2026-08-07

  • Guided play/replay CONSEQUENCE lines now show settlement morale as a before/after value (e.g. morale 70->72), making the already-mutated morale observable and testable with no engine rule change; the web terminal mirrors the segment byte-for-byte.
  • Restored the CI verification gates — ruff, pytest, and determinism — to the workflow. The self-hosted runner migration had accidentally dropped the job steps, silently disabling lint, unit tests, and the default/verbose/replay/map determinism diffs on every pull request and push to main.
  • Restored the full CI verification gates on the self-hosted arm64 runner: ruff, pytest, the one-tick smoke run, and the default/verbose/replay/map determinism diff pairs now execute on every pull request and push to main, with runs-on: self-hosted preserved so the migration is intact.

2026-08-03

  • Gave the civilization roles their minimal testable effects: a level-2 settlement raises a militia watch, level 3 founds a scriptorium, and level 4 convenes a law-giving council — one deterministic flavor event per unlocked tier, drawn from a dedicated worldsim-civ-<seed> stream. Effects are evaluated only by the civilization report surface, so level 1 remains a strict no-op.
  • Defined the civilization role vocabulary as data — Agrarian, Militia, Scholars, and Philosophers as immutable entries in a roles module — with settlements exposing exactly the roles their level unlocks: militia at 2, scholars at 3, philosophers at 4. The mapping is a pure function of civilization level with no wall-clock or RNG, so level 1 remains a strict no-op.
  • Added a deterministic civilization_level (1-4) to every settlement, derived purely from its population via the frozen 100/200/400 thresholds. The level is computed on demand with no wall-clock time or RNG, stable across evaluation, and remains a strict no-op at level 1, so existing seeds, events, and replay recipes stay byte-identical.
  • Added a map determinism gate to the local quality gate and CI. The gate runs worldsim map --seed 7 twice and byte-diffs the rendered terrain grid, settlement markers, and legend, failing the build on any divergence. No simulation behavior changes.

2026-08-02

  • Added the worldsim map --seed <n> [--factions <k>] CLI command, rendering the world's 16×16 terrain grid as stable ASCII with settlement markers. The map is a pure function of the seed: worldsim map --seed 7 produces byte-identical output every run.
  • Made terrain demonstrably shape production. Every settlement's gather rate now comes from the terrain at its site via a frozen profile table, while the legacy seeded draws are retained and discarded so every existing seed-7 value stays byte-identical. The map is no longer cosmetic.
  • Placed every settlement at a unique, deterministic location on the terrain map. Each settlement carries its (x, y) site, drawn from a seed-only placement stream, and World.tile_at(x, y) exposes the terrain beneath it.
  • Added a deterministic 16×16 terrain map to the engine. The same seed now produces byte-identical tiles from the frozen plain, forest, hills, water, and mountain vocabulary, each with its derived biome. The map is a pure function of the seed and does not change any existing seed-7 population, resource, or gather-rate values.
  • Froze the world-geography seed-to-map contract in a new PRD and implementation plan, covering terrain/biome vocabulary, map shape, terrain-modulated gather rates, settlement placement, the worldsim map CLI surface, and the compatibility mechanism keeping survival-v1 behavior byte-identical.
  • Added end-to-end CLI tests for the documented playable journey: guided worldsim play and scripted worldsim replay now have automated coverage for guidance, consequences, progress, results, and matching replay recipes.
  • Extended scripts/check.sh with a replay determinism gate that runs the canonical survival-v1 success recipe twice and byte-diffs the complete output.
  • Rewrote the README Quick Start so the guided survival-v1 scenario leads, with the batch workflow documented as a designer/debug mode.

2026-08-01

  • Added guided play and non-interactive replay CLI modes for survival-v1, with explicit results and shareable canonical recipes.
  • Added canonical replay recipes for survival-v1: a seed plus ordered labor choices reproduce the complete event stream, final settlement, objective progress, and result.
  • Added the deterministic survival-v1 scenario engine: an eight-turn survival objective with visible population and wood progress, stable consequence ordering, and explicit success or failure reasons.
  • Added a deterministic engine boundary for labor-allocation choices, rejecting invalid actions without partial mutation.
  • Specified the first playable survival-v1 loop and its implementation plan with exact seed-7 fixtures.

2026-07-30

  • Extended local and CI determinism checks to compare both the focused default event log and the complete --verbose log.
  • Added --verbose to the CLI so designers can inspect every per-tick production event and food stockpile.
  • Filtered World.advance() results to notable events by default, so players see growth, starvation, and abandonment without routine production noise.
  • Classified every settlement event deterministically as notable or routine.

2026-07-29

  • Added a determinism check to CI that runs the same simulation twice and diffs the output, catching non-deterministic regressions on every PR and push to main.

2026-07-28

  • Added settlement abandonment as a deterministic terminal state: settlements that starve at the population floor become abandoned exactly once and are annotated in the summary.
  • Rebalanced the food economy so settlements can sustain themselves, with food gather rates that straddle the consumption requirement. High-gather settlements now grow; low-gather ones decline.

2026-07-27

  • Rebalanced the starter food economy so seeded worlds no longer converge to guaranteed collapse, with food stockpiles visible in events.
  • Added local verification tooling, Ruff linting, CI coverage, deterministic smoke checks, and reusable PRD/plan templates.
  • Added the project changelog and agent safety guardrails for secrets, destructive commands, and deployments.