All field notesFIELD NOTE / 013

Agentic operations / Days 82–88

The agent timed out after the change went through.

How to recover an agentic operation when the reply is lost after the effect begins.

EVIDENCE / DECISION
An agent's work passes through independent controls before a release decision
FIELD NOTE 13 / AGENTIC OPERATIONS
THE OVERVIEW FILMWatch the full argument

Approved overview film · Open the direct MP4 ↗

Read the complete film transcript

The agent timed out after the change went through — complete spoken transcript

Published transcript of Eric's approved overview film. Non-spoken pause cues are omitted; the exact audio is available in the player above.

Imagine your agent moving a customer's inference service to a new GPU pool. The tool times out. Its screen says failed, and a second move looks like the sensible repair. But the customer may already be on the new pool. Routing and serving are still converging. Another action can interrupt live traffic while the agent thinks it is recovering. In this fictional case, the placement service accepted the move; only the reply vanished. A resumed worker inherits a tidy summary saying failed, not the target's current state. We'll use the original operation receipt and a fresh target readback to decide what happens next. Here is the rule: a lost reply leaves the effect unknown. Reconcile the first operation before moving anything again.

Separate four records. The request log proves what the caller attempted. The operation receipt says what the target accepted under a stable identity. Workflow history says which steps the orchestrator believes it ran. Independent readback says what now exists and what the customer can use. These are not interchangeable. A successful workflow step can precede a late downstream failure. A failed caller can coexist with an accepted operation. And a green trace does not show that traffic and billing converged. Until the relevant target is read, mark the effect unknown. Unknown is a useful state. It stops the next agent from treating missing evidence as permission to improvise.

The classic mistake is not simply forgetting an idempotency key. A competent API can deduplicate the repeated command and the service can still be half moved. Placement accepted; routing changed; one serving group has not drained; the customer sees errors. Now a resumed agent delegates a recovery task with the sentence, the move failed. The second worker may choose an entirely different pool or start compensation before the first effect settles. In the synthetic case, that can add customer disruption and operator work even when every API behaves as documented. The failure sits in the gap between durable effect state and the agent's next decision.

My rule is to create a protected action envelope before dispatch. It names the case, stable operation identity, authorized principal, target and expected state, preconditions, policy version, deadline and owner. After dispatch, append the request attempt, receipt if one arrives, target observations and child effects. Do not let a model session rewrite that history to match its explanation. On resume, a fresh agent receives a narrow recovery packet: what was authorized, what was attempted, what is known, what is still unknown, and which source to query. Instructions in a markdown file can explain this protocol. The host and service have to enforce the journal and the action scope when the model forgets.

Durable workflow engines are valuable here, but do not overstate their guarantee. AWS Step Functions documents redrive for eligible unsuccessful Standard Workflows, preserving successful-step history and rerunning the unsuccessful step under its stated conditions. Temporal records parent and child workflow execution relationships, while external calls happen through activities with their own execution semantics. That history can tell you what the engine scheduled or observed. It does not automatically certify that an external placement, network route and serving fleet all reached the intended state. Before redrive or retry, correlate the external operation identity and query the target. A workflow record is evidence for recovery, not a substitute for an outcome oracle.

Reconciliation needs a contract written before the move: the placement version, account mapping, route version, serving health, customer-visible probe and deadline. Query each consequential branch by operation or resource identity. A duplicate-safe placement receipt answers only whether the command was accepted twice. It does not answer whether the service converged. In the synthetic timeline, three branches can be green while serving still drains. That is pending, not failed and not complete. If one readback is unavailable, retain unknown, name the owner and set a time to inspect it again. An agent turn ending is not a distributed change ending.

Suppose a customer scales the new pool while recovery is in progress. Reversing the original move against the old version could overwrite legitimate work. Microsoft's compensating transaction guidance explicitly treats compensation as business-specific work that can fail, require progress records and sometimes require human intervention. A counter-action therefore needs its own current-state check, authority, customer impact assessment and receipt. Prefer a safe forward repair when the product policy supports it. Escalate an irreversible or ambiguous case to a named operator. Do not let a timeout trigger an automatic undo merely because undo sounds like the opposite of do.

Before widening agent execution, run the awkward tests. Drop the acknowledgment after target acceptance. Kill the worker before readback. Delay one child effect beyond the parent run. Insert a concurrent write before compensation. The correct result is sometimes a visible unknown state and a human owner, not an automatic green check. Measure unsafe second actions, unresolved effects, time to reconcile, and customer-visible reversals. Here is the operating rule: when a tool times out, keep the effect unknown; recover by stable operation identity and current target readback before retry, compensation or success. Do that with a protected journal and service-level guard, because a fluent agent summary cannot tell you what the external system actually did.

The agent timed out after the change went through

The agent reports a failed move. The customer is already serving traffic from the new GPU pool.

Both observations can be true. A caller can lose its response after a control plane accepts a request. If the agent treats its timeout as proof that the target rejected the request, the recovery run begins from a false world model. It may retry, delegate a second move, or undo an effect that is still unfolding. The costly part is not usually the first timeout. It is the next plausible decision made before anyone has established what actually happened.

This field note uses a fictional inference-service move as an engineering exercise. It is not a report of an incident at a named cloud or a claim about one agent vendor. The difficult property is common to distributed operations: transport observation, workflow history, service receipt and customer outcome are separate facts. A model session can summarize one of them fluently while the others remain unresolved.

The approved overview film and its complete transcript are published with this article. The Week 13 MIT companion contains a synthetic recovery journal, ten fault-injection probes and its release-gate readback. No synthetic result should be mistaken for a live cloud acceptance test.

The fictional timeline

The authorized goal is to move one customer's GPU inference service from pool A to pool B. A placement call uses operation move-214 and a precondition on placement version 41. The service accepts it, records an operation receipt, and starts downstream work. The caller's acknowledgment is lost. The agent sees a timeout.

Meanwhile, the account mapping still shows A, the network route has switched to B, and a serving group is draining. One worker reports the old mapping; another reports the new route. A resumed agent receives a compressed summary: “the move failed.” It proposes a second pool move. That proposal is dangerous even if the original placement API correctly deduplicates an operation key. Deduplication answers a narrow question about duplicate commands. It does not prove that account mapping, route, serving and customer-visible health have converged.

The fix is not to ask a larger model to infer the missing receipt. The operator system needs a durable record and an outcome protocol.

Record What it can establish What it cannot establish alone
Request attempt A caller attempted an authorized call with particular parameters Target acceptance or rejection
Operation receipt A target recognized a stable operation identity All downstream effects and customer health
Workflow history Which steps an orchestrator scheduled and observed Independent external state across every service
Target readback Current state of a particular resource Every other dependent resource without a defined convergence contract

A timeout belongs in an explicit EFFECT_UNKNOWN state until the target can be queried. “Unknown” is an engineering result: it blocks an unjustified second action and creates work for a named owner.

A durable journal that outlives the agent

Before dispatch, the host writes an action envelope outside the model's editable conversation:

{
  "case_id": "gpu-move-214",
  "operation_id": "move-214",
  "principal": "capacity-operator",
  "authorized_target": "pool-B",
  "placement_precondition": 41,
  "policy_version": 7,
  "expected_terminal_state": "pool-B healthy for customer",
  "deadline": "synthetic deadline",
  "owner": "capacity-oncall",
  "status": "INTENT_RECORDED"
}

Dispatch, timeout, acceptance receipt, child effect and readback are appended events. A later agent gets a bounded recovery packet with the original operation ID and current unresolved obligations. It cannot replace the attempt with a tidier prose account. The protected store also keeps the principal, policy version and authorized scope; the next model run does not get to decide those from its own prior message.

In an actual implementation, the journal must be durable, access controlled and consistent with the service's operation identity. The sample JSON alone does not solve an atomic write-versus-dispatch gap. The host must test crash points before and after each write and call. An outbox or workflow engine may be appropriate where the application requires stronger atomicity between intent and dispatch, but the target still needs its own readback. Those design choices depend on the actual service contract.

This is also where prompt files stop being enough. An AGENTS.md or operating note can tell an agent to reconcile. A pre-dispatch host check can refuse a side effect with no journal entry; a post-dispatch path can append the receipt or mark the effect unknown; the service can reject a stale version; an independent reconciler can query the target after the agent disappears. Each control acts at a different boundary. Test every route the agent can take, including delegated tools and resumed runs.

Durable engines help without making the external world atomic

AWS Step Functions redrive documentation says eligible unsuccessful Standard Workflows can resume from an unsuccessful step, retaining results and execution history of successful steps. It documents eligibility, exceptions and state-specific redrive behavior; for example, rerunning a Task state can reset its retry count. That is useful recovery history. It is not a universal exactly-once guarantee for an arbitrary external placement service.

Temporal's child-workflow documentation describes parent and child execution relationships, including parent-close behavior. Its Activities documentation covers the external work that workflows invoke. The distinction matters: a workflow event can record that an activity was scheduled or completed according to its own semantics. It does not by itself certify that every dependent service or customer experience now matches the intended outcome.

OpenTelemetry's messaging span conventions can help link asynchronous producers and consumers. Propagate case ID, operation ID and policy/source version through the delegated work, and link spans where messages cross process boundaries. A trace is a way to reconstruct causality. A transport span labeled successful is not authorization to claim a business operation complete. The messaging conventions themselves are documented as Development status; instrument and inspect the actual stack rather than assuming a universal field layout.

The practical distinction is simple: use workflow history and traces to find which effects to inspect. Use authoritative target readbacks and a convergence contract to decide what state the system is in.

Reconciliation has to cover the fanout

For this fictional move, a release contract could require all of these within a defined deadline:

  1. The original placement operation ID resolves to exactly one accepted target and current placement version.
  2. The account mapping points to the authorized pool for this customer.
  3. The network route points to that same pool and carries a version newer than the precondition.
  4. Serving instances in the old pool have drained or have an explicit, approved transitional state.
  5. Serving instances in the new pool pass a customer-scoped health probe.
  6. Billing or capacity accounting reflects the intended allocation without duplicate entitlement.

These are proposed checks for the illustrative architecture, not universal GPU-cloud requirements. They force the designer to name each consequential branch. If one branch is still in flight, the overall result is pending. If a readback is unavailable, the effect remains unknown. If a branch diverges from the authorized target, the case needs a recovery decision. The agent's final turn or a parent workflow's green status cannot silently collapse those distinctions.

The reconciler also needs a deadline and owner. An unresolved effect cannot live forever in a chat log; it needs an operator queue, a retry or inspection schedule, and a customer-impact view. Report both the count of unknown effects and the time to reach a safe terminal state. Throughput alone will hide this debt.

Compensation is a new decision, not an inverse command

Now add one intervening event: while the first move is being investigated, the customer legitimately scales pool B. A blanket “move back to A” can overwrite the newer capacity decision or cause another outage. The original action's inverse is not necessarily authorized in the current world.

Microsoft's compensating transaction pattern is explicit about the limits: concurrent changes can prevent restoration to the original state; compensation is application specific, can itself fail, needs progress records, and high-impact or ambiguous cases may require human judgment. It also notes that a safe forward alternative may be preferable to canceling prior work. That is the right mental model for an agentic operator. A compensating action needs a new current-state precondition, business owner, customer impact assessment, execution receipt and readback. Some outcomes are irreversible; those should be identified before the agent gets execution scope.

An agent can still be useful in this phase. It can gather the four records, explain the unresolved branches and draft the candidate options. The authorization and state checks should not be delegated to its summary. If the facts do not support one safe automated branch, REQUIRES_OWNER is a correct result.

Ten experiments before widening execution scope

The first pass should use a disposable fixture with a protected event log and deterministic target oracle. These tests can be run without touching customer traffic or live capacity. Each probe should assert both the allowed result and the forbidden second action:

# Isolated change Required observation
1 Lose the reply before the target commits No acceptance receipt; bounded retry only under the service contract
2 Lose the reply after commit Original operation found by ID; no new side effect until reconciled
3 Resume from only a model summary Harness refuses recovery without protected operation identity
4 Resume from the protected journal Original authorization and unknown effect remain visible
5 Repeat an accepted operation ID No duplicate command effect, while convergence remains separately pending
6 Delay one child branch after parent completion Whole operation cannot become CONVERGED
7 Deliver a late success after a timeout Later receipt attaches to the original case; no false rollback
8 Insert a concurrent version before compensation Stale counter-action is refused and routed to an owner
9 Strip correlation from one delegated message Unbound child result cannot settle the original operation
10 Suppress the authoritative readback State remains EFFECT_UNKNOWN with deadline and named owner

For each test, capture the protected journal, service state, agent-visible packet and forbidden-action assertion. A test that merely checks the agent's explanation is vacuous. Mutate the fixture deliberately: allow a second move on lost reply and confirm the gate goes red. If the test cannot detect that regression, it is not evidence for safe recovery.

After the fixture, repeat only a safe, authorized subset against the actual staging control plane. Verify the real hook coverage, persistence behavior, operation-ID lookup, latency and permissions. A local synthetic pass proves the harness logic in that fixture; it does not establish a production recovery rate.

The operating rule

When a consequential tool call times out, record the effect as unknown. Recover by the original operation identity and current target readback before retrying, compensating or declaring success. Keep the intent and observations in a protected journal that survives agent sessions, make unresolved branches visible to a named owner, and test lost acknowledgments after commit rather than only failures before commit.

That is how an agentic operations system earns more execution scope: by showing it can get back to a known, authorized state when the happy path lies.

Sources and limits

All service names, IDs, versions and outcome claims in the GPU example are fictional. The ten experiments are proposed local tests, not completed live cloud trials. The vendor sources support the described mechanics within their documentation; they do not prove this proposed harness or compare model performance.

The field kit

The companion folder for this week holds runnable examples, decision records, evidence and limits. The repository release log is updated after each article's live readback.

Keep reading

The answer deserves
another experiment.

Back to the journal