Both combat.js replay and Combat.scenario.test.js built character participants inline via buildCharacterParticipant without persisting to campaign doc. Real app stores chars in campaign doc players array; encounter participants built from that. Replay/scenario diverged from real flow — campaign had zero chars. Fix: - replay.js: roster chars now have id, persisted to campaign doc players array at setup_campaign step - Combat.scenario.test.js: addCharacterViaUI writes char to campaign doc players array (mirrors app), CAMPAIGN_PATH const added
scripts/
Dev orchestration + manual demo tool. NOT test.
dev-start.sh / dev-stop.sh
Local dev stack: backend (:4001, sqlite) + frontend (:3999, server mode).
One command. Writes env vars for you. Logs to tmp/server.log, tmp/fe.log.
./scripts/dev-start.sh # start (idempotent: leaves running ports as-is)
./scripts/dev-stop.sh # stop both
replay-combat.js
Live backend demo. Drives full combat via server adapter (same contract as App). Player display live-updates. Watch UI react to state changes.
# start backend + frontend first (see docs/DEVELOPMENT.md)
node scripts/replay-combat.js [rounds] [delayMs]
# defaults: 100 rounds, 200ms/step
Coverage per round: damage, heal, all 22 conditions, toggleActive, removeParticipant, addParticipant (reinforcements), updateParticipant, pause/resume, reorderParticipants, endEncounter. Revives dead each round to sustain full round count.
See also
tests/audit/— exploratory bug-finders (manual run, non-deterministic){shared,server,src}/tests/— jest unit/integration/characterizationscratch/— gitignored throwaway