Home / Several agents and adversarial checking
Three failure states, and accepting a risk properly
An automation that processes a queue should distinguish success, recoverable failure that will be retried, and definitive failure that is abandoned, and only the third should reach a person, otherwise every recoverable failure wears out the value of the alert on the day it is right; accepting a risk with a compensating control differs from ignoring it, a snapshot taken before execution allowing the result to be sorted into three paths, silent normal variation, a significant change that only alerts, catastrophic loss that restores automatically.
A queue of automated tasks produces three possible outcomes for each item processed: a success, a recoverable failure that will be retried later, and a definitive failure that will stay failed whatever the system does afterwards. Lumping the last two together into a single failure category breaks the value of any alert built on top of it.
Why confusing the two failures wears out the alert
If every recoverable failure triggers the same alert as a definitive failure, a team receives a notification for an incident that will probably resolve itself on the next attempt. Repeated often enough, this alert loses its value: the people receiving it learn to dismiss it without reading it, because most of the time it signals nothing that demands immediate action. On the day it finally carries a definitive failure, the expected reaction no longer comes, precisely because the alert has been right too often for the wrong reasons. A one-off network timeout illustrates a typical recoverable failure, it often disappears on the next attempt; missing data at the source, which will not reappear on its own, illustrates a typical definitive failure.
result = process(task)
if result == success:
report nothing
elif result == recoverable_failure:
requeue the task, do not alert
elif result == definitive_failure:
alert a person
Accepting a risk is not the same as ignoring it
A compensating control accepts the risk of an action rather than preventing it in advance: it lets the action happen, then checks afterwards whether it had the expected effect. A snapshot taken before execution makes this check possible by giving a point of comparison, the result obtained is then sorted into three paths, a normal variation that stays silent, a significant change that alerts without acting on its own, and a catastrophic loss that triggers an automatic restore. A compensating control that has never been triggered on test data does not yet deserve the trust placed in it. A previous lesson shows that multiplying agents does not make a result more reliable; cleanly distinguishing these three failure states is another way of keeping control over what actually gets escalated, rather than letting every alert fire at the same level.
Automatic retry or human escalation, depending on the type of failure
Silent retry
The task is put back in the queue without alerting anyone, this is the normal case for a temporary failure.
Premature alert
A person is disturbed for an incident that would probably have resolved itself on the next attempt, which wears out the value of the alert.
Masked failure
The system keeps retrying a failure that will never resolve, without anyone knowing.
Legitimate escalation
Only this case deserves to disturb a person, the action will not succeed without human intervention.
A manager sets up an automation that sends a notification to their team every time one of the hundred files processed overnight fails, whether the cause is a one-off network timeout or missing data in the source file.
Write in one sentence what this situation establishes, and in one sentence what it does not establish.
What this establishes: The situation establishes that the same notification is triggered for any failure, whether the cause is temporary, such as a network timeout, or lasting, such as missing data at the source.
What this does not establish: It does not establish that the team actually treats these two notifications the same way in practice, nor that it has stopped paying attention to them, no reaction from the team is described in the situation.
The three most common miscalibrations
- Too broad This configuration guarantees that the team will eventually ignore every notification, including those signalling a lasting problem.
- Too narrow This situation allows no claim about how the automation works, the number of one hundred files has no bearing on its behaviour.
- Off target This situation shows that the team's network suffers timeouts frequently enough to justify a dedicated automation.
- A queue of automated tasks benefits from distinguishing three outcomes, success, recoverable failure that will be retried, and definitive failure, only the latter should trigger an alert sent to a person.
- Escalating every recoverable failure as though it were a definitive failure wears out the value of the alert, to the point that no one reacts any more on the day it signals a real problem.
- A snapshot taken before execution allows the result obtained to be sorted into three distinct paths, a normal variation handled silently, a significant change that only alerts, and a catastrophic loss that triggers an automatic restore.
- A compensating control accepts the risk of an action rather than preventing it, provided it has actually been triggered on test data before it is trusted.
Choose an automation you already use that processes several items in a row. For a recoverable failure and for a definitive failure, write on one line what happens today, nothing is escalated, a silent retry, or a person is disturbed, and check whether the two types of failure produce the same reaction.