Canonical serialization
The canonical form is JCS (RFC 8785), tagged in every envelope so it stays versionable:grep beats compactness here.
Canonicalization erases the order a mapping was built in, which is what makes block_id a function of
the content and nothing else:
Values a payload refuses
JCS defines float serialization through ECMAScript rules that are hard to reproduce identically across languages, and integers outside the IEEE-754 safe range lose precision in any double-backed JSON parser. Either divergence would mean two conforming clients computing differentblock_id values for the same
knowledge — which is the one failure the protocol cannot tolerate.
If you need a number with a fraction, store it as a string or as a scaled integer and say which in the
payload.
Three levels of hashes are three types
None is astr, and none is interchangeable with another.
OciDigest says the bytes
differ, the MerkleRoot says the knowledge does not.