Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Run a Node.js compatibility test, diagnose failures, and either fix the implementation, skip, or ignore the test. Use when asked to work on node compat tests.
.claude/skills/denoland-node-compat/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 6% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -44% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 33% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-11 | ✗→✓ | ▲ Improved | -39% | 0% |
Work on Node.js compatibility test $ARGUMENTS.
sh./x build ./x test-compat $ARGUMENTS
If the test passes, report success and ensure test is specified in tests/node_compat/config.jsonc.
Read the test file to understand what it tests:
sh# Tests live under tests/node_compat/test/
Use Grep and Read to find the test source, then analyze:
ext/node/ (polyfills,ops, internal bindings), runtime/, or cli/.
Read the corresponding Node.js docs and/or source code to understand the expected behavior.
Determine which category this failure falls into:
The Deno implementation is wrong or incomplete, but can be corrected. This includes:
Action: Fix the implementation (Step 4).
The test relies on Node.js internals or architecture that Deno fundamentally cannot or will not support:
internalBinding() calls to Node's C++ layer--inspect, --prof, etc.)Action: Ignore the test with a reason (Step 5).
The test exercises an edge case or behavior that is technically possible but provides negligible value:
Action: Ignore or skip the test with a reason (Step 5).
If the failure is fixable:
ext/node/ (or elsewhere).code, not just what "seems right."
./x build - this is paramount, changes won'ttake effect until you do.
sh./x test-compat $ARGUMENTS
tests/node_compat/config.jsonc with an empty config:
jsonc"category/test-name.js": {}
The entries in config.jsonc are sorted alphabetically within their category. Place the new entry in the correct position.
If the test cannot or should not be fixed, update tests/node_compat/config.jsonc.
jsonc"category/test-name.js": { "ignore": true, "reason": "Brief, specific explanation of why this can't work in Deno" }
"reason" must be specified otherwise the lint step will fail!
If the test only fails on certain platforms:
jsonc"category/test-name.js": { "windows": false }
If you want the test to run but expect a specific failure:
jsonc"category/test-name.js": { "exitCode": 1, "output": "[WILDCARD]specific error message[WILDCARD]", "reason": "Brief explanation of why this fails" }
This is a good middle ground for tests that are generally compatible but have a specific known issue. If a fix is ever done this assertion will notify the implementer to update the config.
Reasons should be specific and actionable. Good examples:
not implemented in Deno"
deno --interactive flag (not yet implemented)"arguments"
Bad examples:
Re-run the test one final time to confirm the outcome matches expectations:
sh./x test-compat $ARGUMENTS
The full schema for config.jsonc entries is in tests/node_compat/schema.json.
When opening a PR for node-compat work, use the appropriate prefix:
test: — when the PR only updates tests/node_compat/config.jsonc to skip,ignore, or otherwise reclassify tests without changing implementation code.
fix(ext/node): — when the PR actually fixes the implementation so apreviously failing test now passes (typically changes under ext/node/ plus enabling the test in config.jsonc).
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 6,105 | 6,174 | +1% | 1 | 1 | 0% | 146 | 1,475 | +910% | 0 | 0 | — |
case-02 | fail→fail | 5,777 | 5,601 | -3% | 1 | 1 | 0% | 169 | 1,590 | +841% | 0 | 0 | — |
case-03 | fail→fail | 5,235 | 6,550 | +25% | 1 | 1 | 0% | 156 | 1,494 | +858% | 0 | 0 | — |
case-04 | pass→pass | 9,009 | 5,183 | -42% | 1 | 1 | 0% | 1,497 | 2,024 | +35% | 0 | 0 | — |
case-05 | pass→pass | 8,071 | 3,862 | -52% | 1 | 1 | 0% | 1,391 | 1,761 | +27% | 0 | 0 | — |
case-06 | pass→pass | 13,214 | 6,617 | -50% | 1 | 1 | 0% | 2,206 | 2,338 | +6% | 0 | 0 | — |
case-07 | fail→pass | 11,582 | 4,652 | -60% | 1 | 1 | 0% | 1,901 | 2,017 | +6% | 0 | 0 | — |
case-08 | fail→pass | 19,027 | 3,648 | -81% | 1 | 1 | 0% | 3,402 | 1,911 | -44% | 0 | 0 | — |
case-09 | fail→pass | 8,218 | 3,955 | -52% | 1 | 1 | 0% | 1,336 | 1,781 | +33% | 0 | 0 | — |
case-10 | fail→pass | 7,671 | 3,138 | -59% | 1 | 1 | 0% | 1,161 | 1,787 | +54% | 0 | 0 | — |
case-11 | fail→pass | 17,773 | 3,415 | -81% | 1 | 1 | 0% | 2,935 | 1,778 | -39% | 0 | 0 | — |
case-12 | fail→pass | 10,943 | 3,964 | -64% | 1 | 1 | 0% | 1,932 | 1,872 | -3% | 0 | 0 | — |
case-13 | fail→pass | 9,278 | 4,398 | -53% | 1 | 1 | 0% | 1,687 | 1,826 | +8% | 0 | 0 | — |
case-14 | pass→pass | 13,090 | 6,314 | -52% | 1 | 1 | 0% | 2,109 | 2,295 | +9% | 0 | 0 | — |
case-15 | pass→pass | 15,411 | 6,112 | -60% | 1 | 1 | 0% | 2,417 | 2,226 | -8% | 0 | 0 | — |
case-16 | pass→pass | 6,403 | 2,742 | -57% | 1 | 1 | 0% | 1,007 | 1,610 | +60% | 0 | 0 | — |
case-17 | pass→pass | 11,451 | 4,816 | -58% | 1 | 1 | 0% | 1,779 | 1,995 | +12% | 0 | 0 | — |
case-18 | pass→fail | 7,286 | 3,413 | -53% | 1 | 1 | 0% | 1,052 | 1,768 | +68% | 0 | 0 | — |
case-19 | pass→pass | 3,936 | 3,129 | -21% | 1 | 1 | 0% | 675 | 1,795 | +166% | 0 | 0 | — |
case-20 | fail→pass | 8,724 | 2,115 | -76% | 1 | 1 | 0% | 1,348 | 1,534 | +14% | 0 | 0 | — |
case-21 | pass→pass | 15,048 | 5,908 | -61% | 1 | 1 | 0% | 2,399 | 2,168 | -10% | 0 | 0 | — |
case-22 | fail→pass | 6,663 | 2,080 | -69% | 1 | 1 | 0% | 1,151 | 1,519 | +32% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 19 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.