Read every run back.
Filter by task, owner or keeper. A failed run shows its revert reason decoded where the bytes allow: a text reason, a panic code, a forge error, or the raw selector when the target's errors are unknown.
Runs are read from TaskRun events. Logs older than 20 blocks are kept in the index; newer ones are re-read every time and marked new. The forge keeps at most 256 bytes of a revert; longer reasons are cut.