Debugging deploys
You never need kubectl. Everything a red deploy can tell you is reachable through the API and the console.
Configuration rejected (HTTP 400)
Validation runs at upload, before anything is stored. The response lists every problem at once, with suggestions for typos:
{
"valid": false,
"errors": [
"runtime node requires runtimeConfig.command; Pagifier never inspects package.json",
"unknown field \"artefact\" — did you mean \"artifact\"?"
]
}
Fix the file and re-run POST /v1/validate until it returns the resolved
configuration. Put validation in your PR pipeline so this never reaches a
deploy.
Build failed
The Release captures the tail of the build log. With ?wait=true it
arrives in the terminal stream; otherwise fetch the status:
curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod"
{
"activeRelease": {
"phase": "Failed",
"message": "build job failed: BackoffLimitExceeded",
"buildLog": "src/App.tsx(42,7): error TS2304: Cannot find name 'foo'\n..."
}
}
Common causes: a build command that works locally but not in a clean
checkout, a missing artifact.directory after the build (the error names
the directory it looked for), or an artifact digest mismatch (the upload
was corrupted or tampered with — re-upload).
Deployed but not Available
phase: Deploying that never becomes Available means pods are not
passing their readiness probe. Check the probe path — healthCheck: /health
must return 200 — and the app logs:
curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod/logs?tailLines=200"
With autoRollback: true (the prod default), a stalled rollout reverts
automatically and the notification names the failed release.
Canary aborted
The Release message and the deploy notification name the exact gate and value:
canary aborted: analysis gates exhausted the failure budget:
gate error-rate: 0.031 exceeds max 0.01
The primary release never stopped serving — there is nothing to roll back. Fix the regression and upload again. Current canary state (weight, last analysis) is always visible on the status endpoint and in the console.
What changed?
Every upload response includes configChanges — the diff between the new
resolved configuration and the currently active release. To inspect the
full snapshot a release runs with:
curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod/releases/RELEASE_ID/config"
Audit trail
GET .../events merges the platform audit log (who uploaded, who rolled
back) with Kubernetes events (build started, canary advanced, cutover) for
the application.