Explanation, audit and provenance
What the explanation, audit, provenance and degraded fields of a result mean, how to use them for an audit trail, and when to switch the explanation off.
Last updated 12 September 2026
Explanation, audit and provenance
A verdict alone is a decision. The rest of the result is the reasoning, the check on that reasoning, and the record that lets someone reproduce it later.
Explanation
For a claim checked against inline evidence, three rubric axes mark propositions about the claim, each with its reasoning and the spans it relied on:
{
"explanation": {
"axes": {
"entailment": {
"covers_every_assertion": {
"reasoning": "Only the revenue assertion is supported; the operating margin improvement lacks evidence.",
"holds": "false",
"spans": ["ev_1:0"]
}
}
},
"citedSpans": ["ev_1:0"],
"availableSpans": 2,
"axesRun": ["entailment", "contradiction", "scope"],
"axesExpected": ["entailment", "contradiction", "scope"]
}
}
holds is "true", "false" or "unclear". The explanation does not decide the verdict. It is produced independently and can disagree with it.
For a claim checked against a batch, the explanation is different in shape: reasoning, the list of unverifiedAssertions (the actionable output), searchedThoroughly, and a trace of what was searched and read, in order, with the number of steps taken.
Audit
{
"audit": {
"referentialIntegrity": 1,
"explanationTrust": 1,
"findings": [],
"explanationDisagrees": false
}
}
referentialIntegrityis the share of cited spans that resolve to text you sent, from 0 to 1. A citation the model invented was removed and lowers this.explanationTrustis that figure less mechanical coherence penalties.findingsnames problems, for examplefabricated_span_reference.explanationDisagrees: truemeans the explanation read the evidence differently from the verdict. It is not an error. It flags a borderline case and is surfaced rather than reconciled away. In practice it fires onDISPUTEDcases, where the contradiction axis sees a refutation while the verdict declines to pick a side.
Provenance
{
"provenance": {
"measurementHash": "3f9c...",
"policyHash": "a41b...",
"rulesApplied": ["precedence", "adjacent-not-partial"],
"promptVersion": "attest-routed-v1+precedence+adjacent-not-partial",
"scoringVersion": "attest-scoring-v1",
"serviceVersion": "attest-service-v0.1",
"model": "openai/gpt-oss-120b",
"createdAt": "2026-09-06T14:02:11.318Z",
"mode": "evidence"
}
}
measurementHashidentifies the inputs: the canonical claim, the evidence and the measurements.policyHashidentifies the scoring configuration. They are separate so that changing a threshold does not invalidate a measurement no model call would produce differently.rulesAppliedlists the reading rules chosen for this request. The set is part ofpromptVersion, so two responses with the same version were produced by the same instructions.modeisevidenceorbatch-agent.
A verdict is reproducible from the document you still hold plus these hashes and versions. It is not retrievable from Quorum, because Quorum does not keep it. See Privacy.
Degraded
{ "degraded": ["explanation_incomplete: 2/3 axes"] }
Non-fatal problems, so you always learn when an answer was produced with reduced measurement. An empty array means nothing was compromised.
Switching the explanation off
config.explain: false skips the explanation pass. You get the verdict at a fraction of the latency, but explanation and audit come back null and the span lists are empty, so there is no audit trail and no citations. It costs the same credits as an explained check, on purpose, so nobody is nudged away from the audit trail. Reach for it when you are triaging volume, not when the answer matters.
Keeping an audit trail
Store, per claim you checked: the claim, the evidence ids and their fileHash or content, the verdict, the span ids, and the whole provenance block. That is enough to answer "was this verdict produced against the document I signed off" by hashing the file you still hold, and to replay the check against the same versions.
Related articles
Fetch a page in one call
The same work as the extract call, with the request held open until the page is done and the Markdown returned directly.
Watch an extraction
Server-sent events for one job: its state now, every change after it, and the finished page. Closes when the job does.
Read an extraction's progress
One frame of a job's state without its Markdown, for a progress bar that should not carry a page's text with every poll.
Collect an extraction
Poll a job that answered 202. Returns its state while it runs and the Markdown once it is done.
Still need help?
Ask Quincy in the chat bubble below, or write to support@quorumtech.ch and we will help you directly.