Redacting sensitive data#
BitExact proves a redaction happened. What to redact in a recorded run is
found two ways: the capture policy's detectors (card numbers, IBANs,
credentials, SSNs in context, email addresses and your own patterns -
Capture controls) file it for you with
bitexact capture backfill, as one two-person redaction request; anything
those detectors do not cover is decided by tooling you already use - a
PII-detection library, a DLP system, or your own classifiers - running
inside your environment. This document describes how that output drives
the redaction: one that removes the value where it lives, leaves a signed
audit trail, and still verifies.
The division of labor#
- The capture policy, or your detector, decides what is sensitive.
bitexact capture backfill --run RUN --by NAMEfiles what the policy in force would not have kept. For anything else, your detector scans a run's recorded payloads and identifies the fields (and spans) to remove. It is the only component that needs to see the plaintext, and it runs inside your environment like everything else. - BitExact removes it and proves the removal.
bitexact redactrewrites the stored manifest write-ahead: a chainedredactionaudit entry naming the fields and the operator lands on the chain before any value is destroyed, the value and its salt are removed, and the standing field commitment continues to attest that the value existed. The chain still verifies; the plaintext is gone.
Procedure#
List the committed field paths of a run. Export it and read each entry's
commitmentskeys (bitexact export <run> -o run.json), or open the step's Integrity tab in the inspector; a selection isstep:path(e.g.3:request.text,3:response.text).bitexact show <run>prints one line per step and marks redacted paths once a redaction has happened.Detect. Run your detector over the payload at each path and collect the
step:pathselections it flags.Redact the store, write-ahead.
bitexact redact <run> --fields 3:request.text,3:response.textThis is the single-operator path. Where
BITEXACT_REQUIRE_DUAL_CONTROLis set — and a deployment handling erasure requests usually should set it —redactrefuses by name and the governed two-person flow is the only way through: one principal requests the redaction in the viewer's Redact drawer and a different one approves it there. Both decisions are taken in the viewer because that is where each principal is authenticated; on the command line--byis typed, so under dual controlbitexact redaction requestandapproverefuse too, and onlystatusandrejectremain there.See Retention and legal hold for the full lifecycle. Either way the act lands as a chained claim on the run.
Use
--steps <n,...>to redact every committed field of a step. The rewrite is atomic and verified after write; a crash mid-redaction leaves the recorded intent, which verification flags until the redaction is re-run to completion. Audit entries themselves can never be redacted.Prove it.
bitexact verify <run>still passes;bitexact showreports the number of steps carrying redacted fields, and marks each hidden path[redacted: ...]in place. The open-source verifier independently enforces redaction integrity: a bundle that claims to have redacted a field but still carries its value fails. A recipient learns that redaction occurred and was honest — without ever seeing the removed data.
What to hand an auditor#
An exported, signed bundle of the redacted run. It proves the trajectory is intact and that the redactions it claims were actually applied, while the sensitive data is gone from the evidence. Detection quality is the responsibility of your detection tooling; BitExact's part is the verifiable proof that the redaction was applied and the rest of the record is untouched.