Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 16s
PR Gates / CI image pin matches docker/ci (pull_request) Failing after 16s
PR Gates / Docs update reminder (pull_request) Successful in 25s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 11s
PR Gates / decisions lifecycle (pull_request) Successful in 23s
Build CI Toolchain Image / Build & push CI image (push) Successful in 1m4s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 17m38s
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 18m48s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 23m19s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Second pin-recovery cycle on this branch — main moved twice during review and each rebase rewrites the sha of the commit that touched docker/ci. Records that #598 now length-checks the pin at exactly 7 chars, which turns a locally-computed 8-char `git rev-parse --short` into a loud gate failure instead of a confusing manifest-unknown at image-pull time. That guard came from #594, filed by this session after hitting exactly that ambiguity. This commit also IS the recovery: it touches docker/ci, so ci-image.yml tags it and the pin can be re-pointed in the follow-up commit. Refs #445 #594