- #[derive(Hash, Eq)] on ReadPlan, FieldPlan, CompositePlan, ReadKind,
DiscriminatorPlan (schema: Arc<Value> hashes via serde_json Value
Hash + Eq under preserve_order), and on OffsetMap (+ Clone;
LeafMeta/OffsetEntry/ByteRange payload already Hash from phase 5 /
this phase).
- fingerprint() -> u64 on both via std DefaultHasher (deferred
decision 3 resolved: no new dep, not hot, cross-version stability a
non-goal per ADR-012).
- Contract tests both sides: equal schemas -> equal PartialEq +
fingerprint; field-kind / field-order / endianness changes each
break equality and fingerprint; different root names over the same
document fingerprint differently (ReadPlan).
- ValidationPlan already carries its own Hash/Eq/fingerprint +
contract test (phase 7 landed early).
Verification: 474 tests pass (9 new fingerprint contract tests);
clippy -D warnings clean; cargo doc zero warnings; wasm32 release
build green.