AI Engineer World's Fair 2026
Your Agent Didn’t Fail. Your Harness Did.
Read the talk
Your Agent Didn’t Fail. Your Harness Did.
A reply can reach the user while disappearing from durable history. Reliable agents need explicit state ownership, ordered mutations, bounded execution, scoped authority, and evidence of outcomes.
From a talk by Vinoth Govindarajan
Before you start: Familiarity with tool-calling agents, persisted conversation history, and basic concurrency will help you follow the failure mechanisms.
The refund was remembered—until the next turn
A user asks an assistant to remember a customer refund. The assistant confirms that it has recorded the fact for the next turn. The interface looks normal: the reply arrives, nothing crashes, and no error appears. But when the next turn begins, the system cannot reconstruct the refund. The user experienced success; the durable history has a hole.
A crash at least exposes a stopping boundary. An operator can often identify the last known good point and restart from there. Silent success offers no such signal. Delivery can succeed while persistence fails, leaving both the user and the operator without an obvious reason to investigate. The next answer may still sound confident because a model can reason coherently over incomplete history. Agent reliability therefore cannot stop at the quality of the model’s answer.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Model proposes, harness commits, receipt proves
Vinoth Govindarajan introduces this problem from his work on core data and AI infrastructure at OpenAI, following distributed-systems work at Apple and Uber. He also writes The Agent Stack. His examples use OpenClaw because its public issues, code, and documentation make the surrounding infrastructure visible; he is not presenting as an OpenClaw maintainer or pitching the product.
The model proposes, the harness commits, and the receipt proves it. A model may suggest a message, tool invocation, edit, or command. The harness—the runtime and control machinery around that model—owns the actual state transition, authority check, and ordered commit. The receipt is the evidence that survives after the turn ends.
That contract has three obligations: own the state, order the mutation, and prove the action. Each fact needs a named owner and a replay path. Shared mutable state needs an ordered commit path. A transcript records what the agent said; a receipt records what the system allowed, attempted, executed, and confirmed at the user-visible boundary. Those records answer different questions.
The distinction resembles the difference between a car’s engine and its control systems. Horsepower matters, but so do steering, brakes, road rules, the dashboard, and the black box. The model supplies capability. The harness supplies control over where that capability goes and evidence of what happened along the way.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Every turn starts with an assembled working set
Personal agents and coding agents share a useful architectural pattern. Events arrive through chat, webhooks, timers, heartbeats, or other external systems. A control plane maps each event to a session key, which determines its state boundary. A session lane provides one active writer for that mutable state. The runtime invokes models and tools, approvals and policies constrain tool actions, and the audit trail supplies the run receipt. The path is event → session key → throttled execution → tools → audit.
The model does not remember that session in the human sense. For each turn, the harness rebuilds a working set from the transcript, session state, memory, policy, and tool definitions. The model sees only what this assembly process supplies. A stale memory snapshot or missing transcript entry can change the answer without making its prose any less fluent. Coherence does not prove that the working set was complete.
Timeouts, retries, idempotency, logs, ordering, and state ownership are familiar distributed-systems concerns. Agents place those concerns around a probabilistic planner that can change its plan, reconstructs context on every turn, accepts more kinds of events, and acts through more external surfaces. The failure mechanisms are familiar; the expanding combinations make them easier to trigger and harder to explain.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Delivered is not remembered
The first failure shape returns to the opening incident. In the Telegram state-hole case Govindarajan describes, a routed reply could reach the user without the turn being written to the active context or transcript. The send succeeded and the logs looked healthy, but the next turn had no durable record of the exchange. A successful send proved transport, not future context. The missing boundary was state ownership.
An owner here is a system of record, not a person. Its persisted state determines what the system can later reconstruct.
| Fact | Authoritative owner |
|---|---|
| Calendar event | Calendar system |
| Support status | Ticketing system |
| Code change | Workspace or repository |
| Conversation turn | Session transcript |
| User preference | Memory store |
Storage identifies where the bytes live. Ownership identifies which persisted record establishes the fact.
For a reply to become reliable memory, the system must persist the turn, identify its owner, and make replay possible. Ask this for every fact the agent might use later: which system owns it, and how does a subsequent turn recover it? If no owner can replay the fact, the system has not reliably remembered it, regardless of what the assistant told the user.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Two correct writes can erase each other
Once state has an owner, the next question is who can change it and in what order. In the overlapping-writer incident, two callers load the same old state and modify different records. Each operation is locally correct. But each saves a whole snapshot, so the second save silently erases the first caller’s change. A dismissed commitment can return, or a follow-up can arrive twice. The failure is in the load–modify–save boundary, not in either writer’s intended change.
A small TypeScript example makes the lost update concrete. Here, one caller dismisses a refund follow-up while another completes an invoice follow-up. Both start from the same snapshot:
typescript
type Status = "pending" | "dismissed" | "completed";
type Commitments = Record<string, Status>;
let stored: Commitments = {
refundFollowUp: "pending",
invoiceFollowUp: "pending",
};
const callerA = structuredClone(stored);
const callerB = structuredClone(stored);
callerA.refundFollowUp = "dismissed";
callerB.invoiceFollowUp = "completed";
stored = structuredClone(callerA);
stored = structuredClone(callerB);
// The second snapshot restores the old refund status.
console.log(stored);
// { refundFollowUp: "pending", invoiceFollowUp: "completed" }
The records are separate, but the saved object is shared. Ordering only the final assignments would not repair the stale snapshot: the mutation path must prevent a save from overwriting changes made since its read.
One mutable state boundary needs one ordered commit path. This does not require serializing the whole agent system. Subagents can fan out, reads and independent retrieval can run in parallel, and many sessions can execute at once. A queue, mutex, transaction, or lock can protect the relevant mutation boundary; its scope must match the state being shared. Keep unrelated work concurrent and serialize the work necessary to preserve that state.
Users experience these ordering defects as behavior. A lost correction feels forgetful. A stuck session lane feels dead. Completion announced before delivery feels confused. Ordering is therefore a product property as well as a storage concern: it determines whether the agent behaves consistently with what the user just did.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Silence needs an ending
A session can contain a tool call without a matching tool result. The process may have died, the connection may have dropped, or a timeout may have occurred before the result was recorded. In the dangling-call failure described here, the run continues waiting for an event that cannot arrive. New messages queue behind it, and the user sees an agent that has stopped responding. The original cause matters for debugging; the missing lifecycle boundary explains why the failure persists.
Bound the wait at every level:
- Runs: deadlines limit duration, cancellation provides an exit, and watchdogs make stuck work visible.
- Tools: timeouts and explicit error results prevent missing responses from becoming indefinite waits.
- Channels: recovery commands need a path that does not queue behind the blocked work they are supposed to repair.
Every external boundary needs a terminal outcome: success, failure, timeout, cancellation, or exhaustion of the allowed attempts. Record that outcome in the receipt so the next step does not have to infer whether the work is still alive.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
A button click is not lasting authority
Once a conversation can cause actions, the harness must distinguish the ability to request an action from permission to execute it. In the approval-drift incident, an expired approval callback was treated as retryable. The stale callback remained durable, survived restarts, and blocked later channel work. A button click existed in the past, but valid authority no longer existed. The failure was a persistent retry loop, not evidence that an unauthorized action executed.
Approval is scoped execution state. It must remain attached to the particular action it authorized, and expiration must terminate that state rather than create another retry. A useful approval record identifies the approver, session, run, tool, exact arguments, lifetime, outcome, and associated receipt. If those bindings disappear during a retry, replay, or channel callback, the harness can no longer establish that the action being executed is the action that was approved.
Least privilege narrows the available tool surface. Scoped credentials determine which identity an action uses. Approval governs whether execution may proceed, and audit preserves evidence afterward. The model can reason about these boundaries and request an action, but the system must enforce the decision.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Tool success is not proof of delivery
The final incident reverses the opening failure. There, the user saw a reply that durable state did not retain. Here, an internal component reports success but the user sees nothing. In the web-chat or TUI case described in the talk, the message tool reported success even though its message did not render; ordinary assistant replies still appeared. The internal path had accepted the request, but acceptance did not establish the user-visible result. The agent could later insist it had already sent something that the user had never seen.
Proof is a chain. The model proposes an action, policy allows or denies it, execution attempts it, and the user-visible edge confirms—or fails to confirm—the outcome. The receipt preserves those distinctions.
| Record | What it establishes |
|---|---|
| Transcript | What the agent said |
| Tool result | What one component reported |
| Receipt | Evidence across the relevant boundaries |
A receipt should preserve the absence of confirmation as well as confirmation itself. Otherwise an internal success report can turn into an unsupported claim about the external world.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Trace one real production path
The five failure shapes—state holes, overlapping writers, dangling tool calls, approval drift, and missing edge proof—can all be examined through the same questions: what did the user see, which boundary broke, and what would a receipt have exposed? Start with one agent system and one real production path. Ask what woke it up, what state it inherited, which authority it used, what executed, and what evidence survived. These questions turn a fluent conversation into an inspectable causal chain.
Walk that path in order:
- Identify the trigger. Was it a user message, webhook, timer, tool result, subagent, or replay? Record both the trigger type and its identity. Without identity, deduplication, ordering, and authorization become difficult to reconstruct.
- Capture the inherited state. Identify the transcript, session state, memory snapshot, policy version, and tool surface supplied to the run. This is the working set the model actually reasoned over.
- Bind the authority. Record the actor, session, run, tool, arguments, scope, and lifetime. Permission should attach to one pending action, not float across the conversation.
- Record execution. Preserve the actual tool or API call, its arguments, attempt number, idempotency key, and external result. This is evidence about side effects, not a summary of intentions.
- Verify the outcome. Check the boundary the user cares about: the updated ticket, rendered message, changed file, or existing calendar event. The receipt should reach that boundary.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Reliability has to survive the turn
Apply the audit to the refund example. A user message woke the agent. A channel send executed. Delivery evidence survived, but the durable conversation turn did not. That locates the failure at the state boundary: the system could prove that it sent a reply, but could not reconstruct the exchange for the next turn. A better prompt or a more capable model would not repair the missing persistence.
Owning state, ordering mutations, and proving actions are obligations across turns. Better models can improve the reasoning inside a turn; ownership, ordering, lifecycle, authority, and evidence determine whether the surrounding system remains reliable afterward. Once text can become action, the production question includes whether the system can bound the work, constrain its authority, and preserve evidence of its effects. An answering loop is only part of that system.
Govindarajan closes by recommending the OpenAI Agents SDK as a starting point for building agents and The Agent Stack for further reading on production systems. The SDK recommendation is a starting point, not a guarantee that every application automatically satisfies the ownership, ordering, authority, and delivery contract described here. Those boundaries still need to be established for the system being built.
Suggest correction
This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.
Resources
From the talk
Vinoth Govindarajan's publication, recommended in the talk for further reading on production agent systems.
Further reading
A report explaining how concurrent whole-store writes can lose dismissals, roll back attempt counters and cause duplicate reminders.
An incident report showing how a persisted retry loop for an expired approval can survive restarts and block Telegram processing.
A report of a missing tool result making persisted conversation history invalid for subsequent model requests.
Updates since the talk
Current Python SDK guidance for storing conversation history, resuming interrupted runs and choosing a persistence backend, including compaction concurrency limitations.
Read the complete timestamped transcript
- 0:00
[upbeat music] Thank you for choosing to spend this session with me.
- 0:16
My goal today is simple. I want to convince you all that most of the production failures are not-- most of, most of the agent failures are not model failures.
- 0:27
Those are harness failures. So let's start with one production incident.
- 0:32
The user saw the reply. The system forgot it happened. This is a failure shape I want to start with. Not a hallucination, not a crash, not a bad answer.
- 0:43
The user-visible edge looked healthy while the durable record ha-had a hole.
- 0:50
In this example, the user asked the customer-- the agent to remember a refund for a customer.
- 0:58
The assistant said it recorded the fact for the next turn. The interface looked normal, no red screen, no obvious failures. But the next turn cannot reconstruct the fact. The user experienced success.
- 1:11
The system inherited incomplete reality. Why this matters? A crash is annoying, but at, at least it gives you a boundary. You know so- you know something stopped. You usually see an error.
- 1:26
You can often start from last known good point. Silent success gives you a lie. Delivery can succeed while the persistent fails. The user has no reason to doubt the reply.
- 1:40
The operator has no obvious alarm. The next turn can still sound confident
- 1:47
because the model is coherent. But it is coherent over a bo-broken history.
- 1:53
That is why agent reliability matters, and agent reliability cannot stop at model quality.
- 2:01
Hi, I'm Vinoth. I work on core data and AI infrastructure at OpenAI.
- 2:08
Before that, I worked on distributed systems at Apple and Uber. Outside of the work, I write the Agent Stack, where I try to explain how the production AI and data systems work under the hood.
- 2:20
I'm not a mentor of OpenClaw, and this is not a OpenClaw product pitch. This is a pure system design talk. I'm using OpenClaw as a public case study because
- 2:31
its issues, code, docs, makes the harness around the a-agent unusually visible.
- 2:39
Here's the production contract for the talk. A model proposes, the harness commits, and the receipt proves it. The model ca-- may suggest a message, a tool, a edit, or an command, but model is not the production boundary.
- 2:54
The harness owns the state transition, the authority check,
- 2:58
the ordered commit, and the receipt is the evidence that survives the turn. OpenClaw is the case study, and the contract is the takeaway.
- 3:07
If you remember only three things from this talk, make it these: own the state, order the mutation, and prove the action.
- 3:16
A fact needs only one owner and one replay path. Shared mutable state needs one ordered commit path. And transcript is not the proof. A transcript tells you what the agent said.
- 3:27
A receipt tells you what the system allowed, attempted, executed, and what the user-visible edge confirmed.
- 3:37
To create a simple mental model, I created this car analogy of the harness. The model is the engine.
- 3:44
It matters a lot. But nobody, uh, buys a production car by just looking at the horsepower alone. You also care about steering, brakes, road rules, dashboard, and a black box.
- 3:58
The model gives you capability, but the harness gives you control.
- 4:03
A powerful engine with no brakes is not autonomy, it is a liability with good acceleration.
- 4:11
Here is the harness blueprint I wanted to, uh, discuss today. Every agent we know of, like personal agents such as OpenClaw or Hermes, coding a-agents such as Codex, Cursor, OpenCode, or Claude Code, uses the same underlying architecture.
- 4:28
Events enter, enter from many surfaces: a chat, webhook, timer, or heartbeat, or another external system. The control plane maps the events to a session key, and the session key de-determines the state boundary.
- 4:43
The session lane gives you one active writer for the mutable state.
- 4:47
The runtime calls the models and tools. Tools act through approvals and policies. An audit trail becomes the run receipt. This is the blueprint: event, session key, throttle, tools, audit.
- 5:00
The blueprint is the talk, and the incident was the proof that each boundary matters.
- 5:08
Context is assembled. Uh, uh, in agent runtime, th-there's not-- does not usually remember in human sense. It is stateless.
- 5:18
The harness rebuilds the working state for the each turn. The working set may include the transcript, session state, memory, policy, tool definitions.
- 5:29
The model only sees what the harness supplies. If one input is missing or stale, the answer may still sound coherent. Coherence does not prove the working set was complete.
- 5:43
These failures are not new. We already know about timeouts, retries, idempotency, logs, ordering, and state ownership. What changed is the a-agent setting.
- 5:55
Now these failures sit around a probabilistic planner with dynamic plans. It's rebuilding the context for every turn. There are more event sources, and it can act through more action surfaces.
- 6:07
So these failures are familiar.
- 6:09
Agents makes them easier to trigger and harder to explain. That's why Agent harness matters.
- 6:18
Let's talk about the first failure mode. This is the same failure mode I started this talk with. The user sees a success, the source of truth cannot replay it.
- 6:35
Delivered is not remembered. In this state hole OpenClaw issue, a Telegram replay could succeed while the router turn was not returned to the active context or transcript. The user saw the response, the log looked healthy,
- 6:52
but the next turn had no durable record of that exchange. A successful send proves transcript. It does not prove the future context. That distinction matters because the model can answer fluently over an incomplete record.
- 7:06
The missing boundary was not intelligence, it was the state ownership.
- 7:13
By owner, I do not mean a person, I mean the system of record whose persisted state becomes the truth.
- 7:20
A calendar event belongs to the calendar system, a support status belong to the ticketing system, while a code change belongs to a workspace or repository, and a conversation turn belongs to a session transcript, and a user preference belongs to a memory store.
- 7:35
Storage tells you where the bytes live. Ownership tells you who can reconstruct the reality.
- 7:43
A replay is not a reliable memory until, until a named owner can replay it. A system has to persist the turn, it has to name the owner or system of record, and it has to make the replay possible.
- 7:55
The real question is simple: For every fact the agent might use later, who owns it, and how would you replay it?
- 8:04
If no owner can replay the fact, the s- the system did not reliably remember it.
- 8:11
Once we know who owns the state, the next question is: Who's allowed to change it, and in what order?
- 8:18
Two correct writes can still produce one wrong outcome, and last writer wins is not a consistency model.
- 8:28
In this overlapping writer OpenClaw issue describes a load-modify-save race. Two callers loads the same old state. Each changes a different record. The sile-- The sec- the second save silently erases the first.
- 8:43
The user may see a dismissed commitment return or receive a duplicate follow-up. Neither writer is malformed. Both operations are locally correct. The missing boundary is serialization around the commit.
- 8:58
The invariant is not no concurrency. That would be too slow, and it would miss the point. You can fan out sub-agents. Parallel reads are fine. Independent retrieval is fine.
- 9:08
Many sessions can also run at once. The rule is narrower and simple. One ordered commit path for one mutable state boundary.
- 9:17
This mechanism may be a queue, a mutex, a transaction, or a lock. You can use locks or mutex across the sessions and queues or transactions within a session.
- 9:27
Be conservative with the commit time and not across the whole system.
- 9:34
Users do not see queues or locks, they see behavior. A last correction feels forgetful, a stuck lane feels dead, and completion before delivery feels confused. Ordering is a product feature because users experience ordering books as personalities.
- 9:55
Let's-- Now let's talk about time. In production, silence cannot be neutral. Let's review, uh, the next, uh, failure mode is life cycle failure mode. The RAN waits for an event that cannot arrive.
- 10:08
Silence is not a terminal state. In this dangling tool call issue, the session contains a tool call but no matching tool result. A process may have died, a connection may have dropped, a timeout might have happened, happened before the results were recorded.
- 10:26
The exact cause, uh, matters for debugging. The production failure is much simpler. The RAN is waiting for an event that will never arrive.
- 10:36
New messages queue behind that silence. To the user, the agent simply looks stuck.
- 10:45
RANs needs deadlines and cancellation. A deadline bounds the wait. Watchdog makes the stuck work visible. Tools needs timeouts and error results. Channels needs recovery commands that do not wait behind the stuck work they are trying to fix.
- 11:00
Every external boundary needs an ending: success, failure, timeout, cancel, or max attempts.
- 11:08
Most im-importantly, the receipt records the terminal outcome, so the next step does not have to guess. Bound the work before the work bounds you.
- 11:19
Now let's, uh, we can move on from state to authority, because a chat becomes risky when it becomes an action. Capability is not execution. The model can request an action.
- 11:30
Request ability is not authority. Approval needs a shape.
- 11:35
In this approval drift issue, expired approved callback was treated as retrievable. The state call-callback stayed durable, survived restarts, and blocked later channel work. The button click existed, the valid authority did not.
- 11:50
This is the mistake. Treating approval as a vague memory that the human was near the system or clicked yes.
- 11:57
Approval is a scoped execution state. It must stay bound to the action it authorized, and expiration must terminate rather than loop.
- 12:07
A useful approval object answers who approved, in what session and RAN. For wh-which tool and for which arguments, and for how long, and with what outcome.
- 12:20
It also point to the receipt. If those fields fall off during a retry, replay, or a channel callback, the harness can no longer prove the action was being executed as the action being approved.
- 12:34
The general lesson is simple. Capability is not execution. Least privileges narrows the tool surface. Scoped credentials ensures the right identity is used for the action. Approval and audit decides what happens before and after the execution.
- 12:49
The model can reason about the boundary, but it should not be the boundary. The model can request, but the s- still the system decides.
- 13:00
Finally, even if the tool says success, the user visible world may disagree. Internal component reports success, the user visible surface shows nothing. This is the inverse of the opening incident we saw.
- 13:13
In this missing edging-- edge proof issue, the message tool reported success for a web chat or TUI run, but the message did not render. Normal assistant reply still appeared.
- 13:23
The tool pro-proved that the internal path accepted the request. It does not prove the user saw the result. That difference changed the conversation. The agent may later say, "I already sent it," and the user may truthfully say, "I never saw it."
- 13:37
Internal success is not external proof. Proof is a chain, not a claim. Model proposed something, policy allowed or denied it, execution attempted it, user-visible edge confirmed or failed to confirm the outcome.
- 13:54
The receipt preserves that chain. A transcript records what the agent said. The tool results records what one component claimed.
- 14:02
A receipt records what the agent can verify at the boundary that matters.
- 14:08
Let me recap all the incidents. Here are the file failure shapes you, you to look for: a state hole, overlapping writers, dangling tool call, approval drift, and missing edge proof.
- 14:19
For each one, let's ask the same question: What did the user see? Which boundary it broke? And what would the receipt have caught?
- 14:29
Here is the audit I want you to run when you get back to your team. Pick one agent system, not all of them. One.
- 14:36
Trace one production-- one real production path and ask for the receipt.
- 14:42
The audit has five questions: What woke it up? What state did it inherit? Which authority did it use? What executed? And what evidence survived? These
- 14:55
questions expose causality. They turn a few fluent conversation into an inspectable production run.
- 15:02
First, what woke it up? A user message, webhook, timer, tool result, sub-agent, or a replay. Name the trigger and its identity. Without that, you cannot reason about deduplication, order, or authorization.
- 15:17
Second, which state did it inherit? Transcript, session state, memory snapshot, policy version, and tool surface. The model only reasons over the working set the harness assembled.
- 15:30
Third, which auto-authority did it use? Record the actor, session, tool, run, arguments, scope, and lifetime. A model request is not permission. Authority should bind to a one pending action.
- 15:46
Fourth, what executed? Record the tool or API call, arguments, attempt number, idempotency key, and external results. This is a side effect boundary, not the poor summary of what the agent intended.
- 16:00
Fifth, what evidence survived? Did the ticket get updated? Did the message got rendered? Did the file got changed? Did the calendar even exist? The receipt should end at the boundary the usual-- the user usually cares about.
- 16:18
Now let's apply the opening incident, uh, the same audit to the opening incident. What woke it up? A user message. What state it owned that was the broken boundary?
- 16:28
What executed the channel send? What evidence survived delivery? What did not save-- survive the durable turn?
- 16:38
Delivery survived while the st-state did not. That gap is the harness failure.
- 16:44
The agent, uh, do-- did not need a better model. The model did not need a better prompt. The system needed a better harness with complete receipt.
- 16:55
Let me recap the same three things I asked you to remember the, from the start of my talk. Own the state, order the mutation, and prove the action.
- 17:05
A better model helps inside the turn. Ownership, ordering, life cycle, authority, and proof keep the system sane across turns.
- 17:16
A model proposes, the harness commits, and the receipts-- receipt proves it. Once text can become an action, the useful question changes. Do not only ask whether the model can reason, uh, ask whether the system can own the state, order the mutation, bound the work, constraint authority, and preserve evidence.
- 17:36
A loop can answer a turn, and harness can serve a production.
- 17:42
If you want to go deeper, scan the QR codes. The first points to the agent-- OpenAI Agents SDK, where all these, um, harness are already built in so that you can use to build your own agents.
- 17:55
And second points to The Agent Stack, where I write about the production agents systems in more detail. I'll be at the OpenAI booth after this talk if you want to talk about your harness design.
- 18:05
Thank you. [audience applauding] [outro jingle]