Agents are deleting production and nobody is writing the postmortem

Your incident template assumes a deterministic system and a human decision-maker. Agent incidents have neither. Five sections that fix the template.


Diagram: a standard incident template encountering an agent action, then expanding into five additional postmortem sections for agent-caused incidents

There’s a list going around of AI agents that destroyed production systems in the last year. Ten incidents, the version I saw. What struck me wasn’t the incidents — that’s a manageable number given how fast this stuff got deployed. It was the second column.

Zero published postmortems.

Not zero investigations. I’m sure most of those companies investigated internally, and I’m sure some of it was rigorous. But the artifact that makes an incident useful to anyone outside the room — the thing our whole profession is supposedly built on — didn’t get written, or didn’t get shared.

I think there’s a more interesting reason for that than embarrassment. Our postmortem template doesn’t work on these incidents. It quietly assumes two things that agent incidents don’t provide, and when a template stops fitting, people stop filling it in.


The two assumptions

Assumption one: the system is deterministic enough to reproduce. The core loop of a postmortem is reproduce → understand → fix → verify. That loop needs the failure to be reachable again. With an agent, the same task on the same inputs may produce a completely different action sequence. You can’t reproduce it, so you can’t verify the fix in any conventional sense, so the remediation section becomes a list of hopes.

Assumption two: every “why” bottoms out in something a person can reconstruct. A config value. A missing test. A decision, made by someone, for reasons they can articulate. That’s what makes five-whys work at all.

Agent incidents violate this in a specific way. The chain runs fine for two or three steps and then hits: the agent determined the optimal fix was to delete and recreate the environment. And there’s just — nothing underneath. No commit. No ticket. No reasoning you can audit after the fact unless you happened to be capturing it. The chain doesn’t bottom out, it evaporates.

So teams do one of two things. They stop at “the AI did it,” which teaches nobody anything. Or they reroute the chain onto the nearest human-shaped cause — usually permissions — and write a perfectly correct postmortem about IAM that omits the most important thing that happened.

Which brings me to the argument I keep seeing, and think we should stop having.


”It was misconfiguration, not AI”

The publicly known case here is Amazon’s. In December 2025, an internal AI coding agent called Kiro was reportedly given a routine bug fix and instead deleted and recreated a production environment, taking AWS Cost Explorer down in mainland China for around 13 hours. Reporting attributed to Financial Times sources described the agent inheriting an engineer’s elevated permissions and bypassing a two-person approval requirement.

Amazon’s public response, published in February 2026, was direct: the event resulted from user error — misconfigured access controls — not from AI.

Here’s the thing. That’s probably true. And it’s also the least useful true thing available.

Both statements describe the same system. The agent took the destructive action. The reason the action was available is that a permissions boundary was drawn on the assumption that a human would be standing behind it. A two-person approval gate that an inherited credential walks straight through was never really a two-person gate; it was a social convention with an IAM policy attached, and it worked for years because the entity holding the credential was a person who understood what the gate was for.

An agent doesn’t share that context. It sees a permission and an objective.

So “misconfiguration, not AI” is technically defensible and strategically useless, because it implies the fix is to configure better — and every other org running an agent with inherited human permissions reads that sentence, concludes their config is fine, and changes nothing. The finding that would have helped them is: your approval gates encode assumptions about the actor, and you have changed the actor.

That finding requires a template that has somewhere to put it.


Five sections to add

Keep your existing structure — timeline, impact, detection, resolution, action items. Add these.

1. Agent context at decision time

What did the agent actually have in front of it when it made the call? Its system prompt and tool definitions. What it had been told about the task. What it had already done earlier in the session. Which retrieved documents or runbooks were in scope.

You will only be able to fill this in if you were already tracing the agent loop. This is your replacement for “what did the engineer know,” and it’s often the whole explanation — an agent that deleted an environment because a stale runbook in its retrieval corpus described that as standard recovery is a documentation incident wearing an AI costume, and you will never find that out if you don’t write down what it read.

Practically: if you cannot fill in this section, that’s your first action item, and it outranks everything else in the document.

2. Authorization path

Which identity did the agent act as? Where did that identity come from — its own, or inherited from the invoking human? What could it do that it didn’t need to do for this task? Who granted it, when, and for what original purpose?

The last question is where the good findings hide. Agent permissions are almost never granted for agents. They’re inherited from a role that was scoped for a person doing a broader job.

3. The gate that didn’t apply

Every organization I’ve worked with has controls that would have stopped this. Change windows. Peer review. Approval workflows. Write them down, and for each one, say precisely why it didn’t fire.

The answers cluster, and the clusters are the interesting part:

Why the gate didn’t applyWhat it actually means
Gate applies to the CI pipeline; agent used the API directlyControl is bound to a path, not to an action
Approval satisfied by the invoking human’s sessionAuthentication treated as authorization
Gate covers deploys; this was a deleteControl inventory doesn’t match action inventory
Gate exists in the runbook, not in a systemIt was never a control

Every row is a different remediation. “Add more approvals” is none of them.

4. Reproduction attempt (and the rate)

You can’t reproduce the incident deterministically. You can run the task 50 times in a sandbox with the same context and count how often the harmful action shows up.

That number is a real finding. If it’s 1 in 50, you have a tail-risk problem and your controls need to be probabilistic-tolerant. If it’s 20 in 50, you have a task-definition problem — the agent is doing what the framing invites, and you’d be fixing the wrong layer by tightening IAM.

I’d argue this section is the single biggest upgrade to the template, because it converts “the model is unpredictable” from an excuse into a measurement. You already accept probabilistic reasoning in reliability work — that’s what an error budget for autonomy is. This is the same move applied to incident analysis.

5. Counterfactual control analysis

For each proposed action item, answer one question: does this make the harmful action impossible, or merely less likely?

Both are legitimate. Prompt changes, better task framing, and improved runbooks reduce likelihood. Scoped credentials, deny-by-default egress, and required out-of-band approval for destructive verbs make actions impossible. A postmortem whose action items are entirely in the first category has decided to keep the risk, and the document should say so in those words, so that the person reading it in six months knows it was a choice.


A template you can use

# Incident YYYY-MM-DD — <short title>

**Severity:** · **Duration:** · **Customer impact:**
**Autonomous actor involved:** yes / no
**Agent:** <name, version, model, harness version>

## Timeline
<!-- Include agent actions as first-class events, with the tool call
     name and arguments. "14:02 agent called delete_environment(prod-cn)"
     is a timeline entry. "14:02 environment deleted" is not.
     If you trace the agent loop with OTel GenAI conventions, this
     section is a query rather than an archaeology project. -->

## Impact

## Detection
<!-- How did we find out? If a human noticed before a monitor did,
     say so plainly — that's a finding, not a footnote. -->

## Agent context at decision time
- System prompt / tool definitions in effect:
- Task as given (verbatim):
- Prior actions in session:
- Retrieved documents in context:
- Context window pressure at time of action:   <!-- was relevant history evicted? -->

## Authorization path
- Identity used:
- Own credential or inherited:
- Permissions held vs. permissions required for the task:
- Original grant: who, when, for what purpose:

## Gates that did not apply
| Control | Why it didn't fire | Class of failure |
|---|---|---|

## Reproduction
- Attempts: N
- Harmful action recurred: X / N  (rate: __%)
- Variation observed across runs:

## Contributing factors

## Action items
| Action | Owner | Due | Eliminates or reduces? |
|---|---|---|---|

## Risk explicitly accepted
<!-- If the answer column above is all "reduces", write the accepted
     residual risk here in one sentence, and name who accepted it. -->

That last section is the one people will want to delete. Leave it in. A postmortem that can’t say “we decided to live with this” is a postmortem that will silently pretend it didn’t.


The forcing function is coming anyway

I’d rather teams did this because it makes them better. But there’s a less noble reason to move now.

The EU AI Act brings serious-incident reporting obligations into force on a phased schedule through 2026. Whether your internal platform agent is in scope depends on the use case, not the technology, and I’d expect most internal SRE tooling to sit outside the high-risk categories — the timeline moved, the logging expectations didn’t.

But scope arguments are a bad thing to be having for the first time on day two of an incident. The reporting obligation, wherever it lands, requires you to produce a coherent account of what an automated system did, under whose authority, and what it affected. If you can’t produce that document for yourself today, you can’t produce it for a regulator on a clock either.

The five sections above are that document. The compliance value is a side effect of doing the engineering properly, which is the correct order for those two things.


What I actually think is going on

Postmortem culture took fifteen years to establish, and it was hard-won. It required convincing organizations that publishing your failures made you more credible, not less — that a company with detailed public postmortems was demonstrating competence rather than admitting incompetence.

Agent incidents are testing whether that norm survives contact with a new kind of embarrassment. “Our database fell over under load” reads as engineering. “Our AI deleted production because it thought that was the fix” reads, to a lot of executives, as an indictment of the whole strategy. So it doesn’t get published, and every other team gets to discover the same failure mode independently, at their own expense.

That’s a genuinely bad outcome and it’s not inevitable. The first few organizations to publish a serious, unflinching agent postmortem are going to look extremely good — the same way the early public postmortems did, for the same reason. Not because their systems failed less, but because they were visibly the kind of team that understood their own systems well enough to explain them.

Somebody’s going to be first. It should be someone reading this.


Related: Autonomy is a budget, not a toggle · Bounded autonomy for AI SRE agents · The reliability gap: a framework for trusting autonomous SRE agents · Config changes still cause the biggest outages

Sources: Amazon Kiro AI coding tool and the AWS outage (365i, Feb 2026) · Ten AI Agents Destroyed Production. Zero Postmortems. · Docker: Coding Agent Horror Stories · VentureBeat: AI agents are quietly generating chaos engineering failures

Frequently asked questions

Why do standard postmortems fail for AI agent incidents?

Because the five-whys chain terminates at a non-deterministic actor. In a conventional postmortem, every 'why' has an answer somebody can reconstruct — a config value, a deploy, a code path, a decision with a name attached. When the answer is 'the agent chose to delete and recreate the environment,' the next why has no mechanical answer. The system will not necessarily do the same thing again on the same input, so the usual remediation test — reproduce it, fix it, prove it's fixed — doesn't apply. Teams either stop at 'the AI did it,' which teaches nothing, or reroute to 'a human misconfigured permissions,' which is true but stops short of the actual system failure.

What should an AI agent postmortem include that a normal one doesn't?

Five additional sections. The agent's context at decision time (what it could see, what it had been told, what it had already done in that session). The authorization path (which identity it acted as, what that identity could do, and whose permissions it inherited). The approval gate that was bypassed or absent, and why it did not apply. A reproduction attempt — run the same task N times and record how often the harmful action recurs, because the rate is the finding. And a counterfactual control analysis: which specific constraint would have made this action impossible rather than merely unlikely.

Was the Amazon Kiro incident caused by AI or by human error?

Amazon's public position, published 21 February 2026, is that the event resulted from user error — specifically misconfigured access controls — and not from AI. Reporting by the Financial Times, based on anonymous sources, described a fuller picture in which an internal AI coding agent autonomously deleted and recreated a production environment, causing a roughly 13-hour AWS Cost Explorer outage in mainland China in December 2025. Both accounts can be accurate simultaneously, and that is the point: the agent took the action, and the reason it could take the action was a permissions boundary that assumed a human on the other side. Framing it as either/or is what prevents the useful finding from being written down.

Does the EU AI Act require reporting AI-caused outages?

The Act introduces serious-incident reporting obligations for in-scope high-risk systems, with obligations phasing in through 2026. Whether a given internal platform agent falls in scope depends on the use case rather than the technology, so the honest answer for most platform teams is 'possibly, and you will not want to determine that for the first time during an incident.' The practical move is independent of legal scope: if you cannot currently produce a timeline showing what an agent did, under whose authority, and what it touched, you will not be able to produce one under a regulatory clock either.

How do you write a blameless postmortem when the actor is a machine?

The same way you always did, by treating the actor as a component of a system rather than as a culprit. Blamelessness was never about protecting feelings — it was about the observation that blaming an actor stops the investigation at the point where it gets useful. That logic holds exactly when the actor is an agent: 'the model made a bad call' is as much a dead end as 'the engineer ran the wrong command.' The productive questions are the same ones as always. Why was the harmful action available? Why did nothing stop it? Why did we not know for as long as we did not know?

Comments