metrics_runner follows the upscale_runner job pattern: CPU-only PIL->numpy, manifest writes under the lock (reload, set by id, atomic replace), progress event + polling endpoints, cancel. Dashboard cog-panel button. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>