ata-validator
1.61.3 · 29 Oct 2026MIT21.8k / weekRepositoryHomepagenpmAtom feed
1.61.3 is the newest release of 1.x.
Release note
A differential that holds the compiled engine and the interpreted one to the same answer, and the four disagreements it found on its first run.
The official suite does not catch this class: both engines already pass it whole, so a document the suite never asks about can split them silently. Every disagreement found so far lived in that gap, and each was found by hand while doing something else. The new test walks it on purpose, crossing values JSON cannot carry with the options, the older dialect spellings and the formats, and runs the corpus twice, once with code generation blocked, comparing the two streams. 5,833 cases.
What it found:
multipleOf had four implementations and three readings. The tier-0 validator that answers a fresh instance's first calls tested an exact remainder, so 1 was not a multiple of 0.1. The generated code and the closure path used a tolerance around the remainder, which called -1 not a multiple of 0.1 because -1 % 0.1 is -0.09999999999999995. All of them now divide and ask whether the quotient is whole, which is what the interpreter always did.
A numeric keyword with no type beside it rejected a non-finite number on some paths and not others, so { minimum: 3 } turned away a value {} accepts. A non-finite number carries no type here, so the numeric keywords no longer apply to it anywhere.
The closure path carried its own idea of an email and knew five formats in all. It is the path a fresh validator's first call can land on, so a schema reaching it was told valid for documents every other path rejected. It now calls the same functions as the rest.