Skip to content

Compliance Evidence

TapPass’s compliance story rests on mechanisms that exist in the server itself: a hash-chained, dual-signed audit trail, cryptographic erasure for GDPR, configurable retention, and policy what-if replay. This page documents what each mechanism does and which endpoint or CLI command produces the evidence.

The audit trail, tamper evidence by construction

Section titled “The audit trail, tamper evidence by construction”

Every governed event is appended to the audit trail with three integrity mechanisms:

Mechanism Detail
Hash chain (v2) Each event stores a cryptographic hash over its fields plus the previous event’s hash. Chain format v2 is per-org: each org has an independent chain, so verification and compromise are isolated per tenant. Legacy events without _chain_version verify against the v1 global chain
Dual signatures Every event carries hybrid classical + post-quantum dual signatures. Both signatures must verify for an event to be authentic
Chain bridges When retention deletes events, a _chain_bridge record preserves the bridged hash so the chain still verifies across the gap

The signing key lives at TAPPASS_AUDIT_SIGNING_KEY (or is auto-generated in TAPPASS_KEYS_DIR, default keys/); set TAPPASS_AUDIT_KEY_PASSWORD to keep the PEM encrypted at rest.

GET /api/audit/integrity recomputes each event’s hash, checks chain linkage end-to-end, and verifies event signatures. It is org-scoped, requires a developer role, and results are cached for 5 minutes to prevent DoS via repeated full-chain scans.

Terminal window
curl -s -H "Authorization: Bearer $TOKEN" \
https://tappass.example.com/api/audit/integrity | python -m json.tool

Response shape:

{
"status": "intact", // or "compromised" (or "empty" before any events)
"events": 15432,
"valid": 15432,
"broken": 0,
"broken_events": [], // [{line, event_id, reason: chain_broken|content_modified|...}]
"chain_length": 15432,
"current_head": "a1b2c3..."
}

broken_events distinguishes chain_broken (a _prev_hash no longer matches its predecessor, insertion, deletion, or reordering) from content_modified (recomputed hash differs, fields were edited).

External auditors can verify signatures without trusting the server:

Terminal window
curl -s https://tappass.example.com/api/audit/signing-key | python -m json.tool

Returns the audit public keys with usage instructions.

Evidence extraction is a query, not a separate instrumentation effort:

Endpoint Purpose
GET /api/audit?event_type=pii_detected&limit=500 Filtered event list (cursor-paginated)
GET /api/audit/_overview Aggregate statistics
GET /api/audit/session/{id} · /task/{id} · /pipeline/{id} Drill into one session, task, or pipeline run

The CLI equivalent is tappass audit list --event-type pii_detected --since 30d.

Article 17, right to erasure (cryptographic erasure)

Section titled “Article 17, right to erasure (cryptographic erasure)”

Erasure is a two-step, receipt-backed process under /api/compliance/gdpr:

Endpoint Role Description
POST /api/compliance/gdpr/erasure requester Submit an erasure request for a data subject
GET /api/compliance/gdpr/erasure , List erasure requests for the org
GET /api/compliance/gdpr/erasure/{request_id} , Check request status
POST /api/compliance/gdpr/erasure/{request_id}/execute admin Execute the erasure

Execution replaces PII fields with [ERASED:GDPR-Art17] tombstones (cryptographic erasure) across the audit store, the JSONL log, and vault credentials. It then produces a receipt, data subject, executor, counts of erased events/records/credentials, and a hash of the receipt, which is itself recorded in the (signed) audit trail as an erasure-executed event. The tombstone preserves the chain: the event still hashes and verifies, only the personal data is gone.

Terminal window
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
https://tappass.example.com/api/compliance/gdpr/dsar \
-d '{"subject": "user@example.com"}'

Exports everything the trail holds about a data subject.

Query the trail for processing evidence: pii_detected events carry agent ID, entity types, and the action taken (redacted / blocked / allowed); LLM-call events show which provider received data. See the audit query endpoints above.

TAPPASS_AUDIT_RETENTION_DAYS (default 365, 0 = forever) sets how long audit records are kept. Retention is operator-triggered, there is no background scheduler, via the settings API:

Endpoint Description
GET /api/settings/retention Current retention config (persisted to data/retention_config.json)
GET /api/settings/retention/preview What a retention run would delete/archive
POST /api/settings/retention/run Execute a retention run

Rotation (TAPPASS_AUDIT_ROTATION_MAX_MB, default 100) and optional archiving (local/S3/Azure Blob, with gzip) are configured in the same retention config.

  • Approval workflows (/api/approvals, CLI tappass approvals) give humans an approve/deny gate on governed actions, with every decision written to the audit trail.
  • Trust scoring (GET /api/trust/scores, GET /api/trust/scores/{agent_uuid}, GET /api/trust/alerts) provides continuous per-agent oversight signals derived from audit events.
  • Policy replay (POST /api/audit/replay, plus /api/audit/replay/batch for impact analysis and /api/audit/playground/test for sandbox testing) re-runs past events against proposed policy, what-if analysis before a policy change ships, with no audit writes and no side effects. CLI: tappass audit replay <event_id> --policy-overrides @overrides.json.

The integrity endpoint above is the core evidence: a point-in-time, cryptographically verified statement that the audit trail is intact, repeatable on demand, with the signing keys published for independent verification. Audit event samples (GET /api/audit?limit=1000) plus the dual-signature scheme demonstrate that logging controls operated over the period.

Self-hosted deployments ship a helper at deploy/on-prem/scripts/generate-compliance-evidence.sh. It runs the unit and security test suites, the eval corpus, Bandit SAST, and pip-audit SCA, then writes the raw results plus a SUMMARY.md into a compliance-evidence/ directory, a dated artifact bundle you can hand to auditors alongside /api/audit/integrity output:

Terminal window
./deploy/on-prem/scripts/generate-compliance-evidence.sh
# → compliance-evidence/{unit-tests.xml, security-tests.xml, eval-corpus.json,
# bandit-sast.json, pip-audit-sca.json, SUMMARY.md}