19 KiB
VAULTMESH-PROOFBUNDLE-SPEC
Version 1.1.0 – ProofBundle Data Model & Verification Semantics
1. Introduction
This document specifies the structure and verification semantics of the VaultMesh ProofBundle.
A ProofBundle is a self-contained evidence artifact intended for regulators, auditors, and relying parties. It packages:
- A document-specific event chain (e.g. skill validations → document download),
- Cryptographic identities (DIDs) for human and system actors,
- Sealed ledger state (Guardian anchor and scroll roots),
- Placeholder references for external ProofChain anchors (e.g. BTC/ETH/OTS).
A ProofBundle is designed to be verifiable offline, using only the bundle JSON and an open-source verifier.
2. Terminology
The following terms are used in the RFC sense:
- MUST / MUST NOT – absolute requirement.
- SHOULD / SHOULD NOT – strong recommendation; valid reasons may exist to deviate, but they must be understood.
- MAY – optional behavior.
Additional terms:
| Term | Definition |
|---|---|
| Receipt | A canonical JSON object representing a single ledger event (e.g. document_download, skill_validation), including at minimum a root_hash. |
| Scroll | An append-only JSONL file containing receipts of a given class (e.g. Automation, Guardian, Identity). |
| Guardian Anchor | A special receipt that commits to the current state of all scrolls via BLAKE3 roots, written to the Guardian scroll. |
| DID | Decentralized Identifier in the VaultMesh namespace, e.g. did:vm:human:karol, did:vm:portal:shield, did:vm:guardian:local. |
| ProofChain | Optional external anchoring backends (e.g. Bitcoin, Ethereum, OpenTimestamps) referenced by the bundle. |
3. Data Model
3.1 Top-Level Structure
A ProofBundle MUST be a single JSON object with the following top-level fields:
{
"bundle_id": "pb-20251206T174406-dl-20251206T165831-2ebdac",
"schema_version": "1.1.0",
"generated_at": "2025-12-06T17:44:06.123Z",
"document": { ... },
"actor": { ... },
"portal": { ... },
"chain": { ... },
"guardian_anchor": { ... },
"proofchain": { ... },
"meta": { ... }
}
3.1.1 bundle_id
- Type: string
- Semantics: Globally unique identifier for the bundle instance.
- Format: Implementation-defined; SHOULD include the download ID and timestamp.
3.1.2 schema_version
- Type: string
- Semantics: Version of this specification the bundle adheres to.
- This document describes version 1.1.0.
Verifiers:
- MUST reject unknown major versions.
- SHOULD attempt best-effort parsing of minor version bumps (e.g. 1.2.x), ignoring unknown fields.
3.1.3 generated_at
- Type: string (ISO 8601 with UTC Z).
- Semantics: Time at which the ProofBundle was generated by the portal.
3.2 Document Section
"document": {
"doc_id": "001 Conformity Declaration",
"filename": "VM-AI-CON-001_Conformity_Declaration.docx",
"category": "AI Governance"
}
| Field | Type | Required | Description |
|---|---|---|---|
doc_id |
string | REQUIRED | Human-readable identifier used in the portal and receipts. |
filename |
string | REQUIRED | The file name of the underlying document. |
category |
string | OPTIONAL | High-level classification (e.g. "AI Governance", "Data Protection"). |
path |
string | OPTIONAL | Full path in repository. |
3.3 Actor & Portal Sections
"actor": {
"did": "did:vm:human:karol",
"display_name": "Karol S",
"role": "auditor"
},
"portal": {
"did": "did:vm:portal:shield",
"instance": "shield.story-ule.ts.net",
"description": "VaultMesh Auditor Portal – Shield node"
}
| Field | Type | Required | Description |
|---|---|---|---|
actor.did |
string | REQUIRED | DID of the human or agent initiating the document download. |
actor.display_name |
string | OPTIONAL | Human-readable name; MAY be "Unknown Auditor" when not resolved. |
actor.role |
string | OPTIONAL | Role or function (e.g. "auditor", "DPO", "regulator"). |
portal.did |
string | REQUIRED | DID of the portal instance. |
portal.instance |
string | OPTIONAL | Hostname or logical instance ID. |
3.3.1 Actor Identity Semantics
The actor.did field is the normative identity anchor for the human or agent
responsible for the documented action. It MUST be a valid VaultMesh DID (e.g.
did:vm:human:karol), resolvable in the VaultMesh Identity scroll.
The actor.display_name field is non-normative convenience metadata. It is
resolved from the Identity scroll and/or local configuration (e.g. environment
variables) at bundle generation time. Implementations:
- MUST treat
actor.didas the authoritative identity reference. - MUST NOT rely on
actor.display_namefor any cryptographic or access control decisions. - MAY omit or localize
actor.display_namewithout affecting ProofBundle validity.
3.4 Chain Section
"chain": {
"ok": true,
"length": 7,
"start": { /* receipt summary */ },
"end": { /* receipt summary */ },
"receipts": [ /* full receipts */ ]
}
3.4.1 ok
- Type: boolean
- Semantics: Declarative statement by the generator that the chain is believed to be cryptographically valid at generation time.
- Verifiers MUST NOT rely on this field alone and MUST recompute chain validity.
3.4.2 length
- Type: integer
- Semantics: Number of receipts represented in
receipts. - Verifiers SHOULD check that
lengthequalsreceipts.length.
3.4.3 start and end
- Type: object
- Semantics: Human-oriented summaries of the first and last receipts in the chain.
"start": {
"type": "skill_validation",
"timestamp": "2025-12-06T14:47:14.000Z",
"root_hash": "blake3:de01c8b3..."
},
"end": {
"type": "document_download",
"timestamp": "2025-12-06T16:58:31.826Z",
"root_hash": "blake3:bb379364..."
}
Verifiers MAY recompute these summaries from receipts and SHOULD treat any inconsistency as an error.
3.4.4 receipts
- Type: array of objects
- Semantics: Full chain of receipts from genesis (index 0) to the document download receipt (last index).
Each receipt object:
{
"type": "document_download",
"timestamp": "2025-12-06T16:58:31.826Z",
"root_hash": "blake3:bb379364566df7179a982d632267b492...",
"previous_hash": "blake3:de01c8b34e9d0453484d73048be11dd5...",
"actor_did": "did:vm:human:karol",
"portal_did": "did:vm:portal:shield"
}
Minimum required fields per receipt:
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | REQUIRED | Event type (e.g. skill_validation, document_download). |
timestamp |
string | REQUIRED | ISO 8601 with UTC Z. |
root_hash |
string | REQUIRED | BLAKE3 digest of the canonical JSON form of the receipt. |
previous_hash |
string|null | REQUIRED | BLAKE3 hash of the previous receipt; MUST be present for all receipts except the first. |
Additional fields (e.g. actor_did, portal_did, session_id, ip_hash, user_agent_hash) are RECOMMENDED.
3.5 Guardian Anchor Section
"guardian_anchor": {
"anchor_id": "anchor-20251206155628",
"anchor_by": "did:vm:guardian:local",
"anchor_epoch": 1765039262,
"anchor_timestamp": "2025-12-06T15:56:28Z",
"root_hash": "blake3:1af3b9a4...",
"scroll_roots": {
"automation": { "root_hash": "blake3:aa12bb34...", "entries": 11, "has_root": true },
"guardian": { "root_hash": "blake3:cc56dd78...", "entries": 5, "has_root": true },
"identity": { "root_hash": "blake3:ee90ff12...", "entries": 4, "has_root": true }
}
}
| Field | Type | Required | Description |
|---|---|---|---|
anchor_id |
string | REQUIRED | Identifier of the Guardian anchor receipt. |
anchor_by |
string | REQUIRED | DID of the Guardian engine. |
anchor_epoch |
integer | OPTIONAL | Epoch seconds at anchor time. |
anchor_timestamp |
string | REQUIRED | ISO 8601 timestamp of the anchor. |
root_hash |
string|null | OPTIONAL | Global root hash (reserved for future use). |
scroll_roots |
object | REQUIRED | Map from scroll name to its root hash as committed in the anchor. |
3.6 ProofChain Section
"proofchain": {
"btc": { "status": "not_anchored", "txid": null },
"eth": { "status": "not_anchored", "txid": null },
"ots": { "status": "not_anchored", "timestamp_url": null }
}
For each backend (btc, eth, ots):
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | REQUIRED | One of: "not_anchored", "pending", "anchored" |
txid / timestamp_url |
string|null | OPTIONAL | Backend-specific reference when anchored. |
Verifiers:
- MAY ignore this section when performing purely local verification.
- SHOULD treat unknown statuses conservatively.
3.7 Meta Section
"meta": {
"requested_by_session": "6pngxxbMxLYQf180qPmIeq-xkJ8nDBN3",
"requested_by_user": "karol@vaultmesh.earth",
"node": "shield"
}
| Field | Type | Required | Description |
|---|---|---|---|
requested_by_session |
string | OPTIONAL | Portal session that requested the bundle. |
requested_by_user |
string | OPTIONAL | Account identifier in the portal. |
node |
string | OPTIONAL | Node name. |
4. Cryptographic Properties
4.1 Hash Function
VaultMesh uses BLAKE3 as the hash function for all root_hash and previous_hash values.
- Digest encoding: hex string, prefixed with
"blake3:", e.g.blake3:1af3b9a4... - Implementations MUST preserve the prefix and encoding when serializing.
4.2 Receipt Hashing
For each receipt R in chain.receipts:
-
Serialize R to canonical JSON:
- UTF-8 encoding
- Sorted keys
- No insignificant whitespace:
separators=(",", ":")
-
Compute
H = BLAKE3(R_canonical) -
Set
root_hash = "blake3:" + hex(H)
encoded = json.dumps(
receipt_without_root_hash,
sort_keys=True,
separators=(",", ":"),
ensure_ascii=False
).encode("utf-8")
root_hash = f"blake3:{blake3.blake3(encoded).hexdigest()}"
The verifier MUST recompute root_hash from the canonical JSON and compare it to the stored root_hash. Any mismatch indicates tampering.
4.3 Hash-Chain Semantics
Given receipts R[0] ... R[n-1]:
- For
i = 0:R[0].previous_hashMAY benullor absent. - For
i > 0:R[i].previous_hashMUST equalR[i-1].root_hash.
A verifier MUST treat any violation as chain breakage.
5. Threat Model & Non-Goals
5.1 Threat Model
ProofBundle is designed to protect against:
| Threat | Mitigation |
|---|---|
| Post-hoc modification of receipts | Hash verification detects tampering |
| Removal or insertion of receipts | Chain linkage breaks |
| Misrepresentation of chain integrity | Verifier recomputes and compares to chain.ok |
| Partial disclosure attempts | Chain must be complete from genesis to download |
| Actor impersonation | DID attribution, not mutable username |
5.2 Non-Goals
ProofBundle explicitly does not guarantee:
- Document content correctness – The bundle proves access, not that the document is semantically correct or policy-compliant.
- Real-world identity verification – DIDs are cryptographic; KYC depends on external identity processes.
- Protection against malicious genesis – If an adversary controls the VaultMesh node before receipts are created, the bundle cannot detect this.
- IP/user-agent confidentiality – BLAKE3 hashes may be reversible via brute-force if input space is small.
Regulators SHOULD combine ProofBundle verification with organizational and process audits.
6. Example Bundle
6.1 Minimal Example
{
"bundle_id": "pb-20251206T174406-dl-20251206T165831-2ebdac",
"schema_version": "1.1.0",
"generated_at": "2025-12-06T17:44:06.123Z",
"document": {
"doc_id": "001 Conformity Declaration",
"filename": "VM-AI-CON-001_Conformity_Declaration.docx",
"category": "AI Governance"
},
"actor": {
"did": "did:vm:human:karol",
"display_name": "Karol S",
"role": "auditor"
},
"portal": {
"did": "did:vm:portal:shield",
"instance": "shield"
},
"chain": {
"ok": true,
"length": 3,
"start": {
"type": "skill_validation",
"timestamp": "2025-12-06T14:47:14.000Z",
"root_hash": "blake3:de01c8b34e9d0453..."
},
"end": {
"type": "document_download",
"timestamp": "2025-12-06T16:58:31.826Z",
"root_hash": "blake3:bb379364566df717..."
},
"receipts": [
{
"type": "skill_validation",
"timestamp": "2025-12-06T14:47:14.000Z",
"root_hash": "blake3:de01c8b34e9d0453...",
"previous_hash": null
},
{
"type": "skill_validation",
"timestamp": "2025-12-06T15:10:02.000Z",
"root_hash": "blake3:4e7cf7352e25a150...",
"previous_hash": "blake3:de01c8b34e9d0453..."
},
{
"type": "document_download",
"timestamp": "2025-12-06T16:58:31.826Z",
"root_hash": "blake3:bb379364566df717...",
"previous_hash": "blake3:4e7cf7352e25a150...",
"actor_did": "did:vm:human:karol",
"portal_did": "did:vm:portal:shield"
}
]
},
"guardian_anchor": {
"anchor_id": "anchor-20251206155628",
"anchor_by": "did:vm:guardian:local",
"anchor_timestamp": "2025-12-06T15:56:28Z",
"root_hash": null,
"scroll_roots": {
"automation": { "root_hash": "blake3:b165f779...", "entries": 11, "has_root": true }
}
},
"proofchain": {
"btc": { "status": "not_anchored", "txid": null },
"eth": { "status": "not_anchored", "txid": null },
"ots": { "status": "not_anchored", "timestamp_url": null }
}
}
6.2 Expected Verifier Output
ProofBundle: pb-20251206T174406-dl-20251206T165831-2ebdac
Document : 001 Conformity Declaration
File : VM-AI-CON-001_Conformity_Declaration.docx
Actor : did:vm:human:karol (Karol S)
Portal : did:vm:portal:shield (shield)
Receipts : 3
Hash check : OK
Chain linkage : OK
Bundle chain.ok: True (matches computed: True)
Result: OK – chain of 3 receipts is contiguous and valid.
7. Compliance Crosswalk – AI Act Annex IX
This section provides a non-exhaustive mapping between AI Act Annex IX documentation expectations and ProofBundle fields.
| Annex IX Requirement | ProofBundle Support |
|---|---|
| Record-keeping of events and logs | chain.receipts[] (types, timestamps, DIDs) |
| Traceability of changes and operations | Hash-chain via root_hash and previous_hash |
| Identification of persons and systems involved | actor.did, actor.display_name, portal.did |
| Identification of system components | guardian_anchor.anchor_by, portal.instance |
| Technical documentation of integrity safeguards | Cryptographic model in this SPEC; BLAKE3 usage |
| Evidence of access to technical documentation | document_download receipts bound to specific doc IDs |
| Tamper-evidence of documentation and logs | BLAKE3 per receipt + chained previous_hash |
| Ability to provide evidence to market surveillance authorities | ProofBundle JSON + offline verifier |
Regulators MAY reference a valid ProofBundle, together with this specification, as part of the technical documentation demonstrating logging, traceability, and integrity controls.
8. HTML Viewer
The portal exposes an HTML view at:
/docs/proofbundle/:downloadId
This view:
- Renders the ProofBundle contents in a human-friendly layout
- Provides a Print button (browser print → PDF) for filing
- Displays verification note:
"This ProofBundle can be independently verified with the open-source
vm_verify_proofbundle.pytool. No access to VaultMesh servers is required."
9. Verifier Exit Codes
| Code | Meaning |
|---|---|
| 0 | Verification passed |
| 1 | Verification failed (chain or hashes) |
| 2 | Usage error or file not found |
10. Conformance Tests
This section defines non-normative but strongly RECOMMENDED test vectors for implementers of ProofBundle verifiers.
10.1 Test Vector Location
Official VaultMesh test vectors are distributed under:
testvectors/proofbundle/
with the following files:
proofbundle-valid.jsonproofbundle-tampered-body.jsonproofbundle-tampered-root.jsonproofbundle-broken-chain.json
10.2 Expected Behaviour
Implementations of vm_verify_proofbundle (or equivalent) SHOULD pass the
following conformance checks:
| Input file | Expected Exit | Expected Behaviour |
|---|---|---|
proofbundle-valid.json |
0 | Chain verification succeeds; no errors reported. |
proofbundle-tampered-body.json |
1 | Receipt hash mismatch is detected. |
proofbundle-tampered-root.json |
1 | Receipt hash mismatch is detected. |
proofbundle-broken-chain.json |
1 | Broken previous_hash linkage is detected. |
Implementations MAY emit different human-readable error messages, but MUST distinguish success from failure via exit codes or equivalent programmatic signals.
10.3 Schema Version Handling
Verifiers MUST check the schema_version field of a ProofBundle against a
known set of supported versions. If an unsupported schema version is
encountered, verifiers:
- MUST NOT attempt partial verification, and
- MUST return a non-zero exit code (e.g.
2) indicatingUNSUPPORTED_SCHEMA_VERSION, and - SHOULD direct implementers to the Standards Index
(
VAULTMESH-STANDARDS-INDEX.md) for the current version matrix.
11. Versioning & Extensibility
- This document defines
schema_version = "1.1.0". - Producers MUST include a
schema_versionstring. - Verifiers MUST:
- Reject unknown major versions (e.g. 2.x.x) by default.
- Tolerate additional fields for minor versions (e.g. 1.2.x) as long as required fields are present and valid.
Future extensions (e.g. richer ProofChain data, additional actor attributes) MAY be added under new fields, provided they do not alter the semantics defined in this version.
12. Appendix: Citation
This assessment relies on VaultMesh ProofBundle, specified in "VAULTMESH-PROOFBUNDLE-SPEC v1.1.0".
Verification was performed using the reference tool
vm_verify_proofbundle.py v1.1.0 and validated against the
VaultMesh ProofBundle Conformance Test Pack v1.0.
Implementations claiming interoperability MUST demonstrate conformance against all official test vectors before asserting support for this specification.
The tag proofbundle-v1.1.0 in the VaultMesh repository marks
the reference implementation state for this version.
13. References
- RFC 2119 – Key words for requirement levels
- BLAKE3 – Cryptographic hash function
- DID Core – Decentralized Identifiers
- EU AI Act – Regulation 2024/1689
- ISO/IEC 42001:2023 – AI Management System
VaultMesh ProofBundle Specification v1.1.0 Sovereign Infrastructure for the Digital Age