efb9723787
Ed pointed a broken S3 entry at 127.0.0.1 with nothing listening. The classification worked end to end — the run paused with `target backend init: Transient Backend: … ConnectionRefused` — but the job row showed a green **ok** pill and the reason was only visible after expanding it. `PausedRetryable` reports `outcome: 'ok'` on the wire, and that is correct: the run did not fail, and a Resume continues it. But rendering it as plain "ok" hides the one thing worth acting on. A paused `backend_migration` is still holding `migration_readonly` and refusing writes across the whole application, presented as a healthy job. The row now reads **blocked**, in amber, with the reason as the pill's title so it is legible without unfolding anything. Amber rather than red, deliberately: nothing is broken and no data was lost — the run is waiting for the backend to return. Red reads as "this job is failing" and invites a Cancel, which for a migration also discards the copy already done and is the one action that cannot be undone. Checked BEFORE the findings branches, too. A run that never finished has nothing meaningful to say about findings, and "0 issues" on an aborted scan is a worse answer than "blocked". `JobOutcome.extra` was typed `unknown`, so the panel could not read the `retryable` flag the backend already sends. Now a narrow `JobOutcomeExtra` exposing just the three keys that describe the RUN's shape rather than its work — the rest stay per-job counters nothing generic should switch on. Same class of defect as the known "Ok despite findings" issue: an outcome that looks like success while hiding the state an operator needs to see. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>