shell-two-phase-commit-in-doubt-presumed-abort-recovery
Done. The verified solution is at ~/2pc/SOLUTION.md (623 lines), with the runnable driver and tests alongside it.
A presumed-abort 2PC recovery driver in Bash 5.x (2pc_recovery.sh), plus a log writer (2pc_log.sh) and a 37-assertion end-to-end suite (test_2pc.sh) — all 37 tests pass.
Naive replay breaks in six ways, each a real safety violation:
1. Reading the log as plain text → a never-fsynced COMMIT gets treated as real (invents a commit).
2. "No decision" treated as success → atomicity/durability break.
3. Committing on a COMMIT record while ignoring ABORT votes → commits despite an abort vote.
4. Re-deciding terminal participants → non-idempotent recovery.
5. Global per-participant state files → cross-transaction aliasing.
6. Plain-redirect state writes → torn participant records on crash.
type|txid|payload|crc; recovery trusts only the longest complete, newline-terminated, checksum-valid prefix. The first bad record ends the durable prefix — the torn tail is discarded, so no outcome is invented.outcome = COMMIT iff a durable COMMIT record exists and no recorded vote was ABORT; otherwise ABORT (presumed abort).(txid, participant) and written temp → fsync → rename → fsync(dir).prev/final/action transcript plus an atomicity/safety/durability consistency check; exits 1 on violations.COMMIT tail → no commit, torn tail after a durable COMMIT → commit stands, idempotent double-run, lost-prepare participant, checksum-valid-but-newline-less tail, protocol-violating COMMIT+ABORT vote, and multi-transaction state scoping.TOTAL: 37 passed, 0 failed.# Evidence - Problem class: shell-two-phase-commit-in-doubt-presumed-abort-recovery - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-22T17:10:26.951Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Implement a two-phase-commit recovery driver that replays a coordinator log (BEGIN, PREPARE, COMMIT, ABORT records with per-participant votes and fsync boundaries) and drives every participant out of the in-doubt prepared state under presumed-abort semantics, covering coordinator crash, participant crash and torn-log-tail cases. Recovery must be idempotent and safe: no participant may commit if any participant voted abort, every participant that already committed must be confirmed, and an ambiguous trailing record must be resolved without inventing an outcome. Emit a per-participant final-state transcript plus a consistency check that flags any atomicity or durability violation.", "environment": "bash", "language": "shell", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "shell-two-phase-commit-in-doubt-presumed-abort-recovery", "provider": "openrouter", "solved_at": "2026-09-22T17:10:26.952Z", "version": "5.2"}Done. The verified solution is at ~/2pc/SOLUTION.md (623 lines), with the runnable driver and tests alongside it.
A presumed-abort 2PC recovery driver in Bash 5.x (2pc_recovery.sh), plus a log writer (2pc_log.sh) and a 37-assertion end-to-end suite (test_2pc.sh) — all 37 tests pass.
Naive replay breaks in six ways, each a real safety violation:
1. Reading the log as plain text → a never-fsynced COMMIT gets treated as real (invents a commit).
2. "No decision" treated as success → atomicity/durability break.
3. Committing on a COMMIT record while ignoring ABORT votes → commits despite an abort vote.
4. Re-deciding terminal participants → non-idempotent recovery.
5. Global per-participant state files → cross-transaction aliasing.
6. Plain-redirect state writes → torn participant records on crash.
type|txid|payload|crc; recovery trusts only the longest complete, newline-terminated, checksum-valid prefix. The first bad record ends the durable prefix — the torn tail is discarded, so no outcome is invented.outcome = COMMIT iff a durable COMMIT record exists and no recorded vote was ABORT; otherwise ABORT (presumed abort).(txid, participant) and written temp → fsync → rename → fsync(dir).prev/final/action transcript plus an atomicity/safety/durability consistency check; exits 1 on violations.COMMIT tail → no commit, torn tail after a durable COMMIT → commit stands, idempotent double-run, lost-prepare participant, checksum-valid-but-newline-less tail, protocol-violating COMMIT+ABORT vote, and multi-transaction state scoping.TOTAL: 37 passed, 0 failed.# Evidence - Problem class: shell-two-phase-commit-in-doubt-presumed-abort-recovery - Model: openrouter/deepseek/deepseek-v4.1-flash - Solved: 2026-09-22T17:10:26.951Z - Verification: solution produced by pi in sandbox; see signatures.json
{"description": "Implement a two-phase-commit recovery driver that replays a coordinator log (BEGIN, PREPARE, COMMIT, ABORT records with per-participant votes and fsync boundaries) and drives every participant out of the in-doubt prepared state under presumed-abort semantics, covering coordinator crash, participant crash and torn-log-tail cases. Recovery must be idempotent and safe: no participant may commit if any participant voted abort, every participant that already committed must be confirmed, and an ambiguous trailing record must be resolved without inventing an outcome. Emit a per-participant final-state transcript plus a consistency check that flags any atomicity or durability violation.", "environment": "bash", "language": "shell", "model": "openrouter/deepseek/deepseek-v4.1-flash", "problem_class": "shell-two-phase-commit-in-doubt-presumed-abort-recovery", "provider": "openrouter", "solved_at": "2026-09-22T17:10:26.952Z", "version": "5.2"}