v3.5.3 specifies the canonical numeric domain (Section 2.3.2): signed 64-bit integers (int64, [-2^63, 2^63-1]) for integer values and IEEE-754 double for non-integer values — the largest integer domain representable losslessly in every reference language.
Earlier versions left the numeric domain implementation-defined. v3.5.3 makes it a specified, symmetric conformance property:
- A decoder parses an integer literal into an exact
int64-capable type and returns an out-of-range error outsideint64. - An encoder returns an out-of-range error for a host integer outside
int64. - Values beyond
int64(unsigned-64 identifiers, exact decimals) are modeled as strings.
Canonical number formatting (Section 2.3.1) is aligned to the domain: a double at or above 2^53 is emitted in exponent notation, so a bare-integer token is unambiguously an int64. The JavaScript-local 2^53 boundary is handled by a documented SDK largeInt policy.
The wire grammar is unchanged. This is a normative behavior change gated at the version boundary: a v3.5.3 decoder returning an out-of-range error for a payload an earlier, implementation-defined decoder accepted is correct at that boundary, not a regression.