Production checklist¶
Go through this before real agents depend on Myelinate. Details are in Security, Scaling and HA, Observability and Backup and upgrades.
Identity and access¶
- [ ]
MYELINATE_ENV=prod(the image default). Neverdevoutside a laptop: it disables authentication. - [ ] SSO through OIDC (
MYELINATE_OIDC_ISSUER,MYELINATE_OIDC_AUDIENCE,MYELINATE_OIDC_JWKS_URL,MYELINATE_OIDC_TENANT_CLAIM) for people and services that have an identity provider. - [ ]
MYELINATE_BOOTSTRAP_ADMIN_KEYis long and random, kept in a vault, used only to mint tenant keys, and rotated after setup. Remove it once OIDC covers administration. - [ ] Least-privilege scopes: agents get
learnonly;reviewgoes to people or pipelines that approve changes;adminto operators. One API key per agent or service, so you can revoke one without the others.
Data¶
- [ ] PostgreSQL, not SQLite, for anything with more than one replica or separate workers. Use a managed service.
- [ ] TLS to the database (for example
?ssl=requireonMYELINATE_DATABASE_URL). - [ ] Automated backups with point-in-time recovery, and a restore you have actually tested.
- [ ]
MYELINATE_EPISODE_RETENTION_DAYSset to your retention policy. Expired episodes are removed bymyelinate purge; schedule it (cron or a KubernetesCronJob). - [ ]
MYELINATE_REDACT_PII=true(the default) unless you have a reason and approval to turn it off. - [ ] A process for erasure requests (
DELETE /v1/admin/users/{user_id}; see the API reference).
Secrets¶
- [ ] Secrets (bootstrap key,
ANTHROPIC_API_KEY, database URL,MYELINATE_EMBEDDINGS_API_KEY) come from a secret manager, not from files in Git or images. - [ ] Keys are rotated on a schedule and when people leave.
Network¶
- [ ] TLS terminated at the ingress or load balancer.
- [ ]
MYELINATE_MCP_ALLOWED_HOSTSlists your public host(s); otherwise/mcpreturns 421. - [ ]
MYELINATE_CORS_ORIGINSis empty, or lists only the exact browser origins that need it. - [ ] Rate limiting in front (ingress, API gateway or WAF). The built-in limits are in-memory per replica.
- [ ]
FORWARDED_ALLOW_IPSset to your proxy's address so per-IP limits see real clients, and the gateway is not reachable except through that proxy (NetworkPolicy or security groups). - [ ] Egress limited to Postgres, the LLM API, your embeddings endpoint and your OTLP collector.
Runtime¶
- [ ] Separate workers:
MYELINATE_WORKER_ENABLED=falseon gateways, at least twomyelinate workerreplicas. - [ ] At least two gateway replicas, a PodDisruptionBudget, and spread across nodes or zones.
- [ ] CPU/memory requests and memory limits set (see the Kubernetes manifests for a starting point).
- [ ] Liveness and readiness:
/healthzand/readyzfor gateways;myelinate healthcheck(heartbeat file,MYELINATE_WORKER_HEARTBEAT_FILE) for workers. - [ ] Image pinned to a version tag or digest, not
latest. Upgrades go through staging first.
Observability¶
- [ ] Prometheus scrapes
/metricson every gateway (port 8080) and every worker (port 9464). - [ ] Alerts on:
/readyzfailures, 5xx rate, recall latency, worker restarts, budget exhaustion, database connections and storage. - [ ] Job health watched via
myelinate_jobs_total{status="failed"}and the pending backlog in thejobstable. - [ ] Logs shipped to your log platform (gateway and worker logs are JSON outside
dev). - [ ] Traces exported via OpenTelemetry if you run a collector.
Governance and learning¶
- [ ] Governance policy reviewed:
MYELINATE_AUTO_APPROVE_MEMORIES,MYELINATE_AUTO_APPROVE_LOW_RISK,MYELINATE_AUTO_APPROVE_MEDIUM_RISK(default off),MYELINATE_AUTO_APPROVE_MIN_EVAL_SCORE. - [ ] Someone owns the review queue for pending changesets.
- [ ] Canary and holdout settings chosen (
MYELINATE_CANARY_ENABLED,MYELINATE_HOLDOUT_RATE). - [ ]
MYELINATE_DAILY_TOKEN_BUDGETset per tenant, with an alert before it runs out. - [ ] Audit log (
/v1/admin/audit) retained or exported per your compliance needs.
LLM data handling¶
- [ ] You know where learning calls go. Reflection, judging, curation and evolution send episode content (after PII redaction) to the configured LLM provider. Check that provider's region and data-retention terms against your data-residency requirements, and the same for your embeddings endpoint.
- [ ]
MYELINATE_LLM_PROVIDER=nonefor tenants or environments where no data may leave your network (learning-side LLM features are then disabled).