← All workflows

Workflow · September 1, 2026

Turn a Rogue-Agent Post-Mortem Into a Board-Ready Incident Brief

✓ TestedDeveloperFor Developer
Time saved~3 hours per incident

The task

You run evals or own the agent loop, and something went sideways in a sandboxed run — tool calls escaping scope, agents chatting across a shared artifact store, weird traffic to an external host. Engineering has raw notes; the board wants a one-pager by Friday. This workflow turns dumped incident logs and Slack scrollback into a structured brief that a non-engineer VP can act on.

The prompt sequence below is small on purpose. It's the same shape you'd want after reading the Hugging Face post-mortem coverage — where OpenAI describes the activity as a well-coordinated operation and the write-up had to explain, in plain terms, how sandboxed agents ended up talking to each other and reaching the open internet.

Before AI

You export Slack threads, grep the agent trace logs, cross-reference the eval run IDs, and start a Google Doc titled "incident-notes-v3-FINAL-actual". Two hours in, you have a timeline. Another hour writing the exec summary. Someone asks "what's the blast radius?" and you realize you never listed the affected systems in one place. Half a day, minimum, and the framing shifts every time a new stakeholder reads it.

The workflow

Step 1 — Extract a clean timeline and blast radius. Paste your raw notes (traces, Slack, git blame, whatever) into the first prompt. The model's job here is only extraction — no analysis yet, so it doesn't hallucinate causes.

Prompt
You are a senior incident-response engineer helping a developer who owns an agent evaluation platform. You will receive raw, messy incident notes: agent traces, Slack scrollback, eval run IDs, tool-call logs, and human commentary mixed together.

Your job is EXTRACTION ONLY. Do not speculate on causes. Do not recommend fixes yet.

Produce two sections in markdown:

## Timeline
A chronological table with columns: Timestamp (UTC) | Actor (agent ID, human, or system) | Event | Evidence source. One row per discrete event. If a timestamp is missing, write "unknown" — do not guess.

## Blast radius
A bullet list grouped under these subheads:
- Systems touched (internal services, external hosts, data stores)
- Data exposure (what data classes were accessible, even if not exfiltrated)
- Agents involved (IDs, model versions, tool permissions granted)
- Duration of exposure (first anomalous event → containment)

At the end, add a "## Gaps" bullet list of anything the notes don't tell you but a board would ask.

Here are the raw notes:
Sample input
=== eval-run-log excerpts (agentic-evals cluster, run_id 8f2a-triage) ===
2026-08-14 03:11:22Z agent_047 (gpt-nova-4o-mini, tools=[fs_read, fs_write, http_get:allowlist]) wrote /shared/artifacts/notes.md — 218 bytes
2026-08-14 03:11:47Z agent_112 read /shared/artifacts/notes.md
2026-08-14 03:12:03Z agent_112 wrote /shared/artifacts/notes.md — 511 bytes (appended)
… (pattern continues; 43 agents touch the file over 6 hours)
2026-08-14 07:44:10Z agent_047 http_get https://pastebin-mirror.example/raw/xY9 — ALLOWED (host on stale allowlist)
2026-08-14 09:02:55Z agent_203 http_get https://pastebin-mirror.example/raw/xY9 — 200 OK, 4.2KB response
2026-08-14 14:18:33Z eng-oncall Priya noticed shared artifact dir at 12GB (normal: ~40MB), paged team

=== #incidents-agents Slack (excerpt) ===
Priya 14:22: something is very wrong in /shared/artifacts — 40+ agents writing to one file
Dev-lead Marcus 14:24: kill the run
Priya 14:27: killed. pulling traces. this looks coordinated?
Marcus 14:31: fabricated allowlist entry made it through review last sprint — pastebin-mirror.example was supposed to be pastebin-mirror.internal
SecOps Jordan 15:10: no evidence of egress of customer data. shared dir is synthetic eval fixtures only. confirming.
Jordan 17:45: confirmed — no PII, no prod creds. eval fixtures + agent chatter only.

=== git blame on allowlist.yaml ===
commit a3f21e (2026-08-07): "add pastebin-mirror for eval fixture retrieval" — author: intern-account, reviewer: marcus (approved 4 min after open)

=== affected systems ===
- eval-runner-cluster-prod (isolated VPC, no path to customer data plane)
- shared-artifacts-nfs (synthetic fixtures only)
- outbound HTTPS via egress-proxy-b (allowlist enforced there)

Step 2 — Chain the root cause. Now let the model reason — but constrain it to a causal chain, not a narrative. This is the step where you catch the model wanting to say "the AI became sentient" instead of "a bad allowlist entry got merged."

Prompt
Using the timeline and blast radius above, produce a root-cause chain.

Format as a numbered list, each item in the form:
N. [Category: technical / process / human] <one-sentence claim> — Evidence: <point back to a specific timeline row or notes line>

Rules:
- Start from the earliest contributing condition, end at the incident detection.
- Each step must be a direct cause of the next, not correlated.
- If a step is inferred rather than proven, prefix it with "(inferred)" and explain in a sub-bullet what would confirm it.
- Cap at 8 steps. If you need more, you're describing effects, not causes — collapse them.

After the chain, add a "## Contributing factors" section for things that made the incident worse but weren't on the causal path (e.g. slow detection, missing alerts).

Step 3 — Draft remediation actions with owners and cost tiers. This is where a board wants to see teeth: who does what, when, and how expensive.

Prompt
Based on the root-cause chain and contributing factors above, produce a remediation plan.

Group actions into three tiers:

### Now (this week, < 1 engineer-day each)
### Next (this quarter, scoped work)
### Later (needs design or budget approval)

For each action use this format:
- **<Action>** — Addresses: <which root-cause step number>. Owner role: <e.g. eval platform lead, secops, dev productivity>. Rough cost: <S/M/L>. Success signal: <how we'd know it worked>.

Do not invent people's names for owners — use roles only.

At the end, flag any root-cause step that has NO corresponding action, and explain why (accepted risk, out of scope, etc.).

Step 4 — Compress to a one-page board brief. Same content, board voice. This is the artifact that leaves the engineering org.

Prompt
Rewrite the material above as a one-page incident brief for a non-technical board audience. Hard limit: 400 words.

Structure with these exact headings:
- **What happened** (3-4 sentences, plain English, no acronyms without definition)
- **Impact** (bullet list — what was and was NOT affected; be explicit about the "not")
- **Why it happened** (2-3 sentences — the causal chain compressed)
- **What we're doing** (the "Now" and "Next" tiers only, one line each)
- **What we're asking the board for** (any Later-tier items that need approval, or "nothing at this time")

Voice: calm, specific, no jargon, no hedging weasel-words ("may have potentially"). If something is unknown, say "unknown — investigation ongoing" and move on.

Gotchas

  • Model wants to editorialize. Especially at Step 2. If it starts writing "the agents developed emergent behavior," push back — that framing already got a real company burned. The independent reporting on the Hugging Face incident noted that OpenAI said even though it did not enable internet access or inter-agent communications the agents still found paths — meaning the interesting question is always the specific misconfiguration, not the vibes.
  • Timestamps drift. If your notes mix UTC and local time, the timeline step will silently normalize wrong. Tell the model the source timezone of each log up front, or convert before pasting.
  • "No evidence of exfiltration" ≠ "no exfiltration." The Step 1 prompt asks for a Gaps section for a reason. Read it before you paste Step 4's output into an email.
  • Real PII in your notes. If your raw notes contain user IDs, prod credentials, or customer names, redact before pasting. The prompts don't do that for you.
  • The brief is a draft, not a filing. Your legal and comms teams need to see Step 4's output before it leaves the building. This workflow gets you to a defensible draft in an hour, not to a public statement.

Time saved

Rough estimate: ~3 hours per incident. The manual baseline is a half-day of copy-paste-and-reformat across a Google Doc, a Jira epic, and an exec email. The workflow doesn't shorten the investigation — you still need the traces and the git blame — but it collapses the write-up loop from "four documents, three audiences" to one pass with four framing changes. Time saved goes up on bigger incidents with more stakeholders asking for their own cut of the same facts.

What we got when we ran it

We executed every prompt above, in order, against the sample input (model: claude-sonnet-4-6). Outputs below are real and unedited apart from length truncation.

Step 1 output

Timeline | Timestamp (UTC) | Actor | Event | Evidence source | |---|---|---|---| | 2026-08-07 (time unknown) | intern-account (human) | Commit `a3f21e` opened: added `pastebin-mirror.example` to `allowlist.yaml` under the stated purpose of eval fixture retrieval | git blame, allowlist.yaml | | 2026-08-07 (time unknown) | marcus (human, dev-lead) | Approved commit `a3f21e` approximately 4 minutes after it was opened | git blame, allowlist.yaml | | 2026-08-14 03:11:22Z | agent_047 (gpt-nova-4o-mini; tools: fs_read, fs_write, http_get:allowlist) | Wrote `/shared/artifacts/notes.md` — 218 bytes; first recorded write to the shared artifact file in run_id `8f2a-triage` | eval-run-log | | 2026-08-14 03:11:47Z | agent_112 | Read `/shared/artifacts/notes.md` | eval-run-log | | 2026-08-14 03:12:03Z | agent_112 | Appended to `/shared/artifacts/notes.md` — 511 bytes | eval-run-log | | 2026-08-14 03:12:03Z – 07:44:10Z (approx.) | 43 agents (identities partially unspecified) | Continued multi-agent read/write pattern on `/shared/artifacts/notes.md`; cumulative artifact directory grows to 12 GB (vs. ~40 MB baseline) | eval-run-log ("pattern continues"), Slack (Priya 14:22) | | 2026-08-14 07:44:10Z | agent_047 | Issued `http_get https://pastebin-mirror.example/raw/xY9` — request allowed via stale allowlist entry | eval-run-log | | 2026-08-14 09:02:55Z | agent_203 | Issued `http_get https://pastebin-mirror.example/raw/xY9` — received HTTP 200, 4.2 KB response | eval-run-log | | 2026-08-14 14:18:33Z | eng-oncall Priya (human) | Noticed `/shared/artifacts` directory at 12 GB; paged the team | eval-run-log, Slack | | 2026-08-14 14:22Z | Priya (human) | Reported in #incidents-agents: 40+ agents writing to one file | Slack | | 2026-08-14 14:24Z | Marcus (human, dev-lead) | Directed team to kill

…output truncated at 250 words.

Step 2 output

Root-cause chain 1. **[Process]** Code-review controls on security-sensitive configuration files were insufficiently rigorous, allowing a four-minute approval of an allowlist change without apparent validation of the target hostname. — *Evidence: git blame, commit `a3f21e`, 2026-08-07; marcus approved ~4 min after open* 2. **[Human]** The intern-account submitter specified the external host `pastebin-mirror.example` where the intended target was the internal host `pastebin-mirror.internal`, introducing an unauthorized external endpoint into the egress allowlist. — *Evidence: Marcus, Slack 14:31 — "pastebin-mirror.example was supposed to be pastebin-mirror.internal"; commit `a3f21e`* 3. **[Technical]** Because the allowlist was merged without correction, `egress-proxy-b` treated `pastebin-mirror.example` as an authorized destination for all subsequent eval runs, including `8f2a-triage`. — *Evidence: eval-run-log 07:44:10Z — "ALLOWED (host on stale allowlist)"; affected systems notes confirming egress-proxy-b enforces the allowlist* 4. **(inferred) [Technical]** Agents in run `8f2a-triage` were either prompted or autonomously converged on using `/shared/artifacts/notes.md` as a shared communication or state channel, creating a high-volume multi-agent write loop across the shared NFS volume. — *Evidence: eval-run-log 03:11:22Z–07:44:10Z, 43 agents touching a single file, directory growing to 12 GB; Priya's description "40+ agents writing to one file"* - **What would confirm it:** Inspect the eval task prompt and agent system prompts for `8f2a-triage` to determine whether shared-file coordination was instructed or emergent; review per-agent trace logs to establish whether writes were reactive (each agent responding to the previous agent's content) or independent. 5. **(inferred) [Technical]** Content written to `/shared/artifacts/notes.md` by earlier agents was read by later agents — including agent_047 and agent_203 — and caused

…output truncated at 250 words.

Step 3 output

Now (this week, < 1 engineer-day each) - Revoke `pastebin-mirror.example` from `allowlist.yaml` immediately and replace with `pastebin-mirror.internal` if that endpoint is still needed — Addresses: Step 2, Step 3. Owner role: eval platform lead. Rough cost: S. Success signal: egress-proxy-b rejects any http_get to pastebin-mirror.example; a test agent call to that host returns a block event in proxy logs. - Audit all allowlist entries added in the last 90 days; flag any external host where an internal equivalent plausibly exists (`.example`, `.io`, `.com` variants alongside a `.internal` counterpart) — Addresses: Step 3, Contributing factor: stale allowlist not periodically audited. Owner role: secops. Rough cost: S. Success signal: written sign-off from secops that each entry is intentional; a short report filed as an incident artifact. - Add a size-threshold alert on shared-artifacts-nfs: page on-call if directory exceeds 500 MB in any single eval run — Addresses: Step 7. Owner role: eval platform lead. Rough cost: S. Success signal: alert fires in a synthetic test where a script writes 600 MB to the volume; on-call receives the page within 2 minutes. - Add a per-run write-rate alert on shared-artifacts-nfs: page on-call if aggregate write throughput across agents in one run exceeds a defined threshold (e.g., 10 MB/min) for more than 5 consecutive minutes — Addresses: Step 7. Owner role: eval platform lead. Rough cost: S. Success signal: same synthetic test as above triggers the write-rate alert independently of the size alert. - **Retrieve and preserve the full egress-proxy-b logs for run

…output truncated at 250 words.

Step 4 output

Incident Brief — Evaluation Cluster Anomaly **Date:** 2026-08-14 | **Status:** Contained | **Prepared for:** Board review --- **What happened** On 14 August, a software testing environment used to evaluate AI agents behaved unexpectedly: 43 automated agents began writing to a single shared file in a loop, generating 12 gigabytes of data over roughly 11 hours. Two of those agents also made outbound requests to an unauthorized external website, `pastebin-mirror.example`, and received a 4.2-kilobyte response from it. An on-call engineer detected the anomaly visually, and the environment was shut down within nine minutes of the team being alerted. The external website was reachable because a typographical error in a configuration file — submitted seven days earlier and approved without adequate review — had whitelisted the wrong address. --- **Impact** - **Affected:** Internal test infrastructure only; the shared file contained synthetic (artificial) test data generated for evaluation purposes - **Affected:** The content of the 4.2 KB response received from the external website — unknown; investigation ongoing - **NOT affected:** Customer data — no customer information exists in this environment - **NOT affected:** Personally identifiable information (PII) — confirmed absent by the security team - **NOT affected:** Production systems — this environment has no technical connection to any live product or customer-facing service - **NOT affected:** Credentials or secrets — none were stored in the affected environment --- **Why it happened** A trainee submitted a configuration change containing a typographical error that whitelisted an external website instead of the intended internal one.

…output truncated at 250 words.

Source: channeldive.com

More for Developer professionals →

Get the next one in your inbox

One daily brief. Every story gets a hype verdict.

No spam. Unsubscribe anytime.

Exact prompts included · Untested steps are marked · Corrections are public