Know what failed before deciding what happens next.
Use HTTP status, a bounded error code, runtime, and operation safety to separate invalid requests, credentials, entitlement, throttling, provider faults, and unknown stateful outcomes. The classifier never accepts a credential or provider payload.
Bring only safe failure metadata.
Do not paste an authorization header, full URL, body, customer data, precise location, or media. A provider request ID is useful; its value does not need to enter this form.
Reads retry. State changes reconcile.
A timed-out geocode or route read can use bounded retry. A timed-out provisioning, task transition, contribution, webhook, or device command may already have committed. Keep the same stable identity and read the outcome before replay.
timeout → bounded retry + jitterCap attempts, elapsed time, response size, and concurrency. Preserve request provenance.
timeout → unknown → reconcileQuery by request or idempotency identity. Apply one terminal event; never create a second command to escape uncertainty.
11 recovery classes
Local configuration failure
The integration could not safely construct or start the request because local endpoint, credential, package, or runtime configuration is incomplete or unsafe.
Causes and first checks
Likely causes
- Missing or mismatched credential generation
- HTTP endpoint outside an explicit loopback test
- SDK initialized in the wrong lifecycle or with incompatible packages
- Release configuration differs from development
First checks
- Choose the exact product/runtime authentication path
- Compare safe endpoint host, SDK version, build variant, origin/package/bundle identity, and region
- Confirm the provider request was never sent before retrying
Recovery and safe evidence
Stateless
- Correct configuration
- Run one bounded non-production probe
- Record the selected generation and release proof
Stateful
- Keep the aggregate unchanged
- Correct configuration
- Reconcile any adapter queue before resuming commands
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Request validation failure
The request shape, value range, content type, method, or business precondition is invalid for the selected contract.
Causes and first checks
Likely causes
- Wrong coordinate order, field name, enum, timestamp unit, or bound
- Required field or content type missing
- Request built for another API or SDK generation
- A state transition precondition is not satisfied
First checks
- Open the exact normalized operation rather than a neighboring guide
- Validate method, host, path, auth generation, required fields, units, and maximums
- For transitions, reload current state and allowed commands
Recovery and safe evidence
Stateless
- Fix the invalid field or contract selection
- Add a regression test for the rejected boundary
- Retry once with a new request identity if required
Stateful
- Do not mutate local state optimistically
- Reload the aggregate and allowed transition
- Submit a corrected command with a stable idempotency key
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Authentication rejected
The credential is missing, expired, revoked, malformed, or belongs to a different product generation or transport.
Causes and first checks
Likely causes
- Current static key, legacy OAuth, InTouch bearer, app key, or MCP token was interchanged
- Credential expired, was rotated, or is not present in the intended runtime
- Host/path generation or Authorization transport is wrong
- Clock skew or issuer/audience mismatch
First checks
- Stop automatic retries
- Compare the selected authentication path and issued generation
- Rotate only through the controlled overlap-and-drain lifecycle
Recovery and safe evidence
Stateless
- Correct credential selection or refresh through the approved provider
- Prove one non-production request
- Resume bounded traffic without logging token text
Stateful
- Pause commands
- Refresh or rotate identity
- Reconcile queued and unknown outcomes before resuming
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Authorization or entitlement denied
Identity may be valid, but the application, product, scope, region, origin, signing identity, resource, or action is not permitted.
Causes and first checks
Likely causes
- Product or quota was not provisioned
- Origin, server egress, Android signing identity, iOS bundle/team, asset, or region does not match
- Human or service actor lacks transition authority
- MCP deployment profile or OAuth scope excludes the tool
First checks
- Keep restrictions in place
- Inspect entitlement and credential metadata in the console
- Request the narrow missing access with product, environment, region, and business purpose
Recovery and safe evidence
Stateless
- Obtain or correct least-privilege entitlement
- Prove the exact runtime restriction
- Retry only after control-plane evidence changes
Stateful
- Keep the command pending or rejected according to the journey
- Record the decision trail
- Resume only after entitlement activation is independently observed
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Resource or route not found
The endpoint generation, operation path, tenant-owned resource, Mappls Pin, asset, or durable aggregate is absent or no longer addressable.
Causes and first checks
Likely causes
- Wrong host/path or legacy/current generation
- Resource belongs to another tenant, region, project, or environment
- Identifier is stale, deleted, retired, or never committed
- Read-after-write convergence is still pending
First checks
- Confirm exact resource type and environment
- Use a supported list/read contract where available
- For a recent write, reconcile by idempotency key or provider request ID
Recovery and safe evidence
Stateless
- Correct the identifier or endpoint generation
- Do not enumerate foreign resources
- Treat 410 as retired unless the contract says otherwise
Stateful
- Reconcile command and event history
- Distinguish pending convergence from terminal absence
- Require a new command for recreation rather than silently reusing identity
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Conflict or stale state
The command conflicts with a committed version, reused identity, transition invariant, duplicate content, or concurrent operation.
Causes and first checks
Likely causes
- Optimistic version is stale
- An idempotency key was reused with different content
- The transition already completed or is no longer allowed
- Two actors attempted incompatible changes
First checks
- Read the latest aggregate version and event/audit evidence
- Compare a safe request-content digest—not the payload—against the original command
- Decide whether the intended business outcome is already satisfied
Recovery and safe evidence
Stateless
- Correct the stale precondition
- Use a fresh request identity only for a genuinely new operation
- Never turn a conflicting duplicate into an automatic new write
Stateful
- Reconcile current aggregate and provider state
- Return the already-committed result when the original intent matches
- Otherwise require an explicit new versioned command
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Rate or quota limited
A provider, gateway, tenant policy, or product quota is intentionally limiting work.
Causes and first checks
Likely causes
- Burst or sustained rate exceeded
- Monthly entitlement or tenant delivery budget exhausted
- Retry storm or missing client-side coalescing
- One workload is starving others
First checks
- Honor Retry-After when present
- Inspect application/product usage and quota
- Reduce concurrency, coalesce duplicate reads, and add jitter
Recovery and safe evidence
Stateless
- Wait for Retry-After or a bounded exponential backoff with jitter
- Cap attempts and total elapsed time
- Cache or batch where the contract permits
Stateful
- Keep the command durably queued
- Schedule a later attempt without changing idempotency identity
- Preserve per-aggregate ordering and tenant fairness
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Timeout or network failure
The client did not receive a trustworthy completion response before its deadline, or could not establish the network request.
Causes and first checks
Likely causes
- Client deadline too short
- DNS, TLS, proxy, mobile/offline, or provider connectivity failure
- Large or expensive request
- Response was lost after a stateful commit
First checks
- Classify the operation safety before retrying
- Retain request ID, idempotency identity, deadline, attempt, and occurrence time
- Check service status and local network without exposing the request URL
Recovery and safe evidence
Stateless
- Retry an idempotent read within an attempt and elapsed-time budget
- Use jitter and a fresh transport connection where appropriate
- Surface a bounded unavailable result after exhaustion
Stateful
- Mark outcome unknown
- Query by provider request or idempotency identity
- Retry the same command identity only when the contract proves idempotency
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Provider or dependency unavailable
A provider, gateway, dependency, or adapter failed to serve a valid response.
Causes and first checks
Likely causes
- Provider or gateway incident
- Upstream returned malformed or incomplete data
- Dependency saturation or rollout regression
- Regional routing or entitlement adapter unavailable
First checks
- Check request diagnostics and public status
- Compare error rate by operation, application, region, and release
- Use request ID for provider correlation and keep response bodies out of tickets
Recovery and safe evidence
Stateless
- Use bounded exponential retry only for safe reads
- Open a circuit after the retry budget
- Serve an explicit stale/partial fallback only when product semantics permit
Stateful
- Move the command to unknown or retry-scheduled state
- Reconcile before reissuing
- Preserve the same idempotency identity and ordering lane
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Unknown stateful outcome
A command was accepted or lost across an asynchronous boundary, but final provider and application state are not yet reconciled.
Causes and first checks
Likely causes
- Accepted asynchronous work has not completed
- Callback or webhook is delayed or missing
- Response was lost after commit
- Application and provider inventories disagree
First checks
- Keep the original idempotency and provider request identities
- Read aggregate, outbox, callback, delivery, and provider evidence
- Escalate only a minimized support packet after the reconciliation deadline
Recovery and safe evidence
Stateless
- Do not use this class for a truly stateless read
- Reclassify from the actual HTTP/error evidence
Stateful
- Persist unknown outcome explicitly
- Reconcile by stable identity
- Apply the observed terminal event once
- Require independent recovery approval where replay has material effect
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Unclassified failure
The available status and code are insufficient to select one safe recovery path.
Causes and first checks
Likely causes
- SDK callback omitted a status
- A wrapper replaced the provider error
- Multiple generations use the same informal message
- Only human-readable text was captured
First checks
- Capture a bounded status, code, runtime, operation, and request ID
- Identify whether the action is a read or state change
- Use the exact API/SDK guide and release version
Recovery and safe evidence
Stateless
- Do not retry until the operation and failure class are known
Stateful
- Preserve state and mark outcome unknown
- Reconcile before any replay
Never collect
- Keys, tokens, client secrets, Authorization headers, or signed URLs
- Full request URLs when a credential may be in the query string
- Customer payloads, precise-location history, media, or response bodies by default
Five rules that survive every SDK.
- Classify before retrying: authentication, authorization, validation, conflict, and unknown outcomes need different recovery.
- HTTP status is a transport clue, not a provider-wide payload contract; exact API/SDK generation and issued account remain authoritative.
- A read may be retried within a budget; a state change that timed out must be reconciled by stable identity before replay.
- Support packets contain minimized identities and timing—not credentials, full URLs, customer payloads, precise-location history, media, or response bodies.
- Fixtures, normalized contracts, and maintained SDK signals are implementation evidence; they never claim live availability or universal error codes.