Public technical reference · v1.0

AI agent evidence bundle manifest schema

An evidence bundle manifest names the sealed export, tenant scope, retained artifacts, Merkle root, record links, and integrity anchors. Use it when an evidence-room export moves between KLA and an offline verifier.

Bundle specification · evidence-room-bundle-v1 · manifest format 1.0

Evidence bundle manifest quick reference

Definition
The manifest.json seal record for one exported evidence bundle.
Used when
A sealed export is inspected, transferred, or verified offline.
Minimum
Identity, export metadata, artifact digests, Merkle root, and integrity anchors.
Verification
Normalize, hash, verify signatures, check artifact inclusion, and run applicable anchors.

02

Where the manifest sits in the bundle

The exporter writes a directory with a summary, manifest, detached JWS, embedded public keys, timestamp proof, ledger anchor, and exported artifacts.

  1. 01Seal summarybundle.json records the export and tenant identifiers, manifest digest, Merkle root, artifact count, required signer classes, timestamp receipt, and ledger anchor paths.
  2. 02Manifestmanifest.json records export metadata, artifact paths and digests, the record linkage, Merkle metadata, redaction and omission metadata, and integrity anchors.
  3. 03Cryptographic materialmanifest.jws.json carries detached ES256 signatures over the manifest digest. keys/jwks.json supplies embedded public keys for offline checks.
  4. 04Evidence bytesartifacts/exports contains exported JSON, CSV, or PDF files. artifacts/index/artifact_index.json indexes the exported set.
  5. 05External anchorstimestamp.ots contains the OpenTimestamps proof. ledger_anchor.json contains the immudb anchor or the producer’s NOT_PRESENT record.
<bundle-dir>/
  bundle.json
  manifest.json
  manifest.jws.json
  keys/jwks.json
  timestamp.ots
  ledger_anchor.json
  artifacts/exports/...
  artifacts/index/artifact_index.json

03

Field dictionary

Required fields come from the current sealed-bundle contract. Conditional fields appear when the producer records the corresponding scope or evidence-factory detail. Optional fields carry additional export context.

Bundle identity and export

FieldStatusPurpose
formatVersionRequiredSelects the sealed manifest format; the current producer emits 1.0.
bundleSpecRequiredIdentifies evidence-room-bundle-v1.
exportIdRequiredBinds the manifest to one export.
tenantIdRequiredStates the tenant scope carried by the export.
createdAtRequiredRecords when the export record was created.
exporter.nameRequiredIdentifies the exporter that produced the bundle.
exporter.versionRequiredIdentifies the exporter version.
export.exportIdRequiredMust agree with the top-level exportId.
export.tenantIdRequiredMust agree with the top-level tenantId.
export.environmentRequiredRecords the source environment label.
export.platformVersionRequiredRecords the platform version supplied by the producer.
export.requestedByRequiredRecords the export requester reference.
export.requestedAtRequiredRecords the export request time.
export.sealedAtRequiredRecords when the seal was written.
export.traceIdsRequiredCarries trace references associated with the export.
export.policySnapshotsRequiredCarries policy snapshot references selected by the exporter.

Artifacts and linkage

FieldStatusPurpose
artifacts[]RequiredLists every exported artifact covered by the Merkle root.
artifacts[].pathRequiredResolves the artifact inside the bundle directory.
artifacts[].sha256RequiredStates the SHA-256 digest of the artifact bytes.
artifacts[].bytes or sizeBytesRequiredLets the verifier compare the declared size with the file.
artifacts[].contentTypeRequiredDescribes the exported file content type.
artifacts[].classOptionalLabels an artifact class such as execution-evidence or artifact-index.
artifacts[].provenanceOptionalCarries producer provenance metadata for the artifact.
artifacts[].createdAtOptionalRecords when the artifact was created.
artifacts[].sourceOptionalLinks the artifact to a source type and reference.
record.decisionRequestIdOptionalLinks the bundle to the governing decision request.
record.executionIdOptionalLinks the bundle to an execution.
record.lineageRecordIdOptionalLinks the bundle to execution lineage.
scopeOptionalDescribes the export population or time boundary when supplied.
profileOptionalRecords the evidence profile selected by the producer: full, redacted, or minimal.
omissionsOptionalRecords declared omissions.
redactionsOptionalRecords declared redaction metadata.

Seal and conditional governance evidence

FieldStatusPurpose
merkle.algorithmRequiredIdentifies kla-merkle-v1.
merkle.rootSha256RequiredCommits to the sorted artifact path and digest set.
integrity.manifestHashAlgoRequiredIdentifies SHA-256 for the manifest digest.
integrity.manifestHashRequiredStores the raw hexadecimal digest of the normalized manifest.
integrity.signatureAlgoRequiredIdentifies the manifest signature algorithm, currently ES256.
integrity.signaturePayloadRequiredStates that the signature payload is MANIFEST_HASH.
integrity.signingKeyIdRequiredIdentifies the producer signing-key reference.
integrity.anchors[]RequiredLists timestamp and ledger anchor records.
evidenceFactory.request.requestedArtifactsConditionalDrives whether receipt-signatures and ledger-hash-chain are required.
evidenceFactory.contractVersionConditionalIdentifies the Evidence Factory request contract when a factory request is embedded.
evidenceFactory.request.tenantIdConditionalCarries the tenant binding for the embedded Evidence Factory request.
evidenceFactory.request.actorConditionalIdentifies the human or service actor that requested the factory export.
evidenceFactory.request.sourceConditionalIdentifies the KLA surface that requested the factory export.
evidenceFactory.request.scopeConditionalCarries the chronology and selectors used for the factory export.
evidenceFactory.request.redactionProfileConditionalStates the factory export redaction profile.
evidenceFactory.request.idempotencyKeyConditionalCarries the request idempotency key.

04

Minimal complete example

This synthetic manifest uses the same export identifier and record links as the complete execution reference. The companion bundle summary repeats the seal values that the verifier compares.

{
  "bundle": {
    "exportId": "bundle_manifest_synthetic_20260721_01",
    "tenantId": "tenant_synthetic_001",
    "manifestDigestSha256": "1bae725ba61cf55f94310e37ee491d3d52145d98da8580df63e0b91fa9968117",
    "merkleRootSha256": "cb170b4d42403ed97c4818a723ebd93607902a84159deb4555357bc73a432102",
    "artifactCount": 2
  },
  "manifest": {
    "formatVersion": "1.0",
    "bundleSpec": "evidence-room-bundle-v1",
    "record": {
      "decisionRequestId": "dr_01JZ8V4Q4N9K6T2D5B3M7X1S0E",
      "executionId": "run_01JZ8V4K2D9A6N3P7M5R1C8X0E",
      "lineageRecordId": "lin_01JZ8V4R8A2C6N9Q3S5D7M1T0E"
    },
    "artifacts": [
      {
        "path": "artifacts/exports/evidence-export-synthetic.json",
        "sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
        "bytes": 128,
        "sizeBytes": 128,
        "contentType": "application/json",
        "class": "execution-evidence",
        "source": {
          "type": "synthetic",
          "ref": "run_01JZ8V4K2D9A6N3P7M5R1C8X0E"
        }
      },
      {
        "path": "artifacts/index/artifact_index.json",
        "sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
        "bytes": 64,
        "sizeBytes": 64,
        "contentType": "application/json",
        "class": "artifact-index",
        "source": {
          "type": "synthetic",
          "ref": "bundle_manifest_synthetic_20260721_01"
        }
      }
    ],
    "integrity": {
      "manifestHashAlgo": "SHA-256",
      "manifestHash": "1bae725ba61cf55f94310e37ee491d3d52145d98da8580df63e0b91fa9968117",
      "signatureAlgo": "ES256",
      "signaturePayload": "MANIFEST_HASH",
      "signingKeyId": "sample-key-sek-synthetic-01",
      "anchors": [
        {
          "type": "immudb",
          "status": "NOT_PRESENT",
          "reason": "IMMUDB_DISABLED",
          "ledger": "immudb",
          "proofPath": "ledger_anchor.json",
          "valueHash": ""
        },
        {
          "type": "ots",
          "status": "PRESENT",
          "proofPath": "timestamp.ots"
        }
      ]
    }
  }
}

Valid seal values

The manifest digest is 1bae725ba61cf55f94310e37ee491d3d52145d98da8580df63e0b91fa9968117. The Merkle root is cb170b4d42403ed97c4818a723ebd93607902a84159deb4555357bc73a432102.

Cross-reference

The record fields and export identifier connect this file to the complete sanitized execution record and its evidence.manifest_ref.

Download the companion bundle summary

05

Integrity and offline verification

The production verifier treats bundle bytes and manifests as untrusted input and fails closed when a required check fails. The procedure has six named checks.

manifest-signature

Manifest signature

Normalizes the manifest, computes the JCS/SHA-256 digest, compares the manifest and bundle summaries, checks the detached payload, validates ES256 SEK and TEK signatures against embedded non-revoked keys, and validates declared anchor paths.

receipt-signatures

Receipt signatures

When governance EvidenceEntry[] material is present, verifies Ed25519 receipt signatures, embedded keys, revocation state, and prevReceiptHash links. Unsigned receipt material follows the verifier’s explicit unsigned-receipt path.

ledger-hash-chain

Ledger hash chain

When governance EvidenceEntry[] material is present, recomputes ledger record hashes, applies recorded redaction transforms, checks entry hashes, and requires one connected ledger component.

merkle-inclusion

Merkle inclusion

Resolves each declared path inside the bundle, compares file size and SHA-256, recomputes kla-merkle-v1, checks inclusion proofs when supplied, and compares the root and artifact count with bundle.json.

ots-anchor

OpenTimestamps anchor

Parses timestamp.ots, checks its SHA-256 commitment against the manifest digest, and accepts a pending calendar proof or a Bitcoin attestation within the offline verifier’s trust boundary.

pii-absence

PII absence

Runs only when the caller supplies forbidden markers. It scans bundle files as bytes, reports masked marker digests, and fails when a listed file or the manifest cannot be read.

Valid synthetic manifest

The declared digest reproduces from the normalized manifest. The declared Merkle root is computed from the two sorted artifact entries. A complete on-disk bundle supplies the bytes and detached signatures for the remaining checks.

Single artifact-digest tamper

The tampered file changes one artifact sha256 from the valid example while retaining the original manifest digest and Merkle root. The manifest remains schema-valid. Digest comparison fails, and the full merkle-inclusion check also compares the declaration with the artifact bytes.

  1. 01Read bundle.json, manifest.json, manifest.jws.json, keys/jwks.json, and the declared anchor files from the bundle directory.
  2. 02Validate manifest structure and keep every path inside the bundle directory.
  3. 03Blank integrity.manifestHash and immudb anchor valueHash fields, canonicalize with the exporter’s JCS-style ordering, and compute SHA-256.
  4. 04Compare the computed digest with manifest.json, bundle.json, and the detached JWS payload. Verify the SEK and TEK ES256 signatures with embedded public keys.
  5. 05Determine whether governance evidence checks are required: a missing requestedArtifacts array, execution-evidence or raw-evidence, evidence files found in the bundle, or evidence-loading errors activates receipt-signatures and ledger-hash-chain.
  6. 06Run the six checks in verifier order. A caller may add forbidden markers for the opt-in pii-absence check. The bundle passes only when every applicable check passes.

06

Current KLA implementation mapping

These repository sources define the producer, manifest contract, verifier, and individual checks described here.

ContractRepository source pathMappingStatus
BundleManifest / BundleJsonpackages/evidence-verifier/src/types.tsDefines manifest, summary, artifact, anchor, record, JWS, JWKS, check, and verification shapes.Current source
Sealed manifest contractpackages/evidence-contract/src/index.tsValidates the producer’s required formatVersion, export, artifact, Merkle, record, and integrity fields.Current source
Bundle producerservices/evidence-exporter/src/export-api.tsWrites bundle.json, manifest.json, detached JWS, JWKS, OTS proof, ledger anchor, and artifact index.Current producer
Verification orchestrationpackages/evidence-verifier/src/verifier.tsLoads untrusted bytes, chooses conditional checks, and fails closed across the applicable result set.Current verifier
Manifest and Merkle checkspackages/evidence-verifier/src/checks/manifest-signature.ts; packages/evidence-verifier/src/checks/merkle-inclusion.tsVerifies digest/signatures/summary consistency and artifact bytes, paths, sizes, hashes, and root.Current checks
Evidence and anchor checkspackages/evidence-verifier/src/checks/receipt-signatures.ts; packages/evidence-verifier/src/checks/ledger-hash-chain.ts; packages/evidence-verifier/src/checks/ots-anchor.ts; packages/evidence-verifier/src/checks/pii-absence.tsVerifies conditional receipt and ledger evidence plus OTS and opt-in marker scans.Current checks

Deliberate abstractions

  • The downloadable schema validates manifest.json. The separate bundle.json summary is described in the same schema under $defs.bundleJson and is compared by the production verifier.
  • The synthetic examples contain manifest metadata and artifact digests. They do not include artifact bytes, JWS signatures, JWKS, OTS proof bytes, or ledger-anchor files.
  • The reference verifier computes the normalized manifest digest and accepts an optional detached ES256 signature. packages/evidence-verifier remains the production verifier for the full on-disk bundle.
  • The page describes conditional receipt-signatures and ledger-hash-chain behavior. A standalone missing-signature or unsupported-version integrity example remains deferred by the founder decision.
  • The manifest carries tenant and export identifiers. Bundle verification compares those identifiers; authorization, tenant isolation at request time, and legal retention decisions remain the responsibility of their owning services and policies.
  • The pii-absence check requires caller-supplied markers. The default verification result makes no universal PII absence claim.

Implementation source

The links above point to the current repository contract, exporter, and verifier. The documentation-layer reference helper lives at /ai-agent-evidence-bundle-manifest/v1/verify.ts; the production procedure remains the package verifier.

Open the production verifier source

07

Questions readers ask

The implementation boundary stays visible in the answers below.

What is the difference between bundle.json and manifest.json?

bundle.json is the short seal summary. manifest.json is the full export manifest with artifact entries, record links, scope metadata, and integrity anchors. The verifier compares their shared identifiers, digest, Merkle root, and artifact count.

When are receipt-signatures and ledger-hash-chain required?

The verifier requires them when the evidence factory requests execution-evidence or raw-evidence, when the requested-artifacts field is missing, or when evidence files or evidence-loading errors are present. A bundle without those signals receives explicit not-required results for the two checks.

Does a valid manifest prove that every tenant access decision was authorized?

The manifest binds the export to its declared tenant and record references. Authorization and tenant-isolation decisions are evaluated by the services that create and expose the records. The bundle verifier checks the sealed bundle’s internal consistency and integrity.

What does the tampered example demonstrate?

It changes one artifact sha256 while keeping the original Merkle root and manifest digest. The manifest remains structurally valid, while digest comparison fails. A full on-disk verification also compares the changed declaration with the artifact bytes and Merkle root.

Does the verifier contact OpenTimestamps or a ledger?

The offline checks parse the local timestamp and ledger-anchor files. The OTS check can recognize pending or Bitcoin-attested proof structures. Network confirmation belongs to a separate operational procedure.

Related references

Follow one governed action through its records.

Start with the action request, policy decision, approval, and audit event schemas. Then inspect the complete execution record and evidence-room sample.

Open the execution record
AI agent evidence bundle manifest schema