persistence: ExceptionStore enable_persistence(dir)

Per-EXID binary record (.ex), magic + version + atomic .tmp+rename.
Records full E5 §9 lifecycle: state, EXID, EXTYPE, EXMESSAGE, and
the candidate EXRECVRA list.

Cleared exceptions are terminal — the FSM transitions through
Cleared remove the in-memory entry AND delete the journal file
(matching the existing in-memory semantics).  Recovering /
RecoverFailed states survive restart: the application can decide
on replay whether to retry recovery or abort.

Five new tests cover post+replay, Recovering-survives-restart,
autonomous-clear cleanup, RecoverFailed retry post-restart, and
corrupt-record drop.

This completes #12 in the test-gap backlog (persistence for the four
in-memory stores beyond Spool).

Closes #4 in the test-gap backlog.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-09 10:37:36 +02:00
parent 1189ffc994
commit b3bde7f087
3 changed files with 325 additions and 12 deletions
+1
View File
@@ -110,6 +110,7 @@ add_executable(secsgem_tests
tests/test_control_jobs.cpp
tests/test_job_persistence.cpp
tests/test_exceptions.cpp
tests/test_exception_persistence.cpp
tests/test_carrier_state.cpp
tests/test_carriers.cpp
tests/test_carrier_persistence.cpp