Principle 09
What counts as a complete fix?
The complete fix is the default. A shortcut is a recorded decision, never a habit.
From the signed manifesto
“Complete” needs a boundary. It should mean that the problem we agreed to solve has been addressed, including the checks needed to know that the repair works. It cannot mean rebuilding every neighboring system or removing every conceivable source of failure.
For an engineer or team lead deciding whether a repair is finished, I would start by describing the behavior that must change. That gives both people and agents a stopping point they can defend.
The batch that keeps failing
Take a hypothetical document importer. One malformed attachment stops a batch, leaving the remaining documents unprocessed. An operator removes the attachment and restarts the job. The waiting documents arrive, and the immediate interruption is over.
If the team calls that a complete repair, the next malformed attachment can recreate the problem. The operator’s intervention has restored this batch without changing how the importer handles the condition.
A sufficient repair would address that condition directly. The importer could identify an unreadable attachment, preserve it for authorized investigation, report what failed and continue with independent documents. If later documents depend on the unreadable one, the system should identify that dependency and stop the affected work. Continuing indiscriminately would introduce a different defect.
The verification should match those promises. A deliberately malformed attachment should produce a visible failure record. An unrelated valid document should still arrive. Retrying should neither lose a document nor create an extra copy. A dependent document should not be reported as successfully processed when the information it needs is missing.
Those tests say more than a report that the batch finished. They distinguish the intended repair from an expedient change that simply catches every error and discards the troublesome files. Silencing an error is an especially tempting shortcut because it makes a process look healthier while reducing what the team knows.
Containment can be the right first move
During an active incident, insisting on a permanent repair before containing harm can be the wrong decision. If the importer is damaging outputs, pausing it may be the responsible action while the team investigates. If one feature can be isolated safely, disabling that feature can preserve useful service elsewhere.
The distinction must survive the handoff. Record what has been contained, what remains unresolved and the conditions for resuming. Give the remaining work an owner, a review date and an observable completion condition. “Temporary” written beside a patch does little if nothing causes anyone to return to it.
There is also a legitimate choice to stop using the importer entirely. If the team removes the faulty service and verifies a replacement route for the documents people still need, repairing the abandoned implementation may serve no purpose. Completion belongs to the agreed problem, not to a particular codebase.
I would not call every deliberate tradeoff a shortcut. A narrowly scoped feature that does its job, a disposable experiment and a planned sequence of releases can all be complete on their own terms. What deserves scrutiny is a concealed gap between the promise and the result.
Before closing the repair, have someone read the original problem alongside the evidence. Can another permitted input still trigger the same failure? Are affected records accounted for? Does the operating team know what happens when the new check rejects a document? If the answers are satisfactory, stop expanding the repair merely because more improvements are possible. Record those improvements as separate work, with their own reasons and priorities.