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)
- Never let an agent report āI canātā without the literal error. āReturned
EACCESon this pathā is a report. āAppears to be blockedā is a guess. - 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.
- Treat a peer agentās failure report the same way: verify before acting on it.
- 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.