599fd156d0
Before, a run that failed, held for operator review, and was then cancelled showed up on the tile and run header as plain "Cancelled" with an idle-grey mood — indistinguishable from a mid-stage cancel of a healthy run. That hides the actual failure from the dashboard. Now: when State=Cancelled with FailedStage still set (the hold-cancel signature the heartbeat handler already uses to pick reboot vs cancel_stage), the badge reads "Failed (cancelled)" with a fail- colored mood. Mid-stage cancels keep reading as plain "Cancelled".