| Phantom diff on 1.0 vs 1.00 | Serializers normalize trailing zeros differently | Compare parsed values, not re-serialized strings |
| Phantom diff "yes" vs yes | YAML 1.1 coerces unquoted yes to boolean; quoted stays string | Pin the parser to YAML 1.2, or quote ambiguous scalars consistently |
| Whole array marked replaced when one element changed | Sequence diff uses positional comparison | Diff array elements by an identity key (Kubernetes uses name; OpenAPI uses operationId) |
| Key reorder shown as deletion + insertion | Object key order treated as semantic | Switch the tool's comparison mode from textual to structural |
| Cross-format diff loses a YAML anchor | Anchor expanded before comparison; JSON has no anchor concept | Compare YAML-to-YAML, or accept that anchor semantics do not survive the JSON round-trip |
| Comment-only change is missed | Comments are stripped before structural comparison | Use a text-mode diff for documentation review; comments are not part of the parsed tree |
| Floating-point fields show rounding error | Parser converts 0.1 + 0.2 to 0.30000000000000004 | Round to a fixed precision before comparison, or store as string |
| Large integer fields lose precision | JavaScript JSON.parse uses Number (53-bit precision) | Use a BigInt-aware parser; Postgres BIGINT IDs over 2^53 silently corrupt in JS clients |
| Timestamp shows diff but renders identical | Different ISO 8601 forms of the same instant (2026-01-01T00:00:00Z vs 2026-01-01T00:00:00+00:00) | Parse to a canonical form (epoch milliseconds) before comparison |
| Diff flags null vs missing key | These are not equivalent: explicit null records intent, missing key records absence | Pick one convention per schema; some APIs require explicit nulls for deletion |