VER 1.0.1
A corrective release over the 1.0.0 artifact set: three schema constraints, five example edits, and the normative errata annex.
Artifacts
| File | Size | sha-256 |
|---|---|---|
| VER-1.0.1-errata-annex.md | 111.9 KiB | 09834533f1b34f25532f047fc76ae24f24da6d7faaa7a90da985f93043c7a20a |
| example-record.json | 6.7 KiB | d4d5a64e65acfc1c1ccaaa23e291b3e880da6cbb32d6c9ef89d32185877f0b7f |
| ver-record.schema.json | 13.2 KiB | 44166d59f31e8bb898e0a3bf4c5863c154e273a97d1bc6bfee61d141e949d34a |
Status: PUBLISHED. Artifact release 1.0.1 of the VER 1.0 standard. Released 23 August 2026. Supersedes nothing: it corrects, and 1.0.0 stays frozen and retrievable at standards/ver/1.0.0/.
What this release is
1.0.1 is a patch over the published artifact set — specification text, schema, and example — not a new record format. Records remain "ver_version": "1.0" and "cpnp_version": "1.0". A consumer written against 1.0.0 parses every 1.0.1 record without change.
The specification document is never edited in place. Corrections ship as VER-1.0.1-errata-annex.md, which is normative and governs where it and the 1.0.0 text disagree.
| File | Role | SHA-256 |
|---|---|---|
VER-1.0.1-errata-annex.md | Normative corrections and clarifications (E1–E29 + editorial notes N1–N6) | 09834533f1b34f25532f047fc76ae24f24da6d7faaa7a90da985f93043c7a20a |
ver-record.schema.json | JSON Schema 2020-12, $id https://verstandard.org/schemas/ver-record-1.0.1.json | 44166d59f31e8bb898e0a3bf4c5863c154e273a97d1bc6bfee61d141e949d34a |
example-record.json | Corrected golden example | d4d5a64e65acfc1c1ccaaa23e291b3e880da6cbb32d6c9ef89d32185877f0b7f |
Reproduce the digests from the repository root:
The 1.0.0 specification document (VER-1.0-Specification.docx) is not copied into this directory. There is exactly one published copy of it, at standards/ver/1.0.0/VER-1.0-Specification.docx, and this release annotates it rather than reissuing it.
Delta from 1.0.0
Schema — three constraint changes, plus $id, title, and one added sentence in description:
- Perceptual digest length is bound to the algorithm (
pdq/1.0⇒ 64 hex,phash-dct/64⇒ 16 hex) viaif/then. Thealgenum is unchanged. identity.pixel_hashgains"additionalProperties": false.identity.content_hashbecomes{"allOf": [{"$ref": "#/$defs/sha256Hash"}], "unevaluatedProperties": false}.
$defs/sha256Hash is deliberately left open — closing it would break the pixel_hash allOf branch — so closure is applied at each use site instead.
Example — five corrections:
| # | Pointer | Change |
|---|---|---|
| a | /identity/perceptual/0/value | the PDQ digest is truncated to its intended 64 hex characters (the published 96-hex value was the digest with its own first 32 characters appended) |
| b | /metadata/raw/0/sha256 | becomes the actual SHA-256 of the segment's own bytes |
| c | /metadata/normalized/@context | becomes an inline context object that defines the dc: prefix the document uses |
| d | /provenance/chain | gains a second embed event, so the custody log accounts for both embeddings |
| e | /metadata/raw/0/bytes | the elided 30-octet ICC fragment is replaced by a real, complete 602-octet JPEG APP2 ICC payload |
Edit (e) is new in this revision of the release and is the one that changes the example's conformance story. The 1.0.0 payload was an elision: 30 octets of a profile whose own header declared 3144, carrying no ICC_PROFILE\0 identifier prefix. That made the example non-conformant at its own declared conformance_level of L3, against annex item E11 (a preserved JPEG APP payload includes the identifier prefix and the sequence octets) and against E26 (no elided segment in a Record claiming L1 or above). The example now carries ICC_PROFILE\0 + the sequence octets 01 01 + a complete 588-octet sRGB ICC profile, and /metadata/raw/0/sha256 is the SHA-256 of exactly those 602 octets. The profile parses: its header's size field reads 588, its signature at offset 36 is acsp, and lcms re-opens it as an sRGB monitor profile. §2.2 of the annex carries the generation recipe and the reproduction command.
Rationale, defect analysis, and the finding identifiers behind each change are in §2 of the errata annex.
Compatibility
Schema direction.
- A 1.0.0-valid record fails the 1.0.1 schema only if it carries a perceptual digest of the wrong length for its algorithm, or an undeclared member inside
identity.content_hashoridentity.pixel_hash. All three already violated normative 1.0.0 prose, so no conformant record is invalidated. The frozen 1.0.0 example is itself such an instance: it fails the 1.0.1 schema on exactly one pointer,/identity/perceptual/0/value. - The 1.0.1 example validates under both schemas. The golden example must never be the artifact that forces a consumer upgrade.
- No 1.0.1-valid record fails the 1.0.0 schema. Every schema change is a tightening.
Identity tier. CPNP-1's algorithm is unchanged and cpnp_version stays "1.0". But five annex items — E3, E6, E7, E8 and E9 — each resolve an ambiguity where two defensible readings of the 1.0.0 prose produced different Canonical Buffers for the same Asset, and resolving an ambiguity necessarily selects one reading. Records produced under a non-selected reading were never interoperable and are non-conformant under this annex; their pixel_hash values are withdrawn, not recomputed, because the two values were never values of the same function. No record produced under a selected reading changes. E8 additionally withdraws canonical identity entirely for an Asset carrying a present-but-unusable ICC profile. Annex §1 property 2 and §5.1's item index state this per item; COMPATIBILITY.md carries the row-by-row impact.
One relaxation. 1.0.1 is otherwise a tightening-or-disambiguation release, with a single deliberate exception recorded in annex item E15: §7.1's L1+ byte-exact-preservation MUST is made subordinate to §7.5 redaction. A redacting Producer that omits a sensitive segment from raw[] is conformant under 1.0.1 and was not conformant under a literal reading of 1.0.0 §7.1. This is the one direction in which 1.0.1 relaxes 1.0.0. Nothing becomes structurally invalid — the schema is unchanged in this area — but a consumer applying 1.0.0 §7.1 literally may judge such a record non-conformant. In-segment scrubbing is not an alternative remedy: a raw[] entry has no member that distinguishes acquired evidence from a producer-edited derivative, so a scrubbed segment would masquerade as byte-exact acquisition evidence. Scrubbed-segment carriage with an explicit marker is 1.1 ratification material.
Verification
Everything below runs from the repository root with the repository virtualenv and no installation step.
Schema validation
Expected: 0, 0, and exactly one error at /identity/perceptual/0/value.
Conformance profile validation
Expected: ok, zero errors, and the single VER308 warning — an L3 record SHOULD carry provenance.signature, and this one does not, because a signature over illustrative data would itself be illustrative (annex E26).
If your environment's virtualenv has pip, pip install -e packages/ver-validator also puts a ver-validate console script on the path, and ver-validate standards/ver/1.0.1/example-record.json is then equivalent. That is the alternative, not the default: this repository's .venv has no pip, and the PYTHONPATH invocation above needs none.
A note on format
A stock jsonschema FormatChecker asserts uuid but not date-time or uri unless the optional rfc3339-validator and rfc3986-validator packages are installed. Errata item E23 requires a conformance validator to assert both, along with contentEncoding; the conformance profile validator in packages/ver-validator/ does so (VER202) and is the artifact that checks them.
Open decisions
One item in this release is unresolved and is tracked as an ADR rather than decided by fiat: whether metadata.redactions[].salted_sha256 is REQUIRED (ADR-0006, errata item E15). Both schemas leave it optional; the profile validator warns (VER1002).
Related artifacts
| Path | Contents |
|---|---|
standards/ver/1.0.0/ | The frozen 1.0.0 artifact set — never modified |
standards/ver/1.1-draft/ | The additive 1.1 draft — unratified |
docs/standards/VER-1.0-errata.md | The full errata ledger, all findings and dispositions |
docs/standards/VER-migration-guide.md | Producer and consumer guidance, 1.0.0 → 1.0.1 |
VERSIONING.md, COMPATIBILITY.md | Release policy and the change-by-change compatibility matrix |
