Case index
Every case Sniff has worked
Four guides on the bugs breakhound looks for and on running it in CI, plus the eight oracles. Filter by topic or search for a rule.
Case file G-01Guide
Time zone bugs in JavaScript datesHow mixing UTC and local getters breaks date code in other time zones, and how breakhound catches it.
Dates and time4 min read
Case file G-02Guide
Surrogate pairs and split emojiWhy slicing a JavaScript string can cut an emoji in half, how to fix it, and how breakhound finds it.
Unicode3 min read
Case file G-03Guide
Negative zero and lost minus signsHow -0 and Math.trunc drop the minus sign of values between -1 and 0, and how to catch it.
Numbers3 min read
Case file G-04Guide
Running breakhound in GitHub ActionsA workflow that fails pull requests on new bugs, with annotations, a job summary and reproducible seeds.
CI3 min read
Case 01Oracle
Split emojiA string result holds half of a surrogate pair, so an emoji is cut in two. Oracle id lone-surrogate-output.
UnicodeRecorded on truncate
Case 02Oracle
Time zone dependenceThe same call answers differently when only the host TZ changes. Oracle id timezone-dependent.
Dates and timeRecorded on yearLabel
Case 03Oracle
Crash on valid inputA value the types allow makes the engine throw a TypeError. Oracle id unexpected-crash.
InvariantsRecorded on initials
Case 04Oracle
NaN leakFinite numbers go in and NaN comes out where a number was expected. Oracle id nan-leak.
NumbersRecorded on average
Case 05Oracle
Broken roundtripA decode and encode pair does not give the input back. Oracle id roundtrip.
InvariantsRecorded on encodeBase
Case 06Oracle
Not idempotentNormalizing twice changes the result again. Oracle id not-idempotent.
InvariantsRecorded on slugify
Case 07Oracle
Lost minus signValues between -1 and 0 are printed as if they were positive. Oracle id negative-zero-sign.
NumbersRecorded on formatFixed
Case 08Oracle
NondeterminismSame call, same input, a different result from hidden state. Oracle id nondeterministic.
InvariantsRecorded on label