Evidence Lifecycle
Chain of custody from API intake forward — not proof the file was authentic before it reached PLICA.
Every POST /verify response may include evidence_lifecycle — a four-step manifest with honest runtime status labels.
Steps
| Step | Status | What PLICA records | Independent check |
|---|---|---|---|
| 1 · Intake | partial | intake_hash (SHA-256), time_anchor: server_unverified |
Recompute SHA-256 on same bytes → compare |
| 2 · Decomposition | partial / n/a | PDF: parent_hash + child_hashes[] for embedded rasters |
Verify parent + each child hash; detect swap attacks |
| 3 · Analysis | partial | Modules, reason codes, transform log; document scans may include tamper_regions coordinates |
Review forensic_view — not black-box score |
| 4 · Evidence seal | design | Today: analysis_id + stored JSON + report digest |
Target: signed packet + RFC 3161, verify without trusting our DB |
Example fragment
{
"scope_version": "0.1",
"disclaimer": "Chain of custody from API intake forward — not proof of pre-intake authenticity.",
"steps": [
{
"id": "intake",
"status": "partial",
"artifacts": {
"algorithm": "SHA-256",
"intake_hash": "a1b2…",
"time_anchor": "server_unverified",
"analysis_id": "ANL-20260610-2360b341"
}
},
{
"id": "seal",
"status": "design",
"artifacts": {
"evidence_packet_available": false,
"custody_sketch": { "analysis_id": "ANL-…", "stored_result_json": true }
}
}
]
}
Status vocabulary
partial— shipped capability with known gaps (e.g. no independent TSA)design— target architecture, not yet productizednot_applicable— e.g. single image (no PDF decomposition)
Do not market
partial steps as court-autonomous proof. Honest labels are intentional — see threat model in repo: evidence-seal-threat-model.md.
Where it appears
evidence_lifecycletop-level on verification resultforensic_view.evidence_lifecycleduplicate for UI- Trial sandbox /try renders lifecycle card when present