User story
As a PantryPilot operator, I want production deployments to reference an immutable backend image digest or commit tag so that every deployment creates a traceable Azure Container Apps revision running the intended code.
Problem
The production workflow currently builds and pushes pantrypilot-backend:prod, then updates the Container App using that same mutable tag. Because the configured image string does not change between deployments, a deployment can complete and its health check can pass while an existing revision continues serving an older image digest.
This occurred on July 22, 2026. Production served backend source from before the async-session concurrency fix even though the fix had been merged to production and the deployment workflow had run. The stale revision produced:
sqlalchemy.exc.InterfaceError: cannot perform operation: another operation is in progress
Production was recovered manually by resolving the current prod tag to its digest and creating a new revision with az containerapp revision copy. The recovered revision was pinned to:
pantrypilotacrprodprod001.azurecr.io/pantrypilot-backend@sha256:67e85c928ff21164d58addda006e0dfc20955e62271ee5dc69e5895f9f14197b
Acceptance criteria
Implementation notes
- Pass the image digest or
workflow_run.head_sha from the image-build workflow into deployment.
- Prefer deploying
registry/repository@sha256:....
- Update
.github/workflows/build-images.yml, .github/workflows/deploy-prod.yml, and the Container App Bicep image configuration.
- Do not treat a generic HTTP 200 health response as proof that the expected build is running; verify build identity explicitly.
User story
As a PantryPilot operator, I want production deployments to reference an immutable backend image digest or commit tag so that every deployment creates a traceable Azure Container Apps revision running the intended code.
Problem
The production workflow currently builds and pushes
pantrypilot-backend:prod, then updates the Container App using that same mutable tag. Because the configured image string does not change between deployments, a deployment can complete and its health check can pass while an existing revision continues serving an older image digest.This occurred on July 22, 2026. Production served backend source from before the async-session concurrency fix even though the fix had been merged to
productionand the deployment workflow had run. The stale revision produced:Production was recovered manually by resolving the current
prodtag to its digest and creating a new revision withaz containerapp revision copy. The recovered revision was pinned to:Acceptance criteria
:prod.:prodimage reference.Implementation notes
workflow_run.head_shafrom the image-build workflow into deployment.registry/repository@sha256:.....github/workflows/build-images.yml,.github/workflows/deploy-prod.yml, and the Container App Bicep image configuration.