Start here
These four commands identify most problems:Installation
Control-plane pod is in CrashLoopBackOff
Control-plane pod is in CrashLoopBackOff
BETTER_AUTH_SECRETorSETTINGS_ENCRYPTION_KEYshorter than 32 charactersBASE_URLnot a valid absolute URLDATABASE_URLmissing or malformed
Init container 'migrate' never completes
Init container 'migrate' never completes
DATABASE_URL must match
POSTGRES_PASSWORD in the same Secret./api/health returns 503
/api/health returns 503
PVC stays Pending
PVC stays Pending
ReadWriteOnce volumes.Ingress returns 404 or 502
Ingress returns 404 or 502
Authentication
Login succeeds but immediately returns to the login page
Login succeeds but immediately returns to the login page
publicUrl does not match the URL in the
browser, so the session cookie is scoped to the wrong host and rejected.
Align publicUrl, ingress.host, and DNS, including https:// versus
http://.Setup page still appears after creating an account
Setup page still appears after creating an account
Setup rejects the claim token
Setup rejects the claim token
SETUP_CLAIM_TOKEN in the running pod’s environment
exactly. If you changed the Secret, restart the Deployment so it is re-read.OIDC fails with redirect_uri_mismatch
OIDC fails with redirect_uri_mismatch
https://<publicUrl-host>/api/auth/oauth2/callback/<provider-key>.All users were signed out unexpectedly
All users were signed out unexpectedly
BETTER_AUTH_SECRET changed. Restore the original value to preserve
sessions; otherwise users simply sign in again.Workspaces
Workspace did not become ready in time
Workspace did not become ready in time
workspace.runtimeClassName is set.In a chat, only the workspace tool call that waited fails with this message;
the response itself continues. The control-plane or executor log records a
workspace.start.failed event with the chat and run IDs.ImagePullBackOff on workspace pods only
ImagePullBackOff on workspace pods only
workspace.imagePullSecret is not set. The control plane’s imagePullSecrets
does not apply to workspace pods, so both must be configured for private
images.Workspaces never scale to zero
Workspaces never scale to zero
WORKSPACE_IDLE_SECONDS.Agent commands die without output
Agent commands die without output
workspace.resources.limits.memory.Installed tools vanish between sessions
Installed tools vanish between sessions
/home/r5d persists. Anything installed into system paths is lost when
the pod scales to zero. Add durable tooling to the workspace image instead.Document search returns nothing
Document search returns nothing
grep for exact
text.Models and providers
Test connection fails immediately
Test connection fails immediately
ALLOW_PRIVATE_EGRESS or ALLOW_INSECURE_HTTP is
enabled.Chat returns a provider authentication error
Chat returns a provider authentication error
Model not found
Model not found
/v1 without repeating the version segment.A model rejects images or cannot see a screenshot
A model rejects images or cannot see a screenshot
readfile uses OCR text and other tool images are replaced with an omission
note, including images in older conversation history.If an image-containing request is rejected with HTTP 400 or 422 before the
provider starts streaming, chat retries that model request once without
images. Tools are not repeated. A notice names the model and this setting;
operators can find the provider.image_input.rejected warning in server logs.
Remaining requests in that run omit images too. The transcript and model
configuration are not changed: a bad image can also cause a rejection, so
later turns try image input again and have the same fallback. If the text-only
attempt also fails, check the provider and the model’s Image input setting.Images omitted during fallback are not interpreted or automatically OCR’d.
Turn off Image input and ask the agent to read the file again for OCR, or
choose a vision-capable model. Endpoints that silently ignore images cannot
be detected this way. Partial streams, network failures and authentication
errors are never retried by this fallback.Long conversations start failing
Long conversations start failing
A response says the model returned an empty response
A response says the model returned an empty response
chat.response.timing record
with outcome empty_response, so the request can be traced in provider or
proxy logs. A response a content filter stopped, or that reached its output
limit before writing anything, is named as such instead.Provider settings became unreadable
Provider settings became unreadable
SETTINGS_ENCRYPTION_KEY no longer matches the one used to encrypt the data,
usually after a restore. Restore the original key; otherwise credentials must
be re-entered.No default model is set
No default model is set
MCP Apps
If ordinary MCP tools work but the interactive interface is unavailable, checkmcpApps.sandboxOrigin (MCP_APPS_SANDBOX_ORIGIN) and the separate sandbox
Deployment. A healthy product /api/health does not verify sandbox routing.
The chart creates no sandbox Ingress: wildcard DNS and TLS must route to the
sandbox Service on port 3002, not the product Service. See
MCP Apps for origin validation errors, browser checks,
proxy configuration, and rollback without disabling ordinary MCP tools.
Helm
helm repo add fails with 404
helm repo add fails with 404
index.yaml. Verify directly:helm search finds no versions
helm search finds no versions
helm repo update r5d-chat, then helm search repo r5d-chat --versions.Upgrade fails and rolls back
Upgrade fails and rolls back
--atomic, Helm reverts automatically. Inspect why before retrying:Slow responses
Each chat response logs onechat.response.timing JSON line: the control plane
logs it for direct responses, and the executor for durable runs. Each stream a
browser follows for a durable run logs one chat.stream.delivery line in the
control plane. Records carry chat, run, message, and request IDs, never prompts,
output, tool payloads, or credentials.
chat.response.timing are consecutive, so the largest one shows
where the time went. After queueMs, they add up to firstVisibleMs: the time
from the start of execution until the first model output was visible.
firstByteMs counts any upstream activity after the request was sent, including
keep-alives, so a small firstByteMs with a large firstContentMs means the
provider was connected but not yet generating. workspace describes the
background workspace start: its state, how long it took (startMs), and how
long tool calls waited for it (toolWaits, toolWaitMs).
chat.stream.delivery describes what one browser received: when the first
model content was sent (firstContentMs), how long after it was saved
(contentLagMs), and how many keep-alive comments the server sent to hold the
connection open (keepalives). Keep-alives never count as output.