Skip to main content
When a check does not find the token, the verification comes back carrying a diagnosis: a named code, the cause in one sentence, the fix in one sentence, and the evidence the probe matched on.
What each code means, for a person, and the generated catalogue of all thirteen.

The fields

string
required
A stable identifier. Branch on this — it will not be reworded. One of the thirteen in the catalogue.
string
required
One sentence saying what is actually true right now, with the real names and values in it. Render it; do not match on it.
string
required
One sentence saying what to change. For the cases where nothing needs changing — negative_cache — it says so and gives the wait.
object
required
The evidence the probe matched on, and its shape depends on code. record_at_apex carries { name, value }; servfail carries { resolvers }; negative_cache carries { secondsRemaining }.
observed is a tagged union keyed on code. Narrow on code before reading it — there is no field common to all thirteen.

Where it comes from

The probes run over an observation that has already been collected — recursive resolvers first, then the authoritative nameservers if the answer was negative. No probe issues a query of its own, which is why a verification can carry a diagnosis without any extra DNS traffic when you read it back. See DNS Verification for the three questions a check asks.

Rendering one

A verification that has not proved always carries exactly one of diagnosis or waitEstimate, and they mean opposite things. That makes the whole “what now” message two fields:
diagnosis means something has to change. waitEstimate means nothing does, and its reason says what is being waited on:
cause and fix are product copy and are improved regularly. They are safe to render verbatim and unsafe to match on. If you need to key behaviour off a case, key it off code.
Styling the three families differently is worth the effort, and Claim Flow shows one way to do it.