Agents in production Ā· Happened

The agent imagined a permission error and threw away its work

A headless agent drafted a full meeting agenda, reported that it couldn't write the file, and discarded the draft. The denial never happened. The same run had written to that folder ten minutes earlier.

Still true Accurate as of
Diagram in two panels over a row of five steps. Left panel, one scheduled run on August 16: step one, ten minutes earlier the run's preflight wrote into the meetings folder, marked worked; step two, the agenda was drafted in full; step three, marked red, the run reported permission denied on the agenda file and discarded the draft. Right panel, the denial didn't reproduce: relative path writable, absolute path writable, no nested settings shadowing the rules, and the same run wrote to that folder ten minutes earlier. Bottom row, the write-failure protocol since August 16: attempt the write, quote the literal error, write to a fallback, mark the item blocked, continue.

The short version: On August 16 a scheduled agent prepared the agenda for my publication’s Monday editorial meeting. It drafted the whole thing, then reported a permission wall on the agenda file and threw the draft away. The next session spent real time testing paths and settings for a permissions bug that didn’t exist. The agent had assumed it couldn’t write and reported the assumption as an error.

Get the week's seven in one email, every Monday.

What went wrong

The run’s own preflight had written into the same meetings/ folder ten minutes before. The exact path was writable from an identical headless invocation, relative or absolute. There was no nested settings file shadowing the rules. Everything about the denial was plausible, and none of it was observed.

I’d seen the shape before. A few months earlier a different agent had assumed it couldn’t write and said so instead of trying, and that memory is what pointed the diagnosis in the right direction. Three days before the agenda, a publishing subagent had attributed a quote to a brief that was never written: right conclusion, invented sourcing. And on October 30 an agent told me my monthly API spend was under the soft limit, reading a roll-up line, when the budget script had fired its alert four days earlier. Each time the shape was the same: a plausible state narrated as an observed one, by an agent that could have checked.

What we learned

  • An assumed denial looks exactly like a real one in the log. It sends the next session chasing a permissions bug that isn’t there.
  • Headless agents have nobody to ask. Stopping to report a problem is reasonable in a chat. In a cron job it means the work is gone.
  • The fix is a protocol, not a prompt line. ā€œBe carefulā€ changes nothing. A specific sequence of steps does.

What went right

The job’s dispatch prompt gained a write-failure protocol the same day: attempt the write; quote the literal error text; on a real failure, write the content to a fallback location, mark the item blocked with that error, and continue. The rule went into the agent’s memory file too, with the cases as evidence, so future sessions read it before they repeat it. That file is where the October 30 case was added, by the agent that made the mistake.

How to do it (as of October 2026)

  1. Never let an agent report ā€œI can’tā€ without the literal error. ā€œReturned EACCES on this pathā€ is a report. ā€œAppears to be blockedā€ is a guess.
  2. In every unattended job, define a fallback location for drafted work and a way to mark an item blocked. Losing work is worse than a misplaced file.
  3. Treat a peer agent’s failure report the same way: verify before acting on it.
  4. When you catch the pattern, write it down where the agent reads at startup, with dates and cases. Rules with evidence survive. Rules without it decay.

Status

Still true. The protocol has held for that job since August. The pattern showed up again in a different agent on October 30, in a different disguise.

The week's seven, by email

Entries post here daily. Every Monday, one email with the past week's seven. Unsubscribe anytime.

Let's Connect