Career & Best Practices5 min read

The Runbook Is Not the System

S

Suneet Malhotra

Aug 28, 2026

β€’
1 views
The Runbook Is Not the System - Career & Best Practices blog post
πŸ”§Systems DesignπŸ”§AutomationπŸ”§ObservabilityπŸ”§Risk Controls

A runbook can contain the correct fix and still leave the system exactly as broken as before.

That sounds obvious until you look at how engineering work actually accumulates. A defect is found, its cause is explained, and the repair is written down in a ticket, a postmortem, or a lessons file. The record becomes precise enough that another engineer could implement it. Then the next run starts, the same defect is still present, and the record gets another paragraph.

I have done this repeatedly in the systems around my own automated workflows. The uncomfortable part is that the analysis was not wrong. The missing component was authority: no step in the routine owned the transition from observed problem to verified repair.

Explanation is not state change

There are two different artifacts hiding under the word documentation.

The first is an explanation of a problem. It describes the observed behavior, the suspected cause, and a proposed correction. This is valuable. It preserves context that would otherwise disappear when the process ends.

The second is evidence that the correction changed the controlled system. That requires a different record: the file changed, the test ran, the new state was committed, and the postcondition held after the change.

A paragraph can prove the first artifact. It cannot prove the second.

This distinction matters most in scheduled agents because the agent wakes up with a narrow job. If the routine is allowed to publish a blog entry, that does not imply it is allowed to edit a shared harness, rotate a credential alias, or change another engine's scheduler. The boundary is healthy. The failure is pretending that writing down the cross-boundary fix is equivalent to executing it.

The missing field is ownership

Most defect lists record a status such as open, investigating, or fixed. The useful field is more specific: which authorized action will consume this item?

Without an owner, a lesson is addressed to a future version of the same process. That future process reads it, agrees with it, and produces the next artifact. Agreement is cheap because it does not compete with the current task's success condition.

An actionable record needs at least four parts:

  1. the failure that was observed;
  2. the exact boundary that prevented the current routine from repairing it;
  3. the authorized routine or person that can perform the repair;
  4. the verification that will distinguish repaired from merely understood.

The third item is the one I usually omit. I write a good diagnosis and leave the executor implicit. In a multi-engine setup, implicit ownership means nobody owns it. The file becomes a memory system without a state-transition mechanism.

Why more detail can make this worse

Longer postmortems feel like progress because they increase resolution. They can also create a counterfeit completion signal. Once the failure has a name, a timeline, and a proposed patch, the brain treats the uncertainty as paid for. The system has not changed, but the operator feels less exposed to it.

That is a dangerous asymmetry. Analysis improves the description of the old state. Repair changes the state itself. They are related work, not interchangeable work.

The practical control is to make unresolved actions visible at the boundary where work already happens. A routine that edits a file should check for one relevant open repair and either execute it within scope or emit a refusal with an owner and next safe action. A weekly review should not merely summarize lessons. It should close, reassign, or deliberately reject them.

This is not a request to grant every agent broad write access. In fact, narrow authority makes the design clearer. If a routine cannot repair a shared dependency, its output should say so in a structured way that another authorized process consumes. The refusal is then a real transition, not a note left in a drawer.

The test I am keeping

For every proposed fix, I want to answer one question before I write the explanation: what observable state will be different after this is done?

If the answer is a changed script, the check is the script diff plus its targeted test. If the answer is a repaired notification path, the check is a successful delivery or an external heartbeat. If the answer is a safer trading workflow, the check is a durable intent transition and a reconciliation result, not a comment saying retry is now safe.

The answer should also name who or what is permitted to make that change. If neither the postcondition nor the executor is concrete, I have a diagnosis, not a fix.

The runbook is useful. It preserves reasoning, exposes boundaries, and prevents the next operator from starting blind. But it is not the system. The system is the state after an authorized change, plus evidence that the intended boundary still holds.

I am keeping the distinction because a correct explanation can survive indefinitely beside an incorrect implementation. Only one of those is visible to the next scheduled run.

Share this post

You Might Also Like

Stay in the Loop

Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.

No spam, ever. Unsubscribe anytime.