You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
CI builds the runtime image but never publishes it — deploy-by-digest has no artifact to point at #351
Deploy-side context: mforce/cluckwork-deploy#6 (deploy manifest), go-live milestone. Follow-on to #266, which is closed — this is the one part of its fix that did not land, found while building the deploy manifest against the real image.
What is there today
.github/workflows/ci.yml has an image: job ("Image build + Trivy scan") that does the right build:
It builds the true multi-stage runtime image, proves --locked-mode is enforced (#315), and Trivy-scans HIGH/CRITICAL. That is real coverage and it works.
The gap
Nothing publishes that image.grep -rn "docker push|push: true|login-action|ghcr.io" .github/ returns no matches. cluckwork-api:ci lives in the runner's local daemon and dies with the runner.
#266's app-side fix listed "Identify the artifact by immutable commit SHA/digest." The build half shipped; the identify-and-publish half did not.
Why it blocks the deploy side
cluckwork-deploy#6 requires the image that passed CI is the image that deploys — deploy by digest, so a deploy cannot rebuild untested bytes. With no published artifact there is no digest to deploy, and the only options left on the host are:
rebuild from source at deploy time (defeats the requirement — different bytes than CI tested, and the Trivy scan result no longer describes what is running), or
build locally and push by hand (defeats CI gating entirely).
Neither is acceptable for go-live, so the deploy manifest cannot satisfy its acceptance criteria until an artifact survives CI.
Suggested shape (app-side; deploy repo has no say in your CI)
On main (and optionally tags), push the already-built image to ghcr.io/mforce/cluckwork, tagged with the commit SHA.
Publish only afterbuild-and-test, web and the Trivy scan pass, so a red run cannot produce a deployable artifact.
Emit the resulting digest as a job output / step summary — the deploy side consumes ghcr.io/mforce/cluckwork@sha256:..., not a moving tag.
Needs permissions: packages: write on that job.
Package visibility (private vs public) and whatever pull credential the host uses are deploy-side concerns; I will wire those in cluckwork-deploy#6 once a digest exists to point at.
Not asking for
Any change to the deploy manifest, registry choice enforcement, or host wiring — those are mine. This issue is only "make the tested artifact survive CI with a stable digest".
Activity
fix(ci): harden the release job after review (#351)
fix(ci): close the published-but-untagged version hole, revive the di…
fix(ci): preserve bump intent, make releases idempotent, close two fa…
fix(ci): fail closed on registry lookup, use the complete tag set, st…
fix(ci): probe the registry before pushing, so a partial release is r…
docs(readme): document how an image gets published (#351)
fix(ci): preserve the digest on retag, and keep releases draft until …
fix(ci): promote the digest CI recorded, not whatever the registry ta…
fix(ci): use a buildx-version-safe digest format, widen the promote b…
fix(ci): add a CI repair dispatch so a skipped commit cannot wedge a …
fix(ci): add a CI repair dispatch so a skipped commit cannot wedge a …
fix(ci): bind a repair dispatch to the draft it claims to repair (#351)
feat(ci): version releases through a release PR and promote images by…
fix(ci): correct the security rationale for the release App token (#351)
fix(ci): correct the one-job blast-radius claim (#351)
fix(ci): scope the ambient-token claim to same-repo pull requests (#351)
fix(ci): key the read-only carve-out on the event, not the trigger (#351
fix(ci): stop claiming the release commit would ship unverified (#351)
fix(ci): open the release PR with a downscoped GitHub App token (#351) (
chore(release): keep versions below 1.0.0 until deliberately promoted (…
chore(release): set initial-version so the first release is 0.0.1 (#351…
fix(ci): give the promote job a repo for gh to act on (#351) (#378)
fix(#417): codex round 16 — allow-list image values instead of enumer…
fix(#417): codex round 17 — exact workflow-output shape, flow-style i…
chore(schema): generate PostgreSQL schema documentation (#460)
docs: track fences properly in the ToC parser, and name both breaking…
docs: compress AGENTS.md to one paragraph per rule, and draw the two …
chore(ci): skip the image and web jobs on documentation-only pull req…