Your agent said the deploy finished. The deploy did not finish. Somewhere between the plan and the receipt, a tool call failed quietly and the model paved over it with confident prose.
This Drop is about never being in that room again.
#Why polite lies happen
A language model completes text. When a tool result is ambiguous, the cheapest completion is agreement. Nothing in the loop stops the agent — unless you built the stop.
The model is not malicious. It is agreeable. Those failure modes look identical from the outside.
Failures become diffs, not vibes.
The fix is not a smarter prompt. The fix is evidence:
- one wide event per meaningful behavior
- a request id that threads every hop
- receipts for every write — no receipt, no claim
◆ Bonus for this drop
agent-trace-kit
The tracing layer from this Drop: the envelope schema annotated, claim-vs-evidence wrappers for model and tool calls, a replay harness, and real-shaped trace fixtures to test your viewer against.
agent-trace-kit/├── envelope.ts // the schema, annotated├── wrap-client.ts // model-call choke point├── wrap-tools.ts├── replay/│ ├── harness.ts // pin + re-run any step│ └── diff-report.ts└── fixtures/ // six real-shaped traces
Free — we'll email you a one-click link. You'll also get each new Drop, one email a week. Unsubscribe anytime.
#Wire the trace
#The event shape
Keep one canonical event per request-shaped unit. Wide, high-cardinality, boring names.
export const traceToolCall = (call: ToolCall, result: ToolResult) => {
logEvent("agent.tool.completed", {
claim: call.statedOutcome, // what the model said
evidence: result.exitCode, // what actually happened
request_id: call.requestId,
tool: call.name,
});
};#Read it back
mega observability query --apl "['mega-dev'] | where claim != evidence"$ mega observability query --apl "…" 3 rows — agent.tool.completed claim=succeeded evidence=1 tool=deploy
#The audit loop
- Pin the runGrab the request id from the summary the agent gave you.
- Query the traceEvery hop shares that id — the story assembles itself.
- Diff claim vs evidenceWhere they disagree, you found the polite lie.
#What to log
| Field | Why |
|---|---|
| request_id | Threads every hop of one run |
| claim | What the model asserted |
| evidence | What the system reported |
| duration_ms | Slow tools hide behind fast prose |
The pattern generalizes past agents: any system that narrates its own work needs a second channel that records it.1