Issue: #896
Purpose: A gate-by-gate checklist that every release owner completes before promoting
a build from staging to production. Each section maps to an automated CI check, a manual
verification step, or an owner sign-off. All items must be checked (or explicitly waived
with a written reason) before the release tag is pushed.
- Open a new Release Readiness issue using this document as the body.
- Assign the release owner and secondary reviewer.
- Work through each section in order. Mark items
[x]as you verify them. - For any item you waive, replace
[ ]with[~]and add a one-line reason inline. - Tag the issue with the target version (
v*.*.*) and milestone. - Only push the git tag (which triggers
production-deploy.yml) after the issue is fully checked off and the secondary reviewer has approved.
All of these are enforced by GitHub Actions before
production-deploy.ymlruns. Verify each workflow is passing on the commit you intend to tag.
- Backend Governance (
backend-governance.yml) — lint, unit tests, API contract snapshot check, OpenAPI drift check, schema migration drift check, andnpm audit(high severity) all pass. - Frontend CI — lint and unit tests pass (
frontend.yml/ thefrontend-cijob inproduction-deploy.yml). - Rust / WASM build (
rust-wasm.yml) — contracts compile to WASM with zero warnings. - Rust security scan (
rust-security.yml) —cargo auditandcargo denypass. - Slither static analysis (
slither.yml) — no new High/Medium findings; all known findings documented incontracts/.false-positives.md. - Secret scanning (
secret-scanning.yml) — no secrets detected in the diff. - E2E tests (
e2e.yml/cypress.yml) — all end-to-end scenarios green on staging. - Integration smoke test (
integration-smoke.yml) —GET /healthandGET /readyreturn 200 on the staging deployment. - Load tests (
load-tests.yml) — P95 latency within SLO budgets on staging (/api/v1/vault/summary≤ 200 ms, deposits/withdrawals ≤ 500 ms).
- No
TODO/FIXMEcomments in release-scoped files that haven't been tracked in an issue. - No debug logging left enabled (
console.log,logger.log('debug', …)calls not gated byNODE_ENV). -
npm audit(backend) — zero High severity findings. Run:cd backend && npm audit --audit-level=high -
cargo audit(contracts) — zero vulnerabilities in Cargo dependency tree. Run:cargo audit - Dependency pinning — no open version ranges (
^/~) introduced in this release without justification. -
CHANGELOG.mdupdated —[Unreleased]section promoted to the release version with today's date, following Keep a Changelog.
- All migrations are additive — no
DROP COLUMN,DROP TABLE, or destructive schema changes without a prior deprecation release. - Migration applied to staging —
npx prisma migrate deploycompleted successfully on the staging database with zero errors. -
db:check-driftpasses on staging — runnpm run db:check-driftagainst the staging database; output is clean. - Rollback plan documented — for any migration that cannot be automatically
reversed, a rollback SQL script exists in
backend/prisma/migrations/<version>/rollback.sqland has been reviewed. - Index audit — new queries introduced in this release have corresponding indices
(see
backend/docs/QUERY_OPTIMIZATION.md);EXPLAINoutput reviewed for any query expected to scan > 10 k rows.
- OpenAPI document is current —
npm run generate:openapiproduces no diff against the committedbackend/openapi.json. - Schema snapshots pass —
npm run snapshots:checkexits 0. - No unannounced breaking changes — if any field was removed or its type changed,
the deprecation policy in
docs/API_VERSIONING_POLICY.mdwas followed (sunset window announced, migration guide published). - Webhook schema version bump — if
WEBHOOK_SCHEMA_VERSIONwas incremented, the change is documented inbackend/src/webhookDelivery.tsand communicated to webhook consumers. - Smart contract ABI backward-compatible — no public function signatures removed or parameter types changed without a new contract version and migration path.
-
All required production env vars are set — verify against
backend/.env.production.exampleandbackend/docs/ENVIRONMENT_VARIABLES.md. Critical vars:Variable Notes DATABASE_URLPostgreSQL with sslmode=requireVAULT_CONTRACT_IDMainnet contract address STELLAR_RPC_URLPoints to mainnet ( soroban-mainnet.stellar.org)STELLAR_NETWORK_PASSPHRASEPublic Global Stellar Network ; September 2015CORS_ALLOWED_ORIGINSProduction domains only, no localhostADMIN_AUDIT_LOG_STORAGEprismain productionALERT_TYPE+SLACK_WEBHOOK_URL/PAGERDUTY_INTEGRATION_KEYAlert routing active WALLET_NONCE_ENFORCEMENTstrictWALLET_SIGNATURE_MODEstellarWEBHOOK_ALLOW_UNVERIFIEDabsent or false -
No development defaults leaked —
NODE_ENV=production,STELLAR_NETWORK=mainnet,ADMIN_AUDIT_LOG_STORAGEis notmemory. -
Secrets rotated if exposed — if any secret appeared in a commit, PR comment, or log, it has been rotated before the release.
-
.env.productionnot committed —git statusand.gitignoreconfirm no production secret files are tracked. -
gitleaks/ secret-scanning workflow clean —secret-scanning.ymlpassed on the release branch.
- PR security checklist completed — the PR template security section was signed off for every PR merged into this release.
- Slither High/Medium finding count compared to the previous release — document any new findings and their disposition (fixed / false positive / accepted risk).
- Admin RBAC review — no new admin route was added without a corresponding
Permissionentry insrc/middleware/rbac.tsand RBAC test coverage. - Input validation coverage — every new POST/PATCH endpoint uses the
validate()middleware with a named Zod schema; no rawreq.bodyaccess without prior schema parsing. - Rate limiting applied — new public endpoints are covered by an appropriate rate-limiter tier (auth, summary, deposits, default).
- Webhook input validation —
WebhookRegisterSchemaandWebhookUpdateSchemaremain enforced on all webhook management routes. - Impersonation sessions — if any change touches
AdminImpersonationSession, a dedicated security review was requested.
- Health endpoint returns
status: healthyon staging after the final deploy. - Readiness endpoint returns
ready: trueon staging (all dependencies up). - SLA registry up to date — new endpoints introduced in this release are registered
in
src/endpointSlaRegistry.tswith ap95BudgetMsandtier. - Prometheus metrics endpoint (
/metrics) scrapes cleanly with no parse errors. - Latency alerts configured —
ALERT_TYPE,SLACK_WEBHOOK_URL, and/orPAGERDUTY_INTEGRATION_KEYare set and a test alert was fired successfully in staging. - Error rate baseline — error rate on staging over the past 24 h is below 1 % for
all
tier: criticalendpoints. - Dead-letter queue empty —
GET /admin/webhooks/dead-letterreturns an empty list on staging before cutover.
- Staging deploy is green —
staging-deploy.ymlcompleted successfully on the release commit (contracts on testnet, backend and frontend deployed). - Database backup taken — a full snapshot of the production database was taken within 2 hours before the deploy.
- Drain window communicated — if the deploy requires a maintenance window,
POST /admin/maintenancewas used to schedule it and users were notified. - Deploy command — the production deploy is triggered by pushing the git tag:
This triggers
git tag v<MAJOR>.<MINOR>.<PATCH> git push origin v<MAJOR>.<MINOR>.<PATCH>production-deploy.yml→ frontend CI → frontend build → Vercel deploy → smoke test → deployment summary. - Backend deploy — if the backend is deployed separately (Railway / Render / etc.),
confirm
npx prisma migrate deployran against the production database before traffic was shifted. - Smoke test passed —
GET /healthandGET /readyreturn 200 on the production URL within 5 minutes of deploy completion. - Vercel production URL confirmed — the URL in the
notifyjob summary matches the expected production domain.
-
Critical endpoint spot-check (run within 10 minutes of deploy):
Endpoint Expected Actual GET /health200,status: healthyGET /ready200,ready: trueGET /api/v1/vault/summary200, numeric fieldsGET /api/v1/transactions?limit=1200, pagination envelopeGET /api/v1/vault/apy/history?days=7200,count >= 0 -
Error rate unchanged — check Prometheus / Grafana dashboard; no spike in 5xx responses post-deploy compared to the pre-deploy baseline.
-
Latency within SLO — P95 for
/api/v1/vault/summaryand/api/v1/transactionswithin budgets defined insrc/endpointSlaRegistry.ts. -
No runaway jobs —
GET /admin/jobs/dashboardshows all background jobs (APY snapshot, idempotency retention, event polling) in a healthy state. -
Audit log entry present — at least one entry appears in
GET /admin/audit-logsfrom the deploy window, confirming persistence is working. -
GitHub Release created —
release.ymlgenerated the GitHub Release with the auto-updatedCHANGELOG.mdentry.
-
Rollback trigger defined — rollback is initiated if any of the following occur within 30 minutes of deploy:
GET /healthreturns non-200 for > 2 consecutive minutes- Error rate on any
tier: criticalendpoint exceeds 5 % - Any
HIGHSentry alert fires for a new error type
-
Rollback procedure (document the steps for this specific release):
1. Revert the Vercel deployment to the previous production deployment via the Vercel dashboard or CLI: `vercel rollback --token $VERCEL_TOKEN` 2. If migrations were applied and are irreversible, notify the DBA team and execute backend/prisma/migrations/<version>/rollback.sql (if present). 3. Re-tag the previous stable version to trigger a clean redeploy: git tag v<PREV_VERSION>-rollback git push origin v<PREV_VERSION>-rollback 4. Confirm /health and /ready return 200 after rollback. 5. Open a post-mortem issue within 24 hours. -
On-call engineer identified — name and contact for the 2-hour post-deploy monitoring window:
____________________
| Role | Name | Date | Signature |
|---|---|---|---|
| Release owner | |||
| Secondary reviewer | |||
| Security reviewer (if contract changes) |
backend/docs/ENVIRONMENT_VARIABLES.md— latency monitoring env varsbackend/docs/QUERY_OPTIMIZATION.md— DB index rationale (Issue #895)backend/docs/WEBHOOK_SIGNATURES.md— webhook securitydocs/API_VERSIONING_POLICY.md— breaking-change and sunset policydocs/DEPLOYMENT_CHECKLIST.md— testnet & mainnet deployment checklistdocs/SECURITY_CHECKLIST.md— smart contract security review guidedocs/FALSE_POSITIVE_HANDLING.md— Slither false positive processCHANGELOG.md— release history.github/workflows/README.md— CI workflow index