TellWang
Dashboard

Error codes

Every non-2xx response from the control plane returns a stable JSON envelope:

error envelope
{
  "error": {
    "code": "CP_PROJECT_NOT_FOUND",
    "message": "no active project with that wok_id in this org",
    "hint": "verify the wok_id and that it belongs to your org",
    "correlation_id": "1aee612b1250f276"
  }
}

code is the stable machine-readable identifier — classify on this. message is human-prose. hint is the remediation. correlation_id echoes back the cp's per-request id; include it when filing a ticket so the operator can pull the journal.

Below: the codes a customer is most likely to hit, with the side that fixes each (caller = your client code; state = the wok or org needs to be in a different state; platform = open a ticket).

Authentication & authorization

CodeHTTPFix sideRemediation
CP_UNAUTHENTICATED401callerSend Authorization: Bearer <skl_…> (or sllm_… for the LLM gateway). Sessions and bootstrap tokens both work where listed.
CP_INVALID_KEY401callerThe Bearer doesn't match the expected shape (skl_<hex> or sllm_<hex>). Check for whitespace + truncation.
CP_LLM_KEY_INVALID401callerThe sllm_ key has been revoked or doesn't exist. Mint a fresh one via POST /v1/llm-keys.
CP_INVALID_CREDENTIALS401callerEmail/password on /login don't match. Re-check the credentials.
CP_WEAK_PASSWORD400callerSign-up password doesn't meet the 8+ character minimum.
CP_USER_NOT_IN_ORG403callerThe Bearer is valid but the caller isn't a member of the requested org. Either pass the right slug or have the org owner invite you.

Not found / wrong state

CodeHTTPFix sideRemediation
CP_ROUTE_NOT_FOUND404callerNo route at that METHOD PATH. Typically a URL typo. The message echoes back the method + path so you can spot the typo. See API reference for the canonical endpoint catalogue.
CP_METHOD_NOT_ALLOWED405callerThe path exists but the HTTP method doesn't. e.g. DELETE /v1/healthz when healthz only accepts GET. Check the route's allowed methods in API reference.
CP_PROJECT_NOT_FOUND404caller / stateNo active wok with that id in this org. Note: cross-org access deliberately returns 404 not 403, to avoid enumeration. Verify via GET /v1/woks.
CP_ORG_NOT_FOUND404callerNo org with that slug. Slugs are case-sensitive.
CP_NOT_ACTIVE409stateThe wok is destroyed (terminal). Provision a fresh one via POST /v1/woks.
CP_STATUS_STALE503stateThe wok status row hasn't been refreshed by the reconciler yet. Retry in 5s.
CP_FUNCTION_NOT_FOUND404caller / stateNo function with that name on the wok. List via GET /v1/woks/{id}/functions.
CP_RELEASE_SOURCE_MOVED409stateWok Git changed while an SSR artifact was being built. Rebuild from the current checkout; the stale bundle was rejected before deployment.
CP_RELEASE_ROLLBACK_INVALID400 / 409caller / stateThe target is not a source-linked successful release, is absent from Wok Git, or is already current. Select rollback_target.id from get_release_status.
CP_RELEASE_ROLLBACK_FAILED500state / platformThe rollback could not redeploy. Inspect its rollback and compensation details; TellWang attempts to replay the prior source so partial code is not left live.
CP_RELEASE_UNVERIFIEDdiagcaller / stateSource, artifact, or runtime-check evidence is incomplete. Inspect get_release_status and run the missing browser/function probe.
CP_RELEASE_FAILEDdiagcaller / stateThe live receipt has source divergence, artifact drift, or a failed check. Repair the named signal and create a new verified release.
CP_TRIGGER_NOT_FOUND404callerNo installed trigger with that name. List via GET /v1/woks/{id}/triggers.

Validation

CodeHTTPFix sideRemediation
CP_BAD_JSON400callerRequest body isn't valid JSON, or required fields are missing. The message names the field.
CP_INVALID_NAME400callerIdentifier doesn't match the expected regex (e.g. wok ids ^[a-z][a-z0-9]{0,30}$, env-var names ^[A-Z][A-Z0-9_]{0,63}$). The message spells out the actual regex.
CP_INVALID_BODY400callerJSON-valid but semantically wrong (e.g. bulk-env with both vars and dotenv, or cron expression that doesn't parse).
CP_BULK_TOO_LARGE413callerBatch exceeds the per-call cap (200 vars on bulk env). Split into multiple requests.
CP_SQL_TOO_LARGE413callerexec_sql body exceeds 1 MiB. Split into smaller migrations.
CP_LLM_BODY_TOO_LARGE413callerLLM chat-completions body exceeds 1 MiB. Trim history or use a smaller system prompt.

Capacity & rate limits

CodeHTTPFix sideRemediation
CP_WOK_QUOTA_EXCEEDED402callerYou're at your plan's wok limit. Upgrade via POST /v1/orgs/{slug}/billing/checkout/subscription or delete an unused wok.
CP_LLM_MODEL_UNSUPPORTED400callerSet model:"private".
CP_LLM_PROVIDER_DISABLED410callerExternal provider and BYOK routing is inactive.
CP_LLM_INSUFFICIENT_BALANCE402callerThe prepaid model allowance is empty.

Upstream / platform

CodeHTTPFix sideRemediation
CP_DB_QUERY_FAILED500platformThe cp's own Postgres returned an error. Check GET /v1/diag for the cp_db subsystem; file a ticket with correlation_id.
CP_DUMP_DB_NOT_READY503stateWok's db container hasn't finished provisioning. Retry in 5–10s.
CP_EXEC_SQL_FAILED502stateThe docker-exec call into the wok's db container failed (often because it's restarting). Retry; if persistent, hit /diag/wok/{id}.
CP_LLM_UPSTREAM_FAILED502platformThe private LLM upstream returned an invalid response or timed out.
CP_LLM_NOT_CONFIGURED503platformThe private LLM password is missing from the platform secrets backend.
CP_EMAIL_UPSTREAM_FAILED502platformThe Resend API call failed. The message echoes Resend's status. Common cause: the sending domain hasn't been verified yet.
CP_DOMAIN_UPSTREAM_FAILED502platformCloudflare Registrar or DNS API call failed. The message echoes CF's response.
CP_FUNCTIONS_NOT_ENABLED503stateThis wok was provisioned before functions shipped and has no functions_port allocated. The reconciler heals this on its next sweep, or call POST /v1/woks/{id}/restart to force it.

Managed RAG

CodeHTTPFix sideRemediation
CP_RAG_NOT_ENABLED409stateEnable the optional runtime with PUT /v1/woks/{id}/rag and wait for status:"ready".
CP_RAG_DEPLOY_FAILED502state / platformInspect /diag/wok/{id} and the rag-api plus rag-worker service logs.
RAG_INGESTION_IN_PROGRESS409stateOne atomic revision is already building. Poll its parent job to a terminal state before submitting the next manifest.
RAG_FORBIDDEN403caller / policyThe caller lacks the required management or author role, or anonymous chat is disabled for this agent. Use the intended signed role, or deliberately enable anonymous access only for a public agent.
RAG_RATE_LIMITED429callerThe end-user principal/client exceeded its one-minute retrieval, chat, generation, or insight allowance. Wait for the returned window; keep service-role calls server-side.
RAG_INGESTION_BATCH_FAILEDjobcaller / stateThe old revision remains active. Repair the failed child documents, then retry with a new idempotency key.
RAG_POLICY_FILTER_FAILED500 / jobplatformRetrieval stopped before a model call because the SQL result and application policy disagreed. Disable the affected agent and reconcile the collection.
RAG_NO_PERMITTED_SOURCESjobcallerThe signed user cannot read any requested source. Correct the document allow/deny policy or use the intended group and sensitivity ceiling.
RAG_PARSE_TIMEOUTjobcallerThe isolated parser exceeded its wall-clock or CPU budget. Inspect or convert the source, then submit a new atomic batch.
RAG_MODEL_BUDGET_EXCEEDEDjobcallerThe governed map-reduce job reached max_model_calls. Raise the bounded cap when the cost is intentional, or partition the corpus.

Beyond this list

For every other code emitted by the cp, the response envelope's hint field gives the same remediation a customer support reply would. Hits to /diag (see Diagnostics) are the canonical "what's wrong" surface; correlation_id ties a single request across cp logs + downstream container logs + the audit log.