the single deterministic serialization of a structured object that everyone agrees to hash - necessary because hashing requires exact bytes, and the same logical object can otherwise serialize a hundred ways.
Canonicalization made falsifiable: two builds of one core, one digest, CI-gated.
Etymology and backstory
canonicalization is the tax every hash-of-structured-data system pays. XML paid it with C14N, a famously painful W3C spec; JSON pays it with schemes like JCS (RFC 8785) that pin key order, number formats, and escaping. The failure mode it prevents: two verifiers serialize the same object differently, get different digests, and integrity checking collapses into flakiness.
Ecosystem
JWS and JWT, C2PA manifests, blockchain transactions, git tree objects - every signed structured format defines its canonical form first and signs second.
In codexproof
node.rs owns canonical_bytes (line 133) and encode_json (lines 177 to 181) - the one true byte layout of a provenance node. The CI-checked claim that the Rust core produces identical content-ids natively and in WebAssembly is really a claim about canonicalization discipline: same logical node, same bytes, same cid, on every platform.