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

StepStatusWhat PLICA recordsIndependent 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

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