Version 0.1.0
A Proof Pack is a portable, verifiable record that a maintenance job was completed, which surfaces were covered, and the before/after evidence that proves it.
The goal is to make a service outcome auditable by a third party (a client, a facilities manager, an insurer, or a regulator) without that party having to trust the provider's word or reconstruct the job from raw logs. A Proof Pack answers four questions in a single package:
- What job was done, where, and when?
- What was covered, and how completely?
- What did the work look like before and after?
- Has any of this been altered since it was issued?
This specification defines the package layout and the manifest format. It does not define how evidence is captured, scored, or rendered. Those are implementation concerns left to the provider.
A Proof Pack deliberately does not reinvent per-image authenticity. It operates one level up, at the package layer, and references lower-level standards where they fit:
- C2PA / Content Credentials provide cryptographic provenance for an individual
media file. A Proof Pack records whether each media file carries a C2PA manifest
(
media.c2pa) and relies on C2PA for per-asset signing where available. - Chain of custody practice informs the custody fields: the issuer, the asset, the accountable operator, and capture timestamps.
- Hash chaining (a SHA-256 chain, as used in tamper-evident audit logs) links a Proof Pack to the previous pack issued by the same issuer, so that packs cannot be silently removed or reordered after the fact.
Several open projects address pieces of the verifiable-evidence problem. A Proof Pack is designed to compose with them, not replace them. It occupies the gap none of them fill: a vendor-neutral description of a service job's outcome.
- C2PA and ProofMode secure a single media file at the point of capture. They answer "is this image authentic and unedited?" They do not describe what job the image belongs to, which surface it shows, or whether the work was completed. A Proof Pack references them per file and adds the job context around them.
- W3C Verifiable Credentials are a generic envelope for signed claims, with a
pluggable proof mechanism. A Proof Pack is domain content, not an envelope: a Proof
Pack manifest can be embedded as the
credentialSubjectof a Verifiable Credential where an issuer wants VC-based signing and presentation. - OpenTimestamps provides blockchain-backed timestamp proofs for arbitrary data. A
Proof Pack's
manifestHashcan be timestamped with OpenTimestamps to add independent proof that the pack existed at a point in time. - IFC (ISO 16739) and the Facility Data Standard model the building and its assets
for BIM and facility lifecycle data. They describe the thing being maintained, not
the evidence that a given maintenance job was carried out. A Proof Pack's
siteandsurfacescan reference identifiers from those models.
In short: existing standards authenticate a file, carry a claim, timestamp a hash, or model a building. A Proof Pack ties a job's evidence together into one checkable package and leaves those lower layers to the standards that already do them well.
A Proof Pack is a directory (which may be distributed as a single ZIP archive):
proof-pack/
manifest.json # the Proof Pack manifest, conforming to schema/proof-pack.schema.json
media/ # referenced media files
before-01.jpg
after-01.jpg
heatmap.png
manifest.json is the authoritative record. Every media file referenced by the
manifest carries a sha256 of its bytes, so a file cannot be swapped without
invalidating the manifest. Media may also be referenced by absolute URL instead of a
local path; the content hash requirement is unchanged.
The manifest is a single JSON object. The normative definition is
schema/proof-pack.schema.json (JSON Schema, draft 2020-12). The top-level fields are:
| Field | Required | Description |
|---|---|---|
specVersion |
yes | The specification version, e.g. 0.1.0. |
id |
yes | Globally unique identifier for the pack (UUID recommended). |
issuer |
yes | The organization that produced and stands behind the pack. |
job |
yes | The job: id, service type, and completion time. |
site |
yes | Where the work was performed. |
assets |
no | The robots, drones, or equipment used, and the accountable operator. |
surfaces |
no | The distinct surfaces or zones serviced, with area and material. |
coverage |
no | Planned vs covered area, coverage percentage, and an optional heatmap. |
evidence |
yes | Captured media. At least one item is required. |
integrity |
yes | Tamper-evidence for the pack as a whole. |
Each evidence item has a kind (before, after, during, defect, thermal,
wide, other). A before item and its matching after item are linked by a shared
pairId. Both items should reference the same surfaceId. This lets a consumer line
up a verifiable before/after comparison per surface rather than guessing from
filenames.
coverage quantifies the outcome. coveragePercent is the headline number; it should
be consistent with coveredAreaSqm / plannedAreaSqm when both are present. The
optional heatmap media reference points at a rendered coverage or dirt heatmap.
The integrity object makes the pack tamper-evident.
integrity.manifestHash is the hash of the canonicalized manifest with the
integrity.manifestHash and integrity.signature fields excluded from the input.
Canonicalization, for the purpose of this version, is RFC 8785 JSON Canonicalization Scheme (JCS): UTF-8, lexicographically sorted object keys, no insignificant whitespace. A verifier recomputes the hash over the canonical form and compares.
integrity.previousHash, when present, is the manifestHash of the previous Proof
Pack issued by the same issuer. A consumer holding a series of packs can confirm the
chain is intact and that no pack was dropped or reordered.
integrity.signature is an optional detached signature over manifestHash. The
signing algorithm, the public key, and an optional certificate chain are recorded so a
verifier can confirm the pack was issued by the claimed issuer. Per-image signing is
left to C2PA; this signature covers the manifest.
A document is a valid Proof Pack if all of the following hold:
- It validates against
schema/proof-pack.schema.json. - Every referenced media file is present and its bytes hash to the recorded
sha256. integrity.manifestHashmatches the recomputed hash from section 6.1.- If
integrity.signatureis present, it verifies againstmanifestHash.
This specification uses semantic versioning. Within a 0.x series, the format may
change between minor versions. specVersion in a manifest states the version it was
written against.
This specification and the accompanying schema are released under the Apache License,
Version 2.0. See LICENSE.