No exception, no log line. There was a day with five of these.
| What it said | What was true |
|---|---|
| CI green | Nothing actually ran |
| Search: 0 results | A 2KB bot-block page |
Progress file: ok:225 | It re-read the husk it had produced itself |
PUT 200 SUCCESS | Value unchanged. Six weeks of no-ops |
| Function: "none found" | It was treating a tuple like a string |
| Cron exited 0 | The guard caught itself; the job never ran once |
registered: true, reason: null | Zero images |
| Doc says "all deleted" | 68 left |
Principle: look at the raw data before you rule
len < threshold or an unexpected type means failure.When only a traceback is left and even "new: 0" never prints, dead and empty look the same
A notification batch died on a KeyError — bracket access (rec['url']) on one field of one record of external data. The log held a traceback and nothing else; the "new: 0" line a healthy run prints was missing too. "No orders today" and "the batch is dead" produce the same log.
"new: 0" has to appear, or death and absence are indistinguishable..get(). Bracket access kills the whole run over a single record missing one key.