Contract: Evidence
Schema: domain/schemas/evidence.schema.json. Produced by agent/ tool
calls (via investigation_step.result_refs), stored/assembled by
evidence/.
What Evidence is (and isn't)
Evidence is a sourced, falsifiable claim, not an interpretation.
"Payment of 842000 MXN occurred on 2026-08-13" is evidence. "This looks
like money laundering" is an inference built from evidence, and belongs
in investigation_step.decision or the final case.hypothesis, never in
an evidence record itself.
Example
{
"evidence_id": "E-001",
"type": "TRANSACTION",
"source_type": "BANK_RECORD",
"source_id": "TX-8841",
"claim": "Payment of 842000 MXN occurred on 2026-08-13",
"strength": "DIRECT"
}
Strength levels
- DIRECT — proves the claim outright (e.g. the transaction record itself).
- CORROBORATING — supports another piece of evidence but doesn't stand alone (e.g. two shell providers sharing a registered address).
- CIRCUMSTANTIAL — consistent with the hypothesis but doesn't prove it (e.g. unusually fast payment timing, alone).
A case.status of SUBSTANTIATED should never rest on circumstantial
evidence alone — see docs/contracts/case.md.
Provenance requirement
Every tool in docs/contracts/agent-tools.md returns source_ids, and
every Evidence record's source_id/source_type must trace back to one
of those. If a judge asks "where does that number come from," the answer
is always a specific record ID, never "the model computed it."
Ownership
Evidence Collection Subsystem (backend/src/truelock/evidence/exposure.py).