| PR validation fails: shellcheck | Syntax error in modified .sh file | Run shellcheck build/*.sh locally, fix errors |
| PR validation fails: hadolint | Dockerfile lint rule violation | Check .hadolint.yaml for allowed suppressions, fix or document new ones |
| PR validation fails: Brewfile | Invalid Brewfile syntax | Check Ruby syntax, ensure packages exist (brew search) |
| PR validation fails: Flatpak | Invalid app ID | Verify app ID exists on https://flathub.org/ |
| PR validation fails: justfile | Invalid just syntax | Run just --list locally to test, fix syntax |
| CI build fails: workflow permissions | Missing id-token: write or packages: write | Verify .github/workflows/build-image.yml has correct permissions |
| CI build fails: token health | RENOVATE_TOKEN or GITHUB_TOKEN invalid/expired | Check token expiry, verify scopes, regenerate if needed |
| CI build fails: signing misconfig | OIDC token unavailable (self-hosted runner or restricted permissions) | Verify id-token: write is granted and the runner supports OIDC; signing is continue-on-error, so builds still publish |
| CI build fails: composite action not found | Wrong commit SHA or repo name in uses: | Verify projectbluefin/actions SHA, check network access |
| CI build succeeds but image not published | Wrong IMAGE_NAME or IMAGE_VENDOR | Check Containerfile ARGs, verify clean.yml package name matches |
Promotion gate blocked: release/blocked, cosign "no signatures found" | Image pushed by an older template snapshot before signing was default, or the Sign and publish step failed silently (continue-on-error) |