Operations

Runbooks With Stop Conditions

Write operational instructions around observable starting conditions, bounded actions and an explicit point to stop.

On this page
  1. Name the starting condition
  2. Keep the first checks read-only
  3. Attach limits to state-changing actions
  4. Make stop conditions conspicuous
  5. Verify the recovery condition
  6. Test the document against a fixture

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 changes

This 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.