{
  "$schema": "https://openwop.dev/spec/v2/errors.schema.json",
  "$comment": "RFC 0171 §B.1 — the error registry: one row per code {code, meaning?, httpStatus, retriable, details, since, deprecated?}. schemas/v2/error-envelope.schema.json is GENERATED from it (scripts/generate-error-envelope.mjs). Retry timing lives in Retry-After only (§B.2). statusSource records whether the status was stated in v1 prose, a v1 convention, or decided here. details is null until a code's details schema is registered (a null row means details is an open object for that code — closure over details is the RFC 0171 Phase 3 follow-up G-row).",
  "version": "2.0",
  "updated": "2026-10-06",
  "vendorCodePattern": "^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$",
  "rows": [
    {
      "code": "connection_provider_unresolved",
      "meaning": "A connector or pack references a connection provider that nothing defines.",
      "httpStatus": 400,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/connection-packs.md"
    },
    {
      "code": "connector_action_unresolved",
      "meaning": "A pack's connector action or trigger names a node type the same manifest does not define.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_scope_unsupported",
      "meaning": "The credential request names a scope the host does not support.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "delegation_chain_cyclic",
      "meaning": "The delegation chain repeats a subject.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "delegation_chain_too_long",
      "meaning": "The delegation chain is longer than the host's bound.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "idempotency_key_invalid",
      "meaning": "The Idempotency-Key value does not match the required grammar.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §D.3"
    },
    {
      "code": "interop_version_unsupported",
      "meaning": "An A2A or MCP negotiation would land below the host's advertised minimum version.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "oauth_provider_unsupported",
      "meaning": "A node names an OAuth provider the host does not advertise.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "oauth_scope_unsupported",
      "meaning": "A node asks for an OAuth scope the provider does not advertise.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "pack_dependency_cycle",
      "meaning": "The pack dependency graph contains a cycle.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_engine_unsupported",
      "meaning": "The pack's engines range does not admit the host's protocol major.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0177 §A.1"
    },
    {
      "code": "pack_integrity_failure",
      "meaning": "The uploaded or fetched pack's SHA-256 does not match the declared digest.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_kind_invalid",
      "meaning": "The manifest's content does not match its declared pack kind, or mixes kinds.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_lockfile_incomplete",
      "meaning": "The workspace references a pack the lockfile does not list.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_peer_dependency_missing",
      "meaning": "The host does not provide a capability the pack declares as a peer dependency.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_peer_dependency_undefined",
      "meaning": "A peer-dependency key is not a declared capability family or alias.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_signature_invalid",
      "meaning": "The pack's signature, signing key or namespace check failed.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_validation_failed",
      "meaning": "The pack manifest is invalid.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "unsupported_runtime",
      "meaning": "The host cannot execute the pack's runtime language.",
      "httpStatus": 400,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "protocol_version_mismatch",
      "meaning": "A /v1/ path was called with an OpenWOP-Version other than 1.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0172 §A.3"
    },
    {
      "code": "schedule_horizon_exceeded",
      "meaning": "A schedule asks for a fire time beyond the host's advertised horizon.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sub_chain_cycle",
      "meaning": "A workflow chain transitively composes itself.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0133 §Unresolved 3 (resolved: maxSubChainDepth 8, fail closed); carried into v2 by RFC 0177 §E"
    },
    {
      "code": "sub_chain_depth_exceeded",
      "meaning": "Workflow chain nesting is deeper than the host's advertised maximum.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0133 §Unresolved 3 — the depth ceiling breach (distinct from a cycle)"
    },
    {
      "code": "unsupported_stream_mode",
      "meaning": "The requested stream mode is malformed or not served; details.supported lists the modes the host serves.",
      "httpStatus": 400,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "supported"
        ],
        "properties": {
          "supported": {
            "type": "array",
            "minItems": 1,
            "items": {
              "type": "string",
              "enum": [
                "values",
                "updates",
                "messages",
                "debug"
              ]
            },
            "description": "Each individual mode the host serves; combinations are not listed (events.md §The events channel)."
          }
        },
        "additionalProperties": true
      },
      "since": "1.0",
      "source": "api/openapi.yaml UnsupportedStreamMode (RFC 0171 §B.1 folds the one-member enum)"
    },
    {
      "code": "until_in_past",
      "meaning": "A capability record's until date is in the past.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0169 §A.3 (validation_error details.reason in v1; a code in v2)"
    },
    {
      "code": "validation_error",
      "meaning": "The request is malformed or fails schema validation.",
      "httpStatus": 400,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "webhook_url_rejected",
      "meaning": "The webhook URL is not an allowed public https:// destination.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "spec/v2/core/webhooks.md §Egress"
    },
    {
      "code": "webhook_endpoint_unverified",
      "meaning": "The webhook endpoint did not answer the verification challenge; nothing was stored.",
      "httpStatus": 400,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.36",
      "source": "RFC 0201 §D"
    },
    {
      "code": "connector_auth_declined",
      "meaning": "The user declined the connector's authorization request, so the node failed.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.36",
      "source": "RFC 0199 §C.4"
    },
    {
      "code": "connection_auth_metadata_mismatch",
      "meaning": "The provider's discovered issuer or endpoint differs from the one the manifest or registration pinned.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.36",
      "source": "RFC 0199 §B.3"
    },
    {
      "code": "audience_mismatch",
      "meaning": "The credential was issued for a different audience than this host.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "connector_auth_expired",
      "meaning": "The connector's credential expired and could not be refreshed, so the node failed.",
      "httpStatus": 401,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_revoked",
      "meaning": "The presented API key or session has been revoked.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.3"
    },
    {
      "code": "credential_lifetime_exceeded",
      "meaning": "The credential's lifetime exceeds the bound the host advertises for its lane, or it carries no iat.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.36",
      "source": "RFC 0210 §B"
    },
    {
      "code": "delegation_expired",
      "meaning": "A delegation or workload credential is past its lifetime.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "identity_unresolvable",
      "meaning": "The credential verified, but it maps to no known subject.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "identity_unverified",
      "meaning": "The credential or delegation chain failed verification.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1 / RFC 0154"
    },
    {
      "code": "interrupt_token_invalid",
      "meaning": "The interrupt token uses an algorithm or key the host does not accept.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §E.1"
    },
    {
      "code": "key_revoked",
      "meaning": "The API key has been revoked or its subject disabled.",
      "httpStatus": 401,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sender_constraint_missing",
      "meaning": "The request does not meet the lane's minimum sender-constraint assurance.",
      "httpStatus": 401,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.4"
    },
    {
      "code": "unauthenticated",
      "meaning": "No credential was sent, or the credential is invalid.",
      "httpStatus": 401,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_forbidden",
      "meaning": "The credential exists but is outside the caller's scope.",
      "httpStatus": 403,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_scope_forbidden",
      "meaning": "The credential cannot be bound at the requested scope.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/capabilities.md §B.8"
    },
    {
      "code": "delegation_scope_amplified",
      "meaning": "A delegated link claims more scope than its delegator holds.",
      "httpStatus": 403,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §B.1"
    },
    {
      "code": "forbidden",
      "meaning": "The caller is authenticated but not permitted to do this.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/auth.md (v1 MUST)"
    },
    {
      "code": "force_engine_version_forbidden",
      "meaning": "Forcing an engine version is refused outside test keys.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/run-options.md / version-negotiation.md (OpenWOP-Force-Engine-Version outside test keys)"
    },
    {
      "code": "id_tenant_mismatch",
      "meaning": "The id's tenant segment is not the caller's tenant.",
      "httpStatus": 403,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0170 §D.1 (an id whose tenant segment is not the caller's)"
    },
    {
      "code": "mock_provider_forbidden",
      "meaning": "The mock AI provider is refused outside test keys.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/run-options.md (mockProvider outside test keys)"
    },
    {
      "code": "pack_namespace_unauthorized",
      "meaning": "The pack's signing key is not allowed for its namespace.",
      "httpStatus": 403,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "run_forbidden",
      "meaning": "The caller may not act on this run.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sandbox_capability_denied",
      "meaning": "Sandboxed code called a host capability it is not allowed to use.",
      "httpStatus": 403,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sandbox_escape_attempt",
      "meaning": "Sandboxed code tried to escape its sandbox.",
      "httpStatus": 403,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "workspace_membership_required",
      "meaning": "The caller is not a member of the workspace the request names.",
      "httpStatus": 403,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_not_found",
      "meaning": "No credential resolves for the requested reference.",
      "httpStatus": 404,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "interrupt_not_found",
      "meaning": "The interrupt does not exist.",
      "httpStatus": 404,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/interrupt.md"
    },
    {
      "code": "not_found",
      "meaning": "The resource does not exist, or the caller may not see it.",
      "httpStatus": 404,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "pack_version_not_found",
      "meaning": "The requested pack version is not served.",
      "httpStatus": 404,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "replay_source_missing",
      "meaning": "During replay, a side-effecting node has no recorded source outcome, so it failed closed.",
      "httpStatus": 404,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "signature_not_available",
      "meaning": "No signature is served for this pack version.",
      "httpStatus": 404,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "api/openapi.yaml"
    },
    {
      "code": "protocol_version_unsupported",
      "meaning": "The OpenWOP-Version header names a version the host does not list; details.protocolVersions lists what it serves.",
      "httpStatus": 406,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0172 §A.3"
    },
    {
      "code": "connection_provider_conflict",
      "meaning": "Two registrations claim the same connection provider id.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/connection-packs.md; RFC 0177 §D.1 fail-closed"
    },
    {
      "code": "envelope_correlation_conflict",
      "meaning": "An envelope reuses a correlationId already seen in this run with a different type.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/ai-envelope.md E2 (correlationId type conflict)"
    },
    {
      "code": "idempotency_in_flight",
      "meaning": "A request with the same idempotency key is still being processed.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/idempotency.md §Concurrent duplicates (v1 MUST; RFC 0171 §B.2 keeps one mismatch code, this is the in-flight state)"
    },
    {
      "code": "idempotency_key_mismatch",
      "meaning": "The idempotency key was reused with a different request.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/idempotency.md (the only spelling; RFC 0171 §B.2)"
    },
    {
      "code": "interrupt_already_resolved",
      "meaning": "The interrupt is already resolved, its run has ended, or its token was invalidated.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/interrupt.md (409/410 overlap: RFC 0171 row C4.6 — one code per state)"
    },
    {
      "code": "pack_dependency_conflict",
      "meaning": "Two packs require versions of a third pack that no single version satisfies.",
      "httpStatus": 409,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "pack_integrity_mismatch",
      "meaning": "The fetched pack's SHA-256 does not match the lockfile.",
      "httpStatus": 409,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "replay_context_summary_unavailable",
      "meaning": "The fork was refused: the host cannot serve the context summary as of the fork point.",
      "httpStatus": 409,
      "statusSource": "v2 decision (sibling of replay_memory_snapshot_unavailable)",
      "retriable": false,
      "details": null,
      "since": "2.42",
      "source": "RFC 0111"
    },
    {
      "code": "replay_diverged_at_refusal",
      "meaning": "Replay diverged: the source and the replay disagree on whether the AI provider refused.",
      "httpStatus": 409,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "replay_memory_snapshot_unavailable",
      "meaning": "The fork was refused: the host cannot serve memory state as of the fork point.",
      "httpStatus": 409,
      "statusSource": "v2 decision (v1 host-sample-test-seams.md §MAE-3 stated 422; the v1 error list states no status)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "run_already_active",
      "meaning": "A run for the same scope is already active and deduplication is enforced.",
      "httpStatus": 409,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "run_terminal",
      "meaning": "The run has already finished, so it cannot be changed.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md (a mutation on a terminal run)"
    },
    {
      "code": "run_state_conflict",
      "meaning": "The run's current status does not allow this transition; details.runStatus names it.",
      "httpStatus": 409,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "runStatus"
        ],
        "properties": {
          "runStatus": {
            "type": "string",
            "description": "The run status that refused the transition (runs.md §Pause and resume)."
          }
        },
        "additionalProperties": true
      },
      "since": "2.0",
      "source": "spec/v2/core/runs.md §Pause and resume"
    },
    {
      "code": "version_conflict",
      "meaning": "This pack version was already published with different content.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "api/openapi.yaml"
    },
    {
      "code": "workspace_conflict",
      "meaning": "The workspace file changed since the caller last read it.",
      "httpStatus": 409,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "interrupt_cancelled",
      "meaning": "The interrupt was cancelled. The core resolve operations never return this code.",
      "httpStatus": 410,
      "statusSource": "registry (v1 prose said 422, run-scoped; RFC 0213 §C)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/interrupt.md:434 (422, run-scoped). The v2 core resolve surfaces do not emit it — RFC 0171 C4.6 one code per state; RFC 0213 §C."
    },
    {
      "code": "interrupt_expired",
      "meaning": "The interrupt token is past its expiry.",
      "httpStatus": 410,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/interrupt.md"
    },
    {
      "code": "payload_too_large",
      "meaning": "The request body is larger than the host accepts.",
      "httpStatus": 413,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "spec/v2/core/errors.md §The envelope — a request body a host refuses on size before parsing it (RFC 9110 §15.5.14); registered 2026-09-05 because both production hosts had to invent it"
    },
    {
      "code": "workspace_too_large",
      "meaning": "The workspace file is larger than the host's advertised maximum.",
      "httpStatus": 413,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "unsupported_media_type",
      "meaning": "The request body's Content-Type is not accepted.",
      "httpStatus": 415,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "spec/v2/core/errors.md §The envelope — a request body whose Content-Type the host does not accept (RFC 9110 §15.5.16); registered 2026-09-05 because both production hosts had to invent it"
    },
    {
      "code": "approval_rejected",
      "meaning": "An approval gate resolved rejected (a decision, a quorum or a timeout) and no edge routed the failure, so the node and the run failed.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.43",
      "source": "RFC 0223; spec/v2/core/interrupt.md §Rejection"
    },
    {
      "code": "node_config_invalid",
      "meaning": "A node's configuration is missing a required value or holds one the node cannot use, so the node failed.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.44",
      "source": "RFC 0226 §A (measured: openwop-app `invalid_config` ×13, MyndHyve `CONFIG_INVALID`)"
    },
    {
      "code": "sandbox_invocation_error",
      "meaning": "A pack node running in the sandbox threw an error outside the canonical sandbox catalog, so the node failed.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.44",
      "source": "RFC 0226 §A; spec/v1/host-sample-test-seams.md:340 already names it (the suite's sandbox probe emits it)"
    },
    {
      "code": "mcp_error",
      "meaning": "An MCP server the host called answered with a JSON-RPC error, so the node failed.",
      "httpStatus": 502,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.44",
      "source": "RFC 0226 §A (a v2 decision: the host acted as a gateway to the MCP peer, whose answer was an error)"
    },
    {
      "code": "capability_not_provided",
      "meaning": "The host does not provide a capability the request or pack requires, including a node type it cannot execute.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "capability_required",
      "meaning": "The workflow uses a node type whose capability the host does not advertise.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "credential_required",
      "meaning": "A node needs a credential that did not resolve.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "envelope_invalid",
      "meaning": "An AI envelope failed validation and was refused.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "envelope_refusal",
      "meaning": "The AI provider explicitly refused; the host does not retry.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "envelope_truncation_unrecoverable",
      "meaning": "The AI output stayed truncated after the retry budget ran out, so the node failed.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "fork_point_invalid",
      "meaning": "The fork point is not a valid sequence in the source run's log.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "spec/v2/core/runs.md §Fork"
    },
    {
      "code": "loop_limit_exceeded",
      "meaning": "A loop exceeded its iteration limit.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "mcp_mrtr_rounds_exceeded",
      "meaning": "An MCP exchange asked for more tool-result rounds than the host's advertised ceiling.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0175 §E.1"
    },
    {
      "code": "pack_runtime_requirement_unmet",
      "meaning": "The host does not meet a runtime requirement the pack declares.",
      "httpStatus": 422,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "recursion_limit_exceeded",
      "meaning": "The run hit its recursion safety cap.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "residency_unavailable",
      "meaning": "The host cannot serve the requested data-residency region.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": true,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "run_timeout",
      "meaning": "The run exceeded its time limit and failed.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sandbox_memory_exceeded",
      "meaning": "Sandboxed code exceeded its memory limit.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "sandbox_timeout",
      "meaning": "Sandboxed code exceeded its wall-clock limit.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "token_budget_exceeded",
      "meaning": "A memory distillation could not be completed within its effective token budget, so the run failed and wrote no partial archive.",
      "httpStatus": 422,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape; meaning narrowed to v1's (RFC 0062) by RFC 0228 §E"
    },
    {
      "code": "client_version_unsupported",
      "meaning": "The client is below the host's advertised minClientVersion; details.minClientVersion, when present, names the floor.",
      "httpStatus": 426,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "properties": {
          "minClientVersion": {
            "type": "string",
            "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$",
            "description": "OPTIONAL. The host's advertised minClientVersion, so a client refused at discovery learns the floor (versioning.md §1.5)."
          }
        },
        "additionalProperties": true
      },
      "since": "2.0",
      "source": "RFC 0172 row C5.8; details registered by RFC 0219"
    },
    {
      "code": "rate_limited",
      "meaning": "Too many requests. Retry after the Retry-After header.",
      "httpStatus": 429,
      "statusSource": "v1 convention",
      "retriable": true,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "event_type_unmapped",
      "meaning": "The run's event log holds an event type the host cannot translate, so the log is unreadable.",
      "httpStatus": 500,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": null,
      "since": "2.0",
      "source": "RFC 0176 §A.3 (a run whose log the host cannot translate is not readable)"
    },
    {
      "code": "payload_unprojectable",
      "meaning": "An event payload cannot be represented under the requested contract. Never retried.",
      "httpStatus": 500,
      "statusSource": "v2 decision (sibling of event_type_unmapped)",
      "retriable": false,
      "details": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "type",
          "keys"
        ],
        "properties": {
          "type": {
            "type": "string",
            "description": "the event type whose payload could not be projected"
          },
          "keys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "minItems": 1,
            "description": "the property names the host could neither carry nor seat"
          },
          "eventId": {
            "$ref": "ids.schema.json#/$defs/eventId"
          },
          "sequence": {
            "type": "integer",
            "minimum": 0
          }
        }
      },
      "since": "2.3",
      "source": "RFC 0185 §C (a row whose payload the host can neither carry nor seat is not readable under that contract — the property-level sibling of event_type_unmapped; never retried: it is a permanent fact about the row)"
    },
    {
      "code": "internal_error",
      "meaning": "The host failed unexpectedly.",
      "httpStatus": 500,
      "statusSource": "v1 convention",
      "retriable": true,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "pack_load_failure",
      "meaning": "The pack could not be loaded when the workflow was registered.",
      "httpStatus": 500,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "credential_unavailable",
      "meaning": "The host cannot resolve credentials at all, so the run cannot proceed.",
      "httpStatus": 501,
      "statusSource": "v1 convention",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "pack_registry_unreachable",
      "meaning": "The pack registry could not be reached.",
      "httpStatus": 503,
      "statusSource": "v1 convention (node-packs.md)",
      "retriable": true,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/node-packs.md"
    },
    {
      "code": "runner_unavailable",
      "meaning": "No runner is available to execute this run.",
      "httpStatus": 503,
      "statusSource": "v1 convention",
      "retriable": true,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/rest-endpoints.md §Error response shape"
    },
    {
      "code": "unknown_envelope_kind",
      "meaning": "The envelope's type is neither universal nor in the host's supported catalog.",
      "httpStatus": 422,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/ai-envelope.md §\"Refusal taxonomy\" (unknown type, not in supportedEnvelopes)"
    },
    {
      "code": "unknown_schema_version",
      "meaning": "The envelope's schemaVersion is above the version the host advertises for that kind.",
      "httpStatus": 422,
      "statusSource": "v1 prose",
      "retriable": false,
      "details": null,
      "since": "1.0",
      "source": "spec/v1/ai-envelope.md §\"Schema version advertisement\" (emitted schemaVersion above the advertised floor)"
    },
    {
      "code": "storage_limit_exceeded",
      "meaning": "A storage call was refused because it would exceed an advertised limit or the tenant's quota.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "service",
          "limit"
        ],
        "properties": {
          "service": {
            "type": "string",
            "minLength": 1,
            "description": "The host-service family key (`fs`, `kvStorage`, `secrets`, `queueBus`, …)."
          },
          "limit": {
            "type": "string",
            "minLength": 1,
            "description": "The advertised field that was exceeded (`maxValueBytes`, `maxTtlSeconds`, `maxRowsPerTable`, …), or `quota`."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C (replaces v1's nine per-service size, TTL, row and quota codes)"
    },
    {
      "code": "egress_denied",
      "meaning": "The host refused an outbound request a pack asked it to make: the address guard or the egress policy denied it.",
      "httpStatus": 403,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "reason"
        ],
        "properties": {
          "reason": {
            "enum": [
              "out-of-audience",
              "expired",
              "ssrf-blocked",
              "provenance-unevaluable",
              "scope-denied",
              "policy-denied"
            ],
            "description": "The `egress.decided` reason, from its closed set minus `ok`."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C (v1 `ssrf_blocked` and the `egressPolicy` denial; measured: MyndHyve `ssrf_blocked`)"
    },
    {
      "code": "upstream_unavailable",
      "meaning": "A host service could not reach the upstream it depends on (a fetch target, an MCP server, a queue backend), so the call failed.",
      "httpStatus": 502,
      "statusSource": "v2 decision",
      "retriable": true,
      "details": {
        "type": "object",
        "required": [
          "service"
        ],
        "properties": {
          "service": {
            "type": "string",
            "minLength": 1,
            "description": "The host-service family key (`fs`, `kvStorage`, `secrets`, `queueBus`, …)."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C (measured: MyndHyve `fetch_failed`, the v2 reference host's `example.mcp_unreachable` and `example.http_fetch_failed`)"
    },
    {
      "code": "budget_exhausted",
      "meaning": "A hard budget dimension was exhausted and the run failed.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "dimension"
        ],
        "properties": {
          "dimension": {
            "enum": [
              "tokens",
              "costUsd",
              "toolCalls",
              "retries"
            ],
            "description": "The budget dimension that was exhausted."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C; spec/v1/budget-policy.md §D (measured: MyndHyve `host/budgetPolicy.ts`)"
    },
    {
      "code": "budget_model_denied",
      "meaning": "The run's resolved model is outside its budget's `modelAllow`, or inside its `modelDeny`, so it was refused before the call.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "properties": {
          "model": {
            "type": "string",
            "minLength": 1,
            "description": "OPTIONAL. The refused model."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C; spec/v1/budget-policy.md §D (measured: MyndHyve `host/budgetPolicy.ts`)"
    },
    {
      "code": "service_unavailable",
      "meaning": "The host is at capacity. Retry after the `Retry-After` header when present.",
      "httpStatus": 503,
      "statusSource": "v1 prose (production-profile.md §Backpressure)",
      "retriable": true,
      "details": null,
      "since": "2.45",
      "source": "RFC 0228 §C (measured: MyndHyve `middleware/backpressureGate.ts`)"
    },
    {
      "code": "run_expired",
      "meaning": "The run, or the part of its event log the request needs, was purged under the host's documented retention.",
      "httpStatus": 410,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "properties": {
          "runId": {
            "$ref": "ids.schema.json#/$defs/runId",
            "description": "OPTIONAL. The expired run."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C (replay.md's `410` for a fork past retention; spec-authored, no measured host)"
    },
    {
      "code": "provider_policy_denied",
      "meaning": "Host provider policy refused the model or provider before the call, so the node failed.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": [
          "provider"
        ],
        "properties": {
          "provider": {
            "type": "string",
            "minLength": 1,
            "description": "The refused provider."
          },
          "reason": {
            "type": "string",
            "minLength": 1,
            "description": "OPTIONAL. The policy cause: `provider_disabled`, `byok_required`, `byok_required_but_unresolved` or `model_not_allowed` (host-services.md §aiProviders). Any other value is a vendor cause."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C; the default of `aiProviders.policies[].errorCode` (measured: openwop-app and MyndHyve)"
    },
    {
      "code": "eval_gate_unmet",
      "meaning": "A deployment transition was refused because the eval run its gate requires is not terminal and passing.",
      "httpStatus": 422,
      "statusSource": "v2 decision (the status MyndHyve answers)",
      "retriable": false,
      "details": {
        "type": "object",
        "properties": {
          "evalRunId": {
            "$ref": "ids.schema.json#/$defs/runId",
            "description": "OPTIONAL. The eval run the gate requires."
          }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "RFC 0228 §C (measured: MyndHyve `host/agentDeployment.ts`, answered at 422)"
    },
    {
      "code": "conversation_speaker_not_participant",
      "meaning": "A resumed conversation turn names a speaker absent from the conversation's roster; the interrupt stays open. details.speakerId names it.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": ["speakerId"],
        "properties": {
          "speakerId": { "type": "string", "description": "The refused turn's speakerId (conversation.md §multiPartyConversation)." }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "spec/v2/core/conversation.md §multiPartyConversation; RFC 0239 §B"
    },
    {
      "code": "conversation_roster_exceeded",
      "meaning": "A core.conversationGate roster exceeds the host's advertised multiPartyConversation.maxParticipants; details.maxParticipants names the ceiling.",
      "httpStatus": 422,
      "statusSource": "v2 decision",
      "retriable": false,
      "details": {
        "type": "object",
        "required": ["maxParticipants"],
        "properties": {
          "maxParticipants": { "type": "integer", "minimum": 2, "description": "The host's advertised ceiling (conversation.md §multiPartyConversation)." }
        },
        "additionalProperties": true
      },
      "since": "2.45",
      "source": "spec/v2/core/conversation.md §multiPartyConversation; RFC 0239 §C"
    }
  ]
}
