inhold Book a call

Auditors

How does an auditor check an Inhold evidence pack?

Export the pack with the auditor role, run the chain check, and compare the chain head with the anchor and with the pack you kept last time. The first pack is the one you start trusting from.

Last checked 31 Oct 2026, written by Vivek Kumar

Inhold is being built. No customers yet. The AWS install's Terraform passes CI checks but has not been run in a real AWS account. Repo goes public 9 Nov 2026.

What the pack holds

Everything a decision depended on

The policy

active_bundle.json, the bundle that made every decision, with its hash beside it.

The rows

Every audit row in the period, allowed and denied, each with the hash of the row before it.

The manifest

MANIFEST.json lists each file's SHA-256, the chain head, the export anchor and the policy hash. It is unsigned; the anchors are what you compare against.

The answers

A control map to 164.312 and the minimum necessary standard, and the 20 reviewer answers as they stood at export.

Checking it

Two tools, one of them twelve lines

verify_chain.py

Twelve lines of Python on the evidence pack page. It recomputes the chain and reports the first row that breaks it. It checks the chain only.

inhold verify-pack

Also checks the anchors and the manifest hashes, and compares against an earlier pack you kept, so a pack cannot vouch for itself.

The tamper test

The evidence pack page shows the same pack with one row rewritten and the chain rehashed: the chain check passes, verify-pack does not. That is why the anchors exist.

Who exports, and what to watch

Limits an auditor should know

The auditor role

Only roles granted export in the bundle can export a pack, and each export is itself an audit row. Reads of the log are logged.

Anchor reach

Anchors catch a rewrite only if the database administrator cannot also reach them. In the AWS install they sit in S3 under Object Lock, signed by a KMS key the database role cannot use.

Caller-supplied fields

Two row fields come from the caller: a request id, kept only when it is a UUID or a plain id that names no patient or date, and a session id. Everything else is set by the gateway.