How the chain is built
Each audit entry is linked into a per-org hash chain. Three mechanisms harden it:
Writes are serialized per org (advisory lock + transaction) so concurrent writes cannot fork the chain, and verification streams the chain in bounded memory so it scales to 7+ years of activity.
Signed, independently verifiable exports
An audit export is a self-describingaudit-export.json envelope, signed end-to-end with per-tenant Ed25519 keys for non-repudiation. It contains:
Verification is self-contained and needs no HASP software: confirm the embedded key matches the independently-published key, recompute each record’s hash and confirm the chain links, verify every per-record signature under the published key, and validate the RFC 3161 timestamp over the chain head.
Your organization’s audit public keys are published at
/.well-known/audit-keys.json and /trust/keys/{org_id} so a verifier can confirm the embedded key against a source HASP does not control.
Verify it yourself with @usehasp/verify
HASP publishes an open-source verifier that checks a signed export end-to-end — hash chain continuity, Ed25519 signatures, and the RFC 3161 TSA timestamps — entirely on your machine:
Applies to every org — including Free Evaluation
The full chain applies to every organization, paid and Free Evaluation alike. A prospective customer who registers an agent, watches it execute through the policy gate, and downloads a cryptographically signed export during their evaluation has seen the substrate doing its job — not a feature tour.
When a Free Evaluation org converts to paid, the chain continues uninterrupted — no reset, no new genesis hash.
IP-address logging is a compliance floor, not a tier feature — it is included on every paid tier because HIPAA §164.312(b) requires access logs to capture enough context to reconstruct who accessed what from where. Device-metadata logging (user-agent, OS, device fingerprint) is distinct and remains an Enterprise-optional surface.
What PHI events look like in the chain
PHI events (gateway.phi_detected, gateway.phi_redacted, and every subsequent step) are recorded — but the original PHI is never persisted. Rows carry the redacted form plus entity-class metadata only. See BAA Structure for how PHI handling feeds the chain.