When a stage ends in failed/cancelled/unknown the drawer now shows
a coloured "Reason" pill at the top of that stage's section. Three
sources, in order of preference:
1. stage.error_text (the canonical, when set)
2. job.error_text (backfilled in the drawer endpoint when stage's
own is empty — catches orphan rows from hard crashes like the
pre-busy-timeout DB-locked failures)
3. Heuristic: if log_text is tiny (<500 bytes, just the START
banner) AND no real badblocks progress was recorded, label as
"Stopped without recording an error — likely cause: SSH
connection drop or container restart while this stage was
running." This catches the fingerprint of a deploy-during-burn-in
killing the SSH session.
Otherwise: "No error message recorded." so there's never a blank
where the operator expects to see why something broke.
Red styling for failed, yellow for cancelled/unknown. Replaces the
inline stage-error-line for terminal states; the existing
stage-error-line still renders for non-terminal contexts.