Contract: Case
Schema: domain/schemas/case.schema.json. The final, judge-facing
artifact — see docs/demo/runbook.md steps 9-12.
Example
{
"case_id": "CASE-001",
"status": "SUBSTANTIATED",
"hypothesis": "Circular movement of supplier funds",
"amount_involved": 1842000,
"supporting_evidence": ["E-001", "E-014", "E-019"],
"discarded_leads": [
{ "lead_id": "L-004", "reason": "Isolated late payment, no corroborating signal" }
],
"confidence_level": "HIGH",
"limitations": ["No direct beneficial-owner record available"],
"citations": ["CFF Art. 69-B"]
}
Status is one of three, never a bare "suspicious"
SUBSTANTIATED— the accumulated evidence supports the hypothesis.UNSUBSTANTIATED— investigated, and the evidence does not support it (this is a real, useful outcome — the system must be able to say "we looked, and it's clean").INSUFFICIENT_EVIDENCE— investigation is incomplete or blocked (e.g. missing beneficial-owner records); says what's missing inlimitations.
Required fields and why
discarded_leads— every lead considered and not pursued, with reason. This is the "what did you rule out" the challenge brief requires.limitations— what's missing, and (implicitly) what would change the conclusion. Directly answersdocs/demo/runbook.mdstep 12: "What would change your conclusion?"citations— regulatory/rule references, so "why is this relevant" always traces to something outside the model's own say-so.evidence_hash— SHA-256 hash anchoring evidence integrity.
Ownership
Owned by the Evidence and Case Service subsystem (backend/src/truelock/services/case_service.py). The API contract for serving/rendering a Case is
docs/contracts/api.md.