Fail-closed handling
Ward fails closed: when a list was not loaded, a provider timed out or a field could not be read, the answer says so and the decision moves toward review, never toward approval.
| You see | It means | Do |
|---|---|---|
checks.<list>: "not_checked" |
That list did not run | Do not treat "no hits" as clear for that list |
SCREENING_UNAVAILABLE, EMAIL_DNS_UNAVAILABLE |
A dependency was unreachable | Retry later or review; never auto-approve |
coverage.level: "limited" |
Part of the input was unreadable | Read coverage.missing; ask for the data |
needs[] |
Fields that would sharpen the answer | Collect them on the next touch |
score_kind: "unavailable" |
No score for this path | Decide on decision and signals |
Your own integration should fail closed too: if the call to Ward errors or times out, treat it as STEP_UP, not APPROVE.
try:
d = client.decide("payment", txn, timeout=0.8)
decision = d.decision
except ward.APIError:
decision = "STEP_UP" # never let an outage approve