OpenWOP openwop.dev

Error codes generated from spec/v2/errors.json

Route on error, never on message.

The canonical OpenWOP v2 error envelope is { error, message, details? } returned with the registered HTTP status. This page lists every code in the v2 error registry with its HTTP status and whether it is retriable.

Codes by HTTP status

120 codes in the v2 registry. The status carries the primary classification; the error field disambiguates within it.

  1. 40028 codes
  2. 40112 codes
  3. 40313 codes
  4. 4046 codes
  5. 4061 code
  6. 40915 codes
  7. 4103 codes
  8. 4132 codes
  9. 4151 code
  10. 42227 codes
  11. 4261 code
  12. 4291 code
  13. 5004 codes
  14. 5011 code
  15. 5022 codes
  16. 5033 codes

The envelope

{
  "error": "validation_error",
  "message": "Request body fails schema",
  "details": {
    "field": "workflowId",
    "reason": "missing"
  }
}
error
Machine-readable identifier: a registered code or a vendor code.
message
Human-readable explanation, for people and logs only.
details
Optional structured context; contextual data (conflict refs, trace ids, validation paths) lives here, never at a new top level.

Every code

Grouped by HTTP status, with meaning and whether it is retriable.

Generated from spec/v2/errors.json at build time, so it cannot drift from the corpus. Envelope shape: core/errors.md.

Envelope shape

{
  "error": "validation_error",
  "message": "Request body fails schema",
  "details": {
    "field": "workflowId",
    "reason": "missing"
  }
}
  • error — machine-readable identifier: a registered code or a vendor code. Clients route on error, never on message. Stable within a major; new codes land additively.
  • message — human-readable explanation, for people and logs only. Good practice (not a v2 rule): don't echo the offending input verbatim, since it can carry a prompt-injection payload or a credential.
  • details — optional structured context; contextual data (conflict refs, trace ids, validation paths) lives here, never at a new top level. The body carries nothing else (additionalProperties: false).

The HTTP status code carries the primary classification; the error field disambiguates within the status class. A host MUST answer with the status the registry assigns to the code. Retry timing lives in the Retry-After header only — never in details.

Codes by HTTP status

HTTP 400 — 28 codes

CodeMeaningRetriable
connection_provider_unresolvedA connector or pack references a connection provider that nothing defines.no
connector_action_unresolvedA pack's connector action or trigger names a node type the same manifest does not define.no
credential_scope_unsupportedThe credential request names a scope the host does not support.no
delegation_chain_cyclicThe delegation chain repeats a subject.no
delegation_chain_too_longThe delegation chain is longer than the host's bound.no
idempotency_key_invalidThe Idempotency-Key value does not match the required grammar.no
interop_version_unsupportedAn A2A or MCP negotiation would land below the host's advertised minimum version.no
oauth_provider_unsupportedA node names an OAuth provider the host does not advertise.no
oauth_scope_unsupportedA node asks for an OAuth scope the provider does not advertise.no
pack_dependency_cycleThe pack dependency graph contains a cycle.no
pack_engine_unsupportedThe pack's engines range does not admit the host's protocol major.no
pack_integrity_failureThe uploaded or fetched pack's SHA-256 does not match the declared digest.no
pack_kind_invalidThe manifest's content does not match its declared pack kind, or mixes kinds.no
pack_lockfile_incompleteThe workspace references a pack the lockfile does not list.no
pack_peer_dependency_missingThe host does not provide a capability the pack declares as a peer dependency.no
pack_peer_dependency_undefinedA peer-dependency key is not a declared capability family or alias.no
pack_signature_invalidThe pack's signature, signing key or namespace check failed.no
pack_validation_failedThe pack manifest is invalid.no
protocol_version_mismatchA /v1/ path was called with an OpenWOP-Version other than 1.no
schedule_horizon_exceededA schedule asks for a fire time beyond the host's advertised horizon.no
sub_chain_cycleA workflow chain transitively composes itself.no
sub_chain_depth_exceededWorkflow chain nesting is deeper than the host's advertised maximum.no
unsupported_runtimeThe host cannot execute the pack's runtime language.no
unsupported_stream_modeThe requested stream mode is malformed or not served; details.supported lists the modes the host serves.no
until_in_pastA capability record's until date is in the past.no
validation_errorThe request is malformed or fails schema validation.no
webhook_endpoint_unverifiedThe webhook endpoint did not answer the verification challenge; nothing was stored.no
webhook_url_rejectedThe webhook URL is not an allowed public https:// destination.no

HTTP 401 — 12 codes

CodeMeaningRetriable
audience_mismatchThe credential was issued for a different audience than this host.no
connector_auth_declinedThe user declined the connector's authorization request, so the node failed.no
connector_auth_expiredThe connector's credential expired and could not be refreshed, so the node failed.no
credential_lifetime_exceededThe credential's lifetime exceeds the bound the host advertises for its lane, or it carries no iat.no
credential_revokedThe presented API key or session has been revoked.no
delegation_expiredA delegation or workload credential is past its lifetime.no
identity_unresolvableThe credential verified, but it maps to no known subject.no
identity_unverifiedThe credential or delegation chain failed verification.no
interrupt_token_invalidThe interrupt token uses an algorithm or key the host does not accept.no
key_revokedThe API key has been revoked or its subject disabled.no
sender_constraint_missingThe request does not meet the lane's minimum sender-constraint assurance.no
unauthenticatedNo credential was sent, or the credential is invalid.no

HTTP 403 — 13 codes

CodeMeaningRetriable
credential_forbiddenThe credential exists but is outside the caller's scope.no
credential_scope_forbiddenThe credential cannot be bound at the requested scope.no
delegation_scope_amplifiedA delegated link claims more scope than its delegator holds.no
egress_deniedThe host refused an outbound request a pack asked it to make: the address guard or the egress policy denied it.no
forbiddenThe caller is authenticated but not permitted to do this.no
force_engine_version_forbiddenForcing an engine version is refused outside test keys.no
id_tenant_mismatchThe id's tenant segment is not the caller's tenant.no
mock_provider_forbiddenThe mock AI provider is refused outside test keys.no
pack_namespace_unauthorizedThe pack's signing key is not allowed for its namespace.no
run_forbiddenThe caller may not act on this run.no
sandbox_capability_deniedSandboxed code called a host capability it is not allowed to use.no
sandbox_escape_attemptSandboxed code tried to escape its sandbox.no
workspace_membership_requiredThe caller is not a member of the workspace the request names.no

HTTP 404 — 6 codes

CodeMeaningRetriable
credential_not_foundNo credential resolves for the requested reference.no
interrupt_not_foundThe interrupt does not exist.no
not_foundThe resource does not exist, or the caller may not see it.no
pack_version_not_foundThe requested pack version is not served.no
replay_source_missingDuring replay, a side-effecting node has no recorded source outcome, so it failed closed.no
signature_not_availableNo signature is served for this pack version.no

HTTP 406 — 1 code

CodeMeaningRetriable
protocol_version_unsupportedThe OpenWOP-Version header names a version the host does not list; details.protocolVersions lists what it serves.no

HTTP 409 — 15 codes

CodeMeaningRetriable
connection_provider_conflictTwo registrations claim the same connection provider id.no
envelope_correlation_conflictAn envelope reuses a correlationId already seen in this run with a different type.no
idempotency_in_flightA request with the same idempotency key is still being processed.no
idempotency_key_mismatchThe idempotency key was reused with a different request.no
interrupt_already_resolvedThe interrupt is already resolved, its run has ended, or its token was invalidated.no
pack_dependency_conflictTwo packs require versions of a third pack that no single version satisfies.no
pack_integrity_mismatchThe fetched pack's SHA-256 does not match the lockfile.no
replay_context_summary_unavailableThe fork was refused: the host cannot serve the context summary as of the fork point.no
replay_diverged_at_refusalReplay diverged: the source and the replay disagree on whether the AI provider refused.no
replay_memory_snapshot_unavailableThe fork was refused: the host cannot serve memory state as of the fork point.no
run_already_activeA run for the same scope is already active and deduplication is enforced.no
run_state_conflictThe run's current status does not allow this transition; details.runStatus names it.no
run_terminalThe run has already finished, so it cannot be changed.no
version_conflictThis pack version was already published with different content.no
workspace_conflictThe workspace file changed since the caller last read it.no

HTTP 410 — 3 codes

CodeMeaningRetriable
interrupt_cancelledThe interrupt was cancelled. The core resolve operations never return this code.no
interrupt_expiredThe interrupt token is past its expiry.no
run_expiredThe run, or the part of its event log the request needs, was purged under the host's documented retention.no

HTTP 413 — 2 codes

CodeMeaningRetriable
payload_too_largeThe request body is larger than the host accepts.no
workspace_too_largeThe workspace file is larger than the host's advertised maximum.no

HTTP 415 — 1 code

CodeMeaningRetriable
unsupported_media_typeThe request body's Content-Type is not accepted.no

HTTP 422 — 27 codes

CodeMeaningRetriable
approval_rejectedAn approval gate resolved rejected (a decision, a quorum or a timeout) and no edge routed the failure, so the node and the run failed.no
budget_exhaustedA hard budget dimension was exhausted and the run failed.no
budget_model_deniedThe run's resolved model is outside its budget's modelAllow, or inside its modelDeny, so it was refused before the call.no
capability_not_providedThe host does not provide a capability the request or pack requires, including a node type it cannot execute.no
capability_requiredThe workflow uses a node type whose capability the host does not advertise.no
connection_auth_metadata_mismatchThe provider's discovered issuer or endpoint differs from the one the manifest or registration pinned.no
credential_requiredA node needs a credential that did not resolve.no
envelope_invalidAn AI envelope failed validation and was refused.no
envelope_refusalThe AI provider explicitly refused; the host does not retry.no
envelope_truncation_unrecoverableThe AI output stayed truncated after the retry budget ran out, so the node failed.no
eval_gate_unmetA deployment transition was refused because the eval run its gate requires is not terminal and passing.no
fork_point_invalidThe fork point is not a valid sequence in the source run's log.no
loop_limit_exceededA loop exceeded its iteration limit.no
mcp_mrtr_rounds_exceededAn MCP exchange asked for more tool-result rounds than the host's advertised ceiling.no
node_config_invalidA node's configuration is missing a required value or holds one the node cannot use, so the node failed.no
pack_runtime_requirement_unmetThe host does not meet a runtime requirement the pack declares.no
provider_policy_deniedHost provider policy refused the model or provider before the call, so the node failed.no
recursion_limit_exceededThe run hit its recursion safety cap.no
residency_unavailableThe host cannot serve the requested data-residency region.yes
run_timeoutThe run exceeded its time limit and failed.no
sandbox_invocation_errorA pack node running in the sandbox threw an error outside the canonical sandbox catalog, so the node failed.no
sandbox_memory_exceededSandboxed code exceeded its memory limit.no
sandbox_timeoutSandboxed code exceeded its wall-clock limit.no
storage_limit_exceededA storage call was refused because it would exceed an advertised limit or the tenant's quota.no
token_budget_exceededA memory distillation could not be completed within its effective token budget, so the run failed and wrote no partial archive.no
unknown_envelope_kindThe envelope's type is neither universal nor in the host's supported catalog.no
unknown_schema_versionThe envelope's schemaVersion is above the version the host advertises for that kind.no

HTTP 426 — 1 code

CodeMeaningRetriable
client_version_unsupportedThe client is below the host's advertised minClientVersion; details.minClientVersion, when present, names the floor.no

HTTP 429 — 1 code

CodeMeaningRetriable
rate_limitedToo many requests. Retry after the Retry-After header.yes

HTTP 500 — 4 codes

CodeMeaningRetriable
event_type_unmappedThe run's event log holds an event type the host cannot translate, so the log is unreadable.no
internal_errorThe host failed unexpectedly.yes
pack_load_failureThe pack could not be loaded when the workflow was registered.no
payload_unprojectableAn event payload cannot be represented under the requested contract. Never retried.no

HTTP 501 — 1 code

CodeMeaningRetriable
credential_unavailableThe host cannot resolve credentials at all, so the run cannot proceed.no

HTTP 502 — 2 codes

CodeMeaningRetriable
mcp_errorAn MCP server the host called answered with a JSON-RPC error, so the node failed.no
upstream_unavailableA host service could not reach the upstream it depends on (a fetch target, an MCP server, a queue backend), so the call failed.yes

HTTP 503 — 3 codes

CodeMeaningRetriable
pack_registry_unreachableThe pack registry could not be reached.yes
runner_unavailableNo runner is available to execute this run.yes
service_unavailableThe host is at capacity. Retry after the Retry-After header when present.yes

_120 codes, generated from spec/v2/errors.json at build time._

Stability guarantees

Per Versioning & compatibility:

  • New codes land additively within a major. A client MUST accept an unknown code and MUST NOT act on it (overview.md §0); the HTTP status still classifies the response.
  • Existing codes never change their HTTP status mapping or their semantic meaning within a major; renaming a code is a major-version change.
  • Removed codes are a major-version change, with one narrow exception for retiring a code (overview §0a). A registry row can carry a deprecated marker.

The spec wins.

This is not the normative source. This page exists as a reference card for client implementers — one place to grep when wiring error handling.