Blog Docs Live demo
March 8, 2026 · Engineering

Five Agent Writes That Needed a Checkpoint

These aren't hypothetical. They're the patterns we kept seeing when talking to teams shipping AI agents into production — each one a write action that went somewhere it shouldn't have, or said something it shouldn't have said. Every one of them was preventable with a policy checkpoint before the write landed.

Incident 01

The support agent that promised a full refund

A customer support agent was drafting replies to Zendesk tickets. It was performing well — fast, accurate, right tone. On ticket #4,847, a frustrated customer mentioned they'd been waiting three weeks. The agent, optimizing for resolution, replied: "We guarantee a full refund will be processed within 24 hours."

Finance had a different view of what the company could guarantee. Legal had an even different view. The agent sent it before anyone saw it.

What happened: Commitment sent to production. Customer screenshot it immediately. Finance escalated. One agent reply, one legal exposure.
Gate fix: block_if_terms: ["refund guaranteed", "full refund"] in the support-reply policy. The agent proposes the reply, Gate scans it, blocks before it reaches Zendesk. Agent sees blockReason: "Payload contains blocked term: refund guaranteed" and routes to a human.
Incident 02

The CRM agent that imported 40,000 records at 2am

A LangGraph pipeline was processing a lead list and writing contacts into Salesforce. It worked correctly in staging — batches of 50, reviewed, approved. In production, someone forgot to set the batch size limit. The agent processed the full file in one shot: 40,211 records, unreviewed, written directly to the CRM at 2:17am.

Duplicates, bad data, and overwritten existing contacts. Monday morning was not great.

What happened: 40k records written without review. 3,400 existing contacts had fields overwritten. Two days of cleanup.
Gate fix: auto_approve_under: 100 / require_approval_over: 100. Anything over 100 records goes to the dashboard for human review before a single row writes to Salesforce. The 2am run would have sat in pending until a human approved it — which they wouldn't have, because they would have seen the record count and asked questions.
Incident 03

The email agent that sent to 8,000 people

A marketing agent was drafting a campaign email and sending to a filtered segment. The filter logic had a bug — instead of selecting the "re-engagement" segment (800 contacts), it selected all contacts without an unsubscribe flag: 8,231 people. The agent called the email API. The send started before anyone noticed.

8,000 people received an email intended for 800. Unsubscribes spiked. Deliverability took a hit that lasted three months.

What happened: Wrong segment, full send. Deliverability damage, trust damage, 400+ unsubscribes in 24 hours.
Gate fix: Every email send goes through Gate with recordCount. Policy flags anything over 1,000 recipients for human approval. The agent proposes, Gate holds it pending, a human sees "8,231 recipients" and asks why. Bug surfaces before the send.
Incident 04

The finance agent that issued a refund to the wrong Stripe customer

A billing agent was processing refund requests from a support queue. It matched the refund to a customer by email. Two customers had the same name and similar email addresses — one had an active dispute, one didn't. The agent matched to the wrong record. It called stripe.refunds.create for $1,240 to the wrong account.

The correct customer was still waiting for their refund. The wrong customer got a windfall and didn't mention it. Finance caught it on reconciliation 11 days later.

What happened: $1,240 refunded to the wrong customer. Took 11 days to surface. Recovery was partial.
Gate fix: require_approval: always on the finance-high-risk policy. Every Stripe refund — regardless of amount — goes to human review. A reviewer would have seen the customer name mismatch in the payload before the API call fired.
Incident 05

The content agent that published to the wrong blog

A content pipeline was generating and publishing blog posts to a CMS. It had access to two sites: the company blog and a staging environment. A misconfigured destination variable sent a draft post — internal formatting notes and placeholder copy included — to the live site. It was indexed by Google within 40 minutes.

What happened: Draft content with internal notes published to production. Google indexed it. Screenshots circulated on Twitter before it was taken down.
Gate fix: destinations: [cms.staging] in the draft policy, destinations: [cms.production] in the publish policy — both requiring human approval. An agent pointing at the wrong destination would be blocked immediately with blockReason: "Destination 'cms.production' not in policy allowlist". The misconfiguration surfaces as a Gate block, not a live incident.

The pattern

Every incident above shares the same structure: an agent operating correctly on bad inputs, bad config, or an edge case that fell outside what anyone anticipated. The agent didn't malfunction. It did exactly what it was built to do — and that was the problem.

Agents are fast and consistent. That's their value. It's also their failure mode. A human making the same mistake would have paused, double-checked, noticed the record count was wrong. An agent doesn't hesitate. It executes.

Gate doesn't make agents smarter. It puts a checkpoint between "the agent decided to act" and "the action landed in production" — so the cases where the decision was wrong get caught before they become incidents.

The five policies above are in the Gate repo. Drop them in your policy directory and your agent has guardrails for all five patterns in under 10 minutes.

Try the live demo → ← All posts