Contents
  1. Execution responsibilities
    1. What the runtime promises
    2. Identify the work that continues
    3. Turning points in recoverable execution
  2. Retaining and reconstructing execution
    1. Make accepted state durable
    2. Checkpoint what resumption needs
      1. Coverage and granularity
    3. Resume state or replay history
      1. Code changes during execution
  3. Scheduling and accepting work
    1. Wake work without a live worker
    2. Reject stale worker results
  4. Recovery without repeated harm
    1. Bound retries and restarts
    2. Recover uncertain external effects
      1. The receiver defines safe repetition
      2. Recovery can create new work
  5. Limits and long-running control
    1. Preserve budgets and deadlines
    2. Stop owned work
      1. Children and cleanup
    3. Direct work across long waits
      1. Approval releases a particular action
  6. Artifacts, completion, and status
    1. Retain outputs beyond the worker
    2. Check the current outcome
      1. Failure must block the intended transition
    3. Report authoritative progress
  7. Verification and architecture choice
    1. Test interruption boundaries
    2. Choose sufficient execution machinery
  8. Check understanding
  9. Open questions
  10. Selected talks
  11. References
  12. Talk library
← All topics

Agent Harnesses: Keeping Agent Work Running Across Failures and Restarts

An agent’s model chooses actions; its harness makes those actions part of a managed execution. The runtime retains state, runs tools, tracks budgets, handles interruptions and reports progress. Long tasks may outlive a process, wait for a person or resume after a failure, so continuing correctly requires more than sending the conversation to the model again. This chapter explains the machinery that keeps work identifiable, bounded and recoverable.

Execution responsibilities

What the runtime promises

An agent selects actions from observations and retained information. Application code executes those actions and returns observations for the next choice, forming the loop explained in Agent Engineering. The harness supplies the software and configuration around that loop: tools, retained state, execution controls, and checks. Within it, the runtime manages when work runs and how its lifetime is controlled; it need not be a separate service. Here, a worker is a process that carries out assigned work. An evaluation harness serves a different purpose: it runs cases and assesses results rather than managing the agent's ongoing work.

Durable execution preserves enough accepted progress to continue after an interruption. Its value grows when restarting would discard substantial computation or repeat a long wait. Durability also introduces obligations: retained work must remain discoverable, resumption must respect earlier effects and limits, and completion must have a defined meaning. Samuel Colvin's durable-agent demonstration motivates this distinction through iterative tool use rather than a single request and response.

These responsibilities can share an implementation without becoming interchangeable.
ResponsibilityWhat it establishes
Decision-makingSelects a proposed next action; the choice can still be wrong.
Execution managementRetains progress and controls when work runs, waits, resumes, or stops.
AuthorizationDetermines whether the particular actor may perform the requested operation.
IsolationRestricts the resources and interfaces executed code can reach.
Outcome checkingEstablishes the properties actually tested or observed.

A generated tool call is an action request, not an executed effect; Structured Outputs and Tool Calling develops that boundary. A sandbox restricts execution but does not supply the task's permission policy or recovery logic. Anthropic's Managed Agents architecture illustrates a useful separation: a session event log survives outside the harness process, while the execution sandbox can be replaced independently. Reliable execution preserves and controls decisions; it does not establish that they were good decisions.

Identify the work that continues

Recovery needs identities that outlast a process. This chapter uses task for requested work, task attempt for one pursuit of it, operation for one logical action, and execution for a physical worker activation. These are application distinctions, not universal product field names. For example, Temporal's Workflow ID and Run ID distinguish a stable business identity from a particular run. A retry can create a new run, as can Continue-As-New, which continues the workflow in a fresh run. A Temporal Run ID therefore does not identify the worker activation defined here.

Consider one pending operation resumed after its worker stops. These example identifiers show continuity, not a prescribed schema.
IdentityBefore interruptionAfter resumptionMeaning
TaskT1T1The requested work is unchanged.
Task attemptA1A1The same pursuit continues.
Logical operationO1O1Recovery concerns the same intended action.
Worker executionE1E2A different physical activation performs recovery.

A new pursuit or experimental branch should be distinguishable from recovery. Likewise, a fresh network invocation can retain the same logical-operation identifier: identical parameters alone cannot establish whether a caller intended one action twice or two separate actions. Keep provider request IDs and queue delivery IDs as linked transport records. Conversation IDs group interactions; trace IDs correlate telemetry. They do not replace the identities used to authorize or accept work. Observability explains how to connect these records.

Execution condition and outcome also answer different questions. Runnable work is eligible to start; running work is active; waiting work depends on an event; terminal work will not continue under that attempt's contract. Its outcome can separately be succeeded, failed, cancelled, or unresolved. A terminal attempt can therefore retain an unresolved external operation rather than falsely recording that operation as failed.

Turning points in recoverable execution

Recoverable execution combines several systems traditions. Database recovery preserves committed records. Process supervision assigns another process responsibility for detecting failure and managing replacement. A workflow coordinates steps and their dependencies; persistent workflow systems retain that coordination when execution stops. Environment restoration preserves selected machine state. These different scopes explain why restarting a process, restoring files, and continuing an agent task are not the same operation.

These dates identify publications, project beginnings, or availability announcements—not universal invention dates.
DevelopmentDateContribution
ARIESMarch 1992Mohan and colleagues combined recovery logging and checkpoints for database transactions with concurrent updates and partial rollback.
Erlang/OTPProject begun in 1996Ericsson consolidated a reliable process-based software platform for the AXD301 project; supervision assigned responsibility for handling process failures.
Mentor-liteFebruary/March 2000Weissenfels and colleagues separated workflow interpretation, reliable communication, and database-backed recovery logging in a lightweight prototype.
Amazon Simple WorkflowFebruary 21, 2012AWS introduced managed coordination between activity workers and history-driven deciders, including retained state, task queues, signals, and timeouts.
Durable FunctionsMay 7, 2018Microsoft announced general availability of stateful serverless orchestration built on Durable Task Framework, including long waits and human interaction.
Trigger.dev v3September 17, 2024General availability brought a hosted task runtime with checkpoint-and-restore waits, queues, scheduling, and concurrency controls.

Persistent workflows addressed coordination that could not depend on one process remaining alive. Serverless orchestration carried that concern into short-lived function environments. Agents add variable action selection and valuable intermediate work, but still need the earlier distinctions. Mentor-lite even separated recovery logging from operator-facing history: information useful for inspection need not be sufficient to restart execution. These approaches coexist; their chronological order does not establish direct influence or replacement.

Retaining and reconstructing execution

Make accepted state durable

Authoritative execution state is the application-controlled record used to decide what may happen next. An execution journal retains the events or outcomes from which that state can be understood or reconstructed. The model's current input is a selected representation of retained information, not the complete record. Context Engineering owns that selection. A transcript saying that a file was produced does not establish that another worker can retrieve it.

A useful runtime record preserves the obligations needed for continuation, not just past conversation:

  • Accepted directionTask and attempt identity, accepted inputs and decisions, and state version.
  • Unfinished workLogical operations, pending dependencies, received results, and their dispositions.
  • Retained outputsResolvable artifact identities and producing-operation references.
  • Continuing controlsRetry use, remaining allowances, deadlines, approvals, cancellation, and terminal reason.

Acceptance is a state transition, not merely a successful computation. Related records in one database—for example, an accepted result, its operation status, and newly pending work—can commit in one transaction. That prevents observers from seeing only part of the transition. It does not include an unrelated remote API effect. State invariants and acceptance explain the underlying rule.

Acknowledge durable acceptance only after the promised storage boundary. PostgreSQL's write-ahead-log settings make this concrete: asynchronous commit can return success before recent records are safe against a server crash. Local flushing and standby confirmation provide different boundaries, with additional storage assumptions. Thus “transaction committed” must be interpreted using the configured acknowledgment contract, not as an unlimited promise against every failure.

In this conceptual arrangement, replacement execution reads accepted records and retained output bytes, not the former worker’s memory. The read request and returned records share one exchange; selected context is derived input. Persistence depends on the configured storage contract.

Checkpoint what resumption needs

A checkpoint is a durably recorded recovery boundary: it determines which saved progress a replacement worker can rely on. A continuation identifies unfinished computation and what should execute or be awaited next. For an approval-gated tool call, conversation history alone does not identify the pending call or whether approval arrived. SnapLogic's Agent Continuations prototype retains messages, a resume request identifying pending work, and approval-processing information. That record describes how to continue. The application must separately store it durably, authenticate the approval, and make any repeated external action safe.

Checkpoint coverage must match the program's continuation needs. LangGraph's checkpoint records, for example, include graph values, next nodes, identifiers, metadata, and pending tasks. Application allowances, output references, and control decisions are recoverable only if recorded. Nor does graph state automatically contain an arbitrary process's memory or the current state of an external service.

Suppose a worker receives an operation result. If it stops before committing that result, the replacement has only the earlier recovery boundary: the operation remains unconfirmed. If the result and next-work transition committed, the replacement can reuse them. If commitment happened but its acknowledgment was lost, recovery must inspect storage rather than infer absence. External actions taken during the unconfirmed interval need their own recovery rules.

Coverage and granularity

Recovery granularity and write timing are separate choices. Smaller recovery units reduce repeated work but create more persistence boundaries. Asynchronous writes permit execution to advance before recording finishes; synchronous writes wait. LangGraph's node-granularity guidance describes these tradeoffs without implying that an asynchronous checkpoint is already committed. ARIES supplies an older, complementary lesson: its checkpoints summarize recovery information while a log retains changes; the checkpoint does not replace the log.

Name what each saved representation covers. A conversation handoff reconstructs model input. A sandbox snapshot preserves specified environment state. A training checkpoint supports continued parameter optimization; Accelerate, for example, saves model, optimizer, random-generator, and gradient-scaler state. None substitutes for an application record of pending operations and accepted outcomes.

Resume state or replay history

Two common reconstruction methods differ in what they load. Explicit-state resumption reads accepted state and dispatches the next recorded work. History replay reruns workflow control code while substituting recorded outcomes for completed operations. In Colvin's Temporal demonstration, earlier model calls received stored results instead of contacting the model again. Recovering a response is not generating an identical replacement response.

Consider a retained response R1 from completed model operation M1, followed by tool operation O1 whose outcome is unconfirmed. Both reconstruction paths must preserve R1 and reach O1’s recovery policy.

Deterministic replay requires the orchestration code to produce commands compatible with its recorded history. A command might schedule a timer or invoke an activity, Temporal's unit of external or otherwise nondeterministic work whose outcome is recorded. Changing the order of those commands can break replay. Model calls and external queries belong inside activities so recovery can reuse their recorded results; the model itself need not generate deterministically. LangGraph's Functional API similarly places model calls, clock reads, randomness, and side effects inside persisted tasks. Ordinary entrypoint code runs again, while completed task results are restored.

Recover R1, then reach O1’s recovery boundary

Recover R1, then reach O1’s recovery boundaryExplicit state loads accepted response R1 for completed model operation M1 and dispatches the saved next work. Replay loads history, reruns compatible control code, and reads recorded R1 at M1 without contacting the model. Both reach recovery policy for the same unconfirmed tool operation O1.Explicit-state resumptionHistory replayAccepted stateM1 → R1 · next work: O1Recorded historyM1 → R1 · O1 unconfirmedRead R1 andnext-work descriptionLoad R1Resume from saved phaseLoad historyRerun compatibleorchestration control codeControl reachescompleted M1 boundaryM1 returns recorded R1No model contactRead R1from historyDispatch O1 recoveryfrom saved next workContinue control to O1O1 recovery policy · same unconfirmed operationMissing confirmation does not establish that repetition is safe.Solid arrows: control progression. Dashed arrows: reads of recorded data.
Both paths recover M1’s recorded response R1; neither generates it again. Explicit state resumes the saved phase, while replay reruns compatible control code. Unconfirmed O1 still needs its own recovery policy.

Code changes during execution

Persisted execution becomes an interface to future code. Temporal's Worker Versioning can pin workflows to a deployment version while replacing individual workers; operators must retain suitable versions for unfinished work. Auto-Upgrade instead requires replay compatibility. LangGraph documents a different default: existing threads resume on the latest graph. Removed node names or incompatible state schemas can prevent recovery. Even a technically loadable checkpoint can encounter changed business rules. Choose a supported compatibility strategy, explicitly transform state where appropriate, or refuse an unsafe resume.

Scheduling and accepting work

Wake work without a live worker

Scheduling selects eligible work for execution. Suspension retains a continuation while releasing active worker resources. Eligibility can depend on a persisted timer becoming due, a callback arriving, or another operation producing a result. The durable object is the waiting obligation, not a process-local sleep. Temporal's activity queues illustrate how apparently sequential orchestration can dispatch work to replaceable workers.

When state and pending work share one transactional database, workers can discover committed work there. A separate queue introduces a dual-write gap: committing state and then publishing a message can lose dispatch if the publisher crashes between them. A transactional outbox stores outgoing intent alongside the state change in one transaction. A relay later publishes committed entries. Recovery can repeat delivery, so consumers must handle duplicates; the outbox does not create exactly-once remote execution.

Commit state and dispatch intent together

Commit state and dispatch intent togetherOne database transaction encloses accepted task state and outgoing outbox intent. A relay outside that transaction reads only committed intent and publishes to a separate queue. Queue delivery may repeat. Consumer acceptance also reads current state; no database transaction encloses queue delivery or external consumer effects.One database transactionAccepted task statePhase · version · pending O1Committed outbox intentDispatch operation O1RelayResumable publisherRead committedintent onlySeparate queueOutside transactionPublish O1Deliver O1May repeatConsumer acceptanceCheck identity and current stateRead current acceptance conditionsThe local transaction does not include queue delivery or arbitrary external effects.
A relay reads committed outbox intent after a publisher failure. Queue delivery can repeat; consumer acceptance must check operation identity and current state. Those checks do not by themselves deduplicate arbitrary external effects.

Wait registration also races with event arrival. Azure's durable external-event handling buffers events that arrive before an existing instance starts listening, but discards events addressed to a nonexistent instance. It recommends event identifiers for duplicate handling and a durable timer to bound waiting. A custom design needs an equally explicit rule for early, duplicate, late, and unmatched events; saving a continuation alone does not resolve those races.

Eligibility is not capacity. Concurrency slots limit active work; queue capacity limits waiting work; backpressure slows or rejects admission when downstream capacity is insufficient. Google SRE's queue guidance explains why buffering cannot absorb sustained overload indefinitely. Check remaining task deadlines before dispatch rather than starting work that no longer has a useful completion window.

Reject stale worker results

A lease grants temporary permission to work; expiry does not prove the worker stopped. Amazon SQS likewise permits duplicate delivery even during its visibility timeout.

A fencing token identifies an ownership generation. Mike Burrows's 2006 Chubby paper describes recipients checking sequencers to reject obsolete lock holders. A harness can enforce this at acceptance; protecting external effects requires the receiving service to participate too.

Combine ownership with optimistic acceptance. In a single-row design, atomically accept only when the operation is pending, the ownership generation matches, and the state version is still the one used by the worker. PostgreSQL rechecks an UPDATE predicate after a concurrent update. Zero affected rows means rejection, not permission to overwrite the newer record. Retain rejected observations separately when useful for diagnosis.

For example, A begins O1 under generation 7. Reassignment gives B generation 8. After B's completion commits, A's late result cannot replace it.

Acceptance checks current authority

Example

Reassignment makes A stale before B commits.

Once reassignment sets the current generation to 8, A’s generation 7 fails regardless of arrival order. B still needs a matching state version and pending O1. This is local result acceptance; protecting remote mutations requires a cooperating receiver.
Read the diagram as text
  • O1.
  • A: generation 7.
  • B: generation 8.
  • Receiving-side acceptance gate. Atomically check current ownership generation, expected state version, and pending operation status before committing.
  • B accepted.
  • A rejected.
  • O1A: generation 7: Initial assignment.
  • O1B: generation 8: Reassignment: current generation becomes 8.
  • A: generation 7Receiving-side acceptance gate: Submit A's result.
  • B: generation 8Receiving-side acceptance gate: Submit B's result.
  • Receiving-side acceptance gateB accepted: Generation and version match; O1 pending.
  • Receiving-side acceptance gateA rejected: Generation 7 does not match 8.

Recovery without repeated harm

Bound retries and restarts

A retry invokes the same logical operation again. It is appropriate only when repetition is permitted and another invocation might help. An agent issuing slightly different invalid requests is doing something else: attempting strategy repair, possibly without progress. Nishant Gupta's runaway-retry account illustrates how repeated tool rejection can consume resources unless surrounding software imposes a stopping boundary.

Classify the operation's meaning before choosing its recovery path.
Known conditionRuntime response
Transient failure; repetition is safeRetry within retained attempt and time limits.
Invalid input or denied authorityReject unchanged repetition; return the actionable failure.
External outcome unknownUse the receiver's recovery contract or reconcile.
Action completed but did not solve the taskReturn observations for a new decision, not a transport retry.

Exponential backoff increases delays between retries; jitter randomizes delays to avoid synchronized retry waves. Bound attempts and total elapsed time, and choose the layer that owns repetition. Nested policies multiply: three total attempts at each of three layers can produce 27 deepest calls. Backoff reduces pressure but does not make duplicate mutations safe. Persist used attempts and the original deadline so replacing a worker cannot replenish the allowance.

Process supervision supplies a related boundary. Erlang/OTP's supervision tree assigns processes responsibility for their children; restart-intensity limits escalate repeated failure instead of restarting indefinitely. This bounds restart responsibility, not task semantics. A restarted process still needs retained state and safe effect recovery. Keep decisions about changing strategy with Agent Engineering, and let the runtime enforce the limits around those decisions.

Recover uncertain external effects

The most consequential recovery gap lies between an external effect and its recorded acknowledgment. An activity can change a remote system and lose its worker before reporting completion. A workflow journal then lacks the successful result even though the effect occurred. Temporal explicitly documents this effect/reporting gap: recorded completions can be reused, but unrecorded completion can lead to another invocation.

Idempotency means that repeated execution of one logical operation adds no further effect; safe repetition requires receiver enforcement. Before dispatch, retain intent, parameters, and an operation key. Append invocation attempts and receipts to that record. The receiver must coordinate duplicate recognition with its mutation and reject the same key paired with different intent. A separate check-then-write is insufficient under concurrency.

The receiver defines safe repetition

Receiver contracts differ. Stripe stores the first executing request's status and body, including failures. Parameter mismatches are rejected; validation failures and concurrent conflicts before execution do not create a saved result. Keys may be pruned once at least 24 hours old, after which reuse starts a new request. Thus an in-progress conflict, a cached failure, and an expired key are different recovery conditions. Never change the key merely to bypass an ambiguous result.

Reconciliation checks authoritative external state to resolve what happened. Retain provider handles and local operation references so later responses or events can be matched correctly. Stripe's low-level error guidance distinguishes an API response from the eventual outcome: an HTTP 500 can remain indeterminate, with partial mutations later reconciled and reported through events. If neither safe repetition nor authoritative lookup is available, preserve an unresolved outcome and assign recovery responsibility instead of guessing.

The depicted effect occurred while the caller lacks confirmation. Repetition within a valid receiver contract or authoritative lookup may resolve the outcome; otherwise it remains unresolved. The two persistence regions do not share a transaction, and recovery does not rewind the effect.

Recovery can create new work

Compensation is a new operation addressing a known completed effect. Hector Garcia-Molina and Kenneth Salem's Sagas, 1987, decomposed long transactions into smaller commits with application-defined compensations. Recovery could continue forward or compensate earlier work. Compensation does not erase history: other work may have observed the changes, some actions are irreversible, and compensation itself can fail. Give reconciliation and compensation durable identities, bounded attempts, authorization, and explicit unresolved dispositions just like other work.

Limits and long-running control

Preserve budgets and deadlines

A budget limits an aggregate quantity; a deadline names the latest permitted time for a specified boundary. A task attempt can have limits on model requests, tool invocations, elapsed duration, concurrency, and metered usage. Per-call ceilings do not bound the whole attempt. Model tokens are vocabulary units used to represent text, not necessarily words; Tokenization explains request accounting.

Admission control decides whether new work may start. Retrospective accounting records what it consumed. Pydantic AI's spend-limit documentation illustrates the gap: concurrent requests can pass admission before either records usage, and a request crossing the threshold can finish. A reservation holds part of the shared allowance for work before it starts, so other calls cannot also claim that allowance. Recovery must preserve both outstanding reservations and recorded consumption, with duplicate accounting prevented, rather than let a replacement worker start from zero.

For an example allowance of 10 units, two calls each requiring a six-unit reservation expose the concurrency problem.
Admission designFirst callSecond callConsequence
Independent balance readsReads 10; startsAlso reads 10; startsTwelve units are admitted against ten.
Atomic shared reservationReserves 6; leaves 4Cannot reserve 6Outstanding commitments participate in admission.

After reserved work finishes, settlement replaces its hold with observed consumption and releases any justified remainder. TigerBeetle's two-phase transfers implement the accounting distinction between pending and posted amounts; applying it to an agent budget requires the harness to track actual usage. If a response is lost, consumption may remain unknown. Keep that possible cost distinct from confirmed usage and other outstanding reservations: expiry of a hold does not prove the dispatched request was free. A ledger cannot impose a hard external spending cap unless downstream execution has enforceable bounds.

Preserve the attempt's allowance across workers and allocate child work from it rather than granting each child an independent fresh limit. Attempts, backoff, and local overhead must fit the remaining deadline. Propagate the job's deadline downstream; a durable job may intentionally outlive its initiating HTTP request. Keep bounded capacity for checks and cleanup, so ordinary generation cannot consume everything needed to finish responsibly. Choosing how much reasoning deserves that allowance belongs in Reasoning and Test-Time Compute.

Stop owned work

Cancellation requests that remaining work stop. An acknowledgment confirms acceptance of that request. Quiescence means no work covered by the stop contract remains active. These boundaries underpin honest interface semantics. Persist stop intent, enforce it before admitting new covered work, and continue shutdown after worker replacement. A timeout or accepted cancel request alone is not confirmation that execution ended.

Cancellation is often cooperative: running code must observe it. Temporal activities can receive cancellation through heartbeats and must respond through supported mechanisms such as an abort signal; throttled heartbeats can delay delivery. Configure both an individual-attempt timeout and a total duration covering retries. Then distinguish dispatch stopped, cancellation delivered, and worker exit instead of compressing them into one Boolean.

Children and cleanup

Structured concurrency ties child lifetimes to an owning scope. Trio's nurseries wait for child tasks to exit and cancel siblings after an unhandled child failure; bounded shielded cleanup can complete despite outer cancellation. This is an in-process ownership mechanism, not durable recovery. Intentionally detached work needs a separate durable owner and control handle, otherwise it becomes unaccounted-for background work.

For unresponsive local work, an execution service can escalate from cooperative shutdown to forced termination. Erlang supervisors illustrate a finite shutdown interval followed by killing the child, with care required for descendant lifetimes. Check the actual engine's scope: Azure explicitly documents that terminating an orchestration does not terminate its activities or sub-orchestrations. Sandbox lifecycle management covers environment teardown.

Completion can win a race with cancellation, and remote work may be impossible to stop. gRPC's cancellation contract explicitly does not roll back changes already made. Retain those effects and uncertain outcomes while stopping further task work. Reconciliation or an authorized compensation may remain necessary even after local execution is quiescent.

Stop the covered execution; retain the remote effect

Stop the covered execution; retain the remote effectOne explicit stop scope owns task T1 and cooperative child C1. Cancellation is requested, then durable stop is accepted and dispatch closes. C1 remains active until its exit is observed. Quiescence is confirmed only afterward. A previously committed remote effect is outside this scope and persists beyond quiescence.Defined stop contract: T1 and cooperative child C1CancellationrequestedDurable stop acceptedDispatch closedC1 exitobservedCovered scopequiescentTask T1Child C1ownsNo new covered dispatch after acceptanceC1 remains active while stoppingExited · identity retainedOutside the stop scope: earlier committed remote effectPersists beyond local quiescenceLeft to right shows event order, not elapsed duration.
This explicit stop contract covers T1 and cooperative child C1. Durable acceptance closes dispatch while C1 continues stopping. Quiescence follows observed child exit and does not reverse the earlier external effect.

Direct work across long waits

A signal is an external event addressed to retained execution. Pause requests a supported stopping boundary while preserving continuation; resume makes that continuation eligible again. Steering accepts changed direction into task state rather than editing a live call stack. Commands need identities and retained dispositions, with acceptance coordinated against results, cancellation, and terminal state.

Distinguish receipt from execution of a command. In Temporal's message-passing interface, a Signal returns after server acceptance, before workflow delivery. Updates distinguish validated acceptance from handler completion and expose a result handle. Async handlers can interleave at awaits; the main workflow can also finish before handlers do. Coordination and an explicit handler-completion boundary matter even when messaging is durable.

Approval releases a particular action

An approval binding associates a human decision with one retained action: actor, represented requester, scope, operation identity, parameters or proposal version, and validity period. Vinoth Govindarajan's scoped-approval account emphasizes preserving that association through callbacks and retries. The continuation makes waiting possible; it does not make an incoming approval trustworthy.

At release, match the decision to the pending action, reject denial or expiry, and recheck current authorization. Changed parameters must not inherit approval for an earlier proposal. OWASP's transaction-authorization guidance supports operation-specific authorization, limited validity, and a final execution gate. The runtime implements these boundaries; Agent Engineering owns deciding which human intervention is needed.

Long waits also need an administrative ending. Retain the pending action and control history when the client disconnects. Bound the wait with a durable timeout. If an approval expires or new code cannot interpret the continuation, expose a blocked or expired disposition for an operator to renew, transform through a supported path, or terminate. Do not turn an unusable continuation into an endless wake-and-retry loop.

Artifacts, completion, and status

Retain outputs beyond the worker

An artifact is a produced item the task retains or delivers: a file, patch, report, or structured result. A manifest lists outputs and their identities. Record immutable content identity, storage location, and the producing operation so another worker can retrieve the same item. A content digest is derived from content; provenance identifies its production history. SLSA's provenance specification supplies useful fields for output subjects, dependencies, builder identity, and invocation identity. These establish lineage, not correctness or delivery.

Separate scratch output, partial upload, complete stored content, and accepted output reference. S3 multipart uploads illustrate the first boundary: stored parts are not yet a completed object and continue consuming storage until completed or aborted. A complete object can then exist without a corresponding accepted manifest entry if registration fails. Conversely, recording a local pathname does not make the referenced bytes available outside the worker.

A practical publication design stages content under a stable identity, verifies successful storage, then conditionally accepts its reference for the expected task state. S3's conditional writes can prevent overwriting an existing key or require a matching current ETag. They guard that storage operation, not an unrelated task database, and an ETag is not a universal content digest. Recover upload-to-registration failures by reconciling staged objects with accepted references; delete true orphans only under a retention policy that excludes still-owned work.

Collect required outputs before destroying their environment, and keep durable identities separate from temporary download access. Filesystem exports cover the secure transfer boundary. Cleanup also has a postcondition: S3 warns that in-flight part uploads can finish after an abort, so repeated aborts and an empty ListParts result may be needed to confirm removal. Accepted cleanup requests are not the same as removed resources.

Check the current outcome

A completion check evaluates a required property of an identified result or authoritative external state. That property is a postcondition, developed in Establish the achieved outcome. A finished model turn, empty to-do list, exited process, and available file each establish something narrower. The runtime must arrange the checks promised by the task; Evals and Benchmarks explains how to choose their methods.

Make checking recoverable: retain artifact identity, requirement, checker identity and version, result, and failure disposition. Guard success against the current task version so artifact replacement cannot race with acceptance.

GitHub's required-status-check rules require checks on the latest applicable commit: the test-merge commit when it has a status, otherwise the head. Protection can require a particular GitHub App. Skipped or neutral conclusions can satisfy the gate, so inspect which tests actually ran.

Failure must block the intended transition

The checker's failure contract is equally important. Claude Code's TaskCompleted hook can block completion with exit code 2. Ordinary exit code 1 without a valid blocking decision is nonblocking for most hook events; a hook that cannot start can also leave execution proceeding. Registering a test command therefore does not establish an enforced gate. Exercise failed, unavailable, and timed-out checks, and preserve their distinct outcomes.

Require only the boundaries the task promises. Preparing a report can end with a retained, checked artifact; delivering it adds a delivery obligation. Govindarajan recounts a message tool reporting success while the interface displayed nothing, showing why internal acceptance and user-visible availability need separate receipts. Preserve usable partial artifacts when execution ends unsuccessfully, but label their verification and delivery status explicitly.

Report authoritative progress

Expose a stable handle that clients can query independently of the original connection. Report accepted phase, pending dependency, retained progress, last worker contact, resource use, and terminal reason. Google's long-running Operations interface separates progress metadata, completion, and result or error. Its cancellation is asynchronous, and deleting the operation expresses loss of interest rather than stopping execution.

Status should preserve the meaning of each observation.
ObservationWhat it establishesWhat it does not establish
HeartbeatRecent worker contactUseful progress or task success
Committed checkpointRetained progress within its coverageEvery later effect or local file
Tool receiptThe receiving component's stated outcomeEvery downstream or user-visible outcome
Current passing checkThe tested property of its identified subjectUntested correctness or promised delivery

An event cursor identifies a position from which progress delivery can resume. The HTML Server-sent events standard sends Last-Event-ID when reconnecting after identified events. That supplies a transport mechanism, not event retention or durable execution. Workflow DevKit's streaming walkthrough similarly associates a stream with a run ID and position rather than starting the agent again on reconnection.

Include state versions or observation times so clients can recognize stale snapshots, and handle repeated notifications without repeating accepted transitions. Missing heartbeats indicate missing contact, not proven failure. When the remaining work is unknown, show completed stages and the current dependency instead of an invented percentage. Link task, attempt, operation, and execution identities into traces, but keep sampled telemetry separate from the records that authorize continuation.

Verification and architecture choice

Test interruption boundaries

A recovery test should establish what survives an interruption, not merely show that a process restarted. Safety properties forbid outcomes such as accepting a stale result. Liveness properties require eventual progress under stated conditions, such as restored storage and available workers. FoundationDB's simulation-testing account provides a useful method: control network, disk, time, and randomness, inject faults, and assert system invariants and recovery under recoverable conditions.

These are proposed harness tests. Each targets a specific obligation taught in the preceding sections.
Controlled interruption or raceRequired observation
Worker stops around acceptanceAcknowledged durable work remains discoverable; uncommitted proposals do not become accepted.
External effect succeeds; response is lostRecovery retains the operation identity and follows the receiver's contract.
Duplicate delivery; old worker returns lateNo second accepted transition and no stale overwrite.
Callback arrives before the wait beginsThe documented buffering or rejection behavior occurs without unexplained loss.
Worker restarts after usage is recordedSpent allowance is neither reset nor counted twice.
Cancellation races with dispatchAccepted stop state prevents subsequent covered admission; in-flight work is accounted for.
New code interprets saved executionIncompatibility is detected rather than silently changing continuation.
Artifact changes or checker cannot runStale or unavailable checks cannot authorize success.

Use controlled dependencies for model responses, clocks, queue delivery, and external outcomes. Then exercise real storage and service boundaries in integration tests, especially immediately before and after commitment. Explicit transition coverage helps locate untested paths, but it cannot establish that the transition model or tool effects are correct.

Temporal's testing tools can skip timer waits and replay representative histories from open and closed executions. Time skipping pauses while activities run; successful history replay checks compatibility, not new external effects. For architecture comparisons, measure recovery delay, repeated invocations, and retained work separately. Colvin's retry demonstration also encountered an unexplained stall, a reminder that a successful recovery path does not explain every failed path.

Choose sufficient execution machinery

Choose execution machinery from the required lifetime and failure contract. Short, safely repeatable work may need only a bounded in-process harness. Background work needs an addressable owner independent of the client. Work that must survive worker loss needs persisted progress and recoverable wakeups. A long-lived process or graph-shaped API does not establish those properties: LangGraph's persistence documentation explicitly distinguishes an in-memory saver from a persistent backend.

These are implementation families, not product guarantees. Verify each supplied mechanism against the task contract.
ImplementationWhat it can simplifyWhat remains to establish
Bounded in-process harnessDirect control flow and local cancellationAcceptable restart loss, safe effects, limits, and completion
Long-lived workerBackground execution independent of a request handlerPersistence, recovery, durable waits, and ownership after replacement
Persisted state machine with workersExplicit phases, transactional acceptance, inspectable pending workDispatch recovery, duplicate handling, timers, ownership, and state evolution
History-based workflow engineRecorded outcomes, durable waits, configured retries, and worker replacementReplay-compatible code, version operations, and application-specific controls

Across all four, assign responsibility for uncertain effects, shared allowances, cancellation scope, artifact retention, and completion checks. An engine may supply useful primitives without supplying the finished application contract. Persistence writes, history growth, supported code versions, and recovery operations are real maintenance costs. Prefer existing machinery when it removes more correctness-critical code than it adds operational complexity.

Environment restoration is another dimension. Trigger.dev's January 2024 v3 proposal contrasted replaying cached chunks with provider-hosted execution that saved containers at explicit waits. This can preserve valuable machine state, but does not replace task identity or external-effect recovery. Eric Allam's replay-versus-snapshot account makes the distinction concrete: a repository, installed packages, in-memory data, and a running development server are not merely conversation history.

Start by stating what may be lost, what must remain discoverable, which effects may repeat, and which controls must survive. Map each obligation to an implementation and an operating owner. Build the smallest complete path through acceptance, execution, recovery, and checked completion, then test its interruption boundaries. Add machinery when an uncovered obligation requires it—not because orchestration complexity looks like reliability.

Open questions

  1. Portable recovery across changing harnesses remains difficult because saved state can be technically readable while tool meanings, business rules, or external permissions have changed. Progress would mean explicit compatibility contracts and representative-history tests that distinguish safe continuation from a new pursuit.

  2. Strict aggregate spending control remains difficult when concurrent providers report usage late or incompletely. Local reservations help, but cannot constrain an unbounded external request. Progress requires enforceable downstream ceilings and reconciliation of outstanding liability without resetting allowances after recovery.

  3. Cross-service stopping remains incomplete when an orchestrator can terminate while external work continues. Progress would provide inspectable ownership and shutdown contracts spanning descendants and remote operations, while preserving unresolved effects instead of reporting premature quiescence.

Follow the curated reading path through the speakers and demonstrations behind this entry.

17 min

AI Engineer World's Fair 2026 · 2026

Your Agents Need a Save Button

Hamza Tahir

Cited in this entry

Explores linking checkpoints to code, environments, and artifacts, then comparing downstream decisions after a controlled tool-policy change.

Watch talk

Explore more talks

The rest of the library, beyond the curated path. Cited talks support this entry; reviewed transcripts were processed in full. Metadata candidates have not been reviewed as sources or verified as topic members.

127 matching talks

Every catalogued talk on this subject: Developer workflows and testing

TalkSpeakerEventYear
Ryan Lopopolo, Vibhu SapraAI Engineer Europe 20262026
Aditya BhargavaAI Engineer World's Fair 20262026
Dex HorthyAI Engineer World's Fair 20262026
Codex, Behind the Harness

Transcript reviewed

Dominik KundelAI Engineer World's Fair 20262026
Harnesses in AI: A Deep Dive

Cited in this entry

Tejas KumarAI Engineer Europe 20262026
AI Engineering 101

Transcript reviewed

Noah HeinAI Engineer Summit 20232023
Nico AlbaneseAI Engineer Summit 20252025
Jim BennettAI Engineer World's Fair 20252025
Chau TranAI Engineer World's Fair 20252025
Yohei NakajimaAI Engineer World's Fair 20262026
Yuval BelferAI Engineer World's Fair 20252025
Mahesh MuragAI Engineer Summit 20252025
Jon PeckAI Engineer World's Fair 20252025
The Future of MCP

Transcript reviewed

David Soria ParraAI Engineer Europe 20262026
Anton TroynikovAI Engineer Summit 20232023
Louis-François Bouchard, Omar Solano, Samridhi VaidAI Engineer World's Fair 20262026
Sally-Ann DeLuciaAI Engineer Europe 20262026
Cornelia DavisAI Engineer Code 20252025
Simon WillisonAI Engineer Summit 20232023
Fouad MatinAI Engineer World's Fair 20252025
Security Firewall for Agents

Transcript reviewed

Ryan DahlAI Engineer World's Fair 20262026
Sandipan BhaumikAI Engineer Europe 20262026
Will BrownAI Engineer World's Fair 20262026
Rishi DesaiAI Engineer World's Fair 20262026
Nick HeinerAI Engineer World's Fair 20262026
LLM Evals That Work IRL

Transcript reviewed

Aparna Dhinkaran, Aparna DhinakaranAI Engineer World's Fair 20242024
Nick Ung, Akshay SharmaAI Engineer World's Fair 20262026
Mahmoud MabroukAI Engineer Europe 20262026
Sarmad QadriAI Engineer World's Fair 20252025
Adam TerlsonAI Engineer Summit 20252025
Zhou YuAI Engineer Summit 20252025
Tom SmokerAI Engineer World's Fair 20252025
Jesse HuAI Engineer Code 20252025
Ronak MaldeAI Engineer World's Fair 20262026
Mason EggerAI Engineer World's Fair 20252025
Misha Kaletsky, Jonas TemplesteinAI Engineer Europe 20262026
Drasko ProfirovicAI Engineer World's Fair 20262026
Abhishek BhardwajAI Engineer World's Fair 20262026
Brendan RappazzoAI Engineer World's Fair 20262026
KP Sawhney, Ian BallantyneAI Engineer Europe 20262026
Dat NgoAI Engineer Europe 20262026
Laurie VossAI Engineer Europe 20262026
Chintan Agrawal, Daniel WirjoAI Engineer World's Fair 20262026
Brian JohnAI Engineer Code 20252025
Dominik KundelAI Engineer World's Fair 20252025
Nishant GuptaAI Engineer World's Fair 20262026
Cornelia DavisAI Engineer World's Fair 20262026
Gagan Bhat, Isabella Kai HeAI Engineer World's Fair 20262026
Preeti SomalAI Engineer World's Fair 20252025
Kam LasaterAI Engineer Summit 20252025
Jeremiah LowinAI Engineer Code 20252025
Ilan BigioAI Engineer Summit 20252025
Peter WielanderAI Engineer Code 20252025
Tisha Chawla, Susheem KoulAI Engineer World's Fair 20262026
Keegan McCallumAI Engineer World's Fair 20252025
Zack ProserAI Engineer Europe 20262026
Charles PackerAI Engineer Summit 20252025
Jason LiuAI Engineer World's Fair 20262026
Rajiv ChandegraAI Engineer World's Fair 20262026
Soheil FeiziAI Engineer World's Fair 20262026
Sam BhagwatAI Engineer World's Fair 20262026
Vasant KearneyAI Engineer World's Fair 20262026
Stefania DrugaAI Engineer World's Fair 20262026
Yogendra MirajeAI Engineer World's Fair 20262026
Dmitry PetrovAI Engineer World's Fair 20262026
Mithun HunsurAI Engineer Summit 20232023
Taylor Jordan SmithAI Engineer World's Fair 20252025
A Genius With Amnesia

Metadata candidate

Victor SavkinAI Engineer World's Fair 20262026
Barry Zhang, Mahesh MuragAI Engineer Code 20252025
Nicholas Kang, Michael AaronAI Engineer Europe 20262026
Nick Nisi, Lizzie SiegleAI Engineer World's Fair 20252025
Dax RaadAI Engineer Code 20252025
AI SDK v6

Metadata candidate

Nico AlbaneseAI Engineer Europe 20262026
Paul Klein IVAI Engineer World's Fair 20262026
Rita KozlovAI Engineer World's Fair 20252025
Stephen ChinAI Engineer Europe 20262026
Mahesh SathiamoorthyAI Engineer World's Fair 20262026
Max Kanat-AlexanderAI Engineer Code 20252025
Ornella Bahidika, Joel AllouAI Engineer World's Fair 20262026
Philipp SchmidAI Engineer World's Fair 20262026
Ara KhanAI Engineer Europe 20262026
Omri Bruchim, Tomer AstAI Engineer World's Fair 20262026
Alex CheemaAI Engineer Europe 20262026
Future-Proof Coding Agents

Metadata candidate

Bill Chen, Brian FiocaAI Engineer Code 20252025
Kenton VardaAI Engineer World's Fair 20262026
Gateways are All You Need

Metadata candidate

Karan SampathAI Engineer Europe 20262026
Hailong ZhangAI Engineer Summit 20252025
Ash Prabaker, Andrew WilsonAI Engineer Europe 20262026
Hanna Lichtenberg, Aamir ShakirAI Engineer World's Fair 20262026
Mahmoud AbdelwahabAI Engineer Code 20252025
Raymond FengAI Engineer World's Fair 20262026
Carter Abdallah, Vincent Weisser, Lucas Atkins, Chris AlexiukAI Engineer World's Fair 20262026
Mark Bain, Vasilije Markovic, Daniel Chalef, Alex GilmoreAI Engineer World's Fair 20252025
Arjun SinghAI Engineer World's Fair 20262026
Notion's Token Town

Metadata candidate

Sarah SachsAI Engineer World's Fair 20262026
Omar KhattabAI Engineer World's Fair 20252025
Antje BarthAI Engineer World's Fair 20262026
Mario ZechnerAI Engineer Europe 20262026
Nick NisiAI Engineer Europe 20262026
RL Environments at Scale

Metadata candidate

Will BrownAI Engineer Code 20252025
Louis Knight-WebbAI Engineer Europe 20262026
The New Code

Metadata candidate

Sean GroveAI Engineer World's Fair 20252025
State of Data

Metadata candidate

Sean CaiAI Engineer World's Fair 20262026
Ibragim BadertdinovAI Engineer Europe 20262026
The Agentic AI Engineer

Metadata candidate

Benedikt Sanftl, Burak Cemil ÖzafşarAI Engineer World's Fair 20262026
Natalie MeurerAI Engineer World's Fair 20262026
Addy OsmaniAI Engineer World's Fair 20262026
Justin SchroederAI Engineer World's Fair 20262026
Alexander Embiricos, Romain Huet, Peter SteinbergerAI Engineer World's Fair 20262026
The Log Is The Agent

Metadata candidate

Ishaan SehgalAI Engineer World's Fair 20262026
Lou BichardAI Engineer Europe 20262026
The Prompt is the Platform

Metadata candidate

Dominik, Dominik TornowAI Engineer World's Fair 20262026
Ayush BhardwajAI Engineer World's Fair 20262026
Training Agentic Reasoners

Metadata candidate

Will BrownAI Engineer World's Fair 20252025
Eugene YanAI Engineer World's Fair 20262026
Matt DaileyAI Engineer World's Fair 20262026
James LeAI Engineer World's Fair 20262026
Vision: Zero Bugs

Metadata candidate

Johann Schleier-SmithAI Engineer Code 20252025
Sai Krishna RallabandiAI Engineer World's Fair 20262026
DottaAI Engineer World's Fair 20262026
Eugene Yan, Hamel Husain, Jason Liu, Dr Bryan Bischof, Charles Frye, Shreya ShankarAI Engineer World's Fair 20242024
Phil HetzelAI Engineer Europe 20262026
Sunil Pai, Matt CareyAI Engineer Europe 20262026
Mike ChristensenAI Engineer Europe 20262026
Dan FarrellyAI Engineer World's Fair 20262026
Talha SheikhAI Engineer Europe 20262026
Mike PhippsAI Engineer World's Fair 20262026

References

Coverage and source review
Processed transcripts
63 processed in full · 5 in the curated path
Automated source review
Passed
Metadata candidates
69 unreviewed; not verified topic membership
Corpus version
1bd8e407b26a07b33815594e1b2db5f41827119a2b3cb6fbf240f9fc571fc767

Automated review checks source support; it is not publication approval.

A synthesis of selected conference talks and technical references. Citations link to the source material; they do not imply that every talk on this subject is included.

  1. Harnesses in AI: A Deep Dive

    An agent harness controls the environment around model execution; it includes more than either an evaluation runner or the agent loop alone.

  2. Function calling

    A generated function call supplies a function name, serialized arguments, and a call identifier; application code dispatches and executes it. The documented loop parses arguments, invokes application functions, associates observations with the originating call, and sends results back for further generation. Results can encode data, errors, or success/failure for functions without return values. Strict mode constrains arguments to the supported schema: objects require additionalProperties=false and all properties must be required, with nullable types representing optional values. This is a structural guarantee. Engineering inference: application code must still validate business constraints and authorization, reject unknown operations, handle execution failures, and report actual observations; a schema-valid recipient or amount can still be wrong.

  3. Building Durable, Production-Ready Agents with OpenAI SDK and Temporal

    Temporal places queues between workflows and activities, allowing worker instances to execute distributed work without application-managed queue infrastructure.

  4. From Stateless Nightmares to Durable Agents

    Durability becomes valuable when restarting a multi-step workflow would discard substantial compute or make users repeat a long wait.

  5. Building durable Agents with Workflow DevKit & AI SDK

    Workflow orchestration does not supply the agent's permission policy or code-isolation boundary.

  6. Scaling Managed Agents: Decoupling the brain from the hands

    Anthropic separates the session event log, agent harness, and execution sandbox. The harness calls the model and routes tool requests; the session stores events outside the harness process. A replacement harness retrieves that log after failure, while a failed sandbox can be provisioned separately. Recoverable session storage also remains distinct from the selected and transformed events placed in the model's context.

  7. Workflow Id and Run Id — Temporal

    Temporal distinguishes a user-defined Workflow ID carrying business meaning from a system-generated Run ID identifying a particular execution. Retry and Continue-As-New can create new runs while retaining the Workflow ID. The documentation warns against using the current Run ID for logical decisions because it can change. This supplies a concrete example of stable business identity spanning multiple executions.

  8. Making retries safe with idempotent APIs — Amazon Builders' Library

    A caller-provided request identifier expresses that repeated requests represent the same logical operation. Identical parameters alone cannot establish this: a user may intentionally request two identical resources. The server must coordinate recording the identifier with performing the mutation atomically, return a semantically equivalent result for a retry, and reject reused identifiers paired with different intent or parameters. Retention of identifiers also needs a defined lifetime. These semantics let an agent runtime retry an uncertain tool response without silently turning one authorized operation into two.

  9. Your Agent Didn’t Fail. Your Harness Did.

    Trace one real run from trigger identity through inherited state, authority, execution attempts, and surviving external evidence.

  10. Google long-running Operations protocol definition

    Google's Operations interface returns a named operation that clients can inspect later with GetOperation. The record separates progress metadata, done status, and an error or successful response. CancelOperation initiates best-effort asynchronous cancellation; clients must subsequently check whether cancellation succeeded or completion won the race. DeleteOperation only expresses loss of interest in the result and does not cancel execution. WaitOperation can return before completion, so receiving a response is not sufficient evidence that work ended.

  11. Temporal Activity Execution

    An Activity Execution can comprise multiple task attempts. Temporal relies on timeouts to detect lost work, including worker crashes after invocation, and retries according to policy; limiting attempts to one prevents retry but does not prove an external effect failed. Cancellation is cooperative: activities receive service cancellation through heartbeats, can ignore it, and workflows may proceed without waiting for acceptance. A timed-out attempt may therefore continue while another attempt runs. Application consequence: treat an unconfirmed external mutation as uncertain, retain its operation identifier, reconcile against the receiving system, and use enforced idempotency or explicit recovery before repeating it. Timeout or cancellation is not evidence that a payment, message, or write was reversed.

  12. ARIES: A Transaction Recovery Method Supporting Fine-Granularity Locking and Partial Rollbacks Using Write-Ahead Logging

    Mohan and colleagues' March 1992 paper addressed transaction recovery with concurrent updates and partial rollback. Write-ahead logging requires recovery records to reach stable storage before changed database pages replace their previous versions. Commit also requires durable transaction status and log records. ARIES combines this log with fuzzy checkpoints: recovery summaries captured while transactions continue, containing transaction and modified-page information. Checkpoints reduce recovery work without flushing every modified page or replacing the log. An unfinished checkpoint is not treated as a completed recovery boundary.

  13. Making reliable distributed systems in the presence of software errors

    Joe Armstrong's 2003 thesis describes reliability through independent processes whose failures can be detected and handled by other processes. Its historical account dates Ericsson's OTP project to 1996, motivated by providing a stable software base for the larger AXD301 project and consolidating earlier Erlang libraries. Armstrong, Magnus Fröberg and Martin Björklund redesigned the core libraries during 1996–1997. Ericsson delivered the first AXD301 in 1998; Erlang and OTP became open source in December 1998. This supplies an industrial lineage for supervised execution distinct from persistent workflow replay.

  14. The Mentor-lite Prototype: A Light-Weight Workflow Management System

    Jeanine Weissenfels and colleagues describe a lightweight workflow prototype separating an interpreter, communication manager and log manager. The interpreter executes state and activity charts; the communication manager coordinates distributed engines through reliable messaging; the log manager uses Oracle for workflow logging and recovery. Worklist and history management are extensions implemented as workflows rather than mandatory kernel components. Recovery logging and operator-facing history therefore have distinct responsibilities. The proposed demonstration combines automatic and interactive steps in ordering, shipment and payment workflows.

  15. From beta to 3.0: Trigger.dev v3 reaches GA

    On September 17, 2024, Trigger.dev announced v3 general availability. The release account described a hosted runtime with checkpoint-and-restore waits, task queues, scheduling, and tenant-specific concurrency limits. Its example suspends a parent while awaiting a child and resumes with the child's result.

  16. Amazon Simple Workflow – Cloud-Based Workflow Management

    AWS's February 2012 SWF introduction separated activity workers, which perform tasks, from deciders, which choose subsequent steps using execution history. The service retained workflow state, queued and assigned tasks, routed results, and tracked timeouts. Workers could run in cloud or on-premises environments. Signals entered execution history for the decider to handle. The motivating problem was coordinating multistage business processes across independently running systems without making each application build that infrastructure.

  17. Break through the serverless barriers with Azure Functions

    Microsoft's May 7, 2018 announcement presented Durable Functions general availability as addressing stateful applications and long-running operations that conventional serverless functions did not readily support. Built on Durable Task Framework, the extension let developers write orchestration code that called functions while maintaining state across executions. Named patterns included function chaining, map-reduce, asynchronous HTTP and waiting for human interaction. JavaScript orchestration was separately announced as a public preview requiring Azure Functions v2.

  18. Two Roads to Durable Agents: Replay vs. Snapshot — Eric Allam, Co-founder, Trigger.dev

    Machine-using agents accumulate valuable filesystem, memory, and process state that the speaker proposes preserving separately from context.

  19. Checkpointers — LangGraph

    A LangGraph checkpoint records graph state at a super-step boundary: one execution step whose scheduled nodes may run concurrently. StateSnapshot includes values, next nodes, thread and checkpoint identifiers, execution metadata, creation time, previous-checkpoint configuration, and pending tasks with errors or interrupts. Successful node outputs can be persisted separately before the full step finishes, allowing recovery without recomputing successful peers when another node fails.

  20. Spend — Pydantic AI Harness

    SpendLimits records model-response costs and refuses later requests once a configured counter is exhausted. It explicitly does not guarantee spending remains below the ceiling: concurrent runs can pass admission before either records usage, and the crossing request completes. Abandoned streams can miss accounting. Expiring a conversation counter can reset its allowance. Recovery also needs shared counters and deduplication markers so restored responses are not counted twice and new workers do not start from zero.

  21. PostgreSQL 18: Transactions

    A transaction groups database updates into an all-or-nothing operation. Other transactions do not observe its unfinished changes; committing makes the grouped changes visible together. BEGIN and COMMIT delimit a transaction block, while ROLLBACK discards its changes. Applied to runtime records, an operation result, its status transition, and newly pending work can be committed together when they reside in the same transactional database.

  22. PostgreSQL 18: Write Ahead Log

    PostgreSQL's synchronous_commit setting determines how much write-ahead-log processing precedes a successful response. Non-off modes wait for local log flushing; off can acknowledge a transaction before it is safe against a server crash. A crash can consequently lose recently acknowledged transactions without making the database inconsistent. Replication settings add separate boundaries: remote_write waits for a standby filesystem write, while stronger modes require durable storage or application on the standby. Thus a checkpoint database's acknowledgment contract is a configuration choice, not merely a consequence of using transactions.

  23. Agent Continuations implementation walkthrough

    SnapLogic's ContinuationAgent packages message history and pending approval-dependent tool calls into a continuation returned to its caller. The documented record contains messages, resume_request, and processed fields. Resumption reconstructs tool status from that record and separately supplied approval decisions. A paused subagent's continuation can be attached to its parent tool call. This provides a concrete continuation representation: retained information identifying unfinished computation and the state needed to proceed.

  24. Temporal Activity Definition

    An activity can complete an external effect and then lose its worker before reporting completion. Temporal's history then lacks successful completion, so a retry may execute the activity again. Completed activities recorded in history are not re-executed by workflow replay; unrecorded completion is the important gap. Idempotency means repeated attempts leave no additional effect beyond the first. Temporal documents idempotency keys enforced by the called service, rather than automatically by the activity. Retrying a multi-step activity repeats earlier successful steps too.

  25. Thinking in LangGraph

    The guide explains that interrupted execution restarts at the beginning of its node. Smaller nodes create more recovery boundaries and reduce repeated work; combining operations makes a late failure repeat more of the node. Checkpoint writes can proceed asynchronously, synchronously block further execution until recorded, or occur only at exit. Node granularity and persistence timing are therefore separate choices.

  26. Effective context engineering for AI agents

    Summarization produces a shorter representation; compaction uses such a representation to replace an approaching-full conversation context. Retrieval instead loads selected external information through references or searches. Durable notes persist outside the context window and can later be retrieved. Anthropic's Claude Code example preserves architectural decisions, unresolved bugs, and implementation details while removing redundant messages and tool output. Aggressive compaction can discard details whose importance appears later, so the report recommends prioritizing recall before reducing redundancy. Engineering inference: preserve decisions with rationale, unfinished obligations, dependencies, and evidence references in handoffs, then reconcile them against current files or service records before acting.

  27. From fork() to Fleet: Designing an Agent Sandbox Cloud — Abhishek Bhardwaj, OpenAI

    Periodic disk checkpoints allow long-running work to recover on another node and enable intentional fleet maintenance without discarding all accumulated work.

  28. Accelerate v1.7.0: Checkpointing

    Accelerate documents saving and restoring model, optimizer, random-number-generator and gradient-scaler state for training continuation. Custom objects exposing state_dict and load_state_dict can be registered; its example registers a learning-rate scheduler. These saved states are expected to come from the same training script. This supplies a concrete process-state inventory beyond learned weights.

  29. From Stateless Nightmares to Durable Agents

    Temporal separates deterministic workflow logic from nondeterministic activities and replays recorded activity results to recover progress.

  30. Temporal Workflow Definition

    Temporal replay compares commands produced by workflow code against recorded event history. Reordering a timer and an activity can cause a history mismatch and a nondeterminism error. External API calls, database queries, and model invocations belong in activities outside the replay path. Changes to command-producing workflow operations require compatible versioning rather than assuming any new program can reconstruct old execution.

  31. LangGraph Functional API: deterministic resumption and idempotency

    Functional API resumption restarts the entrypoint and restores completed task and subgraph results from checkpoints. Ordinary entrypoint code runs again. Put randomness, clock reads, model calls and individual side effects inside tasks so persisted results can be reused. Keep task and interrupt ordering consistent with the recorded execution. A task that started but did not finish can execute again, including when an external effect occurred before its result was saved. Checkpointing therefore does not replace idempotency keys or checks for previously completed effects. Reusing a saved model result preserves that recorded value; calling the model again is a new inference, not reconstruction of an identical historical response.

  32. Worker Versioning — Temporal

    Temporal distinguishes pinned workflows, which execute on one Worker Deployment Version, from Auto-Upgrade workflows, which move between versions and must remain replay-compatible. A deployment version can contain multiple workers running the same build. Pinning therefore preserves code-version compatibility without requiring the original worker process to survive. The tradeoff is retaining suitable worker versions for unfinished executions; the guide recommends Auto-Upgrade when workflows outlive the desired deployment-version lifetime.

  33. Backward compatibility — LangGraph

    LangGraph documents applying the latest deployed graph to existing threads, including those resumed from checkpoints. Resumption deserializes saved state and dispatches to a saved node name. Removing that node or making the state schema incompatible can prevent recovery. This lets fixes reach in-flight runs promptly but makes persisted state an interface that new code must honor. The guide separately distinguishes technical compatibility from business compatibility: an old run can still load successfully yet follow meaningfully changed business rules.

  34. Handle external events in durable orchestrations

    An orchestration can await an external event while its worker is stopped and awaken when the event arrives. Events carry an instance identifier, event name, and serializable data. Events arriving before an existing instance listens are buffered; events targeting a nonexistent instance are discarded. The guide recommends event identifiers for deduplication under at-least-once delivery and racing a durable timer against an event to bound a wait.

  35. Transactional outbox pattern — AWS Prescriptive Guidance

    Writing a record and separately notifying another system creates a dual-write failure: either side can succeed alone. A transactional outbox stores the domain change and its outgoing event in one database transaction. A relay publishes committed outbox records, so recovery can retry delivery without losing the durable intent. Relays may deliver duplicate events; consumers therefore need idempotent handling, and ordering must be preserved where updates depend on it. Applied to memory, the authoritative record and an indexing event can commit together while the search projection catches up.

  36. Addressing Cascading Failures — Google Site Reliability Engineering

    Queued requests consume resources and add latency; queues cannot absorb a sustained arrival rate exceeding processing capacity indefinitely. Google describes rejecting excess requests and choosing queue capacity according to traffic bursts and processing time. It also recommends checking remaining deadlines before subsequent processing stages and propagating the original deadline downstream instead of granting each dependency a fresh allowance. The examples distinguish useful completed work from resources spent processing requests whose callers have already stopped waiting.

  37. The Chubby Lock Service for Loosely-Coupled Distributed Systems

    A former lock holder can have delayed requests still in flight after ownership changes. Chubby provides sequencers containing lock identity, mode and generation; recipients are expected to check validity and reject stale requests. This explains why ownership must be enforced where a mutation occurs, not only recorded by a coordinator. Applied to an agent harness, reclaiming a timed-out job does not itself prevent the old worker from writing later.

  38. Amazon SQS visibility timeout

    Receiving an SQS message starts a visibility timeout. Unless the consumer deletes the message, expiry makes it eligible for another consumer; ChangeMessageVisibility can extend or shorten this interval. SQS explicitly warns that its at-least-once delivery model can deliver duplicates even within the visibility period. A queue's temporary suppression of delivery is therefore not proof of exclusive execution or a single external effect.

  39. PostgreSQL 18: Transaction Isolation

    Under PostgreSQL Read Committed, an UPDATE encountering a concurrently updated row waits for the other transaction and then rechecks its WHERE condition against the committed row version. Derived harness example: require the expected ownership generation and state version in the update predicate. After reassignment changes those values, an old worker's update no longer matches and cannot advance that row.

  40. AWS Well-Architected: Control and Limit Retry Calls

    Retries increase offered load and can prolong overload. Bound retry attempts or total elapsed time, choose an appropriate retry layer and inspect existing SDK behavior. Exponential backoff increases the delay between attempts; jitter randomizes that delay to avoid synchronized retry waves. Retry only operations whose semantics permit repetition, with idempotency protection for mutations. Engineering illustration: use a capped exponential delay and randomize within its range while respecting the remaining request deadline.

  41. Building Deterministic Infrastructure for Non-Deterministic AI Agents

    Uncontrolled agent retries can amplify a small tool error into escalating compute consumption.

  42. Building Durable, Production-Ready Agents with OpenAI SDK and Temporal

    The speaker recommends putting fallible external calls and expensive work into Temporal activities, then orchestrating those activities with workflows and configured retries.

  43. AWS Builders' Library: timeouts, retries, backoff and jitter

    Retries add work precisely when an overloaded dependency may have least spare capacity. Nested retry layers multiply attempts: if layer i permits a_i total attempts, one operation can cause up to product_i a_i deepest calls when every layer exhausts its policy. Three attempts at each of five layers permit 243 calls. Serial attempts and backoff also increase elapsed latency; a caller timeout need not stop downstream work. Bound attempts, choose one appropriate retry layer, use timeouts, capped backoff and jitter, and constrain retry volume. A timeout means the caller stopped waiting, not that an external side effect failed to occur. Idempotent operations permit recovery without duplicating the intended effect.

  44. Temporal TypeScript Activity Timeouts

    Start-To-Close bounds one activity attempt; Schedule-To-Close bounds the total execution including retries. A Heartbeat Timeout detects missing progress reports and can trigger another attempt under the retry policy. Heartbeat details can carry a checkpoint, which the next attempt reads to resume work. Heartbeats can be throttled, delaying checkpoint receipt and cancellation delivery. Application inference: checkpoint completed segment identifiers and durable artifact locations, then reconcile those records on retry; a heartbeat itself is not storage for the generated media. Retry intervals, attempt limits, and nonretryable failures should reflect the application's error policy.

  45. Supervisor Behaviour — Erlang System Documentation

    An Erlang supervisor owns child shutdown policy. With a finite shutdown timeout, it requests termination, waits for the child's exit signal, and forcibly terminates the child if that interval expires. Restart intensity limits bound repeated restarts within a time window and escalate persistent failure to the parent supervisor. The documentation warns that prematurely killing a child supervisor can leave its descendants alive, so supervising a tree requires attention to shutdown ordering and descendant lifetimes.

  46. Making retries safe with idempotent APIs

    AWS identifies a logical request using the customer identity plus a caller-provided request identifier, rather than assuming identical parameters always mean duplicate intent. The receiver stores original parameters and rejects identifier reuse with different parameters. Recording the identifier and related mutations must form an ACID operation, avoiding either a recorded token without the effect or an effect without the token. Retries receive semantically equivalent results, allowing recovery after a lost response. EC2 retains request knowledge for the resource lifetime plus an interval for late arrivals, including after resource deletion. Engineering inference: concurrent duplicates must share this isolated decision; a separate check-then-write without concurrency protection is insufficient.

  47. Idempotent requests

    Stripe stores the first executing request's status code and response body for an idempotency key, including failures such as HTTP 500, and returns the stored result on retries. Parameter mismatches are rejected. A request rejected before execution because of validation or a conflict with a concurrently executing request does not create a saved idempotent result and can be retried. Keys may be pruned once at least 24 hours old; reuse after pruning starts a new request. Thus an in-progress conflict, a stored failure, and an expired key have different recovery semantics.

  48. Resolving an ambiguous payment request

    A timeout can leave the client unable to tell whether Stripe received or executed a request. Stripe documents retrying with the same key and parameters until a server result is obtained, using backoff. An HTTP 500 remains indeterminate: side effects may exist even though the cached response stays unchanged. Stripe may reconcile partial mutations and emit webhook events for resulting objects. Supplying a local operation identifier in metadata lets the application correlate these objects with its own pending operation. Engineering consequence: preserve pending state until authoritative provider evidence resolves it; do not infer failure solely from a timeout.

  49. Sagas

    A saga decomposes a long transaction into smaller committed transactions with application-defined compensating transactions. After interruption, recovery can continue forward or compensate completed work. Compensation is not equivalent to erasing history: other work may already have observed committed changes, and some real-world actions cannot be undone. The paper also identifies failed compensation code as a recovery problem. A harness therefore needs explicit durable recovery state and domain-specific compensation, not merely a restarted conversation.

  50. AWS Well-Architected: Set Client Timeouts

    Set connection and request timeouts on remote dependencies. Excessively long timeouts retain resources; excessively short ones can create retries and overload. A client timeout does not necessarily release server resources or establish that the server did nothing. Engineering budget rule: total attempt durations, retry delays and local overhead must fit the end-to-end deadline; each new attempt must fit the remaining budget. Server-side limits are also needed for expensive work.

  51. Language Models are Unsupervised Multitask Learners

    Tokenization represents text as a sequence of vocabulary symbols rather than necessarily whole words. GPT-2 uses byte-level byte-pair encoding: a 256-byte base supports arbitrary text, while frequency-based merges create longer tokens, subject to character-category restrictions. Autoregressive modeling factorizes sequence probability as P(x1,…,xn)=∏i Pθ(xi|x<i). Generation repeatedly predicts a next-token distribution conditioned on the supplied prefix and previously generated tokens. Task instructions and examples can therefore change the conditional distribution without changing θ. GPT-2's zero-shot evaluations modify neither learned parameters nor architecture; request text changes the inputs and resulting activations, not the trained weights.

  52. Two-Phase Transfers — TigerBeetle

    TigerBeetle distinguishes reserved pending amounts from posted amounts. A reservation can later be posted in full or part, releasing any remainder, or voided. Configured balance invariants are checked when reserving, before final posting. Each pending transfer can be resolved only once, and resolution creates a new immutable transfer referencing the original. This provides a concrete accounting primitive for separating outstanding reservations from consumed allowance.

  53. Temporal TypeScript SDK: Activity Timeouts

    Temporal distinguishes a timeout for one activity attempt from the total allowed activity duration, including retries. Activity heartbeats let the service detect missing progress and carry cancellation notifications. In the TypeScript SDK, activity code must observe cancellation, for example through an abort signal; heartbeat throttling can delay delivery. A harness must distinguish requesting cancellation, observing it and confirming that work stopped, rather than assuming a timeout reverses an external mutation.

  54. Manage Orchestration Instances in Durable Functions and Durable Task SDKs

    Azure's instance-management APIs address orchestration instances by identifier. Suspend and terminate requests are queued alongside other instance operations, so callers must query status to establish that Suspended or Terminated was reached. Resuming a suspended orchestration returns it to Running. The documentation explicitly states that instance termination does not propagate to activity functions or sub-orchestrations; those can continue to completion.

  55. Trio's core functionality

    Trio groups child tasks in a nursery whose enclosing block waits until those tasks exit. An unhandled child exception cancels sibling work. Cancellation requests take effect at cooperative cancellation points; cancel_called can be true even when execution finishes before cancellation is delivered. Cleanup that must await operations can use a shielded scope with its own timeout, allowing a bounded cleanup interval despite an outer cancellation.

  56. gRPC lifecycle: cancellation is not rollback

    Client and server can disagree about an RPC's success: the server may finish while its response arrives after the client's deadline. gRPC explicitly warns that cancellation does not roll back changes already made. Application implication: cancellation during a mutation may leave an unknown outcome. Retain an operation identifier, query authoritative status or reconcile the resulting state, and use an idempotent retry contract before resubmitting. If an effect must be reversed, that requires a separate supported compensating operation rather than assuming cancellation undid it.

  57. Workflow message passing — Temporal Python SDK

    A Temporal Signal call returns after server acceptance, before workflow delivery. Updates separately record acceptance after worker validation and completion after handler execution. An Update handle can retrieve its result later, including by Update ID. Async handlers can interleave at awaits; the guide demonstrates protecting related state changes with a lock. The main workflow can otherwise finish while handlers still await activity results, interrupting their work. Waiting for all_handlers_finished provides an explicit completion boundary.

  58. Make your own event-sourced agent harness using stream processors

    Accept an idempotency key on event appends so repeated webhook deliveries do not create duplicate events.

  59. Your Agent Didn’t Fail. Your Harness Did.

    Approval must remain bound to one specific action and its scope, identity, arguments, and lifetime; expiration should terminate the approval path.

  60. Transaction Authorization Cheat Sheet

    OWASP recommends controlling authorization state transitions, preventing transaction-data substitution, and checking authorization at a final gate tied to execution. Changing transaction data can invalidate earlier authorization or restart the authorization process. Authorization credentials should have a limited validity period and be unique to each operation. Applied to a paused agent, approval should authorize the retained operation and its unchanged parameters, not any later action produced after resumption.

  61. SLSA v1.1 Provenance

    SLSA provenance separates a build definition from details of its particular execution. It identifies output artifacts through subject, records resolved input dependencies, and supports resource digests, download locations, builder identity and version, invocation identity, and execution timestamps. The invocation identifier connects an artifact's producing execution with associated logs. These fields supply a concrete vocabulary for recording exactly which inputs and execution produced an output.

  62. Aborting a multipart upload — Amazon S3

    S3 retains uploaded multipart pieces before assembling the final object. Object creation requires successful upload completion; retained parts alone are not the completed artifact. Unfinished parts consume billable storage until completion or abort, and lifecycle configuration can remove incomplete uploads. This supplies a concrete distinction between partial persisted bytes and an available final work product.

  63. How to prevent object overwrites with conditional writes — Amazon S3

    S3 conditional writes evaluate a precondition during the write operation. If-None-Match prevents writing over an existing object key, while If-Match requires the currently stored object's ETag to match the supplied value. In a versioned bucket, If-None-Match checks the current version. These operations support guarded artifact creation or reference updates without a separate check-then-write race.

  64. AbortMultipartUpload — Amazon S3 API

    S3 warns that part uploads already in progress may still succeed after AbortMultipartUpload. Repeated aborts can therefore be necessary to release all part storage. The API documentation directs callers to use ListParts and confirm an empty list when verifying removal. Cleanup has an observable postcondition beyond acceptance of the abort request.

  65. Demystifying evals for AI agents

    An agent evaluation separates a task and its success criteria from repeated trials, execution transcripts, graders, and final environment outcomes. A booking claim in a transcript is different from an actual reservation in the database. The system under test includes both model and agent harness. Code-based checks suit precise state or test assertions; model graders cover more open-ended properties but require calibration; human review helps establish the standard. Capability suites explore difficult behavior, while regression suites protect behavior that already works.

  66. Let's Build an Agent from Scratch — Kam Lasater

    The demonstration combines planning and read/write memory in a tool-accessible to-do list.

  67. Troubleshooting required status checks — GitHub

    GitHub requires checks against the latest applicable commit; results from earlier commits do not satisfy that requirement. Where a test-merge commit has a status, that commit must pass; otherwise the head commit is checked. Branch protection can also require a check from a particular GitHub App. This gives a real implementation of binding acceptance to both an artifact version and an expected checker. However, accepted check conclusions include skipped and neutral, and conditionally skipped jobs can report success.

  68. Hooks reference — Claude Code

    Claude Code's TaskCompleted hook runs when a task is marked complete, including explicit TaskUpdate completion. Exit code 2 prevents the completion transition and returns feedback to the model. Its published example runs tests and translates test failure into that blocking exit code. Merely returning conventional exit code 1 without a valid blocking JSON decision is nonblocking for most hook events. A hook that cannot start can also leave execution proceeding. Completion enforcement therefore depends on the checker's failure contract, not simply on registering a test command.

  69. Your Agent Didn’t Fail. Your Harness Did.

    Internal acceptance does not prove the intended result appeared at the user-visible boundary.

  70. HTML Standard: Server-sent events

    The EventSource reconnection algorithm waits before reconnecting and, when its last-event identifier is nonempty, sends that identifier in the Last-Event-ID request header. The server can thereby learn the client's position in an event stream. The standard also distinguishes reconnecting from failing the connection permanently. For a long-running agent interface, this supplies a transport mechanism for reconnectable progress without treating one uninterrupted connection as the execution's lifetime.

  71. Building durable Agents with Workflow DevKit & AI SDK

    Keep the output stream associated with the workflow run rather than the original HTTP handler, and reconnect using the run ID and a stream position.

  72. FoundationDB: A Distributed Key Value Store

    FoundationDB runs real database software with synthetic workloads and injected faults in deterministic simulation. Its simulator controls network, disk, time, and randomness. Workload assertions check database contracts and invariants; recovery tests restore an environment in which recovery should be possible and verify eventual recovery. Injected conditions include reboots, network partitions, latency, and corruption of unsynchronized writes. Randomized event timing exposes additional execution states.

  73. Testing — Temporal Python SDK

    Temporal's Python testing environment can advance timers and retry waits without waiting their real duration; automatic time skipping pauses while Activities run. Time is shared across one test environment, so independently controlled clocks require separate environments or sequential tests. For workflow-code changes, the guide recommends replaying representative recent histories from both open and closed executions and failing CI on replay errors. Replay succeeds only when the new workflow definition remains deterministic with respect to the supplied history.

  74. Building Multi-agent Systems with Finite State Machines

    Model-based testing can check that tests exercise every valid transition in the modeled machine.

  75. From Stateless Nightmares to Durable Agents

    The demo showed recovery from some injected tool exceptions, but also exposed an unexplained stall, limiting what can be concluded about retry reliability.

  76. Persistence — LangGraph

    LangGraph distinguishes checkpoints that persist a thread's graph state from stores containing application-defined data shared across threads. Checkpoints support conversation continuity, interruption, and failure recovery; a store serves facts or preferences outside the current graph state. An in-memory saver loses its checkpoints when the process restarts, so process recovery requires a persistent backend. Checkpoint accumulation also needs retention management. These are runtime persistence decisions, separate from how much conversation text is included in a model call.

  77. Function Calling is All You Need

    Return a task identifier immediately and expose a separate status-check operation instead of awaiting all work inside the conversational turn.

  78. Two Roads to Durable Agents: Replay vs. Snapshot — Eric Allam, Co-founder, Trigger.dev

    Replay requires deterministic execution outside recorded steps and makes changes to deployed workflow code harder to reconcile with existing journals.

  79. Trigger.dev v3: Durable Serverless functions. No timeouts.

    Trigger.dev's January 19, 2024 announcement described v2 as caching completed chunks and replaying functions. Its proposed v3 architecture instead hosted task execution and used CRIU to save and restore containers at explicit waits. The motivation included long waits, server interruptions, and the programming constraints of running inside customers' serverless functions. The proposed design also kept started runs on immutable deployed code versions.

  80. Netherite: Efficient Execution of Serverless Workflows

    Sebastian Burckhardt and colleagues' 2022 Netherite paper addresses persistence overhead in Durable Functions. Within a partition, execution can advance while an ordered commit log persists earlier transitions; recovery reconstructs a consistent committed prefix. Messages to other partitions remain in an outbox until their producing transition is durable. Experiments using matched Azure deployments found greater throughput than the original Durable Functions implementation, especially for message-heavy workloads. Pipelining principally targets latency rather than reducing total work. The authors disabled cross-partition pipelining because recovery could require coordinated rollback across partitions.

  81. Breaking the Chain: Agent Continuations for Resumable AI Workflows

    The messages array supplies much of the execution history, but Agent Continuations add control metadata to identify where and how execution should resume.

  82. Breaking the Chain: Agent Continuations for Resumable AI Workflows

    Agent Continuations externalize resumable execution state so suspended agent loops can shut down and restart later.

  83. Your Agents Need a Save Button

    Connect observability spans to runtime checkpoints containing code, artifacts, and execution environment; emitted tool telemetry alone does not capture the execution state described in the talk.

  84. Your Agents Need a Save Button

    Replace a tool implementation with a controlled mock while holding the model constant to examine how a policy change affects downstream behavior.

  85. Your Agents Need a Save Button

    Compare execution divergence and final decision artifacts alongside timing and resource use, because a tool-policy change can alter whether human review is required.