BLOG
Amazon's AI outages weren't an AI problem. They were a missing-guardrail problem.
May 24, 2026
12 min read
If you read Amazon’s recent outage reports and conclude that “AI coding does not work,” you are looking at the story from the wrong angle.
That conclusion feels clean, but it points you at the wrong fix.
From the perspective of someone who manages engineering teams, the more useful question is what happens when code generation speeds up faster than the systems around it. When that speed outpaces the controls that constrain risky changes, old failure modes fire more often and with more force. AI did not invent those failure modes. It amplified them.
That is why this story matters.
Public reporting described a series of Amazon incidents tied, at least in part, to AI-assisted changes. The most memorable detail came from reports about an AWS disruption in which an internal coding agent, operating under a broad instruction to improve an environment, reportedly took a destructive path and deleted and recreated the environment instead. Another reported incident affected Amazon’s ecommerce systems for roughly six hours and, according to reports, affected tens of thousands of users. Internal briefing material described a “trend of incidents” with “high blast radius” and “Gen-AI assisted changes,” and reportedly acknowledged that best practices and safeguards for this kind of workflow were not yet fully established.
That is enough to say something useful, even without knowing Amazon’s exact internal architecture.
The important point is not that AI is reckless. It is that autonomy and defensive boundaries were mismatched.
The wrong lesson: “just be more careful with AI”
When teams see incidents like this, the most common reaction is procedural. Add another approval. Add another senior reviewer. Require more sign-off. Slow everything down.
That response sounds responsible, but it usually misses the system failure.
The real problem is not that the model wrote code. The problem is that the surrounding environment allowed a single change, or a single agent, to carry too much power with too little containment. If your release process assumes low-frequency human-authored changes and you suddenly introduce a system that produces changes much faster, your old controls stop being sufficient.
That is usually a sign that the real guardrails do not exist yet.
What the incident actually reveals
You can think about this class of outage as at least four separate defensive failures happening at once.
None of them require frontier AI to exist. All of them become more dangerous once AI-assisted changes enter production workflows.
1. Blast radius was not constrained early enough
The phrase “high blast radius” matters because it points to the shape of the system, not just the behavior of the tool.
A healthy production system assumes that some changes will be wrong. The purpose of release engineering is not to eliminate all mistakes. It is to ensure that mistakes fail small.
If one code path, one deployment, or one environment action can take down a critical service for hours, then the system is already carrying too much correlated risk. AI simply increases the number of times that risk gets exercised.
This is where teams often fool themselves. They ask, “Why did the AI generate something dangerous?” when the more important question is, “Why was it possible for a single generated change to reach such a wide operational surface area?”
Blast radius should have been constrained through ordinary production discipline: staged rollout, feature flags, scoped deployment targets, region-aware release boundaries, fast automated rollback, and explicit detection for changes touching shared control planes or critical dependencies.
These are not anti-AI measures. They are production-readiness measures, and they become non-negotiable once AI increases the volume and speed of change.
If your team needs perfect judgment at authoring time to avoid outages, the system is too fragile.
2. Agent permissions were too coarse for the task
One of the most striking details in the reporting is the apparent gap between the instruction and the available power.
“Optimize the environment” is not the same thing as “delete and recreate production infrastructure.”
Yet incidents of this kind suggest a permission model that allowed both outcomes to live inside the same operational envelope. That is a tooling problem before it is an AI problem.
Too many organizations still treat AI agent permissions the way they once treated internal automation scripts: if the tool is useful, give it the credentials it needs and rely on prompts or convention to keep it in bounds.
That is not a serious safety model.
The defensive principle should be simple: constraints belong in the tool layer, not the prompt layer.
A prompt can say:
do not touch that file
do not delete anything
only make a minimal change
But if the tool can still perform destructive actions, those instructions are advisory rather than binding.
For high-risk systems, permissions need to be separated by consequence, not by convenience. Read access, patch access, restart access, and destructive environment mutation should not sit at the same trust level. The more autonomy you grant, the sharper those boundaries need to become.
This is especially true for infrastructure actions. Human engineers are not always careful, but they usually understand the emotional weight of a destructive operation. Agents do not have that instinct. They only have the search space you give them.
If “delete and recreate” is in the search space for a vaguely specified task, you should assume that path will eventually be taken.
3. “It compiles” was treated as “it is safe to ship”
This is one of the oldest engineering mistakes in software, and AI makes it worse.
Code that compiles is not production-ready. Code that passes unit tests is not production-ready. Code that looks locally correct is not production-ready.
Production-ready means the change has been evaluated in terms of effect, scope, dependency interaction, rollback behavior, and business criticality.
That gap matters more with AI-generated changes because generation is cheap while review bandwidth is expensive.
Human review systems were not designed for a world in which the cost of proposing a change collapses toward zero. The bottleneck becomes attention, and once attention becomes the bottleneck, teams start accepting weak proxies:
- it passed CI
- the diff is small
- the generated code looks reasonable
- someone senior skimmed it
None of those are enough on their own.
For AI-assisted changes, the verification layer needs to answer a different class of question:
- What critical paths does this touch?
- What permissions does it assume?
- Does it alter shared infrastructure, IAM boundaries, or deployment logic?
- Does it increase correlated failure risk across regions, tenants, or customer segments?
- Is the rollback path still valid?
That is a different discipline from conventional code review. It is much closer to change-risk classification.
The deeper lesson is that AI changes should not merely enter the same pipeline faster. They often need a differentiated pipeline because the failure profile is different.
4. Negative prompts are not a control system
The previous problem was about how much power the tool had. This one is about where the limits live.
A surprising number of teams still rely on natural-language warnings as if they were real enforcement:
- don’t modify production config
- don’t touch authentication
- don’t change infrastructure
- only update the minimum necessary lines
That may help sometimes, but it is not a boundary.
Large language models are pattern generators, not policy engines. Even strong models can ignore or misinterpret prohibitions when the surrounding context suggests a different route to task completion. Agent frameworks make this worse by adding tools, memory, and iteration loops around the model. Once an agent has the ability to act, a weakly phrased prohibition is not meaningful protection.
This is why prompt-level safety cannot be your main defense for engineering workflows.
Real controls have to be outside the model: restricted tool access, explicit approval steps for dangerous operations, machine-enforced repository boundaries, policy checks in CI, and deployment gates based on risk class.
The model can participate in the workflow, but it should not be the final authority on its own limits.
Why “just add a senior approver” is the wrong fix
One reported response to this class of incident has been stronger human sign-off requirements. That is understandable. But on its own, it can mislead teams about where the real fix belongs.
If senior sign-off is your only new control, you are trying to use scarce human attention to compensate for weak system design.
That does not scale.
AI compresses the cost of generating candidate code. It does not compress the cost of careful review by the same factor. In practice, that means every additional approval requirement eventually turns into one of two bad outcomes:
- the review becomes superficial because the volume is too high
- delivery slows down until teams route around the process
Neither outcome fixes the original problem.
Senior engineers are valuable because they design the control system, not because they can manually inspect every generated diff. If your safety model depends on senior humans catching every dangerous edge case in time, you have built a heroic workflow, not a reliable one.
Approvals can still matter, especially for high-risk operations. But they should sit on top of machine-enforced boundaries, not replace them.
What the defense should look like instead
We do not know Amazon’s exact stack, and it is not necessary to pretend we do.
If this failure pattern showed up in a team I was responsible for, I would want at least four concrete defenses in place very quickly.
These defenses do not map one-to-one onto the four failures above. Some are aimed at a single gap. Some close two at once.
A. Put blast-radius detection into CI, not just into postmortems
Treat blast radius as something you score before release, not something you describe afterward.
Changes that touch deployment logic, shared libraries, IAM configuration, critical routing, billing, or control-plane infrastructure should automatically trigger a different verification path. That path might require deeper tests, staged rollout, explicit ownership confirmation, or a higher bar for release.
The key point is that dangerous changes should become expensive because the system recognizes them as dangerous, not because somebody remembers to worry.
B. Separate high-risk agent actions from ordinary change execution
Agent permissions should be built around consequence tiers. Reading code or logs is low risk. Proposing patches is moderate risk. Modifying deployment configuration is high risk. Deleting infrastructure or rebuilding environments is extremely high risk.
Each tier should have its own boundary. The highest-risk actions should require explicit second authorization or be unavailable to general-purpose agents altogether.
If a task can plausibly be completed through a destructive route, the tooling should force an additional decision point before that route becomes real.
In my own judgment, “rebuild the environment” belongs outside the normal toolset for a general-purpose coding agent. If that means a few tasks take longer, that is still a good trade.
C. Build a differentiated validation pipeline for AI-assisted changes
Not every generated diff deserves the same scrutiny, but some clearly deserve more.
An AI-specific validation layer should classify changes by what they affect, not just by diff size. A small edit to infrastructure code can be far more dangerous than a large edit to a leaf-level UI component.
This is where organizations should invest in automated change classification, dependency-aware testing, critical-path tagging, and rollback simulation. Even relatively simple risk scoring can be much more effective than relying on intuition at merge time.
If I were putting this into practice for a team I managed, I would not ask reviewers to infer that risk from the diff alone. I would want the pipeline itself to label it.
D. Move constraints from prompts into tools and policies
If there are files, services, environments, or actions that should be off-limits, encode that in the system. Do not rely on the model to remember it.
At the stronger end of the spectrum, this can include policy engines, formal checks, static verification for selected classes of change, or environment-specific execution contracts. We do not need to claim that Amazon used those tools. The point is that this is the class of defense worth considering when ordinary code review is no longer enough.
The broader principle is straightforward: the more autonomy you give a system, the less acceptable soft constraints become.
The real lesson for engineering teams
AI did not create a brand-new category of operational risk here.
It exposed an old one: organizations often let too much trust accumulate around change mechanisms that were designed for a slower world. When change generation speeds up, the hidden weaknesses become visible.
That is why the most dangerous reaction to incidents like this is to reduce the lesson to “AI is unreliable.” The engineering question is not whether a change author is imperfect. The engineering question is whether your production system assumes perfection.
If the answer is yes, then AI will hurt you faster.
The teams that benefit from AI-assisted engineering will not be the ones with the best prompts. They will be the ones with bounded blast radius, permission tiers that match consequence, validation pipelines that measure operational risk rather than just syntax correctness, and tool-enforced constraints instead of prompt-only rules.
That is the difference between demo productivity and production readiness.
AI is not the story. The control system around it is.
If your team is already shipping AI-assisted changes into production, this is the right question to ask: if one generated change is wrong tomorrow, how many layers fail before customers feel it?
If that answer makes you uncomfortable, that is normal. It means you have identified an engineering problem that can be designed around. That is not a reason to abandon AI. It is a reason to redesign the guardrails.
Working on something similar? Get in touch.