Docs Error taxonomy

DocsReference

#Error taxonomy

Every problem slug the harness can emit, generated by scanning every ProblemDef in the workspace's crates — core's registry and the modules' own — with cargo run -p cratefield-core --example errors-doc, and checked in CI for drift and for slugs defined twice: each slug is defined exactly once, and a module's slugs are emitted only where that module is mounted. Responses are RFC 9457 application/problem+json with instance = the request id, and type = <public_url>/problems/<slug>: the serving venture's own base, from its Venture::public_url (Venture::problem_base overrides it), so every venture names its problems under its own domain. A venture with no public URL — and any problem rendered outside a venture's context — carries the RFC 9457 §4.2.1 default about:blank instead of a URI that would name the wrong venture. The slug is the stable part to match on; a venture may also serve a human-readable page at each <public_url>/problems/<slug>.

SlugStatusTitleCrateDescription
admin-forbidden403Admin token rejectedcratefield-coreThe presented admin token is wrong.
admin-unauthorized401Admin access unauthorizedcratefield-coreAdmin endpoints are disabled or the request has no bearer token.
already-exists409That key is takencratefield-tables-apiA row of this table already has that primary key.
api-key-forbidden403API key lacks the required scopecratefield-coreThe presented API key is valid but does not carry the scope this route requires.
api-key-unauthorized401API key unauthorizedcratefield-coreThe request's API key was missing, malformed, unknown, revoked or invalid; one uniform answer for all five.
auth/client-disabled403Client is disabledcratefield-auth-coreA disabled client is refused by every flow
auth/cross-site-request403A same-origin request is requiredcratefield-auth-coreFetch metadata or the origin header reports another site; a request that can change state is accepted only from this venture's own origin
auth/email-token-refused400That link is no longer validcratefield-auth-coreMissing, expired, already used, never issued, or the address is now taken
auth/import-too-large413Too many users to importcratefield-auth-coreAn import may carry at most 1000 users in one request; nothing was written.
auth/last-login-method409That is the account's only login methodcratefield-auth-passkeysAdd another passkey or link a provider before removing this one
auth/magic-link-not-ready503Email sign-in is not availablecratefield-auth-magic-linkThe module is missing a port it requires
auth/magic-link-refused400That sign-in link is no longer validcratefield-auth-magic-linkMissing, expired, already used, or never issued
auth/meta-callback-refused400That sign-in link is no longer validcratefield-auth-metaMissing, expired, replayed or mismatched authorization state
auth/meta-not-configured503Facebook sign-in is not configuredcratefield-auth-metaAUTH_META_CLIENT_ID and AUTH_META_CLIENT_SECRET must both be set
auth/meta-unavailable502Facebook could not be reachedcratefield-auth-metaThe token exchange or the profile call failed; the detail is in the logs
auth/oidc-callback-refused400That sign-in link is no longer validcratefield-auth-oidcMissing, expired, replayed or mismatched authorization state
auth/oidc-provider-unavailable502The sign-in provider could not be reachedcratefield-auth-oidcDiscovery, the token exchange or the ID token failed; the detail is in the logs
auth/oidc-provider-unconfigured503That sign-in provider is not configuredcratefield-auth-oidcThe provider's AUTH_OIDC_<PROVIDER>_* settings are missing or unusable
auth/passkey-already-registered409That authenticator is already registeredcratefield-auth-passkeysThe credential id is already stored for an account
auth/passkey-ceremony-failed401The passkey ceremony could not be completedcratefield-auth-passkeysUnknown credential, spent or expired challenge, wrong origin, or a signature that does not verify — not distinguished
auth/passkey-prf-output-rejected400The passkey presented a PRF resultcratefield-auth-passkeysclientExtensionResults.prf.results is never accepted; send prf: { enabled } instead
auth/passkeys-unconfigured503Passkeys are not configuredcratefield-auth-passkeysAUTH_PASSKEYS_RP_ID and AUTH_PASSKEYS_ORIGINS must be set
auth/password-login-refused401That email address and password do not matchcratefield-auth-passwordWrong password, unknown address, or the account cannot sign in this way
auth/password-not-ready503Password sign-in is not availablecratefield-auth-passwordThe module is missing a port it requires
auth/password-token-refused400That link is no longer validcratefield-auth-passwordMissing, expired, already used, or never issued
auth/password-unsuitable400That password cannot be usedcratefield-auth-passwordToo short, too long, or found in a public breach corpus
auth/reauthentication-required403Sign in again to change thiscratefield-auth-coreThe session is too old and the password does not match, not distinguished
auth/session-invalid401A valid session is requiredcratefield-auth-coreMissing, unknown, revoked or expired session — not distinguished
auth/sso-domain-claimed409That email domain is already in usecratefield-auth-coreAn email domain routes to at most one active SSO connection per client
auth/sso-unauthorized401That SSO request is not authorizedcratefield-auth-coreThe admin API takes HTTP Basic with a confidential client's id and secret
auth/sso-unconfigured503SSO connections are not configured on this deploymentcratefield-auth-coreAUTH_CORE_SSO_TOKEN_KEY is missing or unusable
auth/token-request-refused400Token request refusedcratefield-auth-coreUnknown client, wrong secret, or an invalid grant — deliberately not distinguished
auth/tokens-unconfigured503Token issuing is not configuredcratefield-auth-coreSigning keys are absent; no token can be minted or published
bad-cursor400Not a cursor for this tablecratefield-tables-apiThe after parameter is not the next value from a previous page of this table.
bad-filter400Not a filter for this tablecratefield-tables-apiA query parameter names a column the table does not declare, or a value that is not that column's kind.
bad-key400Not a key for this tablecratefield-tables-apiThe path segment is not a value of the table's primary-key column.
bad-sort400Not a sort for this tablecratefield-tables-apiThe sort parameter names a column the table does not declare, or one whose nulls the engines order differently.
captcha-failed400Captcha verification failedcratefield-coreThe captcha token was missing or rejected; retry the challenge.
changelog-source-not-found404No such sourcecratefield-module-changelogThe configured repository has no releases, or does not exist. Check CHANGELOG_REPO.
changelog-upstream502The source could not be fetchedcratefield-module-changelogThe upstream source failed; nothing stored was changed. The detail carries what upstream answered.
composite-key400A composite key does not fit in one path segmentcratefield-tables-apiThe table's primary key is more than one column, so /{table}/{key} cannot name a row; name the key in the query at /{table}/__by?<column>=<value> instead.
connections-bad-state400That connection link is no longer validcratefield-module-connectionsThe connect state was never issued, has already been used, or has expired. Start the connection again.
connections-not-found404No such connectioncratefield-module-connectionsNo connection the venture holds has that id.
connections-oauth-denied400The provider did not grant accesscratefield-module-connectionsThe provider sent the browser back with an error instead of a code, so no connection was stored.
connections-reconnect-required409This connection needs to be reconnectedcratefield-module-connectionsThe provider rejected the stored refresh token, so the person must authorize the connection again before an access token can be issued.
connections-revoked409This connection was revokedcratefield-module-connectionsThe connection was revoked and its tokens were cleared, so there is nothing left to use or refresh.
connections-unknown-provider404Unknown providercratefield-module-connectionsThe callback names a provider key the venture has not configured, so there is no client to exchange the code with.
connections-upstream502The provider could not complete the connectioncratefield-module-connectionsTalking to the provider's token endpoint failed, or it answered with a body that is not a token response.
crm-already-exists409That value is already takencratefield-module-crmA contact's normalized email address and an organisation's domain are each unique. Another row already holds the value you tried to set, so nothing was changed: use a different value, or merge the two records.
crm-stale-generation409The record has changed since you read itcratefield-module-crmThe generation in the body is not the one the row holds now, so somebody else wrote to it in between. Nothing was changed: read the record again, reapply your edit to the current values and retry with the new generation.
device-auth/approver-required401Sign in to approve a devicecratefield-module-device-authThe device page is served only to a signed-in person; no subject was identified.
device-auth/cross-site-request403A same-origin request is requiredcratefield-module-device-authThe approval form accepts only a request a browser reports as coming from this venture's own origin.
device-auth/too-many-attempts429Too many attemptscratefield-module-device-authOne approver has entered wrong user codes more often than the configured allowance.
device-auth/unknown-user-code404Unknown or expired codecratefield-module-device-authNo pending, unexpired device request carries that user code.
device-rehome-limit429Too many devices taken overcratefield-module-notificationsThis account has claimed too many devices that belonged to other accounts.
internal500Internal errorcratefield-coreUnhandled error; no internals are exposed in the body.
invalid-token400Invalid or expired tokencratefield-coreA signed link or token is malformed, tampered with, or expired.
linkedin-fact-check-failed422The commentary does not keep the facts of its sourcefz-module-linkedinA protected span of the source (name, number, quote, code, link, hashtag or mention) is missing or altered in the commentary, or the commentary introduced a number. missing and introduced list each one.
linkedin-not-connected409No LinkedIn account connectedfz-module-linkedinConnect a page first: POST /v1/linkedin/admin/connect.
linkedin-page-role-missing403The connected account cannot post to this pagefz-module-linkedinThe page is unknown, revoked, or held with a role that cannot publish organic posts.
linkedin-reconnect-required409LinkedIn connection needs renewingfz-module-linkedinLinkedIn rejected the stored credentials. A page administrator must connect again.
linkedin-upstream502LinkedIn rejected the requestfz-module-linkedinLinkedIn answered with an error. The detail carries its code.
mail-not-configured503Mail is not configuredcratefield-coreNo sending domain is verified; use the direct address shown by the form.
no-membership-fact500Tenant membership cannot be checkedcratefield-tables-apiThis table admits members of the tenant, and on a deployment that resolves tenants from a registry there is no membership fact to check.
no-reads400A batch with no readscratefield-tables-apiA batch names at least one read; an empty one is a request with no question.
no-such-row404No such rowcratefield-tables-apiNo row of this table has that key.
no-such-table404No such tablecratefield-tables-apiThis venture declares no table by that name.
no-verifier500Cannot identify the callercratefield-tables-apiThis table is not public and the deployment wired no way to verify a caller.
not-a-key-column400Not a key column for this tablecratefield-tables-apiA __by query names primary-key columns only. To narrow by any other column, read the page and filter it.
not-a-row422Not a row of this tablecratefield-tables-apiThe body does not match the table's declared columns.
not-found404Not foundcratefield-coreNo route matched the request.
not-production-ready503Not ready for production trafficcratefield-coreThis deployment declares production but cannot satisfy the abuse controls its routes declare.
not-ready503Service not readycratefield-coreReadiness probe failed: the database is missing, erroring or too slow.
not-yours-to-give403That row would not be yourscratefield-tables-apiThe subject column names a different caller; a row written here is your own.
orgs-already-member409Already a membercratefield-module-orgsThat account already belongs to this organization.
orgs-email-unverified403Your email address is not verifiedcratefield-module-orgsAccepting an invitation matches the caller's verified address against the one invited, and the credential this request carried proved none.
orgs-forbidden403Your role does not allow thiscratefield-module-orgsThe caller's role in this organization does not permit the change they asked for — only owners, and the manager roles the venture named, may manage members and invitations, and only an owner may grant or change the owner role.
orgs-invalid-email422That is not an email addresscratefield-module-orgsThe address to invite could not be normalized and validated as one.
orgs-invalid-name422An organization needs a namecratefield-module-orgsThe name was empty or whitespace only.
orgs-invitation-for-someone-else403That invitation is for another addresscratefield-module-orgsThe signed-in account's verified address is not the one the invitation was sent to. The invitation has not been spent.
orgs-invitation-gone410That invitation is no longer validcratefield-module-orgsThe invitation token is unknown, has lapsed, or has already been accepted. An invitation is single-use, so a second acceptance is refused.
orgs-last-owner409An organization keeps an ownercratefield-module-orgsThis is the organization's only owner, so it cannot be removed or demoted. Grant the owner role to somebody else first.
orgs-mail-failed502The invitation could not be sentcratefield-module-orgsThe mailing provider refused the invitation message, so no invitation was created. Nothing is left behind to accept; try again.
orgs-not-found404No such organizationcratefield-module-orgsNo organization the caller is a member of carries that id. An organization the caller is not in answers the same way, so its existence is not disclosed.
orgs-unknown-role422Unknown rolecratefield-module-orgsThe role is not one of the roles this venture configured for its organizations. The configured set is fixed at build.
owlpost-unverified401Unverified deliverycratefield-module-owlpostThe request carried no signature this deployment could verify, or one that did not hold.
partial-key400The key is not completecratefield-tables-apiName every primary-key column of the table once: a row is addressed by its whole key. after and sort are the page's parameters on this route and cannot name a key column, so a table whose key uses one of those names has no address here.
privacy-provider-unverified401Unverified provider callcratefield-module-privacyThe request carried no signature this deployment could verify, or one that did not hold.
rate-limited429Rate limit exceededcratefield-coreToo many requests from this IP or address; retry after the pause.
request-too-large413Request body too largecratefield-coreThe request body exceeded the 64 KiB limit for /v1 endpoints.
sealed-already-exists409That blob id is already storedcratefield-module-sealedThe client generated this blob id, and a record under it already exists for this subject. Nothing was changed.
sealed-not-found404No such blobcratefield-module-sealedNo blob the caller holds carries that id. A blob held by someone else answers the same way, so its existence is not disclosed.
sealed-precondition-failed412The record has changed since you read itcratefield-module-sealedThe If-Match revision is not the one the row holds now, so somebody else wrote to it in between. Read the record again, reapply your edit and retry with the fresh ETag.
sealed-precondition-required428An If-Match header is requiredcratefield-module-sealedRead the record first and send its ETag back as If-Match; a write without one is refused rather than applied blind.
sidecar-contract-mismatch503Sidecar contract mismatchcratefield-coreA sidecar answers a different HARNESS_API than this harness speaks.
sidecar-unauthorized401Unauthorized sidecar callercratefield-coreA request to a sidecar-guarded route could not be established as coming from the trusted gateway.
sidecar-unavailable503Sidecar module unavailablecratefield-coreA sidecar-mounted module could not be reached; other modules are unaffected.
table-forbidden403Not yours to reachcratefield-tables-apiThe table's declared access level does not admit this caller.
table-misdeclared500Table declaration cannot be enforcedcratefield-tables-apiThe table declares owner access without a subject column to match a caller against.
table-read-only403Not writablecratefield-tables-apiThis table's declared access is public-read: it is served, never written.
telegram/action-not-confirmable409Action cannot be confirmedcratefield-module-telegramThe action is not awaiting passkey confirmation, or it has expired, or it was already confirmed.
telegram/action-not-yours403Not your actioncratefield-module-telegramActions are confirmed by the account they were requested for.
telegram/no-such-action404No such actioncratefield-module-telegramNo action with that id exists.
telegram/passkey-required403Passkey confirmation requiredcratefield-module-telegramApproving a value-moving action needs a fresh passkey ceremony, and this request did not carry one this deployment could verify.
telegram/unauthenticated401Sign in firstcratefield-module-telegramThis route is available only to a signed-in user.
telegram/unverified401Unverified deliverycratefield-module-telegramThe delivery carried no secret token this deployment could verify, or one that did not hold.
telemetry-payload-rejected400Telemetry payload rejectedcratefield-module-telemetryThe batch carries a value outside the closed grammar the notice route publishes.
telemetry-schema-unsupported400Telemetry schema not supportedcratefield-module-telemetryThe batch names a payload schema version this collector does not parse.
tenant-degraded503Tenant is degradedcratefield-coreThe tenant's schema is behind or its database is unreachable; its neighbours are unaffected.
too-many-reads400Too many reads in one batchcratefield-tables-apiA batch carries at most 20 reads; send the rest as another batch.
unauthenticated401Not authenticatedcratefield-coreA credential was presented and did not verify, or none was presented where one is required.
unknown-category400Unknown notification categorycratefield-module-notificationsThe named category is not declared by this venture.
unknown-product400Unknown productcratefield-coreThe named product is not on this waitlist.
unknown-tenant404Unknown tenantcratefield-coreThe request's host resolves to no tenant in the registry.
usage/allowance-exhausted429Usage allowance exhaustedcratefield-coreThe subject's metered allowance is spent for the current period; retry after the period resets.
validation-failed400Request validation failedcratefield-coreThe request body or query did not deserialize into a valid request.
verifier-unavailable503Cannot check the credentialcratefield-tables-apiThe service that verifies credentials could not answer. Try again shortly.
wallets/address-already-linked409Wallet already linkedcratefield-module-walletsThis wallet is already linked to a different account.
wallets/chain-mismatch400Chain mismatchcratefield-module-walletsThe chain in the message is not the chain this request, and this service, are for.
wallets/domain-mismatch400Domain mismatchcratefield-module-walletsThe domain in the sign-in message does not match this service's domain.
wallets/invalid-message400Invalid sign-in messagecratefield-module-walletsThe message could not be parsed as a SIWE or SIWS sign-in message.
wallets/message-expired400Message expired or not yet validcratefield-module-walletsThe message's expiration time has passed or its not-before time is in the future.
wallets/nonce-invalid400Invalid or expired noncecratefield-module-walletsThe nonce is unknown, already used, issued to another account, or expired.
wallets/not-found404No such wallet linkcratefield-module-walletsNo wallet link with that id belongs to your account.
wallets/signature-invalid400Signature verification failedcratefield-module-walletsThe signature does not prove ownership of the address in the message.
wallets/unauthenticated401Sign in to manage walletscratefield-module-walletsThese routes are available only to a signed-in user.
webhook-unverified401Unverified webhook deliverycratefield-module-notificationsThe delivery did not carry a signature this deployment could verify.
webpush-not-configured404Browser push is not configuredcratefield-module-notificationsThis venture serves no Web Push application server key.

Mirrored from docs/ERRORS.md at b6f50cd. The harness is the source of truth: a correction goes there first.