Skip to Content
SPAPS is proprietary hosted SaaS. Paid access required; pre-1.0 contracts may change. Terms and access
Maintainer OperationsMaintainer: Deployment Validation

Deployment Validation

Maintainer-only operator runbook. These checks govern the hosted service and do not grant a customer permission to deploy or operate the SPAPS backend.

Deployment validation should prove three things: the Python package still passes its code-quality gates, startup safety checks accept the target environment, and operational health endpoints can answer after the service boots. Keep this sequence boring; production auth and billing code should not depend on manual heroics.

Local Gate

make pytest make lint make typecheck make pytest-cov make test

Runtime Gate

make local-proof-up curl -fsS http://localhost:3301/health curl -fsS http://localhost:3301/health/ready curl -fsS http://localhost:3301/api/metrics

Use local-proof-up for a portable checkout. make local-up is reserved for internal operator workspaces that provide ../.env-manager/sync.sh.

Release Checklist

SurfaceCommandExpected signalDocs to refresh when it changes
Python test pathmake pytestRepo-owned test wrapper runs affected testsTesting and TDD
Runtime healthcurl -fsS http://localhost:3301/healthProcess health respondsEndpoint reference
Readiness invariantscurl -fsS http://localhost:3301/health/readyDependency and PII checks are namedSecurity invariants
Local persona modecurl -fsS http://localhost:3301/health/local-modeLocal mode state is explicitAuth and local mode
Metricscurl -fsS http://localhost:3301/api/metricsMetrics endpoint respondsEndpoint reference
Docs driftnpm run docs-contract:validateEndpoint, package, env, and CLI refs match fixtureRelease governance

Migration Gate

make migrate make new-migration MSG="describe_change"

What Startup Checks Catch

Check familyExample failure
Required settingsMissing DATABASE_URL, JWT secret, refresh secret
Production URLsNon-HTTPS SPAPS_API_URL or CFO_API_URL
Legacy API keysLEGACY_API_KEY_AUTH_ENABLED=true in production
CORSWildcard origin with credentials
WebhooksMissing destination allowlist policy
Self-serviceMissing allowed IP/CIDR boundary

The production app also checks PII and email-recipient invariants during lifespan startup before serving traffic.

See Also