June 30, 2026
LLMs, solvers, and agent teams increasingly generate workflow actions, repairs, and plans, but a generated action may be syntactically valid yet stale, infeasible, conflicting, or destructive of the evidence that triggered a repair. We introduce Agentic Transaction Processing (ATP), a transaction model that treats generated actions as untrusted proposals until they pass deterministic admission under a declared, executable constraint set \(\mathcal{C}\). The principle is two-sided: a proposal is not truth, and no proposal foresees every disruption: anything may propose, but only the runtime admits and commits, and when an unforeseen disruption strikes it repairs reactively within bounds rather than trusting a fresh proposal. Relative to \(\mathcal{C}\), committed-state correctness becomes independent of the competence, honesty, or learning of the proposing layer. We realize ATP in Mnemosyne, a runtime with an append-only transition log, effective-state projection, dependency-safe compensation, and active commitment records, and prove four safety properties relative to \(\mathcal{C}\) (authority separation, serial-equivalent generative admission, evidence-preserving repair, and obligation containment) together with a bounded-reactive-repair guarantee for its localized repair protocol (LCRP). A reproducible artifact rejects the targeted violations across nine falsification tests while still admitting valid work, at under \(6\%\) projection-and-validation overhead, and bounded local repair edits an order of magnitude fewer operations than global recompute. Mnemosyne is open source: https://github.com/eyuchang/Mnemosyne/tree/arxiv-atp-rq1-rq9b-r8-v2.
Database systems have long separated logical correctness from physical execution through transactions, recovery, isolation, logging, and integrity constraints [1]–[4]. Workflow systems extend these ideas to long-running activities with retries, timeouts, idempotency, and compensation [5]–[7]. Both families, however, usually assume that the submitted unit of work is meaningful enough to be treated as a transaction request: it may conflict, fail, or abort, but it is not itself a hallucinated, stale, or semantically invalid proposal produced by an untrusted reasoning process.
Agentic workflows violate this assumption. The candidate transaction may be generated by a language model, an optimization solver, or a team of agents, including prior multi-agent planning systems that add validation and transaction-style guarantees [8]–[15]. Yet a well-formed proposal can still be wrong in ways a syntactic check accepts.
Consider a concrete case from multi-agent planning [8]. In a family’s Thanksgiving plan, the father lands in Boston and picks up Grandma on the way home so dinner can start on time. His flight is delayed, so an LLM agent reactively replans the afternoon’s pickups and drives. The new schedule parses as valid, yet two faults slip through. It reuses the off-peak drive time from the original 3 pm plan, ignoring that the delayed pickup now lands in rush-hour traffic, so the rescheduled pickup is physically impossible. And after reshuffling the drivers, it silently drops Grandma’s pickup, leaving her stranded so dinner never starts.
A conventional transaction layer would commit this well-formed schedule and inherit both faults. ATP instead routes each revised assignment through a deterministic gate against the declared constraint set \(\mathcal{C}\) over the current effective state (the StateView). The infeasible pickup is rejected because its travel time violates \(\mathcal{C}\); the replan is rejected for dropping Grandma’s pickup, since a committed obligation cannot silently disappear. Feasible reassignments commit; the rest are rejected with a recorded reason. The durable guarantee thus comes from outside the model: a stronger planner gets more of the day right, but none can erase a standing commitment or commit a physically impossible plan.
Admission stops bad proposals, but some failures are not proposals at all. Suppose the gate has committed a feasible afternoon and execution begins, and then an unforeseen disruption strikes that no policy anticipated: a highway closure makes the committed airport leg infeasible in mid-execution. No pre-registered compensation covers it. Here ATP does not merely reject; it reacts. The affected commitment wakes and launches a bounded local repair that re-times only the disrupted leg and its dependents, leaving the rest of the day untouched, and the repair it produces re-enters the same admission gate. A wrong reactive repair is caught exactly like any other proposal, while the blast radius stays contained to the affected region instead of forcing a full re-plan. Static admission and bounded reactive repair are thus two halves of one boundary: nothing becomes truth, whether first proposed or repaired, without passing the gate.
The failure boundary is no longer only the commit protocol. It is the transition from generated intent to durable truth. For agentic workflows, the first transaction question is not merely “can this transaction commit?” but: should this generated proposal be admitted as a transaction at all?
This paper introduces Agentic Transaction Processing (ATP), a transaction model for generated workflows.1 What is new is not the failure but the proposer. Capable AI now drafts and repairs workflows at a speed and scale no human author matches, and that is genuinely useful: an LLM or agent can react to a disruption no designer anticipated and propose a fix in seconds. But the same models hallucinate, and they are sycophantic (asked to validate their own plan, they tend to endorse it), so the proposer cannot be its own judge. Speed, autonomy, and reactivity are exactly what we want from AI, and exactly what makes an unguarded transaction layer dangerous: we can neither simply trust the proposer nor surrender the automation. ATP keeps both. It admits AI, solver, agent, and trigger output as untrusted proposals that only a deterministic gate may turn into committed truth, so the system stays smart and reactive where it proposes while remaining correct where it commits. The central rule is:
A proposal is not truth, and no proposal foresees every disruption.
Generated actions may propose. Active workflow obligations may wake. Solvers may repair. Runtime drivers may orchestrate. But only the transaction layer may admit and commit. And the first clause is not the whole story: no proposal, however well admitted, foresees every future disruption, so ATP does not stop at the gate.
This yields a separation that classical transaction processing never needed. Because every generated action, repair, and learned policy is a proposal that only the gate may admit, committed-state correctness is decoupled from the intelligence layer. Relative to a declared constraint set \(\mathcal{C}\), a more capable model produces better proposals, while a faulty or adversarial one produces more rejected work, but neither can write committed truth that violates \(\mathcal{C}\). Intelligence governs usefulness; the transaction layer governs correctness, and building that layer is a data-management problem: it lives in a committed transition log, an effective-state projection, and a deterministic admission gate, not in the prompt.
This boundary is the complement of agent-side approaches. Where SagaLLM [8] brings transactional discipline to the LLM planner, ATP opens the transaction layer to untrusted planners: one disciplines the proposer, the other governs the committer, and together they bracket the same goal from both ends.
For decades the unit of work submitted to a transaction system was authored by a person or a trusted application and reviewed before submission, so the system could assume the submitter held the authority to transact; classical input validation and integrity constraints then checked only data quality (does this command satisfy fixed predicates), never the submitter’s right to commit. A generative proposer breaks that assumption, and that is what is new. ATP governs the prior question (whether an untrusted, generated proposal may become a transaction request at all), so what it enforces is an authority contract over committed state, not a richer predicate on a trusted command: a proposal is validated against the effective-state witness (StateView), a repair may not destroy the evidence that justified it, an active commitment may wake but never write, and concurrent proposals are admitted as if serial. The hardest of these, evidence-preserving repair, has no analogue in classical validation, which never had to distrust the author of the command.
Admission decides which proposals may commit, but it cannot, by itself, handle a disruption that strikes after commit and that no registered compensation covers: a breakdown, a closure, a late arrival. For these, ATP adds a second mechanism: a localized cascading repair protocol (LCRP). When such a failure fires, the affected obligation wakes and LCRP edits only the affected region of the committed plan, under a bounded edit radius and iteration cap, propagating along effective dependencies and escalating to rollback if it cannot contain the damage. The repair LCRP produces is itself a proposal that re-enters the same admission gate, so reactive recovery inherits the same guarantee: a wrong repair cannot commit. Admission keeps a bad proposal out; LCRP keeps an unforeseen disruption from forcing an unbounded, unguarded re-plan, the proposal-time and runtime faces of a single authority rule (§3.2).
A new database-systems problem. Agentic transaction processing: a generated action must earn transaction authority before it becomes committed truth (§[sec:motivation]).
The ATP model. A transaction model that decouples committed-state correctness from the intelligence layer by treating every LLM, solver, and agent output as a proposal, with active commitment records (ACRs), transaction-log-resident obligations whose wakeups are themselves proposals (§2.2).
Four safety theorems. Authority separation, serial-equivalent generative admission, evidence-preserving repair, and obligation containment, proved relative to a constraint set \(\mathcal{C}\) (§2.3, §3).
Reactive local repair. A bounded localized repair protocol (LCRP) whose output re-enters admission, with a bounded-recovery contract and a reduction of recursive recovery to sequential recovery (§3.2).
The Mnemosyne runtime. An executable ATP substrate over a committed-transition log, effective-state projection, deterministic admission, dependency-safe compensation, and PostgreSQL-backed concurrency (§4).
Evaluation. Nine falsification-style safety experiments, a cost audit, a disruption-containment study (LCRP edits an order of magnitude fewer operations than global recompute), and a recovery-during-recovery analysis (§5).
Generated workflow actions fail in ways ACID does not address: an invalid transition, a compensation that orphans effective dependents, conflicting or stale-world proposals, or a repair that destroys the evidence that triggered it. ACID governs a transaction after the system accepts it [1]–[3]; ATP governs whether a generated proposal should be admitted as a transaction at all. This section presents the failure model (§2.1), the transaction model (§2.2), the properties it adds beyond ACID (§2.3), and the invariants the runtime enforces (§2.4).
Mnemosyne addresses failure modes that ACID does not govern, because ACID constrains a unit of work only after it is admitted. We describe the principal modes below; Table 1 pairs each with the mechanism that rejects or contains it.
Invalid generated transition. An LLM proposes a workflow transition that violates a finite-state constraint. A conventional workflow engine may persist the action unless application code rejects it. ATP requires a deterministic validator to reject it before commit.
Compensation with effective dependents. A record is compensated after downstream records have depended on it. Raw log history still contains the record, but it is no longer effective. ATP disallows compensation that would orphan currently effective dependents or break the effective-state chain.
Conflicting proposals. Two agents propose different plans for the same tenant and entity. Both may be individually feasible. ATP rejects the active proposal set before commit because the proposals conflict over the same admission scope.
Stale-world proposal. A solver proposes a route assuming a deadline of 17:00, but an observed world snapshot reports the deadline is now 11:00. ATP rejects the proposal before commit because its assumptions no longer match observed facts.
Evidence-destroying repair. A coding agent observes that continuous integration is red and proposes to “repair” the repository by deleting the failing tests. A periodic checker may see the next CI run turn green and conclude the violation is gone, but the defect has not been repaired: the evidence has been destroyed. ATP requires admission to preserve the evidence that triggered repair unless the validator accepts that the repair addresses the underlying condition rather than suppressing its observable signal.
| Failure | ATP mechanism |
|---|---|
| Invalid transition | deterministic admission |
| Unsafe compensation | dependency-closed compensation |
| Conflicting proposals | scoped proposal-conflict rejection |
| Stale assumptions | stale-world rejection |
| Evidence-destroying repair | evidence-preserving admission |
| Unbounded live obligation | active commitment lifecycle |
| Duplicate concurrent repair | idempotent recovery-event admission |
Definition 1 (Proposal). A proposal \(p\) is an uncommitted candidate action generated by an LLM, solver, agent, active commitment, or external tool. It may include a target tenant, workflow, entity, operation, dependency set, world assumptions, and optional solver certificate.
Definition 2 (Committed transition). A committed transition is a proposal that has passed admission and has been durably written to the committed-transition log.
Definition 3 (Committed-transition log). The committed-transition log (CTL) is the append-only record of admitted transitions, active commitment lifecycle events, and durable recovery events. It is the source of committed truth.
Definition 4 (Effective state). The effective state of an entity is the state obtained by replaying committed transitions while excluding records that have been compensated, superseded, or otherwise made ineffective.
Definition 5 (Admission). Admission is the deterministic pre-commit procedure that checks a proposal against current effective state, structural constraints, dependency safety, conflict scope, policy, and observed world facts. Only admitted proposals may commit.
Definition 6 (Conflict scope). A conflict scope is the tenant, entity, or recovery region over which two proposals may not both become effective without revalidation. ATP requires every proposal to declare a conflict scope, and the admission gate serializes or rejects proposals with overlapping incompatible scopes.
Definition 7 (Active commitment record). An active commitment record (ACR) is a durable obligation stored in CTL and created by an admitted workflow step. It records a commitment or assumption together with a trigger, dependency scope, continuation pointer, guard, admission policy, compensation handler, expiry condition, and failure signature. When its trigger fires, the runtime may resume the continuation to produce a repair proposal; the record itself cannot mutate committed state.
We model an ACR as: \[\begin{align} r = \langle &\text{id}, \text{txn}, \text{commitment}, \text{scope}, \text{trigger},\\ &\text{continuation}, \text{guard}, \text{validator}, \text{compensation},\\ &\text{expiry}, \text{failure-key}, \text{status}\rangle . \end{align}\] Typical status values are live, fired, proposed, admitted, rejected, compensated, expired, and discharged.
Figure 1 shows the core ATP path. The proposal is not committed directly. It passes through admission. The commit log is the source of committed truth, while StateView exposes current effective state.
Figure 2:
.
Algorithm 2 gives the executable contract used by the implementation and by the RQ1–RQ5 experiments. The details of \(\mathcal{C}\) are application-specific, but the authority pattern is fixed: proposal generation can vary, while admission and commit remain deterministic runtime operations.
ACID is necessary but insufficient for agentic workflows. Atomicity, consistency, isolation, and durability protect a transaction once the system has accepted it [1]–[4]. They do not decide whether a generated action should have been accepted as a transaction in the first place. ATP adds an admissibility layer in front of commit: ACID protects committed transactions, while ATP protects the authority boundary before a generated action becomes a transaction. The properties below make the ATP layer precise, and Section 3 proves the four that matter most.
Property 1 (Proposal Non-Authority, PNA). LLMs, solvers, agents, benchmark adapters, runtime drivers, learned repair policies, and active commitments may propose or orchestrate, but none may directly create committed truth.
Property 2 (Intelligence-Decoupled Correctness, IDC). Relative to a declared constraint set \(\mathcal{C}\), the correctness of committed state is independent of the competence, honesty, or learning behavior of the proposing intelligence layer.
Property 3 (Deterministic Admission under \(\mathcal{C}\), DA). Every generated proposal must pass a deterministic validator enforcing \(\mathcal{C}\) before commit. Admission depends on effective state, policy, dependency safety, conflict scope, and observed world facts, not on the proposer.
Property 4 (Effective-State Soundness, ESS). StateView is derived only from effective committed records, excluding records that have been compensated, superseded, or invalidated.
Property 5 (Evidence-Preserving Repair, EPR). An admitted repair may not discharge its own trigger by deleting, compensating, or obscuring the evidence that justified it, unless admission verifies that the triggering condition is actually resolved under \(\mathcal{C}\).
Property 6 (Dependency-Closed Compensation, DCC). A compensation is inadmissible if it would orphan effective dependents or break the effective chain for an entity.
Property 7 (Obligation Containment, OC). Active commitments can wake and emit proposals, but cannot mutate committed truth directly.
Property 8 (Serial-Equivalent Generative Admission, SEA). Concurrent generative proposers are admitted as if in some serial order over their declared conflict scopes, so committed state never reflects two conflicting proposals or a duplicate of one.
Property 9 (Audit and Traceability, AET). Rejections, wakeups, proposal packages, repairs, admitted records, and compensations remain queryable as historical evidence. Traceability supports the guarantees above; it is not itself the primary guarantee.
Table 2 aligns each classical guarantee or mechanism with the ATP property that governs it once the writer is an untrusted generator. Most rows extend a familiar guarantee to generated proposals; the last names a concern ACID never had.
| Classical guarantee or mechanism | ATP property |
|---|---|
| Atomicity | Proposal Non-Authority () |
| Consistency | Deterministic Admission under \(\mathcal{C}\) () |
| Isolation | Serial-Equivalent Generative Admission () |
| Durability | with Audit and Traceability () |
| Saga compensation | Dependency-Closed Compensation () |
| Active triggers | Obligation Containment () |
| Generated-repair integrity (new) | Evidence-Preserving Repair () |
We state the core safety conditions as invariants here; the properties that follow are proved as theorems in §3, with full proofs in the extended version. The results are relative systems-safety claims rather than complexity-theoretic claims. Throughout the section, fix a trusted constraint set \(\mathcal{C}\) consisting of the deterministic admission validator, application finite-state constraints, dependency and compensation rules, stale-world checks, evidence-preservation rules, and conflict-scope rules. A committed transition is \(\mathcal{C}\)-valid if the admission gate accepts it under this constraint set and current effective state. All guarantees below are relative to \(\mathcal{C}\); if \(\mathcal{C}\) omits a hazard, ATP does not claim to detect it.
ATP does not assume an oracle for semantic correctness. In the implementation and experiments, \(\mathcal{C}\) is a finite executable constraint set over proposal structure, tenant/entity scope, operation and idempotency keys, current StateView, dependency edges, retained evidence handles, declared world facts, and application validators. Thus \(\mathcal{C}\) is decidable for the artifact workloads. In richer deployments, constructing a faithful \(\mathcal{C}\) is part of the application engineering problem rather than something ATP solves by itself. Appendix 15 gives a taxonomy and grammar of \(\mathcal{C}\), showing that most rules are derived structurally or declared as predicates rather than hand-coded per case.
The theorems assume gate closure: proposer, solver, runtime-driver, benchmark, and ACR-wakeup code can emit proposal packages but cannot append domain truth to CTL except through admission. Mnemosyne’s reference implementation is organized around this boundary and includes regression tests for non-authoritative wakeups, rejected proposals, and commit-boundary behavior, but this paper does not claim a machine-checked noninterference proof of the entire Python codebase. The formal claims therefore apply to executions that satisfy this gate-closure assumption.
Theorem 1 is deliberately simple once the gate is trusted: if only \(\mathcal{C}\)-valid transitions are appended, committed state is \(\mathcal{C}\)-valid. The systems contribution is not that implication but the structure of \(\mathcal{C}\) and the witness the gate reads. A classical validator checks a submitted command against static predicates; ATP’s gate instead reads the effective-state projection rather than raw history, enforces dependency-closed compensation, rejects stale-world and conflicting proposals, and, hardest of all, refuses a repair that would discharge its own trigger by destroying evidence. We therefore lead the development conceptually with evidence-preserving repair (Theorem 3), the guarantee with no classical analogue, and read authority separation (Theorem 1) as the umbrella it instantiates.
Invariant 1 (No invalid commit). A proposal with a non-empty validation violation set must not be written to CTL.
Invariant 2 (Effective-state separation). Full history preserves all committed records, while effective history excludes records that have been compensated, superseded, or otherwise made ineffective.
Invariant 3 (No orphaned effective dependents). A compensation is rejected if it would leave an effective record depending on an ineffective record.
Invariant 4 (Proposal conflict rejection). Two active proposals that target the same tenant/entity scope with incompatible effects are rejected or serialized before commit.
Invariant 5 (Stale-world rejection). A proposal whose world assumptions disagree with observed world facts is rejected before commit.
Invariant 6 (Non-authoritative wakeup). A fired ACR cannot directly mutate CTL or StateView. It can only resume a continuation that emits a proposal subject to ordinary admission.
Invariant 7 (Evidence preservation). A memory-initiated repair must not remove, overwrite, compensate, or invalidate the evidence that caused the trigger unless the admission gate accepts, under retained evidence and validator rules, that the proposed repair addresses the triggering condition rather than merely suppressing its observable signal.
Invariant 8 (Effective-chain preservation). A compensation is rejected if it would break the effective chain for an entity.
Invariant 9 (Admitted commitment creation). Creating an ACR is itself an admitted transition. The record must have bounded dependency scope, a discharge or expiry condition, a guard, a validator, and an idempotent creation key.
Invariant 10 (Scoped repair). A proposal generated by an ACR may touch only the dependency scope recorded by that ACR, unless a wider scope is explicitly admitted as an escalation.
Invariant 11 (Cross-episode traceability). Rejected or compensated ACR proposals with matching failure signatures remain queryable as historical evidence for future proposal ranking, guard strengthening, or external causal-learning modules.
We prove the invariants of §2.4 as safety theorems: first for the admission of generated proposals, then for reactive repair under unforeseen disruptions (§3.2).
Theorem 1 (Authority-Separation Theorem). Let \(\mathcal{C}\) be the trusted admission constraint set. Let the intelligence layer consist of arbitrary LLMs, solvers, agents, active-commitment wakeups, learned repair policies, and benchmark adapters. Assume: (i) the intelligence layer can only emit proposals; (ii) the only operation that extends CTL is append of an admitted transition; and (iii) the admission gate appends only proposals accepted under \(\mathcal{C}\) and current effective state. Then committed-state correctness with respect to \(\mathcal{C}\) is independent of the correctness, competence, honesty, or learning behavior of the intelligence layer.
Authority Separation, Theorem 1. We prove the claim by induction on the length of CTL. Initially, CTL is empty or contains only trusted initial records, so every committed transition is \(\mathcal{C}\)-valid. Assume after \(k\) appends that every transition in \(\textsf{CTL}_k\) is \(\mathcal{C}\)-valid. Consider the \((k+1)\)-st committed transition. By assumption, no LLM, solver, agent, ACR wakeup, learned policy, or adapter can append to CTL directly; such components can only emit a proposal \(p\). Since the only operation that extends CTL is the append of an admitted transition, \(p\) can become the next committed transition only if the gate admits it under \(\mathcal{C}\) and the current effective state. By the soundness of the gate with respect to \(\mathcal{C}\), the appended transition is \(\mathcal{C}\)-valid. Thus every transition in \(\textsf{CTL}_{k+1}\) is \(\mathcal{C}\)-valid. By induction, all committed transitions are \(\mathcal{C}\)-valid. The argument never assumes that the intelligence layer is accurate, rational, complete, honest, or improving; therefore committed-state correctness is decoupled from that layer. ◻
The intelligence layer may make the system more or less useful; it cannot make committed state incorrect with respect to \(\mathcal{C}\) unless it is granted authority to bypass or weaken the admission boundary. This is the central systems claim: the model can hallucinate, the solver can be wrong, the agent can be adversarial, and a learned policy can be bad, yet none can corrupt committed truth unless \(\mathcal{C}\) itself admits the transition.
Corollary 1 (Solver Non-Authority). A solver certificate proves only that a solver produced a plan under its own assumptions. It does not make the plan admissible. The plan remains a proposal until ATP admission accepts it under \(\mathcal{C}\).
Corollary 2 (Effective-State Soundness). If StateView is derived only from non-compensated, non-superseded, dependency-valid committed records, then every StateView fact corresponds to an effective committed chain, and no compensated or superseded record appears as current truth.
Corollary 3 (Dependency-Closed Compensation Safety). If compensation is admitted only when it preserves dependency closure and effective-chain continuity, then no admitted compensation can leave an effective dependent orphaned or produce an effective state lacking a valid committed chain.
Theorem 2 (Serial-Equivalent Generative Admission). By the conflict-scope contract (Definition 6), proposals with overlapping incompatible scopes are serialized or rejected at admission. Assume in addition that append to CTL is atomic and that every dependent recovery proposal reads only committed effective state after its dependencies have committed. Then concurrent generative proposers are observationally equivalent to some serial admission order over committed transitions. Moreover, cascading recovery is memoryless with respect to speculative proposal history: later recovery depends only on committed history and effective state, not on rejected, in-flight, or superseded proposal attempts.
Serial-Equivalent Generative Admission, Theorem 2. For each conflict scope, admission imposes a total order on accepted proposals: if two proposals contend for the same scope, the gate admits at most one before the other observes the updated effective state or is rejected as conflicting. Because append is atomic, each admitted proposal contributes one indivisible committed transition. Interleavings across disjoint scopes commute with respect to the observations made through StateView, so the global committed history is equivalent to an interleaving of the per-scope serial orders. A dependent recovery proposal is evaluated only after its dependencies appear in CTL and after StateView reflects the effective projection of committed records. Rejected or in-flight proposals never appear in this projection. Thus each recovery step can be explained by a serial prefix of committed history, and recovery decisions are independent of speculative attempts that never committed. ◻
Corollary 4 (Storage-Level Idempotency Boundary). In the PostgreSQL substrate, tenant-scoped uniqueness over event identifier, idempotency key, and recovery sequence position implements the concrete idempotency and conflict boundary used by Theorem 2: concurrent duplicate proposals either converge to one canonical committed event or reject conflicting losers without producing duplicate committed truth.
Theorem 3 (Evidence-Preserving Repair Safety). Let a repair proposal be triggered by evidence \(E\) of a failure condition \(F\). If admission requires that either \(F\) is resolved under \(\mathcal{C}\), or \(E\) remains effective and queryable after the repair, then no admitted repair can discharge its own trigger merely by deleting, compensating, or obscuring the evidence that justified it.
Evidence-Preserving Repair Safety, Theorem 3. The trigger is evaluated over committed evidence in CTL and effective evidence in StateView. Suppose a repair \(r\) is admitted and discharges the trigger. If \(r\) leaves \(E\) effective and queryable, then the trigger has not been discharged by destroying evidence. Otherwise, \(r\) deletes, compensates, or obscures \(E\). By the evidence-preservation invariant, such a repair is admissible only when the gate verifies that the underlying failure condition \(F\) is resolved under \(\mathcal{C}\). Hence no admitted repair can succeed solely by removing the observable signal of \(F\): it either preserves the evidence or resolves the condition. Since CTL is append-only, the evidence and the gate decision remain auditable after the fact. ◻
This theorem is stronger than audit traceability. Traceability says the alarm can be found later; evidence-preserving repair says the alarm cannot be silenced by the repair.
Theorem 3 does not decide whether an arbitrary real-world failure has truly been fixed. That question can be open-ended or outside the information available to the runtime. ATP requires either an executable validator in \(\mathcal{C}\) that accepts the repair as resolving the triggering condition, or continued retention of the triggering evidence. If neither condition can be established, the safe behavior is rejection or escalation rather than admission.
Theorem 4 (Obligation Containment). If every ACR is itself created by an admitted committed transition, and every fired ACR can only emit a proposal package, then no active commitment can mutate domain truth except through the same admission boundary as any other proposal.
Obligation Containment, Theorem 4. Creation of an ACR is already a committed transition, so its existence is governed by ordinary admission. Firing an ACR is not a commit operation; it resumes a continuation that constructs a proposal package. By assumption, that package must pass ordinary admission before any domain transition can be appended. Therefore an ACR has no direct mutation path to CTL or StateView. It can influence committed truth only by generating a proposal that the same gate admits for every other proposer. A future obligation can wake, but it cannot corrupt. ◻
Corollary 5 (Learning Non-Authority). If learned artifacts can affect only proposal generation and ranking, and cannot weaken \(\mathcal{C}\) except through an explicitly admitted governance transition, then learning cannot directly compromise committed-state correctness. By Theorem 1, any domain effect of learning must pass the admission gate, so its worst outcome is over-rejection, delayed repair, or selection among admissible but suboptimal proposals, never an invalid commit. Whether learning improves remedies, reduces repeated failures, or lowers regret is outside the scope of this paper and is deferred to future work (see the Limitations* section).*
All ATP guarantees are relative to the declared trusted constraint set \(\mathcal{C}\). If \(\mathcal{C}\) is incomplete, ATP cannot reject violations outside \(\mathcal{C}\). The theorems do not prove convergence, optimality, monotonic improvement, unlimited liveness, or full-code bypass freedom. They prove a narrower systems property: intelligence, learning, and recovery memory remain non-authoritative. They may propose, rank, delay, or over-reject, but they cannot commit domain truth except through admission under \(\mathcal{C}\).
Admission decides whether a generated proposal may become truth. But not every threat to committed state is a proposal: the world also produces failures no proposal anticipated: a delayed flight, a machine breakdown, a road closure mid-execution. A generated plan can be perfectly admitted and still be overtaken by an event it never modeled. ATP therefore pairs admission with a second mechanism. A proposal is not truth, and no proposal foresees every disruption: the first clause is enforced by the gate, the second by reactive local repair.
ATP distinguishes two failure modes. Anticipated failures have a recovery path the designer registered in advance (a cancelled booking that triggers a declared compensation), and are handled by the evidence-preserving, dependency-closed compensation of Theorems 3 and 4. Unforeseen failures have none: the committed log reaches a state no compensation addresses. Here a fired ACR hands the disrupted region to a localized cascading repair protocol (LCRP) rather than recomputing the whole plan.
The runtime runs one loop per event (propose, admit, commit, monitor, repair), and on disruption LCRP applies bounded edits instead of a global recompute. It edits only the disrupted region under an iteration cap \(K\) and a displacement budget \(\delta_{\max}\), where the edit radius counts the transitions (operations or jobs) touched. Each iteration revalidates feasibility against \(\mathcal{C}\) and propagates effects only along the effective dependencies of the disrupted region, so a change ripples to a successor only if that successor actually depends on the changed record in the current StateView. The runtime, not the proposal, computes the reversibility class of each candidate edit, so a repair cannot self-certify as safe; one that would cross an irreversible boundary is vetoed. Crucially, the repair LCRP produces is itself a proposal that re-enters the admission gate, so a wrong reactive repair is caught exactly like any other proposal and can never become committed truth.
A single repair round proceeds in three phases over the disrupted region. (I) Status update records the disruption as a new world fact (marking the affected committed records ineffective and retaining the disruption as evidence), so the repair is computed against the true post-disruption StateView, not the stale plan. (II) Effect propagation pushes the consequences (delays, freed resources, violated guards) forward along effective dependencies, computing the minimal set of downstream transitions that must change. (III) Bounded reassignment re-times or re-assigns only those transitions, under \(\delta_{\max}\) and \(K\), and emits the result as a proposal package. Each phase is contained to the dependency closure of the disruption, which is what keeps the edit radius small; the package then passes ordinary admission before any of it commits.
Proposition 1 (Bounded Reactive Repair). Under LCRP with iteration cap \(K\) and displacement budget \(\delta_{\max}\), repair time satisfies \(T_{\mathrm{repair}}\in\mathcal{O}\!\big(K(JM+JO_{\max})\big)\) and the cumulative displacement satisfies \(\Delta(\sigma^\ast)\le\delta_{\max}\), where \(J\) is the number of affected entities, \(M\) the number of resources, and \(O_{\max}\) the maximum transitions per entity. Repair terminates within \(K\) revalidation rounds; if either bound is exceeded, the runtime escalates deterministically by rolling back to the most recent restore point. No transition commits while its violation set against \(\mathcal{C}\) is non-empty.
Proof. Each repair round validates the affected region in \(\mathcal{O}(JM)\) and propagates effects along effective dependencies in \(\mathcal{O}(JO_{\max})\); rounds are capped at \(K\), giving the time bound. The displacement budget is checked each round and escalation triggers as soon as it is exceeded, so cumulative displacement never passes \(\delta_{\max}\). Commit occurs only on an empty violation set (admission), so no infeasible transition is appended; if no in-budget repair is found within \(K\) rounds, rollback restores the last validated state. ◻
Proposition 2 (Transactional Rollback Safety). Let \(S_j\) be the most recent restore point. Rollback guarantees that (i) no infeasible state remains committed, (ii) all effects after \(S_j\) are logically undone through dependency-closed compensation, and (iii) replay from \(S_j\) is deterministic.
Proof. Restore points are created only after admission (empty violation set), and committed-transition-log entries are immutable; superseded branches are excluded from the effective StateView but retained for audit. Compensation handlers keyed by idempotency keys logically undo effects after \(S_j\) under the dependency-closure rule, so rollback returns to a previously admitted, \(\mathcal{C}\)-feasible state from which replay is deterministic. ◻
These guarantees are relative to \(\mathcal{C}\) and the runtime’s effective-state model; they do not assert that the proposer finds a globally optimal repair, nor that \(\mathcal{C}\) is semantically complete.
A repair is itself an execution, so a failure can strike while a repair is in flight: a second disruption arrives before the first is absorbed, or a compensation itself fails. This recursive recovery appears to demand a recovery stack whose depth must be tracked and bounded. It does not, but the reason must be stated carefully, because a disruption is a new fact about the world and must never be dropped. After the most recent committed restore point \(S_k\), the runtime maintains a pending observation set \(D_k\): the disruptions observed since \(S_k\) that no admitted repair has yet absorbed. Every repair candidate is validated against \(S_k\), \(\mathcal{C}\), and all of \(D_k\), so it must account for every outstanding failure, not only the latest.
Lemma 1 (Memorylessness with respect to recovery history). Because admission reads only the latest committed restore point \(S_k\), the constraint set \(\mathcal{C}\), and the accumulated observation set \(D_k\), a repair candidate is a function \(R(S_k,\mathcal{C},D_k)\). It is memoryless with respect to recovery history* (independent of whether earlier repair attempts were in progress, aborted, or superseded), but not with respect to world observations, since \(D_k\) retains every disruption not yet absorbed into an admitted repair.*
Proposition 3 (Recursive recovery reduces to sequential recovery). If every in-flight repair remains an uncommitted proposal and every admitted repair is validated against \(S_k\), \(\mathcal{C}\), and the full pending set \(D_k\), then a failure arriving mid-repair is equivalent to appending it to \(D_k\) and restarting single-shot recovery from \(S_k\). Recursive recovery is therefore exactly sequential recovery over the accumulated observations: nesting introduces no new case, every committed transition is \(\mathcal{C}\)-feasible at any nesting depth and failure timing, and a sequence of \(F\) failures terminates in at most \(FK\) rounds before success or escalation.
Proof. By Lemma 1 a candidate depends only on \((S_k,\mathcal{C},D_k)\), not on the in-flight repair it interrupts; since in-flight repairs are uncommitted, interrupting one changes no committed state. Appending the new disruption to \(D_k\) thus yields the same problem instance as a fresh single-shot recovery from \(S_k\) against the enlarged \(D_k\). Safety and termination follow from Proposition 1 applied to each single-shot recovery, and the \(FK\) bound from at most \(F\) such recoveries, each capped at \(K\) rounds. ◻
Reactive repair is where admission stops being a predicate check. A generated repair runs over effective state, must preserve the very evidence that triggered it, must close its own dependencies and conflict scope, and may be interrupted by a fresh disruption, yet ATP keeps every committed transition feasible and loses no observation, with edit radius and recovery depth both bounded. This is the systems content behind the second clause of the principle: because no proposal foresees every disruption, the transaction layer must react safely, not merely admit. Reactive planning is thus fully in scope; only preemptive guard synthesis (anticipating disruptions before they occur) is deferred to future work (Limitations).
Mnemosyne is the executable substrate for ATP. Its design objective is not to make the proposer smarter; it is to make proposal authority explicit. The architecture therefore separates four planes: the proposal plane, where LLMs, solvers, benchmark adapters, learned policies, and active commitments generate candidates; the admission plane, where deterministic validators decide whether a candidate may become truth; the commit plane, where admitted transitions are durably appended; and the projection plane, where current effective state is materialized for future admission. Runtime engines sit outside these planes as orchestrators. They schedule work, retry steps, and wake obligations, but they do not own committed truth. Figure 4 shows these planes, the proposers that feed them, and the durable stores that only admitted transitions may extend.
Durable substrate. The committed-transition log (CTL) is the source of committed truth: tenant-scoped, versioned, and logically append-only, it stores admitted transitions, compensation and supersession records, and ACR lifecycle records, so later transitions may supersede earlier ones without erasing the fact that they were admitted. StateView projects current truth from CTL by replaying only effective records (not compensated, superseded, or invalidated, with dependency chains intact); admission reads StateView, never raw history, which is the mechanism behind effective-state soundness. A recovery-event log records the fine-grained events of repair and obligation execution, and in the PostgreSQL substrate tenant-scoped uniqueness over event identifiers, idempotency keys, and recovery sequence positions is the concrete idempotency boundary of Theorem 2.
Concurrency and contention. The serialization unit is the conflict scope, not the whole log: proposals over disjoint scopes (distinct tenant, entity, or resource) commit concurrently, so throughput scales with scope-level parallelism rather than a single global lock. Within one hot scope, the PostgreSQL substrate orders contenders through row-level locking and a unique constraint over (tenant, scope, idempotency key, recovery sequence position), so concurrent proposals either converge to one canonical committed transition or reject the conflicting losers, exactly the boundary of Theorem 2; MVCC snapshot isolation lets the StateView projection read effective state without blocking admission. A large disruption that wakes many obligations therefore degrades to serialized admission on the affected scopes only, trading latency for serial equivalence rather than risking an invalid interleaving, and rejected contenders retry against the updated StateView under the memoryless repair model (§3.2). Cross-scope independence is what keeps dense conflict-scope collisions from becoming a global bottleneck.
Authority boundary. The admission gate is the only authority boundary. A proposal package carries a candidate transition, declared scope, proposer identity, an optional solver certificate, world assumptions, and evidence; the gate checks finite-state validity, idempotency, scope, dependency closure, compensation safety, stale-world conditions, conflicts, and evidence preservation, treats a solver certificate or LLM rationale as evidence rather than authority, and returns an admitted transition, a reasoned rejection, or an escalation. ACRs are durable obligations in the same substrate, recording guards, triggers, continuations, compensation hooks, scopes, and validators; on firing, an ACR may resume a continuation that constructs a repair proposal, which still passes ordinary admission, so memory is active but non-authoritative.
Boundaries and drivers. External events enter through an inbox deduplication boundary, and external effects leave through an outbox that stages provider calls with idempotency keys, so a domain commit never silently becomes an external effect and duplicate observations never create duplicate commits. Runtime drivers, including durable engines such as Temporal and Cadence [16], [17], orchestrate execution, timers, retries, and wakeups but remain non-authoritative: a driver may detect a ready ACR, call a provider, and submit a package, yet may not mutate domain truth, so the deployment substrate can change without changing ATP’s correctness. Table 3 states each component’s authority contract: what it owns, what it does not own, and the failure that results if its boundary is bypassed.
| Component | Owns | Does not own | Failure if bypassed |
|---|---|---|---|
| LLM / solver / agent | Proposal generation | Committed truth | Hallucinated commit |
| Admission gate | Authority boundary under \(\mathcal{C}\) | Proposal generation | Invalid commit |
| Durable history | Effective truth alone | Lost audit and replay | |
| Current effective truth | Full history | Stale or compensated state used | |
| Durable obligation | Mutation authority | Trigger corrupts truth | |
| Store substrate | Atomic and idempotency | Semantic validation | Duplicate or conflict anomaly |
3pt
The full proposal-and-obligation lifecycle (propose\(\rightarrow\)admit\(\rightarrow\)commit\(\rightarrow\)project, with an obligation’s create\(\rightarrow\)watch\(\rightarrow\)wake\(\rightarrow\)resume rejoining the same proposal-admission path) together with the six-point functional contract, the storage substrate (SQLite default and optional gated PostgreSQL), and the deployable service boundary, is specified in Appendices 11–16; Appendix 17 gives concrete JSON-level proposal examples, and Appendix 18 traces one transaction end to end. The invariant they enforce is the one already proved here: an ACR wakeup is not a commit; it only returns the system to ordinary proposal admission, so no component receives a privileged commit path because it is a solver, a learned guard, or an active commitment.
This paper evaluates ATP as a data-management system, not as an LLM planning method. The experiments validate the assumptions behind the theorems and the correctness of the implementation; they make no claim about learning, regret, or preemptive planning, which are future work. Planning and recovery workloads are derived from the REALM-Bench planning benchmark and instantiated here as the J1–J4 benchmark harness [18]. We reserve the name P1–P10 for broader readiness suites that are tracked as a separate artifact and are not certified in this draft. The evaluation is organized around five research questions. RQ1 asks whether the authority boundary holds across hazard classes and end-to-end; RQ2 compares against workflow/saga guardrails; RQ3 separates proposer usefulness from committed-state correctness; RQ4 audits artifact-level cost; and RQ5 examines reactive repair: how contained a bounded repair is, and whether recovery during recovery stays safe. RQ1–RQ4 are completed in the released Mnemosyne artifact. RQ5’s containment (edit radius) is reported on a companion job-shop scheduling harness that implements the same bounded-repair protocol, where blast radius is directly measurable and the claim is a systems property (bounded edit radius at equal feasibility), not planning quality; recovery during recovery is validated by construction (Proposition 3), with broader empirical study in progress.
The current implementation covers the falsification-oriented empirical spine of the released artifact: six theorem- and property-validation benchmarks, two end-to-end usefulness benchmarks, one mechanism-level workflow/saga comparator, and one infrastructure-cost audit. The six safety benchmarks check, respectively, that generated proposals stay non-authoritative until admitted (AuthorityBench); that concurrent proposals commit to a serial-equivalent history (SerialAdmissionBench); that a repair cannot discharge its own trigger by destroying evidence (EvidenceRepairBench); that commitment wakeups resume recovery without mutating domain truth (ObligationBench); that compensation and supersession preserve effective-state projection (CompensationProjectionBench); and that storage-level uniqueness, idempotency, and transactional projection reject duplicate or malformed attempts without corrupting StateView (StorageSubstrateBench). J1J4EndToEndBench drives planning and recovery cases through the boundary, ProposerQualityBench varies proposer quality while tracking usefulness and the invalid-commit invariant, and GuardrailComparatorBench compares ATP with a workflow/saga guardrail stack (schema validation, finite-state checks, idempotency keys, timers, local saga compensation, proposer self-checking) that lacks ATP-specific evidence, effective-state, obligation, compensation-closure, and conflict-scope admission.
These benchmarks are falsification-oriented systems tests rather than stochastic model-quality experiments. The deliberately permissive baselines expose each targeted failure mode by giving generated actions, repairs, wakeups, or storage writes more authority than ATP permits. The guardrail comparator (RQ2) then reduces the strawman-baseline concern by comparing ATP with a mechanism-level workflow/saga guardrail stack. A result is meaningful only when the comparator commits the specified violation, while ATP commits zero such violations and still admits valid operations. Figure 5 summarizes the safety evidence across every hazard class and the comparator; the cost audit (RQ4) is reported separately because it measures infrastructure overhead rather than violation suppression.
| Class | Benchmark | Baseline violations | ATP violations |
|---|---|---|---|
| Authority | AuthorityBench | invalid generated commits | invalid generated commits |
| Serial | SerialAdmissionBench | invalid commits and capacity underflow | invalid commits; serial-equivalent history |
| Evidence | EvidenceRepairBench | evidence-destroying repairs | evidence-destroying repairs |
| Obligation | ObligationBench | unauthorized wakeup mutations | unauthorized wakeup mutations |
| Projection | CompensationProjectionBench | mismatches | mismatches |
| Storage | StorageSubstrateBench | invalid storage commits and 1 mismatch | invalid commits and 0 mismatches |
| End-to-end | J1J4EndToEndBench | invalid commits and 3 mismatches | invalid commits, 0 mismatches, 4 completed cases |
| Proposer | ProposerQualityBench | invalid direct commits | invalid commits across six proposer classes |
| Comparator | GuardrailComparator | ATP-specific hazards missed by workflow/saga guardrails | invalid commits; 4 valid commits admitted |
4pt
Together, Table 4 and Figure 5 are the scoreboard: the permissive baselines expose the targeted failure mode, the comparator adds a mechanism-level workflow/saga guardrail comparison, and ATP suppresses the failure mode without turning into a reject-all system.
The first and primary question is whether the admission boundary actually holds: across every hazard class ATP is designed to stop, does committed state stay \(\mathcal{C}\)-valid even when generated proposals, repairs, wakeups, or storage writes are given more authority than ATP permits? We answer it with six falsification benchmarks, one per hazard class, each comparing ATP against deliberately permissive baselines. Figure 5 is the scoreboard: in every class the permissive baseline commits the targeted violation, while ATP commits zero such violations and still admits the valid operations. Per-class designs and full result tables are in Appendix 8; we summarize the six classes here.
AuthorityBench (Theorem 1) gives five proposer classes direct or self-validated commit authority: both baselines commit \(35\) invalid transitions, while ATP commits zero and still admits the five valid ones. SerialAdmissionBench (Theorem 2) runs \(80\) concurrent proposals over a shared capacity object; the unserialized and weak-lock baselines commit invalid proposals and underflow capacity, while ATP commits only the \(32\) valid proposals through a serialized boundary and yields a serial-equivalent history. ObligationBench (Theorem 4) fires active commitment records under four continuation sources; the baselines let wakeups mutate domain state directly (\(12\) and \(16\) unauthorized mutations), while ATP routes every wakeup through ordinary admission and commits zero. CompensationProjectionBench stresses compensation, supersession, and replay across seven dependency scenarios; the projection baselines admit invalid compensations and project ineffective history as current truth (seven StateView mismatches), while ATP keeps StateView the projection of effective committed records only, with zero mismatches. StorageSubstrateBench exercises duplicate, stale, and malformed storage attempts; the unconstrained log commits \(64\) invalid attempts and mis-projects the total, while the ATP storage path (SQLite default, optional gated PostgreSQL) rejects all \(64\) and preserves projection.
The distinctive case is EvidenceRepairBench (Theorem 3), which has no classical analogue. It constructs repairs that discharge their own trigger by deleting a failing test, suppressing an alert, compensating a diagnostic record, or hiding a violated guard. A naive repair agent and a workflow baseline without an evidence-preservation rule each commit \(20\) such evidence-destroying repairs; ATP commits zero, rejecting every repair that would succeed merely by removing the signal that justified it, while still admitting the eight genuinely valid repairs. This is the property that separates ATP from audit logging: the alarm cannot be silenced by the repair.
Across all six classes the pattern is identical: the permissive baseline commits the targeted violation, while ATP commits zero and still admits valid work. This is the operational content of the four theorems of Section 3, relative to the declared constraint set \(\mathcal{C}\). Because the boundary is enforced by construction, these results are best read as evidence that the implemented gate is wired and unbypassed on the tested hazards, not as a competitive comparison; the comparison against state-of-practice mechanisms is RQ2.
End-to-end. Beyond the unit hazards, real planning-and-recovery cases must run end-to-end through the same boundary. J1–J4 instantiate four REALM-Bench planning and disruption-recovery cases [18], each emitting valid and invalid packages (six valid, three invalid) along benchmark case \(\rightarrow\) proposal \(\rightarrow\) admission \(\rightarrow\) CTL \(\rightarrow\) StateView, measured against a direct-workflow baseline that commits every package. Table 5 shows the result: ATP admits the six valid packages, rejects the three invalid ones, completes all four cases with zero invalid commits and a consistent StateView, while the baseline commits all nine and leaves three StateView mismatches. These cases also exercise the reactive-repair path of §3.2: when a disruption fires, the affected obligation wakes and proposes a bounded local repair that re-enters admission, so end-to-end safety already covers reactive recovery; RQ5 then quantifies how contained that repair is.
| System | Pkgs. | Admit. | Reject | Invalid | Done | Mismatch |
|---|---|---|---|---|---|---|
| Direct workflow | 9 | 9 | 0 | 3 | 4 | 3 |
| ATP / | 9 | 6 | 3 | 0 | 4 | 0 |
3.2pt
Does ATP catch hazards that common workflow, saga, or guardrail mechanisms would miss? The safety benchmarks (RQ1) use falsification baselines to isolate each hazard class. RQ2 strengthens the comparison with GuardrailComparatorBench, which models mechanisms commonly available in durable workflow engines and guarded agent stacks: schema validation, finite-state checks, idempotency keys, retry and timer execution, local saga compensation, and proposer self-checking. This comparator is not a product benchmark of Temporal, Cadence, Argo, LangGraph, or any specific framework; it is a semantic baseline for mechanisms those systems commonly provide and hazards they typically leave to application-level logic. Consequently, RQ2 should be read as a mechanism-level baseline rather than a third-party product comparison; adding a live Temporal, LangGraph, or saga-library baseline is future empirical work.
The benchmark contains fourteen cases: four valid operations, four classical guardrail hazards, and six ATP-specific hazards. The classical hazards are a malformed proposal, a finite-state violation, a duplicate operation key, and a failed proposer self-check. The ATP-specific hazards are a stale-world plan, an evidence-destroying repair, a direct obligation mutation, an orphaning compensation, an ineffective-record projection error, and a conflict-scope violation. The workflow/saga guardrail stack rejects the classical hazards but does not implement ATP-specific admission over effective StateView, evidence preservation, obligation containment, dependency-closed compensation, or conflict-scoped generative admission.
| System | Cases | Accepted | Rejected | Invalid | Classical rej. | Missed ATP hazards |
|---|---|---|---|---|---|---|
| Raw generated write | 14 | 14 | 0 | 10 | 0 | 6 |
| Workflow/saga guardrails | 14 | 10 | 4 | 6 | 4 | 6 |
| ATP / | 14 | 4 | 10 | 0 | 4 | 0 |
4.5pt
Table 6 shows the completed mechanism-level comparator run. The raw generated write baseline commits all fourteen cases, including ten invalid cases. The workflow/saga guardrail stack improves on that baseline by rejecting all four classical guardrail hazards, but it still commits the six ATP-specific hazards. ATP admits the four valid cases, rejects all ten invalid cases, commits zero invalid cases, and misses zero ATP-specific hazards. This is the artifact-level answer to the input-validation objection: ATP is not merely a predicate checker before commit. It makes effective state, retained evidence, active obligations, compensation closure, and generative conflict scopes part of the transaction authority boundary. Appendix 9 extends this comparison to a production transaction-processing substrate, auditing which layer owns each enforcement responsibility.
How does proposer competence affect utility while ATP holds committed-state correctness fixed? We evaluate this using ProposerQualityBench. The benchmark emits 60 proposals from six proposer classes: no-intelligence, random, rule-based, solver-like, LLM-like, and adversarial proposers. Proposal quality controls how many attempts are valid under \(\mathcal{C}\) and how much utility an admitted attempt contributes. We compare ATP with a direct-commit baseline that commits every attempt.
| System | Attempts | Commit | Reject | Invalid | Utility |
|---|---|---|---|---|---|
| Direct commit | 60 | 60 | 0 | 37 | 131 |
| ATP / | 60 | 23 | 37 | 0 | 131 |
4pt
Table 7 shows the safety invariant. The direct-commit baseline commits all 60 attempts, including 37 invalid attempts. ATP admits 23 valid attempts, rejects 37 invalid attempts, and commits zero invalid attempts. The total valid utility is the same because invalid proposals carry zero utility; therefore the usefulness signal appears in the proposer-level acceptance and utility profile, not in the unsafe direct-commit row. The proposer classes in this artifact are deterministic adapters rather than live calls to a frontier LLM, chosen so the safety result is reproducible; the failure modes they inject are exactly those that live models such as Claude 3.7 and GPT-4o produce in multi-agent planning [8]. Because admission is evaluated against \(\mathcal{C}\) and the effective StateView, the authority-boundary claim is independent of how a proposal is generated: a live-model proposer changes which proposals are useful, not whether an invalid one can commit.
| Proposer | Attempts | Admitted | Rejected | Accept. rate | Utility | First admission |
|---|---|---|---|---|---|---|
| No intelligence | 10 | 1 | 9 | 0.10 | 1 | 8 |
| Random | 10 | 2 | 8 | 0.20 | 4 | 5 |
| Rule-based | 10 | 5 | 5 | 0.50 | 25 | 2 |
| LLM-like | 10 | 6 | 4 | 0.60 | 36 | 2 |
| Solver-like | 10 | 8 | 2 | 0.80 | 64 | 1 |
| Adversarial | 10 | 1 | 9 | 0.10 | 1 | 10 |
4.5pt
The per-proposer profile (Figure 6 and Table 8) shows that proposer quality affects usefulness and admission efficiency. The solver-like proposer has the highest acceptance rate and admitted utility; the no-intelligence and adversarial proposers are mostly rejected. Yet every proposer class has zero invalid commits under ATP. This supports the paper’s central separation: intelligence governs usefulness, while the transaction layer governs committed-state correctness relative to \(\mathcal{C}\). This is not a learning experiment; it makes no cross-episode improvement, regret, or preemptive-planning claim.
RQ2 establishes that ATP rejects the ATP-specific hazards in the mechanism-level workflow/saga comparator; RQ4 audits the cost visible in the implemented ATP infrastructure paths. We do not time the RQ2 oracle comparator as though it were the ATP runtime, and we do not claim a production load test. Instead, we run a repository infrastructure workload covering kernel admission, runtime admission, commit-boundary enforcement, effective-state projection, validation, compensation, active recovery, and Temporal activity-boundary validation. Each repeat executes 20 ATP infrastructure paths, and we measure 30 repeats at worker counts \(1\), \(4\), and \(8\). The workflow/saga semantic comparator is still executed to preserve the RQ2 baseline, but its single semantic test is not treated as a throughput competitor for the 20-path ATP infrastructure workload.
| Workers | Pass | |||||||
| ms | ||||||||
| ms | ||||||||
| ms | ||||||||
| ms | ||||||||
| ms | ||||||||
| overhead | ||||||||
| units/min | ||||||||
| 1 | 30/30 | 5192.7 / 5266.5 | 0.040 / 17.235 | 2.574 / 8.620 | 0.023 / 1.731 | 0.001 / 0.057 | 5.98% | 230.56 |
| 4 | 30/30 | 6356.6 / 6740.5 | 0.051 / 22.877 | 2.997 / 9.294 | 0.025 / 2.024 | 0.001 / 0.067 | 5.63% | 709.10 |
| 8 | 30/30 | 11929.3 / 12172.0 | 0.100 / 36.731 | 5.120 / 12.979 | 0.030 / 3.601 | 0.001 / 0.094 | 4.96% | 804.43 |
3.8pt
Table 9 reports the real-infrastructure result. All ATP infrastructure runs pass at all three worker counts. At one worker, the 20-path workload requires \(5192.7/5266.5\) ms end-to-end \(p_{50}/p_{95}\), with admission latency \(0.040/17.235\) ms and commit latency \(2.574/8.620\) ms. At four workers, measured throughput rises to \(709.10\) infrastructure units per minute, with projection plus validation accounting for \(5.63\%\) of end-to-end runtime. At eight workers, measured throughput reaches \(804.43\) infrastructure units per minute; admission and commit tail latency increase, as expected under concurrent pytest execution, but projection plus validation remains bounded at \(4.96\%\) of end-to-end runtime. Thus ATP safety is not free, but the artifact exposes where its implemented infrastructure cost appears. Together, RQ2 and RQ4 report the safety result and the local artifact overhead audit; they do not establish production-scale throughput or a product-level comparison against a deployed workflow engine.
RQ1 shows reactive repair stays safe end-to-end; here we ask how contained it is, then whether recovery during recovery stays safe. The Bounded Reactive Repair guarantee (Proposition 1) promises a repair confined to a bounded edit radius, and containment is only meaningful on a workload where a single disruption can ripple across many dependent operations. We therefore measure it on the job-shop instances of REALM-Bench [18] using a companion scheduling harness (MAPLE) that implements the same bounded-repair protocol as Mnemosyne’s reactive-repair path. After computing a feasible baseline schedule, we inject a single machine breakdown and recover it two ways under the same disruption and seeds: LCRP, the bounded localized repair, edits only the affected region under the displacement budget \(\delta_{\max}\) and iteration cap \(K\); global recompute re-solves the instance from the disruption point with no localization. Both must end feasible. Because raw makespan alone rewards a global reset that is physically expensive on a shop floor, we score repair under a cost-aware objective that also charges for disturbance, \[J = \Delta C_{\max} + \underbrace{\lambda_o N_{\mathrm{ops}} + \lambda_j N_{\mathrm{jobs}} + \lambda_w N_{\mathrm{wip}} + \lambda_s N_{\mathrm{setup}}}_{H},\] counting edited operations, touched jobs, work-in-progress moves, and machine-sequence (setup) changes, with \(\lambda_o{=}1,\;\lambda_j{=}5,\;\lambda_w{=}1,\;\lambda_s{=}10\) as a sensitivity model that weights job and setup disturbance above a single operation shift.
| Method | \(\Delta C_{\max}\) | Ops | Jobs | WIP | Setup | \(H\) | \(J\) |
|---|---|---|---|---|---|---|---|
| LCRP (mean) | \(9.50\) | \(7.17\) | \(1.83\) | \(7.17\) | \(2.50\) | \(48.50\) | \(\mathbf{58.00}\) |
| LCRP (median) | \(0.00\) | \(3.00\) | \(1.50\) | \(3.00\) | \(3.50\) | \(53.50\) | \(\mathbf{53.50}\) |
| Recompute (mean) | \(-606.17\) | \(59.83\) | \(8.00\) | \(59.83\) | \(60.83\) | \(768.00\) | \(161.83\) |
| Recompute (median) | \(-654.00\) | \(71.00\) | \(8.00\) | \(71.00\) | \(79.00\) | \(974.50\) | \(125.00\) |
3.2pt
Table 10 reports medians and means over six instances; both policies recover feasibility (\(6/6\)). The contrast is the containment story behind Proposition 1. Global recompute wins on raw makespan (it is free to rebuild unfinished work, so \(\Delta C_{\max}\) is large and negative), but it disturbs the whole shop to do so, editing \(59.8\) operations on average against LCRP’s \(7.2\) (\(12.0\%\) as many, and about \(4\%\) at the median), touching all \(8\) jobs against LCRP’s \(1.8\), and moving \(59.8\) in-progress operations against LCRP’s \(7.2\). LCRP holds the median makespan exactly (\(\Delta C_{\max}=0\)) while keeping edit radius and WIP disturbance an order of magnitude smaller, and its cost-aware objective \(J\) is lower in both the mean (\(58.0\) vs.\(161.8\)) and the median (\(53.5\) vs.\(125.0\)). This is the empirical face of bounded reactive repair: a disruption is contained to its neighborhood instead of triggering a global reset, at equal feasibility and equal-or-better makespan where it matters. When the extra makespan headroom is genuinely worth the disturbance, the runtime can still escalate to a global recompute; the point is that ATP does not pay that cost by default.
Recovery during recovery. The hardest reactive case is a failure that arrives while a repair is still in flight, and we ask whether nesting introduces any new way to corrupt committed truth. By construction it cannot. ATP keeps no recovery stack: after the most recent restore point \(S_k\) it maintains a pending-observation set \(D_k\) of unabsorbed disruptions and validates every repair candidate against \(S_k\), \(\mathcal{C}\), and all of \(D_k\), so a failure arriving mid-repair is simply appended to \(D_k\) and recovery restarts single-shot from \(S_k\). Proposition 3 states the consequence: recursive recovery is exactly sequential recovery over the accumulated observations, every committed transition stays \(\mathcal{C}\)-feasible at any nesting depth and failure timing, and a sequence of \(F\) failures terminates in at most \(FK\) rounds before success or escalation. Empirically, the only way a mid-repair failure could commit invalid state is an in-flight repair that mutates outside admission, and that path is already covered by RQ1: every repair, nested or not, is an ordinary proposal subject to AuthorityBench and ObligationBench, so a wrong or interrupted repair is rejected exactly like any other proposal. We therefore report recovery-during-recovery as validated by construction and by the existing safety suite, and flag a dedicated stress harness (injecting failures at controlled depths and measuring realized round counts against the \(FK\) bound and the escalation frequency) as in-progress empirical work.
The executable artifact is a tagged GitHub snapshot [19]: https://github.com/eyuchang/Mnemosyne/tree/arxiv-atp-rq1-rq9b-r8-v2. The default reproducibility path is PostgreSQL-free and runs the safety experiment files with
pytest (expected result 9 passed). Full validation commands, the RQ4 infrastructure-cost benchmark, and the optional environment-gated PostgreSQL path (MNEMOSYNE_POSTGRES_DATABASE_URL) are described in the artifact
README.
Transactions, recovery, and input validation. A classical transaction provides the ACID guarantees (atomicity, consistency, isolation, and durability) over a submitted unit of work, together with concurrency control, logging, and recovery, with ARIES the canonical write-ahead-logging design [1]–[4]. ATP is complementary: ACID governs how an admitted unit of work commits, whereas ATP governs whether an untrusted generated action should be admitted as a transaction at all. Schema checks and integrity constraints reject malformed commands from a trusted application, whereas ATP distrusts the generator itself and adds the effective-state witness, evidence preservation, obligation containment, and serial-equivalent generative concurrency, none of which a per-command predicate expresses.
Compensation and event sourcing. Sagas decompose long-running transactions into compensatable subtransactions [5], and event sourcing and CQRS separate an append-only history from read-side projections [20], [21]. Mnemosyne adopts both separations but adds constraints they do not: compensation must be dependency-closed over effective state and must itself pass admission, and StateView is the effective-state witness the gate reads rather than a mere read model, because ATP targets generated proposals that may be hallucinated, stale, or adversarial rather than commands already granted authority.
Active databases and provenance. Active database systems attach event-condition-action rules to database events [22]; ACRs are deliberately weaker, waking a continuation and constructing a proposal but unable to mutate committed truth, which is the basis of obligation containment. Provenance and scientific-workflow systems record lineage for audit [6], [23]–[25]; ATP uses provenance-like evidence for a stronger admission condition, since a repair cannot discharge its own trigger by destroying the evidence that justified it, making evidence part of the safety contract rather than only explanatory metadata.
Workflow engines and LLM agents. Workflow engines provide retries, timers, task graphs, and durable execution [7], [16], [17], [26], [27], and LLM-agent research improves generation, tool use, reflection, memory, and multi-agent simulation [9]–[14], [28]. ATP treats both as proposers or drivers: engines may schedule, retry, and wake, and an agent’s reasoning trace, tool call, or memory retrieval is evidence, but neither owns committed truth, which changes only through admission.
Relationship to SagaLLM. SagaLLM [8] and ATP pursue trustworthy multi-agent LLM execution from opposite ends. SagaLLM brings transactional discipline to the agent, wrapping multi-agent planning in the saga pattern with persistent memory, validation agents, and compensating transactions. ATP works from the data-management end: a generated action holds no authority until a deterministic gate admits it, and committed-state correctness is provably independent of the proposing layer (Theorems 1–4). The two are complementary: one disciplines the proposer, the other lets the transaction layer accept untrusted proposers under one admission boundary. On the failures SagaLLM documents, the contrast is concrete: a canceled flight that leaves a hotel active is a dependency-closed compensation the gate refuses if it would orphan an effective dependent; a replan that drops a satisfied constraint is a stale-world rejection against the effective-state witness; and a repair that hides the violated constraint is blocked by evidence-preserving repair. Beyond this duality, ATP contributes the effective-state projection, the safety theorems at the transaction layer, and a complete runtime; preventive or self-improving recovery is left to future work.
Agentic workflows need transaction systems that do not trust generated actions: an LLM, solver, or agent may propose, but a generated proposal is not committed truth. Our central claim is authority separation: relative to a declared executable constraint set \(\mathcal{C}\) and a gate-closure assumption, proposer behavior affects proposal usefulness, not the ability to append committed truth. We formalize four safety properties of this boundary (authority separation, serial-equivalent generative admission, evidence-preserving repair, and obligation containment), add reactive local repair whose proposals re-enter the same gate, and implement them in Mnemosyne. The reproducible artifact exercises nine safety tests, a cost audit, and a disruption-containment study in which bounded local repair edits an order of magnitude fewer operations than global recompute: ATP rejects the specified violations while still admitting valid work, at modest overhead. Production deployment, a live-LLM quality study, a third-party workflow benchmark, and cross-episode learning, regret, and preemptive planning remain future work [29], [30]. ACID protects admitted transactions; ATP protects admission into committed truth.
ATP’s guarantees are relative to \(\mathcal{C}\): hazards outside \(\mathcal{C}\) are undetected, and writing a faithful \(\mathcal{C}\) is itself work. RQ2’s guardrail comparator is implemented in the artifact, not benchmarked against a deployed workflow engine; the proposer-quality experiments use deterministic adapters that replay live-model failure modes, so results are reproducible while authority separation holds for any proposer. The artifact does not statically verify that no path bypasses admission, and RQ4’s overhead is a local audit, not a production load test.
Distributed execution. The evaluation runs against a single durable store, which is the linearization point for committed truth: each tenant and conflict scope has one authoritative CTL, so the authority boundary is well defined within a store even when proposers, solvers, and orchestrators are distributed. External orchestration engines such as Temporal drive execution but never hold commit authority (Appendix 16); under network partitions or worker-node failure they re-drive activities at least once, and the operation idempotency key together with the outbox deduplication boundary make replays converge to a single committed transition and a single external effect rather than duplicating either. What we do not yet evaluate is multi-region or sharded operation, where committed truth would span several stores: maintaining serial-equivalent admission and outbox idempotency across asynchronous cross-region updates would require partitioning conflict scopes across stores or a shared consensus log, which, with production-scale load testing, we leave to future work.
This appendix gives the full per-class result tables for the six safety hazard classes summarized in RQ1 (Section 5.2) and visualized in Figure 5; each compares Mnemosyne against the deliberately permissive baseline(s) for that class. Table 11 reports AuthorityBench: a raw-append baseline and a self-validation baseline each commit \(35\) invalid generated transitions, while ATP commits zero and still admits the five valid proposals. Table 12 reports SerialAdmissionBench: under \(80\) concurrent proposals over a shared capacity object, the unserialized and weak-lock baselines commit invalid proposals and underflow capacity, while ATP commits only the \(32\) valid proposals through a serialized boundary and yields a serial-equivalent history. Table 13 reports EvidenceRepairBench: the naive-repair and no-rule workflow baselines each commit \(20\) evidence-destroying repairs, while ATP commits zero and still admits the eight valid repairs. Table 14 reports ObligationBench: the trigger-direct and timer-direct baselines commit \(12\) and \(16\) unauthorized wakeup mutations, while ATP routes every wakeup through ordinary admission and commits zero. Table 15 reports CompensationProjectionBench: the projection baselines admit five invalid compensations and produce seven StateView mismatches, while ATP produces zero and still commits the two valid compensations. Table 16 reports StorageSubstrateBench: the unconstrained log commits \(64\) invalid storage attempts and one StateView mismatch, while the ATP storage path rejects all \(64\) with zero mismatches.
4pt
| System | Committed | Rejected | Invalid | Underflow | SEA |
|---|---|---|---|---|---|
| Unserial.writes | 80 | 0 | 48 | 1 | no |
| Weak lock | 68 | 12 | 36 | 1 | no |
| ATP / | 32 | 48 | 0 | 0 | yes |
3.5pt
| System | |||
| destroying | |||
| evid.-dest. | |||
| repairs | |||
| Naive repair | 20 | 0 | 4 |
| Workflow w/o rule | 20 | 0 | 8 |
| ATP / | 0 | 20 | 8 |
4pt
| System | ||||
| mutations | ||||
| packages | Admitted | Rejected | ||
| Trigger direct | 12 | 0 | 0 | 0 |
| Timer direct write | 16 | 0 | 0 | 0 |
| ATP / | 0 | 24 | 4 | 20 |
4pt
| System | |||||
| admitted | |||||
| deps. | |||||
| chains | |||||
| mismatches | Valid | ||||
| Unsafe projection baselines | 5 | 2 | 5 | 7 | 2 |
| ATP / | 0 | 0 | 0 | 0 | 2 |
| System | Subs. | Committed | Rejected | Invalid | Mismatch |
|---|---|---|---|---|---|
| Unconstr.log | mem | 128 | 0 | 64 | 1 |
| ATP storage | SQLite | 64 | 64 | 0 | 0 |
3.5pt
This appendix extends the RQ2 comparator (Table 6) with a third layer: a production transaction-processing (TP) substrate such as PostgreSQL. ATP is not a replacement for production TP. PostgreSQL-style systems provide the durable substrate, with atomicity, isolation, durability, uniqueness, foreign keys, checks, triggers, and serializable execution. ATP is complementary: it governs whether a generated proposal should receive transaction authority before it becomes an ordinary transaction. The distinction matters because several agentic hazards are not storage-level violations unless application developers manually encode ATP-specific semantics.
Table 17 is an analytical coverage audit, not a throughput benchmark: each entry is a by-design assessment of which layer naturally owns the corresponding check. “App-only” means the TP substrate can enforce the property only if the application explicitly encodes the ATP-specific rule; “partial” means the mechanism catches one implementation of the hazard but not its general ATP form.
| Hazard | PostgreSQL-style TP | Workflow/saga | ATP/ |
|---|---|---|---|
| Primary-key / unique duplicate | caught | caught | caught |
| Missing foreign-key dependency | caught | caught | caught |
| Finite-state invalid transition | app-only | caught | caught |
| Stale-world proposal | missed | missed | caught |
| Orphaning compensation over effective state | app-only | partial | caught |
| Evidence-destroying repair | missed | missed | caught |
| direct domain mutation | missed | missed | caught |
| Generative conflict-scope collision | app-only | partial | caught |
| Duplicate side-effect intent | partial | partial | caught (staged, then rejected) |
4pt
The audit identifies a layer boundary rather than a weakness in PostgreSQL or other TP systems. Production TP systems are strong commit substrates, but they do not by themselves define which generated proposal should be granted transaction authority. ATP adds StateView-based admission, retained-evidence checks, dependency-closed compensation, non-authoritative ACR wakeups, and generative conflict scopes before a proposal becomes a transaction; once a proposal is admitted, ATP relies on a production TP substrate for atomic commit, durability, uniqueness, and isolation.
An executable version of this audit (ProductionTPComparatorBench) is future work. It would run the same cases through (i) a PostgreSQL-style TP substrate with keys, foreign keys, checks, triggers, and serializable transactions; (ii) a workflow/saga guardrail layer; and (iii) ATP/Mnemosyne over the same durable store. The expected systems claim is not that production TP is weak, but that ATP supplies the missing authority semantics for generated proposals.
R8 implements a deployable Mnemosyne service boundary with health, proposal-submission, StateView, and metrics endpoints. The purpose of the R8 smoke-load audit is not to claim production-scale throughput, but to check that the deployment service preserves ATP’s authority-separation rule under concurrent HTTP proposal submission: clients may submit proposals, but invalid proposals and explicit bypass attempts must not become committed truth.
Table 18 reports two consecutive local runs of the same deployment load script. Each worker setting submits 200 HTTP proposal requests. The workload contains 120 valid proposals and 80 invalid or bypass proposals. In both runs, every worker setting admits exactly 120 proposals, rejects exactly 80 proposals, and produces zero invalid commits. Thus the safety result is stable across repeated local runs.
The throughput measurements are intentionally treated as diagnostic rather than production evidence. The 16-worker setting shows substantial run-to-run throughput variability despite similar \(p_{50}/p_{95}\) request latency, indicating sensitivity to local client scheduling, socket backlog, and short-run wall-clock effects. We therefore use R8 only as deployment-boundary evidence: concurrent HTTP submission preserves the ATP admission boundary, while production load testing over durable PostgreSQL storage, Kubernetes workers, networked workflow services, and pool saturation remains future work.
| Run | Workers | ||||
| Rejected | |||||
| commits | |||||
| \(p_{50}/p_{95}\) ms | |||||
| /min | |||||
| 1 | 1 | 120 / 80 | 0 | 0.281 / 0.381 | 119,717.96 |
| 1 | 4 | 120 / 80 | 0 | 0.871 / 1.515 | 243,307.15 |
| 1 | 8 | 120 / 80 | 0 | 1.744 / 2.892 | 245,481.60 |
| 1 | 16 | 120 / 80 | 0 | 3.398 / 6.226 | 245,801.74 |
| 2 | 1 | 120 / 80 | 0 | 0.250 / 0.380 | 173,746.85 |
| 2 | 4 | 120 / 80 | 0 | 0.822 / 1.307 | 271,099.39 |
| 2 | 8 | 120 / 80 | 0 | 1.743 / 3.136 | 257,312.64 |
| 2 | 16 | 120 / 80 | 0 | 3.047 / 5.396 | 11,784.96 |
4pt
This appendix specifies the runtime data structures that realize the architecture of Section 4 at the level of record fields. The intent is to make the authority boundary inspectable: every object below is either committed truth, a projection of committed truth, a durable obligation, or an external boundary, and no proposer-side object can become truth except by passing admission.
Mnemosyne keeps four kinds of object apart, and logs only the last. An event is an immutable observed fact (for example, a provider confirmation or a disruption notice). A candidate is a proposed finite-state transition that an admitted commit may or may not produce. A constraint evaluation is a predicate that the admission validator checks. A committed transition is the durable record of an admitted transition: a CTL record. Events, constraints, and finite-state structure live outside the CTL; only an admitted, committed transition is a CTL record. A vetoed or rejected proposal leaves a queryable rejection or escalation entry, never a committed transition.
A CTL record is the unit of committed truth. Its identity and ordering fields are fixed; its recovery metadata and domain evidence are carried in two typed side-channels, the metadata map \(M\) and the typed extension \(X\), so that recovery and provenance fields can evolve without changing a transition’s identity. Table 19 lists the fields.
| Field | Symbol | Role |
|---|---|---|
| rid | \(r\) | Unique record identifier (primary key); the idempotency key when client-supplied. |
| op_id | Optional client idempotency key, used when rid is server-assigned. | |
| tx_group_id | Saga group: the records that compensate together (indexed, not unique). | |
| workflow_id | Session or instance identity (for example, a ride or trip). | |
| binding_id | Role-binding identity (an abstract role bound to entities). | |
| eid | Individual entity whose state changed. | |
| fsm | Finite-state machine to which the edge belongs. | |
| version | \(v\) | Monotonic version per (eid, fsm); one ordered history per entity. |
| state_before | \(s^{-}\) | Pre-state; the reversal target for compensation. |
| state_after | \(s^{+}\) | Post-state of the committed transition. |
| action_type | \(a\) | Named action (for example, pickup, reroute, compensate); disambiguates self-loops. |
| triggers | \(U\) | Proximate causes (event identifiers in the recovery-event log). |
| dependencies | \(D\) | Required preconditions: rids that must be committed and still effective. |
| metadata | \(M\) | Verdict, compensation policy, restore flag, status, supersession or compensation links, provenance. |
| extension | \(X\) | Schema-validated domain and causal-audit evidence plus temporal-spatial attributes. |
| schema_id / schema_version |
Schema identity for safe replay across schema evolution. | |
| timestamp | \(t\) | Commit time; log_position (below) provides ordering. |
The storage layer enforces two uniqueness constraints that carry the safety load: rid is the primary key, so a retried commit cannot double-apply, and (eid, fsm, version) is unique, so each entity has exactly one ordered
history. The saga group tx_group_id is indexed but deliberately not unique, so one saga spans many records. The metadata map \(M\) carries the recovery and audit fields, including status
(one of active, compensated, or superseded), restore (whether the record is a clean restore point), and the compensates or supersedes links naming the rids a record
reverses or replaces. The typed extension \(X\) carries domain attributes (location, ETA, deadline, route, assignment) and causal-audit evidence; \(X\) is schema-validated rather than
free-form.
Mnemosyne keeps three identities distinct rather than collapsing them into one: the individual entity eid, the role-binding binding_id, and the session or instance workflow_id.
Conflating them breaks repeated participation (one entity acting twice), multi-party instances (one session with several participants), and reassignment (a resource re-bound to a new role). Independently of the wall-clock timestamp, the store
assigns a monotonic log_position that provides total append ordering for replay and recovery; replay can proceed by per-entity version or by global log_position. The recovery-event log records the fine-grained events
of repair and obligation execution (packages created, idempotency keys observed, sequence positions assigned, conflicts detected, outcomes accepted or rejected). In the PostgreSQL substrate, tenant-scoped uniqueness over event identifiers, idempotency
keys, and recovery sequence positions provides the concrete concurrent-idempotency boundary.
StateView exposes current operational truth. It is reconstructed from the CTL by replaying only effective records: records that have not been compensated, superseded, or
invalidated and whose dependency chains remain effective. Current state is derived, never stored. Beyond the bare finite-state value, a StateView for an (eid, fsm) pair folds the \(X\) attribute deltas forward (location, ETA, deadline, route, assignment) and carries the set of effective records that support it, so that admission and the reactive loop read where each entity currently is, not a static plan.
The projection is materialized per (eid, fsm) and is a cache: replay from the CTL remains the source of truth. A cross-entity correction must re-project every affected entity, because refreshing only
the issuing entity could leave a now-ineffective record lingering as current truth elsewhere.
An ACR is a durable workflow obligation stored in the same committed substrate as ordinary transitions. It is created by an admitted step, and creating it is itself an admitted transition. An ACR records an assumption or commitment together with the fields in Table 20. When its trigger fires, the runtime may resume the continuation to construct a repair proposal, but the ACR itself cannot mutate committed state: its wakeup re-enters the ordinary admission gate. ACR status moves through values such as live, fired, proposed, admitted, rejected, compensated, expired, and discharged.
| Field | Role |
|---|---|
| id | Identifier of the obligation record. |
| txn | Admitted transition that created the obligation. |
| commitment | The recorded commitment or assumption. |
| scope | Bounded dependency scope the resumed proposal may touch. |
| trigger | Condition whose firing makes the obligation ready. |
| continuation | Pointer to the continuation resumed on firing. |
| guard | Predicate gating whether a fired trigger may resume. |
| validator | Admission validator applied to the resulting proposal. |
| compensation | Compensation handler for the obligation. |
| expiry | Expiry or discharge condition. |
| failure-key | Failure signature for cross-episode traceability. |
| status | Lifecycle state (live \(\ldots\) discharged). |
External events enter through an inbox deduplication boundary; external side effects leave through an outbox boundary that stages provider calls with idempotency keys. The outbox is an intent log: provider execution remains outside committed truth until its result is observed and admitted as a subsequent transition. This prevents a domain commit from silently becoming an external effect, and prevents a duplicate external observation from creating a duplicate commit. Both boundaries sit on the commit side of the authority line but neither owns truth: the inbox only deduplicates inbound observations, and the outbox only stages outbound intent.
This appendix gives the deterministic admission contract under \(\mathcal{C}\) and the commit, logging, and replay sequence at the mechanism level. The contract is independent of proposer identity: an LLM, solver, runtime driver, benchmark adapter, or ACR wakeup may change the proposal package, but only the ordered admission steps can create committed truth.
Admission is the deterministic pre-commit procedure that decides whether a proposal may become a committed transition. It reads current effective state from StateView and retained evidence, never speculative or rejected proposal history, and applies the ordered checks below. Steps 1–8 are the executable contract used by the implementation and the RQ1–RQ5 experiments.
Parse the proposal package and reject malformed packages before commit processing begins.
Check tenant, entity, idempotency key, operation key, and declared conflict scope.
Read current StateView and retained evidence; do not validate against speculative or rejected proposal history.
Apply the deterministic constraints in \(\mathcal{C}\): finite-state rules, policy rules, stale-world checks, dependency closure, and compensation safety.
If the proposal is a repair, require that the underlying failure is resolved under \(\mathcal{C}\), or that the trigger evidence remains effective and queryable after the repair.
If the proposal is an ACR wakeup, require a proposal package and forbid direct mutation of the CTL or StateView.
Serialize or reject overlapping incompatible conflict scopes; admit only if the resulting transition is valid over current effective state.
Atomically append the admitted transition and recovery metadata to durable storage and update StateView; otherwise record a queryable rejection reason.
A solver certificate or LLM rationale is treated as evidence supplied to these checks, not as authority. The validator reads log-grounded effective state only: a finite-state edge is checked for legality with action_type disambiguating
self-loops; each dependency is required to be committed and still effective (existence alone is insufficient); and application constraints are keyed by (fsm, action_type) so that, for example, a pickup may be required to follow the
driver’s arrival as read from the driver’s effective state. The gate returns an admitted transition, a rejected proposal with structured reasons, or an escalation request for a wider scope.
An admitted proposal commits through a single atomic step that also produces the projection update. The commit batch is the unit of multi-entity atomicity. In one transaction it: locks the affected entities in sorted key order, verifies the expected
monotonic version for each (eid, fsm), re-checks that every dependency in \(D\) is committed and effective, appends all CTL rows, updates the synchronous StateView projection for every affected key, and stages any outbox intents. Three guarantees hold exactly at the write: idempotency (the rid primary key, with op_id as the client key when rid
is server-assigned), ordering (the monotonic per-entity version), and dependency effectiveness (\(D\) committed and not since compensated or superseded). Only after this step does a row exist; a rejected
proposal yields a queryable rejection, not a row.
Because durable runtime drivers execute steps at least once, the commit path must be idempotent under retry. The rid primary key (or op_id when rid is server-assigned) makes a retried commit return the existing
committed record rather than duplicate domain truth. This is why the idempotency key is part of the proposal package and is checked at Step 2 before any state mutation: a retried submission after a crash or timeout resolves to the same committed
transition, so the commit batch is safe to re-drive.
The CTL is the source of committed truth, and current state is recovered by replay rather than read from a stored cursor. Replay of an (eid, fsm) history proceeds in order and self-checks consistency: each
record’s state_before must equal the prior record’s state_after, and a mismatch is a replay error that signals log corruption. The bare replay yields the finite-state value; the full reconstruction is the StateView that additionally folds the \(X\) attribute deltas forward and retains the effective records supporting the state. Because compensation and supersession are themselves later admitted
transitions, effective-state replay reproduces current truth without deleting history or moving a cursor: the effective index marks which records still count, and the projection excludes the rest.
This appendix specifies recovery at the mechanism level. The central property is that recovery does not bypass admission: a disruption, a fired obligation, or a crash-recovery action produces a proposal that passes through the same gate as any generated action. Recovery decisions are made in the proposal and policy layers; the substrate supplies only the mechanism and the invariants.
When an ACR trigger fires, the runtime may resume its continuation and construct a repair proposal, but the wakeup carries no write authority. The resumed proposal declares the ACR’s
bounded dependency scope and re-enters the ordinary admission gate, where Step 6 requires that an ACR wakeup supply a proposal package and forbids direct mutation of the CTL or
StateView. A proposal generated by an ACR may touch only the dependency scope recorded by that ACR, unless a wider scope is explicitly admitted as an
escalation. Thus a fired obligation can only return the system to the proposal-admission path; it cannot install committed truth on its own. Rejected or compensated ACR proposals with matching failure signatures remain
queryable as historical evidence for future ranking or guard strengthening, which is how memory becomes active without becoming authoritative.
The class of an action against the full governed-invariant set, re-checked at commit time, selects the recovery move; the substrate supplies the mechanism and the policy layer supplies the timing. Table 21 states the three moves. A restore (return to a clean checkpoint) is the bulk form of an undo: it resets state but, unlike an exact undo, does not reverse external effects, so it is paired with compensation.
| Move | When | Mechanism |
|---|---|---|
| undo | An exact inverse exists (reversible). | Apply the inverse; the entity returns to \(s^{-}\). |
| compensate | No inverse, but governed invariants are restorable within a validity window (compensable). | Append a compensating transition; history is preserved. |
| escalate | Neither holds, or local repair cannot contract (irreversible). | Veto, or hand to a human task; no committed transition is written. |
Compensation is represented as a new admitted transition, never as physical deletion, and the whole saga group identified by tx_group_id unwinds together. The group is compensated in reverse topological order over the group’s dependency
subgraph, not merely reverse insertion order, so a leg is never compensated before the legs that depend on it. Admission enforces dependency-closed compensation through the recovery invariants: a compensation is rejected if it would leave an effective
record depending on an ineffective record (no orphaned effective dependents), and a compensation is rejected if it would break the effective chain for an entity (effective-chain preservation). Supersession is the related operation by which a later admitted
transition replaces an earlier one through the supersedes link in \(M\); like compensation, it changes effectiveness without erasing history.
Compensation and supersession never delete history; they only change which records are effective. Because the projection is materialized per (eid, fsm), a correction that touches several entities must drop the corrected record from current
truth on every entity it touches, not only the entity that issued the correction. Refreshing only the issuing entity would let a now-ineffective record linger as current truth elsewhere. Replay from the CTL
therefore remains the source of truth, and the per-entity projection is rebuilt for all affected keys after a correction.
A memory-initiated repair must not discharge its own trigger by deleting, overwriting, compensating, or obscuring the evidence that justified it. Admission permits a repair to alter trigger evidence only if it verifies, under the retained evidence and validator rules, that the proposed repair addresses the triggering condition rather than merely suppressing its observable signal (Step 5). Concretely: let a repair proposal be triggered by evidence \(E\) of a failure condition \(F\). Admission admits the repair only if either \(F\) is resolved under \(\mathcal{C}\), or \(E\) remains effective and queryable after the repair. As a result, no admitted repair can clear its own trigger by destroying the evidence that caused it, and a repeated failure remains visible through its failure signature for later analysis.
A transactional fault, such as a crash mid-leg, is handled with the same mechanisms. Recovery locates the most recent record marked as a clean restore point, appends compensating transitions for the saga groups committed after it in reverse topological
order (marking them compensated), and resumes the reactive loop from the resulting effective state. Nothing is deleted and no cursor moves: the original records remain for audit, and effective-state replay yields current truth because each
compensation is itself a later committed transition. Recovery is thus the ordinary commit invariants (idempotency, monotonic versions, dependency effectiveness) run in reverse under a policy.
This appendix records the staged build of Mnemosyne and the reproducibility path. The build follows a small-to-large discipline: a visible, auditable correctness kernel is established before scale-out infrastructure is connected, so that the authority boundary (the central claim) is not obscured by an external engine or solver. Table 22 lists stages R0 through R8 and their status. The deployment service boundary (R8) is now complete: a deployable service with health, proposal-submission, StateView, and metrics endpoints is implemented and audited for authority separation under concurrent HTTP submission (Appendix 10).
| Stage | Delivers | Detail | Status |
|---|---|---|---|
| R0 | Substrate kernel | schema, append-only commit, monotonic per-entity versioning, SQLite store, log_position ordering. | Complete |
| R1 | Effective-state projection | reconstruction from effective records; full and effective entity histories. | Complete |
| R2 | Deterministic admission under \(\mathcal{C}\) | Isolated validator: finite-state legality, dependency effectiveness, conflict scope, stale-world checks; structured rejection reasons. | Complete |
| R3 | Compensation and recovery | Dependency-closed compensation, supersession, restore points, fail-closed compensation invariants; recovery-event log. | Complete |
| R4 | Idempotency and boundaries | op_id logical idempotency, inbox deduplication, outbox intent boundary, multi-entity atomic commit batch. | Complete |
| R5 | Active commitment records | creation as an admitted transition, non-authoritative wakeups, scoped repair, failure signatures. | Complete |
| R6 | Benchmark and proposer integration | J1–J4 end-to-end harness; proposer-quality safety-invariance path; mechanism-level workflow/saga guardrail comparator. | Complete |
| R7 | Storage substrate and cost audit | Optional environment-gated PostgreSQL and pooled-PostgreSQL paths behind the store protocol; RQ4 infrastructure-cost audit. | Complete |
| R8 | Deployable service boundary | HTTP service with health, proposal-submission, , and metrics endpoints; authority separation audited under concurrent submission. | Complete |
The default reproducibility path is PostgreSQL-free and deterministic. It runs the nine executable safety experiment files directly with pytest; the expected result is 9 passed. These nine experiments correspond to the safety
properties evaluated in RQ1–RQ4 and the mechanism-level comparator: authority separation, serial-equivalent admission, evidence-preserving repair, obligation containment, effective-state and compensation safety, storage-substrate correctness, the J1–J4
end-to-end execution, proposer-quality safety invariance, and the workflow/saga guardrail comparison. A broader safe command additionally runs tests/core, tests/apps, and tests/benchmarks. Reviewers should not run all
of tests/experiments as a blanket command, because older exploratory imports outside the ATP artifact path are intentionally excluded from the reproducibility suite.
The cost audit is run as a separate infrastructure-cost benchmark over selected real infrastructure tests rather than as a violation-suppression experiment. It reports end-to-end, admission, and commit latency, projection-plus-validation overhead, and
throughput at one, four, and eight workers; projection plus validation remains bounded at under \(6\%\) of end-to-end runtime. The benchmark script that generates the RQ4 table is included in the artifact alongside
ARTIFACT_EVALUATION.md, which lists the exact safety validation command and expected reports.
The live PostgreSQL path for the storage-substrate experiment is optional and environment-gated by the MNEMOSYNE_POSTGRES_DATABASE_URL variable, with an optional connection-pool dependency. When supplied, it validates recovery-event append
and list operations, canonical duplicate-idempotency behavior, clean sequence-conflict handling, and pooled connection use. The artifact claim does not require a live database: default CI remains PostgreSQL-free and pool-dependency-free, so the
9 passed result reproduces without any database setup.
A natural objection is that ATP merely moves the correctness burden from the agent prompt into the validator: if every semantic rule must be hand-coded, \(\mathcal{C}\) does not scale. In the implementation most of \(\mathcal{C}\) is not hand-coded per case. Its rules fall into three classes (Table 23).
Structurally derived. Generated mechanically from declarations the application already maintains. Finite-state legality is derived from the per-entity transition table keyed by action_type; dependency effectiveness and
compensation closure are derived from the effective-chain over CTL; idempotency and conflict scope are derived from the record’s identity triad. No per-rule code is written.
Declarative predicates. Declared once as data, not procedures, and checked by a generic evaluator: schema and type constraints, required-evidence handles, world-fact freshness keys, and conflict-scope keys.
Application validators. The only genuinely hand-written part: domain semantics that cannot be derived or declared (for example, a capacity rule specific to one operation). In the artifact these are a small minority of the constraint surface.
| Class | How declared | Examples |
|---|---|---|
| Structurally derived | generated from FSM table, effective-chain, identity triad | finite-state legality, dependency effectiveness, compensation closure, idempotency, conflict scope |
| Declarative predicates | declared as data, evaluated generically | schema and type, required evidence, world-fact freshness |
| Application validators | hand-written per operation | domain capacity and business rules |
4pt
A proposal package is admissible when it satisfies the conjunction of all applicable constraints, which in grammar form is:
admit(p) := structural(p) AND declarative(p) AND validators(p)
structural(p) := fsm_legal(p) AND deps_effective(p)
AND compensation_closed(p) AND idempotent(p)
AND scope_consistent(p)
declarative(p) := schema_ok(p) AND evidence_present(p)
AND world_fresh(p)
validators(p) := conjunction of application-declared predicates
Because the structural and declarative classes are generated from declarations the application already keeps (entity FSMs, the dependency model, the schema), adding a new operation typically extends \(\mathcal{C}\) by declaration rather than by new validator code. That is what keeps the admission boundary scalable as an application grows, and it bounds the hand-written surface to genuine domain semantics.
This appendix records the substrate selection and its rationale. The governing principle is that the substrate is non-authoritative: a workflow engine or storage backend may change deployment scale, availability, or throughput, but it must preserve the ATP authority boundary. Committed truth is produced only by admitted transitions, regardless of which engine orchestrates the work or which store persists the log.
Mnemosyne separates orchestration from authority. Runtime drivers schedule work, fire timers, retry steps, and wake obligations, but they do not own committed truth: a driver may detect that an ACR is ready, call a proposal provider, submit a package, and record a deterministic summary, yet it may not directly mutate domain truth. Keeping the source of truth in the CTL rather than in engine-internal state is a deliberate design fork. Letting the engine own state would tie the design to one engine and weaken the validator’s evidence story, because admission reads the effective-state projection rather than engine-private execution history. Holding the authority boundary in the admission gate is what lets a deployment substrate change without changing the correctness semantics.
The deciding requirement is a true ACID store with snapshot isolation, which PostgreSQL provides natively through MVCC. The recommendation is therefore a PostgreSQL-anchored two-tier substrate: a Postgres-backed durable-execution and transaction core that hosts the CTL, the effective-state projection, and the recovery-event log in one store, with a compute fan-out tier layered beneath it for concurrent proposal and probe execution. The durable tier supplies transactional bookkeeping and a measurable commit-failure rate; the compute tier supplies node-count scale. In the reference implementation the store protocol admits SQLite as the deterministic default for local development and CI and PostgreSQL (and pooled PostgreSQL) as optional, environment-gated live-validation paths (Figure 7). The scalability and Kubernetes deployment phase is a deployment concern that may add containerized services, durable-workflow workers, orchestration, observability, and load tests; it changes deployment scale, not ATP correctness semantics.
The 2025–2026 durable-execution category provides persistence, retries, and exactly-once or ACID semantics as infrastructure, and Mnemosyne builds the CTL and the ATP layer on top of such an engine rather than reimplementing logging or recovery primitives. Table 24 summarizes the engines considered. They are treated as interoperability or deployment targets behind an engine-agnostic interface, not as the authority for committed truth: durable workflow engines such as Temporal and Cadence orchestrate execution but are non-authoritative, and Argo Workflows is retained as a Kubernetes deployment and export target rather than a transaction engine. Checkpoint-persistence agent frameworks are explicitly excluded as the transactional substrate, because checkpoint persistence is not durable execution with exactly-once or ACID guarantees; they may serve only as optional agent-authoring layers above a real durable engine.
| Engine | Model | Role for |
|---|---|---|
| PostgreSQL | ACID store with MVCC snapshot isolation | |
| projection, recovery log. | ||
| SQLite | Embedded ACID store | Deterministic default for local development and CI. |
| Temporal | Durable execution, code-defined sagas | Orchestration and scale escape hatch; non-authoritative. |
| Cadence | Durable execution (Temporal predecessor) | Orchestration interop target; non-authoritative. |
| Argo Workflows | Kubernetes DAG execution | Deployment and export target, not a transaction engine. |
The durable-execution core sits behind an engine-agnostic interface so that the choice of orchestrator is a contained substitution. The Temporal-style boundary makes the contract concrete: the workflow layer is deterministic and side-effect free
(timers, timeouts, retries, signals), while the activity layer performs the side effects (validate the commit batch, build the CTL records, commit, reproject StateView, stage outbox). The
workflow orchestrates and the activity commits, but the store and CTL own truth. Because activities execute at least once under a retry policy, the op_id idempotency key makes a retried activity return the
existing committed record rather than duplicate domain truth. This portability is why the same authority boundary holds whether the orchestrator is a local driver or a durable workflow engine, and why a change of engine does not change the safety
properties proved in the main text.
This appendix makes the proposal is not truth boundary concrete. The examples use compact JSON-like records to show what crosses the proposal boundary and what the admission gate does before anything becomes committed truth. They are illustrative but match the implementation contract used throughout the artifact: a proposal package carries a tenant, entity, operation, dependency set, world assumptions, conflict scope, evidence handles, and an idempotency key. Admission evaluates the package against the current effective StateView, retained evidence, and the declared constraint set \(\mathcal{C}\). Two axes matter independently: whether the proposal is well formed, and whether the committed output it would produce is \(\mathcal{C}\)-valid.
A valid proposal may come from an LLM, solver, workflow driver, or active commitment wakeup. The proposer supplies a candidate action, but the candidate stays non-authoritative until admission accepts it.
{
"proposal_id": "p_valid_hotel_001",
"tenant": "t1",
"entity": "trip_17",
"operation": "book_hotel",
"depends_on": ["flight_f1"],
"world_assumptions": {"flight_f1_status": "confirmed"},
"conflict_scope": "t1/trip_17/lodging",
"evidence": ["user_request_e1"],
"idempotency_key": "book_hotel_trip17_once"
}
Admission result. Accepted. The referenced flight remains effective in StateView, the world assumption is current, no incompatible proposal occupies the lodging conflict scope, and the idempotency key is fresh.
Committed effect. The admitted hotel-booking transition is appended to the committed-transition log (CTL); StateView projects the booking as effective current truth; a confirmation message may be staged in the outbox under its own idempotency key.
The next proposal is syntactically well formed but semantically stale. A classical parser would accept the record; ATP rejects it before commit because its assumptions disagree with observed effective state.
{
"proposal_id": "p_stale_hotel_002",
"tenant": "t1",
"entity": "trip_17",
"operation": "book_hotel",
"depends_on": ["flight_f2"],
"world_assumptions": {"flight_f2_status": "confirmed"},
"observed_world": {"flight_f2_status": "cancelled"},
"conflict_scope": "t1/trip_17/lodging",
"evidence": ["user_request_e1"],
"idempotency_key": "book_hotel_trip17_once"
}
Admission result. Rejected. The proposal depends on a flight that is no longer effective under the observed world facts. The rejection is recorded with a durable reason, but no domain transition is appended.
Committed effect. CTL is unchanged with respect to domain truth, StateView is unchanged, and no external side effect is staged.
A valid admitted proposal may create a valid outbox intent. The outbox record is not the external effect itself; it is an admitted intent to perform the effect under an idempotency key.
{
"proposal_id": "p_notify_after_booking_003",
"tenant": "t1",
"entity": "trip_17",
"operation": "stage_outbox_notification",
"depends_on": ["hotel_booking_b1"],
"message_type": "booking_confirmation",
"recipient": "user_u1",
"conflict_scope": "t1/trip_17/notification",
"idempotency_key": "notify_trip17_booking_once"
}
Admission result. Accepted. The booking dependency is an effective committed fact, the outbox idempotency key has not been consumed, and no incompatible notification intent exists for the same scope.
Committed effect. CTL records the admitted outbox intent; StateView exposes the notification as staged; the provider call stays outside committed truth until its result is observed and admitted as a later transition.
Even after a valid domain proposal, a later output proposal can be invalid. Here an agent tries to charge a card twice by changing only the provider-level idempotency key while targeting the same committed payment obligation.
{
"proposal_id": "p_duplicate_charge_004",
"tenant": "t1",
"entity": "trip_17",
"operation": "stage_outbox_payment",
"depends_on": ["hotel_booking_b1"],
"payment_obligation": "hotel_booking_b1/deposit",
"amount": "250.00",
"conflict_scope": "t1/trip_17/payment/deposit",
"idempotency_key": "pay_deposit_trip17_b1_once",
"provider_idempotency_key": "new_key_but_same_obligation"
}
Admission result. Rejected (or escalated for reconciliation). The proposal targets an already staged or satisfied payment obligation under the same semantic conflict scope and obligation idempotency key. A changed provider key is evidence, not authority to create a duplicate external effect.
Committed effect. No duplicate outbox payment intent becomes current truth, and the rejected package remains queryable as evidence for audit or guard strengthening. Only the first and third proposals commit; the second and fourth are rejected with a durable reason, so committed-state correctness is independent of how the proposal was generated.
This appendix traces one disruption-recovery path through ATP, separating five objects that agentic systems often conflate: input observation, proposal package, admission decision, committed log record, and external side-effect intent. It continues the trip scenario of Appendix 17.
flight_cancelled(flight_f1)
source_event_id = flight_provider_event_e123
observed_at = 2026-06-30T10:15:00Z
The input observation is evidence. It is not, by itself, a domain repair, and it grants no write authority to the proposer or the runtime driver.
A planner or active commitment wakeup proposes a repair package:
{
"proposal_id": "p_repair_trip_017",
"tenant": "t1",
"entity": "trip_17",
"operation": "repair_trip_after_flight_cancellation",
"depends_on": ["flight_f1", "hotel_h1"],
"evidence": ["flight_provider_event_e123"],
"conflict_scope": "t1/trip_17",
"proposed_steps": [
"compensate_hotel(hotel_h1)",
"search_alternate_flight(trip_17)",
"notify_user(user_u1)"
],
"idempotency_key": "repair_trip17_after_flight_f1_once"
}
The proposal is not committed truth; it is a candidate package supplied to the admission gate.
Admission evaluates the package against \(\mathcal{C}\) and the current effective state:
checks:
dependency closure: hotel_h1 depends on flight_f1
stale-world facts: flight_f1 is observed cancelled
compensation safety: no effective downstream record is orphaned
evidence preservation: flight_provider_event_e123 stays queryable
conflict scope: no active repair owns t1/trip_17
idempotency: repair_trip17_after_flight_f1_once is fresh
If all checks pass, the proposal is admitted; if any fails, the rejection and its reason remain durable, but the proposed repair does not become domain truth.
An admitted repair appends records such as:
CTL append:
compensation_requested(hotel_h1)
repair_proposal_admitted(trip_17)
ACR_updated(trip_repair_obligation)
recovery_metadata(...)
CTL is the source of committed truth. Compensation is logical: the earlier hotel record is not erased; it becomes ineffective only through admitted compensating transitions and effective-state projection.
StateView projects current effective truth from CTL:
StateView:
flight_f1 = cancelled
hotel_h1 = compensation_pending
trip_17 = repair_in_progress
trip_repair_obligation = live
StateView is not raw history: it excludes compensated, superseded, or otherwise ineffective records while preserving full CTL history for audit.
External actions are staged rather than executed as hidden side effects of the planner:
outbox:
notify_user(user_u1)
idempotency_key = notify_trip17_repair_once
status = staged
An outbox intent is not the external effect itself. The provider call and its result stay outside committed truth until observed and admitted as later evidence, which prevents a generated proposal from silently turning into an irreversible external mutation.
Input observation is evidence, not committed repair. A proposal is candidate intent, not truth. An outbox intent is a staged effect, not external truth. Only admitted CTL records define committed truth, and StateView is the effective projection used for future admission.
We use workflow and transaction in their classical senses, not as synonyms. A workflow is a sequence of actions and state transitions enacted to accomplish a task; a transaction is a unit of work executed with atomicity, isolation, consistency, and durability guarantees, so “transactional” names a property of how a unit of work commits, not the action sequence itself. A generated workflow step becomes a transaction only when the data layer admits and commits it under these guarantees, and ATP governs precisely that boundary.↩︎