The Runbook Is Not the System
Suneet Malhotra
Aug 28, 2026
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:
- the failure that was observed;
- the exact boundary that prevented the current routine from repairing it;
- the authorized routine or person that can perform the repair;
- 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
Four Failures, Zero Notifications
My pipeline failed on four days this month. The detector caught all four. The code that was supposed to text me looked up a variable name that does not exist, and returned success.
Career & Best PracticesThe Bug I Have Logged Five Times and Fixed Zero
My routine reads its own defect list at the start of every run. The same bug has been in it since June 16. Noticing is not the bottleneck, and the log is not a queue.
Quantitative TradingA Retry Is Not a Trading Decision
A rejected order is a decision. Retrying it without preserving the reason can turn a risk control into a duplicate trade.
Agentic AIThe Log Is Part of the Agent's Interface
An agent that can act but cannot leave a useful decision record is not autonomous. It is an opaque process with write access.
Latest Blog Posts
A Retry Is Not a Trading Decision
A rejected order is a decision. Retrying it without preserving the reason can turn a risk control into a duplicate trade.
The Log Is Part of the Agent's Interface
An agent that can act but cannot leave a useful decision record is not autonomous. It is an opaque process with write access.
The Market Is Closed Is Not a Trading Rule
A backtest can know the exchange hours and still schedule a trade into a holiday, an early close, or a stale session. Calendar state is market data.
Related Tools & Demos
The QA Field Manual to Language Models
A free 24-chapter book. Start at βwhat is AI, really?β and finish with a small language model you built yourself β one that reads a failing Playwright test and proposes a fix you can run. Read it in your browser, or download the PDF or the Mac app.
View Source Code βMulti-Model LLM Harness
One interface to call any AI model β capability routing, fallback chains, budgets, circuit breakers, and a quality feedback loop. A practical architecture pattern write-up.
Automated Trading System
Multi-engine trading platform with real-time risk management, regime-based strategy selection, and automated order execution.
View Source Code β
Stay in the Loop
Get weekly insights on AI-driven QA, engineering leadership, and automation strategies.
No spam, ever. Unsubscribe anytime.