Skip to main content
Version: 0.1.0-alpha.3 (alpha)

Platform error model

Component domain errors are declared by each WIT contract. Infrastructure failures use stable platform codes.

CodeMeaningGenerally retryable
unavailableRequired node, provider, backend, or route temporarily unavailableSometimes
deadline-exceededActivation deadline elapsedNo automatic write retry
cancelledCaller or platform requested cancellationNo
resource-exhaustedCPU, memory, host-call, payload, queue, or quota limit exceededAfter policy change or backoff
permission-deniedPrincipal or capsule lacks a grantNo
unauthenticatedIdentity could not be establishedAfter reauthentication
invalid-argumentEnvelope or platform call is invalidNo
not-foundService, release, state, effect, or capability not foundUsually no
already-existsRequested identity or activation already existsUsually no
incompatible-contractConsumer and provider contracts cannot bindNo
state-conflictCatalog, object-generation or optimistic transaction conflictOnly when declared safe
dependency-failedChild invocation or capability operation failedDepends on cause
guest-trapGuest code trappedOnly under explicit policy
corrupt-artifactDigest, validation, or preparation failureNo until artifact changes
route-unavailableNo eligible revision or nodeSometimes
admission-rejectedQuota, overload, deadline, policy, or placement rejectionDepends on reason
internalFabric defect or uncategorized failureConservative

Every platform failure carries a stable code, human-readable message, explicit retryability hint, and structured details. The hint does not override operation-level idempotency rules.

latent-rpc::platform_error is the canonical Rust/domain-to-Protobuf conversion seam for both invocation and control-plane PlatformError messages. It preserves ordered detail items and every detail field exactly. Unknown wire codes return UnknownPlatformErrorCode; they are never coerced to internal or another known meaning.

The Prost regression suite covers every current code, unknown-code rejection, empty and multiple detail lists, multiple fields, and both generated message types at the configured 512-byte message, eight-detail, 16-field, 64-byte kind/name, and 256-byte value boundaries.