Deployment checks
uv run python -m bot.scripts.deploy runs all of these and prints one line each, so a single run surfaces every problem rather than only the first.
| Check | Verifies | Always runs? |
|---|---|---|
config |
Every setting the service needs is resolvable locally | yes |
pricing |
Every provider's effective model has a rate-table entry (a warning only -- an unpriced model runs, without a cost estimate) | yes |
boot-creds-live |
The vars the service reads at every boot are present on the deployed Render service under their current names -- not just locally | needs an operator key |
github-app |
The App has exactly one installation, every repo in GITHUB_TARGET_REPO is covered by it, and its webhook points here (set only if wrong) | yes |
health |
/healthz answers BOTH GET and HEAD -- UptimeRobot's free tier sends HEAD, so a GET-only endpoint lets the instance sleep | yes |
database |
Postgres is reachable and the app has provisioned its tickets table | needs an operator key |
runtime-config |
runtime_config has every column store.py's schema declares -- a column added after the table was first provisioned is never backfilled by the app's own CREATE TABLE IF NOT EXISTS boot DDL | needs an operator key |
provider |
The provider that will actually run -- LLM_PROVIDER, or an active DB override -- has its credential set | needs an operator key |
provider-live |
The actively-resolved provider's credential is present on the deployed Render service, not just locally | needs an operator key |
api-key-live |
The actively-resolved provider's actively-resolved key slot is present on the deployed Render service | needs an operator key |
render-service |
The latest Render deploy is live, and matches local HEAD when a commit is comparable | needs an operator key |
uptime-pinger |
A monitor targets /healthz exactly, is active, and polls at most every 10 minutes | needs an operator key |
Unskipping the optional checks
An optional check degrades to SKIPPED with a hint, never to a failure, when its operator-local key is unset. RENDER_API_KEY and UPTIMEROBOT_API_KEY are operator-local and are never set on the Render service; DATABASE_URL is both — the service needs it too, and --sync-env pushes it there.
RENDER_API_KEY(Render → Account Settings → API Keys) enablesboot-creds-live,render-service,provider-live,api-key-live, and--sync-env.UPTIMEROBOT_API_KEY(a read-only key) enablesuptime-pinger.DATABASE_URLenablesdatabaseandprovider— the provider override lives in the same database.