{
  "schema": "nordvec.audit-chain.v2",
  "generatedAt": "2026-11-01T00:26:34.826Z",
  "recipes": {
    "alg": "each checkpoint's `alg` names the digest algorithm its digest, root, leaf hashes and commitments are computed under, and `prev` is the previous checkpoint's digest under that checkpoint's own `alg`; the recipes here are those of sha256, the algorithms published are sha256, a chain's algorithm never moves back to an earlier one, and a reader refuses an algorithm it does not know rather than recomputing under another",
    "leaf": "sha256(0x00 || preimage), preimage = newline-joined `seq=`, `family=`, `id=`, `created_at=` (UTC, microseconds, Z), `action=`, `detail=`, `tenant_id=`, `request_id=` (a null detail, tenant_id or request_id printed empty), then `<field>=<commitment>` for user_id, metadata, ip_address, user_agent, target_id, subject_user_id, actor_kind; commitment = hex sha256(salt || 0x00 || field || 0x00 || value || 0x00 || 'V') under the field's own random salt, with value '' and 'N' in place of 'V' when the field is null, or the word ERASED once that field's salt is shredded; a leaf page prints the seven commitments in that order, null for a field already erased when the row was chained, or none when every field was",
    "root": "RFC 6962 Merkle tree over the window's leaf hashes in seq order: leaves 0x00-prefixed, nodes sha256(0x01 || left || right), an odd node promoted unchanged; the empty tree is sha256('')",
    "checkpoint": "digest = sha256(origin || '\\n' || size || '\\n' || root || '\\n' || (prev or '') || '\\n'); size is cumulative, root is over the window (previous.size, size], prev is the previous checkpoint's digest",
    "anchor": "an RFC 3161 TimeStampToken whose message imprint is sha256 = the checkpoint digest; verify the signature with the signer certificate embedded in the token, and compare `signer.fingerprint256` with the certificate on the provider's EU trusted-list entry to know whether the timestamp is qualified (packages/shared/src/rfc3161.ts, `bun run verify:audit-chain --signer <fingerprint>`)",
    "verification": "the deployment's own daily re-derivation of every family (leaf hashes recomputed from the rows, windows against their checkpoints, chained rows counted present per month against retention receipts), recorded per run whether clean or not; `verification` is the newest run and `lastCleanAt` the newest clean one. A self-report: it says the verifier ran and what it found, and proves nothing a reader cannot recompute from the pages (`bun run verify:audit-chain --max-verification-age HOURS` fails a deployment whose verifier is silent or failing)"
  },
  "anchoring": {
    "anchored": false,
    "statement": "No checkpoint is anchored: checkpoints chain to each other and to nothing outside this deployment. A reader who pinned an earlier checkpoint can still tell whether it is in the chain."
  },
  "families": [
    {
      "family": "user_activity_log",
      "origin": "nordvec.audit.user_activity_log",
      "size": 0,
      "checkpoints": 0,
      "head": null,
      "anchoredThroughSeq": null,
      "pages": {
        "size": 100,
        "count": 0,
        "hrefs": []
      },
      "tail": [],
      "verification": null
    },
    {
      "family": "audit_log",
      "origin": "nordvec.audit.audit_log",
      "size": 0,
      "checkpoints": 0,
      "head": null,
      "anchoredThroughSeq": null,
      "pages": {
        "size": 100,
        "count": 0,
        "hrefs": []
      },
      "tail": [],
      "verification": null
    },
    {
      "family": "admin_audit_log",
      "origin": "nordvec.audit.admin_audit_log",
      "size": 0,
      "checkpoints": 0,
      "head": null,
      "anchoredThroughSeq": null,
      "pages": {
        "size": 100,
        "count": 0,
        "hrefs": []
      },
      "tail": [],
      "verification": null
    },
    {
      "family": "audit_deletion_log",
      "origin": "nordvec.audit.audit_deletion_log",
      "size": 0,
      "checkpoints": 0,
      "head": null,
      "anchoredThroughSeq": null,
      "pages": {
        "size": 100,
        "count": 0,
        "hrefs": []
      },
      "tail": [],
      "verification": null
    },
    {
      "family": "compliance_corrections",
      "origin": "nordvec.audit.compliance_corrections",
      "size": 0,
      "checkpoints": 0,
      "head": null,
      "anchoredThroughSeq": null,
      "pages": {
        "size": 100,
        "count": 0,
        "hrefs": []
      },
      "tail": [],
      "verification": null
    }
  ]
}
