Every step appends a SHA-256-chained event.
When we ingest a bid, every state transition gets a hash. Each hash includes the previous hash. A single tampered event breaks the chain. We expose verifyChain(db, bidId) — your CTO can recompute it from the raw events in under 200ms.