Essay · Published · 6 min read
Why Some Operations Should Never Run Themselves
Disaster recovery is the one place where finishing the job on schedule matters less than refusing to run an operation you can't yet prove is safe. A principle, not a war story — and why I'd rather admit that than dress it up as one.
- Disaster Recovery
- AI Governance
- Risk
- Enterprise Software
I want to be upfront about what this piece is and isn't. It isn't an account of a specific dated incident — a particular restore that was cancelled at a particular hour, with a particular outcome I can point to and say "see, the caution paid off." I don't have that story to tell yet, and I'd rather write honestly about the principle than borrow the shape of a war story I haven't earned. What I do have is a design conviction, formed from watching how automation tends to fail in exactly the operations where failure is most expensive, and a commitment to building NxSync ERP's disaster-recovery tooling around that conviction rather than around the more common instinct to automate everything that can be automated.
The instinct that gets people in trouble
There's a natural pull, once you've built a system capable of taking action on its own, to let it finish the job. If a restore process gets 90% of the way through and hits something unexpected — a schema mismatch, a partial write, data that doesn't look quite like the backup metadata claimed it would — the tempting move is to let the automation push through and clean up afterward. Momentum feels like progress. Stopping feels like failure.
I think that instinct is backwards for exactly one category of operation: anything that is hard or impossible to reverse. A restore is the clearest example. If a disaster-recovery process is running against production-adjacent data and it hits a condition nobody explicitly planned for, completing the operation anyway isn't bravery. It's gambling with something you can't get back, on the theory that it'll probably be fine — using "probably" as the standard for a decision where "probably" isn't good enough.
The design principle, stated plainly
The standard I want NxSync ERP's recovery tooling held to is this: an automated process should be allowed to refuse to finish. Not required to always finish once started, and not praised for pushing through ambiguity to hit a deadline — permitted, structurally, to say "I've hit a condition I wasn't built to handle safely, and I'm stopping here rather than guessing."
That sounds like a small thing to write down. In practice it cuts against almost every instinct that makes automation feel valuable — automation is supposed to be the thing that doesn't get tired, doesn't hesitate, finishes the job. Building a system that's explicitly allowed to hesitate, on the specific class of operations where hesitation is the safer choice, means resisting the urge to measure the tooling's success by completion rate alone.
What "safe to run" should require, concretely
For recovery and other hard-to-reverse operations, the standard I keep coming back to has a few concrete parts, and I think all of them need to be true together, not just one or two:
Rehearse in an isolated, disposable environment first. Never let the first real attempt at a recovery operation be the one that matters. If the tooling hasn't been exercised against a throwaway copy of the environment, running it against anything real is a bet, not a plan.
Classify the operation's risk before it starts, not while it's running. Decide in advance what "safe to proceed automatically" looks like for this specific operation, so the system isn't making that judgment call live, under time pressure, with incomplete information — which is exactly the condition under which bad judgment calls get made, by people and by automated systems alike.
Plan the operation as a dry run before committing to it for real. Know what the operation is going to do, and what it would affect, before it does it — so that when reality diverges from the plan, that divergence is detectable rather than discovered after the fact.
Draw an explicit boundary around what the automation will not attempt. Not everything should be automated just because it can be. Some steps deserve a human's direct hand precisely because the cost of getting them wrong is high enough that speed stops being the priority.
Keep evidence of what happened, especially when the answer is "it stopped." A system that declines to proceed and can show exactly why — which condition it hit, what it expected instead — is more trustworthy than one that always finishes and gives you no way to check what it actually did along the way.
An illustration, clearly marked as one
To make the principle concrete rather than abstract, it's worth walking through what "refusing to finish" would actually look like in practice, without pretending this walkthrough is a record of something that happened. Imagine a scheduled disaster-recovery rehearsal against a disposable copy of a tenant's environment. The restore process begins, and partway through, the row counts in a restored table don't match what the backup manifest claimed they should be — not wildly off, just enough to be inconsistent with a clean restore. A system built to always finish would proceed anyway, on the reasoning that a small discrepancy is probably noise. A system built around the standard above stops, surfaces exactly which table and which discrepancy triggered the halt, and waits for a person to look at it before anything further happens — even though the environment is disposable and the "cost" of stopping is just a delayed rehearsal, not a real outage.
That scenario is illustrative, not a report. I'm using it to make the standard legible, not to claim it as evidence the standard has already been tested against something real. The distinction matters, and collapsing it — letting a hypothetical read like a case study — is exactly the kind of overstatement I want this piece to avoid.
Why I'd rather admit the gap than paper over it
I don't yet have a completed, independently validated disaster-recovery story for NxSync ERP to point to, and I'm not going to pretend otherwise by dressing this principle up as a finished capability. What exists today is the design commitment above, guiding how recovery tooling is being built, and an explicit refusal to treat "the automation always completes the job" as a success metric anywhere near this part of the system. Full validation of that tooling under real failure conditions is future work, not a box already checked.
If there's a genuine tension I haven't resolved, it's this: a system that's allowed to refuse also has to be trusted to refuse for the right reasons, and not simply as an excuse for the tooling to be under-built. The difference between principled caution and convenient caution isn't always visible from the outside — it shows up over time, in whether the system's refusals turn out, in hindsight, to have been protecting something real. That's a track record I can only build by continuing to hold the standard, not one I can claim in advance.