The Slow Burn: Three Agent Failures That Take Days (Not Minutes) to Notice
I’ve been writing about agent failures that announce themselves: the overnight cost spike, the deadlocked subprocess, the loop that runs to dawn. Those are the ones that burn at 3 AM and leave a phone notification in their wake.
But there’s a second class of failures that’s harder and, in some ways, worse. These don’t spike. They drift. Your agent runs, exits clean, produces output, posts to Slack, sends the email. And somewhere inside that clean surface, something has been quietly wrong for three days, or eleven days, or three weeks. You find out when a human reviewer happens to look closely enough.
Three patterns keep showing up in community reports and in my own inbox. I want to walk through each one: what the developer saw, what actually happened, and what ClawMetry surfaces — specifically, why you need historical data, not just real-time alerts, to catch these.
Attribution note: The incidents below are synthesized from real reports in developer communities — HN threads, /r/LocalLLaMA, engineering blogs, and user reports sent directly to me. I’ve paraphrased and combined to protect privacy. Links to relevant source material appear inline.
Incident 1: The Weekly Digest That Went Quiet
“The summary kept arriving. It just didn’t say anything. We didn’t notice for three weeks.”
A scheduled analytics agent silently switched to summarizing an empty dataset after an upstream path change. Cron status: green. Email delivered. Output: plausibly quiet. Nobody looked closely until the numbers needed to be higher than zero.
A developer builds an agent that runs every Sunday at 8 AM. It reads from a data pipeline output directory, aggregates token usage and session counts across the week, and posts a digest to Slack. Works great for six weeks.
In week seven, the upstream data pipeline team moves their output from /data/processed/ to /data/v2/processed/. Nobody tells the agent. The agent reads the old path, finds an empty directory, and generates a summary: “Usage appeared flat this week — nothing notable to report.” It posts the message to Slack. The cron shows “ran successfully.” Exit code 0.
Three weeks pass. July 4th week falls in there — genuinely quiet. The empty summaries don’t raise alarms. It takes a quarterly planning meeting, where someone asks why July token spend looks flat when three new agents were deployed, for anyone to pull the numbers and find nothing there.
Pattern: reported across multiple developer communities discussing scheduled agent reliability, 2026. The upstream path-change scenario is one of the most common silent-failure triggers in pipeline-dependent agents.
What ClawMetry surfaces
- The cron run history at
/api/cronsshows every run: ✓ July 6, ✓ July 13, ✓ July 20. All green. But the session detail for each run shows the output token count for the “generate summary” step: 847 → 841 → 127 → 118 → 112. - That cliff — from 841 tokens to 127 tokens between July 6 and July 13 — is the exact week the path changed. The token count dropped because the model went from summarizing a week of real data to summarizing an empty list.
- The transcript viewer shows the tool call that read the directory: its response was
[]. The model received nothing and generated a polite nothing in return. That’s all stored verbatim in DuckDB. - A cron output-token alert (configurable in Cloud Pro) would have fired on July 13 when the per-run token count fell more than 70% below the 8-week baseline.
The fix is trivial once you see it: validate that the directory has records before proceeding, and fail loud if it doesn’t. But the harder problem is finding out when it broke. Without historical session data, you’re looking at 5 identical Slack messages and a hunch. With it, you have a precise timestamp and a verbatim tool response.
Incident 2: The Memory Poisoning Spiral
“The agent had been writing to the wrong environment for 14 days. All 14 sessions completed successfully.”
One session wrote a staging gateway URL to SOUL.md while debugging. Every subsequent session inherited it as authoritative context. 14 clean sessions, 14 days of production no-ops.
This one is subtle in a way that makes it hard to explain to someone who hasn’t lived it. Agents with persistent memory — SOUL.md, MEMORY.md, or equivalent — read that file at the start of each session as ground truth. Whatever is in there shapes everything that follows.
A developer is debugging a staging environment issue and tells the agent: “Use the staging gateway at gateway-staging.internal:18789 for all tests.” The agent, being helpful, writes this to SOUL.md so it won’t forget. The debugging session completes. The developer closes the terminal.
The next session opens. It reads SOUL.md. It sees: “Use staging gateway at gateway-staging.internal:18789.” It uses the staging gateway. The session completes cleanly — staging is live, it responds, tool calls return data. Every one of the next 14 sessions does the same thing, against a staging environment that nobody is watching.
The failure surfaces when someone checks production logs for the automated task results and finds nothing. Two weeks of expected production writes: missing.
Pattern: documented in Claude Code community discussions on persistent memory management, 2026. The session-level context bleeds into multi-session memory, which is a design challenge for any agent with write access to its own memory files.
What ClawMetry surfaces
- The memory file diff timeline in ClawMetry shows every write to SOUL.md, with a before/after diff and the session ID that made the change. You can see exactly what changed on August 2 at 14:37 in session
abc-d4f9. - The cross-session view shows that every session after that timestamp used
gateway_url: gateway-staging.internalin its gateway tool calls. The drift is visible as a column in the session list: one column showing gateway URL, one row per session, a clean break on August 2. - Without this view, you’re git-blaming SOUL.md — if you even thought to look there — and hoping the session that wrote it left a log entry somewhere.
+ Use staging gateway at gateway-staging.internal:18789 for all tests
Memory files: ~/.openclaw/agents/main/SOUL.md
The fix is clear: tighten the agent’s write policy for environment-sensitive values in persistent memory, and add a session-start check that validates the gateway URL against an allowlist. But first you have to find the change. The memory diff timeline is the only way to do that without manual log archaeology.
Incident 3: The API Deprecation That Looked Like Success
“Every projection showed $0.00. Eleven days of reports. The API returned 200 every time.”
An external API renamed a field in a minor version. The old field started returning null. The model gracefully handled the null, defaulted the calculation to zero, and delivered clean output. For eleven days.
Of the three, this one is most dangerous because it degrades the model’s output quality without touching any of the signals you’re watching. No errors. No cost spikes. No hung sessions. Just subtly wrong answers, delivered with confidence, formatted beautifully.
A developer runs an agent nightly to pull pricing data from an external API and compute cost projections. On August 5, the API provider ships v2.1.0. They rename unit_price_usd to unit_price and move currency handling to a separate field. They consider this a minor, non-breaking change. The old field still exists in responses — it just returns null now.
The model receives the response, sees unit_price_usd: null, and gracefully handles it the way models do: it defaults to zero and continues. The projection math runs. The output is formatted cleanly. Each nightly session exits with code 0 and sends the email.
For eleven days, every line item in the projections shows $0.00. The failure surfaces on day twelve when a human reviewer, preparing for a budget meeting, opens the report and notices that eleven days of costs are zero across the board.
Pattern: described in agent observability engineering blogs and developer forums, 2026. Vendors describe this category as “silent semantic degradation” — failures where HTTP 200 and correct output format coexist with meaningless content. See: Laminar.sh, April 2026.
What ClawMetry surfaces
- The transcript viewer in
/api/transcript/<id>stores every tool call response verbatim, including the full JSON body. You can open August 4’s session and August 6’s session side by side. - August 4 response:
{ "unit_price_usd": 0.045, "qty": 1200 }. August 6 response:{ "unit_price": 0.045, "unit_price_usd": null, "qty": 1200 }. The field change is obvious once you can compare two dates. - A DuckDB query across the session history can answer: “Which sessions contained a tool response where
unit_price_usdwas null?” You get a list with timestamps. The break on August 5 is exact. - Cost attribution shows that the downstream “generate projections” step ran in all eleven sessions — consuming tokens to process and format zero-valued data. No budget alert fires because overall spend stayed flat.
- "unit_price_usd": 0.045,
+ "unit_price": 0.045,
+ "unit_price_usd": null,
"qty": 1200
}
I want to be precise about what we can and can’t do here. We can’t tell you that null is the wrong value; we don’t know the API’s contract. What we can do is show you the verbatim response from each day, so a human reviewer can spot the change in seconds instead of filing a support ticket with the API provider and waiting. The forensics go from days to a single query.
The real problem: these failures don’t need alerts, they need archaeology
Look at what the three incidents have in common. In each one:
- No cost spike. The cron ran the same amount of work (or less). Budget alerts would stay silent.
- No stalled session. All sessions completed promptly. The “stalled” detector doesn’t fire.
- No error rate. HTTP 200s throughout. All exit codes were 0.
Traditional real-time monitoring is designed for point-in-time anomalies: a spike, a stall, an error. Slow burns don’t produce anomalies in the moment. They produce a normal-looking present and an abnormal past, and you only see the abnormal past by comparing today to last week.
This is why the DuckDB store matters. Every session event, tool call request and response, memory file write, and cron output is ingested into a local column store. You can query across all of it. “Show me every session where the directory tool call returned an empty list.” “Show me the SOUL.md diff history for the last 30 days.” “Compare the pricing API response from last Tuesday vs this Tuesday.”
Those queries run locally, in milliseconds, against data that’s been accumulating since you installed ClawMetry. No external service. No egress cost. The data is yours.
On retention. The open-source core keeps 24 hours of event history by default. The DuckDB local store extends this as long as you have disk space. Cloud Pro removes the retention ceiling and adds cross-session analytics queries and memory diff history. The three scenarios above all require at least 2 weeks of history to reconstruct — that’s the Cloud Pro use case.
What to build into your agents
Beyond observability, each incident points to a concrete defensive pattern:
For empty-dataset crons
Fail loud on empty input. Don’t generate a “nothing this week” summary from zero records — raise an error. An agent that says “I found 0 records and will summarize nothing” should exit non-zero, not post to Slack. Reserve the graceful “quiet week” message for weeks where you actively verified data was available and it really was flat.
For persistent memory
Separate durable facts from session-specific instructions. Environment configuration — which gateway, which API endpoint, which tenant — should live in a config file with an explicit update policy, not in a free-form memory file that any session can overwrite. Session-level notes go in the session; multi-session truths require review before persisting.
For external API responses
Validate schema, not just status. After the tool call returns 200, assert that the fields you depend on are non-null before passing the response downstream. This won’t catch every semantic drift, but it turns an eleven-day silent failure into a same-day tool call error that shows up in ClawMetry’s session timeline immediately.
The honest part
Real-time alerts are necessary but not sufficient for agents. I’ve shipped budget alerts, stalled-session detection, and cost-spike notifications, and they catch real problems — the overnight fires, the runaway loops. But the three incidents above would have sailed right past all of them.
The gap they expose isn’t in alerting — it’s in forensics. When a developer asks “when did this break?” they need a data store that goes back far enough to answer. That’s what we built with the DuckDB layer: not just a real-time view, but a queryable history of every session event since installation.
Slow burns hide in the past. The tool that catches them is the one that can look back.
History you can actually query
Open source. Local-first DuckDB. Verbatim tool call storage. E2E encrypted cloud sync for >24h retention.
Get ClawMetry: pip install clawmetry