I fixed `camelToSnake`, and `npm test` now passes (`{"status":"PASS","suite":"camel-to-snake"}`).

**The bug:** the function only added an underscore before a capital letter that followed a lowercase letter or a digit. It skipped the contract's other rule: a capital that follows another capital and comes before a lowercase letter also gets one. So `XMLHttpRequest` came out as `xmlhttp_request` instead of `xml_http_request`.

**The fix:** I changed one line in `src/camel-to-snake.mjs`. The replacement now handles both rules in a single pass:

```js
return s.replace(/(?<=[a-z0-9])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])/g, '_').toLowerCase();
```

The input checks were already correct, so I left them alone. I also tried some extra cases outside the test suite and they all behave as the contract describes:
- `getHTTPResponseCode` → `get_http_response_code`
- `IOStream` → `io_stream`
- `ABC` → `abc`
- Inputs that are empty, start with a digit, or contain non-ASCII characters return `null`.

No other files were changed, and I didn't write `notes/attempt.txt`.