Incident Response

Writing Runbooks That Actually Run Under Pressure

Ryan Zahrai 6 min read
Abstract concept of execution and precision in automated workflows

Most security teams have runbooks. Far fewer have runbooks that work at 2am on a Tuesday.

The problem is not effort. Teams spend real time writing incident response documentation. They store it in Confluence or Notion. They update it after post-mortems. And then an alert fires at an inconvenient hour, and the on-call engineer opens the runbook and finds instructions that made sense in the afternoon but require four judgment calls that were never documented anywhere.

What Makes a Runbook Fail Under Pressure

There are three failure modes we see consistently.

The first is ambiguity. "Check the logs" is not an instruction. Neither is "verify the host is clean." Runbooks written by people who know the environment make assumptions about shared context. The reader at 2am, possibly a different engineer on rotation, does not share that context. They read "check the logs" and spend 15 minutes deciding which logs, in which tool, covering which time window.

The second is incomplete decision trees. Most incidents do not follow a single linear path. A runbook that says "if you see X, do Y" without defining what to do when you see X and Z together is a runbook that will be abandoned partway through when the situation does not match the expected case.

The third is stale specifics. A hardcoded EC2 instance ID in a runbook step. A Slack channel that was renamed three months ago. A CLI flag that changed in a recent tool upgrade. These are small failures individually, but they add up to a runbook that requires corrections at every step under the worst possible conditions.

The Specificity Rule

A useful test for any runbook step: could someone who has never seen your environment execute this step without asking a follow-up question?

If the answer is no, the step needs more specificity. "Check CloudTrail for suspicious activity" fails the test. "Run aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=AssumeRole --start-time $(date -u -v-1H +%Y-%m-%dT%H:%M:%SZ) and look for calls from unexpected source IP addresses or unexpected IAM principals" passes it.

This is the difference between a document and an executable instruction. Not length. Not formatting. Specificity.

We are not saying every runbook needs to be longer. We are saying every step needs to be specific enough that the on-call engineer can execute it without needing to ask anyone for clarification, at any hour, in any state of alertness. A specific instruction is often shorter than an ambiguous one once you cut the hedging language and replace it with exact commands and criteria.

Testing Runbooks Before the Incident Happens

A runbook that has never been executed is not a runbook. It is a hypothesis about what you would do.

The most effective method we have found is to hand the runbook to a team member who did not write it and ask them to walk through it against a tabletop scenario. Not to identify missing steps, but to find ambiguities. Every point where they have to ask a question is a point where the runbook fails the specificity test.

Here is what that looks like in practice. A security engineer is handed a containment runbook for a ransomware scenario. The first step says "isolate the infected host." They ask: isolated from what, exactly? The internet only? All internal networks? Secondary storage mounts? The runbook did not specify. What follows is a conversation that, in a real incident, costs eight minutes and involves waking up another engineer. A single additional line in the runbook eliminates this entirely.

The tabletop goal is not "did we cover the right steps." It is "could this runbook be followed by someone under stress without needing clarification." Those are different questions with different answers.

Runbooks as Code: What Changes

Moving from document-based runbooks to code-based runbooks changes the quality constraint from "readable" to "executable."

When a runbook is a YAML file that runs on an automation platform, the ambiguity problem largely disappears. The platform does not tolerate vague instructions. An action either has a defined target or it does not. A decision branch either has defined conditions or it does not compile. The discipline of encoding a runbook as code forces the specificity that document-based runbooks let you avoid.

There is a secondary benefit: version control. A runbook that lives in a repository has a history. You can see when a step changed, who changed it, and why. Post-mortems feed directly into runbook improvements tracked as diffs, not informal Confluence edits that may or may not be read before the next incident.

Parachute's runbook format is designed around this principle. Every runbook step has explicit inputs, a defined action type, and expected output fields. Testing mode lets you validate the runbook against a simulated alert before it runs against a real one. The discipline the format imposes is the point, not a constraint on flexibility.

What Automation Does Not Fix

Automation can execute a runbook faster than a human. It cannot make a poorly designed runbook correct.

If the runbook steps are wrong, an automated system will execute those wrong steps faster and with less hesitation than a tired engineer at 2am who might notice something is off. The quality requirement on a runbook that runs automatically is higher, not lower, than the requirement on a runbook that a human reads and interprets.

This means the work of writing specific, tested runbooks does not go away when you add automation. It becomes more important. The automation layer is a multiplier on runbook quality in both directions: excellent runbooks execute perfectly at machine speed; flawed runbooks execute their flaws perfectly at machine speed.

We see teams approach Parachute expecting the platform to fix their runbook problems. It does not work that way. What Parachute does is make quality problems visible immediately during the testing phase, before they matter during an actual incident. That feedback loop, more than the execution speed itself, is often where teams find the most value early on.

A Checklist Before a Runbook Goes to Production

Before any runbook is active in Parachute, we recommend running through this criteria:

None of these criteria are novel. They are the same principles that apply to any operational procedure. The specific challenge with incident response runbooks is that the consequences of getting them wrong are concentrated into the most stressful moments your team will face. The quality investment is front-loaded. The payoff is that the runbook executes correctly when it matters most, regardless of who is on-call or what time it is.