How this is safe. Every endpoint above returns only cryptographic fields:
sequence_number, entry_hmac, previous_hmac, event_timestamp. Row payload (description, patient_id, email, ip_address, JSONB) never crosses this boundary. Add a chain to the public surface in backend/app/routes/proof.py CHAIN_TABLES dict only after passing the redaction review.
What "head-only" means. Some chains roll the prior-row hash into a JSONB payload (e.g., CH VPN events). Recomputing the chain would require the public to see the payload — which contains identifiers. Head-only chains expose their tip seq + last-write timestamp so anyone can verify the chain hasn't been rolled back, even though they can't recompute row-by-row.