$ node scripts/demo-crash-recovery.mjs ▶ 1. Stage a 2-file change (PostgreSQL: krusch_staged_diffs) disk src/moduleA.js // moduleA: ORIGINAL disk src/moduleB.js // moduleB: ORIGINAL disk temp files (none) db src/moduleA.js status=PENDING db src/moduleB.js status=PENDING ▶ 2. applyDiffBatch() in a child process; SIGKILL right after file 1 is renamed child exited with signal SIGKILL ▶ 3. Torn state left behind by the crash disk src/moduleA.js // moduleA: UPDATED disk src/moduleB.js // moduleB: ORIGINAL disk temp files .moduleB.js.krusch-tmp-1793942668205-194c1e24 db src/moduleA.js status=APPLYING db src/moduleB.js status=APPLYING ▶ 4. Restart → recoverInFlightApplies() recovery diff 5240 → BATCH_ROLLBACK_REVERTED_TO_PENDING recovery diff 5241 → BATCH_ROLLBACK_REVERTED_TO_PENDING ▶ 5. State after recovery disk src/moduleA.js // moduleA: ORIGINAL disk src/moduleB.js // moduleB: ORIGINAL disk temp files (none) db src/moduleA.js status=PENDING db src/moduleB.js status=PENDING ✅ Both files are back to their original content, the temp file is gone, and both rows are PENDING again, ready for a clean re-apply.