{trusted, confidence} — no raw value. This is the part worth
getting right.
The invariant
confidence is null exactly when trusted is null:
- A resolved verdict is a boolean
trustedwith an integerconfidence(0–100).{trusted: false, confidence: 100}is a certain negative. - An unresolved verdict is
{trusted: null, confidence: null}.
{trusted: null, confidence: 100} or {trusted: true, confidence: null} is not a
valid verdict — the two fields move together. A signal that could not run is always
{trusted: null, confidence: null}, never {trusted: false} and never a bare confidence with
no verdict.
Why a verdict was unresolved
When a verdict isnull, an unresolved item (see below) carries an
unresolved_reason telling you why:
Item outcomes
Each person indata[] carries a status that discriminates its shape:
scored — a verdict was produced
scored — a verdict was produced
Carries
score, band, reason, and the signals map. This is the normal outcome.unresolved — it ran, but nothing could be scored
unresolved — it ran, but nothing could be scored
Every signal you asked for returned
trusted: null, so there is nothing to score. It
carries no score, band, or item-level reason, but — unlike a rejected item — it
returns its full signals map, each null verdict with an unresolved_reason.rejected — the input could not be used
rejected — the input could not be used
A normal outcome for that row, not a failed request. The batch still returns and other
items still carry verdicts. The
reason appears on the item (no_runnable_signal,
invalid_phone, …).error — the item failed
error — the item failed
May carry a
reason when it is known, but an errored item is promised no field beyond its
status. A per-signal vendor outage degrades that signal to null — it never fails the
whole batch.