Skip to content
VerifAIer
Home / Docs / Operations / Hardening · release · gaps
Operations · Hardening

Hardening, release & known gaps

The pre-production hardening checklist, the release gate, and a candid list of what is not yet in the app, so nothing surprises you in production.

Security hardening checklist

#ActionOwner
1Set a fixed random SESSION_SECRET (64 hex)app config
2AUTH_COOKIE_SECURE=true + HTTPS everywhereapp config + edge
3Restrict CORS_ORIGINS from ["*"] to known originsapp config
4Terminate TLS + HSTS at the reverse proxyedge
5Add general rate limiting / WAF at the gateway (app throttles login only)edge
6Set per-request timeouts at the gatewayedge
7Keep providers mock unless egress is intended; scope keys minimallyapp config
8Run the container as non-root (default appuser); read-only FS where possibleinfra
9Keep CC_PBKDF2_ITERATIONS at ≥ 100000 (never lower in prod)app config
10Rotate API keys / SESSION_SECRET on a scheduleops
11Put fine-grained authorization (RBAC/SSO) at the gateway, session tier has none yetedge
12Persist + back up DB_PATH; store copies off-hostinfra
13Ship stdout/stderr JSON logs to a central aggregator; alert on ERROR/CRITICALinfra
14Never commit .env; inject secrets via a secret managerops

Release checklist

  • Tests green: python -m pytest tests/ -q matches the known baseline (no new failures).
  • Build clean: python _build.py succeeds and the artifact contains no .env (only .env.example).
  • Version: confirm the package version (pyproject.toml) and that /health reports the expected service version.
  • Config diff: review env changes; confirm production settings (SESSION_SECRET, AUTH_COOKIE_SECURE, CORS_ORIGINS).
  • DB safety: back up DB_PATH and apply any pending migrations before serving traffic.
  • Smoke: run the smoke tests against the deployed instance.
  • Rollback ready: keep the previous image tag + pre-upgrade DB backup.

Known production gaps

Documented honestly so you can compensate at the right layer. None of these is a bug, each is a deliberate current boundary.

GapCurrent behaviorMitigation / owner
Backup / restore I/Ometadata records only, no actual backup or restore is performedrun real backups of DB_PATH; see resilience (infra)
Disaster recoveryno automated DR / failoverdefine RPO/RTO via your backup cadence + hosting (infra)
General rate limitingenforced on /api/auth/login only (per-IP)rate-limit all traffic at the gateway
Authorization (RBAC)session tier is authentication-gated; no role enforcement (fields reserved)enforce authz at the gateway / IdP
Federated identityself-hosted sessions + API keys; no OAuth/OIDC/SSO/MFAadd SSO at the gateway
Trust registry durabilityin-memory; lost on restart (rebuilds from observations)expected, re-observe; persist via the store if durability is needed
Datastore scalesingle-node SQLite by default (single writer)use DATABASE_URL Postgres for multi-node/HA
Request timeoutsno app-level wall-clock timeout (only the upstream provider call is bounded)set timeouts at gateway/client
Managed control planenone, fully self-hostedyou own the deployment lifecycle
SDK distributionPython/TS SDKs are in-repo, not published to PyPI/npmvendor from sdk/ or publish internally

Operational responsibilities

The full app-vs-infrastructure responsibility split is on the operations overview. In short: VerifAIer owns the deterministic evidence path, honest status reporting and secret hygiene; you own the edge (TLS, throttling, authz), durability (backup/restore/DR) and scale. Close each gap above at the layer named, and the deployment is production-sound.