Provenance

Reason codes

A reason code explains a negative outcome inside a 200 response: an intent verify that returns valid: false, a risk factor on a verification, or a traced inference whose completion was withheld. The request itself succeeded, so these are not errors. Each code is listed once, with every place it appears.

Your own policy rules can set their own reason strings. Those come back as written and are not listed here.

CodeAppears inMeaning
action_hash_mismatchIntent verifyThe action_description sent to verify isn't the one the human authorized. Verify with the exact description passed to authorize.
agent_suspendedIntent verifyThe token's registered agent is suspended. Resume the agent with POST /v1/agents/:id/unsuspend after review.
agent_unsuspendedDecision ledgerClearing a lock also resumed the agent it had suspended. No action.
ai_generated_likelyScreening factorThe external detector's genai model scored the media as likely AI-generated (advisory, never part of risk_score). Review the asset; detector accuracy drops after recompression.
approval_deniedIntent verifyThe human denied the step-up approval. Don't execute the action.
approval_expiredIntent verifyThe step-up approval expired before anyone decided it. Authorize again to open a new approval.
approval_pendingIntent verifyA step-up approval is waiting for a human; the response carries approval_id. Poll verify or wait for the approval.resolved webhook. See step-up approval.
approval_requiredDecision ledgerA policy rule requires human approval (the engine's internal outcome before an approval request exists). No action; verify turns it into approval_pending.
biometric_absentRisk factorNo biometric gated the capture (+10). Confirm with Face ID, Touch ID or a passkey at capture.
biometric_requiredIntent verifyThe default policy's biometric rule matched (context.require_biometric) and the token isn't biometric-bound. Authorize with a verified passkey assertion.
c2pa_absentC2PA factorNo C2PA manifest is present (advisory). No action.
c2pa_invalidC2PA factorA C2PA manifest is present but malformed or its signature fails (advisory). Treat the embedded manifest as untrusted.
c2pa_present_validC2PA factorA C2PA manifest is present, well-formed and its signature verifies (advisory). No action.
canary_reading_mismatchIntent verifyThe trace id's stored reading hash differs from the one bound into the token. Authorize again with the current trace_id.
canary_trippedIntent verify, Finish reasonA canary family reached its threshold: on verify a canary policy rule denied the action; on traced inference the completion was withheld (finish_reason: "canary_tripped"). Review the readings in canary_readings and the trace. See kill switch.
canary_unavailableIntent verifyA strict canary condition had no reading to evaluate; the response names canary_set. Pass a trace_id or inference_input, or mark the condition best_effort. See canary policies.
carrier_policy_attestation_missingRisk factorYour carrier risk policy requires an attested capture for this claim and it's absent (advisory). Ask the policyholder to capture through the SDK.
carrier_policy_biometric_missingRisk factorYour carrier risk policy requires a biometric for this claim and it's absent (advisory). Ask the policyholder to re-capture with a biometric.
carrier_policy_gps_missingRisk factorYour carrier risk policy requires GPS for this claim and it's absent (advisory). Ask the policyholder to re-capture with location on.
cert_unknown_caRisk factorThe device certificate isn't signed by a known root CA (+40). Enroll devices through the Provenance PKI.
context_hash_mismatchIntent verifyThe context_evidence re-supplied at verify doesn't hash to the token's context_hash. Re-supply the exact context evidence sent to authorize, or omit it.
controlled_substance_cosign_requiredClinician ordersThe order needs a second clinician's co-signature before it authorizes. Have a second clinician approve the order.
deepfake_likelyScreening factorThe external detector's deepfake model scored the media as a likely deepfake (advisory). Review the asset.
device_not_enrolledRisk factorThe signing device isn't in the registry (+20). Enroll the device with POST /v1/admin/devices.
device_revokedRisk factorThe signing device is revoked (+80). Re-enroll a trusted device for new captures.
exif_editor_traceRisk factorThe EXIF Software tag names an image editor (advisory). Review the asset for post-processing.
exif_missingRisk factorA fresh capture has no EXIF metadata (advisory). Review whether the image was re-encoded.
exif_timestamp_mismatchRisk factorEXIF DateTimeOriginal differs from the attestation timestamp beyond tolerance (advisory). Review the capture time.
frame_hash_mismatchRisk factorThe recomputed chunk hash chain doesn't match the manifest (+50). Submit the original recorded bytes.
geofence_mismatchRisk factorThe attestation GPS is far from the claim's stated loss location (advisory). Review the stated loss location.
gps_absentRisk factorThe bundle has no GPS fix (+30). Allow location access at capture.
hardware_backing_absentRisk factorThe server-verified hardware tier is software, or the attestation evidence is missing (+40). Capture on a device with a Secure Enclave, StrongBox or TEE.
hardware_required_above_500Intent verifyThe default policy requires a hardware-attested device for context.transaction_amount above 500. Authorize from a hardware-backed device, or set your own policy.
insufficient_evidenceCase reasonThe adjuster couldn't decide on the evidence provided. Request more evidence from the policyholder.
invalid_tokenIntent verifyThe intent token is malformed or its signature doesn't verify against the JWKS. Pass the exact intent_token returned by POST /v1/intent/authorize.
lengthFinish reasonThe completion hit max_tokens. Raise max_tokens or shorten the prompt.
liveness_check_failedRisk factorThe live session's timing and continuity heuristics failed (+40); this is not biometric liveness. Record live with a steady connection.
mandate_budget_exceededIntent verifyThe action would exceed the mandate's remaining budget. Ask the human to grant more budget.
mandate_constraint_violatedIntent verifyThe action breaks a static mandate constraint (amount, action type or counterparty); mandate_detail names it. Keep the action inside the mandate's constraints, or ask for a broader mandate.
mandate_expiredIntent verifyThe delegation mandate is past its expiry. Ask the human to grant a new mandate.
mandate_heartbeat_lapsedIntent verifyThe mandate missed its heartbeat check-in and is suspended. Have the human check in with POST /v1/mandates/:id/heartbeat within the reactivation window.
mandate_revokedIntent verifyThe delegation mandate the token was authorized under is revoked. Ask the human to grant a new mandate.
no_manifestRisk factorThe asset carried no signed manifest (+60). Capture through the Provenance SDK, or screen legacy media with POST /v1/media/screen.
order_declinedClinician ordersThe clinician declined the order. Don't place the order.
otherCase reasonAnother reason, described in the required note. Read the case note.
payload_hash_mismatchIntent verify, Clinician ordersThe action_payload about to run isn't byte-identical (canonical JSON) to the one the human authorized. Execute the exact authorized payload, or authorize the changed one.
policy_biometric_requiredIntent verifyA policy rule requires a biometric-bound token and this one isn't. Authorize with a verified passkey assertion.
policy_deniedIntent verifyA policy rule with require.deny matched; the response names matched_rule_id. Change the action or the account policy. See policies.
policy_hardware_requiredIntent verifyA policy rule requires a hardware-attested device and this one isn't. Authorize from an enrolled hardware-backed device.
policy_tier_requiredIntent verifyA policy rule requires a higher hardware tier than the device has. Authorize from a device at the required tier.
policy_webhook_deniedIntent verifyYour policy webhook answered deny; webhook_reason carries its reason. Check your webhook's decision logic.
policy_webhook_pendingDecision ledgerThe engine needs a policy webhook decision that wasn't fetched yet (internal to evaluation and simulate). No action; verify resolves it.
policy_webhook_unavailableIntent verifyYour policy webhook timed out, errored or answered malformed JSON, and the rule fails closed. Check that the webhook answers within 3 seconds with a valid decision.
policyholder_withdrewCase reasonThe policyholder withdrew the claim. No action.
prescriber_excludedClinician ordersThe prescriber matched an exclusion list (OIG LEIE or SAM.gov); this is a hard deny at any tier. Don't route orders to this prescriber.
prescriber_tier_insufficientClinician ordersThe prescriber's verified tier is below what the clinical order policy requires. Verify the prescriber to the required tier. See clinician ordering.
provenance_verifiedCase reasonThe adjuster approved on verified provenance. No action.
reading_too_oldDecision ledgerThe kill-switch check's reading is older than max_age_s, so the answer is stale. Re-read the canaries with a fresh traced inference.
risk_acceptedCase reasonThe adjuster approved despite flagged risk. No action.
schedule_already_executedIntent verifyThis cycle already executed once. Wait for the next cycle.
schedule_amount_exceededIntent verifyThe amount differs from the schedule's fixed amount or exceeds its maximum. Execute the scheduled amount.
schedule_counterparty_mismatchIntent verifyThe action's counterparty isn't the schedule's counterparty. Execute the scheduled payment to the scheduled counterparty.
schedule_occurrences_exhaustedIntent verifyThe schedule ran all of its occurrences. Ask the human to grant a new standing schedule.
schedule_window_missedIntent verifyThe current cycle's execution window is closed. Execute inside the next cycle's window.
sensor_hash_mismatchRisk factorThe image bytes don't hash to the bundle's sensor_hash (+50). Submit the original captured bytes.
session_canary_lockedIntent verifyThe agent session or agent is locked after a canary trip under block_and_lock; the response carries lock_id. Review the trace, then clear the lock with POST /v1/trace/session-locks/:lock_id/clear. See kill switch.
session_lock_clearedDecision ledgerA human cleared a canary session lock (ledger kind lock_clear). No action.
session_nonce_mismatchRisk factorThe bundle's session_nonce or chain seed isn't the server-issued nonce (+70), the signature of a replayed feed. Record live in a fresh capture session.
shadow_webhook_unevaluatedDecision ledgerA shadow policy rule needed a webhook, and shadow evaluation never calls webhooks; the shadow result is pending. Read divergence from the other shadow decisions in the shadow report.
signature_invalidRisk factor, Case reasonThe bundle's ECDSA signature failed (+70); as a case reason it records a denial on that ground. Treat the asset as altered; re-capture if it should be authentic.
stopFinish reasonThe model finished its completion. No action.
suspected_fraudCase reasonThe adjuster denied or escalated for suspected fraud. Route to SIU.
timestamp_staleRisk factorThe capture is more than 72 hours older than the claim submission (+25). Submit captures promptly.
token_expiredIntent verifyThe intent token is past its exp. Authorize the action again to mint a fresh token.
token_revokedIntent verifyThe token, its agent session or its device was revoked; the response names revoked_scope. Authorize again once the revocation no longer applies. See revocation.
video_manifest_incompleteRisk factorThe video manifest has non-contiguous indices, a count mismatch or missing fields (+40). Submit the full chunk manifest.