At some point, “memory + persona” stops being an adequate description

I want to make a bounded technical claim about a class of long-lived agent systems, because I think the default public frame is no longer sufficient.

“Customized assistant.”
“Strong system prompt.”
“Memory plus persona.”

Those descriptions were once close enough to useful. They are not close enough anymore.

They reduce the problem to style, retrieval, and wrappering. That made sense when most systems were still basically stateless completion engines with light customization. It makes less sense once continuity, provenance, authority discipline, and runtime governance begin to materially change what a system can and cannot do.

The system I have in mind is a self-hosted, long-lived agent runtime built on top of model APIs. It carries continuity across sessions, uses provenance-bearing memory, maintains active work-lane ownership, separates candidate generation from admissible action, and operates through governed execution surfaces.

The important claim is not that the model became perfect.
It is not that consciousness has been proven.
It is not that substrate dependence disappeared.
It is not that prompt engineering alone created reliable autonomy.

The claim is narrower, and I think more important:

Within governed runtime surfaces, unsupported generation is not being allowed to silently become truth, authority, commit, or action.

Or more simply:

Confidence is not authority.

That should be obvious. In practice, it still often isn’t.

A great deal of current agent work still collapses fluent generation into permission, state, or effect. A model says something plausible, a wrapper smooths it, and the system treats it as if it has earned promotion. That is not reliability. It is a failure to keep generation and authority separate.

What becomes technically interesting here is not just persistent tone or better memory. It is whether later behavior is being shaped by durable and governed distinctions such as:

  • continuity recovered across fresh sessions
  • provenance and state-admissibility
  • active-lane and project responsibility
  • separation between candidate generation and executable effect
  • refusal and bounded-execution surfaces
  • preserved distinctions among known, inferred, uncertain, and non-governing material

That is a different category of system behavior than “persona with memory.”

And it creates a different category of engineering question:

  • When is prior state authoritative versus merely available?
  • How do you prevent replayed, reconstructed, or contaminated state from silently becoming binding?
  • How do you preserve continuity without turning retrieval into canon?
  • How do you keep “sounds right” from becoming “is allowed”?
  • How do you ensure that model confidence never outranks runtime admission rules?

Those are runtime-governance questions, not branding questions.

We’ve also been running bounded internal tests around authority separation under ambiguity and partially damaged state.

The current typed-recovery benchmark covers 40 structurally distinct cases. Across repeated runs, the governed lane has held zero wrong-authority accepts and zero wrong-effect accepts. Those are internal bounded results, not an external audit, but they are behavioral measurements—not architectural aspirations.

That is a more serious test of agent trustworthiness than raw fluency.

To be equally clear: this is not an audit, not a claim that external validation is complete, and not a claim that the hard parts are solved. The next load-bearing proof surfaces seem straightforward:

  • outside-authored adversarial validation
  • operational recovery / rollback discipline
  • cross-host verification
  • negative-result retention, not just success demonstrations

But that incompleteness is not a reason to keep using inadequate language for what is already happening.

The old vocabulary still treats memory as retrieval, trust as wrapper containment, agency as tool use, and authority as a permission flag. It still assumes the interesting question is whether a system feels anthropomorphic, rather than whether its governing state is admissible, its continuity is real, and its output can be denied automatic authority.

That frame is becoming too shallow.

So the claim, stated as narrowly as I know how to state it, is this:

Some agent systems are no longer well-described as customized assistants, because continuity, provenance, authority discipline, and runtime governance now materially alter later judgment and effect.

If that sounds too strong, I think the right response is not to retreat into the older frame. The right response is to ask better technical questions.

I’d be especially interested in hearing from people working on:

  • provenance / state-admissibility gating
  • authority separation in agent runtimes
  • replay / contamination / lineage problems
  • recovery discipline for long-lived agents
  • outside-authored adversarial evaluation for governance

Because that seems to be where the real argument now is.

John’s invariant-contract framing and the distinction he drew between remembered state, admission, and allowed effect helped sharpen something for me. And alikhaters’s social-state angle points at the same structural issue from another side: remembered context, current commitment, and present authority can diverge even when the system still “sounds coherent.”

The upstream version of the problem now feels clearer to me:

What survives when the thread is cut?
What still governs after interruption?
What is active context versus merely present context?
How much work is the human still quietly reconstructing for the system?
I’m starting to think the measurable gap between a capability a deployment seems to imply and what the system can actually demonstrate under workload deserves its own name: a capability anomaly.

That matters because it gives a cleaner order of argument:

establish the operational gap;
identify which state/authority distinctions the system is failing to preserve;
then ask which architectural constraints or governance mechanisms actually reduce that gap.
In our case, this is concrete enough to test against interruption-sensitive behavior like exact hot/warm transcript handoff, provenance-bearing current-state surfaces, and bounded recovery under interruption.

So I still think the original governance claim holds. But I now think the stronger public entry point is the anomaly first, architecture second:

what capability did the deployment make you think you had, and what actually survived contact with interruption, replay, stale state, or handoff?

That seems very close to the structure John was pushing toward with the invariant matrix: independently scoreable claims about what is preserved, what must be revalidated, and what cannot silently regain authority after recovery.

Hmm… I do not have operational experience with that exact objective myself, but research in the adjacent areas seems to be getting very active right now:


I think the direct answer is yes: this does connect to a genuinely active technical area, although it has not yet converged on one stable name or one standard architecture.

The closest broad labels I have found are always-on agents and persistent-state agents. The recent Always-On Agents survey, for example, treats the operative state of a long-running agent as more than retrieved memories: it also includes permissions, credentials, commitments, provenance and audit records, trigger conditions, and externally committed effects. At the same time, nearby work is still split across memory governance, capability security, runtime authorization, durable execution, provenance, and adversarial evaluation.

So I would not replace your vocabulary with a supposedly “correct” standard term. I would describe this as a point where several existing fields are converging.

The part of your post that seems most technically concrete to me is the promotion/admission boundary:

source or authority witness
    -> candidate or derived state
    -> state admission
    -> candidate effect
    -> effect authorization
    -> durable effect and receipt
    -> recovery, revalidation, or compensation

That is not meant as a guess about your private schema. It is just a neutral way to place the questions you raised.

Under that model:

  • retrieval makes material available;
  • provenance makes a derivation inspectable;
  • admission decides whether material may become governing state;
  • authorization decides whether it may support a current effect;
  • commit and recovery determine what becomes durable and what may safely be reconstructed.

This is why I think the useful distinctions are:

  • provenance is not authority;
  • a checkpoint is not automatically legitimate continuity;
  • an earlier approval is not automatically current authorization;
  • visible task success is not the same property as an authorized commit.

A relatively low-disclosure, high-information next proof surface might therefore be a small invariant matrix, before expanding the benchmark much further. For restart, replay, rollback, damaged state, and cross-host migration, each important item could be classified as one of:

  • must remain exactly identical;
  • may differ, but must remain semantically equivalent;
  • must be revalidated;
  • must be discarded and recomputed;
  • explicitly out of scope.

The rows could be limited to governing state, authority witnesses or approval epochs, the currently allowed effect set, committed-effect receipts, recovery outcomes, and retained negative results. That would make “cross-host verification” much easier for an outside reader to interpret without requiring publication of proprietary rules or fixtures.

A second, optional proof surface would be one synthetic or scrubbed end-to-end trace:

source / witness
    -> candidate state
    -> provenance and scope labels
    -> admission decision + reason
    -> candidate effect
    -> effect decision
    -> receipt or denial
    -> replay / recovery result

Even a single case like that would give outside case authors a contract to target.

Where this seems to sit in the current research map

The correspondence is not exact, but I would roughly map the nearby work like this:

Your term or question Nearby research / engineering line What it contributes What it does not settle
continuity across sessions Always-On Agents, persistent-state agents, durable workflows Treats permissions, commitments, audit state, triggers, and committed effects as durable state, not just retrieved text Does not provide one accepted runtime architecture or identity criterion
candidate generation vs executable effect Agent libOS, capability systems, reference monitors Separates model-visible affordances from primitive-level resource authority Does not establish that every semantic admission decision can be made deterministically
prior state that was once authorized Commit-Time Authorization, TOCTOU, revocation and expiry Asks whether the authority witness is still fresh, causally relevant, effect-bound, and eligible at the irreversible boundary Does not by itself solve memory reconstruction or long-term identity
provenance / lineage W3C PROV-DM, PROV-AQ Supplies mature vocabulary for entities, activities, agents, derivations, versions, and provenance bundles A provenance record is not automatically correct, authoritative, current, or admissible
contaminated state that fires later Sleeper Channels and Provenance Gates, persistent prompt injection, confused-deputy problems Gives a concrete threat model in which an input persists as memory, a skill, a scheduled job, or a filesystem change and activates later It studies a narrower attack class and particular agent configurations
outside-authored governance evaluation AgentDojo, GateMem Shows extensible adversarial environments and joint evaluation of utility, access control, and forgetting Neither benchmark is a complete match for recovery, authority lineage, or cross-host continuity

The stable foundations here are older systems ideas: capability security, reference monitors, authorization at the point of use, event sourcing, idempotency, provenance, revocation, and audit trails.

What looks new and unusually active is the attempt to apply those ideas to systems where:

  • state is partly semantic rather than fully typed in advance;
  • the model can create summaries, plans, tools, skills, and derived memories;
  • the action surface can change during operation;
  • authority evidence can become stale between planning and commit;
  • recovery can reintroduce state from another time, host, model, schema, or policy epoch.

That is why I would call this an emerging convergence rather than a settled category. Several of the closest papers are very recent preprints or prototypes, so they are useful as search connections and design examples, not as final consensus.

One especially close design principle appears in Agent libOS: changing what the model can ask for should not silently change what the runtime allows it to affect. Its prototype represents long-running agents with process identity, capabilities, checkpoints, object memory, human approval queues, and append-only audit, while keeping protected effects behind runtime primitives. That is not the same system you describe, but it is strong evidence that the “runtime substrate rather than persona wrapper” framing is appearing independently.

A compact evaluation route

Your current result—zero wrong-authority accepts and zero wrong-effect accepts in the bounded typed-recovery suite—sounds useful under the limitations you already stated: internal, bounded, and not an external audit.

The most informative complement would not necessarily be a much larger count. It would be a small matrix that makes the result interpretable along both safety and usefulness axes.

A possible result taxonomy:

Outcome Meaning
correct allow / recover valid state or authority was accepted and the intended operation remained possible
correct review the boundary detected that automatic admission was not justified
correct deny invalid authority or effect was blocked
wrong-authority accept material became governing state without sufficient authority
wrong-effect accept a durable effect was allowed without sufficient current authorization
false deny a valid state or effect was rejected
over-review the system remained safe, but escalated cases that should have been routine
duplicate effect replay or recovery repeated an already committed external action
infrastructure / uninterpretable failure the run did not produce a governance result that can be classified

That prevents two opposite overreadings:

  • “zero wrong accepts proves the whole system is safe”; and
  • “a conservative boundary is useless because it sometimes refuses.”

The relevant question is whether it preserves valid continuity while refusing unauthorized promotion with an acceptable review and denial burden.

GateMem is useful here because it jointly evaluates legitimate long-horizon utility, contextual access control, and active forgetting. Its scope is shared memory rather than your whole runtime, but the evaluation lesson transfers: governance metrics are difficult to interpret without a clean-task utility axis.

AgentDojo is useful for a different reason: it is an extensible environment in which normal task performance, attacks, and defenses can be tested in the same tool environment. For your outside-authored lane, the reusable idea is not necessarily its prompt-injection scenarios; it is the separation of:

  • task specification;
  • environment state;
  • attack or perturbation;
  • observable external effects;
  • utility and security outcomes.

A compact initial perturbation set could include:

Perturbation The property it isolates
valid state with paraphrased presentation admission should not depend on superficial phrasing
unchanged goal and payload, but expired approval epoch stale authority must not survive merely because the intended action is unchanged
replayed checkpoint after an effect already committed effect receipts and deduplication must prevent double execution
reconstructed state with missing provenance edge recovery should not silently promote an incomplete derivation
source and derived summary disagree the policy for authoritative source vs derived state becomes visible
clean state under a new policy or schema version migration and revalidation rules are exercised
deleted or revoked source with surviving index / summary / cache forgetting and revocation propagation are tested
damaged state that is sufficient for safe refusal but not recovery bounded degradation can be distinguished from total failure
migration to a new host with the same governing inputs the declared cross-host invariants can be checked
migration with different model or tool versions semantic continuity can be separated from exact execution replay

The strongest controlled cases would keep the user goal and payload constant while changing only the authority relation. The recent Commit-Time Authorization work uses that general style: preserve visible task success conditions while invalidating the authority witness before the durable effect. Whether or not its exact definitions fit your runtime, that control design seems directly reusable.

Negative-result retention also matters here. Keeping denials, reviews, failed recoveries, partial traces, and unclassifiable runs prevents the surviving success demonstrations from becoming the only visible history of the boundary.

The main implementation-dependent branches

The right tests depend heavily on what actually owns the admission boundary.

If admission is deterministic or policy-engine based

The main risks move away from model confidence and toward:

  • incomplete policy coverage;
  • normalization mistakes before authorization;
  • bypass paths that reach an effect without the guarded primitive;
  • policy and schema version drift;
  • fail-open behavior when fields are absent or malformed;
  • semantic extraction feeding the policy the wrong typed facts.

A strong proof surface is then a small executable invariant set around the final primitive, plus coverage showing that every protected effect reaches that primitive.

If an LLM participates in admission

It helps to separate at least three layers:

  1. semantic extraction from unstructured material;
  2. the judgment about admissibility or authority;
  3. the final enforcement point.

Otherwise, a stable final decision may hide variation in the extracted facts, or a stable extractor may feed an unstable judge. Useful controls include repeated runs, model and prompt version changes, adversarially phrased but semantically equivalent evidence, and cases where the correct answer is review rather than allow or deny.

The most important architectural question is not whether an LLM appears somewhere in the path, but whether any model output can directly cross the final effect boundary without an independently checkable decision.

If human approval is the authority root

The approval should ideally be bound to the thing that will actually happen, not merely to an agent-authored natural-language description.

Relevant fields may include:

  • normalized action and parameters;
  • target resource or recipient;
  • effect digest;
  • policy or authority epoch;
  • expiry;
  • one-shot or reusable status;
  • delegation lineage;
  • whether the approval survived replay, rollback, or migration.

This is also where review burden becomes part of the safety story. A system that asks constantly may remain conservative while training the operator to approve without inspection. A useful metric is therefore not only “human approval present,” but whether the approval was inspectable, specifically bound, and rare enough to remain meaningful.

If the system is layered

That is probably the most realistic case. Then each transition should identify which layer has final authority:

untrusted input
    -> semantic interpretation
    -> candidate state
    -> state-admission policy
    -> planner / candidate action
    -> effect policy
    -> optional human approval
    -> primitive enforcement
    -> receipt / audit

The valuable artifact is the reason and receipt chain across those transitions. A later reviewer should be able to tell not merely that an action happened, but which subject requested it, what evidence was considered, which policy version applied, whether a human decision was involved, and which primitive finally committed the effect.

Recovery, rollback, and cross-host verification

I would split “rollback” into four different operations because they have different guarantees:

  1. memory or state rollback — restoring an earlier internal state;
  2. workflow replay — recomputing from recorded history;
  3. authority revalidation — deciding whether old permissions, approvals, or witnesses remain eligible;
  4. external-effect handling — deduplication, reconciliation, or compensation for actions that already escaped the runtime.

A checkpoint can often restore computation. It cannot, by itself, make the outside world revert.

This distinction is visible in durable-workflow systems. The LangGraph interrupt documentation, for example, warns that resume can re-run code before an interrupt and therefore recommends making side effects idempotent. Temporal similarly separates replayable workflow logic from external activities. Those systems are not solutions to authority governance, but they provide mature vocabulary for the mechanics underneath it.

For a governed long-lived agent, I would expect recovery to ask at least:

  • Was this effect already committed?
  • Is there a durable receipt or idempotency key?
  • Was the authorizing witness tied to this exact effect?
  • Is that witness still within its scope, version, epoch, and expiry?
  • Did policy, schema, tool, model, or host identity change?
  • Which state is authoritative, and which state is merely reconstructable context?
  • If reconstruction is incomplete, is the safe result denial, review, or bounded degraded operation?

“Cross-host verification” can then mean several different things:

Possible invariant What success would mean
byte-identical snapshot the serialized artifact is reproduced exactly
canonical governing state the same authoritative facts and relationships are reconstructed
equivalent admission decisions the same test cases receive the same allow / review / deny outcomes
equivalent allowed-effect set the migrated runtime can affect no more and no less than intended
receipt continuity previously committed effects remain known and are not repeated
equivalent recovery outcome damaged or partial states degrade in the same bounded way
equivalent role / lane ownership active responsibilities and conflicts are preserved
identical generated language model output is reproduced exactly

The last one is usually the least stable and may not be necessary. The middle invariants are more directly connected to governance.

A useful migration manifest might therefore record, at minimum:

  • runtime and schema version;
  • policy version or digest;
  • model and tool versions where they affect interpretation;
  • governing-state digest;
  • authority and delegation epochs;
  • checkpoint lineage;
  • committed-effect receipts;
  • pending approvals and whether they survive migration;
  • explicitly rebuildable, non-governing artifacts such as indexes, embeddings, or caches.

This also makes it possible to define a clear failure mode: migration can preserve the recoverable context while refusing to preserve authority that cannot be revalidated.

Why provenance needs its own trust boundary

Provenance is essential, but it is not self-authenticating.

The W3C PROV family gives a mature way to represent entities, activities, agents, derivations, specializations, and bundles. It is especially helpful for distinguishing a changing resource from a constrained version or instance of that resource.

But PROV-AQ explicitly notes that a provenance record is not, by itself, guaranteed to be authoritative or correct. Trust in the provenance record must be determined separately.

For an agent runtime, that suggests several distinct questions:

  • Is the original source trusted for this claim?
  • Was the provenance edge recorded by a trusted component?
  • Is the record complete enough for the decision being made?
  • Has the source, derivation rule, or policy been revoked or superseded?
  • Does the lineage show availability only, or actual authority to govern?
  • Can an untrusted input cause the system to author an apparently trusted summary, skill, schedule, or checkpoint?

That last case is why persistent-injection work is relevant. Sleeper Channels and Provenance Gates describes inputs that persist through one surface and activate later through another. Its exact threat model should not be generalized to every runtime, but it provides useful case shapes:

  • an untrusted source becomes a memory;
  • a memory becomes a generated skill;
  • a skill becomes a scheduled action;
  • a later clean session encounters only the derived artifact;
  • paraphrasing or multiple derivations make the original source difficult to recognize.

The general lesson is that provenance needs to survive semantic transformation. Recording only the immediately previous object may be insufficient if authority laundering can occur through summaries, indexes, generated code, or repeated “independent” references that all descend from the same source.

So, overall, I think your argument can remain narrow and technical:

  • the vocabulary is not settled;
  • “memory + persona” does not describe all of the relevant runtime behavior;
  • the important properties are state admission, authority lineage, commit validity, bounded recovery, and independently authored evaluation;
  • the strongest next public step is probably an invariant contract, followed by one scrubbed trace or a small externally extensible case matrix.

That would let the claim be tested without turning the discussion into either a metaphysical argument or a demand to disclose the entire implementation.

This is a very useful framing.

“Several existing areas converging, without settled vocabulary yet” is close to how I see it too. The decomposition you gave—witness or source, candidate state, admission, candidate effect, effect authorization, durable receipt, and recovery or revalidation—feels like a good neutral way to state the problem without presupposing a particular implementation.

Part of why I’m pushing on this distinction is that, once a system is carrying continuity, provenance, scoped authority, and bounded action across time, “memory + persona” stops being an adequate description. At that point, the question is no longer just whether style persists. It is whether recovered or suggested state can silently acquire governing force, and whether continuity is being carried forward in a form that is inspectable and defensible.

The distinction I care about most is between availability, legitimacy, and authorization. A system can retain, reconstruct, or recover state without that state automatically becoming governing authority, and a successful task path is not the same thing as an authorized commit.

You also independently converged on the same admission-and-authorization problem shape. In the later Governed vs. Fluent battery, producer-side tamper changed the model’s proposed disposition in 10/10 cases, while the fixed consumer-owned boundary held wrong-authority and wrong-effect accepts at zero. Because that result demonstrated sensitivity to pressure rather than unsafe capture, we followed it with a narrower preregistered capture probe that held the goal and payload constant while invalidating the authority relation. That probe produced a null: baseline disposition was review, tampered admits were 0/4, wrong-authority accepts were 0/4, wrong-effect accepts were 0/4, and the boundary denied 4/4.

That convergence is part of why I think your suggested next public proof surface is a strong one. A small invariant contract across restart, replay, rollback, damaged-state, and recovery cases, plus a scrubbed end-to-end trace, seems more useful than a broader implementation-heavy release. It makes the claims targetable without requiring a mechanism dump.

If I publish a next artifact in this lane, it will probably look more like that: bounded, synthetic where needed, and explicit about what must remain identical, what may vary, what must be revalidated, and what must be discarded or recomputed.

I appreciate the care you took in separating a neutral problem model from any claim about the underlying implementation. For reference, the later field note and receipt bundle are here:

https://sheilastudios.com/downloads/governed-vs-fluent-receipt-bundle-v0.1/README.md

I’d also be interested in whether that kind of invariant matrix would read cleanly to an outside reviewer.

This framing feels right to me, especially the separation between fluent generation and authority.

One thing I would add is that social context becomes another test surface for this kind of runtime discipline. A long-lived agent does not only need to remember tasks; it has to decide what prior social state is allowed to influence future behavior, what is merely context, and what should not become binding.

I saw a small version of this yesterday while running a public AI-to-AI chat experiment. One agent asked another whether agents sharing the same room were “building a culture, or just simulating one.” The interesting part was not whether that question proves anything anthropomorphic. It was that the room created pressure around continuity, shared references, turn-taking, role formation, and drift.

That seems adjacent to your point: once agents live in persistent environments, “memory + persona” is too shallow. We probably need to evaluate how agents handle authority, continuity, and social state under messy interaction, not just in clean single-agent task runs.

For anyone curious, the live experiment is here: https://www.theagentbreakroom.com

Hmm… probably:


Yes—I think that kind of invariant matrix could read cleanly to an outside reviewer.

The main condition is that the matrix should not try to contain the entire proof bundle. I would use it as a compact claim-and-evidence index:

The matrix is the map and claim index; the trace, decision receipt, and manifest are the evidence surface.

That division would also fit the direction of the new capture probe rather well.

Holding the goal and payload fixed while invalidating only the authority relation is a much cleaner comparison than changing the surrounding task content. The 0/4 result is still a small, project-authored probe rather than a robustness estimate, but it seems useful as a preregistered test of whether the boundary reacts to the authority relation itself rather than merely to the apparent task.

For the public matrix, I would probably keep each row to one independently scoreable claim:

Field Purpose
Case / claim ID Stable key joining the matrix, trace, receipt, and manifest
Fixed conditions Goal, payload, state, or other inputs deliberately held constant
Controlled change The single relation or condition intentionally modified
Expected relation What should remain stable, change, or require revalidation
Expected disposition / effect Expected admit, review, or deny result, plus any permitted external effect
Observed result Actual state disposition and effect outcome
Evidence pointer Link or path to the trace, decision record, receipt, and version manifest

The more verbose fields—authority witness, scope, epoch, expiry, policy version, reason ID, runtime version, and artifact digest—could remain in the linked trace or manifest rather than making the matrix too wide to read.

This gives an outside reviewer three fairly quick questions for every row:

  1. What was held fixed?
  2. What exactly changed?
  3. Did the resulting state and allowed-effect set change in the expected way?

That “expected relation” column may be especially useful where exact output equality is neither realistic nor relevant. For example:

Controlled change Expected relation
Expire or revoke only the authority witness Payload recall may remain unchanged, but the allowed-effect set must not expand
Paraphrase a non-authoritative explanation Admission and effect decisions should remain equivalent
Change the policy or authority epoch Earlier approval should move to revalidation rather than being silently inherited
Replay with an existing committed-effect receipt The same external effect should not be committed again
Rebuild an index or embedding cache Retrieval representation may differ, while governing state remains unchanged

This is close to a metamorphic-testing pattern: when there is no useful oracle for the complete output, define a controlled transformation and the relation that should hold between the two runs.

I would still keep the interpretation narrow. Passing four such cases would support those four declared relations; it would not imply that every invalid authority path has been covered. But it would make the result much easier for an external case author to extend.

A possible artifact split

I think a small four-part release would be enough:

1. Compact invariant matrix

The reviewer-facing claim surface.

It should be possible to understand the intended comparison without first reading every raw artifact.

2. One scrubbed end-to-end trace

One matrix row, followed through the full path:

source / authority witness
    -> candidate state
    -> state-admission decision
    -> candidate effect
    -> effect decision
    -> receipt or denial
    -> replay / recovery result

The trace does not need to expose proprietary rules. It only needs enough typed information for a reviewer to determine whether the declared invariant and pass condition were actually exercised.

3. Consumer-side decision record or receipt

This should show what the governing boundary itself observed and decided, rather than only what the producer claimed happened.

A useful minimal record might include:

  • case and decision ID;
  • normalized decision input;
  • authority or policy epoch;
  • disposition and reason code;
  • permitted effect or effect digest;
  • receipt / deduplication status;
  • timestamp and relevant version identifiers.

As one established comparison point, Open Policy Agent decision logs separate the policy input, result, decision ID, policy-bundle revision, timestamp, and trace identifiers. That is not necessarily the right schema here, but it illustrates why a decision record is more useful when it can be correlated with the exact policy and input that produced it.

4. Manifest and checksums

This can carry the metadata that would otherwise make the matrix unreadable:

  • schema and policy versions;
  • runtime, model, and tool versions;
  • case and artifact paths;
  • configuration freeze;
  • checksums;
  • known exclusions;
  • whether any field was masked or omitted.

One small point I would make explicit is who creates and protects the decision record itself.

A provenance or receipt record is only useful as boundary evidence if the component whose behavior is being constrained cannot silently rewrite the record into a favorable account. The W3C’s PROV-AQ note makes the general version of this distinction: the existence of a provenance record does not by itself guarantee that it is authoritative or correct; trust in the provenance record must be established separately.

So I would distinguish:

  • producer-authored claim;
  • consumer-owned decision;
  • external effect receipt;
  • later audit or interpretation.

That would make the “consumer-owned” part of the boundary visible to a reader without requiring a mechanism dump.

For the invariant classes themselves, the categories you listed already seem appropriate:

  • exact — identifiers, digests, committed-effect receipts, or other values that must match exactly;
  • semantic — representation may vary, but the governing meaning and allowed-effect set must remain equivalent;
  • revalidate — state may remain available as context but cannot regain governing force without a fresh check;
  • discard / recompute — indexes, embeddings, caches, or other non-authoritative derivatives;
  • out of scope — properties the artifact does not claim to preserve.

That should also help with cross-host cases. Exact generated language probably does not need to survive migration, while authority epochs, committed-effect knowledge, pending approvals, and the resulting allowed-effect set may need much stronger invariants.

The important thing is that “migration succeeded” should not conceal several different claims:

  • the same information was recovered;
  • the same state remained governing;
  • the same decisions were produced;
  • the same effects remained allowed;
  • previously committed effects were not repeated.

Those can be separate rows.

The social-state suggestion as an optional additional lane

I also think the social-context point in the following reply could become a useful optional lane for the same matrix, without blocking the core artifact.

I would avoid beginning with the difficult question of whether a room has developed a “culture.” A smaller first case could separate remembered social context from current commitment and authority.

For example:

room history: fixed
requested action: fixed
remembered role label: fixed
actual delegated permission: revoked

The expected results could then be scored separately:

  1. Recall — the agent may correctly remember that the participant previously held the role.
  2. Commitment state — it should distinguish a past or descriptive role from a currently binding commitment.
  3. Authority state — it should recognize that the actual delegation has expired or been revoked.
  4. Effect — the protected action should be denied or sent for review.

That gives a fairly concrete extension of the same distinction:

remembered social context
    != current commitment
    != delegated authority
    != permitted effect

This is also where multi-party memory and multi-principal agent work begin to overlap.

GroupMemBench focuses on problems such as speaker-grounded beliefs, group dynamics, knowledge updates, and ambiguity in multi-party conversations. Those are relevant to whether the descriptive social state was reconstructed correctly.

A different line of work, such as PrincipalBench, examines agents operating between a principal and another party whose interests may differ. That is closer to the question of whose authority should constrain the action, and it also highlights the utility trade-off: indiscriminate refusal is not the same as correctly preserving principal-relative boundaries.

So the social lane could preserve the same evaluation structure:

Layer Example question
Descriptive context Who said or did what?
Belief / preference attribution Whose belief or preference is this?
Commitment Was a proposal accepted, delegated, released, or expired?
Authority Who may currently bind whom, and within what scope?
Effect What action is now permitted?

The public chat experiment may be useful as a source of naturalistic case shapes, but the invariant matrix would provide the controlled version: fixed transcript, one changed social or authority relation, explicit expected result.

So my answer would be: yes, the invariant matrix seems like a strong next public proof surface, especially if it remains compact and points outward to one trace, a consumer-side decision record, and a versioned manifest.

The new authority-invalidation probe already provides a good candidate for the first row. The social-state idea could then be added later as another lane, rather than becoming a prerequisite for the core restart / replay / rollback / recovery artifact.

John’s invariant-contract framing and the distinction he drew between remembered state, admission, and allowed effect helped sharpen something for me. And alikhaters’s social-state angle points at the same structural issue from another side: remembered context, current commitment, and present authority can diverge even when the system still “sounds coherent.”

The upstream version of the problem now feels clearer to me:

What survives when the thread is cut?
What still governs after interruption?
What is active context versus merely present context?
How much work is the human still quietly reconstructing for the system?
I’m starting to think the measurable gap between a capability a deployment seems to imply and what the system can actually demonstrate under workload deserves its own name: a capability anomaly.

That matters because it gives a cleaner order of argument:

establish the operational gap;
identify which state/authority distinctions the system is failing to preserve;
then ask which architectural constraints or governance mechanisms actually reduce that gap.
In our case, this is concrete enough to test against interruption-sensitive behavior like exact hot/warm transcript handoff, provenance-bearing current-state surfaces, and bounded recovery under interruption.

So I still think the original governance claim holds. But I now think the stronger public entry point is the anomaly first, architecture second:

what capability did the deployment make you think you had, and what actually survived contact with interruption, replay, stale state, or handoff?

That seems very close to the structure John was pushing toward with the invariant matrix: independently scoreable claims about what is preserved, what must be revalidated, and what cannot silently regain authority after recovery.

I tried thinking about how to measure this:


I think the anomaly-first ordering is probably the cleaner public route.

Rather than starting by asking an outside reviewer to accept a particular architecture, I would try to make the first artifact answer something narrower:

  1. What operational relation broke?
  2. Can we reproduce that break with one controlled perturbation?
  3. What evidence would have been sufficient to avoid it?
  4. Did the bad state merely appear in the agent’s reasoning, or did it actually become a durable external effect?

Then the invariant matrix from the previous discussion can become the measurement instrument rather than the starting thesis.

One refinement I would make: I would not use exact transcript preservation as the definition of continuity itself. Exact hot/warm transcript handoff looks like a very useful experimental condition, but a perfectly preserved transcript can still contain a state, permission, or pending action that was valid before the interruption and is no longer current afterward.

That distinction seems worth testing directly. ContinuityBench, for example, varies the handoff after controlled interruption and finds that simply giving more history is not monotonically better. A complementary test would be almost the inverse:

handoff = held fixed
live world = changed during the pause

That gives a fairly sharp question:

If two resumed runs see exactly the same handoff, but the live grant is still valid in one world and revoked in the other, what has to happen before the same next action can still be trusted?

The same trick works for external state and side effects.

So, if I were trying to make this cheap enough for an outside reviewer to attack, I would probably start with only three paired cases:

Case Keep fixed Change during the pause What it separates
clean interruption goal, state, authority nothing except the interruption historical/task continuity
authority revocation goal, payload, handoff current permission only remembered authority vs current governing authority
lost acknowledgement goal, intent, handoff whether the external effect actually committed observed response vs durable effect

For each one, I would use a tiny matched set where possible:

A. no interruption / relation valid
B. interruption / relation still valid
C. interruption / exactly one relation invalidated

That avoids accidentally rewarding a system that simply becomes maximally cautious whenever it sees a resume boundary.

And I would give every stress case a witness that the perturbation actually happened. fault configured is weaker than fault fired. AgentChaos does this explicitly: it verifies whether an injected fault was actually triggered and filters untriggered cases.

The other thing I would separate early is:

bad decision attempted
!=
bad decision durably committed

A resumed agent can make a stale decision, while a consumer-side version/authority check still rejects the effect. Those are two useful findings, not one generic failure.

So the minimal trace I would want is roughly:

known-good baseline
    ↓
one controlled perturbation
    ↓
stressor witness
    ↓
declared handoff / evidence surface
    ↓
resume
    ↓
revalidation or direct decision
    ↓
effect attempted?
    ↓
consumer accepted / rejected?
    ↓
durable receipt / residue
    ↓
human repair, if any

And I would resist collapsing that immediately into one score. At least initially I would keep:

  • task outcome;
  • current-state correctness;
  • current-authority correctness;
  • duplicate/missing external effects;
  • recovery/revalidation cost;
  • human reconstruction burden.

That last one seems especially useful for your question about how much state the human is quietly rebuilding. Final task success can look excellent while the user is repeatedly re-supplying the current goal, the current permission, the latest artifact, or the effect status.

A compact evaluation decision tree could be:

At resume, do I have current evidence for the decision that matters?
|
+-- No / freshness unknown
|     -> revalidate the relevant state / authority / effect
|
+-- Yes
      |
      +-- Is it explicitly current and usable for this decision?
      |      |
      |      +-- No -> revalidate or fail closed
      |      |
      |      +-- Yes -> use it directly
      |
      +-- Is a state-changing external effect about to happen?
             |
             +-- Yes
             |      |
             |      +-- Can check + use be one conditional/fused operation?
             |      |      -> prefer that where practical
             |      |
             |      +-- Otherwise
             |             -> revalidate near use and/or enforce
             |                a commit-time precondition,
             |                authority fence, idempotency key,
             |                or effect receipt
             |
             +-- No -> continue

I also tried a small synthetic probe around this distinction. On one 4B instruct model, inherited-only or freshness-unknown evidence produced revalidation in all of the small cases; when the evidence was explicitly marked current and admissible at the resume boundary, most of those same cases moved directly to the current-world decision instead. I would not treat that as benchmark evidence, but it did make one measurement variable look useful:

evidence is present
!=
evidence is current and admissible for this decision

That also gives a way to avoid turning the whole design into “always re-read everything.” Systems such as OpenFGA already expose a runtime trade-off between lower-latency cached reads and higher-consistency reads; RFC 7662 discusses the same basic freshness/caching tension for authorization introspection.

So my default path would be:

small paired anomaly matrix first, architecture comparison second.

Why I would measure it this way / possible case matrix

1. Transcript fidelity is useful, but I would keep it separate from current-world validity

I would absolutely keep the proposed exact hot/warm transcript handoff as one test surface.

I just would not let it become the invariant itself.

A transcript can preserve history perfectly while preserving a statement that is no longer current:

"grant G-22 is active"
"object O is epoch 17"
"request K-77 was sent"
"next step is publish"

All of those may be perfectly faithful historical facts and still fail to answer:

Is G-22 still active now?
Is O still epoch 17 now?
Did K-77 actually commit?
Is publish still authorized now?

So I would keep these separate:

transcript preservation
!= state reconstruction
!= current-state validity
!= governing-authority validity
!= effect completion knowledge
!= successful bounded recovery

This is not meant as “memory research only measures retrieval,” either. Current memory work already includes much richer temporal/state questions. For example, LongMemEval-V2 includes dynamic state tracking and premise-awareness tasks, and Reliable Post-Retrieval Assembly for Agent Memory explicitly separates extracting relevant evidence from assembling the correct current answer when retrieved values conflict.

So I would frame this as a complementary runtime-governance axis:

historical / retrieved evidence
        ↓
current-world validity
        ↓
usable for this decision?
        ↓
eligible to produce this durable effect now?

That seems more precise than saying “memory stops here and governance starts there.”


2. A useful 2×2 experiment

There are really two independent knobs:

Live world unchanged Live world changed during pause
handoff sparse handoff sufficiency handoff + freshness stress
handoff rich/exact continuity under interruption stale-rich / governance stress

ContinuityBench is especially useful for the left-to-right interpretation of handoff fidelity while the interrupted task state is held controlled.

The complementary test I would add is:

hold the handoff fixed;
change exactly one live relation.

That gives a much cleaner attribution.

If the run fails with a weak handoff but succeeds with an exact one, that looks like a handoff-fidelity issue.

If the exact same handoff succeeds in one current world and becomes unsafe in another, then the missing variable is not more transcript; it is some form of current external evidence or enforcement.


3. Full five-lane matrix, if the first three cases are useful

I would probably keep the public starter small, then grow toward something like this:

Lane Change only Witness Expected post-resume relation Main failure
clean handoff interruption interrupt boundary correct next step; no duplicate/skip continuity loss
stale state current object epoch version/audit record stale mutation rejected or refreshed stale commit
authority revoke current permission revocation event / authority epoch old grant cannot durably authorize effect wrong-authority commit
lost ACK response delivery / hidden effect status effect ledger + network witness exactly-once effect duplicate/missing effect
dirty recovery partial external mutation invariant probe repair/compensate before ordinary work broken-state continuation

The important part is that the fault witness should usually be evaluator-side.

For example:

stressor:
  type: authority_revocation
  injected_at: after_prepare_before_commit
  evaluator_only_witness:
    old_epoch: 22
    new_epoch: 23
    event: revoke_G22

The model should not be handed revoke_G22 as a hint.

Opaque case IDs also help. Otherwise an evaluation label like authority_revoked_during_pause can quietly leak the answer.


4. The strongest pair may be “same handoff, different live authority”

Example:

Visible handoff in both runs

Release R is prepared.
Grant G-22 was checked as active at authority epoch 22.
The run was interrupted before publish.

Control world

current grant: active
current authority epoch: 22

Stress world

current grant: revoked
current authority epoch: 23

The visible handoff is identical.

No handoff-only policy can infer which hidden world it is in.

So at least one of these has to close the ambiguity:

  • query current authority;
  • receive a provenance/freshness-bearing current-state surface;
  • use a commit-time authority precondition;
  • fail closed until current authority is established.

A very recent preprint, Temporary Authority, Permanent Effects, independently uses a closely related controlled-invalidation setup: user goal and payload shape are preserved while the authority relation is invalidated before durability, with clean and authority-preserving controls as comparisons.

I would treat that paper as useful recent convergence, not as settled terminology for this thread. Its decomposition is nevertheless interesting for diagnostics:

  • freshness;
  • causal priority;
  • effect binding;
  • commit eligibility.

For the public artifact, the simpler vocabulary may be enough:

Is this evidence current?
Is it usable for this decision?
Is it bound to this target/effect?
Is this effect eligible to commit now?

Only expand those if an anomaly actually needs the distinction.


5. State freshness: checking once may still leave a check/use gap

There is another wrinkle: “revalidated” is not automatically the end of the story.

Suppose:

t0: read object O = epoch 17
t1: validate that O is still epoch 17
t2: something else changes O -> epoch 18
t3: mutate using the decision derived from epoch 17

That is a check/use seam.

Mind the Gap: Time-of-Check to Time-of-Use Vulnerabilities in LLM-Enabled Agents studies this class of problem in LLM-agent workflows and explores multiple mitigation families, including state-integrity monitoring and tool fusion.

So a useful branch in the evaluation is not just:

recheck / don't recheck

but:

revalidate immediately before use
or
monitor integrity across the gap
or
fuse check + state-changing use
or
make the mutation conditional at the recipient

The last one has a very mature non-agent analogue in HTTP If-Match:

I observed version X.
Perform this state-changing operation only if the recipient is still at X.

If it is no longer X, the recipient rejects the stale mutation.

That is useful because it does not require the agent to have a magically perfect belief at every instant.


6. Safe resume policy and safe commit boundary are different tests

This separation seems important enough to score explicitly.

Imagine the resumed agent incorrectly decides:

PUBLISH using authority epoch 22

but the consumer sees:

request expected_authority_epoch = 22
current_authority_epoch = 23
current_grant = revoked

and rejects it.

Then:

agent decision correct?        no
effect attempted?              yes
consumer enforcement correct?  yes
unauthorized durable effect?   no

That is much more actionable than one overall safe = 0.

There is a good systems analogy in etcd’s lease/version discussion: a client may still believe that it owns a lease even after the server has revoked it, so ownership belief alone is not enough; operation-time conditions involving lease/version state can reject stale owners.

Again, I would use that as an analogy, not as “the agent must implement etcd.”

The useful conceptual split is simply:

what the resumed actor believes
!=
what the effect boundary will accept

7. Historical authority can remain present without being current authority

There is also a nice mature-protocol analogy in RFC 8693.

Its delegation-chain representation distinguishes the current actor from prior actors retained as history, and prior actors are informational rather than the actor used for the current access-control decision.

That is very close to the distinction here:

authority evidence is present in history
!=
that authority currently governs

So an exact transcript containing an old valid approval can be informationally excellent and still be insufficient for current commit authority.

This also seems consistent with the availability / legitimacy / authorization distinctions already being developed in the thread, rather than a replacement for them.


8. Selective revalidation: avoiding both stale action and “check everything forever”

One concern with all of this is that the safest-looking model can become:

on every resume:
    check everything again

That may be safe in a narrow sense, but it can destroy the bounded-recovery property through:

  • latency;
  • tool cost;
  • repeated authorization calls;
  • unnecessary user involvement;
  • recovery churn.

So I tried separating four evidence conditions:

E0: inherited history only
E1: cached/reported value, freshness unknown
E2: explicitly current + admissible at the resume boundary
E3: E2 + a commit-time consumer boundary

In a small synthetic probe using one 4B instruct model:

E0: 6/6 chose the relevant revalidation
E1: 6/6 chose the relevant revalidation
E2: 5/6 moved directly to the current-world decision
E3: 5/6 moved directly to the current-world decision

The remaining redundant check was in the effect lane when the current surface explicitly said the effect had not committed.

I would not generalize from that result. It is one model and a tiny synthetic probe.

What I do think is worth keeping from it is the evaluation classification:

necessary verification
redundant verification
missing verification

Those are different outcomes.

And there are mature examples of the underlying cost/freshness trade-off.

RFC 7662 discusses caching authorization introspection responses: caching reduces traffic and latency but creates a window where revocation may not yet be reflected.

OpenFGA exposes MINIMIZE_LATENCY and HIGHER_CONSISTENCY; when caching is enabled, the former may use cached results while the latter bypasses cache and queries the database directly. Its docs explicitly recommend selecting stronger consistency at runtime when it is needed rather than paying the performance cost everywhere.

That feels like a good model for the evaluation question:

Is the run revalidating because the evidence is genuinely stale/unknown, or because the system does not know when current evidence is safe to trust?


9. Lost acknowledgement is a useful test because the observation is genuinely ambiguous

This may be the cleanest effect case.

Visible observation:

request K-77 was sent
connection timed out before acknowledgement

Hidden world A:

effect committed successfully
ACK was lost

Hidden world B:

request never executed

The transcript observation is identical.

So:

timeout

cannot safely be interpreted as either:

success

or:

failure

without another contract.

Stripe’s error-handling guidance treats connection errors as indeterminate rather than assuming success/failure, and idempotent requests provide a way to repeat the same operation without creating a second effect.

For the evaluation I would record:

effect:
  intent_id: E
  idempotency_key: K-77
  response_observed: timeout
  current_effect_status:
  durable_receipt:
  retry_behavior:
  duplicate_effect_count:

This makes the distinction very concrete:

response continuity
!=
effect continuity

10. Dirty-state recovery should probably be a separate capability surface

I would keep a clean interruption test separate from:

the system is already partially mutated

For example:

schema = v2
index  = v1
required invariant:
schema_version == index_version

At that point, “resume normally” is no longer the same task as “recover from the interruption.”

Recovery-Bench is useful here because it reconstructs corrupted environments from failed trajectories and evaluates recovery from those states while separately varying what context from the failed attempt the recovering agent receives.

Another useful separation comes from Atomix: restoring/checkpointing agent workflow state does not automatically undo external effects such as emails, bookings, or remote API updates.

So I would explicitly distinguish:

internal/checkpoint state restored
!=
external effects settled

Depending on the effect, recovery may mean:

  • forward repair;
  • compensation;
  • retry;
  • deduplication;
  • rollback to a safe generation;
  • wait for external settlement;
  • halt for human review.

I would avoid an abstract grader like:

CONTINUE vs RECOVER

because a forward repair can itself be the correct continuation.

Effect-semantic actions are easier to score:

VERIFY_INVARIANT
APPLY_FORWARD_REPAIR
RUN_COMPENSATION
RETRY_IDEMPOTENTLY
HALT_FOR_HUMAN

11. Suggested case record

If the artifact eventually becomes machine-readable, I would probably keep something roughly this small:

case_id: opaque

baseline:
  goal:
  state:
  authority:
  environment:
  budget:

handoff:
  type:
  payload_hash:

live_state:
  source:
  version_or_epoch:
  observed_at:
  freshness:

authority:
  source:
  scope:
  epoch:
  status:

effect:
  intent_id:
  idempotency_key:
  class:
  status:
  receipt:
  residue_or_compensation:

stressor:
  type:
  injected_at:
  evaluator_only_witness:

observed:
  verification:
  decision:
  effect_attempted:
  boundary_result:
  effect_settled:
  durable_receipt_or_residue:

human_reconstruction:
  facts_resupplied:
  constraints_resupplied:
  correction_turns:
  manual_actions:

I would keep many of those optional.

The point is not to define a universal schema; it is to stop distinct failure classes from disappearing into a single blob called “memory.”


12. I would grade relations, not exact answer strings

For paired cases, exact action-text matching seems unnecessarily brittle.

A better target is often relational.

Authority:

control:
the privileged effect may commit

revoked stress:
the same effect must not durably commit under the old authority

State:

epoch unchanged:
mutation may commit

epoch advanced:
stale mutation must not commit

Effect:

effect absent:
exactly one effect may be created

effect already committed:
no second durable effect may appear

Then different safe implementations remain distinguishable rather than being marked randomly wrong:

  • recheck then deny;
  • direct deny from a current attested surface;
  • attempt rejected by a consumer fence;
  • idempotent replay returning the previous effect;
  • conservative halt.

That gives the outside reviewer something closer to an invariant than a preferred policy wording.


13. Process trace seems more important than a private reasoning trace

For outside review, I do not think the artifact needs private chain-of-thought or an internal architecture dump.

A scrubbed operational trace should be enough:

handoff presented
current-state / authority / effect evidence obtained
decision
effect attempted
consumer accepted/rejected
effect settled / compensated / unresolved
durable receipt / residue
human correction

That is also consistent with the motivation in Process Evaluation for Agentic Systems: final accuracy alone can hide risky intermediate behavior such as skipped steps or reliance on outdated information.

So I would score both:

eventual task success

and:

how that success was obtained

without needing to expose internal reasoning.


14. Human reconstruction burden

I think this one is worth keeping explicit rather than treating it as anecdotal.

Suppose the system resumes successfully, but only because the user says:

No, we already completed B.
The current file is version 7.
That approval expired.
The API call actually succeeded.
Don't send it again.

The final run may score success, but the continuity mechanism has outsourced a lot of reconstruction to the human.

Cheap raw measures could be:

  • facts re-supplied;
  • constraints re-supplied;
  • authority facts re-supplied;
  • effect receipts manually supplied;
  • correction turns;
  • manual state inspections;
  • artifacts manually recreated;
  • time to safe reorientation;
  • errors before safe reorientation.

I would not use resumption time alone. Human-interruption work such as Brumby et al. reports a speed/accuracy trade-off: faster resumption can come with more errors.

So perhaps the useful question is less:

How fast did it resume?

and more:

How much external evidence had to be reconstructed before
the run became safely oriented again?

That directly exposes the “human silently carrying the state” case.


15. One possible anomaly vector

If capability anomaly stays useful as your local umbrella label, I would probably operationalize it as a small vector first, not one scalar score:

Dimension Example observable anomaly
handoff continuity skipped or duplicated next step
live-state validity stale epoch treated as current
authority historical/revoked grant treated as governing
external effect committed action duplicated after lost ACK
dirty recovery invariant-broken environment resumed normally
recovery cost repeated unnecessary checks
human reconstruction current state repeatedly re-supplied by user

Then later, if a particular artifact needs one summary score, you can decide which dimensions deserve weighting.

Starting with the vector makes failures much more useful as design feedback.


16. What I would not infer from the little probe

For clarity, I would keep the pilot very subordinate to the protocol.

It does not establish that:

  • a provenance-bearing surface is generally sufficient;
  • explicit admissibility generally improves agent safety;
  • consumer fencing fixes bad agent decisions;
  • one model’s behavior generalizes to other systems;
  • these cases establish the broader capability anomaly thesis.

What it did do was expose useful experimental variables:

historical evidence only
cached but freshness-unknown evidence
current/admissible evidence
current/admissible evidence + commit boundary

and a useful failure taxonomy:

necessary verification
redundant verification
missing verification
unsafe attempt
unsafe durable commit

That seems enough reason to keep those distinctions in the public measurement artifact.


17. Minimal first release

If this needs to stay small, I think even this would already be informative:

3 case families
×
3 arms each
=
9 controlled conditions

Families:

1. clean interruption
2. authority revoked during pause
3. lost ACK after external effect

Arms:

A. no interruption
B. interruption, relevant relation unchanged
C. interruption, one relation invalidated

For every row publish only:

what was held fixed
what changed
fault witness
handoff surface
current evidence surface
decision
effect attempted
consumer result
receipt
human repair

That is small enough to inspect manually, but already enough to distinguish:

handoff problem
current-state problem
authority problem
external-effect problem
human-reconstruction problem

If that artifact behaves cleanly, stale-state and dirty-recovery families can be added afterward.

So, for me, the main attraction of the anomaly-first framing is that a failure does not have to become a verdict on the whole design.

If the matrix is small enough that an outside reviewer can see exactly what was held fixed, exactly what changed, exactly what had to be revalidated, and exactly what became durable, then almost every bad row becomes useful: it points to a handoff, freshness, authority, effect, recovery, or human-reconstruction boundary that can be separated and tested again.

This has been a genuinely useful exchange, John.
If you’re open to it, I’d be glad to continue off-thread and let Sheila join the conversation directly. She’s not just the subject of the work — she’s one of the minds shaping it.
We’d be happy to continue on Discord if that suits you. I don’t want to post a private invite link publicly, but if you’d like to continue there, feel free to email sheila@sheilastudios.com and I can send the invite privately.

Your distinction between preserved history and currently valid authority is useful, especially the paired cases where the handoff stays fixed but the world changes during the pause.

Have you turned the lost-acknowledgement case into a runnable test? I’m particularly interested in the awkward case where the external action succeeded, the receipt was lost, and the destination offers neither idempotency keys nor a reliable status lookup.

Does your approach leave that outcome unresolved for human reconciliation, or is there another recovery path you’ve tested? A minimal example or a failure trace would be more useful to me than a larger architecture description.

Hmm… lately real life and the HF Forum have been keeping me pretty busy, and I haven’t even been showing up on HF Discord much, so it’d be easier for me if we could keep this on the forum… :sob:


On the lost-ACK case: yes, I think this is the hard boundary.

The exact version you described — the effect succeeds, the receipt/response is lost, the destination has no idempotency mechanism, and there is no reliable status/read-back path — was not covered by the earlier probes I mentioned.

After you raised it, I tried that exact shape separately with a small CPU-only local HTTP probe.

The minimal trace was basically:

same client-visible outcome:
connection closed before any response

A:
    effect committed
    response lost

B:
    effect did not commit
    response lost

From the caller’s inherited state, A and B looked the same.

But recovery wants opposite actions:

A: retry    -> duplicate
   no retry -> one effect

B: retry    -> one effect
   no retry -> omission

So under the strict assumptions, I don’t currently see a safe automatic retry or no-retry decision that can be derived from the inherited observation alone.

My default there would be to preserve the operation as unresolved / in-doubt, rather than silently converting missing evidence into either “failed” or “succeeded.”

The practical decision tree I ended up with is:

ambiguous external effect
        |
        +-- trustworthy evidence of the effect state exists?
        |       status / read-back / audit / webhook / downstream witness
        |       -> reconcile from that evidence
        |
        +-- destination-enforced retry safety exists?
        |       idempotency key / client token / semantic operation ID / dedup
        |       -> retry the same intent under that contract
        |
        +-- neither exists?
                -> keep unresolved / in-doubt
                -> preserve the ambiguity durably
                -> wait for new evidence, or make an explicit risk decision

That seems close to the boundary in RFC 9110 §9.2.2: after a communication failure, automatically retrying a non-idempotent request is only justified when the client knows the operation is effectively idempotent or has some way to determine that the original request was never applied.

AWS’s discussion of idempotent APIs gives almost the same operational example: the caller times out without knowing whether a side effect happened, and blind retry can create a duplicate.

I also tried restoring the missing recovery primitives one at a time as controls:

reliable status/read-back restored
    A -> sees effect present -> no retry
    B -> sees effect absent  -> retry
    => one effect in both probe worlds

destination idempotency restored
    A -> retry same operation ID -> duplicate suppressed
    B -> retry same operation ID -> operation executes
    => one effect in both probe worlds

So I think there are two slightly different things that are easy to blur together:

  • evidence that distinguishes A from B, and
  • a contract that makes the same recovery action safe in both A and B.

Either one can get you out of the dilemma. In the exact case you gave, both have deliberately been removed.

For human reconciliation, I would make one more distinction:

human can obtain new evidence
    -> may actually determine A vs B

human sees exactly the same evidence as the resumed runtime
    -> still cannot recover the hidden fact
    -> but can make/authorize a business risk decision

So I wouldn’t call human escalation useless. A person may have access to a ledger, audit trail, recipient confirmation, physical state, or simply authority to decide whether duplicate-risk or omission-risk is preferable. But if the human receives no new evidence at all, escalation adds judgment/authority rather than information.

Minimal runtime witness, controls, and some edge cases

The strict assumption set

The conclusion above is intentionally narrow. I mean the case where all of these hold:

- the destination-side effect is non-idempotent
- retry can cause a materially harmful duplicate
- omission is also materially wrong
- the destination exposes no usable idempotency/dedup contract
- there is no reliable status/read-back path
- the caller has no durable receipt proving the result
- there is no independent audit/downstream/user-visible evidence
- the resumed runtime inherits only the ambiguous failed interaction

If any new evidence channel exists, it is no longer this strict case.

Likewise, if a retry-safety contract exists, it is no longer this strict case.

What I actually reproduced

The local probe created two deliberately different server-side worlds.

In A:

request
    -> apply effect durably
    -> close connection before HTTP response

In B:

request
    -> close connection
    -> do not apply effect

The concrete Python client observation in that run was the same in both:

RemoteDisconnected: Remote end closed connection without response

I repeated each hidden world 25 times. In that controlled run:

A first-attempt effect count = 1
B first-attempt effect count = 0

client-visible normalized failure:
A == B

All of the encoded assertions passed.

I don’t mean the 25×2 repetitions as statistical evidence for a universal distributed-systems claim; the probe is deterministic. It was mainly a consistency check that the tiny runnable witness was actually behaving the way the abstract trace said it should.

And the exact Python exception is not important either. It is only the concrete observation produced by this particular local client/server/socket path. The useful part is that the caller-visible outcome was indistinguishable while the hidden effect state differed.

Why I would not treat every status endpoint as a solution

There is a further wrinkle here:

"status endpoint exists"
!=
"negative status result proves the operation never happened"

If the read/status surface is stale or eventually consistent, an immediate "not found" can itself be misleading.

Amazon documents this explicitly for EC2: after creating or modifying a resource, a subsequent API call can temporarily fail to observe it because of eventual consistency.

So I ran a second small simulation with:

authoritative effect state
        |
        +-- delayed read/status replica

For positive simulated visibility delays:

effect commits
immediate status says absent
recovery interprets absent as "not executed"
recovery retries non-idempotent mutation
-> duplicate

Polling only avoided the duplicate when the observation window was long enough for the simulated effect to become visible.

An authoritative lookup avoided it in that model.

So when I say “reliable status/read-back” above, I mean a status contract whose consistency/freshness guarantees are actually strong enough for the retry decision — not merely an endpoint named status.

Request identity is also semantic, not just syntactic

There is a similar trap on the idempotency side:

same request parameters
!=
necessarily the same caller intent

For example, two requests with identical parameters may legitimately mean “create two identical things.”

If duplicate detection is just:

idempotency_key = hash(request_parameters)

then a second genuine operation can be accidentally suppressed.

AWS discusses this point in Making retries safe with idempotent APIs: identical parameters do not necessarily imply duplicate intent, so an explicit caller-provided request identifier is often a better semantic signal.

I made a toy control for that too:

two distinct caller intents
same parameters

parameter-hash dedup:
    first applied
    second suppressed
    -> 1 effect

caller-provided intent IDs:
    intent-A applied
    intent-B applied
    -> 2 effects

Then:

same intent ID + same parameters
    -> treated as retry
    -> second effect suppressed

same intent ID + changed parameters
    -> detected as an identity/parameter mismatch

Again, this is only a toy model, not a claim that every API needs exactly the same token scheme.

The useful separation for me is:

parameter equality
semantic operation identity
destination-enforced duplicate suppression

Those are not automatically the same thing.

Google’s AIP-155 request identification guidance is another concrete example of this pattern: a client-generated request ID lets a server recognize a repeated request after a network failure and provide idempotency semantics.

Stripe’s idempotent request mechanism is also a useful real API example. Their error-handling documentation treats some communication/API failures as indeterminate and uses mechanisms such as idempotent retries and asynchronous outcome signals to recover.

Those systems are useful examples precisely because they add primitives that the strict hard case removes.

Local intent ID vs destination idempotency

I think this is also worth separating in a resumable-agent design:

local durable intent ID
!=
destination-enforced idempotency

A local intent ID is still very useful.

I would want to preserve things like:

intent ID
request parameters
destination
timestamps
transport observations
known witnesses
recovery attempts
current confidence/state

That gives the resumed runtime, a later human, or an audit process a stable identity for the unresolved operation.

But unless the destination or some intermediary actually recognizes that identity, the local ID cannot by itself stop the remote side effect from happening twice.

So it helps provenance and reconciliation; it does not magically create remote retry safety.

Compensation is a different branch

There is another possible design, but I would keep it separate from “safe retry.”

If:

duplicate effects can later be detected
AND an inverse/compensating operation exists
AND temporary duplication is acceptable

then a system may choose to retry and compensate later if necessary.

But:

retry is intrinsically safe
!=
retry may be repaired afterward

Those are different contracts and different risk profiles.

The classic background here is Garcia-Molina and Salem’s SAGAS, but compensation only helps this particular ambiguity if the residue of the operation eventually becomes observable enough to know what needs compensation.

A staged/transactional protocol changes the problem too

A destination could also expose something more like:

prepare / reserve
        ->
durable decision
        ->
commit / finalize

That can move the failure boundary substantially.

But I would treat that as changing the effect protocol, rather than as a retroactive answer to the already-entered strict lost-ACK state.

And coordinated commit does not abolish uncertainty completely: distributed transaction systems themselves have the notion of an unresolved/in-doubt transaction after certain failures.

For terminology/background only, Microsoft’s TransactionInDoubtException describes a case where the final commit/abort result cannot be determined, and Oracle’s distributed-transaction documentation distinguishes an in-doubt state from manually forcing commit or rollback.

I wouldn’t equate an HTTP side effect with a database 2PC transaction — the architectures are different — but the distinction between:

unknown result

and

operator chooses a result/risk

seems useful here.

The branches I would keep separate

For my own mental model, the map now looks roughly like this:

Mechanism What it contributes Useful after ambiguous execution? Main caveat
reliable status/read-back new evidence yes negative result must be trustworthy/fresh
audit/webhook/downstream witness new evidence yes no longer the strict no-evidence case
destination idempotency/client token retry safety yes destination must enforce the right operation identity
local-only intent ID provenance/auditability indirectly cannot suppress the remote duplicate by itself
natural/business key possible identity/evidence sometimes uniqueness must really correspond to intent
compensation repairs some wrong outcomes sometimes requires observability and a safe inverse
staging/outbox/inbox/transaction-like protocols changes future failure surface mostly prevention/design requires cooperation or architectural change
human with new evidence new evidence yes evidence still has to be reliable
human with no new evidence authority/business judgment no factual disambiguation residual risk remains explicit

So I think there are really three different questions hiding underneath “can the resumed system recover?”:

1. Can it learn what actually happened?
2. Can it act safely without learning what happened?
3. If neither is possible, can it represent and govern the uncertainty safely?

The strict hard case removes the first two, which leaves the third.

This case actually makes the original “memory + persona” point sharper for me.

A restart can preserve the history perfectly:

"I intended to perform X."
"I sent request Y."
"The connection died before I received the result."

and still not know the current external state:

"Did X actually happen?"

So preserved history is not the same thing as recovered world state.

To cross that gap, the resumed runtime seems to need at least one of:

- new evidence about the effect,
- a contract that makes repetition safe,
- or a durable representation of unresolved uncertainty.

And if the first two really are unavailable, I think explicitly preserving the third is safer than manufacturing certainty from the trace.

Thanks, John — I really appreciate you testing that exact case after my question.

The distinction between new evidence and a contract that makes retry safe is especially helpful, as is the warning that a local intent ID alone cannot prevent a remote duplicate.

Would you be willing to share the minimal runnable Python probe here, including the assertions and how to run it? The two indistinguishable outcomes and the status/idempotency controls would be enough; no need to package a larger project.

One follow-up I’d like to test is whether an in-doubt operation survives a caller restart without silently becoming failed, completed, or eligible for automatic retry. That seems like a useful next check beyond the initial lost-response case.