headerFingerprint

A digest of everything a header write owns, computed from the same map headerBindMap builds and compared verbatim against what an earlier write stored — never re-derived from a row read back afterward.

This is what lets a save tell "nothing changed" from "something changed" atomically, in the same lock-then-read a compare-and-set needs anyway: two fingerprints computed the same way from the same set of fields are equal exactly when every field they cover is, so one string compare stands in for comparing a dozen properties by hand, the way lineageKeyOf already stands in for comparing lineage's five. version and this fingerprint itself are never part of the map it digests — a resend naming a stale version has to produce the same digest as the write that landed, or a byte-identical retry could never be told apart from a genuine change.

Digested through ExtractionRunFingerprint.ofFields, the canonical codec. A serializer's output can move without the header moving with it — a different Map implementation iterating header in a different order, a library upgrade changing how it renders a number — and every one of those would read as a genuine change to a save that is really a no-op or a byte-identical retry. The canonical encoding sorts by field name and renders every value as the plain string it already is, so the digest is a function of the header's content alone.