Documentation Index
Fetch the complete documentation index at: https://docs.emergence.ai/llms.txt
Use this file to discover all available pages before exploring further.
Troubleshooting
Symptom-first reference. Find the closest match below and follow the diagnostic steps. If your symptom isn’t here, file an issue with labelsolution-dev-guide and the symptom will land in the next revision.
401 / 403 from your service
401 Unauthorized — Missing or invalid bearer token
401 Unauthorized — Missing or invalid bearer token
403 Forbidden — Permission denied
403 Forbidden — Permission denied
- User lacks the OpenFGA tuple for the action — see RBAC Configuration
X-Project-IDpoints to a project the user has no access to- You’re calling the permission check with the wrong
resource_urishape
400 Bad Request — Missing X-Project-ID
400 Bad Request — Missing X-Project-ID
X-Project-ID. Add it to your test client / SDK calls. In FastAPI, use the project_id dependency from Authenticate Users.Pod crashes or “secret not found”
CrashLoopBackOff with 'secret <name> not found'
CrashLoopBackOff with 'secret <name> not found'
- ESO/Infisical hasn’t synced yet → wait one sync interval, or trigger manually
- Upstream secret doesn’t exist → create it in GCP Secret Manager / Infisical / Vault
- SecretStore points to wrong project/path → check ClusterSecretStore config
- K8s ServiceAccount missing Workload Identity annotation (GCP) → see Secrets deployment
Pod runs but reads empty value from env var
Pod runs but reads empty value from env var
- Key name mismatch between
secretKeyRef.keyand the K8s Secret data key - The
env:map invalues.yamloverridesenvVarswith the same name (the em-service env model deduplicates withenvwinning) → rename one of them - Secret value is literally empty in upstream (you set it to
""somewhere)
Secret rotated but pod still has old value
Secret rotated but pod still has old value
envFrom, em-service adds it by default. For custom volume-mounted secrets, you must add secret.reloader.stakater.com/reload: "<secret-name>" to podAnnotations — see Manage Secrets › Rotation.Image pull errors
ImagePullBackOff or ErrImagePull
ImagePullBackOff or ErrImagePull
image.repositoryorimage.tagis wrong- Registry is private and
imagePullSecretsnot configured - Pull-secret expired (registry tokens often have short lifetimes)
- Cluster cannot reach the registry (network policy / air-gapped environment)
- Wrong CPU architecture (e.g., arm64 image on amd64 cluster) — check with
docker manifest inspect
403 from registry but credentials look correct
403 from registry but credentials look correct
read:packages scope.Helm upgrade fails
Immutable selector field after first install
Immutable selector field after first install
.spec.selector. Once your release exists, you cannot change app.kubernetes.io/name, alias names, or labels that affect the selector. Workaround: helm uninstall and helm install (loses pod identity for ~1 cycle) — or re-create the namespace.Alias mismatch — values block ignored
Alias mismatch — values block ignored
em-service alias from api to webapp, every reference in values.yaml (and any --set) must update too. The platform won’t warn — it’ll just deploy with default values. Check rendered output:Chart version skew
Chart version skew
em-service version in Chart.yaml, run helm dependency update ./charts/<solution> before helm upgrade. Stale Chart.lock causes the old version to be deployed silently.Resource conflicts on first install
Resource conflicts on first install
helm install fails with “exists and cannot be imported into the current release.” Delete the orphans manually or use helm install --replace.CRD not found
no matches for kind "..." in version "..."
no matches for kind "..." in version "..."
- Gateway API (
gateway.networking.k8s.io/v1) → install viakubectl apply -k 'github.com/kubernetes-sigs/gateway-api/config/crd?ref=v1.1.0' - ExternalSecret (
external-secrets.io/v1beta1) → install ESO viahelm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace - The platform’s own CRDs (if you depend on
em-core) → install em-core first; see em-core Chart
em-service version requires a newer CRD than the cluster has
em-service version requires a newer CRD than the cluster has
em-service v0.0.16+ uses Gateway API v1 (not v1beta1). Some older clusters still have v1beta1 only. Either upgrade the cluster CRDs or pin em-service to a v0.0.15 line that supports v1beta1.LLM gateway errors
429 Too Many Requests
429 Too Many Requests
tenacity with wait_random_exponential), then surface a friendly message. Don’t retry forever.503 Service Unavailable / model unavailable
503 Service Unavailable / model unavailable
401 Unauthorized
401 Unauthorized
Cost dashboard shows un-attributed spend
Cost dashboard shows un-attributed spend
litellm.acompletion(...) without metadata={"project_id": ..., "solution": ...}. Grep for the call sites and confirm every one passes metadata.Streaming hangs
Streaming hangs
httpx.AsyncClient(timeout=httpx.Timeout(connect=5.0, read=120.0, write=5.0, pool=5.0)).Postgres errors
Connection refused / could not connect to server
Connection refused / could not connect to server
localhost, not the pod IP.Init container ordering: app starts before DB is ready
Init container ordering: app starts before DB is ready
waitForPostgres init container, or use a startup probe that retries until the DB accepts connections.Migrations conflict on parallel deploys
Migrations conflict on parallel deploys
helm.sh/hook: pre-install,pre-upgrade) so only one pod ever runs them at a time.Local dev gotchas
Kind: services on the cluster cannot reach localhost
Kind: services on the cluster cannot reach localhost
host.docker.internal (macOS/Windows) or your host LAN IP (Linux). Or run dependencies inside Kind via helm install.MinIO: SignatureDoesNotMatch
MinIO: SignatureDoesNotMatch
OBSTORE_PATH_STYLE=true. MinIO requires path-style addressing.uvicorn --reload not picking up changes
uvicorn --reload not picking up changes
--reload-dir packages/api/src if your code lives outside the cwd. Editor “atomic write” may not trigger watchdog → switch the editor’s save mode.docker-compose containers not healthy
docker-compose containers not healthy
docker compose ps shows unhealthy? Check docker compose logs <service>. The compose file in Local Development sets healthchecks; failures usually mean port conflicts or insufficient memory.Still stuck?
Report via the 👎 thumbs at the bottom of the affected page — include:- The exact symptom (with command + output)
- What you’ve already tried
- Your solution’s name and the cluster context

