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
Staging (and PR review-app) builds silently broke on Jul 10 and stayed broken for days while CI remained green. Root cause: the Jul 10 dependabot bumps (#507, #509) updated {{cookiecutter.project_slug}}/pyproject.toml but did not regenerate {{cookiecutter.project_slug}}/uv.lock. Immediate fix: #510 (regenerate the stale template lock).
This issue tracks the underlying fragility that let a routine dep bump take down deploys undetected.
Why it broke silently
Heroku does not deploy the committed my_project/. It re-renders the cookiecutter template at build time:
…then runs uv sync --locked on the freshly rendered project. So the real deploy artifact is a build-time render of {{cookiecutter.project_slug}}/, and CI never exercises that path — it renders + lints the template but never runs uv sync --locked on the render. Any drift between the template's pyproject.toml and its uv.lock breaks deploys with zero CI signal.
Problems to address
No CI guard for the deploy path. Add a job that renders the template and runs uv sync --locked --no-default-groups (i.e. the exact Heroku step) so template lock/render drift fails CI, not the deploy.
Dependabot doesn't keep the template lock in sync. Bumps touch {{cookiecutter.project_slug}}/pyproject.toml but not its uv.lock. Automate regenerating the template lock (render → uv lock → copy back) as part of dependency updates, or fold it into the CI guard above.
Build-time cookiecutter render is a fragile deploy strategy. Reconsider re-rendering the template on every deploy. Options: deploy a committed rendered project, or at minimum gate the render behind a tested step.
Duplicate heroku/python buildpacks + subdir relocation (app.json) make the build hard to reason about (two Python passes, one on the repo root's tooling deps, one on the rendered app). Simplify.
uv version / lock-revision consistency. Heroku uses uv 0.11.28 (writes lock revision = 3); the repo's committed locks are revision = 1. Pin/standardize uv across Heroku + CI + local and normalize lock revision so a newer uv doesn't silently reintroduce drift.
Background
Staging (and PR review-app) builds silently broke on Jul 10 and stayed broken for days while CI remained green. Root cause: the Jul 10 dependabot bumps (#507, #509) updated
{{cookiecutter.project_slug}}/pyproject.tomlbut did not regenerate{{cookiecutter.project_slug}}/uv.lock. Immediate fix: #510 (regenerate the stale template lock).This issue tracks the underlying fragility that let a routine dep bump take down deploys undetected.
Why it broke silently
Heroku does not deploy the committed
my_project/. It re-renders the cookiecutter template at build time:…then runs
uv sync --lockedon the freshly rendered project. So the real deploy artifact is a build-time render of{{cookiecutter.project_slug}}/, and CI never exercises that path — it renders + lints the template but never runsuv sync --lockedon the render. Any drift between the template'spyproject.tomland itsuv.lockbreaks deploys with zero CI signal.Problems to address
uv sync --locked --no-default-groups(i.e. the exact Heroku step) so template lock/render drift fails CI, not the deploy.{{cookiecutter.project_slug}}/pyproject.tomlbut not itsuv.lock. Automate regenerating the template lock (render →uv lock→ copy back) as part of dependency updates, or fold it into the CI guard above.heroku/pythonbuildpacks + subdir relocation (app.json) make the build hard to reason about (two Python passes, one on the repo root's tooling deps, one on the rendered app). Simplify.revision = 3); the repo's committed locks arerevision = 1. Pin/standardize uv across Heroku + CI + local and normalize lock revision so a newer uv doesn't silently reintroduce drift.Immediate status