The famous YAML gotcha is NO becoming false. The expensive one is quieter. js-yaml changed integer resolution between major version 3 and major version 4, and neither version tells you.
Bumping that one dependency silently changed mode: 0644 from 420 to 644, changed 012 from 10 to 12, and flipped 0o644 from the string "0o644" to the number 420. Every other scalar in the file resolved identically, so nothing else in the diff hinted at it. Neither version raised an error.
The inverse direction hurts just as much: a file written for the newer rules, read by the older ones, turns 0o644 back into a plain string, and a chmod call gets a string where it expected an int.
Also worth knowing before you read the table below: "we moved to YAML 1.2" is not a safe summary. Measured, no widely used parser sits cleanly on either side of the 1.1 / 1.2 line. js-yaml 4 still resolves binary literals and still returns Date objects for bare dates, neither of which is YAML 1.2 core. PyYAML resolves on and yes as booleans but leaves y and n as strings, so it is not YAML 1.1 either. That is why this tool shows five named columns and not two.
Every cell below was produced by running the real parsers on 2026-08-21: PyYAML 6.0.3, js-yaml 3.15.1, js-yaml 4.3.1, and eemeli/yaml 2.9.0 at version: '1.1' and version: '1.2'. Rows where all five agree are dimmed; in the rest, only the cells that disagree with the majority are marked. The table scrolls sideways.
1e3 is the one row where Python stands alone. It is the string "1e3" under PyYAML and the number 1000 under all four JavaScript resolvers. PyYAML's float pattern requires a decimal point, and requires any exponent to carry an explicit sign, so 1e3, 1e+3, 1.e3 and 1.0e3 all stay strings while 1.0e+3 resolves to 1000.0. A timeout: 1e3 is a number in Node and text in Python.8:00 is 480 and 22:30 is 1350 and 1:2:3 is 3723 under PyYAML, js-yaml 3 and YAML 1.1. All three are plain strings under js-yaml 4 and YAML 1.2. This is base-60 integer resolution, a completely separate rule from the leading-zero octal rule, and it fires on values that look like clock times.00:00 and 60:00 disagree in opposite directions. 00:00 resolves to the number 0 under YAML 1.1 only, because eemeli/yaml's base-60 pattern allows a leading zero while PyYAML's and js-yaml 3's require a leading 1 through 9. Meanwhile 60:00, which is not a valid clock time at all, coerces to 3600 under three of the five.y and n. eemeli/yaml at 1.1 honours that. PyYAML does not: its bool pattern covers yes, no, on, off and their case variants but not the single letters, so y stays a string there. Both js-yaml majors resolve only true and false.1.0 is a Python float under PyYAML and a JavaScript number holding the integer 1 everywhere else, because JavaScript has no separate integer type. Nothing changes numerically, but a round trip through js-yaml will re-emit it as 1.There is no YAML library on this page. Two layers do the work.
on: is resolved by the same rules. It skips comments, single- and double-quoted scalars, block scalar bodies under | and >, aliases, and any value carrying an explicit tag. A quoted "0644" is unambiguous and is never flagged. It is a scanner, not a full parser: it does not build a document tree and it will not catch every exotic construction.yaml/resolver.py and the constructors from yaml/constructor.py. The js-yaml columns use the character-scanning integer resolvers and float patterns from lib/type/int.js and float.js in each major version, plus the shared timestamp type. The YAML 1.1 and 1.2 columns use eemeli/yaml's tag lists in schema order. The self-check above runs those ports against the measured table and reports the score.1.0 where JavaScript prints 1 is not a finding.