Runbooks With Stop Conditions
Write operational instructions around observable starting conditions, bounded actions and an explicit point to stop.
On this page
A runbook is a decision aid for a particular condition. It is useful when someone can recognize that condition, collect the relevant evidence and perform a bounded action without having to reconstruct the author's assumptions. A list of commands does not provide that structure by itself.
Imagine a publication responding normally while its optional external feed is unavailable. Restarting the website might not repair the upstream, and repeated restarts discard useful local cache state. A good runbook first identifies which path failed. It then explains whether action is required, rather than assuming that every degraded label demands a restart.
Name the starting condition
Use an observable statement: local articles return successfully, while the feed endpoint reports unavailable on two observations separated by the configured retry interval. Include the relevant time window and the place where the observation is made.
Separate symptoms from suspected causes. A failed public request can involve DNS, TLS, routing, the proxy, the application or an optional upstream. A heading that already says application failure encourages the reader to skip the checks that could distinguish those cases.
State prerequisites before the first action. The reader needs access to the correct host, the intended service identity, and a current description of the installation layout. If the identity cannot be verified, the instruction should stop rather than operate on the first similarly named container.
Keep the first checks read-only
Start with a bounded health request, a useful local request and a small log window. Record response status, observation time and any request identifier. Avoid collecting an unlimited journal or environment dump; it adds noise and can expose credentials.
Use an explicit timeout for remote or potentially blocked checks. A procedure that waits indefinitely leaves the operator unsure whether to interrupt it or start a second attempt. State the next observation when a timeout occurs instead of equating timeout with a specific cause.
For the example publication, the branch can be written plainly:
Local article works, feed unavailable:
inspect optional upstream state; retain local service
Local article fails, process responds:
check packaged content and recent release identity
Local connection refused:
inspect service state and loopback port assignment
Host or service identity uncertain:
stop; establish the correct target before changesThis is a reasoning example, not a completed incident record. The actual runbook should point to the site's specific service commands and the expected response shapes.
Attach limits to state-changing actions
If a restart is appropriate, state what it affects and what it cannot repair. Explain whether in-flight work is drained, interrupted or retried. For a stateless article renderer, interruption may be brief. For a worker with uncommitted state, the same action has different consequences.
Define how many attempts are allowed before the procedure stops. Repeating a restart until a dashboard becomes green can hide an intermittent problem and make the timeline difficult to reconstruct. A single controlled attempt followed by an observation is often easier to understand.
Keep the rollback instruction next to the action that may require it. A proxy edit should have a retained previous file and a validation step. A data mutation needs a different recovery boundary. Do not place a generic undo command at the end of a document when it applies to only one branch.
Make stop conditions conspicuous
Stop when the target cannot be confirmed, the proposed action exceeds the documented scope, or a check indicates possible data corruption. Also stop when a prerequisite such as a verified recovery artifact is missing. These are useful outcomes of the procedure, not failures to follow it.
A stop condition should identify the next responsible role or evidence to gather. On a one-person project, that might mean pausing the change and reviewing the retained installation record. It should not invent an on-call team or escalation channel that does not exist.
Write explicit limits for destructive actions. A runbook for feed unavailability has no reason to remove article files, reset the host firewall or replace a database. Keeping the scope visible prevents a narrow symptom from expanding into a much larger intervention.
Verify the recovery condition
Use the same useful path that established the symptom, plus any action-specific checks. A running process after a restart does not establish that its content is readable. A successful syntax validation does not establish that public requests reach the intended virtual host.
Record the outcome in a short note: starting condition, release identity, checks, action, final observation and unresolved questions. If no change was necessary, say why. That decision can be as informative as a successful restart.
Test the document against a fixture
Give the runbook to a reader with a disposable installation and an intentionally unavailable upstream. Observe where the reader has to guess. Missing service names, ambiguous paths and unstated expected outputs are documentation defects that can be repaired without creating a real outage.
Keep the runbook versioned with its service assumptions. When the port, cache behavior or deployment layout changes, revisit the affected branches. The best operational document makes a limited promise: for these starting conditions, it gives a bounded route to an observed result, and it says clearly when that route ends.