What v0.2 changed
WARD v0.2 replaces the concatenation with a canonical JSON hash body under a profile the spec now defines in full: byte-order key sorting, strict Unicode normalisation that rejects rather than repairs, bounded integers, duplicate-member rejection, and a single legal escape form for every string. JSON string escaping makes field boundaries unambiguous for every possible input, which closes the defect by construction rather than by policy.
Existing chains are append-only and can never be rehashed, so the old scheme is preserved in an appendix strictly for verifying them, and version declarations within a chain must be monotonic: once a chain has upgraded, a forged legacy entry appended later is flagged as a downgrade. Where stored data genuinely cannot distinguish something, the threat model now says so rather than rounding up.
Two other habits carried over from how we build everything else. First, every hash and signature in the spec's worked examples is real: one command regenerates all of them, and the signing key's seed is published so anyone can reproduce the signatures.
Second, the revision went through repeated rounds of adversarial review by a second, independent model, which re-derived every published hash and signature with its own tooling before we accepted the result. A second, independently written implementation of the hashing profile now produces byte-identical results to the first, which is the strongest evidence a specification can have that it says what it means.
The review also made the spec more honest in smaller ways. A Git signed tag is replication plus a signature, not immutability, and the threat model now says which property each anchoring target actually buys. A hash of predictable content can be confirmed by guessing, so content-free does not mean information-free, and the spec now says that too.