af165f4491
Replay reorder picker used living[0]→living[1] (HP-sorted). Wolf(20) already before Merchant(19) = no-op drag. Fired every 8 turns = UI animated drag, nothing changed = visual funk. 3 useless Wolf→Merchant drags in round 16-17 log. Also fixed pointer-cross: old picker dragged arbitrary pair. If swap crossed current pointer → ambiguous who-acted semantics (skip/double). New picker: swap two ADJACENT UPCOMING actors (both strictly after current pointer). Always real move, never crosses pointer. 13-round replay: 0 skips, 0 double-acts, 0 order shifts (was 2 skips, 4 double-acts with arbitrary swaps). Note: reorderParticipants itself has no pointer logic — pure drag. Crossing pointer behavior in real app untested (potential BUG-13).
scripts/
Manual demo tool. NOT test.
replay-combat.js
Live backend demo. Drives full combat via ws 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