From f8025e1e9edfe411e60dc61f31d76758de4a40f5 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 17:51:44 -0700 Subject: [PATCH 01/10] docs: add Node.js compatibility roadmap and conformance test integrity policy Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 11 + docs-internal/nodejs-compat-roadmap.md | 3520 ++++++++++++++++++++++++ 2 files changed, 3531 insertions(+) create mode 100644 docs-internal/nodejs-compat-roadmap.md diff --git a/CLAUDE.md b/CLAUDE.md index 9039a70e..dbabaaeb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -29,6 +29,17 @@ - **no suite-specific VFS special-casing** — the test runner must not branch on suite name to inject different filesystem state; if a test needs files to exist, either the kernel should provide them or the test should be excluded - **categorize exclusions honestly** — if a failure is fixable with a patch or build flag, it's `implementation-gap`, not `wasm-limitation`; reserve `wasm-limitation` for things genuinely impossible in wasm32-wasip1 (no 80-bit long double, no fork, no mmap) +### Node.js Conformance Test Integrity + +- conformance tests live in `packages/secure-exec/tests/node-conformance/` — they are vendored upstream Node.js v22.14.0 test/parallel/ tests run through the sandbox +- `docs-internal/nodejs-compat-roadmap.md` tracks every non-passing test with its fix category and resolution +- when implementing bridge/polyfill features where both sides go through our code (e.g., loopback HTTP server + client), prevent overfitting with these three mitigations: + - **wire-level snapshot tests**: capture raw protocol bytes and compare against known-good captures from real Node.js + - **project-matrix cross-validation**: add a project-matrix fixture (`tests/projects/`) using a real npm package that exercises the feature — the matrix compares sandbox output to host Node.js + - **real-server control tests**: for network features, maintain tests that hit real external endpoints (not loopback) to validate the client independently of the server +- never inflate conformance numbers — if a test self-skips (exits 0 without testing anything), mark it `vacuous-skip` in expectations.json, not as a real pass +- every entry in `expectations.json` must have a specific, verifiable reason — no vague "fails in sandbox" reasons + ## Tooling - use pnpm, vitest, and tsc for type checks diff --git a/docs-internal/nodejs-compat-roadmap.md b/docs-internal/nodejs-compat-roadmap.md new file mode 100644 index 00000000..17ec43c4 --- /dev/null +++ b/docs-internal/nodejs-compat-roadmap.md @@ -0,0 +1,3520 @@ +# Node.js Compatibility Roadmap + +Current conformance: **11.3% genuine pass rate** (399/3532 tests, Node.js v22.14.0 test/parallel/) + +## Summary + +| Category | Tests | +|----------|-------| +| Passing (genuine) | 399 | +| Blocked by fixable issues | 2272 | +| Blocked by unfixable/out-of-scope | 861 | +| **Total** | **3532** | + +*36 "vacuous" tests self-skip and exit 0 without testing anything — listed under VACUOUS below, counted in unfixable/out-of-scope.* + +## Cross-Validation Testing Policy + +When implementing polyfill/bridge features where both sides of a test go through our code (e.g., loopback HTTP server + client), there is a risk of overfitting — bugs can cancel out if both sides have the same flaw. Three mitigations are required: + +1. **Wire-level snapshot tests**: For protocol-level features (HTTP, TLS, WebSocket), capture the raw request/response bytes from the sandbox implementation and compare against known-good captures from real Node.js. This catches encoding bugs that are invisible at the API level. + +2. **Project-matrix cross-validation**: Every new bridge feature (e.g., `http.createServer()`) must have a corresponding project-matrix fixture in `tests/projects/` that exercises it with a real npm package. The matrix runs the same code on host Node.js and in the sandbox, comparing stdout/stderr/exit code. If the sandbox produces different output, the test fails — no self-validation possible. + +3. **Real-server control tests**: For network features, maintain a subset of tests that hit real external endpoints through the bridge (not loopback) to validate the client independently of the server. This ensures our HTTP client isn't just compatible with our own server. + +## Fix Priority Table + +| Fix | Description | Tests | +|-----|-------------|-------| +| FIX-01 | Loopback HTTP/HTTPS server (createServer + listen) | 492 | +| FIX-02 | V8 CLI flags support (--expose-gc, --harmony, etc.) | 256 | +| FIX-04 | ESM/module resolution edge cases | 204 | +| FIX-03 | process.execPath / child process spawning | 202 | +| FIX-35 | worker_threads module | 157 | +| FIX-06 | Process API gaps (signals, uncaughtException, IPC) | 86 | +| FIX-34 | vm module implementation | 84 | +| FIX-05 | ERR_* error codes on polyfill errors | 81 | +| FIX-07 | Stream polyfill gaps (readable-stream v3 limitations) | 79 | +| FIX-10 | HTTP client/protocol gaps | 77 | +| FIX-09 | fs module gaps (VFS limitations) | 69 | +| FIX-08 | Timer/microtask ordering (setImmediate, nextTick) | 62 | +| FIX-12 | process.emitWarning / deprecation system | 60 | +| FIX-36 | async_hooks module | 36 | +| FIX-11 | Crypto: miscellaneous implementation gaps | 34 | +| FIX-39 | diagnostics_channel module | 32 | +| FIX-18 | Buffer polyfill gaps | 29 | +| FIX-24 | fs.watch / file system watchers | 22 | +| FIX-19 | URL/URLSearchParams polyfill gaps | 20 | +| FIX-13 | Crypto: KeyObject API gaps | 19 | +| FIX-20 | DNS bridge gaps (Resolver, constants, etc.) | 19 | +| FIX-38 | readline module | 18 | +| FIX-21 | zlib polyfill gaps (Brotli, streaming) | 17 | +| FIX-22 | Text encoding gaps (TextDecoder/TextEncoder) | 16 | +| FIX-23 | Web Streams (stream/web, WHATWG APIs) | 14 | +| FIX-25 | Assert polyfill gaps | 14 | +| FIX-29 | path.win32 APIs | 12 | +| FIX-15 | Crypto: key generation (generateKey, generatePrime) | 11 | +| FIX-26 | Readable.from() support | 11 | +| FIX-14 | Crypto: DH/ECDH key agreement | 9 | +| FIX-32 | process.on('uncaughtException') handler | 9 | +| FIX-30 | EventTarget / AbortController gaps | 5 | +| FIX-16 | Crypto: Cipher/Decipher streaming | 4 | +| FIX-31 | Console API gaps | 4 | +| FIX-17 | Crypto: Sign/Verify gaps | 3 | +| FIX-27 | stream.compose() support | 2 | +| FIX-28 | stream.pipeline() edge cases | 2 | +| FIX-33 | process.on('unhandledRejection') handler | 1 | +| FIX-37 | net/tls TCP socket support | 0 | + +--- + +## All Non-Passing Tests by Fix + +### FIX-01: Loopback HTTP/HTTPS server (createServer + listen) (492 tests) + +**Feasibility: High | Effort: Medium-High** + +Almost all tests follow the same pattern: `createServer()` → `.listen(0)` → `http.request({ port })` → assert on response. These are self-contained loopback tests. The bridge currently only supports outbound `http.request()`/`http.get()`. Implementation approach: add in-sandbox loopback routing where `server.listen()` registers a virtual port, and `http.request()` to localhost checks the virtual port registry before going through the network bridge. No real TCP needed — route request/response objects directly through the bridge. This single fix has the highest ROI of any item on this list. + +- `test-diagnostic-channel-http-request-created.js` (fail) +- `test-diagnostic-channel-http-response-created.js` (fail) +- `test-double-tls-server.js` (fail) +- `test-h2-large-header-cause-client-to-hangup.js` (fail) +- `test-http-abort-before-end.js` (fail) +- `test-http-abort-client.js` (fail) +- `test-http-abort-queued.js` (fail) +- `test-http-abort-stream-end.js` (fail) +- `test-http-aborted.js` (fail) +- `test-http-after-connect.js` (fail) +- `test-http-agent-abort-controller.js` (fail) +- `test-http-agent-destroyed-socket.js` (fail) +- `test-http-agent-error-on-idle.js` (fail) +- `test-http-agent-keepalive-delay.js` (fail) +- `test-http-agent-keepalive.js` (fail) +- `test-http-agent-maxsockets-respected.js` (fail) +- `test-http-agent-maxsockets.js` (fail) +- `test-http-agent-maxtotalsockets.js` (fail) +- `test-http-agent-no-protocol.js` (fail) +- `test-http-agent-null.js` (fail) +- `test-http-agent-remove.js` (fail) +- `test-http-agent-scheduling.js` (fail) +- `test-http-agent-timeout.js` (fail) +- `test-http-agent-uninitialized-with-handle.js` (fail) +- `test-http-agent-uninitialized.js` (fail) +- `test-http-agent.js` (fail) +- `test-http-allow-content-length-304.js` (fail) +- `test-http-allow-req-after-204-res.js` (fail) +- `test-http-automatic-headers.js` (fail) +- `test-http-bind-twice.js` (fail) +- `test-http-blank-header.js` (fail) +- `test-http-buffer-sanity.js` (fail) +- `test-http-byteswritten.js` (fail) +- `test-http-catch-uncaughtexception.js` (fail) +- `test-http-chunked-304.js` (fail) +- `test-http-chunked-smuggling.js` (fail) +- `test-http-chunked.js` (fail) +- `test-http-client-abort-destroy.js` (fail) +- `test-http-client-abort-event.js` (fail) +- `test-http-client-abort-keep-alive-destroy-res.js` (fail) +- `test-http-client-abort-keep-alive-queued-tcp-socket.js` (fail) +- `test-http-client-abort-keep-alive-queued-unix-socket.js` (fail) +- `test-http-client-abort-no-agent.js` (fail) +- `test-http-client-abort-response-event.js` (fail) +- `test-http-client-abort-unix-socket.js` (fail) +- `test-http-client-abort.js` (fail) +- `test-http-client-abort2.js` (fail) +- `test-http-client-aborted-event.js` (fail) +- `test-http-client-agent-abort-close-event.js` (fail) +- `test-http-client-agent-end-close-event.js` (fail) +- `test-http-client-agent.js` (fail) +- `test-http-client-check-http-token.js` (fail) +- `test-http-client-close-event.js` (fail) +- `test-http-client-close-with-default-agent.js` (fail) +- `test-http-client-default-headers-exist.js` (fail) +- `test-http-client-encoding.js` (fail) +- `test-http-client-finished.js` (fail) +- `test-http-client-get-url.js` (fail) +- `test-http-client-incomingmessage-destroy.js` (fail) +- `test-http-client-input-function.js` (fail) +- `test-http-client-keep-alive-hint.js` (fail) +- `test-http-client-keep-alive-release-before-finish.js` (fail) +- `test-http-client-override-global-agent.js` (fail) +- `test-http-client-race-2.js` (fail) +- `test-http-client-race.js` (fail) +- `test-http-client-reject-unexpected-agent.js` (fail) +- `test-http-client-request-options.js` (fail) +- `test-http-client-res-destroyed.js` (fail) +- `test-http-client-response-timeout.js` (fail) +- `test-http-client-set-timeout-after-end.js` (fail) +- `test-http-client-set-timeout.js` (fail) +- `test-http-client-spurious-aborted.js` (fail) +- `test-http-client-timeout-connect-listener.js` (fail) +- `test-http-client-timeout-option-listeners.js` (fail) +- `test-http-client-timeout-option.js` (fail) +- `test-http-client-upload-buf.js` (fail) +- `test-http-client-upload.js` (fail) +- `test-http-connect-req-res.js` (fail) +- `test-http-connect.js` (fail) +- `test-http-content-length-mismatch.js` (fail) +- `test-http-content-length.js` (fail) +- `test-http-createConnection.js` (fail) +- `test-http-date-header.js` (fail) +- `test-http-default-encoding.js` (fail) +- `test-http-dont-set-default-headers-with-set-header.js` (fail) +- `test-http-dont-set-default-headers-with-setHost.js` (fail) +- `test-http-dont-set-default-headers.js` (fail) +- `test-http-double-content-length.js` (fail) +- `test-http-dummy-characters-smuggling.js` (fail) +- `test-http-dump-req-when-res-ends.js` (fail) +- `test-http-early-hints-invalid-argument.js` (fail) +- `test-http-early-hints.js` (fail) +- `test-http-end-throw-socket-handling.js` (fail) +- `test-http-exceptions.js` (fail) +- `test-http-expect-continue.js` (fail) +- `test-http-expect-handling.js` (fail) +- `test-http-full-response.js` (fail) +- `test-http-generic-streams.js` (fail) +- `test-http-get-pipeline-problem.js` (fail) +- `test-http-head-request.js` (fail) +- `test-http-head-response-has-no-body-end-implicit-headers.js` (fail) +- `test-http-head-response-has-no-body-end.js` (fail) +- `test-http-head-response-has-no-body.js` (fail) +- `test-http-head-throw-on-response-body-write.js` (fail) +- `test-http-header-badrequest.js` (fail) +- `test-http-header-obstext.js` (fail) +- `test-http-header-overflow.js` (fail) +- `test-http-header-owstext.js` (fail) +- `test-http-hex-write.js` (fail) +- `test-http-host-header-ipv6-fail.js` (fail) +- `test-http-incoming-message-options.js` (fail) +- `test-http-information-headers.js` (fail) +- `test-http-insecure-parser-per-stream.js` (fail) +- `test-http-invalid-te.js` (fail) +- `test-http-keep-alive-close-on-header.js` (fail) +- `test-http-keep-alive-drop-requests.js` (fail) +- `test-http-keep-alive-max-requests.js` (fail) +- `test-http-keep-alive-pipeline-max-requests.js` (fail) +- `test-http-keep-alive-timeout-custom.js` (fail) +- `test-http-keep-alive-timeout-race-condition.js` (fail) +- `test-http-keep-alive-timeout.js` (fail) +- `test-http-keep-alive.js` (fail) +- `test-http-keepalive-client.js` (fail) +- `test-http-keepalive-free.js` (fail) +- `test-http-keepalive-override.js` (fail) +- `test-http-keepalive-request.js` (fail) +- `test-http-listening.js` (fail) +- `test-http-localaddress-bind-error.js` (fail) +- `test-http-malformed-request.js` (fail) +- `test-http-max-header-size-per-stream.js` (fail) +- `test-http-max-headers-count.js` (fail) +- `test-http-max-sockets.js` (fail) +- `test-http-missing-header-separator-cr.js` (fail) +- `test-http-missing-header-separator-lf.js` (fail) +- `test-http-multiple-headers.js` (fail) +- `test-http-mutable-headers.js` (fail) +- `test-http-no-read-no-dump.js` (fail) +- `test-http-nodelay.js` (fail) +- `test-http-outgoing-destroyed.js` (fail) +- `test-http-outgoing-end-multiple.js` (fail) +- `test-http-outgoing-end-types.js` (fail) +- `test-http-outgoing-finish-writable.js` (fail) +- `test-http-outgoing-first-chunk-singlebyte-encoding.js` (fail) +- `test-http-outgoing-message-capture-rejection.js` (fail) +- `test-http-outgoing-message-write-callback.js` (fail) +- `test-http-outgoing-properties.js` (fail) +- `test-http-outgoing-writableFinished.js` (fail) +- `test-http-outgoing-write-types.js` (fail) +- `test-http-parser-finish-error.js` (fail) +- `test-http-parser-free.js` (fail) +- `test-http-parser-freed-before-upgrade.js` (fail) +- `test-http-parser-memory-retention.js` (fail) +- `test-http-pause-no-dump.js` (fail) +- `test-http-pause-resume-one-end.js` (fail) +- `test-http-pause.js` (fail) +- `test-http-pipe-fs.js` (fail) +- `test-http-pipeline-assertionerror-finish.js` (fail) +- `test-http-remove-header-stays-removed.js` (fail) +- `test-http-req-close-robust-from-tampering.js` (fail) +- `test-http-req-res-close.js` (fail) +- `test-http-request-arguments.js` (fail) +- `test-http-request-dont-override-options.js` (fail) +- `test-http-request-end-twice.js` (fail) +- `test-http-request-end.js` (fail) +- `test-http-request-host-header.js` (fail) +- `test-http-request-join-authorization-headers.js` (fail) +- `test-http-request-method-delete-payload.js` (fail) +- `test-http-request-methods.js` (fail) +- `test-http-request-smuggling-content-length.js` (fail) +- `test-http-res-write-after-end.js` (fail) +- `test-http-res-write-end-dont-take-array.js` (fail) +- `test-http-response-close.js` (fail) +- `test-http-response-multi-content-length.js` (fail) +- `test-http-response-multiheaders.js` (fail) +- `test-http-response-setheaders.js` (fail) +- `test-http-response-statuscode.js` (fail) +- `test-http-server-async-dispose.js` (fail) +- `test-http-server-capture-rejections.js` (fail) +- `test-http-server-clear-timer.js` (fail) +- `test-http-server-client-error.js` (fail) +- `test-http-server-close-all.js` (fail) +- `test-http-server-close-destroy-timeout.js` (fail) +- `test-http-server-close-idle-wait-response.js` (fail) +- `test-http-server-close-idle.js` (fail) +- `test-http-server-connection-list-when-close.js` (fail) +- `test-http-server-consumed-timeout.js` (fail) +- `test-http-server-de-chunked-trailer.js` (fail) +- `test-http-server-delete-parser.js` (fail) +- `test-http-server-destroy-socket-on-client-error.js` (fail) +- `test-http-server-incomingmessage-destroy.js` (fail) +- `test-http-server-keep-alive-defaults.js` (fail) +- `test-http-server-keep-alive-max-requests-null.js` (fail) +- `test-http-server-keep-alive-timeout.js` (fail) +- `test-http-server-keepalive-end.js` (fail) +- `test-http-server-method.query.js` (fail) +- `test-http-server-non-utf8-header.js` (fail) +- `test-http-server-options-incoming-message.js` (fail) +- `test-http-server-options-server-response.js` (fail) +- `test-http-server-reject-chunked-with-content-length.js` (fail) +- `test-http-server-reject-cr-no-lf.js` (fail) +- `test-http-server-timeouts-validation.js` (fail) +- `test-http-server-unconsume-consume.js` (fail) +- `test-http-server-write-after-end.js` (fail) +- `test-http-server-write-end-after-end.js` (fail) +- `test-http-set-cookies.js` (fail) +- `test-http-set-header-chain.js` (fail) +- `test-http-set-timeout-server.js` (fail) +- `test-http-socket-encoding-error.js` (fail) +- `test-http-socket-error-listeners.js` (fail) +- `test-http-status-code.js` (fail) +- `test-http-status-reason-invalid-chars.js` (fail) +- `test-http-timeout-client-warning.js` (fail) +- `test-http-timeout-overflow.js` (fail) +- `test-http-timeout.js` (fail) +- `test-http-transfer-encoding-repeated-chunked.js` (fail) +- `test-http-transfer-encoding-smuggling.js` (fail) +- `test-http-unix-socket-keep-alive.js` (fail) +- `test-http-unix-socket.js` (fail) +- `test-http-upgrade-client2.js` (fail) +- `test-http-upgrade-reconsume-stream.js` (fail) +- `test-http-upgrade-server2.js` (fail) +- `test-http-wget.js` (fail) +- `test-http-writable-true-after-close.js` (fail) +- `test-http-write-callbacks.js` (fail) +- `test-http-write-empty-string.js` (fail) +- `test-http-write-head-2.js` (fail) +- `test-http-write-head-after-set-header.js` (fail) +- `test-http-write-head.js` (fail) +- `test-http-zerolengthbuffer.js` (fail) +- `test-http.js` (fail) +- `test-http2-allow-http1.js` (fail) +- `test-http2-alpn.js` (fail) +- `test-http2-altsvc.js` (fail) +- `test-http2-async-local-storage.js` (fail) +- `test-http2-autoselect-protocol.js` (fail) +- `test-http2-backpressure.js` (fail) +- `test-http2-binding.js` (fail) +- `test-http2-buffersize.js` (fail) +- `test-http2-byteswritten-server.js` (fail) +- `test-http2-cancel-while-client-reading.js` (fail) +- `test-http2-capture-rejection.js` (fail) +- `test-http2-clean-output.js` (fail) +- `test-http2-client-connection-tunnelling.js` (fail) +- `test-http2-client-data-end.js` (fail) +- `test-http2-client-destroy.js` (fail) +- `test-http2-client-http1-server.js` (fail) +- `test-http2-client-jsstream-destroy.js` (fail) +- `test-http2-client-onconnect-errors.js` (fail) +- `test-http2-client-port-80.js` (fail) +- `test-http2-client-priority-before-connect.js` (fail) +- `test-http2-client-promisify-connect-error.js` (fail) +- `test-http2-client-promisify-connect.js` (fail) +- `test-http2-client-proxy-over-http2.js` (fail) +- `test-http2-client-request-listeners-warning.js` (fail) +- `test-http2-client-request-options-errors.js` (fail) +- `test-http2-client-rststream-before-connect.js` (fail) +- `test-http2-client-set-priority.js` (fail) +- `test-http2-client-setLocalWindowSize.js` (fail) +- `test-http2-client-setNextStreamID-errors.js` (fail) +- `test-http2-client-settings-before-connect.js` (fail) +- `test-http2-client-shutdown-before-connect.js` (fail) +- `test-http2-client-socket-destroy.js` (fail) +- `test-http2-client-stream-destroy-before-connect.js` (fail) +- `test-http2-client-unescaped-path.js` (fail) +- `test-http2-client-upload-reject.js` (fail) +- `test-http2-client-upload.js` (fail) +- `test-http2-client-write-before-connect.js` (fail) +- `test-http2-client-write-empty-string.js` (fail) +- `test-http2-close-while-writing.js` (fail) +- `test-http2-compat-aborted.js` (fail) +- `test-http2-compat-client-upload-reject.js` (fail) +- `test-http2-compat-errors.js` (fail) +- `test-http2-compat-expect-continue-check.js` (fail) +- `test-http2-compat-expect-continue.js` (fail) +- `test-http2-compat-expect-handling.js` (fail) +- `test-http2-compat-method-connect.js` (fail) +- `test-http2-compat-serverrequest-end.js` (fail) +- `test-http2-compat-serverrequest-headers.js` (fail) +- `test-http2-compat-serverrequest-host.js` (fail) +- `test-http2-compat-serverrequest-pause.js` (fail) +- `test-http2-compat-serverrequest-pipe.js` (fail) +- `test-http2-compat-serverrequest-settimeout.js` (fail) +- `test-http2-compat-serverrequest-trailers.js` (fail) +- `test-http2-compat-serverrequest.js` (fail) +- `test-http2-compat-serverresponse-close.js` (fail) +- `test-http2-compat-serverresponse-createpushresponse.js` (fail) +- `test-http2-compat-serverresponse-destroy.js` (fail) +- `test-http2-compat-serverresponse-drain.js` (fail) +- `test-http2-compat-serverresponse-end-after-statuses-without-body.js` (fail) +- `test-http2-compat-serverresponse-end.js` (fail) +- `test-http2-compat-serverresponse-finished.js` (fail) +- `test-http2-compat-serverresponse-flushheaders.js` (fail) +- `test-http2-compat-serverresponse-headers-after-destroy.js` (fail) +- `test-http2-compat-serverresponse-headers-send-date.js` (fail) +- `test-http2-compat-serverresponse-headers.js` (fail) +- `test-http2-compat-serverresponse-settimeout.js` (fail) +- `test-http2-compat-serverresponse-statuscode.js` (fail) +- `test-http2-compat-serverresponse-statusmessage-property-set.js` (fail) +- `test-http2-compat-serverresponse-statusmessage-property.js` (fail) +- `test-http2-compat-serverresponse-statusmessage.js` (fail) +- `test-http2-compat-serverresponse-trailers.js` (fail) +- `test-http2-compat-serverresponse-write.js` (fail) +- `test-http2-compat-serverresponse-writehead-array.js` (fail) +- `test-http2-compat-serverresponse-writehead.js` (fail) +- `test-http2-compat-serverresponse.js` (fail) +- `test-http2-compat-short-stream-client-server.js` (fail) +- `test-http2-compat-socket-destroy-delayed.js` (fail) +- `test-http2-compat-socket-set.js` (fail) +- `test-http2-compat-socket.js` (fail) +- `test-http2-compat-write-early-hints-invalid-argument-type.js` (fail) +- `test-http2-compat-write-early-hints-invalid-argument-value.js` (fail) +- `test-http2-compat-write-early-hints.js` (fail) +- `test-http2-compat-write-head-destroyed.js` (fail) +- `test-http2-connect-method-extended-cant-turn-off.js` (fail) +- `test-http2-connect-method-extended.js` (fail) +- `test-http2-connect-method.js` (fail) +- `test-http2-connect-options.js` (fail) +- `test-http2-connect-tls-with-delay.js` (fail) +- `test-http2-connect.js` (fail) +- `test-http2-cookies.js` (fail) +- `test-http2-create-client-connect.js` (fail) +- `test-http2-create-client-secure-session.js` (fail) +- `test-http2-create-client-session.js` (fail) +- `test-http2-createsecureserver-options.js` (fail) +- `test-http2-createserver-options.js` (fail) +- `test-http2-createwritereq.js` (fail) +- `test-http2-date-header.js` (fail) +- `test-http2-debug.js` (fail) +- `test-http2-destroy-after-write.js` (fail) +- `test-http2-dont-lose-data.js` (fail) +- `test-http2-dont-override.js` (fail) +- `test-http2-empty-frame-without-eof.js` (fail) +- `test-http2-endafterheaders.js` (fail) +- `test-http2-error-order.js` (fail) +- `test-http2-exceeds-server-trailer-size.js` (fail) +- `test-http2-forget-closed-streams.js` (fail) +- `test-http2-generic-streams-sendfile.js` (fail) +- `test-http2-generic-streams.js` (fail) +- `test-http2-getpackedsettings.js` (fail) +- `test-http2-goaway-delayed-request.js` (fail) +- `test-http2-goaway-opaquedata.js` (fail) +- `test-http2-head-request.js` (fail) +- `test-http2-https-fallback-http-server-options.js` (fail) +- `test-http2-https-fallback.js` (fail) +- `test-http2-info-headers-errors.js` (fail) +- `test-http2-info-headers.js` (fail) +- `test-http2-invalid-last-stream-id.js` (fail) +- `test-http2-invalidargtypes-errors.js` (fail) +- `test-http2-invalidheaderfield.js` (fail) +- `test-http2-invalidheaderfields-client.js` (fail) +- `test-http2-ip-address-host.js` (fail) +- `test-http2-large-write-close.js` (fail) +- `test-http2-large-write-destroy.js` (fail) +- `test-http2-large-write-multiple-requests.js` (fail) +- `test-http2-large-writes-session-memory-leak.js` (fail) +- `test-http2-malformed-altsvc.js` (fail) +- `test-http2-many-writes-and-destroy.js` (fail) +- `test-http2-max-concurrent-streams.js` (fail) +- `test-http2-max-invalid-frames.js` (fail) +- `test-http2-max-session-memory-leak.js` (fail) +- `test-http2-max-settings.js` (fail) +- `test-http2-methods.js` (fail) +- `test-http2-misbehaving-flow-control-paused.js` (fail) +- `test-http2-misbehaving-flow-control.js` (fail) +- `test-http2-misbehaving-multiplex.js` (fail) +- `test-http2-misc-util.js` (fail) +- `test-http2-misused-pseudoheaders.js` (fail) +- `test-http2-multi-content-length.js` (fail) +- `test-http2-multiheaders-raw.js` (fail) +- `test-http2-multiheaders.js` (fail) +- `test-http2-multiplex.js` (fail) +- `test-http2-multistream-destroy-on-read-tls.js` (fail) +- `test-http2-no-more-streams.js` (fail) +- `test-http2-no-wanttrailers-listener.js` (fail) +- `test-http2-onping.js` (fail) +- `test-http2-options-max-headers-block-length.js` (fail) +- `test-http2-options-max-headers-exceeds-nghttp2.js` (fail) +- `test-http2-options-max-reserved-streams.js` (fail) +- `test-http2-options-server-request.js` (fail) +- `test-http2-options-server-response.js` (fail) +- `test-http2-origin.js` (fail) +- `test-http2-pack-end-stream-flag.js` (fail) +- `test-http2-padding-aligned.js` (fail) +- `test-http2-perf_hooks.js` (fail) +- `test-http2-perform-server-handshake.js` (fail) +- `test-http2-ping-settings-heapdump.js` (fail) +- `test-http2-ping-unsolicited-ack.js` (fail) +- `test-http2-ping.js` (fail) +- `test-http2-pipe-named-pipe.js` (fail) +- `test-http2-pipe.js` (fail) +- `test-http2-premature-close.js` (fail) +- `test-http2-priority-cycle-.js` (fail) +- `test-http2-priority-event.js` (fail) +- `test-http2-propagate-session-destroy-code.js` (fail) +- `test-http2-removed-header-stays-removed.js` (fail) +- `test-http2-request-remove-connect-listener.js` (fail) +- `test-http2-res-corked.js` (fail) +- `test-http2-res-writable-properties.js` (fail) +- `test-http2-reset-flood.js` (fail) +- `test-http2-respond-errors.js` (fail) +- `test-http2-respond-file-204.js` (fail) +- `test-http2-respond-file-304.js` (fail) +- `test-http2-respond-file-404.js` (fail) +- `test-http2-respond-file-compat.js` (fail) +- `test-http2-respond-file-error-dir.js` (fail) +- `test-http2-respond-file-error-pipe-offset.js` (fail) +- `test-http2-respond-file-errors.js` (fail) +- `test-http2-respond-file-fd-errors.js` (fail) +- `test-http2-respond-file-fd-invalid.js` (fail) +- `test-http2-respond-file-fd-range.js` (fail) +- `test-http2-respond-file-fd.js` (fail) +- `test-http2-respond-file-push.js` (fail) +- `test-http2-respond-file-range.js` (fail) +- `test-http2-respond-file-with-pipe.js` (fail) +- `test-http2-respond-file.js` (fail) +- `test-http2-respond-nghttperrors.js` (fail) +- `test-http2-respond-no-data.js` (fail) +- `test-http2-respond-with-fd-errors.js` (fail) +- `test-http2-respond-with-file-connection-abort.js` (fail) +- `test-http2-response-splitting.js` (fail) +- `test-http2-sensitive-headers.js` (fail) +- `test-http2-sent-headers.js` (fail) +- `test-http2-serve-file.js` (fail) +- `test-http2-server-async-dispose.js` (fail) +- `test-http2-server-close-callback.js` (fail) +- `test-http2-server-errors.js` (fail) +- `test-http2-server-http1-client.js` (fail) +- `test-http2-server-push-disabled.js` (fail) +- `test-http2-server-push-stream-errors-args.js` (fail) +- `test-http2-server-push-stream-errors.js` (fail) +- `test-http2-server-push-stream-head.js` (fail) +- `test-http2-server-push-stream.js` (fail) +- `test-http2-server-rst-before-respond.js` (fail) +- `test-http2-server-rst-stream.js` (fail) +- `test-http2-server-session-destroy.js` (fail) +- `test-http2-server-sessionerror.js` (fail) +- `test-http2-server-set-header.js` (fail) +- `test-http2-server-setLocalWindowSize.js` (fail) +- `test-http2-server-settimeout-no-callback.js` (fail) +- `test-http2-server-shutdown-before-respond.js` (fail) +- `test-http2-server-shutdown-options-errors.js` (fail) +- `test-http2-server-shutdown-redundant.js` (fail) +- `test-http2-server-socket-destroy.js` (fail) +- `test-http2-server-startup.js` (fail) +- `test-http2-server-stream-session-destroy.js` (fail) +- `test-http2-server-timeout.js` (fail) +- `test-http2-server-unknown-protocol.js` (fail) +- `test-http2-session-gc-while-write-scheduled.js` (fail) +- `test-http2-session-settings.js` (fail) +- `test-http2-session-stream-state.js` (fail) +- `test-http2-session-timeout.js` (fail) +- `test-http2-session-unref.js` (fail) +- `test-http2-settings-unsolicited-ack.js` (fail) +- `test-http2-short-stream-client-server.js` (fail) +- `test-http2-single-headers.js` (fail) +- `test-http2-socket-close.js` (fail) +- `test-http2-socket-proxy-handler-for-has.js` (fail) +- `test-http2-socket-proxy.js` (fail) +- `test-http2-status-code-invalid.js` (fail) +- `test-http2-status-code.js` (fail) +- `test-http2-stream-client.js` (fail) +- `test-http2-stream-destroy-event-order.js` (fail) +- `test-http2-stream-removelisteners-after-close.js` (fail) +- `test-http2-timeouts.js` (fail) +- `test-http2-tls-disconnect.js` (fail) +- `test-http2-too-large-headers.js` (fail) +- `test-http2-too-many-headers.js` (fail) +- `test-http2-too-many-settings.js` (fail) +- `test-http2-too-many-streams.js` (fail) +- `test-http2-trailers-after-session-close.js` (fail) +- `test-http2-trailers.js` (fail) +- `test-http2-unbound-socket-proxy.js` (fail) +- `test-http2-update-settings.js` (fail) +- `test-http2-util-assert-valid-pseudoheader.js` (fail) +- `test-http2-util-asserts.js` (fail) +- `test-http2-util-headers-list.js` (fail) +- `test-http2-util-nghttp2error.js` (fail) +- `test-http2-util-update-options-buffer.js` (fail) +- `test-http2-window-size.js` (fail) +- `test-http2-write-callbacks.js` (fail) +- `test-http2-write-empty-string.js` (fail) +- `test-http2-write-finishes-after-stream-destroy.js` (fail) +- `test-http2-zero-length-header.js` (fail) +- `test-http2-zero-length-write.js` (fail) +- `test-pipe-abstract-socket-http.js` (fail) +- `test-pipe-file-to-http.js` (fail) +- `test-pipe-outgoing-message-data-emitted-after-ended.js` (fail) +- `test-process-beforeexit.js` (fail) +- `test-stream-destroy.js` (fail) +- `test-stream-pipeline-http2.js` (fail) +- `test-stream-toWeb-allows-server-response.js` (fail) +- `test-webstreams-pipeline.js` (fail) + +### FIX-02: V8 CLI flags support (--expose-gc, --harmony, etc.) (256 tests) + +**Feasibility: Partial | Effort: Low-Medium** + +Tests requiring `--expose-gc` (~50): could expose `gc()` as a bridge call backed by V8's `LowMemoryNotification()`. Tests requiring `--max-old-space-size` (~20): could set via V8 isolate heap limits. Tests requiring `--expose-internals` (~100+): test Node.js internals we'll never support — permanently out of scope. Tests requiring `--harmony-*`, `--pending-deprecation`, `--no-warnings`, etc.: case-by-case; some are trivial flag equivalents. Realistically ~70 tests could be rescued by implementing `--expose-gc` and a few flag stubs. + +- `test-abortcontroller-internal.js` (fail) +- `test-abortcontroller.js` (fail) +- `test-aborted-util.js` (fail) +- `test-accessor-properties.js` (fail) +- `test-async-hooks-destroy-on-gc.js` (fail) +- `test-async-hooks-disable-gc-tracking.js` (fail) +- `test-async-hooks-http-agent-destroy.js` (fail) +- `test-async-hooks-http-agent.js` (fail) +- `test-async-hooks-prevent-double-destroy.js` (fail) +- `test-async-hooks-vm-gc.js` (fail) +- `test-async-wrap-destroyid.js` (fail) +- `test-binding-constants.js` (fail) +- `test-blob.js` (fail) +- `test-buffer-backing-arraybuffer.js` (fail) +- `test-buffer-fill.js` (fail) +- `test-buffer-write-fast.js` (fail) +- `test-child-process-bad-stdio.js` (fail) +- `test-child-process-exec-kill-throws.js` (fail) +- `test-child-process-http-socket-leak.js` (fail) +- `test-child-process-spawnsync-kill-signal.js` (fail) +- `test-child-process-spawnsync-shell.js` (fail) +- `test-child-process-validate-stdio.js` (fail) +- `test-child-process-windows-hide.js` (fail) +- `test-cli-node-print-help.js` (fail) +- `test-code-cache.js` (fail) +- `test-common-gc.js` (fail) +- `test-compression-decompression-stream.js` (fail) +- `test-console-formatTime.js` (fail) +- `test-constants.js` (fail) +- `test-crypto-dh-leak.js` (fail) +- `test-crypto-fips.js` (fail) +- `test-crypto-gcm-explicit-short-tag.js` (fail) +- `test-crypto-gcm-implicit-short-tag.js` (fail) +- `test-crypto-prime.js` (fail) +- `test-crypto-random.js` (fail) +- `test-crypto-scrypt.js` (fail) +- `test-crypto-secure-heap.js` (fail) +- `test-crypto-x509.js` (fail) +- `test-data-url.js` (fail) +- `test-debug-v8-fast-api.js` (fail) +- `test-disable-proto-delete.js` (fail) +- `test-disable-proto-throw.js` (fail) +- `test-dns-default-order-ipv4.js` (fail) +- `test-dns-default-order-ipv6.js` (fail) +- `test-dns-default-order-verbatim.js` (fail) +- `test-dns-lookup-promises-options-deprecated.js` (fail) +- `test-dns-lookup-promises.js` (fail) +- `test-dns-lookup.js` (fail) +- `test-dns-lookupService.js` (fail) +- `test-dns-memory-error.js` (fail) +- `test-dns-resolve-promises.js` (fail) +- `test-dns-set-default-order.js` (fail) +- `test-dotenv.js` (fail) +- `test-env-newprotomethod-remove-unnecessary-prototypes.js` (fail) +- `test-err-name-deprecation.js` (fail) +- `test-error-aggregateTwoErrors.js` (fail) +- `test-error-format-list.js` (fail) +- `test-errors-aborterror.js` (fail) +- `test-errors-hide-stack-frames.js` (fail) +- `test-errors-systemerror-frozen-intrinsics.js` (fail) +- `test-errors-systemerror-stackTraceLimit-custom-setter.js` (fail) +- `test-errors-systemerror-stackTraceLimit-deleted-and-Error-sealed.js` (fail) +- `test-errors-systemerror-stackTraceLimit-deleted.js` (fail) +- `test-errors-systemerror-stackTraceLimit-has-only-a-getter.js` (fail) +- `test-errors-systemerror-stackTraceLimit-not-writable.js` (fail) +- `test-errors-systemerror.js` (fail) +- `test-eval-disallow-code-generation-from-strings.js` (fail) +- `test-events-customevent.js` (fail) +- `test-events-on-async-iterator.js` (fail) +- `test-events-once.js` (fail) +- `test-events-static-geteventlisteners.js` (fail) +- `test-eventsource.js` (fail) +- `test-eventtarget-brandcheck.js` (fail) +- `test-eventtarget-memoryleakwarning.js` (fail) +- `test-eventtarget.js` (fail) +- `test-finalization-registry-shutdown.js` (fail) +- `test-fixed-queue.js` (fail) +- `test-freelist.js` (fail) +- `test-freeze-intrinsics.js` (fail) +- `test-fs-copyfile.js` (fail) +- `test-fs-error-messages.js` (fail) +- `test-fs-filehandle.js` (fail) +- `test-fs-open-flags.js` (fail) +- `test-fs-promises-file-handle-aggregate-errors.js` (fail) +- `test-fs-promises-file-handle-close-errors.js` (fail) +- `test-fs-promises-file-handle-close.js` (fail) +- `test-fs-promises-file-handle-op-errors.js` (fail) +- `test-fs-promises-readfile.js` (fail) +- `test-fs-readdir-types.js` (fail) +- `test-fs-rm.js` (fail) +- `test-fs-rmdir-recursive.js` (fail) +- `test-fs-sync-fd-leak.js` (fail) +- `test-fs-util-validateoffsetlength.js` (fail) +- `test-fs-utils-get-dirents.js` (fail) +- `test-fs-watch-abort-signal.js` (fail) +- `test-fs-watch-enoent.js` (fail) +- `test-fs-watchfile-bigint.js` (fail) +- `test-fs-write-reuse-callback.js` (fail) +- `test-fs-write.js` (fail) +- `test-gc-http-client-connaborted.js` (fail) +- `test-gc-net-timeout.js` (fail) +- `test-gc-tls-external-memory.js` (fail) +- `test-global-customevent.js` (fail) +- `test-global-webcrypto-classes.js` (fail) +- `test-global-webcrypto-disbled.js` (fail) +- `test-h2leak-destroy-session-on-socket-ended.js` (fail) +- `test-handle-wrap-hasref.js` (fail) +- `test-heapdump-async-hooks-init-promise.js` (fail) +- `test-http-agent-domain-reused-gc.js` (fail) +- `test-http-client-immediate-error.js` (fail) +- `test-http-client-timeout-on-connect.js` (fail) +- `test-http-correct-hostname.js` (fail) +- `test-http-insecure-parser.js` (fail) +- `test-http-localaddress.js` (fail) +- `test-http-max-http-headers.js` (fail) +- `test-http-outgoing-buffer.js` (fail) +- `test-http-outgoing-internal-headers.js` (fail) +- `test-http-outgoing-renderHeaders.js` (fail) +- `test-http-parser-bad-ref.js` (fail) +- `test-http-parser-lazy-loaded.js` (fail) +- `test-http-same-map.js` (fail) +- `test-http-server-connections-checking-leak.js` (fail) +- `test-http-server-keepalive-req-gc.js` (fail) +- `test-http-server-options-highwatermark.js` (fail) +- `test-icu-data-dir.js` (fail) +- `test-icu-stringwidth.js` (fail) +- `test-internal-assert.js` (fail) +- `test-internal-error-original-names.js` (fail) +- `test-internal-errors.js` (fail) +- `test-internal-fs-syncwritestream.js` (fail) +- `test-internal-fs.js` (fail) +- `test-internal-module-require.js` (fail) +- `test-internal-module-wrap.js` (fail) +- `test-internal-only-binding.js` (fail) +- `test-internal-socket-list-receive.js` (fail) +- `test-internal-socket-list-send.js` (fail) +- `test-internal-util-assertCrypto.js` (fail) +- `test-internal-util-classwrapper.js` (fail) +- `test-internal-util-decorate-error-stack.js` (fail) +- `test-internal-util-helpers.js` (fail) +- `test-internal-util-normalizeencoding.js` (fail) +- `test-internal-util-objects.js` (fail) +- `test-internal-util-weakreference.js` (fail) +- `test-internal-validators-validateoneof.js` (fail) +- `test-internal-validators-validateport.js` (fail) +- `test-internal-webidl-converttoint.js` (fail) +- `test-js-stream-call-properties.js` (fail) +- `test-memory-usage.js` (fail) +- `test-messaging-marktransfermode.js` (fail) +- `test-mime-api.js` (fail) +- `test-module-children.js` (fail) +- `test-module-parent-deprecation.js` (fail) +- `test-module-parent-setter-deprecation.js` (fail) +- `test-module-symlinked-peer-modules.js` (fail) +- `test-navigator.js` (fail) +- `test-nodeeventtarget.js` (fail) +- `test-options-binding.js` (fail) +- `test-os-checked-function.js` (fail) +- `test-pending-deprecation.js` (fail) +- `test-performance-gc.js` (fail) +- `test-performanceobserver.js` (fail) +- `test-primitive-timer-leak.js` (fail) +- `test-primordials-apply.js` (fail) +- `test-primordials-promise.js` (fail) +- `test-primordials-regexp.js` (fail) +- `test-priority-queue.js` (fail) +- `test-process-binding.js` (fail) +- `test-process-env-deprecation.js` (fail) +- `test-process-exception-capture-should-abort-on-uncaught.js` (fail) +- `test-process-exception-capture.js` (fail) +- `test-process-title-cli.js` (fail) +- `test-promise-unhandled-error.js` (fail) +- `test-promise-unhandled-silent.js` (fail) +- `test-promise-unhandled-throw-handler.js` (fail) +- `test-promise-unhandled-throw.js` (fail) +- `test-promise-unhandled-warn-no-hook.js` (fail) +- `test-promise-unhandled-warn.js` (fail) +- `test-promises-unhandled-rejections.js` (skip) +- `test-promises-unhandled-symbol-rejections.js` (fail) +- `test-punycode.js` (fail) +- `test-require-mjs.js` (fail) +- `test-require-symlink.js` (fail) +- `test-safe-get-env.js` (fail) +- `test-signal-safety.js` (fail) +- `test-socketaddress.js` (fail) +- `test-source-map-api.js` (fail) +- `test-source-map-cjs-require-cache.js` (fail) +- `test-sqlite-session.js` (fail) +- `test-stream-add-abort-signal.js` (fail) +- `test-stream-base-prototype-accessors-enumerability.js` (fail) +- `test-stream-wrap-drain.js` (fail) +- `test-stream-wrap-encoding.js` (fail) +- `test-stream-wrap.js` (fail) +- `test-tcp-wrap-connect.js` (fail) +- `test-tcp-wrap-listen.js` (fail) +- `test-tcp-wrap.js` (fail) +- `test-tick-processor-version-check.js` (fail) +- `test-timers-immediate-promisified.js` (fail) +- `test-timers-interval-promisified.js` (fail) +- `test-timers-linked-list.js` (fail) +- `test-timers-nested.js` (fail) +- `test-timers-next-tick.js` (fail) +- `test-timers-now.js` (fail) +- `test-timers-ordering.js` (fail) +- `test-timers-refresh.js` (fail) +- `test-timers-timeout-promisified.js` (fail) +- `test-tty-backwards-api.js` (fail) +- `test-ttywrap-invalid-fd.js` (fail) +- `test-unicode-node-options.js` (fail) +- `test-url-is-url-internal.js` (fail) +- `test-util-emit-experimental-warning.js` (fail) +- `test-util-inspect-namespace.js` (fail) +- `test-util-inspect-proxy.js` (fail) +- `test-util-inspect.js` (fail) +- `test-util-internal.js` (fail) +- `test-util-promisify.js` (fail) +- `test-util-sigint-watchdog.js` (fail) +- `test-util-sleep.js` (fail) +- `test-util-types.js` (fail) +- `test-util.js` (fail) +- `test-uv-binding-constant.js` (fail) +- `test-uv-errmap.js` (fail) +- `test-uv-errno.js` (fail) +- `test-uv-unmapped-exception.js` (fail) +- `test-validators.js` (fail) +- `test-warn-sigprof.js` (fail) +- `test-webcrypto-derivebits.js` (fail) +- `test-webcrypto-derivekey.js` (fail) +- `test-webcrypto-keygen.js` (fail) +- `test-webcrypto-util.js` (fail) +- `test-webcrypto-webidl.js` (fail) +- `test-webstream-readablestream-pipeto.js` (fail) +- `test-whatwg-encoding-custom-internals.js` (fail) +- `test-whatwg-encoding-custom-interop.js` (fail) +- `test-whatwg-encoding-custom-textdecoder.js` (fail) +- `test-whatwg-readablebytestream.js` (fail) +- `test-whatwg-readablestream.js` (fail) +- `test-whatwg-transformstream.js` (fail) +- `test-whatwg-url-canparse.js` (fail) +- `test-whatwg-url-custom-properties.js` (fail) +- `test-whatwg-webstreams-adapters-streambase.js` (fail) +- `test-whatwg-webstreams-adapters-to-readablestream.js` (fail) +- `test-whatwg-webstreams-adapters-to-readablewritablepair.js` (fail) +- `test-whatwg-webstreams-adapters-to-streamduplex.js` (fail) +- `test-whatwg-webstreams-adapters-to-streamreadable.js` (fail) +- `test-whatwg-webstreams-adapters-to-streamwritable.js` (fail) +- `test-whatwg-webstreams-adapters-to-writablestream.js` (fail) +- `test-whatwg-webstreams-coverage.js` (fail) +- `test-whatwg-webstreams-transfer.js` (fail) +- `test-whatwg-writablestream.js` (fail) +- `test-wrap-js-stream-destroy.js` (fail) +- `test-wrap-js-stream-duplex.js` (fail) +- `test-wrap-js-stream-exceptions.js` (fail) +- `test-wrap-js-stream-read-stop.js` (fail) +- `test-zlib-invalid-input-memory.js` (fail) +- `test-zlib-unused-weak.js` (fail) + +### FIX-03: process.execPath / child process spawning (202 tests) + +**Feasibility: Low | Effort: High** + +Tests spawn `child_process.fork()`/`spawn()` with `process.execPath` to run a second Node.js process. The sandbox has no real `node` binary. Possible approaches: (a) provide a `node` shim that spawns a second isolate within the same sandbox — requires multi-isolate architecture, (b) ship a pre-built Node.js binary in the sandbox image — requires WASM compilation of Node.js or binary bundling. Both approaches are high effort. Recommend deferring unless multi-isolate becomes available. + +- `test-assert-builtins-not-read-from-filesystem.js` (fail) +- `test-assert-esm-cjs-message-verify.js` (fail) +- `test-async-hooks-fatal-error.js` (fail) +- `test-async-wrap-pop-id-during-load.js` (fail) +- `test-bash-completion.js` (fail) +- `test-buffer-constructor-node-modules-paths.js` (fail) +- `test-buffer-constructor-node-modules.js` (fail) +- `test-child-process-advanced-serialization-largebuffer.js` (fail) +- `test-child-process-advanced-serialization-splitted-length-field.js` (fail) +- `test-child-process-advanced-serialization.js` (fail) +- `test-child-process-constructor.js` (fail) +- `test-child-process-detached.js` (fail) +- `test-child-process-exec-abortcontroller-promisified.js` (fail) +- `test-child-process-exec-encoding.js` (fail) +- `test-child-process-exec-maxbuf.js` (fail) +- `test-child-process-exec-std-encoding.js` (fail) +- `test-child-process-exec-timeout-expire.js` (fail) +- `test-child-process-exec-timeout-kill.js` (fail) +- `test-child-process-exec-timeout-not-expired.js` (fail) +- `test-child-process-execFile-promisified-abortController.js` (fail) +- `test-child-process-execfile-maxbuf.js` (fail) +- `test-child-process-execfile.js` (fail) +- `test-child-process-execfilesync-maxbuf.js` (fail) +- `test-child-process-execsync-maxbuf.js` (fail) +- `test-child-process-fork-and-spawn.js` (fail) +- `test-child-process-fork-exec-argv.js` (fail) +- `test-child-process-fork-exec-path.js` (fail) +- `test-child-process-no-deprecation.js` (fail) +- `test-child-process-promisified.js` (fail) +- `test-child-process-recv-handle.js` (fail) +- `test-child-process-reject-null-bytes.js` (fail) +- `test-child-process-send-returns-boolean.js` (fail) +- `test-child-process-server-close.js` (fail) +- `test-child-process-silent.js` (fail) +- `test-child-process-spawn-args.js` (fail) +- `test-child-process-spawn-argv0.js` (fail) +- `test-child-process-spawn-controller.js` (fail) +- `test-child-process-spawn-shell.js` (fail) +- `test-child-process-spawn-timeout-kill-signal.js` (fail) +- `test-child-process-spawnsync-env.js` (fail) +- `test-child-process-spawnsync-input.js` (fail) +- `test-child-process-spawnsync-maxbuf.js` (fail) +- `test-child-process-spawnsync-timeout.js` (fail) +- `test-child-process-stdin-ipc.js` (fail) +- `test-child-process-stdio-big-write-end.js` (fail) +- `test-child-process-stdio-inherit.js` (fail) +- `test-child-process-stdout-ipc.js` (fail) +- `test-cli-bad-options.js` (fail) +- `test-cli-eval-event.js` (fail) +- `test-cli-eval.js` (fail) +- `test-cli-node-options-disallowed.js` (fail) +- `test-cli-node-options.js` (fail) +- `test-cli-options-negation.js` (fail) +- `test-cli-options-precedence.js` (fail) +- `test-cli-permission-deny-fs.js` (fail) +- `test-cli-permission-multiple-allow.js` (fail) +- `test-cli-syntax-eval.js` (fail) +- `test-cli-syntax-piped-bad.js` (fail) +- `test-cli-syntax-piped-good.js` (fail) +- `test-common-expect-warning.js` (fail) +- `test-common.js` (fail) +- `test-coverage-with-inspector-disabled.js` (fail) +- `test-cwd-enoent-preload.js` (fail) +- `test-cwd-enoent-repl.js` (fail) +- `test-cwd-enoent.js` (fail) +- `test-dotenv-edge-cases.js` (fail) +- `test-dotenv-node-options.js` (fail) +- `test-dummy-stdio.js` (fail) +- `test-env-var-no-warnings.js` (fail) +- `test-error-prepare-stack-trace.js` (fail) +- `test-error-reporting.js` (fail) +- `test-experimental-shared-value-conveyor.js` (fail) +- `test-file-write-stream4.js` (fail) +- `test-find-package-json.js` (fail) +- `test-force-repl-with-eval.js` (fail) +- `test-force-repl.js` (fail) +- `test-fs-readfile-eof.js` (fail) +- `test-fs-readfile-error.js` (fail) +- `test-fs-readfilesync-pipe-large.js` (fail) +- `test-fs-realpath-pipe.js` (fail) +- `test-fs-syncwritestream.js` (fail) +- `test-fs-write-sigxfsz.js` (fail) +- `test-heap-prof-basic.js` (fail) +- `test-heap-prof-dir-absolute.js` (fail) +- `test-heap-prof-dir-name.js` (fail) +- `test-heap-prof-dir-relative.js` (fail) +- `test-heap-prof-exec-argv.js` (fail) +- `test-heap-prof-exit.js` (fail) +- `test-heap-prof-interval.js` (fail) +- `test-heap-prof-invalid-args.js` (fail) +- `test-heap-prof-loop-drained.js` (fail) +- `test-heap-prof-name.js` (fail) +- `test-heap-prof-sigint.js` (fail) +- `test-heapsnapshot-near-heap-limit-by-api-in-worker.js` (fail) +- `test-heapsnapshot-near-heap-limit-worker.js` (fail) +- `test-http-chunk-problem.js` (fail) +- `test-http-debug.js` (fail) +- `test-http-max-header-size.js` (fail) +- `test-http-pipeline-flood.js` (fail) +- `test-icu-env.js` (fail) +- `test-inspect-address-in-use.js` (fail) +- `test-inspect-publish-uid.js` (fail) +- `test-intl.js` (fail) +- `test-kill-segfault-freebsd.js` (fail) +- `test-listen-fd-cluster.js` (fail) +- `test-listen-fd-detached-inherit.js` (fail) +- `test-listen-fd-detached.js` (fail) +- `test-listen-fd-server.js` (fail) +- `test-math-random.js` (fail) +- `test-module-loading-globalpaths.js` (fail) +- `test-module-run-main-monkey-patch.js` (fail) +- `test-module-wrap.js` (fail) +- `test-module-wrapper.js` (fail) +- `test-node-run.js` (fail) +- `test-npm-install.js` (fail) +- `test-openssl-ca-options.js` (fail) +- `test-os-homedir-no-envvar.js` (fail) +- `test-os-userinfo-handles-getter-errors.js` (fail) +- `test-performance-nodetiming-uvmetricsinfo.js` (fail) +- `test-permission-allow-addons-cli.js` (fail) +- `test-permission-allow-child-process-cli.js` (fail) +- `test-permission-allow-wasi-cli.js` (fail) +- `test-permission-allow-worker-cli.js` (fail) +- `test-permission-child-process-cli.js` (fail) +- `test-permission-dc-worker-threads.js` (fail) +- `test-permission-fs-absolute-path.js` (fail) +- `test-permission-fs-internal-module-stat.js` (fail) +- `test-permission-fs-read.js` (fail) +- `test-permission-fs-relative-path.js` (fail) +- `test-permission-fs-repeat-path.js` (fail) +- `test-permission-fs-require.js` (fail) +- `test-permission-fs-supported.js` (fail) +- `test-permission-fs-symlink-relative.js` (fail) +- `test-permission-fs-symlink-target-write.js` (fail) +- `test-permission-fs-symlink.js` (fail) +- `test-permission-fs-traversal-path.js` (fail) +- `test-permission-fs-wildcard.js` (fail) +- `test-permission-fs-write-report.js` (fail) +- `test-permission-fs-write-v8.js` (fail) +- `test-permission-fs-write.js` (fail) +- `test-permission-has.js` (fail) +- `test-permission-inspector-brk.js` (fail) +- `test-permission-inspector.js` (fail) +- `test-permission-processbinding.js` (fail) +- `test-permission-sqlite-load-extension.js` (fail) +- `test-permission-warning-flags.js` (fail) +- `test-permission-wasi.js` (fail) +- `test-permission-worker-threads-cli.js` (fail) +- `test-pipe-head.js` (fail) +- `test-preload-print-process-argv.js` (fail) +- `test-process-argv-0.js` (fail) +- `test-process-exec-argv.js` (fail) +- `test-process-execpath.js` (fail) +- `test-process-exit-code-validation.js` (fail) +- `test-process-exit-code.js` (fail) +- `test-process-external-stdio-close-spawn.js` (fail) +- `test-process-load-env-file.js` (fail) +- `test-process-ppid.js` (fail) +- `test-process-raw-debug.js` (fail) +- `test-process-really-exit.js` (fail) +- `test-process-remove-all-signal-listeners.js` (fail) +- `test-process-uncaught-exception-monitor.js` (fail) +- `test-promise-reject-callback-exception.js` (fail) +- `test-promise-unhandled-flag.js` (fail) +- `test-release-npm.js` (fail) +- `test-require-invalid-main-no-exports.js` (fail) +- `test-security-revert-unknown.js` (fail) +- `test-set-http-max-http-headers.js` (fail) +- `test-setproctitle.js` (fail) +- `test-sigint-infinite-loop.js` (fail) +- `test-single-executable-blob-config-errors.js` (fail) +- `test-single-executable-blob-config.js` (fail) +- `test-source-map-enable.js` (fail) +- `test-sqlite.js` (fail) +- `test-stack-size-limit.js` (fail) +- `test-startup-empty-regexp-statics.js` (fail) +- `test-startup-large-pages.js` (fail) +- `test-stdin-child-proc.js` (fail) +- `test-stdin-from-file-spawn.js` (fail) +- `test-stdin-pipe-large.js` (fail) +- `test-stdin-pipe-resume.js` (fail) +- `test-stdin-script-child-option.js` (fail) +- `test-stdin-script-child.js` (fail) +- `test-stdio-closed.js` (fail) +- `test-stdio-undestroy.js` (fail) +- `test-stdout-cannot-be-closed-child-process-pipe.js` (fail) +- `test-stdout-close-catch.js` (fail) +- `test-stdout-close-unref.js` (fail) +- `test-stdout-stderr-reading.js` (fail) +- `test-stdout-to-file.js` (fail) +- `test-stream-pipeline-process.js` (fail) +- `test-stream-readable-unpipe-resume.js` (fail) +- `test-sync-io-option.js` (fail) +- `test-tracing-no-crash.js` (fail) +- `test-unhandled-exception-rethrow-error.js` (fail) +- `test-unhandled-exception-with-worker-inuse.js` (fail) +- `test-url-parse-invalid-input.js` (fail) +- `test-util-callbackify.js` (fail) +- `test-util-getcallsites.js` (fail) +- `test-vfs.js` (fail) +- `test-webstorage.js` (fail) +- `test-windows-failed-heap-allocation.js` (fail) + +### FIX-04: ESM/module resolution edge cases (204 tests) + +**Feasibility: High | Effort: Medium** + +ESM/module resolution edge cases include: directory imports, conditional exports in package.json, `import.meta.resolve()`, CJS/ESM interop edge cases, and module caching. The current regex-based `convertEsmToCjs()` (CLAUDE.md policy violation) is the root cause of many failures. Replacing it with `es-module-lexer` (US-048) would fix a significant portion. Additional fixes needed: proper `exports` field resolution in package.json, `import.meta.url` consistency, and handling of `.mjs`/`.cjs` extensions. + +- `test-arm-math-illegal-instruction.js` (fail) +- `test-assert-fail-deprecation.js` (fail) +- `test-assert-first-line.js` (fail) +- `test-assert-objects.js` (fail) +- `test-async-wrap-tlssocket-asyncreset.js` (fail) +- `test-blocklist-clone.js` (fail) +- `test-blocklist.js` (fail) +- `test-buffer-resizable.js` (fail) +- `test-child-process-disconnect.js` (fail) +- `test-child-process-fork-closed-channel-segfault.js` (fail) +- `test-child-process-fork-dgram.js` (fail) +- `test-child-process-fork-getconnections.js` (fail) +- `test-child-process-fork-net-server.js` (fail) +- `test-child-process-fork-net-socket.js` (fail) +- `test-child-process-fork-net.js` (fail) +- `test-cluster-accept-fail.js` (fail) +- `test-cluster-advanced-serialization.js` (fail) +- `test-cluster-basic.js` (fail) +- `test-cluster-bind-privileged-port.js` (fail) +- `test-cluster-bind-twice.js` (fail) +- `test-cluster-call-and-destroy.js` (fail) +- `test-cluster-child-index-dgram.js` (fail) +- `test-cluster-child-index-net.js` (fail) +- `test-cluster-concurrent-disconnect.js` (fail) +- `test-cluster-cwd.js` (fail) +- `test-cluster-dgram-1.js` (fail) +- `test-cluster-dgram-2.js` (fail) +- `test-cluster-dgram-bind-fd.js` (fail) +- `test-cluster-dgram-reuse.js` (fail) +- `test-cluster-dgram-reuseport.js` (fail) +- `test-cluster-disconnect-before-exit.js` (fail) +- `test-cluster-disconnect-exitedAfterDisconnect-race.js` (fail) +- `test-cluster-disconnect-idle-worker.js` (fail) +- `test-cluster-disconnect-leak.js` (fail) +- `test-cluster-disconnect-race.js` (fail) +- `test-cluster-disconnect-unshared-tcp.js` (fail) +- `test-cluster-disconnect-unshared-udp.js` (fail) +- `test-cluster-disconnect-with-no-workers.js` (fail) +- `test-cluster-disconnect.js` (fail) +- `test-cluster-eaccess.js` (fail) +- `test-cluster-eaddrinuse.js` (fail) +- `test-cluster-fork-env.js` (fail) +- `test-cluster-fork-stdio.js` (fail) +- `test-cluster-fork-windowsHide.js` (fail) +- `test-cluster-http-pipe.js` (fail) +- `test-cluster-invalid-message.js` (fail) +- `test-cluster-ipc-throw.js` (fail) +- `test-cluster-kill-disconnect.js` (fail) +- `test-cluster-kill-infinite-loop.js` (fail) +- `test-cluster-listen-pipe-readable-writable.js` (fail) +- `test-cluster-listening-port.js` (fail) +- `test-cluster-message.js` (fail) +- `test-cluster-net-listen-backlog.js` (fail) +- `test-cluster-net-listen-relative-path.js` (fail) +- `test-cluster-net-listen.js` (fail) +- `test-cluster-net-reuseport.js` (fail) +- `test-cluster-net-send.js` (fail) +- `test-cluster-net-server-drop-connection.js` (fail) +- `test-cluster-primary-error.js` (fail) +- `test-cluster-primary-kill.js` (fail) +- `test-cluster-process-disconnect.js` (fail) +- `test-cluster-rr-domain-listen.js` (fail) +- `test-cluster-rr-handle-close.js` (fail) +- `test-cluster-rr-handle-keep-loop-alive.js` (fail) +- `test-cluster-rr-handle-ref-unref.js` (fail) +- `test-cluster-rr-ref.js` (fail) +- `test-cluster-send-deadlock.js` (fail) +- `test-cluster-send-handle-twice.js` (fail) +- `test-cluster-send-socket-to-worker-http-server.js` (fail) +- `test-cluster-server-restart-none.js` (fail) +- `test-cluster-server-restart-rr.js` (fail) +- `test-cluster-setup-primary-argv.js` (fail) +- `test-cluster-setup-primary-cumulative.js` (fail) +- `test-cluster-setup-primary-emit.js` (fail) +- `test-cluster-setup-primary-multiple.js` (fail) +- `test-cluster-setup-primary.js` (fail) +- `test-cluster-shared-handle-bind-error.js` (fail) +- `test-cluster-shared-leak.js` (fail) +- `test-cluster-uncaught-exception.js` (fail) +- `test-cluster-worker-constructor.js` (fail) +- `test-cluster-worker-death.js` (fail) +- `test-cluster-worker-destroy.js` (fail) +- `test-cluster-worker-disconnect-on-error.js` (fail) +- `test-cluster-worker-disconnect.js` (fail) +- `test-cluster-worker-events.js` (fail) +- `test-cluster-worker-exit.js` (fail) +- `test-cluster-worker-forced-exit.js` (fail) +- `test-cluster-worker-handle-close.js` (fail) +- `test-cluster-worker-init.js` (fail) +- `test-cluster-worker-isconnected.js` (fail) +- `test-cluster-worker-isdead.js` (fail) +- `test-cluster-worker-kill-signal.js` (fail) +- `test-cluster-worker-kill.js` (fail) +- `test-cluster-worker-no-exit.js` (fail) +- `test-cluster-worker-wait-server-close.js` (fail) +- `test-crypto-domain.js` (fail) +- `test-crypto-domains.js` (fail) +- `test-crypto-verify-failure.js` (fail) +- `test-crypto.js` (fail) +- `test-directory-import.js` (fail) +- `test-double-tls-client.js` (fail) +- `test-esm-loader-hooks-inspect-brk.js` (fail) +- `test-esm-loader-hooks-inspect-wait.js` (fail) +- `test-event-emitter-no-error-provided-to-error-event.js` (fail) +- `test-fetch-mock.js` (fail) +- `test-fs-append-file-flush.js` (fail) +- `test-fs-operations-with-surrogate-pairs.js` (fail) +- `test-fs-readdir-recursive.js` (fail) +- `test-fs-write-file-flush.js` (fail) +- `test-fs-write-stream-flush.js` (fail) +- `test-http-agent-reuse-drained-socket-only.js` (fail) +- `test-http-client-error-rawbytes.js` (fail) +- `test-http-client-parse-error.js` (fail) +- `test-http-client-reject-chunked-with-content-length.js` (fail) +- `test-http-client-reject-cr-no-lf.js` (fail) +- `test-http-client-response-domain.js` (fail) +- `test-http-conn-reset.js` (fail) +- `test-http-default-port.js` (fail) +- `test-http-extra-response.js` (fail) +- `test-http-header-validators.js` (fail) +- `test-http-incoming-pipelined-socket-destroy.js` (fail) +- `test-http-invalid-urls.js` (fail) +- `test-http-multi-line-headers.js` (fail) +- `test-http-no-content-length.js` (fail) +- `test-http-perf_hooks.js` (fail) +- `test-http-pipeline-requests-connection-leak.js` (fail) +- `test-http-request-agent.js` (fail) +- `test-http-response-no-headers.js` (fail) +- `test-http-response-splitting.js` (fail) +- `test-http-response-status-message.js` (fail) +- `test-http-server-headers-timeout-delayed-headers.js` (fail) +- `test-http-server-headers-timeout-interrupted-headers.js` (fail) +- `test-http-server-headers-timeout-keepalive.js` (fail) +- `test-http-server-headers-timeout-pipelining.js` (fail) +- `test-http-server-multiple-client-error.js` (fail) +- `test-http-server-request-timeout-delayed-body.js` (fail) +- `test-http-server-request-timeout-delayed-headers.js` (fail) +- `test-http-server-request-timeout-interrupted-body.js` (fail) +- `test-http-server-request-timeout-interrupted-headers.js` (fail) +- `test-http-server-request-timeout-keepalive.js` (fail) +- `test-http-server-request-timeout-pipelining.js` (fail) +- `test-http-server-request-timeout-upgrade.js` (fail) +- `test-http-server.js` (fail) +- `test-http-should-keep-alive.js` (fail) +- `test-http-upgrade-agent.js` (fail) +- `test-http-upgrade-binary.js` (fail) +- `test-http-upgrade-client.js` (fail) +- `test-http-upgrade-server.js` (fail) +- `test-http-url.parse-https.request.js` (fail) +- `test-inspect-support-for-node_options.js` (fail) +- `test-listen-fd-ebadf.js` (fail) +- `test-module-cache.js` (fail) +- `test-module-version.js` (fail) +- `test-next-tick-domain.js` (fail) +- `test-path-posix-exists.js` (fail) +- `test-path-win32-exists.js` (fail) +- `test-perf-gc-crash.js` (fail) +- `test-perf-hooks-histogram.js` (fail) +- `test-perf-hooks-resourcetiming.js` (fail) +- `test-perf-hooks-usertiming.js` (fail) +- `test-performance-function-async.js` (fail) +- `test-performance-function.js` (fail) +- `test-performance-global.js` (fail) +- `test-performance-measure-detail.js` (fail) +- `test-performance-measure.js` (fail) +- `test-performance-resourcetimingbufferfull.js` (fail) +- `test-performance-resourcetimingbuffersize.js` (fail) +- `test-performanceobserver-gc.js` (fail) +- `test-pipe-abstract-socket.js` (fail) +- `test-pipe-address.js` (fail) +- `test-pipe-stream.js` (fail) +- `test-pipe-unref.js` (fail) +- `test-pipe-writev.js` (fail) +- `test-process-env-sideeffects.js` (fail) +- `test-process-getactivehandles.js` (fail) +- `test-process-getactiveresources-track-active-handles.js` (fail) +- `test-process-ref-unref.js` (fail) +- `test-readline.js` (fail) +- `test-ref-unref-return.js` (fail) +- `test-repl.js` (fail) +- `test-require-delete-array-iterator.js` (fail) +- `test-require-json.js` (fail) +- `test-socket-address.js` (fail) +- `test-socket-options-invalid.js` (fail) +- `test-socket-write-after-fin-error.js` (fail) +- `test-socket-write-after-fin.js` (fail) +- `test-socket-writes-before-passed-to-tls-socket.js` (fail) +- `test-stream-aliases-legacy.js` (fail) +- `test-stream-base-typechecking.js` (fail) +- `test-stream-pipeline.js` (fail) +- `test-stream-preprocess.js` (fail) +- `test-timers-immediate-queue-throw.js` (fail) +- `test-timers-reset-process-domain-on-throw.js` (fail) +- `test-timers-socket-timeout-removes-other-socket-unref-timer.js` (fail) +- `test-timers-unrefed-in-callback.js` (fail) +- `test-tojson-perf_hooks.js` (fail) +- `test-tty-stdin-pipe.js` (fail) +- `test-url-domain-ascii-unicode.js` (fail) +- `test-url-format.js` (fail) +- `test-url-parse-format.js` (fail) +- `test-util-stripvtcontrolcharacters.js` (fail) +- `test-util-text-decoder.js` (fail) +- `test-util-types-exists.js` (fail) +- `test-x509-escaping.js` (fail) + +### FIX-05: ERR_* error codes on polyfill errors (81 tests) + +**Feasibility: High | Effort: Low-Medium** + +81 tests fail because polyfill errors lack Node.js ERR_* codes. The pattern is established in `packages/nodejs/src/polyfills.ts` — wrap module functions to catch errors and add `.code` property. Remaining modules needing error codes: child_process (spawn/fork argument validation), console (constructor options), crypto (ECDH/pbkdf2/hash methods), fs (encoding validation, callback type checking), events (listener validation). Follow the existing ERR_HELPERS pattern. + +- `test-buffer-arraybuffer.js` (fail) +- `test-child-process-fork-args.js` (fail) +- `test-child-process-spawn-typeerror.js` (fail) +- `test-child-process-spawnsync-validation-errors.js` (fail) +- `test-console-group.js` (fail) +- `test-console-instance.js` (fail) +- `test-console-table.js` (fail) +- `test-crypto-certificate.js` (fail) +- `test-crypto-ecdh-convert-key.js` (fail) +- `test-crypto-getcipherinfo.js` (fail) +- `test-crypto-hash.js` (fail) +- `test-crypto-hkdf.js` (fail) +- `test-crypto-hmac.js` (fail) +- `test-crypto-oneshot-hash.js` (fail) +- `test-crypto-pbkdf2.js` (fail) +- `test-crypto-randomuuid.js` (fail) +- `test-event-capture-rejections.js` (fail) +- `test-event-emitter-invalid-listener.js` (fail) +- `test-event-emitter-max-listeners.js` (fail) +- `test-file-validate-mode-flag.js` (fail) +- `test-http-client-invalid-path.js` (fail) +- `test-http-client-unescaped-path.js` (fail) +- `test-http-invalid-path-chars.js` (fail) +- `test-http-request-invalid-method-error.js` (fail) +- `test-http-url.parse-only-support-http-https-protocol.js` (fail) +- `test-icu-transcode.js` (fail) +- `test-module-loading-error.js` (fail) +- `test-module-setsourcemapssupport.js` (fail) +- `test-next-tick-errors.js` (fail) +- `test-os-eol.js` (fail) +- `test-os-process-priority.js` (fail) +- `test-process-cpuUsage.js` (fail) +- `test-process-exception-capture-errors.js` (fail) +- `test-process-kill-pid.js` (fail) +- `test-process-next-tick.js` (fail) +- `test-process-setsourcemapsenabled.js` (fail) +- `test-queue-microtask.js` (fail) +- `test-require-resolve.js` (fail) +- `test-sqlite-custom-functions.js` (fail) +- `test-sqlite-data-types.js` (fail) +- `test-sqlite-database-sync.js` (fail) +- `test-sqlite-statement-sync.js` (fail) +- `test-stream-duplex-readable-writable.js` (fail) +- `test-stream-err-multiple-callback-construction.js` (fail) +- `test-stream-readable-default-encoding.js` (fail) +- `test-stream-readable-with-unimplemented-_read.js` (fail) +- `test-stream-transform-callback-twice.js` (fail) +- `test-stream-writable-write-cb-twice.js` (fail) +- `test-stream-write-destroy.js` (fail) +- `test-string-decoder.js` (fail) +- `test-structuredClone-global.js` (fail) +- `test-timers-enroll-invalid-msecs.js` (fail) +- `test-timers-throw-when-cb-not-function.js` (fail) +- `test-url-fileurltopath.js` (fail) +- `test-url-format-invalid-input.js` (fail) +- `test-url-format-whatwg.js` (fail) +- `test-url-pathtofileurl.js` (fail) +- `test-url-revokeobjecturl.js` (fail) +- `test-webcrypto-getRandomValues.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-invalid-arg.js` (fail) +- `test-whatwg-readablebytestream-bad-buffers-and-views.js` (fail) +- `test-whatwg-url-custom-parsing.js` (fail) +- `test-whatwg-url-custom-searchparams-append.js` (fail) +- `test-whatwg-url-custom-searchparams-delete.js` (fail) +- `test-whatwg-url-custom-searchparams-get.js` (fail) +- `test-whatwg-url-custom-searchparams-getall.js` (fail) +- `test-whatwg-url-custom-searchparams-has.js` (fail) +- `test-whatwg-url-custom-searchparams-set.js` (fail) +- `test-whatwg-url-custom-searchparams.js` (fail) +- `test-zlib-brotli.js` (fail) +- `test-zlib-convenience-methods.js` (fail) +- `test-zlib-crc32.js` (fail) +- `test-zlib-deflate-constructors.js` (fail) +- `test-zlib-failed-init.js` (fail) +- `test-zlib-flush-flags.js` (fail) +- `test-zlib-invalid-arg-value-brotli-compress.js` (fail) +- `test-zlib-invalid-input.js` (fail) +- `test-zlib-not-string-or-buffer.js` (fail) +- `test-zlib-object-write.js` (fail) +- `test-zlib-zero-windowBits.js` (fail) +- `test-zlib.js` (fail) + +### FIX-06: Process API gaps (signals, uncaughtException, IPC) (86 tests) + +**Feasibility: High | Effort: Medium** + +Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._getActiveHandles()` — expose from active-handles.ts, (2) `process.getActiveResourcesInfo()` — scan timer/interval Maps for type names, (3) `process.beforeExit` event — fire after event loop drains but before `exit`, (4) `process.noDeprecation`/`process.throwDeprecation` flags — mutable booleans affecting emitWarning behavior, (5) `process.setUncaughtExceptionCaptureCallback()` — store callback ref for runtime exception capture, (6) `process.allowedNodeEnvironmentFlags` — read-only set of supported flags. + +- `test-child-process-can-write-to-stdout.js` (fail) +- `test-child-process-cwd.js` (fail) +- `test-child-process-default-options.js` (fail) +- `test-child-process-destroy.js` (fail) +- `test-child-process-dgram-reuseport.js` (fail) +- `test-child-process-double-pipe.js` (fail) +- `test-child-process-env.js` (fail) +- `test-child-process-exec-cwd.js` (fail) +- `test-child-process-exec-env.js` (fail) +- `test-child-process-exec-error.js` (fail) +- `test-child-process-exec-stdout-stderr-data-string.js` (fail) +- `test-child-process-exit-code.js` (fail) +- `test-child-process-flush-stdio.js` (fail) +- `test-child-process-fork-abort-signal.js` (fail) +- `test-child-process-fork-close.js` (fail) +- `test-child-process-fork-detached.js` (fail) +- `test-child-process-fork-no-shell.js` (fail) +- `test-child-process-fork-ref.js` (fail) +- `test-child-process-fork-ref2.js` (fail) +- `test-child-process-fork-stdio-string-variant.js` (fail) +- `test-child-process-fork-stdio.js` (fail) +- `test-child-process-fork-timeout-kill-signal.js` (fail) +- `test-child-process-fork.js` (fail) +- `test-child-process-fork3.js` (fail) +- `test-child-process-internal.js` (fail) +- `test-child-process-ipc-next-tick.js` (fail) +- `test-child-process-ipc.js` (fail) +- `test-child-process-kill.js` (fail) +- `test-child-process-net-reuseport.js` (fail) +- `test-child-process-pipe-dataflow.js` (fail) +- `test-child-process-send-after-close.js` (fail) +- `test-child-process-send-cb.js` (fail) +- `test-child-process-send-keep-open.js` (fail) +- `test-child-process-send-type-error.js` (fail) +- `test-child-process-send-utf8.js` (fail) +- `test-child-process-set-blocking.js` (fail) +- `test-child-process-spawn-error.js` (fail) +- `test-child-process-spawn-event.js` (fail) +- `test-child-process-spawn-windows-batch-file.js` (fail) +- `test-child-process-spawnsync-args.js` (fail) +- `test-child-process-spawnsync.js` (fail) +- `test-child-process-stdin.js` (fail) +- `test-child-process-stdio-merge-stdouts-into-cat.js` (fail) +- `test-child-process-stdio-reuse-readable-stdio.js` (fail) +- `test-child-process-stdio.js` (fail) +- `test-child-process-stdout-flush-exit.js` (fail) +- `test-child-process-stdout-flush.js` (fail) +- `test-cli-node-options-docs.js` (fail) +- `test-common-countdown.js` (fail) +- `test-disable-sigusr1.js` (fail) +- `test-fs-read-file-sync.js` (fail) +- `test-fs-write-stream-patch-open.js` (fail) +- `test-module-main-extension-lookup.js` (fail) +- `test-module-main-fail.js` (fail) +- `test-module-main-preserve-symlinks-fail.js` (fail) +- `test-preload-worker.js` (fail) +- `test-preload.js` (fail) +- `test-process-assert.js` (fail) +- `test-process-available-memory.js` (fail) +- `test-process-beforeexit-throw-exit.js` (fail) +- `test-process-config.js` (fail) +- `test-process-constrained-memory.js` (fail) +- `test-process-env-allowed-flags.js` (fail) +- `test-process-env-ignore-getter-setter.js` (fail) +- `test-process-env-symbols.js` (fail) +- `test-process-env.js` (fail) +- `test-process-exception-capture-should-abort-on-uncaught-setflagsfromstring.js` (fail) +- `test-process-exit-from-before-exit.js` (fail) +- `test-process-exit-handler.js` (skip) +- `test-process-external-stdio-close.js` (fail) +- `test-process-getactiveresources-track-interval-lifetime.js` (fail) +- `test-process-getactiveresources.js` (fail) +- `test-process-getgroups.js` (fail) +- `test-process-kill-null.js` (fail) +- `test-process-prototype.js` (fail) +- `test-process-redirect-warnings-env.js` (fail) +- `test-process-redirect-warnings.js` (fail) +- `test-promises-warning-on-unhandled-rejection.js` (fail) +- `test-release-changelog.js` (fail) +- `test-signal-handler.js` (skip) +- `test-signal-unregister.js` (fail) +- `test-sqlite-named-parameters.js` (fail) +- `test-sqlite-transactions.js` (fail) +- `test-sqlite-typed-array-and-data-view.js` (fail) +- `test-stdin-from-file.js` (fail) +- `test-util-log.js` (fail) + +### FIX-07: Stream polyfill gaps (readable-stream v3 limitations) (79 tests) + +**Feasibility: Medium | Effort: Medium-High** + +The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.js v16.8+. Missing: `Readable.from()` (async iterable → Readable), `stream.compose()` (pipeline composition), `Duplex.from()`, iterator helpers (`.map()`, `.filter()`, `.flatMap()`, `.drop()`, `.take()`, `.forEach()`), and `getDefaultHighWaterMark()`. Event ordering (end before close, finish before close) is a readable-stream v3 architectural limitation. Options: (a) upgrade to readable-stream v4 (breaking changes), (b) implement missing APIs as post-patches on top of v3, (c) replace with Node.js stream source code (maintenance burden). + +- `test-console-sync-write-error.js` (fail) +- `test-file-write-stream.js` (fail) +- `test-file-write-stream3.js` (fail) +- `test-filehandle-readablestream.js` (fail) +- `test-fs-read-stream-double-close.js` (fail) +- `test-fs-read-stream-err.js` (fail) +- `test-fs-stream-destroy-emit-error.js` (fail) +- `test-fs-stream-double-close.js` (fail) +- `test-fs-write-stream-err.js` (fail) +- `test-fs-write-stream-fs.js` (fail) +- `test-fs-writestream-open-write.js` (fail) +- `test-http-sync-write-error-during-continue.js` (fail) +- `test-stream-await-drain-writers-in-synchronously-recursion-write.js` (fail) +- `test-stream-catch-rejections.js` (fail) +- `test-stream-construct.js` (fail) +- `test-stream-consumers.js` (fail) +- `test-stream-duplex-destroy.js` (fail) +- `test-stream-duplex-end.js` (fail) +- `test-stream-duplex-props.js` (fail) +- `test-stream-duplexpair.js` (fail) +- `test-stream-error-once.js` (fail) +- `test-stream-event-names.js` (fail) +- `test-stream-filter.js` (fail) +- `test-stream-flatMap.js` (fail) +- `test-stream-map.js` (fail) +- `test-stream-pipe-await-drain-manual-resume.js` (fail) +- `test-stream-pipe-await-drain-push-while-write.js` (fail) +- `test-stream-pipe-await-drain.js` (fail) +- `test-stream-pipe-multiple-pipes.js` (fail) +- `test-stream-pipe-needDrain.js` (fail) +- `test-stream-pipe-same-destination-twice.js` (fail) +- `test-stream-pipe-unpipe-streams.js` (fail) +- `test-stream-promises.js` (fail) +- `test-stream-readable-aborted.js` (fail) +- `test-stream-readable-async-iterators.js` (fail) +- `test-stream-readable-data.js` (fail) +- `test-stream-readable-didRead.js` (fail) +- `test-stream-readable-dispose.js` (fail) +- `test-stream-readable-emit-readable-short-stream.js` (fail) +- `test-stream-readable-emittedReadable.js` (fail) +- `test-stream-readable-hwm-0-no-flow-data.js` (fail) +- `test-stream-readable-needReadable.js` (fail) +- `test-stream-readable-readable-then-resume.js` (fail) +- `test-stream-readable-readable.js` (fail) +- `test-stream-readable-reading-readingMore.js` (fail) +- `test-stream-set-default-hwm.js` (fail) +- `test-stream-transform-constructor-set-methods.js` (fail) +- `test-stream-transform-destroy.js` (fail) +- `test-stream-transform-final-sync.js` (fail) +- `test-stream-transform-split-highwatermark.js` (fail) +- `test-stream-transform-split-objectmode.js` (fail) +- `test-stream-typedarray.js` (fail) +- `test-stream-uint8array.js` (fail) +- `test-stream-writable-aborted.js` (fail) +- `test-stream-writable-change-default-encoding.js` (fail) +- `test-stream-writable-constructor-set-methods.js` (fail) +- `test-stream-writable-decoded-encoding.js` (fail) +- `test-stream-writable-end-cb-error.js` (fail) +- `test-stream-writable-end-multiple.js` (fail) +- `test-stream-writable-final-throw.js` (fail) +- `test-stream-writable-finish-destroyed.js` (fail) +- `test-stream-writable-finished.js` (fail) +- `test-stream-writable-writable.js` (fail) +- `test-stream-writable-write-cb-error.js` (fail) +- `test-stream-writable-write-writev-finish.js` (fail) +- `test-stream2-basic.js` (fail) +- `test-stream2-readable-wrap-destroy.js` (fail) +- `test-stream2-readable-wrap-error.js` (fail) +- `test-stream2-readable-wrap.js` (fail) +- `test-stream2-transform.js` (fail) +- `test-stream2-writable.js` (fail) +- `test-stream3-pipeline-async-iterator.js` (fail) +- `test-warn-stream-wrap.js` (fail) +- `test-zlib-brotli-16GB.js` (fail) +- `test-zlib-empty-buffer.js` (fail) +- `test-zlib-flush-drain-longblock.js` (fail) +- `test-zlib-flush-drain.js` (fail) +- `test-zlib-params.js` (fail) +- `test-zlib-reset-before-write.js` (fail) + +### FIX-08: Timer/microtask ordering (setImmediate, nextTick) (62 tests) + +**Feasibility: High | Effort: Medium-High** + +`setImmediate` currently delegates to `setTimeout(0)` causing priority inversion. Node.js event loop phases: nextTick → microtasks → timers → I/O → check (setImmediate). Fix requires: (1) split setImmediate into its own queue separate from timers, (2) coordinate with V8 isolate event loop in `native/v8-runtime/src/session.rs` for proper phase separation, (3) ensure `process.nextTick` callbacks run before Promise microtasks. This is an architectural change to the event loop, not just a polyfill fix. + +- `test-abortsignal-cloneable.js` (fail) +- `test-eventtarget-once-twice.js` (fail) +- `test-fs-append-file.js` (skip) +- `test-fs-buffer.js` (skip) +- `test-fs-chmod-mask.js` (skip) +- `test-fs-empty-readStream.js` (skip) +- `test-fs-open-mode-mask.js` (skip) +- `test-fs-promisified.js` (skip) +- `test-fs-read-offset-null.js` (skip) +- `test-fs-read.js` (skip) +- `test-fs-readfile-fd.js` (skip) +- `test-fs-sir-writes-alot.js` (skip) +- `test-fs-stat.js` (skip) +- `test-fs-write-buffer.js` (skip) +- `test-global.js` (fail) +- `test-http-outgoing-settimeout.js` (fail) +- `test-microtask-queue-run-immediate.js` (fail) +- `test-microtask-queue-run.js` (fail) +- `test-module-circular-dependency-warning.js` (skip) +- `test-next-tick-ordering.js` (skip) +- `test-next-tick-ordering2.js` (fail) +- `test-process-getactiverequests.js` (skip) +- `test-process-getactiveresources-track-active-requests.js` (skip) +- `test-process-getactiveresources-track-multiple-timers.js` (fail) +- `test-process-getactiveresources-track-timer-lifetime.js` (fail) +- `test-process-warning.js` (fail) +- `test-promise-hook-on-resolve.js` (fail) +- `test-stdout-pipeline-destroy.js` (skip) +- `test-stream-finished.js` (skip) +- `test-stream-pipe-flow.js` (fail) +- `test-stream-readable-unshift.js` (skip) +- `test-stream-transform-final.js` (fail) +- `test-stream-unshift-empty-chunk.js` (skip) +- `test-stream-unshift-read-race.js` (skip) +- `test-stream-writable-final-async.js` (fail) +- `test-stream-writev.js` (skip) +- `test-stream2-compatibility.js` (skip) +- `test-stream2-push.js` (skip) +- `test-stream2-read-sync-stack.js` (skip) +- `test-stream2-readable-non-empty-end.js` (skip) +- `test-stream2-unpipe-drain.js` (skip) +- `test-stream3-pause-then-read.js` (skip) +- `test-timers-active.js` (fail) +- `test-timers-api-refs.js` (fail) +- `test-timers-destroyed.js` (skip) +- `test-timers-dispose.js` (skip) +- `test-timers-immediate-queue.js` (skip) +- `test-timers-immediate-unref.js` (fail) +- `test-timers-max-duration-warning.js` (fail) +- `test-timers-promises-scheduler.js` (fail) +- `test-timers-promises.js` (fail) +- `test-timers-refresh-in-callback.js` (fail) +- `test-timers-timeout-to-interval.js` (fail) +- `test-timers-uncaught-exception.js` (fail) +- `test-timers-unenroll-unref-interval.js` (skip) +- `test-timers-unref-throw-then-ref.js` (fail) +- `test-timers-unref.js` (fail) +- `test-timers-unrefed-in-beforeexit.js` (fail) +- `test-timers.js` (skip) +- `test-zlib-from-concatenated-gzip.js` (skip) +- `test-zlib-from-gzip.js` (skip) +- `test-zlib-random-byte-pipes.js` (skip) + +### FIX-09: fs module gaps (VFS limitations) (69 tests) + +**Feasibility: High | Effort: Medium** + +Missing fs operations: (1) `fs.promises` FileHandle methods (read/write/truncate with proper async resolution), (2) ReadStream/WriteStream event lifecycle (open/close/drain events, fd option, autoClose), (3) optional parameter overloads for read/write/readv/writev, (4) callback type validation (throw TypeError synchronously, don't return Promise), (5) fs.opendir() with Symbol.asyncIterator, (6) ENOTDIR error for readdir on files. The bridge in `bridge-handlers.ts` has basic fs ops but lacks the full parameter permutation handling. + +- `test-crypto-key-objects.js` (fail) +- `test-crypto-rsa-dsa.js` (fail) +- `test-crypto-sign-verify.js` (fail) +- `test-file-write-stream2.js` (fail) +- `test-file-write-stream5.js` (fail) +- `test-fs-chmod.js` (fail) +- `test-fs-fchmod.js` (fail) +- `test-fs-fchown.js` (fail) +- `test-fs-filehandle-use-after-close.js` (fail) +- `test-fs-lchown.js` (fail) +- `test-fs-mkdir-mode-mask.js` (fail) +- `test-fs-mkdir-rmdir.js` (fail) +- `test-fs-mkdtemp.js` (fail) +- `test-fs-null-bytes.js` (fail) +- `test-fs-open-no-close.js` (fail) +- `test-fs-promises-file-handle-read.js` (fail) +- `test-fs-promises-file-handle-readFile.js` (fail) +- `test-fs-promises-file-handle-stream.js` (fail) +- `test-fs-promises-file-handle-truncate.js` (fail) +- `test-fs-promises-file-handle-write.js` (fail) +- `test-fs-promises-readfile-with-fd.js` (fail) +- `test-fs-promises-watch.js` (skip) +- `test-fs-promises-write-optional-params.js` (fail) +- `test-fs-promises-writefile-with-fd.js` (fail) +- `test-fs-promises.js` (fail) +- `test-fs-read-empty-buffer.js` (fail) +- `test-fs-read-file-assert-encoding.js` (fail) +- `test-fs-read-file-sync-hostname.js` (fail) +- `test-fs-read-optional-params.js` (fail) +- `test-fs-read-promises-optional-params.js` (fail) +- `test-fs-read-stream-encoding.js` (fail) +- `test-fs-read-stream-fd.js` (fail) +- `test-fs-read-stream-patch-open.js` (fail) +- `test-fs-read-stream-pos.js` (skip) +- `test-fs-readdir-stack-overflow.js` (fail) +- `test-fs-readdir-ucs2.js` (fail) +- `test-fs-readdir.js` (fail) +- `test-fs-readfile-flags.js` (fail) +- `test-fs-readv-promises.js` (fail) +- `test-fs-readv-promisify.js` (fail) +- `test-fs-ready-event-stream.js` (fail) +- `test-fs-realpath-buffer-encoding.js` (fail) +- `test-fs-realpath.js` (fail) +- `test-fs-rmdir-recursive-sync-warns-not-found.js` (fail) +- `test-fs-rmdir-recursive-sync-warns-on-file.js` (fail) +- `test-fs-rmdir-recursive-throws-not-found.js` (fail) +- `test-fs-rmdir-recursive-throws-on-file.js` (fail) +- `test-fs-rmdir-recursive-warns-not-found.js` (fail) +- `test-fs-rmdir-recursive-warns-on-file.js` (fail) +- `test-fs-stat-bigint.js` (fail) +- `test-fs-stream-construct-compat-error-read.js` (fail) +- `test-fs-stream-construct-compat-error-write.js` (fail) +- `test-fs-stream-construct-compat-graceful-fs.js` (fail) +- `test-fs-stream-construct-compat-old-node.js` (fail) +- `test-fs-symlink-dir-junction-relative.js` (fail) +- `test-fs-symlink-dir-junction.js` (fail) +- `test-fs-symlink-dir.js` (fail) +- `test-fs-symlink.js` (fail) +- `test-fs-truncate-fd.js` (fail) +- `test-fs-truncate-sync.js` (fail) +- `test-fs-write-no-fd.js` (fail) +- `test-fs-write-optional-params.js` (fail) +- `test-fs-write-stream-change-open.js` (fail) +- `test-fs-write-stream-file-handle.js` (fail) +- `test-fs-write-sync.js` (fail) +- `test-fs-writefile-with-fd.js` (fail) +- `test-fs-writev-promises.js` (fail) +- `test-process-dlopen-error-message-crash.js` (fail) +- `test-zlib-brotli-from-brotli.js` (fail) + +### FIX-10: HTTP client/protocol gaps (77 tests) + +**Feasibility: Medium | Effort: Medium** + +77 HTTP tests fail without needing createServer — they test client/agent behavior. Gaps: (1) `http.Agent.getName()` not implemented, (2) `ClientRequest.path`/`.method` properties missing, (3) URL path validation (reject unescaped special chars, null bytes), (4) `http.METHODS` array incomplete (only 7 methods vs Node.js full list), (5) `OutgoingMessage._headers` reference equality, (6) event ordering/callback timing differences. Some tests still use createServer as a harness to test client behavior — these overlap with FIX-01. + +- `test-client-request-destroy.js` (fail) +- `test-fs-readfile-pipe-large.js` (fail) +- `test-fs-readfile-pipe.js` (fail) +- `test-http-addrequest-localaddress.js` (fail) +- `test-http-agent-close.js` (fail) +- `test-http-agent-getname.js` (fail) +- `test-http-client-readable.js` (fail) +- `test-http-common.js` (fail) +- `test-http-incoming-matchKnownFields.js` (fail) +- `test-http-incoming-message-connection-setter.js` (fail) +- `test-http-invalidheaderfield2.js` (fail) +- `test-http-outgoing-destroy.js` (fail) +- `test-http-parser-multiple-execute.js` (fail) +- `test-http-parser.js` (fail) +- `test-http-proxy.js` (skip) +- `test-http-set-max-idle-http-parser.js` (fail) +- `test-https-abortcontroller.js` (fail) +- `test-https-agent-abort-controller.js` (fail) +- `test-https-agent-additional-options.js` (fail) +- `test-https-agent-constructor.js` (fail) +- `test-https-agent-create-connection.js` (fail) +- `test-https-agent-disable-session-reuse.js` (fail) +- `test-https-agent-getname.js` (fail) +- `test-https-agent-keylog.js` (fail) +- `test-https-agent-servername.js` (fail) +- `test-https-agent-session-eviction.js` (fail) +- `test-https-agent-session-injection.js` (fail) +- `test-https-agent-session-reuse.js` (fail) +- `test-https-agent-sni.js` (fail) +- `test-https-agent-sockets-leak.js` (fail) +- `test-https-agent-unref-socket.js` (fail) +- `test-https-agent.js` (fail) +- `test-https-argument-of-creating.js` (fail) +- `test-https-autoselectfamily.js` (fail) +- `test-https-byteswritten.js` (fail) +- `test-https-client-checkServerIdentity.js` (fail) +- `test-https-client-get-url.js` (fail) +- `test-https-client-override-global-agent.js` (fail) +- `test-https-client-reject.js` (fail) +- `test-https-client-resume.js` (fail) +- `test-https-close.js` (fail) +- `test-https-connecting-to-http.js` (fail) +- `test-https-drain.js` (fail) +- `test-https-eof-for-eom.js` (fail) +- `test-https-host-headers.js` (fail) +- `test-https-hwm.js` (fail) +- `test-https-insecure-parse-per-stream.js` (fail) +- `test-https-keep-alive-drop-requests.js` (fail) +- `test-https-localaddress-bind-error.js` (fail) +- `test-https-localaddress.js` (fail) +- `test-https-max-header-size-per-stream.js` (fail) +- `test-https-max-headers-count.js` (fail) +- `test-https-options-boolean-check.js` (fail) +- `test-https-pfx.js` (fail) +- `test-https-request-arguments.js` (fail) +- `test-https-resume-after-renew.js` (fail) +- `test-https-selfsigned-no-keycertsign-no-crash.js` (fail) +- `test-https-server-async-dispose.js` (fail) +- `test-https-server-close-all.js` (fail) +- `test-https-server-close-destroy-timeout.js` (fail) +- `test-https-server-close-idle.js` (fail) +- `test-https-server-connections-checking-leak.js` (fail) +- `test-https-server-headers-timeout.js` (fail) +- `test-https-server-options-incoming-message.js` (fail) +- `test-https-server-options-server-response.js` (fail) +- `test-https-server-request-timeout.js` (fail) +- `test-https-set-timeout-server.js` (fail) +- `test-https-simple.js` (fail) +- `test-https-socket-options.js` (fail) +- `test-https-strict.js` (fail) +- `test-https-timeout-server-2.js` (fail) +- `test-https-timeout-server.js` (fail) +- `test-https-timeout.js` (fail) +- `test-https-truncate.js` (fail) +- `test-https-unix-socket-self-signed.js` (fail) +- `test-outgoing-message-pipe.js` (fail) +- `test-set-incoming-message-header.js` (fail) + +### FIX-11: Crypto: miscellaneous implementation gaps (34 tests) + +**Feasibility: High | Effort: Medium** + +Crypto gaps not covered by DH/KeyObject/Cipher sub-fixes: (1) error codes — polyfill crypto functions throw plain TypeError instead of ERR_* coded errors, (2) `publicEncrypt`/`privateDecrypt` return undefined instead of Buffer, (3) `crypto.getCipherInfo()` not implemented, (4) X509Certificate class not implemented, (5) Hash/Cipher objects don't implement Stream interface (no `.pipe()`). Fix by wrapping polyfill functions to add error codes, implementing Stream wrappers around Hash/Cipher, and returning computed results from encrypt/decrypt. + +- `test-crypto-async-sign-verify.js` (fail) +- `test-crypto-authenticated.js` (fail) +- `test-crypto-classes.js` (fail) +- `test-crypto-dh-group-setters.js` (fail) +- `test-crypto-dh-stateless.js` (fail) +- `test-crypto-hash-stream-pipe.js` (fail) +- `test-crypto-lazy-transform-writable.js` (fail) +- `test-crypto-subtle-zero-length.js` (fail) +- `test-crypto-webcrypto-aes-decrypt-tag-too-small.js` (fail) +- `test-crypto-worker-thread.js` (fail) +- `test-global-webcrypto.js` (fail) +- `test-process-env-allowed-flags-are-documented.js` (fail) +- `test-process-versions.js` (fail) +- `test-webcrypto-constructors.js` (fail) +- `test-webcrypto-derivebits-cfrg.js` (fail) +- `test-webcrypto-derivebits-ecdh.js` (fail) +- `test-webcrypto-derivebits-hkdf.js` (fail) +- `test-webcrypto-derivekey-cfrg.js` (fail) +- `test-webcrypto-derivekey-ecdh.js` (fail) +- `test-webcrypto-digest.js` (fail) +- `test-webcrypto-encrypt-decrypt-aes.js` (fail) +- `test-webcrypto-encrypt-decrypt-rsa.js` (fail) +- `test-webcrypto-encrypt-decrypt.js` (fail) +- `test-webcrypto-export-import-cfrg.js` (fail) +- `test-webcrypto-export-import-ec.js` (fail) +- `test-webcrypto-export-import-rsa.js` (fail) +- `test-webcrypto-export-import.js` (fail) +- `test-webcrypto-random.js` (fail) +- `test-webcrypto-sign-verify-ecdsa.js` (fail) +- `test-webcrypto-sign-verify-eddsa.js` (fail) +- `test-webcrypto-sign-verify-hmac.js` (fail) +- `test-webcrypto-sign-verify-rsa.js` (fail) +- `test-webcrypto-sign-verify.js` (fail) +- `test-webcrypto-wrap-unwrap.js` (fail) + +### FIX-12: process.emitWarning / deprecation system (60 tests) + +**Feasibility: High | Effort: Low** + +`process.emitWarning()` exists but deprecation system is incomplete: (1) `process.noDeprecation` flag not checked — should suppress DeprecationWarning stderr output, (2) `process.throwDeprecation` flag not checked — should throw instead of emit for DeprecationWarning, (3) no stderr output for warnings (only event emission), (4) `util.deprecate()` doesn't emit via `process.emitWarning()`. Fix in `packages/nodejs/src/bridge/process.ts` — check flags before emitting, add stderr write for warnings. + +- `test-buffer-constructor-deprecation-error.js` (fail) +- `test-buffer-new.js` (fail) +- `test-buffer-pending-deprecation.js` (fail) +- `test-domain-abort-on-uncaught.js` (fail) +- `test-domain-add-remove.js` (fail) +- `test-domain-async-id-map-leak.js` (fail) +- `test-domain-bind-timeout.js` (fail) +- `test-domain-crypto.js` (fail) +- `test-domain-dep0097.js` (fail) +- `test-domain-ee-error-listener.js` (fail) +- `test-domain-ee-implicit.js` (fail) +- `test-domain-ee.js` (fail) +- `test-domain-emit-error-handler-stack.js` (fail) +- `test-domain-enter-exit.js` (fail) +- `test-domain-error-types.js` (fail) +- `test-domain-fs-enoent-stream.js` (fail) +- `test-domain-http-server.js` (fail) +- `test-domain-implicit-binding.js` (fail) +- `test-domain-implicit-fs.js` (fail) +- `test-domain-intercept.js` (fail) +- `test-domain-load-after-set-uncaught-exception-capture.js` (fail) +- `test-domain-multi.js` (fail) +- `test-domain-multiple-errors.js` (fail) +- `test-domain-nested-throw.js` (fail) +- `test-domain-nested.js` (fail) +- `test-domain-nexttick.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-0.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-1.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-2.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-3.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-4.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-5.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-6.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-7.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-8.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-9.js` (fail) +- `test-domain-promise.js` (fail) +- `test-domain-run.js` (fail) +- `test-domain-safe-exit.js` (fail) +- `test-domain-set-uncaught-exception-capture-after-load.js` (fail) +- `test-domain-stack-empty-in-process-uncaughtexception.js` (fail) +- `test-domain-stack.js` (fail) +- `test-domain-throw-error-then-throw-from-uncaught-exception-handler.js` (fail) +- `test-domain-thrown-error-handler-stack.js` (fail) +- `test-domain-timer.js` (fail) +- `test-domain-timers-uncaught-exception.js` (fail) +- `test-domain-timers.js` (fail) +- `test-domain-top-level-error-handler-clears-stack.js` (fail) +- `test-domain-top-level-error-handler-throw.js` (fail) +- `test-domain-uncaught-exception.js` (fail) +- `test-domain-vm-promise-isolation.js` (fail) +- `test-domain-with-abort-on-uncaught-exception.js` (fail) +- `test-fs-truncate.js` (fail) +- `test-global-console-exists.js` (fail) +- `test-http-outgoing-internal-headernames-setter.js` (fail) +- `test-module-loading-deprecated.js` (fail) +- `test-process-emitwarning.js` (fail) +- `test-process-no-deprecation.js` (fail) +- `test-util-deprecate.js` (fail) +- `test-util-getcallsite.js` (fail) + +### FIX-13: Crypto: KeyObject API gaps (19 tests) + +**Feasibility: High | Effort: Medium** + +The crypto bridge returns PEM strings from generateKeyPairSync but doesn't create full KeyObject instances. Missing: `.type` (public/private/secret), `.asymmetricKeyType` (rsa, ec, ed25519, etc.), `.asymmetricKeyDetails` (modulusLength, publicExponent, namedCurve), `.toCryptoKey()`, `.export({...})`. Fix: implement a KeyObject polyfill class that wraps PEM strings and extracts metadata via host-side calls to createPrivateKey/createPublicKey. JWK output must be parsed from JSON string to object. + +- `test-crypto-key-objects-to-crypto-key.js` (fail) +- `test-crypto-keygen-async-explicit-elliptic-curve-encrypted-p256.js` (fail) +- `test-crypto-keygen-async-explicit-elliptic-curve-encrypted.js.js` (fail) +- `test-crypto-keygen-async-explicit-elliptic-curve.js` (fail) +- `test-crypto-keygen-async-named-elliptic-curve-encrypted-p256.js` (fail) +- `test-crypto-keygen-async-named-elliptic-curve-encrypted.js` (fail) +- `test-crypto-keygen-async-named-elliptic-curve.js` (fail) +- `test-crypto-keygen-bit-length.js` (fail) +- `test-crypto-keygen-deprecation.js` (fail) +- `test-crypto-keygen-duplicate-deprecated-option.js` (fail) +- `test-crypto-keygen-empty-passphrase-no-prompt.js` (fail) +- `test-crypto-keygen-key-object-without-encoding.js` (fail) +- `test-crypto-keygen-key-objects.js` (fail) +- `test-crypto-keygen-no-rsassa-pss-params.js` (fail) +- `test-crypto-keygen-non-standard-public-exponent.js` (fail) +- `test-crypto-keygen-rfc8017-9-1.js` (fail) +- `test-crypto-keygen-rfc8017-a-2-3.js` (fail) +- `test-crypto-keygen-rsa-pss.js` (fail) +- `test-crypto-keygen-sync.js` (fail) + +### FIX-14: Crypto: DH/ECDH key agreement (9 tests) + +**Feasibility: High | Effort: Medium-High** + +DiffieHellman and ECDH are not bridged at all. Need: (1) stateful DH session management (like cipher sessions), (2) OpenSSL bindings for DH key generation and shared secret computation, (3) ECDH curve parameter handling, (4) encoding parameter support (buffer/hex/base64). The bridge would need new handlers: createDiffieHellman, DH.generateKeys, DH.computeSecret, DH.getPrime, getDiffieHellman, ECDH.convertKey, and the stateless crypto.diffieHellman(). + +- `test-crypto-dh-constructor.js` (fail) +- `test-crypto-dh-curves.js` (fail) +- `test-crypto-dh-errors.js` (fail) +- `test-crypto-dh-generate-keys.js` (fail) +- `test-crypto-dh-modp2-views.js` (fail) +- `test-crypto-dh-modp2.js` (fail) +- `test-crypto-dh-padding.js` (fail) +- `test-crypto-dh.js` (fail) +- `test-crypto-keygen-dh-classic.js` (fail) + +### FIX-15: Crypto: key generation (generateKey, generatePrime) (11 tests) + +**Feasibility: High | Effort: Low-Medium** + +Key generation gaps: (1) `crypto.generateKey()` for symmetric keys not implemented (only generateKeyPair exists), (2) DSA parameter validation too strict in OpenSSL, (3) JWK output returned as JSON string not parsed object, (4) ed25519/ed448 async callback not invoked. Fix by adding generateKey bridge handler, relaxing DSA param validation, JSON.parse JWK output, and ensuring all key types invoke async callbacks. + +- `test-crypto-keygen-async-elliptic-curve-jwk-ec.js` (fail) +- `test-crypto-keygen-async-elliptic-curve-jwk-rsa.js` (fail) +- `test-crypto-keygen-async-elliptic-curve-jwk.js` (fail) +- `test-crypto-keygen-async-encrypted-private-key-der.js` (fail) +- `test-crypto-keygen-async-encrypted-private-key.js` (fail) +- `test-crypto-keygen-async-rsa.js` (fail) +- `test-crypto-keygen-eddsa.js` (fail) +- `test-crypto-keygen-invalid-parameter-encoding-dsa.js` (fail) +- `test-crypto-keygen-invalid-parameter-encoding-ec.js` (fail) +- `test-crypto-keygen.js` (fail) +- `test-crypto-secret-keygen.js` (fail) + +### FIX-16: Crypto: Cipher/Decipher streaming (4 tests) + +**Feasibility: High | Effort: Low-Medium** + +Hash and Cipher objects don't extend Transform stream — they lack `.pipe()`, `.on('readable')`, `.on('data')`. The existing bridge cipher sessions (cryptoCipherivCreate/update/final) can back a Transform stream wrapper. Fix: create CipherTransform/HashTransform classes extending Transform that delegate to underlying bridge operations. Also add CCM mode authTagLength parameter support. + +- `test-crypto-authenticated-stream.js` (fail) +- `test-crypto-cipheriv-decipheriv.js` (fail) +- `test-crypto-padding.js` (fail) +- `test-crypto-stream.js` (fail) + +### FIX-17: Crypto: Sign/Verify gaps (3 tests) + +**Feasibility: High | Effort: Low** + +Sign/verify are bridged and mostly work. The 3 remaining failures are minor error code mismatches or encoding validation. Fix by wrapping sign/verify polyfill functions with ERR_* error code injection. + +- `test-fs-write-file.js` (fail) +- `test-stream-readable-destroy.js` (fail) +- `test-stream-writable-destroy.js` (fail) + +### FIX-18: Buffer polyfill gaps (29 tests) + +**Feasibility: High | Effort: Low** + +Buffer gaps: (1) `Buffer.isAscii()` missing ERR_INVALID_ARG_TYPE for non-Buffer inputs, (2) ERR_INVALID_STATE for detached ArrayBuffers, (3) SharedArrayBuffer handling edge cases, (4) binary data corruption in bridge for large buffers (TextDecoder issue). Fix by wrapping isAscii() with type validation and adding detached ArrayBuffer detection. + +- `test-buffer-compare-offset.js` (fail) +- `test-buffer-copy.js` (fail) +- `test-buffer-equals.js` (fail) +- `test-buffer-includes.js` (fail) +- `test-buffer-indexof.js` (fail) +- `test-buffer-inspect.js` (fail) +- `test-buffer-isascii.js` (fail) +- `test-buffer-isutf8.js` (fail) +- `test-buffer-prototype-inspect.js` (fail) +- `test-buffer-read.js` (fail) +- `test-buffer-readdouble.js` (fail) +- `test-buffer-readfloat.js` (fail) +- `test-buffer-readint.js` (fail) +- `test-buffer-readuint.js` (fail) +- `test-buffer-set-inspect-max-bytes.js` (fail) +- `test-buffer-sharedarraybuffer.js` (fail) +- `test-buffer-slow.js` (fail) +- `test-buffer-tostring-range.js` (fail) +- `test-buffer-tostring-rangeerror.js` (fail) +- `test-buffer-write.js` (fail) +- `test-buffer-writedouble.js` (fail) +- `test-buffer-writefloat.js` (fail) +- `test-buffer-writeint.js` (fail) +- `test-buffer-writeuint.js` (fail) +- `test-crypto-private-decrypt-gh32240.js` (fail) +- `test-fs-read-type.js` (fail) +- `test-fs-write-buffer-large.js` (fail) +- `test-global-setters.js` (fail) +- `test-stream2-large-read-stall.js` (skip) + +### FIX-19: URL/URLSearchParams polyfill gaps (20 tests) + +**Feasibility: Medium | Effort: Low** + +Browser URL polyfill differs from Node.js: (1) legacy `url.parse()` query string object mode, (2) URLSearchParams iteration differences, (3) relative URL resolution. Most failures are framework issues (--expose-internals) not core API gaps. Fix: add post-patch to URL polyfill for error code injection, verify query string parsing compatibility. + +- `test-url-parse-query.js` (fail) +- `test-url-relative.js` (fail) +- `test-url-urltooptions.js` (fail) +- `test-whatwg-url-custom-deepequal.js` (fail) +- `test-whatwg-url-custom-global.js` (fail) +- `test-whatwg-url-custom-href-side-effect.js` (fail) +- `test-whatwg-url-custom-inspect.js` (fail) +- `test-whatwg-url-custom-searchparams-constructor.js` (fail) +- `test-whatwg-url-custom-searchparams-entries.js` (fail) +- `test-whatwg-url-custom-searchparams-foreach.js` (fail) +- `test-whatwg-url-custom-searchparams-inspect.js` (fail) +- `test-whatwg-url-custom-searchparams-keys.js` (fail) +- `test-whatwg-url-custom-searchparams-sort.js` (fail) +- `test-whatwg-url-custom-searchparams-stringifier.js` (fail) +- `test-whatwg-url-custom-searchparams-values.js` (fail) +- `test-whatwg-url-custom-setters.js` (fail) +- `test-whatwg-url-custom-tostringtag.js` (fail) +- `test-whatwg-url-invalidthis.js` (fail) +- `test-whatwg-url-override-hostname.js` (fail) +- `test-whatwg-url-properties.js` (fail) + +### FIX-20: DNS bridge gaps (Resolver, constants, etc.) (19 tests) + +**Feasibility: High | Effort: Medium** + +DNS bridge only implements lookup/resolve/resolve4/resolve6. Missing: Resolver class, setServers/getServers, lookupService, reverse, resolveAny/resolveNs/resolveMx/resolveCname/resolveTxt/resolveSoa, constants, dns/promises subpath. Fix: extend bridge DNS implementation with `_networkDnsResolveRaw` handler that takes hostname + rrtype, implement Resolver class wrapping bridge calls, add error codes (ENOTFOUND). + +- `test-c-ares.js` (fail) +- `test-destroy-socket-in-lookup.js` (fail) +- `test-dns-cancel-reverse-lookup.js` (fail) +- `test-dns-channel-cancel-promise.js` (fail) +- `test-dns-channel-cancel.js` (fail) +- `test-dns-channel-timeout.js` (fail) +- `test-dns-get-server.js` (fail) +- `test-dns-lookupService-promises.js` (fail) +- `test-dns-multi-channel.js` (fail) +- `test-dns-perf_hooks.js` (fail) +- `test-dns-promises-exists.js` (fail) +- `test-dns-resolveany-bad-ancount.js` (fail) +- `test-dns-resolveany.js` (fail) +- `test-dns-resolvens-typeerror.js` (fail) +- `test-dns-setlocaladdress.js` (fail) +- `test-dns-setserver-when-querying.js` (fail) +- `test-dns-setservers-type-check.js` (fail) +- `test-dns.js` (fail) +- `test-http-autoselectfamily.js` (fail) + +### FIX-21: zlib polyfill gaps (Brotli, streaming) (17 tests) + +**Feasibility: High | Effort: Low** + +Zlib gaps: (1) zlib.constants and zlib.codes not frozen (Object.freeze needed), (2) Brotli parameter validation incomplete, (3) `getDefaultHighWaterMark()` not exported. Fix: freeze constants/codes in postPatch, validate Brotli params against BROTLI_PARAM_* constants, export getDefaultHighWaterMark. + +- `test-zlib-brotli-flush.js` (fail) +- `test-zlib-brotli-from-string.js` (fail) +- `test-zlib-brotli-kmaxlength-rangeerror.js` (fail) +- `test-zlib-bytes-read.js` (fail) +- `test-zlib-const.js` (fail) +- `test-zlib-destroy.js` (fail) +- `test-zlib-dictionary.js` (fail) +- `test-zlib-flush.js` (fail) +- `test-zlib-from-gzip-with-trailing-garbage.js` (fail) +- `test-zlib-kmaxlength-rangeerror.js` (fail) +- `test-zlib-maxOutputLength.js` (fail) +- `test-zlib-premature-end.js` (fail) +- `test-zlib-unzip-one-byte-chunks.js` (fail) +- `test-zlib-write-after-close.js` (fail) +- `test-zlib-write-after-end.js` (fail) +- `test-zlib-write-after-flush.js` (fail) +- `test-zlib-zero-byte.js` (fail) + +### FIX-22: Text encoding gaps (TextDecoder/TextEncoder) (16 tests) + +**Feasibility: High | Effort: Low** + +TextDecoder/TextEncoder gaps: (1) ERR_ENCODING_NOT_SUPPORTED not thrown for invalid encoding labels, (2) ERR_ENCODING_INVALID_ENCODED_DATA not thrown for fatal mode decode errors. Fix: wrap TextDecoder constructor with error code injection in polyfills.ts postPatch. + +- `test-btoa-atob.js` (fail) +- `test-crypto-encoding-validation-error.js` (fail) +- `test-crypto-psychic-signatures.js` (fail) +- `test-fs-readfile.js` (fail) +- `test-fs-readv-sync.js` (fail) +- `test-global-domexception.js` (fail) +- `test-global-encoder.js` (fail) +- `test-string-decoder-end.js` (fail) +- `test-string-decoder-fuzz.js` (fail) +- `test-whatwg-encoding-custom-api-basics.js` (fail) +- `test-whatwg-encoding-custom-fatal-streaming.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-api-invalid-label.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-fatal.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-ignorebom.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-streaming.js` (fail) +- `test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js` (fail) + +### FIX-23: Web Streams (stream/web, WHATWG APIs) (14 tests) + +**Feasibility: Medium | Effort: Medium** + +`require('stream/web')` throws SyntaxError because the ESM wrapper contains native `export` syntax that the CJS require path can't parse. Fix: (1) detect stream/web CJS require and provide a CJS-compatible wrapper that re-exports all named exports, or (2) pre-compile the ESM wrapper into CJS in the require hook, or (3) provide a dedicated CJS polyfill for stream/web. Also need to define WHATWG stream globals (ReadableStream, WritableStream, TransformStream). + +- `test-global-webstreams.js` (fail) +- `test-readable-from-web-enqueue-then-close.js` (fail) +- `test-stream-duplex.js` (fail) +- `test-stream-readable-strategy-option.js` (fail) +- `test-webstream-encoding-inspect.js` (fail) +- `test-webstream-readable-from.js` (fail) +- `test-webstream-string-tag.js` (fail) +- `test-webstreams-abort-controller.js` (fail) +- `test-webstreams-clone-unref.js` (fail) +- `test-webstreams-compose.js` (fail) +- `test-webstreams-finished.js` (fail) +- `test-whatwg-readablebytestreambyob.js` (fail) +- `test-whatwg-webstreams-compression.js` (fail) +- `test-whatwg-webstreams-encoding.js` (fail) + +### FIX-24: fs.watch / file system watchers (22 tests) + +**Feasibility: Low | Effort: High** + +VFS has no inotify equivalent. `fs.watch()`/`fs.watchFile()` return stub objects that never emit events. Would need a VFS event system that tracks file modifications and notifies watchers. Tests that wait for change events will always hang unless VFS emits change notifications on write operations. Recommend keeping as known limitation. + +- `test-fs-assert-encoding-error.js` (fail) +- `test-fs-options-immutable.js` (skip) +- `test-fs-watch-encoding.js` (skip) +- `test-fs-watch-file-enoent-after-deletion.js` (skip) +- `test-fs-watch-recursive-add-file-to-existing-subfolder.js` (skip) +- `test-fs-watch-recursive-add-file-to-new-folder.js` (skip) +- `test-fs-watch-recursive-add-file-with-url.js` (skip) +- `test-fs-watch-recursive-add-file.js` (skip) +- `test-fs-watch-recursive-add-folder.js` (skip) +- `test-fs-watch-recursive-assert-leaks.js` (skip) +- `test-fs-watch-recursive-delete.js` (skip) +- `test-fs-watch-recursive-linux-parallel-remove.js` (skip) +- `test-fs-watch-recursive-promise.js` (skip) +- `test-fs-watch-recursive-symlink.js` (skip) +- `test-fs-watch-recursive-sync-write.js` (skip) +- `test-fs-watch-recursive-update-file.js` (skip) +- `test-fs-watch-recursive-validate.js` (skip) +- `test-fs-watch-recursive-watch-file.js` (skip) +- `test-fs-watch-stop-async.js` (fail) +- `test-fs-watch-stop-sync.js` (fail) +- `test-fs-watch.js` (skip) +- `test-fs-watchfile.js` (skip) + +### FIX-25: Assert polyfill gaps (14 tests) + +**Feasibility: High | Effort: Low** + +Missing: `assert.CallTracker` class (Node.js 14.2+), `assert.match()`/`assert.doesNotMatch()`. Fix: upgrade assert polyfill to v2.1.0+ which includes CallTracker, or implement CallTracker as a post-patch (lightweight class that counts function calls). Also add match/doesNotMatch if missing from polyfill. + +- `test-assert-calltracker-calls.js` (fail) +- `test-assert-calltracker-getCalls.js` (fail) +- `test-assert-calltracker-report.js` (fail) +- `test-assert-calltracker-verify.js` (fail) +- `test-assert-checktag.js` (fail) +- `test-assert-deep-with-error.js` (fail) +- `test-assert-deep.js` (fail) +- `test-assert-fail.js` (fail) +- `test-assert-if-error.js` (fail) +- `test-assert-typedarray-deepequal.js` (fail) +- `test-http-client-defaults.js` (fail) +- `test-http-methods.js` (fail) +- `test-os.js` (fail) +- `test-stream-readable-to-web.js` (fail) + +### FIX-26: Readable.from() support (11 tests) + +**Feasibility: High | Effort: Low** + +`Readable.from()` not in readable-stream v3. This API creates a Readable from an iterable/async iterable. Implementation: add static method on Readable that iterates over source (sync/async), pushes chunks into a Readable stream, handles backpressure. Straightforward ~50 lines of code. + +- `test-fs-promises-file-handle-writeFile.js` (fail) +- `test-fs-promises-writefile.js` (fail) +- `test-readable-from-iterator-closing.js` (fail) +- `test-readable-from.js` (fail) +- `test-stream-drop-take.js` (fail) +- `test-stream-forEach.js` (fail) +- `test-stream-readable-from-web-termination.js` (fail) +- `test-stream-readable-next-no-null.js` (fail) +- `test-stream-readable-to-web-termination.js` (fail) +- `test-stream-reduce.js` (fail) +- `test-stream-toArray.js` (fail) + +### FIX-27: stream.compose() support (2 tests) + +**Feasibility: Medium | Effort: Medium** + +`stream.compose()` accepts variadic stream/async-generator/function arguments and chains them into a Duplex. Must validate stream sequence, handle async generators as Duplex wrappers, propagate errors, and manage lifecycle. Complex API introduced in Node v17.0. + +- `test-stream-compose-operator.js` (fail) +- `test-stream-compose.js` (fail) + +### FIX-28: stream.pipeline() edge cases (2 tests) + +**Feasibility: High | Effort: Low** + +Two edge cases: (1) pipeline() doesn't clean up error listeners on intermediate streams after completion, (2) async generator errors in pipeline not propagated to error callback. Fix: iterate intermediate streams and remove pipeline-attached error listeners after completion; catch async generator errors and pass to callback. + +- `test-stream-pipeline-listeners.js` (fail) +- `test-stream-pipeline-with-empty-string.js` (fail) + +### FIX-29: path.win32 APIs (12 tests) + +**Feasibility: N/A | Effort: N/A** + +These tests check Windows-specific path behavior (backslash separators, drive letters, UNC paths). The sandbox is always Linux. `path.win32` exists as an API object but tests expect native Windows behavior. Recommend marking as permanently out-of-scope — not a real compatibility gap for Linux sandboxes. + +- `test-path-basename.js` (fail) +- `test-path-dirname.js` (fail) +- `test-path-extname.js` (fail) +- `test-path-glob.js` (fail) +- `test-path-isabsolute.js` (fail) +- `test-path-join.js` (fail) +- `test-path-makelong.js` (fail) +- `test-path-normalize.js` (fail) +- `test-path-parse-format.js` (fail) +- `test-path-relative.js` (fail) +- `test-path-resolve.js` (fail) +- `test-path.js` (fail) + +### FIX-30: EventTarget / AbortController gaps (5 tests) + +**Feasibility: High | Effort: Low** + +EventTarget/AbortController are WHATWG built-ins exposed globally. Gaps are minor: `AbortSignal.abort()` static factory method, structuredClone compatibility. Most failures are --expose-gc or process.execPath framework issues, not API gaps. + +- `test-messageevent-brandcheck.js` (fail) +- `test-whatwg-events-add-event-listener-options-passive.js` (fail) +- `test-whatwg-events-add-event-listener-options-signal.js` (fail) +- `test-whatwg-events-customevent.js` (fail) +- `test-whatwg-events-eventtarget-this-of-listener.js` (fail) + +### FIX-31: Console API gaps (4 tests) + +**Feasibility: High | Effort: Low** + +Console constructor lacks option validation: (1) ERR_INVALID_ARG_TYPE for non-numeric groupIndentation, (2) ERR_OUT_OF_RANGE for groupIndentation < 0 or > 1000, (3) diagnostics_channel integration. Fix: add post-patch for Console constructor with option validation. + +- `test-console-diagnostics-channels.js` (fail) +- `test-console-issue-43095.js` (fail) +- `test-console-stdio-setters.js` (fail) +- `test-console-tty-colors.js` (fail) + +### FIX-32: process.on('uncaughtException') handler (9 tests) + +**Feasibility: High | Effort: Medium** + +No mechanism to trigger 'uncaughtException' event when exceptions propagate out of user code. Fix: (1) add global exception handler hook in process.ts that invokes `_emit('uncaughtException', error)`, (2) hook into V8 runtime in `native/v8-runtime/src/execution.rs` to catch exceptions from `execute_script()`, (3) if `setUncaughtExceptionCaptureCallback()` has a callback, invoke it first. If handled, suppress exit; otherwise exit with code 1. + +- `test-events-uncaught-exception-stack.js` (fail) +- `test-exception-handler.js` (fail) +- `test-exception-handler2.js` (fail) +- `test-handle-wrap-close-abort.js` (fail) +- `test-promise-unhandled-default.js` (fail) +- `test-stream-pipe-error-unhandled.js` (fail) +- `test-stream-pipeline-uncaught.js` (fail) +- `test-stream-writable-end-cb-uncaught.js` (fail) +- `test-stream2-finish-pipe-error.js` (fail) + +### FIX-33: process.on('unhandledRejection') handler (1 tests) + +**Feasibility: High | Effort: Medium** + +No unhandled Promise rejection capture. Fix: hook into V8's Promise rejection handler in `native/v8-runtime/src/execution.rs`, emit 'unhandledRejection' event with rejection reason. Node.js 22.x treats unhandled rejections as warnings by default (not fatal), so match that behavior. + +- `test-promise-handled-rejection-no-warning.js` (fail) + +### FIX-34: vm module implementation (84 tests) + +**Feasibility: Not feasible | Effort: N/A** + +The vm module requires creating multiple V8 contexts. The sandbox runs user code in a single V8 isolate with one context. `vm.runInThisContext()` could work (effectively eval), but `vm.runInNewContext()`, `vm.createContext()`, and `vm.Script` with different contexts cannot be implemented without multi-context V8 support. Recommend marking as architectural limitation. + +- `test-assert.js` (fail) +- `test-buffer-alloc.js` (fail) +- `test-buffer-bytelength.js` (fail) +- `test-buffer-from.js` (fail) +- `test-crypto-key-objects-messageport.js` (fail) +- `test-intl-v8BreakIterator.js` (fail) +- `test-querystring.js` (fail) +- `test-vm-access-process-env.js` (fail) +- `test-vm-api-handles-getter-errors.js` (fail) +- `test-vm-attributes-property-not-on-sandbox.js` (fail) +- `test-vm-basic.js` (fail) +- `test-vm-cached-data.js` (fail) +- `test-vm-codegen.js` (fail) +- `test-vm-context-async-script.js` (fail) +- `test-vm-context-dont-contextify.js` (fail) +- `test-vm-context-property-forwarding.js` (fail) +- `test-vm-context.js` (fail) +- `test-vm-create-and-run-in-context.js` (fail) +- `test-vm-create-context-accessors.js` (fail) +- `test-vm-create-context-arg.js` (fail) +- `test-vm-create-context-circular-reference.js` (fail) +- `test-vm-createcacheddata.js` (fail) +- `test-vm-cross-context.js` (fail) +- `test-vm-data-property-writable.js` (fail) +- `test-vm-deleting-property.js` (fail) +- `test-vm-dynamic-import-callback-missing-flag.js` (fail) +- `test-vm-function-declaration.js` (fail) +- `test-vm-function-redefinition.js` (fail) +- `test-vm-getters.js` (fail) +- `test-vm-global-assignment.js` (fail) +- `test-vm-global-configurable-properties.js` (fail) +- `test-vm-global-define-property.js` (fail) +- `test-vm-global-get-own.js` (fail) +- `test-vm-global-identity.js` (fail) +- `test-vm-global-non-writable-properties.js` (fail) +- `test-vm-global-property-enumerator.js` (fail) +- `test-vm-global-property-interceptors.js` (fail) +- `test-vm-global-property-prototype.js` (fail) +- `test-vm-global-setter.js` (fail) +- `test-vm-harmony-symbols.js` (fail) +- `test-vm-indexed-properties.js` (fail) +- `test-vm-inherited_properties.js` (fail) +- `test-vm-is-context.js` (fail) +- `test-vm-low-stack-space.js` (fail) +- `test-vm-measure-memory-lazy.js` (fail) +- `test-vm-measure-memory-multi-context.js` (fail) +- `test-vm-measure-memory.js` (fail) +- `test-vm-module-basic.js` (fail) +- `test-vm-module-cached-data.js` (fail) +- `test-vm-module-dynamic-import.js` (fail) +- `test-vm-module-dynamic-namespace.js` (fail) +- `test-vm-module-errors.js` (fail) +- `test-vm-module-import-meta.js` (fail) +- `test-vm-module-link.js` (fail) +- `test-vm-module-reevaluate.js` (fail) +- `test-vm-module-synthetic.js` (fail) +- `test-vm-new-script-new-context.js` (fail) +- `test-vm-no-dynamic-import-callback.js` (fail) +- `test-vm-not-strict.js` (fail) +- `test-vm-options-validation.js` (fail) +- `test-vm-ownkeys.js` (fail) +- `test-vm-ownpropertynames.js` (fail) +- `test-vm-ownpropertysymbols.js` (fail) +- `test-vm-preserves-property.js` (fail) +- `test-vm-property-not-on-sandbox.js` (fail) +- `test-vm-proxies.js` (fail) +- `test-vm-proxy-failure-CP.js` (fail) +- `test-vm-run-in-new-context.js` (fail) +- `test-vm-script-throw-in-tostring.js` (fail) +- `test-vm-set-property-proxy.js` (fail) +- `test-vm-set-proto-null-on-globalthis.js` (fail) +- `test-vm-sigint-existing-handler.js` (fail) +- `test-vm-sigint.js` (fail) +- `test-vm-source-map-url.js` (fail) +- `test-vm-static-this.js` (fail) +- `test-vm-strict-assign.js` (fail) +- `test-vm-strict-mode.js` (fail) +- `test-vm-symbols.js` (fail) +- `test-vm-syntax-error-message.js` (fail) +- `test-vm-syntax-error-stderr.js` (fail) +- `test-vm-timeout-escape-promise-2.js` (fail) +- `test-vm-timeout-escape-promise-module.js` (fail) +- `test-vm-timeout-escape-promise.js` (fail) +- `test-vm-timeout.js` (skip) + +### FIX-35: worker_threads module (157 tests) + +**Feasibility: Not feasible | Effort: N/A** + +worker_threads requires spawning multiple OS threads with separate V8 isolates and coordinating message passing. The sandbox architecture assumes a single isolate per session. Cannot implement without fundamental architecture changes. Recommend marking as architectural limitation. + +- `test-bootstrap-modules.js` (fail) +- `test-broadcastchannel-custom-inspect.js` (fail) +- `test-buffer-pool-untransferable.js` (fail) +- `test-console.js` (fail) +- `test-datetime-change-notify.js` (fail) +- `test-fs-mkdir.js` (fail) +- `test-fs-whatwg-url.js` (fail) +- `test-fs-write-file-sync.js` (fail) +- `test-no-addons-resolution-condition.js` (fail) +- `test-perf-hooks-worker-timeorigin.js` (fail) +- `test-performance-eventlooputil.js` (fail) +- `test-performance-nodetiming.js` (fail) +- `test-preload-self-referential.js` (fail) +- `test-process-chdir-errormessage.js` (fail) +- `test-process-chdir.js` (fail) +- `test-process-env-tz.js` (fail) +- `test-process-euid-egid.js` (fail) +- `test-process-initgroups.js` (fail) +- `test-process-setgroups.js` (fail) +- `test-process-uid-gid.js` (fail) +- `test-process-umask-mask.js` (fail) +- `test-process-umask.js` (fail) +- `test-require-resolve-opts-paths-relative.js` (fail) +- `test-set-process-debug-port.js` (fail) +- `test-stdio-pipe-redirect.js` (fail) +- `test-webcrypto-cryptokey-workers.js` (fail) +- `test-worker-abort-on-uncaught-exception-terminate.js` (fail) +- `test-worker-abort-on-uncaught-exception.js` (fail) +- `test-worker-arraybuffer-zerofill.js` (fail) +- `test-worker-beforeexit-throw-exit.js` (fail) +- `test-worker-broadcastchannel-wpt.js` (fail) +- `test-worker-broadcastchannel.js` (fail) +- `test-worker-cjs-workerdata.js` (fail) +- `test-worker-cleanexit-with-js.js` (fail) +- `test-worker-cleanexit-with-moduleload.js` (fail) +- `test-worker-cleanup-handles.js` (fail) +- `test-worker-cli-options.js` (fail) +- `test-worker-console-listeners.js` (fail) +- `test-worker-crypto-sign-transfer-result.js` (fail) +- `test-worker-data-url.js` (fail) +- `test-worker-debug.js` (fail) +- `test-worker-dns-terminate-during-query.js` (fail) +- `test-worker-dns-terminate.js` (fail) +- `test-worker-environmentdata.js` (fail) +- `test-worker-error-stack-getter-throws.js` (fail) +- `test-worker-esm-exit.js` (fail) +- `test-worker-esm-missing-main.js` (fail) +- `test-worker-esmodule.js` (fail) +- `test-worker-eval-typescript.js` (fail) +- `test-worker-event.js` (fail) +- `test-worker-execargv-invalid.js` (fail) +- `test-worker-execargv.js` (fail) +- `test-worker-exit-code.js` (fail) +- `test-worker-exit-event-error.js` (fail) +- `test-worker-exit-from-uncaught-exception.js` (fail) +- `test-worker-exit-heapsnapshot.js` (fail) +- `test-worker-fs-stat-watcher.js` (fail) +- `test-worker-hasref.js` (fail) +- `test-worker-heap-snapshot.js` (fail) +- `test-worker-heapdump-failure.js` (fail) +- `test-worker-http2-generic-streams-terminate.js` (fail) +- `test-worker-http2-stream-terminate.js` (fail) +- `test-worker-init-failure.js` (fail) +- `test-worker-invalid-workerdata.js` (fail) +- `test-worker-load-file-with-extension-other-than-js.js` (fail) +- `test-worker-memory.js` (fail) +- `test-worker-message-channel-sharedarraybuffer.js` (fail) +- `test-worker-message-channel.js` (fail) +- `test-worker-message-event.js` (fail) +- `test-worker-message-mark-as-uncloneable.js` (fail) +- `test-worker-message-not-serializable.js` (fail) +- `test-worker-message-port-arraybuffer.js` (fail) +- `test-worker-message-port-close-while-receiving.js` (fail) +- `test-worker-message-port-close.js` (fail) +- `test-worker-message-port-constructor.js` (fail) +- `test-worker-message-port-drain.js` (fail) +- `test-worker-message-port-infinite-message-loop.js` (fail) +- `test-worker-message-port-inspect-during-init-hook.js` (fail) +- `test-worker-message-port-jstransferable-nested-untransferable.js` (fail) +- `test-worker-message-port-message-before-close.js` (fail) +- `test-worker-message-port-message-port-transferring.js` (fail) +- `test-worker-message-port-move.js` (fail) +- `test-worker-message-port-multiple-sharedarraybuffers.js` (fail) +- `test-worker-message-port-receive-message.js` (fail) +- `test-worker-message-port-terminate-transfer-list.js` (fail) +- `test-worker-message-port-transfer-closed.js` (fail) +- `test-worker-message-port-transfer-duplicate.js` (fail) +- `test-worker-message-port-transfer-fake-js-transferable-internal.js` (fail) +- `test-worker-message-port-transfer-fake-js-transferable.js` (fail) +- `test-worker-message-port-transfer-filehandle.js` (fail) +- `test-worker-message-port-transfer-native.js` (fail) +- `test-worker-message-port-transfer-self.js` (fail) +- `test-worker-message-port-transfer-target.js` (fail) +- `test-worker-message-port-transfer-terminate.js` (fail) +- `test-worker-message-port-wasm-module.js` (fail) +- `test-worker-message-port-wasm-threads.js` (fail) +- `test-worker-message-port.js` (fail) +- `test-worker-message-transfer-port-mark-as-untransferable.js` (fail) +- `test-worker-message-type-unknown.js` (fail) +- `test-worker-messageport-hasref.js` (fail) +- `test-worker-messaging-errors-timeout.js` (fail) +- `test-worker-messaging.js` (fail) +- `test-worker-mjs-workerdata.js` (fail) +- `test-worker-name.js` (fail) +- `test-worker-nearheaplimit-deadlock.js` (fail) +- `test-worker-nested-on-process-exit.js` (fail) +- `test-worker-nested-uncaught.js` (fail) +- `test-worker-nexttick-terminate.js` (fail) +- `test-worker-no-sab.js` (fail) +- `test-worker-no-stdin-stdout-interaction.js` (fail) +- `test-worker-node-options.js` (fail) +- `test-worker-non-fatal-uncaught-exception.js` (fail) +- `test-worker-on-process-exit.js` (fail) +- `test-worker-onmessage-not-a-function.js` (fail) +- `test-worker-onmessage.js` (fail) +- `test-worker-parent-port-ref.js` (fail) +- `test-worker-process-argv.js` (fail) +- `test-worker-process-cwd.js` (fail) +- `test-worker-process-env-shared.js` (fail) +- `test-worker-process-env.js` (fail) +- `test-worker-process-exit-async-module.js` (fail) +- `test-worker-ref-onexit.js` (fail) +- `test-worker-ref.js` (fail) +- `test-worker-relative-path-double-dot.js` (fail) +- `test-worker-relative-path.js` (fail) +- `test-worker-resource-limits.js` (fail) +- `test-worker-safe-getters.js` (fail) +- `test-worker-sharedarraybuffer-from-worker-thread.js` (fail) +- `test-worker-stack-overflow-stack-size.js` (fail) +- `test-worker-stack-overflow.js` (fail) +- `test-worker-stdio-flush-inflight.js` (fail) +- `test-worker-stdio-flush.js` (fail) +- `test-worker-stdio-from-preload-module.js` (fail) +- `test-worker-stdio.js` (fail) +- `test-worker-syntax-error-file.js` (fail) +- `test-worker-syntax-error.js` (fail) +- `test-worker-terminate-http2-respond-with-file.js` (fail) +- `test-worker-terminate-microtask-loop.js` (fail) +- `test-worker-terminate-nested.js` (fail) +- `test-worker-terminate-null-handler.js` (fail) +- `test-worker-terminate-ref-public-port.js` (fail) +- `test-worker-terminate-source-map.js` (fail) +- `test-worker-terminate-timers.js` (fail) +- `test-worker-terminate-unrefed.js` (fail) +- `test-worker-track-unmanaged-fds.js` (fail) +- `test-worker-type-check.js` (fail) +- `test-worker-uncaught-exception-async.js` (fail) +- `test-worker-uncaught-exception.js` (fail) +- `test-worker-unref-from-message-during-exit.js` (fail) +- `test-worker-unsupported-path.js` (fail) +- `test-worker-unsupported-things.js` (fail) +- `test-worker-vm-context-terminate.js` (fail) +- `test-worker-voluntarily-exit-followed-by-addition.js` (fail) +- `test-worker-voluntarily-exit-followed-by-throw.js` (fail) +- `test-worker-workerdata-messageport.js` (fail) +- `test-worker-workerdata-sharedarraybuffer.js` (fail) +- `test-worker.js` (fail) + +### FIX-36: async_hooks module (36 tests) + +**Feasibility: Partial | Effort: High** + +async_hooks requires monitoring async resource creation/destruction and execution context switching. Would need V8 Promise hooks, timer tracking, and callback execution monitoring — all requiring runtime instrumentation not currently exposed. AsyncLocalStorage could be partially implemented with simpler context tracking. Full createHook() support is very high effort. Recommend deferring. + +- `test-async-hooks-asyncresource-constructor.js` (fail) +- `test-async-hooks-close-during-destroy.js` (fail) +- `test-async-hooks-constructor.js` (fail) +- `test-async-hooks-correctly-switch-promise-hook.js` (fail) +- `test-async-hooks-disable-during-promise.js` (fail) +- `test-async-hooks-enable-before-promise-resolve.js` (fail) +- `test-async-hooks-enable-disable-enable.js` (fail) +- `test-async-hooks-enable-disable.js` (fail) +- `test-async-hooks-enable-during-promise.js` (fail) +- `test-async-hooks-enable-recursive.js` (fail) +- `test-async-hooks-execution-async-resource-await.js` (fail) +- `test-async-hooks-execution-async-resource.js` (fail) +- `test-async-hooks-http-parser-destroy.js` (fail) +- `test-async-hooks-promise-enable-disable.js` (fail) +- `test-async-hooks-promise-triggerid.js` (fail) +- `test-async-hooks-promise.js` (fail) +- `test-async-hooks-recursive-stack-runInAsyncScope.js` (fail) +- `test-async-hooks-top-level-clearimmediate.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-1.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-2.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-3.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-4.js` (fail) +- `test-async-local-storage-bind.js` (fail) +- `test-async-local-storage-contexts.js` (fail) +- `test-async-local-storage-http-multiclients.js` (fail) +- `test-async-local-storage-snapshot.js` (fail) +- `test-async-wrap-constructor.js` (fail) +- `test-async-wrap-promise-after-enabled.js` (fail) +- `test-async-wrap-uncaughtexception.js` (fail) +- `test-asyncresource-bind.js` (fail) +- `test-emit-after-uncaught-exception.js` (fail) +- `test-eventemitter-asyncresource.js` (fail) +- `test-http-uncaught-from-request-callback.js` (fail) +- `test-messageport-hasref.js` (fail) +- `test-queue-microtask-uncaught-asynchooks.js` (fail) +- `test-stream-writable-samecb-singletick.js` (fail) + +### FIX-38: readline module (18 tests) + +**Feasibility: Medium | Effort: Medium** + +readline is a deferred stub. Implementation requires: createInterface() factory wrapping input/output streams, line-buffering, event handling ('line', 'close', 'SIGINT'), methods (question, pause, resume, close, write). Blocking issue: interactive tests expect stdin input that never arrives. Focus on stateless use cases (PassThrough streams, non-terminal mode). Could implement a minimal subset sufficient for common programmatic use. + +- `test-readline-async-iterators-backpressure.js` (fail) +- `test-readline-async-iterators-destroy.js` (fail) +- `test-readline-async-iterators.js` (fail) +- `test-readline-carriage-return-between-chunks.js` (fail) +- `test-readline-csi.js` (fail) +- `test-readline-emit-keypress-events.js` (fail) +- `test-readline-interface-escapecodetimeout.js` (fail) +- `test-readline-interface-no-trailing-newline.js` (fail) +- `test-readline-interface-recursive-writes.js` (fail) +- `test-readline-interface.js` (fail) +- `test-readline-keys.js` (fail) +- `test-readline-position.js` (fail) +- `test-readline-promises-interface.js` (fail) +- `test-readline-promises-tab-complete.js` (fail) +- `test-readline-reopen.js` (fail) +- `test-readline-set-raw-mode.js` (fail) +- `test-readline-tab-complete.js` (fail) +- `test-readline-undefined-columns.js` (fail) + +### FIX-39: diagnostics_channel module (32 tests) + +**Feasibility: High | Effort: Low** + +diagnostics_channel is a simple pub/sub event system. Implementation: maintain a Map registry, each Channel has subscriber list, `publish(msg)` calls all subscribers, `hasSubscribers` returns true if non-empty. Much simpler than async_hooks. Create `packages/nodejs/src/bridge/diagnostics-channel.ts` with real implementation. Low effort, unlocks 32 tests. + +- `test-diagnostics-channel-bind-store.js` (fail) +- `test-diagnostics-channel-has-subscribers.js` (fail) +- `test-diagnostics-channel-http-server-start.js` (fail) +- `test-diagnostics-channel-http.js` (fail) +- `test-diagnostics-channel-memory-leak.js` (fail) +- `test-diagnostics-channel-module-import-error.js` (fail) +- `test-diagnostics-channel-module-import.js` (fail) +- `test-diagnostics-channel-module-require-error.js` (fail) +- `test-diagnostics-channel-module-require.js` (fail) +- `test-diagnostics-channel-net.js` (fail) +- `test-diagnostics-channel-object-channel-pub-sub.js` (fail) +- `test-diagnostics-channel-process.js` (fail) +- `test-diagnostics-channel-pub-sub.js` (fail) +- `test-diagnostics-channel-safe-subscriber-errors.js` (fail) +- `test-diagnostics-channel-symbol-named.js` (fail) +- `test-diagnostics-channel-sync-unsubscribe.js` (fail) +- `test-diagnostics-channel-tracing-channel-args-types.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback.js` (fail) +- `test-diagnostics-channel-tracing-channel-has-subscribers.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync.js` (fail) +- `test-diagnostics-channel-udp.js` (fail) +- `test-diagnostics-channel-worker-threads.js` (fail) + +--- + +## Tests Not Covered by Any Fix + +### TEST-INFRA: requires Node.js internal test infrastructure (68 tests) + +**Resolution: Partially rescuable (~12-16 tests)** + +~12 tests are glob overrides that should actually pass with specific bug fixes. ~10 reference missing test helpers (benchmark/_cli.js, common/internet.js) that could be vendored. ~8 are ESLint/CI tooling tests (not runtime). ~4 are skip/error cases. Focus on vendoring missing helpers and fixing glob override tests. + +- `test-benchmark-cli.js` (fail) +- `test-eslint-alphabetize-errors.js` (fail) +- `test-eslint-alphabetize-primordials.js` (fail) +- `test-eslint-async-iife-no-unused-result.js` (fail) +- `test-eslint-avoid-prototype-pollution.js` (fail) +- `test-eslint-crypto-check.js` (fail) +- `test-eslint-documented-deprecation-codes.js` (fail) +- `test-eslint-documented-errors.js` (fail) +- `test-eslint-duplicate-requires.js` (fail) +- `test-eslint-eslint-check.js` (fail) +- `test-eslint-inspector-check.js` (fail) +- `test-eslint-lowercase-name-for-primitive.js` (fail) +- `test-eslint-no-array-destructuring.js` (fail) +- `test-eslint-no-unescaped-regexp-dot.js` (fail) +- `test-eslint-non-ascii-character.js` (fail) +- `test-eslint-prefer-assert-iferror.js` (fail) +- `test-eslint-prefer-assert-methods.js` (fail) +- `test-eslint-prefer-common-mustnotcall.js` (fail) +- `test-eslint-prefer-common-mustsucceed.js` (fail) +- `test-eslint-prefer-optional-chaining.js` (fail) +- `test-eslint-prefer-primordials.js` (fail) +- `test-eslint-prefer-proto.js` (fail) +- `test-eslint-prefer-util-format-errors.js` (fail) +- `test-eslint-require-common-first.js` (fail) +- `test-eslint-required-modules.js` (fail) +- `test-http-client-req-error-dont-double-fire.js` (fail) +- `test-inspect-async-hook-setup-at-inspect.js` (fail) +- `test-runner-aliases.js` (fail) +- `test-runner-assert.js` (fail) +- `test-runner-cli-concurrency.js` (fail) +- `test-runner-cli-timeout.js` (fail) +- `test-runner-cli.js` (fail) +- `test-runner-concurrency.js` (fail) +- `test-runner-coverage-source-map.js` (fail) +- `test-runner-coverage-thresholds.js` (fail) +- `test-runner-coverage.js` (fail) +- `test-runner-custom-assertions.js` (fail) +- `test-runner-enable-source-maps-issue.js` (fail) +- `test-runner-error-reporter.js` (fail) +- `test-runner-exit-code.js` (fail) +- `test-runner-extraneous-async-activity.js` (fail) +- `test-runner-filetest-location.js` (fail) +- `test-runner-filter-warning.js` (fail) +- `test-runner-force-exit-failure.js` (fail) +- `test-runner-force-exit-flush.js` (fail) +- `test-runner-import-no-scheme.js` (fail) +- `test-runner-misc.js` (fail) +- `test-runner-mock-timers-date.js` (fail) +- `test-runner-mock-timers-scheduler.js` (fail) +- `test-runner-mock-timers.js` (fail) +- `test-runner-mocking.js` (fail) +- `test-runner-module-mocking.js` (fail) +- `test-runner-no-isolation-filtering.js` (fail) +- `test-runner-option-validation.js` (fail) +- `test-runner-reporters.js` (fail) +- `test-runner-root-after-with-refed-handles.js` (fail) +- `test-runner-root-duration.js` (fail) +- `test-runner-snapshot-file-tests.js` (fail) +- `test-runner-snapshot-tests.js` (fail) +- `test-runner-source-maps-invalid-json.js` (fail) +- `test-runner-string-to-regexp.js` (fail) +- `test-runner-subtest-after-hook.js` (fail) +- `test-runner-test-filepath.js` (fail) +- `test-runner-test-fullname.js` (fail) +- `test-runner-todo-skip-tests.js` (fail) +- `test-runner-typechecking.js` (fail) +- `test-runner-wait-for.js` (fail) +- `test-whatwg-events-event-constructors.js` (fail) + +### NATIVE-ADDON: requires native .node addons (3 tests) + +- `test-http-parser-timeout-reset.js` (fail) +- `test-internal-process-binding.js` (fail) +- `test-process-binding-util.js` (fail) + +### SECURITY: intentionally restricted (1 tests) + +- `test-process-binding-internalbinding-allowlist.js` (fail) + +### VACUOUS: test self-skips without exercising functionality (36 tests) + +- `test-child-process-exec-any-shells-windows.js` (vacuous-pass) +- `test-child-process-stdio-overlapped.js` (vacuous-pass) +- `test-crypto-aes-wrap.js` (vacuous-pass) +- `test-crypto-des3-wrap.js` (vacuous-pass) +- `test-crypto-dh-odd-key.js` (vacuous-pass) +- `test-crypto-dh-shared.js` (vacuous-pass) +- `test-crypto-from-binary.js` (vacuous-pass) +- `test-crypto-keygen-empty-passphrase-no-error.js` (vacuous-pass) +- `test-crypto-keygen-missing-oid.js` (vacuous-pass) +- `test-crypto-keygen-promisify.js` (vacuous-pass) +- `test-crypto-no-algorithm.js` (vacuous-pass) +- `test-crypto-op-during-process-exit.js` (vacuous-pass) +- `test-crypto-padding-aes256.js` (vacuous-pass) +- `test-crypto-publicDecrypt-fails-first-time.js` (vacuous-pass) +- `test-crypto-randomfillsync-regression.js` (vacuous-pass) +- `test-crypto-update-encoding.js` (vacuous-pass) +- `test-debug-process.js` (vacuous-pass) +- `test-dsa-fips-invalid-key.js` (vacuous-pass) +- `test-fs-lchmod.js` (vacuous-pass) +- `test-fs-long-path.js` (vacuous-pass) +- `test-fs-readdir-buffer.js` (vacuous-pass) +- `test-fs-readdir-pipe.js` (vacuous-pass) +- `test-fs-readfilesync-enoent.js` (vacuous-pass) +- `test-fs-realpath-on-substed-drive.js` (vacuous-pass) +- `test-fs-utimes-y2K38.js` (vacuous-pass) +- `test-fs-write-file-invalid-path.js` (vacuous-pass) +- `test-http-dns-error.js` (vacuous-pass) +- `test-macos-app-sandbox.js` (vacuous-pass) +- `test-module-readonly.js` (vacuous-pass) +- `test-module-strip-types.js` (vacuous-pass) +- `test-require-long-path.js` (vacuous-pass) +- `test-spawn-cmd-named-pipe.js` (vacuous-pass) +- `test-strace-openat-openssl.js` (vacuous-pass) +- `test-tick-processor-arguments.js` (vacuous-pass) +- `test-tz-version.js` (vacuous-pass) +- `test-windows-abort-exitcode.js` (vacuous-pass) + +### UNSUPPORTED-MODULE: entire module not implemented (591 tests) + +**Resolution: ~50-100 tests rescuable with net bridge** + +Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridged), tls (~192, feasible with OpenSSL bindings), net (~149, high effort TCP bridge), domain (~50, deprecated, never implement), inspector (~60, never feasible), repl (~75, never feasible), worker (~132, architecture-limited), readline (~19, partially feasible), dgram (~76, low priority), debugger (~25, never feasible), compiler (~15, never feasible), snapshot (~27, never feasible), shadow realm (~10, never feasible), quic (~4, never feasible), eslint (~24, not runtime), permission (~31, not runtime), trace (~35, not runtime), runner (~40, not runtime). Implementing net+tls bridge would rescue a subset of http2/https/tls tests. + +- `test-corepack-version.js` (fail) +- `test-debugger-backtrace.js` (fail) +- `test-debugger-break.js` (fail) +- `test-debugger-breakpoint-exists.js` (fail) +- `test-debugger-clear-breakpoints.js` (fail) +- `test-debugger-exceptions.js` (fail) +- `test-debugger-exec.js` (fail) +- `test-debugger-heap-profiler.js` (fail) +- `test-debugger-list.js` (fail) +- `test-debugger-low-level.js` (fail) +- `test-debugger-object-type-remote-object.js` (fail) +- `test-debugger-pid.js` (fail) +- `test-debugger-preserve-breaks.js` (fail) +- `test-debugger-profile-command.js` (fail) +- `test-debugger-profile.js` (fail) +- `test-debugger-random-port-with-inspect-port.js` (fail) +- `test-debugger-random-port.js` (fail) +- `test-debugger-repeat-last.js` (fail) +- `test-debugger-restart-message.js` (fail) +- `test-debugger-run-after-quit-restart.js` (fail) +- `test-debugger-sb-before-load.js` (fail) +- `test-debugger-scripts.js` (fail) +- `test-debugger-unavailable-port.js` (fail) +- `test-debugger-use-strict.js` (fail) +- `test-debugger-watch-validation.js` (fail) +- `test-debugger-websocket-secret-mismatch.js` (fail) +- `test-dgram-abort-closed.js` (fail) +- `test-dgram-address.js` (fail) +- `test-dgram-bind-default-address.js` (fail) +- `test-dgram-bind-error-repeat.js` (fail) +- `test-dgram-bind-fd-error.js` (fail) +- `test-dgram-bind-fd.js` (fail) +- `test-dgram-bind-socket-close-before-cluster-reply.js` (fail) +- `test-dgram-bind-socket-close-before-lookup.js` (fail) +- `test-dgram-bind.js` (fail) +- `test-dgram-blocklist.js` (fail) +- `test-dgram-bytes-length.js` (fail) +- `test-dgram-close-during-bind.js` (fail) +- `test-dgram-close-in-listening.js` (fail) +- `test-dgram-close-is-not-callback.js` (fail) +- `test-dgram-close-signal.js` (fail) +- `test-dgram-close.js` (fail) +- `test-dgram-cluster-bind-error.js` (fail) +- `test-dgram-cluster-close-during-bind.js` (fail) +- `test-dgram-cluster-close-in-listening.js` (fail) +- `test-dgram-connect-send-callback-buffer-length.js` (fail) +- `test-dgram-connect-send-callback-buffer.js` (fail) +- `test-dgram-connect-send-callback-multi-buffer.js` (fail) +- `test-dgram-connect-send-default-host.js` (fail) +- `test-dgram-connect-send-empty-array.js` (fail) +- `test-dgram-connect-send-empty-buffer.js` (fail) +- `test-dgram-connect-send-empty-packet.js` (fail) +- `test-dgram-connect-send-multi-buffer-copy.js` (fail) +- `test-dgram-connect-send-multi-string-array.js` (fail) +- `test-dgram-connect.js` (fail) +- `test-dgram-create-socket-handle-fd.js` (fail) +- `test-dgram-create-socket-handle.js` (fail) +- `test-dgram-createSocket-type.js` (fail) +- `test-dgram-custom-lookup.js` (fail) +- `test-dgram-deprecation-error.js` (fail) +- `test-dgram-error-message-address.js` (fail) +- `test-dgram-exclusive-implicit-bind.js` (fail) +- `test-dgram-implicit-bind.js` (fail) +- `test-dgram-listen-after-bind.js` (fail) +- `test-dgram-membership.js` (fail) +- `test-dgram-msgsize.js` (fail) +- `test-dgram-multicast-loopback.js` (fail) +- `test-dgram-multicast-set-interface.js` (fail) +- `test-dgram-multicast-setTTL.js` (fail) +- `test-dgram-oob-buffer.js` (fail) +- `test-dgram-recv-error.js` (fail) +- `test-dgram-ref.js` (fail) +- `test-dgram-reuseport.js` (fail) +- `test-dgram-send-address-types.js` (fail) +- `test-dgram-send-bad-arguments.js` (fail) +- `test-dgram-send-callback-buffer-empty-address.js` (fail) +- `test-dgram-send-callback-buffer-length-empty-address.js` (fail) +- `test-dgram-send-callback-buffer-length.js` (fail) +- `test-dgram-send-callback-buffer.js` (fail) +- `test-dgram-send-callback-multi-buffer-empty-address.js` (fail) +- `test-dgram-send-callback-multi-buffer.js` (fail) +- `test-dgram-send-callback-recursive.js` (fail) +- `test-dgram-send-cb-quelches-error.js` (fail) +- `test-dgram-send-default-host.js` (fail) +- `test-dgram-send-empty-array.js` (fail) +- `test-dgram-send-empty-buffer.js` (fail) +- `test-dgram-send-empty-packet.js` (fail) +- `test-dgram-send-error.js` (fail) +- `test-dgram-send-invalid-msg-type.js` (fail) +- `test-dgram-send-multi-buffer-copy.js` (fail) +- `test-dgram-send-multi-string-array.js` (fail) +- `test-dgram-send-queue-info.js` (fail) +- `test-dgram-sendto.js` (fail) +- `test-dgram-setBroadcast.js` (fail) +- `test-dgram-setTTL.js` (fail) +- `test-dgram-socket-buffer-size.js` (fail) +- `test-dgram-udp4.js` (fail) +- `test-dgram-unref-in-cluster.js` (fail) +- `test-dgram-unref.js` (fail) +- `test-inspector-already-activated-cli.js` (fail) +- `test-inspector-async-call-stack-abort.js` (fail) +- `test-inspector-async-call-stack.js` (fail) +- `test-inspector-async-context-brk.js` (fail) +- `test-inspector-async-hook-after-done.js` (fail) +- `test-inspector-async-hook-setup-at-inspect-brk.js` (fail) +- `test-inspector-async-hook-setup-at-signal.js` (fail) +- `test-inspector-async-stack-traces-promise-then.js` (fail) +- `test-inspector-async-stack-traces-set-interval.js` (fail) +- `test-inspector-bindings.js` (fail) +- `test-inspector-break-e.js` (fail) +- `test-inspector-break-when-eval.js` (fail) +- `test-inspector-close-worker.js` (fail) +- `test-inspector-connect-main-thread.js` (fail) +- `test-inspector-connect-to-main-thread.js` (fail) +- `test-inspector-console-top-frame.js` (fail) +- `test-inspector-console.js` (fail) +- `test-inspector-contexts.js` (fail) +- `test-inspector-debug-brk-flag.js` (fail) +- `test-inspector-debug-end.js` (fail) +- `test-inspector-emit-protocol-event.js` (fail) +- `test-inspector-enabled.js` (fail) +- `test-inspector-esm.js` (fail) +- `test-inspector-exception.js` (fail) +- `test-inspector-exit-worker-in-wait-for-connection.js` (fail) +- `test-inspector-exit-worker-in-wait-for-connection2.js` (fail) +- `test-inspector-has-idle.js` (fail) +- `test-inspector-has-inspector-false.js` (fail) +- `test-inspector-heap-allocation-tracker.js` (fail) +- `test-inspector-heapdump.js` (fail) +- `test-inspector-inspect-brk-node.js` (fail) +- `test-inspector-invalid-args.js` (fail) +- `test-inspector-ip-detection.js` (fail) +- `test-inspector-module.js` (fail) +- `test-inspector-multisession-js.js` (fail) +- `test-inspector-multisession-ws.js` (fail) +- `test-inspector-network-fetch.js` (fail) +- `test-inspector-network-http.js` (fail) +- `test-inspector-not-blocked-on-idle.js` (fail) +- `test-inspector-open-coverage.js` (fail) +- `test-inspector-open-port-integer-overflow.js` (fail) +- `test-inspector-open.js` (fail) +- `test-inspector-overwrite-config.js` (fail) +- `test-inspector-port-zero-cluster.js` (fail) +- `test-inspector-port-zero.js` (fail) +- `test-inspector-promises.js` (fail) +- `test-inspector-reported-host.js` (fail) +- `test-inspector-resource-name-to-url.js` (fail) +- `test-inspector-runtime-evaluate-with-timeout.js` (fail) +- `test-inspector-scriptparsed-context.js` (fail) +- `test-inspector-stop-profile-after-done.js` (fail) +- `test-inspector-stops-no-file.js` (fail) +- `test-inspector-stress-http.js` (fail) +- `test-inspector-strip-types.js` (fail) +- `test-inspector-tracing-domain.js` (fail) +- `test-inspector-vm-global-accessors-getter-sideeffect.js` (fail) +- `test-inspector-vm-global-accessors-sideeffects.js` (fail) +- `test-inspector-wait-for-connection.js` (fail) +- `test-inspector-waiting-for-disconnect.js` (fail) +- `test-inspector-workers-flat-list.js` (fail) +- `test-net-access-byteswritten.js` (fail) +- `test-net-after-close.js` (fail) +- `test-net-allow-half-open.js` (fail) +- `test-net-autoselectfamily-attempt-timeout-cli-option.js` (fail) +- `test-net-autoselectfamily-attempt-timeout-default-value.js` (fail) +- `test-net-autoselectfamily-commandline-option.js` (fail) +- `test-net-autoselectfamily-default.js` (fail) +- `test-net-autoselectfamily-ipv4first.js` (fail) +- `test-net-autoselectfamily.js` (fail) +- `test-net-better-error-messages-listen-path.js` (fail) +- `test-net-better-error-messages-listen.js` (fail) +- `test-net-better-error-messages-path.js` (fail) +- `test-net-better-error-messages-port-hostname.js` (fail) +- `test-net-binary.js` (fail) +- `test-net-bind-twice.js` (fail) +- `test-net-blocklist.js` (fail) +- `test-net-buffersize.js` (fail) +- `test-net-bytes-read.js` (fail) +- `test-net-bytes-stats.js` (fail) +- `test-net-bytes-written-large.js` (fail) +- `test-net-can-reset-timeout.js` (fail) +- `test-net-child-process-connect-reset.js` (fail) +- `test-net-client-bind-twice.js` (fail) +- `test-net-connect-abort-controller.js` (fail) +- `test-net-connect-buffer.js` (fail) +- `test-net-connect-buffer2.js` (fail) +- `test-net-connect-call-socket-connect.js` (fail) +- `test-net-connect-immediate-destroy.js` (fail) +- `test-net-connect-immediate-finish.js` (fail) +- `test-net-connect-keepalive.js` (fail) +- `test-net-connect-memleak.js` (fail) +- `test-net-connect-no-arg.js` (fail) +- `test-net-connect-nodelay.js` (fail) +- `test-net-connect-options-allowhalfopen.js` (fail) +- `test-net-connect-options-fd.js` (fail) +- `test-net-connect-options-invalid.js` (fail) +- `test-net-connect-options-path.js` (fail) +- `test-net-connect-options-port.js` (fail) +- `test-net-connect-paused-connection.js` (fail) +- `test-net-connect-reset-after-destroy.js` (fail) +- `test-net-connect-reset-before-connected.js` (fail) +- `test-net-connect-reset-until-connected.js` (fail) +- `test-net-connect-reset.js` (fail) +- `test-net-deprecated-setsimultaneousaccepts.js` (fail) +- `test-net-dns-custom-lookup.js` (fail) +- `test-net-dns-error.js` (fail) +- `test-net-dns-lookup-skip.js` (fail) +- `test-net-dns-lookup.js` (fail) +- `test-net-during-close.js` (fail) +- `test-net-eaddrinuse.js` (fail) +- `test-net-end-close.js` (fail) +- `test-net-end-destroyed.js` (fail) +- `test-net-end-without-connect.js` (fail) +- `test-net-error-twice.js` (fail) +- `test-net-isip.js` (fail) +- `test-net-isipv4.js` (fail) +- `test-net-isipv6.js` (fail) +- `test-net-keepalive.js` (fail) +- `test-net-large-string.js` (fail) +- `test-net-listen-after-destroying-stdin.js` (fail) +- `test-net-listen-close-server-callback-is-not-function.js` (fail) +- `test-net-listen-close-server.js` (fail) +- `test-net-listen-error.js` (fail) +- `test-net-listen-exclusive-random-ports.js` (fail) +- `test-net-listen-fd0.js` (fail) +- `test-net-listen-handle-in-cluster-1.js` (fail) +- `test-net-listen-handle-in-cluster-2.js` (fail) +- `test-net-listen-invalid-port.js` (fail) +- `test-net-listen-twice.js` (fail) +- `test-net-listening.js` (fail) +- `test-net-local-address-port.js` (fail) +- `test-net-localerror.js` (fail) +- `test-net-normalize-args.js` (fail) +- `test-net-onread-static-buffer.js` (fail) +- `test-net-options-lookup.js` (fail) +- `test-net-pause-resume-connecting.js` (fail) +- `test-net-perf_hooks.js` (fail) +- `test-net-persistent-keepalive.js` (fail) +- `test-net-persistent-nodelay.js` (fail) +- `test-net-persistent-ref-unref.js` (fail) +- `test-net-pingpong.js` (fail) +- `test-net-pipe-connect-errors.js` (fail) +- `test-net-reconnect.js` (fail) +- `test-net-remote-address-port.js` (fail) +- `test-net-remote-address.js` (fail) +- `test-net-reuseport.js` (fail) +- `test-net-server-blocklist.js` (fail) +- `test-net-server-call-listen-multiple-times.js` (fail) +- `test-net-server-capture-rejection.js` (fail) +- `test-net-server-close-before-calling-lookup-callback.js` (fail) +- `test-net-server-close-before-ipc-response.js` (fail) +- `test-net-server-close.js` (fail) +- `test-net-server-drop-connections-in-cluster.js` (fail) +- `test-net-server-drop-connections.js` (fail) +- `test-net-server-keepalive.js` (fail) +- `test-net-server-listen-handle.js` (fail) +- `test-net-server-listen-options-signal.js` (fail) +- `test-net-server-listen-options.js` (fail) +- `test-net-server-listen-path.js` (fail) +- `test-net-server-listen-remove-callback.js` (fail) +- `test-net-server-max-connections-close-makes-more-available.js` (fail) +- `test-net-server-max-connections.js` (fail) +- `test-net-server-nodelay.js` (fail) +- `test-net-server-options.js` (fail) +- `test-net-server-pause-on-connect.js` (fail) +- `test-net-server-reset.js` (fail) +- `test-net-server-simultaneous-accepts-produce-warning-once.js` (fail) +- `test-net-server-try-ports.js` (fail) +- `test-net-server-unref-persistent.js` (fail) +- `test-net-server-unref.js` (fail) +- `test-net-settimeout.js` (fail) +- `test-net-socket-byteswritten.js` (fail) +- `test-net-socket-close-after-end.js` (fail) +- `test-net-socket-connect-invalid-autoselectfamily.js` (fail) +- `test-net-socket-connect-invalid-autoselectfamilyattempttimeout.js` (fail) +- `test-net-socket-connect-without-cb.js` (fail) +- `test-net-socket-connecting.js` (fail) +- `test-net-socket-constructor.js` (fail) +- `test-net-socket-destroy-send.js` (fail) +- `test-net-socket-destroy-twice.js` (fail) +- `test-net-socket-end-before-connect.js` (fail) +- `test-net-socket-end-callback.js` (fail) +- `test-net-socket-local-address.js` (fail) +- `test-net-socket-no-halfopen-enforcer.js` (fail) +- `test-net-socket-ready-without-cb.js` (fail) +- `test-net-socket-reset-send.js` (fail) +- `test-net-socket-reset-twice.js` (fail) +- `test-net-socket-setnodelay.js` (fail) +- `test-net-socket-timeout-unref.js` (fail) +- `test-net-socket-timeout.js` (fail) +- `test-net-socket-write-after-close.js` (fail) +- `test-net-socket-write-error.js` (fail) +- `test-net-stream.js` (fail) +- `test-net-sync-cork.js` (fail) +- `test-net-throttle.js` (fail) +- `test-net-timeout-no-handle.js` (fail) +- `test-net-writable.js` (fail) +- `test-net-write-after-close.js` (fail) +- `test-net-write-after-end-nt.js` (fail) +- `test-net-write-arguments.js` (fail) +- `test-net-write-cb-on-destroy-before-connect.js` (fail) +- `test-net-write-connect-write.js` (fail) +- `test-net-write-fully-async-buffer.js` (fail) +- `test-net-write-fully-async-hex-string.js` (fail) +- `test-net-write-slow.js` (fail) +- `test-npm-version.js` (fail) +- `test-quic-internal-endpoint-listen-defaults.js` (fail) +- `test-quic-internal-endpoint-options.js` (fail) +- `test-quic-internal-endpoint-stats-state.js` (fail) +- `test-quic-internal-setcallbacks.js` (fail) +- `test-repl-array-prototype-tempering.js` (fail) +- `test-repl-autocomplete.js` (fail) +- `test-repl-autolibs.js` (fail) +- `test-repl-clear-immediate-crash.js` (fail) +- `test-repl-cli-eval.js` (fail) +- `test-repl-colors.js` (fail) +- `test-repl-context.js` (fail) +- `test-repl-definecommand.js` (fail) +- `test-repl-domain.js` (fail) +- `test-repl-dynamic-import.js` (fail) +- `test-repl-editor.js` (fail) +- `test-repl-empty.js` (fail) +- `test-repl-end-emits-exit.js` (fail) +- `test-repl-envvars.js` (fail) +- `test-repl-eval.js` (fail) +- `test-repl-function-definition-edge-case.js` (fail) +- `test-repl-harmony.js` (fail) +- `test-repl-history-navigation.js` (fail) +- `test-repl-history-perm.js` (fail) +- `test-repl-import-referrer.js` (fail) +- `test-repl-inspect-defaults.js` (fail) +- `test-repl-inspector.js` (fail) +- `test-repl-let-process.js` (fail) +- `test-repl-load-multiline-no-trailing-newline.js` (fail) +- `test-repl-load-multiline.js` (fail) +- `test-repl-mode.js` (fail) +- `test-repl-multiline.js` (fail) +- `test-repl-no-terminal.js` (fail) +- `test-repl-null-thrown.js` (fail) +- `test-repl-null.js` (fail) +- `test-repl-options.js` (fail) +- `test-repl-permission-model.js` (fail) +- `test-repl-persistent-history.js` (fail) +- `test-repl-preprocess-top-level-await.js` (fail) +- `test-repl-pretty-custom-stack.js` (fail) +- `test-repl-pretty-stack-custom-writer.js` (fail) +- `test-repl-pretty-stack.js` (fail) +- `test-repl-preview-newlines.js` (fail) +- `test-repl-preview-without-inspector.js` (fail) +- `test-repl-preview.js` (fail) +- `test-repl-programmatic-history.js` (fail) +- `test-repl-recoverable.js` (fail) +- `test-repl-require-after-write.js` (fail) +- `test-repl-require-cache.js` (fail) +- `test-repl-require-context.js` (fail) +- `test-repl-require-self-referential.js` (fail) +- `test-repl-require.js` (fail) +- `test-repl-reset-event.js` (fail) +- `test-repl-reverse-search.js` (fail) +- `test-repl-save-load.js` (fail) +- `test-repl-setprompt.js` (fail) +- `test-repl-sigint-nested-eval.js` (fail) +- `test-repl-sigint.js` (fail) +- `test-repl-strict-mode-previews.js` (fail) +- `test-repl-syntax-error-handling.js` (fail) +- `test-repl-syntax-error-stack.js` (fail) +- `test-repl-tab-complete-crash.js` (fail) +- `test-repl-tab-complete-import.js` (fail) +- `test-repl-tab-complete-nested-repls.js` (fail) +- `test-repl-tab-complete-no-warn.js` (fail) +- `test-repl-tab-complete-on-editor-mode.js` (fail) +- `test-repl-tab-complete.js` (fail) +- `test-repl-tab.js` (fail) +- `test-repl-throw-null-or-undefined.js` (fail) +- `test-repl-top-level-await.js` (fail) +- `test-repl-uncaught-exception-async.js` (fail) +- `test-repl-uncaught-exception-evalcallback.js` (fail) +- `test-repl-uncaught-exception-standalone.js` (fail) +- `test-repl-uncaught-exception.js` (fail) +- `test-repl-underscore.js` (fail) +- `test-repl-unexpected-token-recoverable.js` (fail) +- `test-repl-unsafe-array-iteration.js` (fail) +- `test-repl-unsupported-option.js` (fail) +- `test-repl-use-global.js` (fail) +- `test-tls-0-dns-altname.js` (fail) +- `test-tls-add-context.js` (fail) +- `test-tls-addca.js` (fail) +- `test-tls-alpn-server-client.js` (fail) +- `test-tls-async-cb-after-socket-end.js` (fail) +- `test-tls-basic-validations.js` (fail) +- `test-tls-buffersize.js` (fail) +- `test-tls-ca-concat.js` (fail) +- `test-tls-canonical-ip.js` (fail) +- `test-tls-cert-chains-concat.js` (fail) +- `test-tls-cert-chains-in-ca.js` (fail) +- `test-tls-cert-ext-encoding.js` (fail) +- `test-tls-cert-regression.js` (fail) +- `test-tls-check-server-identity.js` (fail) +- `test-tls-cipher-list.js` (fail) +- `test-tls-cli-max-version-1.2.js` (fail) +- `test-tls-cli-max-version-1.3.js` (fail) +- `test-tls-cli-min-max-conflict.js` (fail) +- `test-tls-cli-min-version-1.0.js` (fail) +- `test-tls-cli-min-version-1.1.js` (fail) +- `test-tls-cli-min-version-1.2.js` (fail) +- `test-tls-cli-min-version-1.3.js` (fail) +- `test-tls-client-abort.js` (fail) +- `test-tls-client-abort2.js` (fail) +- `test-tls-client-allow-partial-trust-chain.js` (fail) +- `test-tls-client-auth.js` (fail) +- `test-tls-client-default-ciphers.js` (fail) +- `test-tls-client-destroy-soon.js` (fail) +- `test-tls-client-getephemeralkeyinfo.js` (fail) +- `test-tls-client-mindhsize.js` (fail) +- `test-tls-client-reject-12.js` (fail) +- `test-tls-client-reject.js` (fail) +- `test-tls-client-renegotiation-13.js` (fail) +- `test-tls-client-resume-12.js` (fail) +- `test-tls-client-resume.js` (fail) +- `test-tls-client-verify.js` (fail) +- `test-tls-clientcertengine-invalid-arg-type.js` (fail) +- `test-tls-clientcertengine-unsupported.js` (fail) +- `test-tls-close-error.js` (fail) +- `test-tls-close-event-after-write.js` (fail) +- `test-tls-close-notify.js` (fail) +- `test-tls-cnnic-whitelist.js` (fail) +- `test-tls-connect-abort-controller.js` (fail) +- `test-tls-connect-allow-half-open-option.js` (fail) +- `test-tls-connect-given-socket.js` (fail) +- `test-tls-connect-hints-option.js` (fail) +- `test-tls-connect-hwm-option.js` (fail) +- `test-tls-connect-memleak.js` (fail) +- `test-tls-connect-no-host.js` (fail) +- `test-tls-connect-pipe.js` (fail) +- `test-tls-connect-secure-context.js` (fail) +- `test-tls-connect-simple.js` (fail) +- `test-tls-connect-stream-writes.js` (fail) +- `test-tls-connect-timeout-option.js` (fail) +- `test-tls-delayed-attach-error.js` (fail) +- `test-tls-delayed-attach.js` (fail) +- `test-tls-destroy-stream-12.js` (fail) +- `test-tls-destroy-stream.js` (fail) +- `test-tls-disable-renegotiation.js` (fail) +- `test-tls-econnreset.js` (fail) +- `test-tls-empty-sni-context.js` (fail) +- `test-tls-enable-keylog-cli.js` (fail) +- `test-tls-enable-trace-cli.js` (fail) +- `test-tls-enable-trace.js` (fail) +- `test-tls-env-bad-extra-ca.js` (fail) +- `test-tls-env-extra-ca-no-crypto.js` (fail) +- `test-tls-env-extra-ca-with-options.js` (fail) +- `test-tls-env-extra-ca.js` (fail) +- `test-tls-error-servername.js` (fail) +- `test-tls-error-stack.js` (fail) +- `test-tls-exportkeyingmaterial.js` (fail) +- `test-tls-external-accessor.js` (fail) +- `test-tls-fast-writing.js` (fail) +- `test-tls-finished.js` (fail) +- `test-tls-friendly-error-message.js` (fail) +- `test-tls-generic-stream.js` (fail) +- `test-tls-getcertificate-x509.js` (fail) +- `test-tls-getcipher.js` (fail) +- `test-tls-getprotocol.js` (fail) +- `test-tls-handshake-error.js` (fail) +- `test-tls-handshake-exception.js` (fail) +- `test-tls-handshake-nohang.js` (fail) +- `test-tls-hello-parser-failure.js` (fail) +- `test-tls-honorcipherorder.js` (fail) +- `test-tls-inception.js` (fail) +- `test-tls-interleave.js` (fail) +- `test-tls-invalid-pfx.js` (fail) +- `test-tls-invoke-queued.js` (fail) +- `test-tls-ip-servername-deprecation.js` (fail) +- `test-tls-js-stream.js` (fail) +- `test-tls-junk-closes-server.js` (fail) +- `test-tls-junk-server.js` (fail) +- `test-tls-key-mismatch.js` (fail) +- `test-tls-keyengine-invalid-arg-type.js` (fail) +- `test-tls-keyengine-unsupported.js` (fail) +- `test-tls-keylog-tlsv13.js` (fail) +- `test-tls-legacy-deprecated.js` (fail) +- `test-tls-max-send-fragment.js` (fail) +- `test-tls-min-max-version.js` (fail) +- `test-tls-multi-key.js` (fail) +- `test-tls-multi-pfx.js` (fail) +- `test-tls-multiple-cas-as-string.js` (fail) +- `test-tls-net-connect-prefer-path.js` (fail) +- `test-tls-net-socket-keepalive-12.js` (fail) +- `test-tls-net-socket-keepalive.js` (fail) +- `test-tls-no-cert-required.js` (fail) +- `test-tls-no-rsa-key.js` (fail) +- `test-tls-no-sslv23.js` (fail) +- `test-tls-no-sslv3.js` (fail) +- `test-tls-on-empty-socket.js` (fail) +- `test-tls-onread-static-buffer.js` (fail) +- `test-tls-options-boolean-check.js` (fail) +- `test-tls-over-http-tunnel.js` (fail) +- `test-tls-passphrase.js` (fail) +- `test-tls-pause.js` (fail) +- `test-tls-peer-certificate-encoding.js` (fail) +- `test-tls-peer-certificate-multi-keys.js` (fail) +- `test-tls-peer-certificate.js` (fail) +- `test-tls-pfx-authorizationerror.js` (fail) +- `test-tls-psk-circuit.js` (fail) +- `test-tls-psk-errors.js` (fail) +- `test-tls-reduced-SECLEVEL-in-cipher.js` (fail) +- `test-tls-reinitialize-listeners.js` (fail) +- `test-tls-request-timeout.js` (fail) +- `test-tls-retain-handle-no-abort.js` (fail) +- `test-tls-reuse-host-from-socket.js` (fail) +- `test-tls-root-certificates.js` (fail) +- `test-tls-secure-context-usage-order.js` (fail) +- `test-tls-secure-session.js` (fail) +- `test-tls-securepair-fiftharg.js` (fail) +- `test-tls-securepair-leak.js` (fail) +- `test-tls-server-capture-rejection.js` (fail) +- `test-tls-server-connection-server.js` (fail) +- `test-tls-server-failed-handshake-emits-clienterror.js` (fail) +- `test-tls-server-parent-constructor-options.js` (fail) +- `test-tls-server-setkeycert.js` (fail) +- `test-tls-server-setoptions-clientcertengine.js` (fail) +- `test-tls-set-ciphers-error.js` (fail) +- `test-tls-set-encoding.js` (fail) +- `test-tls-set-secure-context.js` (fail) +- `test-tls-set-sigalgs.js` (fail) +- `test-tls-sni-option.js` (fail) +- `test-tls-sni-server-client.js` (fail) +- `test-tls-sni-servername.js` (fail) +- `test-tls-snicallback-error.js` (fail) +- `test-tls-socket-allow-half-open-option.js` (fail) +- `test-tls-socket-close.js` (fail) +- `test-tls-socket-constructor-alpn-options-parsing.js` (fail) +- `test-tls-socket-default-options.js` (fail) +- `test-tls-socket-destroy.js` (fail) +- `test-tls-socket-failed-handshake-emits-error.js` (fail) +- `test-tls-socket-snicallback-without-server.js` (fail) +- `test-tls-startcom-wosign-whitelist.js` (fail) +- `test-tls-starttls-server.js` (fail) +- `test-tls-streamwrap-buffersize.js` (fail) +- `test-tls-ticket-12.js` (fail) +- `test-tls-ticket-cluster.js` (fail) +- `test-tls-ticket-invalid-arg.js` (fail) +- `test-tls-ticket.js` (fail) +- `test-tls-timeout-server-2.js` (fail) +- `test-tls-timeout-server.js` (fail) +- `test-tls-tlswrap-segfault-2.js` (fail) +- `test-tls-tlswrap-segfault.js` (fail) +- `test-tls-translate-peer-certificate.js` (fail) +- `test-tls-transport-destroy-after-own-gc.js` (fail) +- `test-tls-use-after-free-regression.js` (fail) +- `test-tls-wrap-econnreset-localaddress.js` (fail) +- `test-tls-wrap-econnreset-pipe.js` (fail) +- `test-tls-wrap-econnreset-socket.js` (fail) +- `test-tls-wrap-econnreset.js` (fail) +- `test-tls-wrap-event-emmiter.js` (fail) +- `test-tls-wrap-no-abort.js` (fail) +- `test-tls-wrap-timeout.js` (fail) +- `test-tls-write-error.js` (fail) +- `test-tls-writewrap-leak.js` (fail) +- `test-tls-zero-clear-in.js` (fail) +- `test-trace-atomic-deprecation.js` (fail) +- `test-trace-atomics-wait.js` (fail) +- `test-trace-env-stack.js` (fail) +- `test-trace-env.js` (fail) +- `test-trace-events-all.js` (fail) +- `test-trace-events-api-worker-disabled.js` (fail) +- `test-trace-events-async-hooks.js` (fail) +- `test-trace-events-binding.js` (fail) +- `test-trace-events-bootstrap.js` (fail) +- `test-trace-events-category-used.js` (fail) +- `test-trace-events-console.js` (fail) +- `test-trace-events-dynamic-enable-workers-disabled.js` (fail) +- `test-trace-events-dynamic-enable.js` (fail) +- `test-trace-events-environment.js` (fail) +- `test-trace-events-file-pattern.js` (fail) +- `test-trace-events-fs-async.js` (fail) +- `test-trace-events-fs-sync.js` (fail) +- `test-trace-events-get-category-enabled-buffer.js` (fail) +- `test-trace-events-http.js` (fail) +- `test-trace-events-metadata.js` (fail) +- `test-trace-events-net-abstract-socket.js` (fail) +- `test-trace-events-net.js` (fail) +- `test-trace-events-none.js` (fail) +- `test-trace-events-process-exit.js` (fail) +- `test-trace-events-promises.js` (fail) +- `test-trace-events-threadpool.js` (fail) +- `test-trace-events-v8.js` (fail) +- `test-trace-events-vm.js` (fail) +- `test-trace-events-worker-metadata-with-name.js` (fail) +- `test-trace-events-worker-metadata.js` (fail) +- `test-trace-exit-stack-limit.js` (fail) +- `test-trace-exit.js` (fail) + +### UNSUPPORTED-API: specific API not implemented (63 tests) + +**Resolution: ~14 tests rescuable** + +~7 tests rescued with stream enhancements (Readable.from, compose, getDefaultHighWaterMark). ~3 rescued with utility polyfills (MIMEType, duplexPair). ~4 rescued with HTTP polyfill expansion. Remaining ~44 are architecture-limited (fork IPC, fs.watch, v8.promiseHooks, snapshot APIs). + +- `test-buffer-constructor-outside-node-modules.js` (fail) +- `test-compile-cache-api-env.js` (fail) +- `test-compile-cache-api-error.js` (fail) +- `test-compile-cache-api-flush.js` (fail) +- `test-compile-cache-api-permission.js` (fail) +- `test-compile-cache-api-success.js` (fail) +- `test-compile-cache-api-tmpdir.js` (fail) +- `test-compile-cache-bad-syntax.js` (fail) +- `test-compile-cache-disable.js` (fail) +- `test-compile-cache-dynamic-import.js` (fail) +- `test-compile-cache-esm.js` (fail) +- `test-compile-cache-existing-directory.js` (fail) +- `test-compile-cache-permission-allowed.js` (fail) +- `test-compile-cache-permission-disallowed.js` (fail) +- `test-compile-cache-success.js` (fail) +- `test-compile-cache-updated-file.js` (fail) +- `test-fs-promises-file-handle-dispose.js` (fail) +- `test-http-import-websocket.js` (fail) +- `test-messagechannel.js` (fail) +- `test-mime-whatwg.js` (fail) +- `test-promise-hook-create-hook.js` (fail) +- `test-promise-hook-exceptions.js` (fail) +- `test-promise-hook-on-after.js` (fail) +- `test-promise-hook-on-before.js` (fail) +- `test-promise-hook-on-init.js` (fail) +- `test-shadow-realm-allowed-builtin-modules.js` (fail) +- `test-shadow-realm-custom-loaders.js` (fail) +- `test-shadow-realm-gc-module.js` (fail) +- `test-shadow-realm-gc.js` (fail) +- `test-shadow-realm-globals.js` (fail) +- `test-shadow-realm-import-value-resolve.js` (fail) +- `test-shadow-realm-module.js` (fail) +- `test-shadow-realm-preload-module.js` (fail) +- `test-shadow-realm-prepare-stack-trace.js` (fail) +- `test-shadow-realm.js` (fail) +- `test-snapshot-api.js` (fail) +- `test-snapshot-argv1.js` (fail) +- `test-snapshot-basic.js` (fail) +- `test-snapshot-child-process-sync.js` (fail) +- `test-snapshot-cjs-main.js` (fail) +- `test-snapshot-config.js` (fail) +- `test-snapshot-console.js` (fail) +- `test-snapshot-coverage.js` (fail) +- `test-snapshot-cwd.js` (fail) +- `test-snapshot-dns-lookup-localhost-promise.js` (fail) +- `test-snapshot-dns-lookup-localhost.js` (fail) +- `test-snapshot-dns-resolve-localhost-promise.js` (fail) +- `test-snapshot-dns-resolve-localhost.js` (fail) +- `test-snapshot-error.js` (fail) +- `test-snapshot-eval.js` (fail) +- `test-snapshot-gzip.js` (fail) +- `test-snapshot-incompatible.js` (fail) +- `test-snapshot-namespaced-builtin.js` (fail) +- `test-snapshot-net.js` (fail) +- `test-snapshot-reproducible.js` (fail) +- `test-snapshot-stack-trace-limit-mutation.js` (fail) +- `test-snapshot-stack-trace-limit.js` (fail) +- `test-snapshot-typescript.js` (fail) +- `test-snapshot-umd.js` (fail) +- `test-snapshot-warning.js` (fail) +- `test-snapshot-weak-reference.js` (fail) +- `test-snapshot-worker.js` (fail) +- `test-websocket.js` (fail) + +### HANGS: test hangs/timeouts, needs investigation (5 tests) + +**Resolution: Needs investigation** + +5 tests hang after the native ESM rebase. Root cause likely interaction between microtask drain loop and specific stream/fs/zlib patterns. These are regressions that should be fixable by adjusting event loop drain behavior in `native/v8-runtime/src/session.rs`. + +- `test-fs-read-stream-fd-leak.js` (skip) +- `test-next-tick-intentional-starvation.js` (skip) +- `test-stream-readable-object-multi-push-async.js` (skip) +- `test-timers-interval-throw.js` (skip) +- `test-util-inspect-long-running.js` (skip) + +### OTHER: uncategorized (94 tests) + +**Resolution: Needs reclassification** + +94 tests not yet mapped to a specific fix category. These should be individually investigated and assigned to existing FIX categories or marked as out-of-scope. + +- `test-assert-async.js` (fail) +- `test-blob-createobjecturl.js` (fail) +- `test-blob-file-backed.js` (fail) +- `test-common-must-not-call.js` (fail) +- `test-crypto-ecb.js` (fail) +- `test-crypto-keygen-async-dsa-key-object.js` (fail) +- `test-crypto-keygen-async-dsa.js` (fail) +- `test-domexception-cause.js` (fail) +- `test-event-emitter-error-monitor.js` (fail) +- `test-event-emitter-errors.js` (fail) +- `test-event-emitter-remove-all-listeners.js` (fail) +- `test-event-emitter-special-event-names.js` (fail) +- `test-event-target.js` (fail) +- `test-events-getmaxlisteners.js` (fail) +- `test-file.js` (fail) +- `test-fs-append-file-sync.js` (fail) +- `test-fs-buffertype-writesync.js` (fail) +- `test-fs-close-errors.js` (fail) +- `test-fs-exists.js` (fail) +- `test-fs-make-callback.js` (fail) +- `test-fs-makeStatsCallback.js` (fail) +- `test-fs-non-number-arguments-throw.js` (fail) +- `test-fs-open.js` (fail) +- `test-fs-opendir.js` (fail) +- `test-fs-read-stream-file-handle.js` (fail) +- `test-fs-read-stream-inherit.js` (fail) +- `test-fs-read-stream-throw-type-error.js` (fail) +- `test-fs-read-stream.js` (fail) +- `test-fs-readSync-optional-params.js` (fail) +- `test-fs-readv.js` (fail) +- `test-fs-statfs.js` (fail) +- `test-fs-stream-fs-options.js` (fail) +- `test-fs-stream-options.js` (fail) +- `test-fs-timestamp-parsing-error.js` (fail) +- `test-fs-utimes.js` (fail) +- `test-fs-write-stream-throw-type-error.js` (fail) +- `test-fs-write-stream.js` (fail) +- `test-fs-write-sync-optional-params.js` (fail) +- `test-fs-writev-sync.js` (fail) +- `test-fs-writev.js` (fail) +- `test-http-outgoing-internal-headernames-getter.js` (fail) +- `test-http-outgoing-message-inheritance.js` (fail) +- `test-http-server-response-standalone.js` (fail) +- `test-icu-minimum-version.js` (fail) +- `test-inspector.js` (fail) +- `test-module-builtin.js` (fail) +- `test-module-create-require-multibyte.js` (fail) +- `test-module-create-require.js` (fail) +- `test-module-globalpaths-nodepath.js` (fail) +- `test-module-isBuiltin.js` (fail) +- `test-module-multi-extensions.js` (fail) +- `test-module-nodemodulepaths.js` (fail) +- `test-module-prototype-mutation.js` (fail) +- `test-module-relative-lookup.js` (fail) +- `test-module-stat.js` (fail) +- `test-process-features.js` (fail) +- `test-promise-swallowed-event.js` (fail) +- `test-querystring-escape.js` (fail) +- `test-querystring-multichar-separator.js` (fail) +- `test-require-cache.js` (fail) +- `test-require-dot.js` (fail) +- `test-require-exceptions.js` (fail) +- `test-require-extensions-same-filename-as-dir-trailing-slash.js` (fail) +- `test-require-extensions-same-filename-as-dir.js` (fail) +- `test-require-node-prefix.js` (fail) +- `test-stream-duplex-from.js` (fail) +- `test-stream-writable-write-error.js` (fail) +- `test-streams-highwatermark.js` (fail) +- `test-sys.js` (fail) +- `test-util-format.js` (fail) +- `test-util-inherits.js` (fail) +- `test-util-inspect-getters-accessing-this.js` (fail) +- `test-util-isDeepStrictEqual.js` (fail) +- `test-util-parse-env.js` (fail) +- `test-util-primordial-monkeypatching.js` (fail) +- `test-util-styletext.js` (fail) +- `test-v8-collect-gc-profile-exit-before-stop.js` (fail) +- `test-v8-collect-gc-profile-in-worker.js` (fail) +- `test-v8-collect-gc-profile.js` (fail) +- `test-v8-coverage.js` (fail) +- `test-v8-flag-pool-size-0.js` (fail) +- `test-v8-flag-type-check.js` (fail) +- `test-v8-flags.js` (fail) +- `test-v8-getheapsnapshot-twice.js` (fail) +- `test-v8-global-setter.js` (fail) +- `test-v8-query-objects.js` (fail) +- `test-v8-serdes.js` (fail) +- `test-v8-serialize-leak.js` (fail) +- `test-v8-startup-snapshot-api.js` (fail) +- `test-v8-stats.js` (fail) +- `test-v8-stop-coverage.js` (fail) +- `test-v8-take-coverage-noop.js` (fail) +- `test-v8-take-coverage.js` (fail) +- `test-v8-version-tag.js` (fail) + From dcc49aa82ebe57acc832a96eef07a6e1944cf461 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:06:53 -0700 Subject: [PATCH 02/10] fix: reclassify 52 misclassified tests in roadmap, add cross-validation mitigations - Move 49 domain tests from FIX-12 to UNSUPPORTED-MODULE - Fix Sign/Verify classifier matching non-crypto tests - Move unsupported-module/api category check before reason-based classifiers - Add 3 additional cross-validation mitigations (crypto test vectors, error snapshots, host-side assert) Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 5 +- docs-internal/nodejs-compat-roadmap.md | 1778 ++++++++++++------------ 2 files changed, 869 insertions(+), 914 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index dbabaaeb..e33c3435 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -33,10 +33,13 @@ - conformance tests live in `packages/secure-exec/tests/node-conformance/` — they are vendored upstream Node.js v22.14.0 test/parallel/ tests run through the sandbox - `docs-internal/nodejs-compat-roadmap.md` tracks every non-passing test with its fix category and resolution -- when implementing bridge/polyfill features where both sides go through our code (e.g., loopback HTTP server + client), prevent overfitting with these three mitigations: +- when implementing bridge/polyfill features where both sides go through our code (e.g., loopback HTTP server + client), prevent overfitting: - **wire-level snapshot tests**: capture raw protocol bytes and compare against known-good captures from real Node.js - **project-matrix cross-validation**: add a project-matrix fixture (`tests/projects/`) using a real npm package that exercises the feature — the matrix compares sandbox output to host Node.js - **real-server control tests**: for network features, maintain tests that hit real external endpoints (not loopback) to validate the client independently of the server + - **known-test-vector validation**: for crypto, validate against NIST/RFC test vectors — not just round-trip verification + - **error object snapshot testing**: for ERR_* codes, snapshot-test full error objects (code, message, constructor) against Node.js — not just check `.code` exists + - **host-side assertion verification**: periodically run assert-heavy conformance tests through host Node.js to verify the assert polyfill isn't masking failures - never inflate conformance numbers — if a test self-skips (exits 0 without testing anything), mark it `vacuous-skip` in expectations.json, not as a real pass - every entry in `expectations.json` must have a specific, verifiable reason — no vague "fails in sandbox" reasons diff --git a/docs-internal/nodejs-compat-roadmap.md b/docs-internal/nodejs-compat-roadmap.md index 17ec43c4..c6dd57fd 100644 --- a/docs-internal/nodejs-compat-roadmap.md +++ b/docs-internal/nodejs-compat-roadmap.md @@ -7,21 +7,27 @@ Current conformance: **11.3% genuine pass rate** (399/3532 tests, Node.js v22.14 | Category | Tests | |----------|-------| | Passing (genuine) | 399 | -| Blocked by fixable issues | 2272 | -| Blocked by unfixable/out-of-scope | 861 | +| Blocked by fixable issues | 1570 | +| Blocked by unfixable/out-of-scope | 1563 | | **Total** | **3532** | *36 "vacuous" tests self-skip and exit 0 without testing anything — listed under VACUOUS below, counted in unfixable/out-of-scope.* ## Cross-Validation Testing Policy -When implementing polyfill/bridge features where both sides of a test go through our code (e.g., loopback HTTP server + client), there is a risk of overfitting — bugs can cancel out if both sides have the same flaw. Three mitigations are required: +When implementing polyfill/bridge features where both sides of a test go through our code (e.g., loopback HTTP server + client), there is a risk of overfitting — bugs can cancel out if both sides have the same flaw. Required mitigations: -1. **Wire-level snapshot tests**: For protocol-level features (HTTP, TLS, WebSocket), capture the raw request/response bytes from the sandbox implementation and compare against known-good captures from real Node.js. This catches encoding bugs that are invisible at the API level. +1. **Wire-level snapshot tests**: For protocol-level features (HTTP, TLS, WebSocket), capture the raw request/response bytes from the sandbox implementation and compare against known-good captures from real Node.js. -2. **Project-matrix cross-validation**: Every new bridge feature (e.g., `http.createServer()`) must have a corresponding project-matrix fixture in `tests/projects/` that exercises it with a real npm package. The matrix runs the same code on host Node.js and in the sandbox, comparing stdout/stderr/exit code. If the sandbox produces different output, the test fails — no self-validation possible. +2. **Project-matrix cross-validation**: Every new bridge feature (e.g., `http.createServer()`) must have a corresponding project-matrix fixture in `tests/projects/` that exercises it with a real npm package. The matrix compares sandbox output to host Node.js. -3. **Real-server control tests**: For network features, maintain a subset of tests that hit real external endpoints through the bridge (not loopback) to validate the client independently of the server. This ensures our HTTP client isn't just compatible with our own server. +3. **Real-server control tests**: For network features, maintain tests that hit real external endpoints through the bridge (not loopback) to validate the client independently of the server. + +4. **Known-test-vector validation**: For crypto, validate against published test vectors (NIST, RFC) — not just round-trip verification where our createHash verifies against itself. + +5. **Error object snapshot testing**: For ERR_* code tests, snapshot-test the full error object (code, message, constructor name) against Node.js output — not just check `.code` exists. + +6. **Host-side assertion verification**: For assert polyfill tests, periodically run assert-heavy conformance tests through host Node.js to verify the assert polyfill itself isn't masking failures. ## Fix Priority Table @@ -29,43 +35,38 @@ When implementing polyfill/bridge features where both sides of a test go through |-----|-------------|-------| | FIX-01 | Loopback HTTP/HTTPS server (createServer + listen) | 492 | | FIX-02 | V8 CLI flags support (--expose-gc, --harmony, etc.) | 256 | -| FIX-04 | ESM/module resolution edge cases | 204 | | FIX-03 | process.execPath / child process spawning | 202 | -| FIX-35 | worker_threads module | 157 | -| FIX-06 | Process API gaps (signals, uncaughtException, IPC) | 86 | -| FIX-34 | vm module implementation | 84 | -| FIX-05 | ERR_* error codes on polyfill errors | 81 | -| FIX-07 | Stream polyfill gaps (readable-stream v3 limitations) | 79 | -| FIX-10 | HTTP client/protocol gaps | 77 | +| FIX-05 | ERR_* error codes on polyfill errors | 80 | +| FIX-06 | Process API gaps (signals, uncaughtException, IPC) | 74 | | FIX-09 | fs module gaps (VFS limitations) | 69 | | FIX-08 | Timer/microtask ordering (setImmediate, nextTick) | 62 | -| FIX-12 | process.emitWarning / deprecation system | 60 | -| FIX-36 | async_hooks module | 36 | +| FIX-07 | Stream polyfill gaps (readable-stream v3 limitations) | 60 | | FIX-11 | Crypto: miscellaneous implementation gaps | 34 | -| FIX-39 | diagnostics_channel module | 32 | | FIX-18 | Buffer polyfill gaps | 29 | -| FIX-24 | fs.watch / file system watchers | 22 | | FIX-19 | URL/URLSearchParams polyfill gaps | 20 | | FIX-13 | Crypto: KeyObject API gaps | 19 | -| FIX-20 | DNS bridge gaps (Resolver, constants, etc.) | 19 | -| FIX-38 | readline module | 18 | | FIX-21 | zlib polyfill gaps (Brotli, streaming) | 17 | +| FIX-20 | DNS bridge gaps (Resolver, constants, etc.) | 16 | | FIX-22 | Text encoding gaps (TextDecoder/TextEncoder) | 16 | -| FIX-23 | Web Streams (stream/web, WHATWG APIs) | 14 | | FIX-25 | Assert polyfill gaps | 14 | +| FIX-04 | ESM/module resolution edge cases | 12 | +| FIX-23 | Web Streams (stream/web, WHATWG APIs) | 12 | | FIX-29 | path.win32 APIs | 12 | | FIX-15 | Crypto: key generation (generateKey, generatePrime) | 11 | -| FIX-26 | Readable.from() support | 11 | +| FIX-10 | HTTP client/protocol gaps | 10 | +| FIX-12 | process.emitWarning / deprecation system | 10 | | FIX-14 | Crypto: DH/ECDH key agreement | 9 | -| FIX-32 | process.on('uncaughtException') handler | 9 | +| FIX-24 | fs.watch / file system watchers | 9 | +| FIX-32 | process.on('uncaughtException') handler | 8 | | FIX-30 | EventTarget / AbortController gaps | 5 | | FIX-16 | Crypto: Cipher/Decipher streaming | 4 | | FIX-31 | Console API gaps | 4 | -| FIX-17 | Crypto: Sign/Verify gaps | 3 | -| FIX-27 | stream.compose() support | 2 | -| FIX-28 | stream.pipeline() edge cases | 2 | +| FIX-26 | Readable.from() support | 2 | +| FIX-28 | stream.pipeline() edge cases | 1 | | FIX-33 | process.on('unhandledRejection') handler | 1 | -| FIX-37 | net/tls TCP socket support | 0 | + + +*FIX-17 (Sign/Verify), FIX-27 (compose), FIX-34 (vm), FIX-35 (worker_threads), FIX-36 (async_hooks), FIX-37 (net/tls), FIX-38 (readline), FIX-39 (diagnostics_channel) have 0 individually-classified tests — their tests are absorbed into UNSUPPORTED-MODULE glob patterns.* --- @@ -1042,218 +1043,26 @@ Tests spawn `child_process.fork()`/`spawn()` with `process.execPath` to run a se - `test-webstorage.js` (fail) - `test-windows-failed-heap-allocation.js` (fail) -### FIX-04: ESM/module resolution edge cases (204 tests) +### FIX-04: ESM/module resolution edge cases (12 tests) **Feasibility: High | Effort: Medium** ESM/module resolution edge cases include: directory imports, conditional exports in package.json, `import.meta.resolve()`, CJS/ESM interop edge cases, and module caching. The current regex-based `convertEsmToCjs()` (CLAUDE.md policy violation) is the root cause of many failures. Replacing it with `es-module-lexer` (US-048) would fix a significant portion. Additional fixes needed: proper `exports` field resolution in package.json, `import.meta.url` consistency, and handling of `.mjs`/`.cjs` extensions. -- `test-arm-math-illegal-instruction.js` (fail) -- `test-assert-fail-deprecation.js` (fail) -- `test-assert-first-line.js` (fail) -- `test-assert-objects.js` (fail) -- `test-async-wrap-tlssocket-asyncreset.js` (fail) -- `test-blocklist-clone.js` (fail) -- `test-blocklist.js` (fail) -- `test-buffer-resizable.js` (fail) -- `test-child-process-disconnect.js` (fail) -- `test-child-process-fork-closed-channel-segfault.js` (fail) -- `test-child-process-fork-dgram.js` (fail) -- `test-child-process-fork-getconnections.js` (fail) -- `test-child-process-fork-net-server.js` (fail) -- `test-child-process-fork-net-socket.js` (fail) -- `test-child-process-fork-net.js` (fail) -- `test-cluster-accept-fail.js` (fail) -- `test-cluster-advanced-serialization.js` (fail) -- `test-cluster-basic.js` (fail) -- `test-cluster-bind-privileged-port.js` (fail) -- `test-cluster-bind-twice.js` (fail) -- `test-cluster-call-and-destroy.js` (fail) -- `test-cluster-child-index-dgram.js` (fail) -- `test-cluster-child-index-net.js` (fail) -- `test-cluster-concurrent-disconnect.js` (fail) -- `test-cluster-cwd.js` (fail) -- `test-cluster-dgram-1.js` (fail) -- `test-cluster-dgram-2.js` (fail) -- `test-cluster-dgram-bind-fd.js` (fail) -- `test-cluster-dgram-reuse.js` (fail) -- `test-cluster-dgram-reuseport.js` (fail) -- `test-cluster-disconnect-before-exit.js` (fail) -- `test-cluster-disconnect-exitedAfterDisconnect-race.js` (fail) -- `test-cluster-disconnect-idle-worker.js` (fail) -- `test-cluster-disconnect-leak.js` (fail) -- `test-cluster-disconnect-race.js` (fail) -- `test-cluster-disconnect-unshared-tcp.js` (fail) -- `test-cluster-disconnect-unshared-udp.js` (fail) -- `test-cluster-disconnect-with-no-workers.js` (fail) -- `test-cluster-disconnect.js` (fail) -- `test-cluster-eaccess.js` (fail) -- `test-cluster-eaddrinuse.js` (fail) -- `test-cluster-fork-env.js` (fail) -- `test-cluster-fork-stdio.js` (fail) -- `test-cluster-fork-windowsHide.js` (fail) -- `test-cluster-http-pipe.js` (fail) -- `test-cluster-invalid-message.js` (fail) -- `test-cluster-ipc-throw.js` (fail) -- `test-cluster-kill-disconnect.js` (fail) -- `test-cluster-kill-infinite-loop.js` (fail) -- `test-cluster-listen-pipe-readable-writable.js` (fail) -- `test-cluster-listening-port.js` (fail) -- `test-cluster-message.js` (fail) -- `test-cluster-net-listen-backlog.js` (fail) -- `test-cluster-net-listen-relative-path.js` (fail) -- `test-cluster-net-listen.js` (fail) -- `test-cluster-net-reuseport.js` (fail) -- `test-cluster-net-send.js` (fail) -- `test-cluster-net-server-drop-connection.js` (fail) -- `test-cluster-primary-error.js` (fail) -- `test-cluster-primary-kill.js` (fail) -- `test-cluster-process-disconnect.js` (fail) -- `test-cluster-rr-domain-listen.js` (fail) -- `test-cluster-rr-handle-close.js` (fail) -- `test-cluster-rr-handle-keep-loop-alive.js` (fail) -- `test-cluster-rr-handle-ref-unref.js` (fail) -- `test-cluster-rr-ref.js` (fail) -- `test-cluster-send-deadlock.js` (fail) -- `test-cluster-send-handle-twice.js` (fail) -- `test-cluster-send-socket-to-worker-http-server.js` (fail) -- `test-cluster-server-restart-none.js` (fail) -- `test-cluster-server-restart-rr.js` (fail) -- `test-cluster-setup-primary-argv.js` (fail) -- `test-cluster-setup-primary-cumulative.js` (fail) -- `test-cluster-setup-primary-emit.js` (fail) -- `test-cluster-setup-primary-multiple.js` (fail) -- `test-cluster-setup-primary.js` (fail) -- `test-cluster-shared-handle-bind-error.js` (fail) -- `test-cluster-shared-leak.js` (fail) -- `test-cluster-uncaught-exception.js` (fail) -- `test-cluster-worker-constructor.js` (fail) -- `test-cluster-worker-death.js` (fail) -- `test-cluster-worker-destroy.js` (fail) -- `test-cluster-worker-disconnect-on-error.js` (fail) -- `test-cluster-worker-disconnect.js` (fail) -- `test-cluster-worker-events.js` (fail) -- `test-cluster-worker-exit.js` (fail) -- `test-cluster-worker-forced-exit.js` (fail) -- `test-cluster-worker-handle-close.js` (fail) -- `test-cluster-worker-init.js` (fail) -- `test-cluster-worker-isconnected.js` (fail) -- `test-cluster-worker-isdead.js` (fail) -- `test-cluster-worker-kill-signal.js` (fail) -- `test-cluster-worker-kill.js` (fail) -- `test-cluster-worker-no-exit.js` (fail) -- `test-cluster-worker-wait-server-close.js` (fail) -- `test-crypto-domain.js` (fail) -- `test-crypto-domains.js` (fail) -- `test-crypto-verify-failure.js` (fail) -- `test-crypto.js` (fail) - `test-directory-import.js` (fail) -- `test-double-tls-client.js` (fail) - `test-esm-loader-hooks-inspect-brk.js` (fail) - `test-esm-loader-hooks-inspect-wait.js` (fail) -- `test-event-emitter-no-error-provided-to-error-event.js` (fail) -- `test-fetch-mock.js` (fail) - `test-fs-append-file-flush.js` (fail) -- `test-fs-operations-with-surrogate-pairs.js` (fail) -- `test-fs-readdir-recursive.js` (fail) - `test-fs-write-file-flush.js` (fail) - `test-fs-write-stream-flush.js` (fail) -- `test-http-agent-reuse-drained-socket-only.js` (fail) -- `test-http-client-error-rawbytes.js` (fail) -- `test-http-client-parse-error.js` (fail) -- `test-http-client-reject-chunked-with-content-length.js` (fail) -- `test-http-client-reject-cr-no-lf.js` (fail) -- `test-http-client-response-domain.js` (fail) -- `test-http-conn-reset.js` (fail) -- `test-http-default-port.js` (fail) -- `test-http-extra-response.js` (fail) -- `test-http-header-validators.js` (fail) -- `test-http-incoming-pipelined-socket-destroy.js` (fail) -- `test-http-invalid-urls.js` (fail) -- `test-http-multi-line-headers.js` (fail) -- `test-http-no-content-length.js` (fail) -- `test-http-perf_hooks.js` (fail) -- `test-http-pipeline-requests-connection-leak.js` (fail) -- `test-http-request-agent.js` (fail) -- `test-http-response-no-headers.js` (fail) -- `test-http-response-splitting.js` (fail) -- `test-http-response-status-message.js` (fail) -- `test-http-server-headers-timeout-delayed-headers.js` (fail) -- `test-http-server-headers-timeout-interrupted-headers.js` (fail) -- `test-http-server-headers-timeout-keepalive.js` (fail) -- `test-http-server-headers-timeout-pipelining.js` (fail) -- `test-http-server-multiple-client-error.js` (fail) -- `test-http-server-request-timeout-delayed-body.js` (fail) -- `test-http-server-request-timeout-delayed-headers.js` (fail) -- `test-http-server-request-timeout-interrupted-body.js` (fail) -- `test-http-server-request-timeout-interrupted-headers.js` (fail) -- `test-http-server-request-timeout-keepalive.js` (fail) -- `test-http-server-request-timeout-pipelining.js` (fail) -- `test-http-server-request-timeout-upgrade.js` (fail) -- `test-http-server.js` (fail) -- `test-http-should-keep-alive.js` (fail) -- `test-http-upgrade-agent.js` (fail) -- `test-http-upgrade-binary.js` (fail) -- `test-http-upgrade-client.js` (fail) -- `test-http-upgrade-server.js` (fail) -- `test-http-url.parse-https.request.js` (fail) -- `test-inspect-support-for-node_options.js` (fail) -- `test-listen-fd-ebadf.js` (fail) - `test-module-cache.js` (fail) - `test-module-version.js` (fail) -- `test-next-tick-domain.js` (fail) - `test-path-posix-exists.js` (fail) - `test-path-win32-exists.js` (fail) -- `test-perf-gc-crash.js` (fail) -- `test-perf-hooks-histogram.js` (fail) -- `test-perf-hooks-resourcetiming.js` (fail) -- `test-perf-hooks-usertiming.js` (fail) -- `test-performance-function-async.js` (fail) -- `test-performance-function.js` (fail) -- `test-performance-global.js` (fail) -- `test-performance-measure-detail.js` (fail) -- `test-performance-measure.js` (fail) -- `test-performance-resourcetimingbufferfull.js` (fail) -- `test-performance-resourcetimingbuffersize.js` (fail) -- `test-performanceobserver-gc.js` (fail) -- `test-pipe-abstract-socket.js` (fail) -- `test-pipe-address.js` (fail) -- `test-pipe-stream.js` (fail) -- `test-pipe-unref.js` (fail) -- `test-pipe-writev.js` (fail) -- `test-process-env-sideeffects.js` (fail) -- `test-process-getactivehandles.js` (fail) -- `test-process-getactiveresources-track-active-handles.js` (fail) -- `test-process-ref-unref.js` (fail) -- `test-readline.js` (fail) -- `test-ref-unref-return.js` (fail) -- `test-repl.js` (fail) - `test-require-delete-array-iterator.js` (fail) - `test-require-json.js` (fail) -- `test-socket-address.js` (fail) -- `test-socket-options-invalid.js` (fail) -- `test-socket-write-after-fin-error.js` (fail) -- `test-socket-write-after-fin.js` (fail) -- `test-socket-writes-before-passed-to-tls-socket.js` (fail) -- `test-stream-aliases-legacy.js` (fail) -- `test-stream-base-typechecking.js` (fail) -- `test-stream-pipeline.js` (fail) -- `test-stream-preprocess.js` (fail) -- `test-timers-immediate-queue-throw.js` (fail) -- `test-timers-reset-process-domain-on-throw.js` (fail) -- `test-timers-socket-timeout-removes-other-socket-unref-timer.js` (fail) -- `test-timers-unrefed-in-callback.js` (fail) -- `test-tojson-perf_hooks.js` (fail) -- `test-tty-stdin-pipe.js` (fail) -- `test-url-domain-ascii-unicode.js` (fail) -- `test-url-format.js` (fail) -- `test-url-parse-format.js` (fail) -- `test-util-stripvtcontrolcharacters.js` (fail) -- `test-util-text-decoder.js` (fail) -- `test-util-types-exists.js` (fail) -- `test-x509-escaping.js` (fail) -### FIX-05: ERR_* error codes on polyfill errors (81 tests) +### FIX-05: ERR_* error codes on polyfill errors (80 tests) **Feasibility: High | Effort: Low-Medium** @@ -1302,7 +1111,6 @@ ESM/module resolution edge cases include: directory imports, conditional exports - `test-sqlite-database-sync.js` (fail) - `test-sqlite-statement-sync.js` (fail) - `test-stream-duplex-readable-writable.js` (fail) -- `test-stream-err-multiple-callback-construction.js` (fail) - `test-stream-readable-default-encoding.js` (fail) - `test-stream-readable-with-unimplemented-_read.js` (fail) - `test-stream-transform-callback-twice.js` (fail) @@ -1341,7 +1149,7 @@ ESM/module resolution edge cases include: directory imports, conditional exports - `test-zlib-zero-windowBits.js` (fail) - `test-zlib.js` (fail) -### FIX-06: Process API gaps (signals, uncaughtException, IPC) (86 tests) +### FIX-06: Process API gaps (signals, uncaughtException, IPC) (74 tests) **Feasibility: High | Effort: Medium** @@ -1351,7 +1159,6 @@ Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._g - `test-child-process-cwd.js` (fail) - `test-child-process-default-options.js` (fail) - `test-child-process-destroy.js` (fail) -- `test-child-process-dgram-reuseport.js` (fail) - `test-child-process-double-pipe.js` (fail) - `test-child-process-env.js` (fail) - `test-child-process-exec-cwd.js` (fail) @@ -1363,24 +1170,15 @@ Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._g - `test-child-process-fork-abort-signal.js` (fail) - `test-child-process-fork-close.js` (fail) - `test-child-process-fork-detached.js` (fail) -- `test-child-process-fork-no-shell.js` (fail) - `test-child-process-fork-ref.js` (fail) - `test-child-process-fork-ref2.js` (fail) - `test-child-process-fork-stdio-string-variant.js` (fail) -- `test-child-process-fork-stdio.js` (fail) - `test-child-process-fork-timeout-kill-signal.js` (fail) -- `test-child-process-fork.js` (fail) -- `test-child-process-fork3.js` (fail) - `test-child-process-internal.js` (fail) -- `test-child-process-ipc-next-tick.js` (fail) - `test-child-process-ipc.js` (fail) - `test-child-process-kill.js` (fail) -- `test-child-process-net-reuseport.js` (fail) - `test-child-process-pipe-dataflow.js` (fail) -- `test-child-process-send-after-close.js` (fail) - `test-child-process-send-cb.js` (fail) -- `test-child-process-send-keep-open.js` (fail) -- `test-child-process-send-type-error.js` (fail) - `test-child-process-send-utf8.js` (fail) - `test-child-process-set-blocking.js` (fail) - `test-child-process-spawn-error.js` (fail) @@ -1416,7 +1214,6 @@ Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._g - `test-process-exception-capture-should-abort-on-uncaught-setflagsfromstring.js` (fail) - `test-process-exit-from-before-exit.js` (fail) - `test-process-exit-handler.js` (skip) -- `test-process-external-stdio-close.js` (fail) - `test-process-getactiveresources-track-interval-lifetime.js` (fail) - `test-process-getactiveresources.js` (fail) - `test-process-getgroups.js` (fail) @@ -1426,7 +1223,6 @@ Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._g - `test-process-redirect-warnings.js` (fail) - `test-promises-warning-on-unhandled-rejection.js` (fail) - `test-release-changelog.js` (fail) -- `test-signal-handler.js` (skip) - `test-signal-unregister.js` (fail) - `test-sqlite-named-parameters.js` (fail) - `test-sqlite-transactions.js` (fail) @@ -1434,7 +1230,7 @@ Missing process APIs in `packages/nodejs/src/bridge/process.ts`: (1) `process._g - `test-stdin-from-file.js` (fail) - `test-util-log.js` (fail) -### FIX-07: Stream polyfill gaps (readable-stream v3 limitations) (79 tests) +### FIX-07: Stream polyfill gaps (readable-stream v3 limitations) (60 tests) **Feasibility: Medium | Effort: Medium-High** @@ -1443,7 +1239,6 @@ The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.j - `test-console-sync-write-error.js` (fail) - `test-file-write-stream.js` (fail) - `test-file-write-stream3.js` (fail) -- `test-filehandle-readablestream.js` (fail) - `test-fs-read-stream-double-close.js` (fail) - `test-fs-read-stream-err.js` (fail) - `test-fs-stream-destroy-emit-error.js` (fail) @@ -1451,20 +1246,13 @@ The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.j - `test-fs-write-stream-err.js` (fail) - `test-fs-write-stream-fs.js` (fail) - `test-fs-writestream-open-write.js` (fail) -- `test-http-sync-write-error-during-continue.js` (fail) - `test-stream-await-drain-writers-in-synchronously-recursion-write.js` (fail) - `test-stream-catch-rejections.js` (fail) -- `test-stream-construct.js` (fail) -- `test-stream-consumers.js` (fail) - `test-stream-duplex-destroy.js` (fail) - `test-stream-duplex-end.js` (fail) - `test-stream-duplex-props.js` (fail) -- `test-stream-duplexpair.js` (fail) - `test-stream-error-once.js` (fail) - `test-stream-event-names.js` (fail) -- `test-stream-filter.js` (fail) -- `test-stream-flatMap.js` (fail) -- `test-stream-map.js` (fail) - `test-stream-pipe-await-drain-manual-resume.js` (fail) - `test-stream-pipe-await-drain-push-while-write.js` (fail) - `test-stream-pipe-await-drain.js` (fail) @@ -1472,12 +1260,7 @@ The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.j - `test-stream-pipe-needDrain.js` (fail) - `test-stream-pipe-same-destination-twice.js` (fail) - `test-stream-pipe-unpipe-streams.js` (fail) -- `test-stream-promises.js` (fail) -- `test-stream-readable-aborted.js` (fail) -- `test-stream-readable-async-iterators.js` (fail) - `test-stream-readable-data.js` (fail) -- `test-stream-readable-didRead.js` (fail) -- `test-stream-readable-dispose.js` (fail) - `test-stream-readable-emit-readable-short-stream.js` (fail) - `test-stream-readable-emittedReadable.js` (fail) - `test-stream-readable-hwm-0-no-flow-data.js` (fail) @@ -1485,15 +1268,12 @@ The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.j - `test-stream-readable-readable-then-resume.js` (fail) - `test-stream-readable-readable.js` (fail) - `test-stream-readable-reading-readingMore.js` (fail) -- `test-stream-set-default-hwm.js` (fail) - `test-stream-transform-constructor-set-methods.js` (fail) - `test-stream-transform-destroy.js` (fail) - `test-stream-transform-final-sync.js` (fail) -- `test-stream-transform-split-highwatermark.js` (fail) - `test-stream-transform-split-objectmode.js` (fail) - `test-stream-typedarray.js` (fail) - `test-stream-uint8array.js` (fail) -- `test-stream-writable-aborted.js` (fail) - `test-stream-writable-change-default-encoding.js` (fail) - `test-stream-writable-constructor-set-methods.js` (fail) - `test-stream-writable-decoded-encoding.js` (fail) @@ -1511,9 +1291,6 @@ The stream polyfill uses readable-stream v3.6.2 which lacks APIs added in Node.j - `test-stream2-readable-wrap.js` (fail) - `test-stream2-transform.js` (fail) - `test-stream2-writable.js` (fail) -- `test-stream3-pipeline-async-iterator.js` (fail) -- `test-warn-stream-wrap.js` (fail) -- `test-zlib-brotli-16GB.js` (fail) - `test-zlib-empty-buffer.js` (fail) - `test-zlib-flush-drain-longblock.js` (fail) - `test-zlib-flush-drain.js` (fail) @@ -1616,7 +1393,6 @@ Missing fs operations: (1) `fs.promises` FileHandle methods (read/write/truncate - `test-fs-promises-file-handle-truncate.js` (fail) - `test-fs-promises-file-handle-write.js` (fail) - `test-fs-promises-readfile-with-fd.js` (fail) -- `test-fs-promises-watch.js` (skip) - `test-fs-promises-write-optional-params.js` (fail) - `test-fs-promises-writefile-with-fd.js` (fail) - `test-fs-promises.js` (fail) @@ -1655,6 +1431,7 @@ Missing fs operations: (1) `fs.promises` FileHandle methods (read/write/truncate - `test-fs-symlink.js` (fail) - `test-fs-truncate-fd.js` (fail) - `test-fs-truncate-sync.js` (fail) +- `test-fs-write-file.js` (fail) - `test-fs-write-no-fd.js` (fail) - `test-fs-write-optional-params.js` (fail) - `test-fs-write-stream-change-open.js` (fail) @@ -1665,7 +1442,7 @@ Missing fs operations: (1) `fs.promises` FileHandle methods (read/write/truncate - `test-process-dlopen-error-message-crash.js` (fail) - `test-zlib-brotli-from-brotli.js` (fail) -### FIX-10: HTTP client/protocol gaps (77 tests) +### FIX-10: HTTP client/protocol gaps (10 tests) **Feasibility: Medium | Effort: Medium** @@ -1674,79 +1451,12 @@ Missing fs operations: (1) `fs.promises` FileHandle methods (read/write/truncate - `test-client-request-destroy.js` (fail) - `test-fs-readfile-pipe-large.js` (fail) - `test-fs-readfile-pipe.js` (fail) -- `test-http-addrequest-localaddress.js` (fail) - `test-http-agent-close.js` (fail) -- `test-http-agent-getname.js` (fail) - `test-http-client-readable.js` (fail) -- `test-http-common.js` (fail) -- `test-http-incoming-matchKnownFields.js` (fail) - `test-http-incoming-message-connection-setter.js` (fail) -- `test-http-invalidheaderfield2.js` (fail) -- `test-http-outgoing-destroy.js` (fail) - `test-http-parser-multiple-execute.js` (fail) -- `test-http-parser.js` (fail) - `test-http-proxy.js` (skip) - `test-http-set-max-idle-http-parser.js` (fail) -- `test-https-abortcontroller.js` (fail) -- `test-https-agent-abort-controller.js` (fail) -- `test-https-agent-additional-options.js` (fail) -- `test-https-agent-constructor.js` (fail) -- `test-https-agent-create-connection.js` (fail) -- `test-https-agent-disable-session-reuse.js` (fail) -- `test-https-agent-getname.js` (fail) -- `test-https-agent-keylog.js` (fail) -- `test-https-agent-servername.js` (fail) -- `test-https-agent-session-eviction.js` (fail) -- `test-https-agent-session-injection.js` (fail) -- `test-https-agent-session-reuse.js` (fail) -- `test-https-agent-sni.js` (fail) -- `test-https-agent-sockets-leak.js` (fail) -- `test-https-agent-unref-socket.js` (fail) -- `test-https-agent.js` (fail) -- `test-https-argument-of-creating.js` (fail) -- `test-https-autoselectfamily.js` (fail) -- `test-https-byteswritten.js` (fail) -- `test-https-client-checkServerIdentity.js` (fail) -- `test-https-client-get-url.js` (fail) -- `test-https-client-override-global-agent.js` (fail) -- `test-https-client-reject.js` (fail) -- `test-https-client-resume.js` (fail) -- `test-https-close.js` (fail) -- `test-https-connecting-to-http.js` (fail) -- `test-https-drain.js` (fail) -- `test-https-eof-for-eom.js` (fail) -- `test-https-host-headers.js` (fail) -- `test-https-hwm.js` (fail) -- `test-https-insecure-parse-per-stream.js` (fail) -- `test-https-keep-alive-drop-requests.js` (fail) -- `test-https-localaddress-bind-error.js` (fail) -- `test-https-localaddress.js` (fail) -- `test-https-max-header-size-per-stream.js` (fail) -- `test-https-max-headers-count.js` (fail) -- `test-https-options-boolean-check.js` (fail) -- `test-https-pfx.js` (fail) -- `test-https-request-arguments.js` (fail) -- `test-https-resume-after-renew.js` (fail) -- `test-https-selfsigned-no-keycertsign-no-crash.js` (fail) -- `test-https-server-async-dispose.js` (fail) -- `test-https-server-close-all.js` (fail) -- `test-https-server-close-destroy-timeout.js` (fail) -- `test-https-server-close-idle.js` (fail) -- `test-https-server-connections-checking-leak.js` (fail) -- `test-https-server-headers-timeout.js` (fail) -- `test-https-server-options-incoming-message.js` (fail) -- `test-https-server-options-server-response.js` (fail) -- `test-https-server-request-timeout.js` (fail) -- `test-https-set-timeout-server.js` (fail) -- `test-https-simple.js` (fail) -- `test-https-socket-options.js` (fail) -- `test-https-strict.js` (fail) -- `test-https-timeout-server-2.js` (fail) -- `test-https-timeout-server.js` (fail) -- `test-https-timeout.js` (fail) -- `test-https-truncate.js` (fail) -- `test-https-unix-socket-self-signed.js` (fail) -- `test-outgoing-message-pipe.js` (fail) - `test-set-incoming-message-header.js` (fail) ### FIX-11: Crypto: miscellaneous implementation gaps (34 tests) @@ -1790,7 +1500,7 @@ Crypto gaps not covered by DH/KeyObject/Cipher sub-fixes: (1) error codes — po - `test-webcrypto-sign-verify.js` (fail) - `test-webcrypto-wrap-unwrap.js` (fail) -### FIX-12: process.emitWarning / deprecation system (60 tests) +### FIX-12: process.emitWarning / deprecation system (10 tests) **Feasibility: High | Effort: Low** @@ -1799,55 +1509,6 @@ Crypto gaps not covered by DH/KeyObject/Cipher sub-fixes: (1) error codes — po - `test-buffer-constructor-deprecation-error.js` (fail) - `test-buffer-new.js` (fail) - `test-buffer-pending-deprecation.js` (fail) -- `test-domain-abort-on-uncaught.js` (fail) -- `test-domain-add-remove.js` (fail) -- `test-domain-async-id-map-leak.js` (fail) -- `test-domain-bind-timeout.js` (fail) -- `test-domain-crypto.js` (fail) -- `test-domain-dep0097.js` (fail) -- `test-domain-ee-error-listener.js` (fail) -- `test-domain-ee-implicit.js` (fail) -- `test-domain-ee.js` (fail) -- `test-domain-emit-error-handler-stack.js` (fail) -- `test-domain-enter-exit.js` (fail) -- `test-domain-error-types.js` (fail) -- `test-domain-fs-enoent-stream.js` (fail) -- `test-domain-http-server.js` (fail) -- `test-domain-implicit-binding.js` (fail) -- `test-domain-implicit-fs.js` (fail) -- `test-domain-intercept.js` (fail) -- `test-domain-load-after-set-uncaught-exception-capture.js` (fail) -- `test-domain-multi.js` (fail) -- `test-domain-multiple-errors.js` (fail) -- `test-domain-nested-throw.js` (fail) -- `test-domain-nested.js` (fail) -- `test-domain-nexttick.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-0.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-1.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-2.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-3.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-4.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-5.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-6.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-7.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-8.js` (fail) -- `test-domain-no-error-handler-abort-on-uncaught-9.js` (fail) -- `test-domain-promise.js` (fail) -- `test-domain-run.js` (fail) -- `test-domain-safe-exit.js` (fail) -- `test-domain-set-uncaught-exception-capture-after-load.js` (fail) -- `test-domain-stack-empty-in-process-uncaughtexception.js` (fail) -- `test-domain-stack.js` (fail) -- `test-domain-throw-error-then-throw-from-uncaught-exception-handler.js` (fail) -- `test-domain-thrown-error-handler-stack.js` (fail) -- `test-domain-timer.js` (fail) -- `test-domain-timers-uncaught-exception.js` (fail) -- `test-domain-timers.js` (fail) -- `test-domain-top-level-error-handler-clears-stack.js` (fail) -- `test-domain-top-level-error-handler-throw.js` (fail) -- `test-domain-uncaught-exception.js` (fail) -- `test-domain-vm-promise-isolation.js` (fail) -- `test-domain-with-abort-on-uncaught-exception.js` (fail) - `test-fs-truncate.js` (fail) - `test-global-console-exists.js` (fail) - `test-http-outgoing-internal-headernames-setter.js` (fail) @@ -1855,7 +1516,6 @@ Crypto gaps not covered by DH/KeyObject/Cipher sub-fixes: (1) error codes — po - `test-process-emitwarning.js` (fail) - `test-process-no-deprecation.js` (fail) - `test-util-deprecate.js` (fail) -- `test-util-getcallsite.js` (fail) ### FIX-13: Crypto: KeyObject API gaps (19 tests) @@ -1928,16 +1588,6 @@ Hash and Cipher objects don't extend Transform stream — they lack `.pipe()`, ` - `test-crypto-padding.js` (fail) - `test-crypto-stream.js` (fail) -### FIX-17: Crypto: Sign/Verify gaps (3 tests) - -**Feasibility: High | Effort: Low** - -Sign/verify are bridged and mostly work. The 3 remaining failures are minor error code mismatches or encoding validation. Fix by wrapping sign/verify polyfill functions with ERR_* error code injection. - -- `test-fs-write-file.js` (fail) -- `test-stream-readable-destroy.js` (fail) -- `test-stream-writable-destroy.js` (fail) - ### FIX-18: Buffer polyfill gaps (29 tests) **Feasibility: High | Effort: Low** @@ -2001,14 +1651,12 @@ Browser URL polyfill differs from Node.js: (1) legacy `url.parse()` query string - `test-whatwg-url-override-hostname.js` (fail) - `test-whatwg-url-properties.js` (fail) -### FIX-20: DNS bridge gaps (Resolver, constants, etc.) (19 tests) +### FIX-20: DNS bridge gaps (Resolver, constants, etc.) (16 tests) **Feasibility: High | Effort: Medium** DNS bridge only implements lookup/resolve/resolve4/resolve6. Missing: Resolver class, setServers/getServers, lookupService, reverse, resolveAny/resolveNs/resolveMx/resolveCname/resolveTxt/resolveSoa, constants, dns/promises subpath. Fix: extend bridge DNS implementation with `_networkDnsResolveRaw` handler that takes hostname + rrtype, implement Resolver class wrapping bridge calls, add error codes (ENOTFOUND). -- `test-c-ares.js` (fail) -- `test-destroy-socket-in-lookup.js` (fail) - `test-dns-cancel-reverse-lookup.js` (fail) - `test-dns-channel-cancel-promise.js` (fail) - `test-dns-channel-cancel.js` (fail) @@ -2025,7 +1673,6 @@ DNS bridge only implements lookup/resolve/resolve4/resolve6. Missing: Resolver c - `test-dns-setserver-when-querying.js` (fail) - `test-dns-setservers-type-check.js` (fail) - `test-dns.js` (fail) -- `test-http-autoselectfamily.js` (fail) ### FIX-21: zlib polyfill gaps (Brotli, streaming) (17 tests) @@ -2074,7 +1721,7 @@ TextDecoder/TextEncoder gaps: (1) ERR_ENCODING_NOT_SUPPORTED not thrown for inva - `test-whatwg-encoding-custom-textdecoder-streaming.js` (fail) - `test-whatwg-encoding-custom-textdecoder-utf16-surrogates.js` (fail) -### FIX-23: Web Streams (stream/web, WHATWG APIs) (14 tests) +### FIX-23: Web Streams (stream/web, WHATWG APIs) (12 tests) **Feasibility: Medium | Effort: Medium** @@ -2085,43 +1732,28 @@ TextDecoder/TextEncoder gaps: (1) ERR_ENCODING_NOT_SUPPORTED not thrown for inva - `test-stream-duplex.js` (fail) - `test-stream-readable-strategy-option.js` (fail) - `test-webstream-encoding-inspect.js` (fail) -- `test-webstream-readable-from.js` (fail) - `test-webstream-string-tag.js` (fail) - `test-webstreams-abort-controller.js` (fail) -- `test-webstreams-clone-unref.js` (fail) - `test-webstreams-compose.js` (fail) - `test-webstreams-finished.js` (fail) - `test-whatwg-readablebytestreambyob.js` (fail) - `test-whatwg-webstreams-compression.js` (fail) - `test-whatwg-webstreams-encoding.js` (fail) -### FIX-24: fs.watch / file system watchers (22 tests) +### FIX-24: fs.watch / file system watchers (9 tests) **Feasibility: Low | Effort: High** VFS has no inotify equivalent. `fs.watch()`/`fs.watchFile()` return stub objects that never emit events. Would need a VFS event system that tracks file modifications and notifies watchers. Tests that wait for change events will always hang unless VFS emits change notifications on write operations. Recommend keeping as known limitation. - `test-fs-assert-encoding-error.js` (fail) -- `test-fs-options-immutable.js` (skip) - `test-fs-watch-encoding.js` (skip) -- `test-fs-watch-file-enoent-after-deletion.js` (skip) -- `test-fs-watch-recursive-add-file-to-existing-subfolder.js` (skip) -- `test-fs-watch-recursive-add-file-to-new-folder.js` (skip) - `test-fs-watch-recursive-add-file-with-url.js` (skip) -- `test-fs-watch-recursive-add-file.js` (skip) - `test-fs-watch-recursive-add-folder.js` (skip) -- `test-fs-watch-recursive-assert-leaks.js` (skip) -- `test-fs-watch-recursive-delete.js` (skip) -- `test-fs-watch-recursive-linux-parallel-remove.js` (skip) - `test-fs-watch-recursive-promise.js` (skip) - `test-fs-watch-recursive-symlink.js` (skip) -- `test-fs-watch-recursive-sync-write.js` (skip) -- `test-fs-watch-recursive-update-file.js` (skip) - `test-fs-watch-recursive-validate.js` (skip) - `test-fs-watch-recursive-watch-file.js` (skip) -- `test-fs-watch-stop-async.js` (fail) -- `test-fs-watch-stop-sync.js` (fail) -- `test-fs-watch.js` (skip) - `test-fs-watchfile.js` (skip) ### FIX-25: Assert polyfill gaps (14 tests) @@ -2145,41 +1777,22 @@ Missing: `assert.CallTracker` class (Node.js 14.2+), `assert.match()`/`assert.do - `test-os.js` (fail) - `test-stream-readable-to-web.js` (fail) -### FIX-26: Readable.from() support (11 tests) +### FIX-26: Readable.from() support (2 tests) **Feasibility: High | Effort: Low** `Readable.from()` not in readable-stream v3. This API creates a Readable from an iterable/async iterable. Implementation: add static method on Readable that iterates over source (sync/async), pushes chunks into a Readable stream, handles backpressure. Straightforward ~50 lines of code. -- `test-fs-promises-file-handle-writeFile.js` (fail) -- `test-fs-promises-writefile.js` (fail) -- `test-readable-from-iterator-closing.js` (fail) -- `test-readable-from.js` (fail) -- `test-stream-drop-take.js` (fail) -- `test-stream-forEach.js` (fail) - `test-stream-readable-from-web-termination.js` (fail) -- `test-stream-readable-next-no-null.js` (fail) - `test-stream-readable-to-web-termination.js` (fail) -- `test-stream-reduce.js` (fail) -- `test-stream-toArray.js` (fail) - -### FIX-27: stream.compose() support (2 tests) -**Feasibility: Medium | Effort: Medium** - -`stream.compose()` accepts variadic stream/async-generator/function arguments and chains them into a Duplex. Must validate stream sequence, handle async generators as Duplex wrappers, propagate errors, and manage lifecycle. Complex API introduced in Node v17.0. - -- `test-stream-compose-operator.js` (fail) -- `test-stream-compose.js` (fail) - -### FIX-28: stream.pipeline() edge cases (2 tests) +### FIX-28: stream.pipeline() edge cases (1 tests) **Feasibility: High | Effort: Low** Two edge cases: (1) pipeline() doesn't clean up error listeners on intermediate streams after completion, (2) async generator errors in pipeline not propagated to error callback. Fix: iterate intermediate streams and remove pipeline-attached error listeners after completion; catch async generator errors and pass to callback. - `test-stream-pipeline-listeners.js` (fail) -- `test-stream-pipeline-with-empty-string.js` (fail) ### FIX-29: path.win32 APIs (12 tests) @@ -2223,13 +1836,12 @@ Console constructor lacks option validation: (1) ERR_INVALID_ARG_TYPE for non-nu - `test-console-stdio-setters.js` (fail) - `test-console-tty-colors.js` (fail) -### FIX-32: process.on('uncaughtException') handler (9 tests) +### FIX-32: process.on('uncaughtException') handler (8 tests) **Feasibility: High | Effort: Medium** No mechanism to trigger 'uncaughtException' event when exceptions propagate out of user code. Fix: (1) add global exception handler hook in process.ts that invokes `_emit('uncaughtException', error)`, (2) hook into V8 runtime in `native/v8-runtime/src/execution.rs` to catch exceptions from `execute_script()`, (3) if `setUncaughtExceptionCaptureCallback()` has a callback, invoke it first. If handled, suppress exit; otherwise exit with code 1. -- `test-events-uncaught-exception-stack.js` (fail) - `test-exception-handler.js` (fail) - `test-exception-handler2.js` (fail) - `test-handle-wrap-close-abort.js` (fail) @@ -2247,377 +1859,15 @@ No unhandled Promise rejection capture. Fix: hook into V8's Promise rejection ha - `test-promise-handled-rejection-no-warning.js` (fail) -### FIX-34: vm module implementation (84 tests) - -**Feasibility: Not feasible | Effort: N/A** - -The vm module requires creating multiple V8 contexts. The sandbox runs user code in a single V8 isolate with one context. `vm.runInThisContext()` could work (effectively eval), but `vm.runInNewContext()`, `vm.createContext()`, and `vm.Script` with different contexts cannot be implemented without multi-context V8 support. Recommend marking as architectural limitation. +--- -- `test-assert.js` (fail) -- `test-buffer-alloc.js` (fail) -- `test-buffer-bytelength.js` (fail) -- `test-buffer-from.js` (fail) -- `test-crypto-key-objects-messageport.js` (fail) -- `test-intl-v8BreakIterator.js` (fail) -- `test-querystring.js` (fail) -- `test-vm-access-process-env.js` (fail) -- `test-vm-api-handles-getter-errors.js` (fail) -- `test-vm-attributes-property-not-on-sandbox.js` (fail) -- `test-vm-basic.js` (fail) -- `test-vm-cached-data.js` (fail) -- `test-vm-codegen.js` (fail) -- `test-vm-context-async-script.js` (fail) -- `test-vm-context-dont-contextify.js` (fail) -- `test-vm-context-property-forwarding.js` (fail) -- `test-vm-context.js` (fail) -- `test-vm-create-and-run-in-context.js` (fail) -- `test-vm-create-context-accessors.js` (fail) -- `test-vm-create-context-arg.js` (fail) -- `test-vm-create-context-circular-reference.js` (fail) -- `test-vm-createcacheddata.js` (fail) -- `test-vm-cross-context.js` (fail) -- `test-vm-data-property-writable.js` (fail) -- `test-vm-deleting-property.js` (fail) -- `test-vm-dynamic-import-callback-missing-flag.js` (fail) -- `test-vm-function-declaration.js` (fail) -- `test-vm-function-redefinition.js` (fail) -- `test-vm-getters.js` (fail) -- `test-vm-global-assignment.js` (fail) -- `test-vm-global-configurable-properties.js` (fail) -- `test-vm-global-define-property.js` (fail) -- `test-vm-global-get-own.js` (fail) -- `test-vm-global-identity.js` (fail) -- `test-vm-global-non-writable-properties.js` (fail) -- `test-vm-global-property-enumerator.js` (fail) -- `test-vm-global-property-interceptors.js` (fail) -- `test-vm-global-property-prototype.js` (fail) -- `test-vm-global-setter.js` (fail) -- `test-vm-harmony-symbols.js` (fail) -- `test-vm-indexed-properties.js` (fail) -- `test-vm-inherited_properties.js` (fail) -- `test-vm-is-context.js` (fail) -- `test-vm-low-stack-space.js` (fail) -- `test-vm-measure-memory-lazy.js` (fail) -- `test-vm-measure-memory-multi-context.js` (fail) -- `test-vm-measure-memory.js` (fail) -- `test-vm-module-basic.js` (fail) -- `test-vm-module-cached-data.js` (fail) -- `test-vm-module-dynamic-import.js` (fail) -- `test-vm-module-dynamic-namespace.js` (fail) -- `test-vm-module-errors.js` (fail) -- `test-vm-module-import-meta.js` (fail) -- `test-vm-module-link.js` (fail) -- `test-vm-module-reevaluate.js` (fail) -- `test-vm-module-synthetic.js` (fail) -- `test-vm-new-script-new-context.js` (fail) -- `test-vm-no-dynamic-import-callback.js` (fail) -- `test-vm-not-strict.js` (fail) -- `test-vm-options-validation.js` (fail) -- `test-vm-ownkeys.js` (fail) -- `test-vm-ownpropertynames.js` (fail) -- `test-vm-ownpropertysymbols.js` (fail) -- `test-vm-preserves-property.js` (fail) -- `test-vm-property-not-on-sandbox.js` (fail) -- `test-vm-proxies.js` (fail) -- `test-vm-proxy-failure-CP.js` (fail) -- `test-vm-run-in-new-context.js` (fail) -- `test-vm-script-throw-in-tostring.js` (fail) -- `test-vm-set-property-proxy.js` (fail) -- `test-vm-set-proto-null-on-globalthis.js` (fail) -- `test-vm-sigint-existing-handler.js` (fail) -- `test-vm-sigint.js` (fail) -- `test-vm-source-map-url.js` (fail) -- `test-vm-static-this.js` (fail) -- `test-vm-strict-assign.js` (fail) -- `test-vm-strict-mode.js` (fail) -- `test-vm-symbols.js` (fail) -- `test-vm-syntax-error-message.js` (fail) -- `test-vm-syntax-error-stderr.js` (fail) -- `test-vm-timeout-escape-promise-2.js` (fail) -- `test-vm-timeout-escape-promise-module.js` (fail) -- `test-vm-timeout-escape-promise.js` (fail) -- `test-vm-timeout.js` (skip) +## Tests Not Covered by Any Fix -### FIX-35: worker_threads module (157 tests) +### TEST-INFRA: requires Node.js internal test infrastructure (68 tests) -**Feasibility: Not feasible | Effort: N/A** +**Resolution: Partially rescuable (~12-16 tests)** -worker_threads requires spawning multiple OS threads with separate V8 isolates and coordinating message passing. The sandbox architecture assumes a single isolate per session. Cannot implement without fundamental architecture changes. Recommend marking as architectural limitation. - -- `test-bootstrap-modules.js` (fail) -- `test-broadcastchannel-custom-inspect.js` (fail) -- `test-buffer-pool-untransferable.js` (fail) -- `test-console.js` (fail) -- `test-datetime-change-notify.js` (fail) -- `test-fs-mkdir.js` (fail) -- `test-fs-whatwg-url.js` (fail) -- `test-fs-write-file-sync.js` (fail) -- `test-no-addons-resolution-condition.js` (fail) -- `test-perf-hooks-worker-timeorigin.js` (fail) -- `test-performance-eventlooputil.js` (fail) -- `test-performance-nodetiming.js` (fail) -- `test-preload-self-referential.js` (fail) -- `test-process-chdir-errormessage.js` (fail) -- `test-process-chdir.js` (fail) -- `test-process-env-tz.js` (fail) -- `test-process-euid-egid.js` (fail) -- `test-process-initgroups.js` (fail) -- `test-process-setgroups.js` (fail) -- `test-process-uid-gid.js` (fail) -- `test-process-umask-mask.js` (fail) -- `test-process-umask.js` (fail) -- `test-require-resolve-opts-paths-relative.js` (fail) -- `test-set-process-debug-port.js` (fail) -- `test-stdio-pipe-redirect.js` (fail) -- `test-webcrypto-cryptokey-workers.js` (fail) -- `test-worker-abort-on-uncaught-exception-terminate.js` (fail) -- `test-worker-abort-on-uncaught-exception.js` (fail) -- `test-worker-arraybuffer-zerofill.js` (fail) -- `test-worker-beforeexit-throw-exit.js` (fail) -- `test-worker-broadcastchannel-wpt.js` (fail) -- `test-worker-broadcastchannel.js` (fail) -- `test-worker-cjs-workerdata.js` (fail) -- `test-worker-cleanexit-with-js.js` (fail) -- `test-worker-cleanexit-with-moduleload.js` (fail) -- `test-worker-cleanup-handles.js` (fail) -- `test-worker-cli-options.js` (fail) -- `test-worker-console-listeners.js` (fail) -- `test-worker-crypto-sign-transfer-result.js` (fail) -- `test-worker-data-url.js` (fail) -- `test-worker-debug.js` (fail) -- `test-worker-dns-terminate-during-query.js` (fail) -- `test-worker-dns-terminate.js` (fail) -- `test-worker-environmentdata.js` (fail) -- `test-worker-error-stack-getter-throws.js` (fail) -- `test-worker-esm-exit.js` (fail) -- `test-worker-esm-missing-main.js` (fail) -- `test-worker-esmodule.js` (fail) -- `test-worker-eval-typescript.js` (fail) -- `test-worker-event.js` (fail) -- `test-worker-execargv-invalid.js` (fail) -- `test-worker-execargv.js` (fail) -- `test-worker-exit-code.js` (fail) -- `test-worker-exit-event-error.js` (fail) -- `test-worker-exit-from-uncaught-exception.js` (fail) -- `test-worker-exit-heapsnapshot.js` (fail) -- `test-worker-fs-stat-watcher.js` (fail) -- `test-worker-hasref.js` (fail) -- `test-worker-heap-snapshot.js` (fail) -- `test-worker-heapdump-failure.js` (fail) -- `test-worker-http2-generic-streams-terminate.js` (fail) -- `test-worker-http2-stream-terminate.js` (fail) -- `test-worker-init-failure.js` (fail) -- `test-worker-invalid-workerdata.js` (fail) -- `test-worker-load-file-with-extension-other-than-js.js` (fail) -- `test-worker-memory.js` (fail) -- `test-worker-message-channel-sharedarraybuffer.js` (fail) -- `test-worker-message-channel.js` (fail) -- `test-worker-message-event.js` (fail) -- `test-worker-message-mark-as-uncloneable.js` (fail) -- `test-worker-message-not-serializable.js` (fail) -- `test-worker-message-port-arraybuffer.js` (fail) -- `test-worker-message-port-close-while-receiving.js` (fail) -- `test-worker-message-port-close.js` (fail) -- `test-worker-message-port-constructor.js` (fail) -- `test-worker-message-port-drain.js` (fail) -- `test-worker-message-port-infinite-message-loop.js` (fail) -- `test-worker-message-port-inspect-during-init-hook.js` (fail) -- `test-worker-message-port-jstransferable-nested-untransferable.js` (fail) -- `test-worker-message-port-message-before-close.js` (fail) -- `test-worker-message-port-message-port-transferring.js` (fail) -- `test-worker-message-port-move.js` (fail) -- `test-worker-message-port-multiple-sharedarraybuffers.js` (fail) -- `test-worker-message-port-receive-message.js` (fail) -- `test-worker-message-port-terminate-transfer-list.js` (fail) -- `test-worker-message-port-transfer-closed.js` (fail) -- `test-worker-message-port-transfer-duplicate.js` (fail) -- `test-worker-message-port-transfer-fake-js-transferable-internal.js` (fail) -- `test-worker-message-port-transfer-fake-js-transferable.js` (fail) -- `test-worker-message-port-transfer-filehandle.js` (fail) -- `test-worker-message-port-transfer-native.js` (fail) -- `test-worker-message-port-transfer-self.js` (fail) -- `test-worker-message-port-transfer-target.js` (fail) -- `test-worker-message-port-transfer-terminate.js` (fail) -- `test-worker-message-port-wasm-module.js` (fail) -- `test-worker-message-port-wasm-threads.js` (fail) -- `test-worker-message-port.js` (fail) -- `test-worker-message-transfer-port-mark-as-untransferable.js` (fail) -- `test-worker-message-type-unknown.js` (fail) -- `test-worker-messageport-hasref.js` (fail) -- `test-worker-messaging-errors-timeout.js` (fail) -- `test-worker-messaging.js` (fail) -- `test-worker-mjs-workerdata.js` (fail) -- `test-worker-name.js` (fail) -- `test-worker-nearheaplimit-deadlock.js` (fail) -- `test-worker-nested-on-process-exit.js` (fail) -- `test-worker-nested-uncaught.js` (fail) -- `test-worker-nexttick-terminate.js` (fail) -- `test-worker-no-sab.js` (fail) -- `test-worker-no-stdin-stdout-interaction.js` (fail) -- `test-worker-node-options.js` (fail) -- `test-worker-non-fatal-uncaught-exception.js` (fail) -- `test-worker-on-process-exit.js` (fail) -- `test-worker-onmessage-not-a-function.js` (fail) -- `test-worker-onmessage.js` (fail) -- `test-worker-parent-port-ref.js` (fail) -- `test-worker-process-argv.js` (fail) -- `test-worker-process-cwd.js` (fail) -- `test-worker-process-env-shared.js` (fail) -- `test-worker-process-env.js` (fail) -- `test-worker-process-exit-async-module.js` (fail) -- `test-worker-ref-onexit.js` (fail) -- `test-worker-ref.js` (fail) -- `test-worker-relative-path-double-dot.js` (fail) -- `test-worker-relative-path.js` (fail) -- `test-worker-resource-limits.js` (fail) -- `test-worker-safe-getters.js` (fail) -- `test-worker-sharedarraybuffer-from-worker-thread.js` (fail) -- `test-worker-stack-overflow-stack-size.js` (fail) -- `test-worker-stack-overflow.js` (fail) -- `test-worker-stdio-flush-inflight.js` (fail) -- `test-worker-stdio-flush.js` (fail) -- `test-worker-stdio-from-preload-module.js` (fail) -- `test-worker-stdio.js` (fail) -- `test-worker-syntax-error-file.js` (fail) -- `test-worker-syntax-error.js` (fail) -- `test-worker-terminate-http2-respond-with-file.js` (fail) -- `test-worker-terminate-microtask-loop.js` (fail) -- `test-worker-terminate-nested.js` (fail) -- `test-worker-terminate-null-handler.js` (fail) -- `test-worker-terminate-ref-public-port.js` (fail) -- `test-worker-terminate-source-map.js` (fail) -- `test-worker-terminate-timers.js` (fail) -- `test-worker-terminate-unrefed.js` (fail) -- `test-worker-track-unmanaged-fds.js` (fail) -- `test-worker-type-check.js` (fail) -- `test-worker-uncaught-exception-async.js` (fail) -- `test-worker-uncaught-exception.js` (fail) -- `test-worker-unref-from-message-during-exit.js` (fail) -- `test-worker-unsupported-path.js` (fail) -- `test-worker-unsupported-things.js` (fail) -- `test-worker-vm-context-terminate.js` (fail) -- `test-worker-voluntarily-exit-followed-by-addition.js` (fail) -- `test-worker-voluntarily-exit-followed-by-throw.js` (fail) -- `test-worker-workerdata-messageport.js` (fail) -- `test-worker-workerdata-sharedarraybuffer.js` (fail) -- `test-worker.js` (fail) - -### FIX-36: async_hooks module (36 tests) - -**Feasibility: Partial | Effort: High** - -async_hooks requires monitoring async resource creation/destruction and execution context switching. Would need V8 Promise hooks, timer tracking, and callback execution monitoring — all requiring runtime instrumentation not currently exposed. AsyncLocalStorage could be partially implemented with simpler context tracking. Full createHook() support is very high effort. Recommend deferring. - -- `test-async-hooks-asyncresource-constructor.js` (fail) -- `test-async-hooks-close-during-destroy.js` (fail) -- `test-async-hooks-constructor.js` (fail) -- `test-async-hooks-correctly-switch-promise-hook.js` (fail) -- `test-async-hooks-disable-during-promise.js` (fail) -- `test-async-hooks-enable-before-promise-resolve.js` (fail) -- `test-async-hooks-enable-disable-enable.js` (fail) -- `test-async-hooks-enable-disable.js` (fail) -- `test-async-hooks-enable-during-promise.js` (fail) -- `test-async-hooks-enable-recursive.js` (fail) -- `test-async-hooks-execution-async-resource-await.js` (fail) -- `test-async-hooks-execution-async-resource.js` (fail) -- `test-async-hooks-http-parser-destroy.js` (fail) -- `test-async-hooks-promise-enable-disable.js` (fail) -- `test-async-hooks-promise-triggerid.js` (fail) -- `test-async-hooks-promise.js` (fail) -- `test-async-hooks-recursive-stack-runInAsyncScope.js` (fail) -- `test-async-hooks-top-level-clearimmediate.js` (fail) -- `test-async-hooks-worker-asyncfn-terminate-1.js` (fail) -- `test-async-hooks-worker-asyncfn-terminate-2.js` (fail) -- `test-async-hooks-worker-asyncfn-terminate-3.js` (fail) -- `test-async-hooks-worker-asyncfn-terminate-4.js` (fail) -- `test-async-local-storage-bind.js` (fail) -- `test-async-local-storage-contexts.js` (fail) -- `test-async-local-storage-http-multiclients.js` (fail) -- `test-async-local-storage-snapshot.js` (fail) -- `test-async-wrap-constructor.js` (fail) -- `test-async-wrap-promise-after-enabled.js` (fail) -- `test-async-wrap-uncaughtexception.js` (fail) -- `test-asyncresource-bind.js` (fail) -- `test-emit-after-uncaught-exception.js` (fail) -- `test-eventemitter-asyncresource.js` (fail) -- `test-http-uncaught-from-request-callback.js` (fail) -- `test-messageport-hasref.js` (fail) -- `test-queue-microtask-uncaught-asynchooks.js` (fail) -- `test-stream-writable-samecb-singletick.js` (fail) - -### FIX-38: readline module (18 tests) - -**Feasibility: Medium | Effort: Medium** - -readline is a deferred stub. Implementation requires: createInterface() factory wrapping input/output streams, line-buffering, event handling ('line', 'close', 'SIGINT'), methods (question, pause, resume, close, write). Blocking issue: interactive tests expect stdin input that never arrives. Focus on stateless use cases (PassThrough streams, non-terminal mode). Could implement a minimal subset sufficient for common programmatic use. - -- `test-readline-async-iterators-backpressure.js` (fail) -- `test-readline-async-iterators-destroy.js` (fail) -- `test-readline-async-iterators.js` (fail) -- `test-readline-carriage-return-between-chunks.js` (fail) -- `test-readline-csi.js` (fail) -- `test-readline-emit-keypress-events.js` (fail) -- `test-readline-interface-escapecodetimeout.js` (fail) -- `test-readline-interface-no-trailing-newline.js` (fail) -- `test-readline-interface-recursive-writes.js` (fail) -- `test-readline-interface.js` (fail) -- `test-readline-keys.js` (fail) -- `test-readline-position.js` (fail) -- `test-readline-promises-interface.js` (fail) -- `test-readline-promises-tab-complete.js` (fail) -- `test-readline-reopen.js` (fail) -- `test-readline-set-raw-mode.js` (fail) -- `test-readline-tab-complete.js` (fail) -- `test-readline-undefined-columns.js` (fail) - -### FIX-39: diagnostics_channel module (32 tests) - -**Feasibility: High | Effort: Low** - -diagnostics_channel is a simple pub/sub event system. Implementation: maintain a Map registry, each Channel has subscriber list, `publish(msg)` calls all subscribers, `hasSubscribers` returns true if non-empty. Much simpler than async_hooks. Create `packages/nodejs/src/bridge/diagnostics-channel.ts` with real implementation. Low effort, unlocks 32 tests. - -- `test-diagnostics-channel-bind-store.js` (fail) -- `test-diagnostics-channel-has-subscribers.js` (fail) -- `test-diagnostics-channel-http-server-start.js` (fail) -- `test-diagnostics-channel-http.js` (fail) -- `test-diagnostics-channel-memory-leak.js` (fail) -- `test-diagnostics-channel-module-import-error.js` (fail) -- `test-diagnostics-channel-module-import.js` (fail) -- `test-diagnostics-channel-module-require-error.js` (fail) -- `test-diagnostics-channel-module-require.js` (fail) -- `test-diagnostics-channel-net.js` (fail) -- `test-diagnostics-channel-object-channel-pub-sub.js` (fail) -- `test-diagnostics-channel-process.js` (fail) -- `test-diagnostics-channel-pub-sub.js` (fail) -- `test-diagnostics-channel-safe-subscriber-errors.js` (fail) -- `test-diagnostics-channel-symbol-named.js` (fail) -- `test-diagnostics-channel-sync-unsubscribe.js` (fail) -- `test-diagnostics-channel-tracing-channel-args-types.js` (fail) -- `test-diagnostics-channel-tracing-channel-callback-early-exit.js` (fail) -- `test-diagnostics-channel-tracing-channel-callback-error.js` (fail) -- `test-diagnostics-channel-tracing-channel-callback-run-stores.js` (fail) -- `test-diagnostics-channel-tracing-channel-callback.js` (fail) -- `test-diagnostics-channel-tracing-channel-has-subscribers.js` (fail) -- `test-diagnostics-channel-tracing-channel-promise-early-exit.js` (fail) -- `test-diagnostics-channel-tracing-channel-promise-error.js` (fail) -- `test-diagnostics-channel-tracing-channel-promise-run-stores.js` (fail) -- `test-diagnostics-channel-tracing-channel-promise.js` (fail) -- `test-diagnostics-channel-tracing-channel-sync-early-exit.js` (fail) -- `test-diagnostics-channel-tracing-channel-sync-error.js` (fail) -- `test-diagnostics-channel-tracing-channel-sync-run-stores.js` (fail) -- `test-diagnostics-channel-tracing-channel-sync.js` (fail) -- `test-diagnostics-channel-udp.js` (fail) -- `test-diagnostics-channel-worker-threads.js` (fail) - ---- - -## Tests Not Covered by Any Fix - -### TEST-INFRA: requires Node.js internal test infrastructure (68 tests) - -**Resolution: Partially rescuable (~12-16 tests)** - -~12 tests are glob overrides that should actually pass with specific bug fixes. ~10 reference missing test helpers (benchmark/_cli.js, common/internet.js) that could be vendored. ~8 are ESLint/CI tooling tests (not runtime). ~4 are skip/error cases. Focus on vendoring missing helpers and fixing glob override tests. +~12 tests are glob overrides that should actually pass with specific bug fixes. ~10 reference missing test helpers (benchmark/_cli.js, common/internet.js) that could be vendored. ~8 are ESLint/CI tooling tests (not runtime). ~4 are skip/error cases. Focus on vendoring missing helpers and fixing glob override tests. - `test-benchmark-cli.js` (fail) - `test-eslint-alphabetize-errors.js` (fail) @@ -2737,29 +1987,169 @@ diagnostics_channel is a simple pub/sub event system. Implementation: maintain a - `test-tz-version.js` (vacuous-pass) - `test-windows-abort-exitcode.js` (vacuous-pass) -### UNSUPPORTED-MODULE: entire module not implemented (591 tests) +### UNSUPPORTED-MODULE: entire module not implemented (1226 tests) **Resolution: ~50-100 tests rescuable with net bridge** Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridged), tls (~192, feasible with OpenSSL bindings), net (~149, high effort TCP bridge), domain (~50, deprecated, never implement), inspector (~60, never feasible), repl (~75, never feasible), worker (~132, architecture-limited), readline (~19, partially feasible), dgram (~76, low priority), debugger (~25, never feasible), compiler (~15, never feasible), snapshot (~27, never feasible), shadow realm (~10, never feasible), quic (~4, never feasible), eslint (~24, not runtime), permission (~31, not runtime), trace (~35, not runtime), runner (~40, not runtime). Implementing net+tls bridge would rescue a subset of http2/https/tls tests. -- `test-corepack-version.js` (fail) -- `test-debugger-backtrace.js` (fail) -- `test-debugger-break.js` (fail) -- `test-debugger-breakpoint-exists.js` (fail) -- `test-debugger-clear-breakpoints.js` (fail) -- `test-debugger-exceptions.js` (fail) -- `test-debugger-exec.js` (fail) -- `test-debugger-heap-profiler.js` (fail) -- `test-debugger-list.js` (fail) -- `test-debugger-low-level.js` (fail) -- `test-debugger-object-type-remote-object.js` (fail) -- `test-debugger-pid.js` (fail) -- `test-debugger-preserve-breaks.js` (fail) -- `test-debugger-profile-command.js` (fail) -- `test-debugger-profile.js` (fail) -- `test-debugger-random-port-with-inspect-port.js` (fail) -- `test-debugger-random-port.js` (fail) +- `test-arm-math-illegal-instruction.js` (fail) +- `test-assert-fail-deprecation.js` (fail) +- `test-assert-first-line.js` (fail) +- `test-assert-objects.js` (fail) +- `test-assert.js` (fail) +- `test-async-hooks-asyncresource-constructor.js` (fail) +- `test-async-hooks-close-during-destroy.js` (fail) +- `test-async-hooks-constructor.js` (fail) +- `test-async-hooks-correctly-switch-promise-hook.js` (fail) +- `test-async-hooks-disable-during-promise.js` (fail) +- `test-async-hooks-enable-before-promise-resolve.js` (fail) +- `test-async-hooks-enable-disable-enable.js` (fail) +- `test-async-hooks-enable-disable.js` (fail) +- `test-async-hooks-enable-during-promise.js` (fail) +- `test-async-hooks-enable-recursive.js` (fail) +- `test-async-hooks-execution-async-resource-await.js` (fail) +- `test-async-hooks-execution-async-resource.js` (fail) +- `test-async-hooks-http-parser-destroy.js` (fail) +- `test-async-hooks-promise-enable-disable.js` (fail) +- `test-async-hooks-promise-triggerid.js` (fail) +- `test-async-hooks-promise.js` (fail) +- `test-async-hooks-recursive-stack-runInAsyncScope.js` (fail) +- `test-async-hooks-top-level-clearimmediate.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-1.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-2.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-3.js` (fail) +- `test-async-hooks-worker-asyncfn-terminate-4.js` (fail) +- `test-async-local-storage-bind.js` (fail) +- `test-async-local-storage-contexts.js` (fail) +- `test-async-local-storage-http-multiclients.js` (fail) +- `test-async-local-storage-snapshot.js` (fail) +- `test-async-wrap-constructor.js` (fail) +- `test-async-wrap-promise-after-enabled.js` (fail) +- `test-async-wrap-tlssocket-asyncreset.js` (fail) +- `test-async-wrap-uncaughtexception.js` (fail) +- `test-asyncresource-bind.js` (fail) +- `test-blocklist-clone.js` (fail) +- `test-blocklist.js` (fail) +- `test-bootstrap-modules.js` (fail) +- `test-broadcastchannel-custom-inspect.js` (fail) +- `test-buffer-alloc.js` (fail) +- `test-buffer-bytelength.js` (fail) +- `test-buffer-from.js` (fail) +- `test-buffer-pool-untransferable.js` (fail) +- `test-buffer-resizable.js` (fail) +- `test-c-ares.js` (fail) +- `test-child-process-disconnect.js` (fail) +- `test-child-process-fork-closed-channel-segfault.js` (fail) +- `test-child-process-fork-dgram.js` (fail) +- `test-child-process-fork-getconnections.js` (fail) +- `test-child-process-fork-net-server.js` (fail) +- `test-child-process-fork-net-socket.js` (fail) +- `test-child-process-fork-net.js` (fail) +- `test-cluster-accept-fail.js` (fail) +- `test-cluster-advanced-serialization.js` (fail) +- `test-cluster-basic.js` (fail) +- `test-cluster-bind-privileged-port.js` (fail) +- `test-cluster-bind-twice.js` (fail) +- `test-cluster-call-and-destroy.js` (fail) +- `test-cluster-child-index-dgram.js` (fail) +- `test-cluster-child-index-net.js` (fail) +- `test-cluster-concurrent-disconnect.js` (fail) +- `test-cluster-cwd.js` (fail) +- `test-cluster-dgram-1.js` (fail) +- `test-cluster-dgram-2.js` (fail) +- `test-cluster-dgram-bind-fd.js` (fail) +- `test-cluster-dgram-reuse.js` (fail) +- `test-cluster-dgram-reuseport.js` (fail) +- `test-cluster-disconnect-before-exit.js` (fail) +- `test-cluster-disconnect-exitedAfterDisconnect-race.js` (fail) +- `test-cluster-disconnect-idle-worker.js` (fail) +- `test-cluster-disconnect-leak.js` (fail) +- `test-cluster-disconnect-race.js` (fail) +- `test-cluster-disconnect-unshared-tcp.js` (fail) +- `test-cluster-disconnect-unshared-udp.js` (fail) +- `test-cluster-disconnect-with-no-workers.js` (fail) +- `test-cluster-disconnect.js` (fail) +- `test-cluster-eaccess.js` (fail) +- `test-cluster-eaddrinuse.js` (fail) +- `test-cluster-fork-env.js` (fail) +- `test-cluster-fork-stdio.js` (fail) +- `test-cluster-fork-windowsHide.js` (fail) +- `test-cluster-http-pipe.js` (fail) +- `test-cluster-invalid-message.js` (fail) +- `test-cluster-ipc-throw.js` (fail) +- `test-cluster-kill-disconnect.js` (fail) +- `test-cluster-kill-infinite-loop.js` (fail) +- `test-cluster-listen-pipe-readable-writable.js` (fail) +- `test-cluster-listening-port.js` (fail) +- `test-cluster-message.js` (fail) +- `test-cluster-net-listen-backlog.js` (fail) +- `test-cluster-net-listen-relative-path.js` (fail) +- `test-cluster-net-listen.js` (fail) +- `test-cluster-net-reuseport.js` (fail) +- `test-cluster-net-send.js` (fail) +- `test-cluster-net-server-drop-connection.js` (fail) +- `test-cluster-primary-error.js` (fail) +- `test-cluster-primary-kill.js` (fail) +- `test-cluster-process-disconnect.js` (fail) +- `test-cluster-rr-domain-listen.js` (fail) +- `test-cluster-rr-handle-close.js` (fail) +- `test-cluster-rr-handle-keep-loop-alive.js` (fail) +- `test-cluster-rr-handle-ref-unref.js` (fail) +- `test-cluster-rr-ref.js` (fail) +- `test-cluster-send-deadlock.js` (fail) +- `test-cluster-send-handle-twice.js` (fail) +- `test-cluster-send-socket-to-worker-http-server.js` (fail) +- `test-cluster-server-restart-none.js` (fail) +- `test-cluster-server-restart-rr.js` (fail) +- `test-cluster-setup-primary-argv.js` (fail) +- `test-cluster-setup-primary-cumulative.js` (fail) +- `test-cluster-setup-primary-emit.js` (fail) +- `test-cluster-setup-primary-multiple.js` (fail) +- `test-cluster-setup-primary.js` (fail) +- `test-cluster-shared-handle-bind-error.js` (fail) +- `test-cluster-shared-leak.js` (fail) +- `test-cluster-uncaught-exception.js` (fail) +- `test-cluster-worker-constructor.js` (fail) +- `test-cluster-worker-death.js` (fail) +- `test-cluster-worker-destroy.js` (fail) +- `test-cluster-worker-disconnect-on-error.js` (fail) +- `test-cluster-worker-disconnect.js` (fail) +- `test-cluster-worker-events.js` (fail) +- `test-cluster-worker-exit.js` (fail) +- `test-cluster-worker-forced-exit.js` (fail) +- `test-cluster-worker-handle-close.js` (fail) +- `test-cluster-worker-init.js` (fail) +- `test-cluster-worker-isconnected.js` (fail) +- `test-cluster-worker-isdead.js` (fail) +- `test-cluster-worker-kill-signal.js` (fail) +- `test-cluster-worker-kill.js` (fail) +- `test-cluster-worker-no-exit.js` (fail) +- `test-cluster-worker-wait-server-close.js` (fail) +- `test-console.js` (fail) +- `test-corepack-version.js` (fail) +- `test-crypto-domain.js` (fail) +- `test-crypto-domains.js` (fail) +- `test-crypto-key-objects-messageport.js` (fail) +- `test-crypto-verify-failure.js` (fail) +- `test-crypto.js` (fail) +- `test-datetime-change-notify.js` (fail) +- `test-debugger-backtrace.js` (fail) +- `test-debugger-break.js` (fail) +- `test-debugger-breakpoint-exists.js` (fail) +- `test-debugger-clear-breakpoints.js` (fail) +- `test-debugger-exceptions.js` (fail) +- `test-debugger-exec.js` (fail) +- `test-debugger-heap-profiler.js` (fail) +- `test-debugger-list.js` (fail) +- `test-debugger-low-level.js` (fail) +- `test-debugger-object-type-remote-object.js` (fail) +- `test-debugger-pid.js` (fail) +- `test-debugger-preserve-breaks.js` (fail) +- `test-debugger-profile-command.js` (fail) +- `test-debugger-profile.js` (fail) +- `test-debugger-random-port-with-inspect-port.js` (fail) +- `test-debugger-random-port.js` (fail) - `test-debugger-repeat-last.js` (fail) - `test-debugger-restart-message.js` (fail) - `test-debugger-run-after-quit-restart.js` (fail) @@ -2842,105 +2232,302 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-dgram-udp4.js` (fail) - `test-dgram-unref-in-cluster.js` (fail) - `test-dgram-unref.js` (fail) -- `test-inspector-already-activated-cli.js` (fail) -- `test-inspector-async-call-stack-abort.js` (fail) -- `test-inspector-async-call-stack.js` (fail) -- `test-inspector-async-context-brk.js` (fail) -- `test-inspector-async-hook-after-done.js` (fail) -- `test-inspector-async-hook-setup-at-inspect-brk.js` (fail) -- `test-inspector-async-hook-setup-at-signal.js` (fail) -- `test-inspector-async-stack-traces-promise-then.js` (fail) -- `test-inspector-async-stack-traces-set-interval.js` (fail) -- `test-inspector-bindings.js` (fail) -- `test-inspector-break-e.js` (fail) -- `test-inspector-break-when-eval.js` (fail) -- `test-inspector-close-worker.js` (fail) -- `test-inspector-connect-main-thread.js` (fail) -- `test-inspector-connect-to-main-thread.js` (fail) -- `test-inspector-console-top-frame.js` (fail) -- `test-inspector-console.js` (fail) -- `test-inspector-contexts.js` (fail) -- `test-inspector-debug-brk-flag.js` (fail) -- `test-inspector-debug-end.js` (fail) -- `test-inspector-emit-protocol-event.js` (fail) -- `test-inspector-enabled.js` (fail) -- `test-inspector-esm.js` (fail) -- `test-inspector-exception.js` (fail) -- `test-inspector-exit-worker-in-wait-for-connection.js` (fail) -- `test-inspector-exit-worker-in-wait-for-connection2.js` (fail) -- `test-inspector-has-idle.js` (fail) -- `test-inspector-has-inspector-false.js` (fail) -- `test-inspector-heap-allocation-tracker.js` (fail) -- `test-inspector-heapdump.js` (fail) -- `test-inspector-inspect-brk-node.js` (fail) -- `test-inspector-invalid-args.js` (fail) -- `test-inspector-ip-detection.js` (fail) -- `test-inspector-module.js` (fail) -- `test-inspector-multisession-js.js` (fail) -- `test-inspector-multisession-ws.js` (fail) -- `test-inspector-network-fetch.js` (fail) -- `test-inspector-network-http.js` (fail) -- `test-inspector-not-blocked-on-idle.js` (fail) -- `test-inspector-open-coverage.js` (fail) -- `test-inspector-open-port-integer-overflow.js` (fail) -- `test-inspector-open.js` (fail) -- `test-inspector-overwrite-config.js` (fail) -- `test-inspector-port-zero-cluster.js` (fail) -- `test-inspector-port-zero.js` (fail) -- `test-inspector-promises.js` (fail) -- `test-inspector-reported-host.js` (fail) -- `test-inspector-resource-name-to-url.js` (fail) -- `test-inspector-runtime-evaluate-with-timeout.js` (fail) -- `test-inspector-scriptparsed-context.js` (fail) -- `test-inspector-stop-profile-after-done.js` (fail) -- `test-inspector-stops-no-file.js` (fail) -- `test-inspector-stress-http.js` (fail) -- `test-inspector-strip-types.js` (fail) -- `test-inspector-tracing-domain.js` (fail) -- `test-inspector-vm-global-accessors-getter-sideeffect.js` (fail) -- `test-inspector-vm-global-accessors-sideeffects.js` (fail) -- `test-inspector-wait-for-connection.js` (fail) -- `test-inspector-waiting-for-disconnect.js` (fail) -- `test-inspector-workers-flat-list.js` (fail) -- `test-net-access-byteswritten.js` (fail) -- `test-net-after-close.js` (fail) -- `test-net-allow-half-open.js` (fail) -- `test-net-autoselectfamily-attempt-timeout-cli-option.js` (fail) -- `test-net-autoselectfamily-attempt-timeout-default-value.js` (fail) -- `test-net-autoselectfamily-commandline-option.js` (fail) -- `test-net-autoselectfamily-default.js` (fail) -- `test-net-autoselectfamily-ipv4first.js` (fail) -- `test-net-autoselectfamily.js` (fail) -- `test-net-better-error-messages-listen-path.js` (fail) -- `test-net-better-error-messages-listen.js` (fail) -- `test-net-better-error-messages-path.js` (fail) -- `test-net-better-error-messages-port-hostname.js` (fail) -- `test-net-binary.js` (fail) -- `test-net-bind-twice.js` (fail) -- `test-net-blocklist.js` (fail) -- `test-net-buffersize.js` (fail) -- `test-net-bytes-read.js` (fail) -- `test-net-bytes-stats.js` (fail) -- `test-net-bytes-written-large.js` (fail) -- `test-net-can-reset-timeout.js` (fail) -- `test-net-child-process-connect-reset.js` (fail) -- `test-net-client-bind-twice.js` (fail) -- `test-net-connect-abort-controller.js` (fail) -- `test-net-connect-buffer.js` (fail) -- `test-net-connect-buffer2.js` (fail) -- `test-net-connect-call-socket-connect.js` (fail) -- `test-net-connect-immediate-destroy.js` (fail) -- `test-net-connect-immediate-finish.js` (fail) -- `test-net-connect-keepalive.js` (fail) -- `test-net-connect-memleak.js` (fail) -- `test-net-connect-no-arg.js` (fail) -- `test-net-connect-nodelay.js` (fail) -- `test-net-connect-options-allowhalfopen.js` (fail) -- `test-net-connect-options-fd.js` (fail) -- `test-net-connect-options-invalid.js` (fail) -- `test-net-connect-options-path.js` (fail) -- `test-net-connect-options-port.js` (fail) -- `test-net-connect-paused-connection.js` (fail) +- `test-diagnostics-channel-bind-store.js` (fail) +- `test-diagnostics-channel-has-subscribers.js` (fail) +- `test-diagnostics-channel-http-server-start.js` (fail) +- `test-diagnostics-channel-http.js` (fail) +- `test-diagnostics-channel-memory-leak.js` (fail) +- `test-diagnostics-channel-module-import-error.js` (fail) +- `test-diagnostics-channel-module-import.js` (fail) +- `test-diagnostics-channel-module-require-error.js` (fail) +- `test-diagnostics-channel-module-require.js` (fail) +- `test-diagnostics-channel-net.js` (fail) +- `test-diagnostics-channel-object-channel-pub-sub.js` (fail) +- `test-diagnostics-channel-process.js` (fail) +- `test-diagnostics-channel-pub-sub.js` (fail) +- `test-diagnostics-channel-safe-subscriber-errors.js` (fail) +- `test-diagnostics-channel-symbol-named.js` (fail) +- `test-diagnostics-channel-sync-unsubscribe.js` (fail) +- `test-diagnostics-channel-tracing-channel-args-types.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-callback.js` (fail) +- `test-diagnostics-channel-tracing-channel-has-subscribers.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-promise.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-early-exit.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-error.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync-run-stores.js` (fail) +- `test-diagnostics-channel-tracing-channel-sync.js` (fail) +- `test-diagnostics-channel-udp.js` (fail) +- `test-diagnostics-channel-worker-threads.js` (fail) +- `test-domain-abort-on-uncaught.js` (fail) +- `test-domain-add-remove.js` (fail) +- `test-domain-async-id-map-leak.js` (fail) +- `test-domain-bind-timeout.js` (fail) +- `test-domain-crypto.js` (fail) +- `test-domain-dep0097.js` (fail) +- `test-domain-ee-error-listener.js` (fail) +- `test-domain-ee-implicit.js` (fail) +- `test-domain-ee.js` (fail) +- `test-domain-emit-error-handler-stack.js` (fail) +- `test-domain-enter-exit.js` (fail) +- `test-domain-error-types.js` (fail) +- `test-domain-fs-enoent-stream.js` (fail) +- `test-domain-http-server.js` (fail) +- `test-domain-implicit-binding.js` (fail) +- `test-domain-implicit-fs.js` (fail) +- `test-domain-intercept.js` (fail) +- `test-domain-load-after-set-uncaught-exception-capture.js` (fail) +- `test-domain-multi.js` (fail) +- `test-domain-multiple-errors.js` (fail) +- `test-domain-nested-throw.js` (fail) +- `test-domain-nested.js` (fail) +- `test-domain-nexttick.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-0.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-1.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-2.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-3.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-4.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-5.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-6.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-7.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-8.js` (fail) +- `test-domain-no-error-handler-abort-on-uncaught-9.js` (fail) +- `test-domain-promise.js` (fail) +- `test-domain-run.js` (fail) +- `test-domain-safe-exit.js` (fail) +- `test-domain-set-uncaught-exception-capture-after-load.js` (fail) +- `test-domain-stack-empty-in-process-uncaughtexception.js` (fail) +- `test-domain-stack.js` (fail) +- `test-domain-throw-error-then-throw-from-uncaught-exception-handler.js` (fail) +- `test-domain-thrown-error-handler-stack.js` (fail) +- `test-domain-timer.js` (fail) +- `test-domain-timers-uncaught-exception.js` (fail) +- `test-domain-timers.js` (fail) +- `test-domain-top-level-error-handler-clears-stack.js` (fail) +- `test-domain-top-level-error-handler-throw.js` (fail) +- `test-domain-uncaught-exception.js` (fail) +- `test-domain-vm-promise-isolation.js` (fail) +- `test-domain-with-abort-on-uncaught-exception.js` (fail) +- `test-double-tls-client.js` (fail) +- `test-emit-after-uncaught-exception.js` (fail) +- `test-event-emitter-no-error-provided-to-error-event.js` (fail) +- `test-eventemitter-asyncresource.js` (fail) +- `test-fetch-mock.js` (fail) +- `test-fs-mkdir.js` (fail) +- `test-fs-operations-with-surrogate-pairs.js` (fail) +- `test-fs-readdir-recursive.js` (fail) +- `test-fs-whatwg-url.js` (fail) +- `test-fs-write-file-sync.js` (fail) +- `test-http-agent-reuse-drained-socket-only.js` (fail) +- `test-http-autoselectfamily.js` (fail) +- `test-http-client-error-rawbytes.js` (fail) +- `test-http-client-parse-error.js` (fail) +- `test-http-client-reject-chunked-with-content-length.js` (fail) +- `test-http-client-reject-cr-no-lf.js` (fail) +- `test-http-client-response-domain.js` (fail) +- `test-http-common.js` (fail) +- `test-http-conn-reset.js` (fail) +- `test-http-default-port.js` (fail) +- `test-http-extra-response.js` (fail) +- `test-http-incoming-pipelined-socket-destroy.js` (fail) +- `test-http-invalid-urls.js` (fail) +- `test-http-invalidheaderfield2.js` (fail) +- `test-http-multi-line-headers.js` (fail) +- `test-http-no-content-length.js` (fail) +- `test-http-parser.js` (fail) +- `test-http-perf_hooks.js` (fail) +- `test-http-pipeline-requests-connection-leak.js` (fail) +- `test-http-request-agent.js` (fail) +- `test-http-response-no-headers.js` (fail) +- `test-http-response-splitting.js` (fail) +- `test-http-response-status-message.js` (fail) +- `test-http-server-headers-timeout-delayed-headers.js` (fail) +- `test-http-server-headers-timeout-interrupted-headers.js` (fail) +- `test-http-server-headers-timeout-keepalive.js` (fail) +- `test-http-server-headers-timeout-pipelining.js` (fail) +- `test-http-server-multiple-client-error.js` (fail) +- `test-http-server-request-timeout-delayed-body.js` (fail) +- `test-http-server-request-timeout-delayed-headers.js` (fail) +- `test-http-server-request-timeout-interrupted-body.js` (fail) +- `test-http-server-request-timeout-interrupted-headers.js` (fail) +- `test-http-server-request-timeout-keepalive.js` (fail) +- `test-http-server-request-timeout-pipelining.js` (fail) +- `test-http-server-request-timeout-upgrade.js` (fail) +- `test-http-server.js` (fail) +- `test-http-should-keep-alive.js` (fail) +- `test-http-uncaught-from-request-callback.js` (fail) +- `test-http-upgrade-agent.js` (fail) +- `test-http-upgrade-binary.js` (fail) +- `test-http-upgrade-client.js` (fail) +- `test-http-upgrade-server.js` (fail) +- `test-http-url.parse-https.request.js` (fail) +- `test-https-abortcontroller.js` (fail) +- `test-https-agent-abort-controller.js` (fail) +- `test-https-agent-additional-options.js` (fail) +- `test-https-agent-constructor.js` (fail) +- `test-https-agent-create-connection.js` (fail) +- `test-https-agent-disable-session-reuse.js` (fail) +- `test-https-agent-getname.js` (fail) +- `test-https-agent-keylog.js` (fail) +- `test-https-agent-servername.js` (fail) +- `test-https-agent-session-eviction.js` (fail) +- `test-https-agent-session-injection.js` (fail) +- `test-https-agent-session-reuse.js` (fail) +- `test-https-agent-sni.js` (fail) +- `test-https-agent-sockets-leak.js` (fail) +- `test-https-agent-unref-socket.js` (fail) +- `test-https-agent.js` (fail) +- `test-https-argument-of-creating.js` (fail) +- `test-https-autoselectfamily.js` (fail) +- `test-https-byteswritten.js` (fail) +- `test-https-client-checkServerIdentity.js` (fail) +- `test-https-client-get-url.js` (fail) +- `test-https-client-override-global-agent.js` (fail) +- `test-https-client-reject.js` (fail) +- `test-https-client-resume.js` (fail) +- `test-https-close.js` (fail) +- `test-https-connecting-to-http.js` (fail) +- `test-https-drain.js` (fail) +- `test-https-eof-for-eom.js` (fail) +- `test-https-host-headers.js` (fail) +- `test-https-hwm.js` (fail) +- `test-https-insecure-parse-per-stream.js` (fail) +- `test-https-keep-alive-drop-requests.js` (fail) +- `test-https-localaddress-bind-error.js` (fail) +- `test-https-localaddress.js` (fail) +- `test-https-max-header-size-per-stream.js` (fail) +- `test-https-max-headers-count.js` (fail) +- `test-https-options-boolean-check.js` (fail) +- `test-https-pfx.js` (fail) +- `test-https-request-arguments.js` (fail) +- `test-https-resume-after-renew.js` (fail) +- `test-https-selfsigned-no-keycertsign-no-crash.js` (fail) +- `test-https-server-async-dispose.js` (fail) +- `test-https-server-close-all.js` (fail) +- `test-https-server-close-destroy-timeout.js` (fail) +- `test-https-server-close-idle.js` (fail) +- `test-https-server-connections-checking-leak.js` (fail) +- `test-https-server-headers-timeout.js` (fail) +- `test-https-server-options-incoming-message.js` (fail) +- `test-https-server-options-server-response.js` (fail) +- `test-https-server-request-timeout.js` (fail) +- `test-https-set-timeout-server.js` (fail) +- `test-https-simple.js` (fail) +- `test-https-socket-options.js` (fail) +- `test-https-strict.js` (fail) +- `test-https-timeout-server-2.js` (fail) +- `test-https-timeout-server.js` (fail) +- `test-https-timeout.js` (fail) +- `test-https-truncate.js` (fail) +- `test-https-unix-socket-self-signed.js` (fail) +- `test-inspect-support-for-node_options.js` (fail) +- `test-inspector-already-activated-cli.js` (fail) +- `test-inspector-async-call-stack-abort.js` (fail) +- `test-inspector-async-call-stack.js` (fail) +- `test-inspector-async-context-brk.js` (fail) +- `test-inspector-async-hook-after-done.js` (fail) +- `test-inspector-async-hook-setup-at-inspect-brk.js` (fail) +- `test-inspector-async-hook-setup-at-signal.js` (fail) +- `test-inspector-async-stack-traces-promise-then.js` (fail) +- `test-inspector-async-stack-traces-set-interval.js` (fail) +- `test-inspector-bindings.js` (fail) +- `test-inspector-break-e.js` (fail) +- `test-inspector-break-when-eval.js` (fail) +- `test-inspector-close-worker.js` (fail) +- `test-inspector-connect-main-thread.js` (fail) +- `test-inspector-connect-to-main-thread.js` (fail) +- `test-inspector-console-top-frame.js` (fail) +- `test-inspector-console.js` (fail) +- `test-inspector-contexts.js` (fail) +- `test-inspector-debug-brk-flag.js` (fail) +- `test-inspector-debug-end.js` (fail) +- `test-inspector-emit-protocol-event.js` (fail) +- `test-inspector-enabled.js` (fail) +- `test-inspector-esm.js` (fail) +- `test-inspector-exception.js` (fail) +- `test-inspector-exit-worker-in-wait-for-connection.js` (fail) +- `test-inspector-exit-worker-in-wait-for-connection2.js` (fail) +- `test-inspector-has-idle.js` (fail) +- `test-inspector-has-inspector-false.js` (fail) +- `test-inspector-heap-allocation-tracker.js` (fail) +- `test-inspector-heapdump.js` (fail) +- `test-inspector-inspect-brk-node.js` (fail) +- `test-inspector-invalid-args.js` (fail) +- `test-inspector-ip-detection.js` (fail) +- `test-inspector-module.js` (fail) +- `test-inspector-multisession-js.js` (fail) +- `test-inspector-multisession-ws.js` (fail) +- `test-inspector-network-fetch.js` (fail) +- `test-inspector-network-http.js` (fail) +- `test-inspector-not-blocked-on-idle.js` (fail) +- `test-inspector-open-coverage.js` (fail) +- `test-inspector-open-port-integer-overflow.js` (fail) +- `test-inspector-open.js` (fail) +- `test-inspector-overwrite-config.js` (fail) +- `test-inspector-port-zero-cluster.js` (fail) +- `test-inspector-port-zero.js` (fail) +- `test-inspector-promises.js` (fail) +- `test-inspector-reported-host.js` (fail) +- `test-inspector-resource-name-to-url.js` (fail) +- `test-inspector-runtime-evaluate-with-timeout.js` (fail) +- `test-inspector-scriptparsed-context.js` (fail) +- `test-inspector-stop-profile-after-done.js` (fail) +- `test-inspector-stops-no-file.js` (fail) +- `test-inspector-stress-http.js` (fail) +- `test-inspector-strip-types.js` (fail) +- `test-inspector-tracing-domain.js` (fail) +- `test-inspector-vm-global-accessors-getter-sideeffect.js` (fail) +- `test-inspector-vm-global-accessors-sideeffects.js` (fail) +- `test-inspector-wait-for-connection.js` (fail) +- `test-inspector-waiting-for-disconnect.js` (fail) +- `test-inspector-workers-flat-list.js` (fail) +- `test-intl-v8BreakIterator.js` (fail) +- `test-listen-fd-ebadf.js` (fail) +- `test-messageport-hasref.js` (fail) +- `test-net-access-byteswritten.js` (fail) +- `test-net-after-close.js` (fail) +- `test-net-allow-half-open.js` (fail) +- `test-net-autoselectfamily-attempt-timeout-cli-option.js` (fail) +- `test-net-autoselectfamily-attempt-timeout-default-value.js` (fail) +- `test-net-autoselectfamily-commandline-option.js` (fail) +- `test-net-autoselectfamily-default.js` (fail) +- `test-net-autoselectfamily-ipv4first.js` (fail) +- `test-net-autoselectfamily.js` (fail) +- `test-net-better-error-messages-listen-path.js` (fail) +- `test-net-better-error-messages-listen.js` (fail) +- `test-net-better-error-messages-path.js` (fail) +- `test-net-better-error-messages-port-hostname.js` (fail) +- `test-net-binary.js` (fail) +- `test-net-bind-twice.js` (fail) +- `test-net-blocklist.js` (fail) +- `test-net-buffersize.js` (fail) +- `test-net-bytes-read.js` (fail) +- `test-net-bytes-stats.js` (fail) +- `test-net-bytes-written-large.js` (fail) +- `test-net-can-reset-timeout.js` (fail) +- `test-net-child-process-connect-reset.js` (fail) +- `test-net-client-bind-twice.js` (fail) +- `test-net-connect-abort-controller.js` (fail) +- `test-net-connect-buffer.js` (fail) +- `test-net-connect-buffer2.js` (fail) +- `test-net-connect-call-socket-connect.js` (fail) +- `test-net-connect-immediate-destroy.js` (fail) +- `test-net-connect-immediate-finish.js` (fail) +- `test-net-connect-keepalive.js` (fail) +- `test-net-connect-memleak.js` (fail) +- `test-net-connect-no-arg.js` (fail) +- `test-net-connect-nodelay.js` (fail) +- `test-net-connect-options-allowhalfopen.js` (fail) +- `test-net-connect-options-fd.js` (fail) +- `test-net-connect-options-invalid.js` (fail) +- `test-net-connect-options-path.js` (fail) +- `test-net-connect-options-port.js` (fail) +- `test-net-connect-paused-connection.js` (fail) - `test-net-connect-reset-after-destroy.js` (fail) - `test-net-connect-reset-before-connected.js` (fail) - `test-net-connect-reset-until-connected.js` (fail) @@ -3047,11 +2634,70 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-net-write-fully-async-buffer.js` (fail) - `test-net-write-fully-async-hex-string.js` (fail) - `test-net-write-slow.js` (fail) +- `test-next-tick-domain.js` (fail) +- `test-no-addons-resolution-condition.js` (fail) - `test-npm-version.js` (fail) +- `test-outgoing-message-pipe.js` (fail) +- `test-perf-gc-crash.js` (fail) +- `test-perf-hooks-histogram.js` (fail) +- `test-perf-hooks-resourcetiming.js` (fail) +- `test-perf-hooks-usertiming.js` (fail) +- `test-perf-hooks-worker-timeorigin.js` (fail) +- `test-performance-eventlooputil.js` (fail) +- `test-performance-function-async.js` (fail) +- `test-performance-function.js` (fail) +- `test-performance-global.js` (fail) +- `test-performance-measure-detail.js` (fail) +- `test-performance-measure.js` (fail) +- `test-performance-nodetiming.js` (fail) +- `test-performance-resourcetimingbufferfull.js` (fail) +- `test-performance-resourcetimingbuffersize.js` (fail) +- `test-performanceobserver-gc.js` (fail) +- `test-pipe-abstract-socket.js` (fail) +- `test-pipe-address.js` (fail) +- `test-pipe-stream.js` (fail) +- `test-pipe-unref.js` (fail) +- `test-pipe-writev.js` (fail) +- `test-preload-self-referential.js` (fail) +- `test-process-chdir-errormessage.js` (fail) +- `test-process-chdir.js` (fail) +- `test-process-env-sideeffects.js` (fail) +- `test-process-env-tz.js` (fail) +- `test-process-euid-egid.js` (fail) +- `test-process-getactivehandles.js` (fail) +- `test-process-getactiveresources-track-active-handles.js` (fail) +- `test-process-initgroups.js` (fail) +- `test-process-ref-unref.js` (fail) +- `test-process-setgroups.js` (fail) +- `test-process-uid-gid.js` (fail) +- `test-process-umask-mask.js` (fail) +- `test-process-umask.js` (fail) +- `test-querystring.js` (fail) +- `test-queue-microtask-uncaught-asynchooks.js` (fail) - `test-quic-internal-endpoint-listen-defaults.js` (fail) - `test-quic-internal-endpoint-options.js` (fail) - `test-quic-internal-endpoint-stats-state.js` (fail) - `test-quic-internal-setcallbacks.js` (fail) +- `test-readline-async-iterators-backpressure.js` (fail) +- `test-readline-async-iterators-destroy.js` (fail) +- `test-readline-async-iterators.js` (fail) +- `test-readline-carriage-return-between-chunks.js` (fail) +- `test-readline-csi.js` (fail) +- `test-readline-emit-keypress-events.js` (fail) +- `test-readline-interface-escapecodetimeout.js` (fail) +- `test-readline-interface-no-trailing-newline.js` (fail) +- `test-readline-interface-recursive-writes.js` (fail) +- `test-readline-interface.js` (fail) +- `test-readline-keys.js` (fail) +- `test-readline-position.js` (fail) +- `test-readline-promises-interface.js` (fail) +- `test-readline-promises-tab-complete.js` (fail) +- `test-readline-reopen.js` (fail) +- `test-readline-set-raw-mode.js` (fail) +- `test-readline-tab-complete.js` (fail) +- `test-readline-undefined-columns.js` (fail) +- `test-readline.js` (fail) +- `test-ref-unref-return.js` (fail) - `test-repl-array-prototype-tempering.js` (fail) - `test-repl-autocomplete.js` (fail) - `test-repl-autolibs.js` (fail) @@ -3126,6 +2772,27 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-repl-unsafe-array-iteration.js` (fail) - `test-repl-unsupported-option.js` (fail) - `test-repl-use-global.js` (fail) +- `test-repl.js` (fail) +- `test-require-resolve-opts-paths-relative.js` (fail) +- `test-set-process-debug-port.js` (fail) +- `test-signal-handler.js` (skip) +- `test-socket-address.js` (fail) +- `test-socket-options-invalid.js` (fail) +- `test-socket-write-after-fin-error.js` (fail) +- `test-socket-write-after-fin.js` (fail) +- `test-socket-writes-before-passed-to-tls-socket.js` (fail) +- `test-stdio-pipe-redirect.js` (fail) +- `test-stream-aliases-legacy.js` (fail) +- `test-stream-base-typechecking.js` (fail) +- `test-stream-consumers.js` (fail) +- `test-stream-pipeline.js` (fail) +- `test-stream-preprocess.js` (fail) +- `test-stream-writable-samecb-singletick.js` (fail) +- `test-stream3-pipeline-async-iterator.js` (fail) +- `test-timers-immediate-queue-throw.js` (fail) +- `test-timers-reset-process-domain-on-throw.js` (fail) +- `test-timers-socket-timeout-removes-other-socket-unref-timer.js` (fail) +- `test-timers-unrefed-in-callback.js` (fail) - `test-tls-0-dns-altname.js` (fail) - `test-tls-add-context.js` (fail) - `test-tls-addca.js` (fail) @@ -3302,6 +2969,7 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-tls-write-error.js` (fail) - `test-tls-writewrap-leak.js` (fail) - `test-tls-zero-clear-in.js` (fail) +- `test-tojson-perf_hooks.js` (fail) - `test-trace-atomic-deprecation.js` (fail) - `test-trace-atomics-wait.js` (fail) - `test-trace-env-stack.js` (fail) @@ -3334,14 +3002,241 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-trace-events-worker-metadata.js` (fail) - `test-trace-exit-stack-limit.js` (fail) - `test-trace-exit.js` (fail) +- `test-tty-stdin-pipe.js` (fail) +- `test-url-domain-ascii-unicode.js` (fail) +- `test-url-format.js` (fail) +- `test-url-parse-format.js` (fail) +- `test-util-stripvtcontrolcharacters.js` (fail) +- `test-util-text-decoder.js` (fail) +- `test-vm-access-process-env.js` (fail) +- `test-vm-api-handles-getter-errors.js` (fail) +- `test-vm-attributes-property-not-on-sandbox.js` (fail) +- `test-vm-basic.js` (fail) +- `test-vm-cached-data.js` (fail) +- `test-vm-codegen.js` (fail) +- `test-vm-context-async-script.js` (fail) +- `test-vm-context-dont-contextify.js` (fail) +- `test-vm-context-property-forwarding.js` (fail) +- `test-vm-context.js` (fail) +- `test-vm-create-and-run-in-context.js` (fail) +- `test-vm-create-context-accessors.js` (fail) +- `test-vm-create-context-arg.js` (fail) +- `test-vm-create-context-circular-reference.js` (fail) +- `test-vm-createcacheddata.js` (fail) +- `test-vm-cross-context.js` (fail) +- `test-vm-data-property-writable.js` (fail) +- `test-vm-deleting-property.js` (fail) +- `test-vm-dynamic-import-callback-missing-flag.js` (fail) +- `test-vm-function-declaration.js` (fail) +- `test-vm-function-redefinition.js` (fail) +- `test-vm-getters.js` (fail) +- `test-vm-global-assignment.js` (fail) +- `test-vm-global-configurable-properties.js` (fail) +- `test-vm-global-define-property.js` (fail) +- `test-vm-global-get-own.js` (fail) +- `test-vm-global-identity.js` (fail) +- `test-vm-global-non-writable-properties.js` (fail) +- `test-vm-global-property-enumerator.js` (fail) +- `test-vm-global-property-interceptors.js` (fail) +- `test-vm-global-property-prototype.js` (fail) +- `test-vm-global-setter.js` (fail) +- `test-vm-harmony-symbols.js` (fail) +- `test-vm-indexed-properties.js` (fail) +- `test-vm-inherited_properties.js` (fail) +- `test-vm-is-context.js` (fail) +- `test-vm-low-stack-space.js` (fail) +- `test-vm-measure-memory-lazy.js` (fail) +- `test-vm-measure-memory-multi-context.js` (fail) +- `test-vm-measure-memory.js` (fail) +- `test-vm-module-basic.js` (fail) +- `test-vm-module-cached-data.js` (fail) +- `test-vm-module-dynamic-import.js` (fail) +- `test-vm-module-dynamic-namespace.js` (fail) +- `test-vm-module-errors.js` (fail) +- `test-vm-module-import-meta.js` (fail) +- `test-vm-module-link.js` (fail) +- `test-vm-module-reevaluate.js` (fail) +- `test-vm-module-synthetic.js` (fail) +- `test-vm-new-script-new-context.js` (fail) +- `test-vm-no-dynamic-import-callback.js` (fail) +- `test-vm-not-strict.js` (fail) +- `test-vm-options-validation.js` (fail) +- `test-vm-ownkeys.js` (fail) +- `test-vm-ownpropertynames.js` (fail) +- `test-vm-ownpropertysymbols.js` (fail) +- `test-vm-preserves-property.js` (fail) +- `test-vm-property-not-on-sandbox.js` (fail) +- `test-vm-proxies.js` (fail) +- `test-vm-proxy-failure-CP.js` (fail) +- `test-vm-run-in-new-context.js` (fail) +- `test-vm-script-throw-in-tostring.js` (fail) +- `test-vm-set-property-proxy.js` (fail) +- `test-vm-set-proto-null-on-globalthis.js` (fail) +- `test-vm-sigint-existing-handler.js` (fail) +- `test-vm-sigint.js` (fail) +- `test-vm-source-map-url.js` (fail) +- `test-vm-static-this.js` (fail) +- `test-vm-strict-assign.js` (fail) +- `test-vm-strict-mode.js` (fail) +- `test-vm-symbols.js` (fail) +- `test-vm-syntax-error-message.js` (fail) +- `test-vm-syntax-error-stderr.js` (fail) +- `test-vm-timeout-escape-promise-2.js` (fail) +- `test-vm-timeout-escape-promise-module.js` (fail) +- `test-vm-timeout-escape-promise.js` (fail) +- `test-vm-timeout.js` (skip) +- `test-warn-stream-wrap.js` (fail) +- `test-webcrypto-cryptokey-workers.js` (fail) +- `test-worker-abort-on-uncaught-exception-terminate.js` (fail) +- `test-worker-abort-on-uncaught-exception.js` (fail) +- `test-worker-arraybuffer-zerofill.js` (fail) +- `test-worker-beforeexit-throw-exit.js` (fail) +- `test-worker-broadcastchannel-wpt.js` (fail) +- `test-worker-broadcastchannel.js` (fail) +- `test-worker-cjs-workerdata.js` (fail) +- `test-worker-cleanexit-with-js.js` (fail) +- `test-worker-cleanexit-with-moduleload.js` (fail) +- `test-worker-cleanup-handles.js` (fail) +- `test-worker-cli-options.js` (fail) +- `test-worker-console-listeners.js` (fail) +- `test-worker-crypto-sign-transfer-result.js` (fail) +- `test-worker-data-url.js` (fail) +- `test-worker-debug.js` (fail) +- `test-worker-dns-terminate-during-query.js` (fail) +- `test-worker-dns-terminate.js` (fail) +- `test-worker-environmentdata.js` (fail) +- `test-worker-error-stack-getter-throws.js` (fail) +- `test-worker-esm-exit.js` (fail) +- `test-worker-esm-missing-main.js` (fail) +- `test-worker-esmodule.js` (fail) +- `test-worker-eval-typescript.js` (fail) +- `test-worker-event.js` (fail) +- `test-worker-execargv-invalid.js` (fail) +- `test-worker-execargv.js` (fail) +- `test-worker-exit-code.js` (fail) +- `test-worker-exit-event-error.js` (fail) +- `test-worker-exit-from-uncaught-exception.js` (fail) +- `test-worker-exit-heapsnapshot.js` (fail) +- `test-worker-fs-stat-watcher.js` (fail) +- `test-worker-hasref.js` (fail) +- `test-worker-heap-snapshot.js` (fail) +- `test-worker-heapdump-failure.js` (fail) +- `test-worker-http2-generic-streams-terminate.js` (fail) +- `test-worker-http2-stream-terminate.js` (fail) +- `test-worker-init-failure.js` (fail) +- `test-worker-invalid-workerdata.js` (fail) +- `test-worker-load-file-with-extension-other-than-js.js` (fail) +- `test-worker-memory.js` (fail) +- `test-worker-message-channel-sharedarraybuffer.js` (fail) +- `test-worker-message-channel.js` (fail) +- `test-worker-message-event.js` (fail) +- `test-worker-message-mark-as-uncloneable.js` (fail) +- `test-worker-message-not-serializable.js` (fail) +- `test-worker-message-port-arraybuffer.js` (fail) +- `test-worker-message-port-close-while-receiving.js` (fail) +- `test-worker-message-port-close.js` (fail) +- `test-worker-message-port-constructor.js` (fail) +- `test-worker-message-port-drain.js` (fail) +- `test-worker-message-port-infinite-message-loop.js` (fail) +- `test-worker-message-port-inspect-during-init-hook.js` (fail) +- `test-worker-message-port-jstransferable-nested-untransferable.js` (fail) +- `test-worker-message-port-message-before-close.js` (fail) +- `test-worker-message-port-message-port-transferring.js` (fail) +- `test-worker-message-port-move.js` (fail) +- `test-worker-message-port-multiple-sharedarraybuffers.js` (fail) +- `test-worker-message-port-receive-message.js` (fail) +- `test-worker-message-port-terminate-transfer-list.js` (fail) +- `test-worker-message-port-transfer-closed.js` (fail) +- `test-worker-message-port-transfer-duplicate.js` (fail) +- `test-worker-message-port-transfer-fake-js-transferable-internal.js` (fail) +- `test-worker-message-port-transfer-fake-js-transferable.js` (fail) +- `test-worker-message-port-transfer-filehandle.js` (fail) +- `test-worker-message-port-transfer-native.js` (fail) +- `test-worker-message-port-transfer-self.js` (fail) +- `test-worker-message-port-transfer-target.js` (fail) +- `test-worker-message-port-transfer-terminate.js` (fail) +- `test-worker-message-port-wasm-module.js` (fail) +- `test-worker-message-port-wasm-threads.js` (fail) +- `test-worker-message-port.js` (fail) +- `test-worker-message-transfer-port-mark-as-untransferable.js` (fail) +- `test-worker-message-type-unknown.js` (fail) +- `test-worker-messageport-hasref.js` (fail) +- `test-worker-messaging-errors-timeout.js` (fail) +- `test-worker-messaging.js` (fail) +- `test-worker-mjs-workerdata.js` (fail) +- `test-worker-name.js` (fail) +- `test-worker-nearheaplimit-deadlock.js` (fail) +- `test-worker-nested-on-process-exit.js` (fail) +- `test-worker-nested-uncaught.js` (fail) +- `test-worker-nexttick-terminate.js` (fail) +- `test-worker-no-sab.js` (fail) +- `test-worker-no-stdin-stdout-interaction.js` (fail) +- `test-worker-node-options.js` (fail) +- `test-worker-non-fatal-uncaught-exception.js` (fail) +- `test-worker-on-process-exit.js` (fail) +- `test-worker-onmessage-not-a-function.js` (fail) +- `test-worker-onmessage.js` (fail) +- `test-worker-parent-port-ref.js` (fail) +- `test-worker-process-argv.js` (fail) +- `test-worker-process-cwd.js` (fail) +- `test-worker-process-env-shared.js` (fail) +- `test-worker-process-env.js` (fail) +- `test-worker-process-exit-async-module.js` (fail) +- `test-worker-ref-onexit.js` (fail) +- `test-worker-ref.js` (fail) +- `test-worker-relative-path-double-dot.js` (fail) +- `test-worker-relative-path.js` (fail) +- `test-worker-resource-limits.js` (fail) +- `test-worker-safe-getters.js` (fail) +- `test-worker-sharedarraybuffer-from-worker-thread.js` (fail) +- `test-worker-stack-overflow-stack-size.js` (fail) +- `test-worker-stack-overflow.js` (fail) +- `test-worker-stdio-flush-inflight.js` (fail) +- `test-worker-stdio-flush.js` (fail) +- `test-worker-stdio-from-preload-module.js` (fail) +- `test-worker-stdio.js` (fail) +- `test-worker-syntax-error-file.js` (fail) +- `test-worker-syntax-error.js` (fail) +- `test-worker-terminate-http2-respond-with-file.js` (fail) +- `test-worker-terminate-microtask-loop.js` (fail) +- `test-worker-terminate-nested.js` (fail) +- `test-worker-terminate-null-handler.js` (fail) +- `test-worker-terminate-ref-public-port.js` (fail) +- `test-worker-terminate-source-map.js` (fail) +- `test-worker-terminate-timers.js` (fail) +- `test-worker-terminate-unrefed.js` (fail) +- `test-worker-track-unmanaged-fds.js` (fail) +- `test-worker-type-check.js` (fail) +- `test-worker-uncaught-exception-async.js` (fail) +- `test-worker-uncaught-exception.js` (fail) +- `test-worker-unref-from-message-during-exit.js` (fail) +- `test-worker-unsupported-path.js` (fail) +- `test-worker-unsupported-things.js` (fail) +- `test-worker-vm-context-terminate.js` (fail) +- `test-worker-voluntarily-exit-followed-by-addition.js` (fail) +- `test-worker-voluntarily-exit-followed-by-throw.js` (fail) +- `test-worker-workerdata-messageport.js` (fail) +- `test-worker-workerdata-sharedarraybuffer.js` (fail) +- `test-worker.js` (fail) +- `test-x509-escaping.js` (fail) -### UNSUPPORTED-API: specific API not implemented (63 tests) +### UNSUPPORTED-API: specific API not implemented (130 tests) **Resolution: ~14 tests rescuable** ~7 tests rescued with stream enhancements (Readable.from, compose, getDefaultHighWaterMark). ~3 rescued with utility polyfills (MIMEType, duplexPair). ~4 rescued with HTTP polyfill expansion. Remaining ~44 are architecture-limited (fork IPC, fs.watch, v8.promiseHooks, snapshot APIs). - `test-buffer-constructor-outside-node-modules.js` (fail) +- `test-child-process-dgram-reuseport.js` (fail) +- `test-child-process-fork-no-shell.js` (fail) +- `test-child-process-fork-stdio.js` (fail) +- `test-child-process-fork.js` (fail) +- `test-child-process-fork3.js` (fail) +- `test-child-process-ipc-next-tick.js` (fail) +- `test-child-process-net-reuseport.js` (fail) +- `test-child-process-send-after-close.js` (fail) +- `test-child-process-send-keep-open.js` (fail) +- `test-child-process-send-type-error.js` (fail) - `test-compile-cache-api-env.js` (fail) - `test-compile-cache-api-error.js` (fail) - `test-compile-cache-api-flush.js` (fail) @@ -3357,15 +3252,43 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-compile-cache-permission-disallowed.js` (fail) - `test-compile-cache-success.js` (fail) - `test-compile-cache-updated-file.js` (fail) +- `test-destroy-socket-in-lookup.js` (fail) +- `test-events-uncaught-exception-stack.js` (fail) +- `test-filehandle-readablestream.js` (fail) +- `test-fs-options-immutable.js` (skip) - `test-fs-promises-file-handle-dispose.js` (fail) +- `test-fs-promises-file-handle-writeFile.js` (fail) +- `test-fs-promises-watch.js` (skip) +- `test-fs-promises-writefile.js` (fail) +- `test-fs-watch-file-enoent-after-deletion.js` (skip) +- `test-fs-watch-recursive-add-file-to-existing-subfolder.js` (skip) +- `test-fs-watch-recursive-add-file-to-new-folder.js` (skip) +- `test-fs-watch-recursive-add-file.js` (skip) +- `test-fs-watch-recursive-assert-leaks.js` (skip) +- `test-fs-watch-recursive-delete.js` (skip) +- `test-fs-watch-recursive-linux-parallel-remove.js` (skip) +- `test-fs-watch-recursive-sync-write.js` (skip) +- `test-fs-watch-recursive-update-file.js` (skip) +- `test-fs-watch-stop-async.js` (fail) +- `test-fs-watch-stop-sync.js` (fail) +- `test-fs-watch.js` (skip) +- `test-http-addrequest-localaddress.js` (fail) +- `test-http-agent-getname.js` (fail) +- `test-http-header-validators.js` (fail) - `test-http-import-websocket.js` (fail) +- `test-http-incoming-matchKnownFields.js` (fail) +- `test-http-outgoing-destroy.js` (fail) +- `test-http-sync-write-error-during-continue.js` (fail) - `test-messagechannel.js` (fail) - `test-mime-whatwg.js` (fail) +- `test-process-external-stdio-close.js` (fail) - `test-promise-hook-create-hook.js` (fail) - `test-promise-hook-exceptions.js` (fail) - `test-promise-hook-on-after.js` (fail) - `test-promise-hook-on-before.js` (fail) - `test-promise-hook-on-init.js` (fail) +- `test-readable-from-iterator-closing.js` (fail) +- `test-readable-from.js` (fail) - `test-shadow-realm-allowed-builtin-modules.js` (fail) - `test-shadow-realm-custom-loaders.js` (fail) - `test-shadow-realm-gc-module.js` (fail) @@ -3403,7 +3326,36 @@ Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridg - `test-snapshot-warning.js` (fail) - `test-snapshot-weak-reference.js` (fail) - `test-snapshot-worker.js` (fail) +- `test-stream-compose-operator.js` (fail) +- `test-stream-compose.js` (fail) +- `test-stream-construct.js` (fail) +- `test-stream-drop-take.js` (fail) +- `test-stream-duplexpair.js` (fail) +- `test-stream-err-multiple-callback-construction.js` (fail) +- `test-stream-filter.js` (fail) +- `test-stream-flatMap.js` (fail) +- `test-stream-forEach.js` (fail) +- `test-stream-map.js` (fail) +- `test-stream-pipeline-with-empty-string.js` (fail) +- `test-stream-promises.js` (fail) +- `test-stream-readable-aborted.js` (fail) +- `test-stream-readable-async-iterators.js` (fail) +- `test-stream-readable-destroy.js` (fail) +- `test-stream-readable-didRead.js` (fail) +- `test-stream-readable-dispose.js` (fail) +- `test-stream-readable-next-no-null.js` (fail) +- `test-stream-reduce.js` (fail) +- `test-stream-set-default-hwm.js` (fail) +- `test-stream-toArray.js` (fail) +- `test-stream-transform-split-highwatermark.js` (fail) +- `test-stream-writable-aborted.js` (fail) +- `test-stream-writable-destroy.js` (fail) +- `test-util-getcallsite.js` (fail) +- `test-util-types-exists.js` (fail) - `test-websocket.js` (fail) +- `test-webstream-readable-from.js` (fail) +- `test-webstreams-clone-unref.js` (fail) +- `test-zlib-brotli-16GB.js` (fail) ### HANGS: test hangs/timeouts, needs investigation (5 tests) From f8566d850d1cff34f2321843a6fce693faf94e56 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:11:41 -0700 Subject: [PATCH 03/10] fix: reclassify dgram as planned, flag mislabeled UNSUPPORTED-MODULE entries dgram (UDP) is planned for implementation, not out of scope. https, http2, tls, net, readline, diagnostics_channel, async_hooks are bridged/deferred modules incorrectly globbed as unsupported-module. ~822 of 1226 UNSUPPORTED-MODULE tests are actually fixable. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs-internal/nodejs-compat-roadmap.md | 40 ++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/docs-internal/nodejs-compat-roadmap.md b/docs-internal/nodejs-compat-roadmap.md index c6dd57fd..ca4e9620 100644 --- a/docs-internal/nodejs-compat-roadmap.md +++ b/docs-internal/nodejs-compat-roadmap.md @@ -7,11 +7,14 @@ Current conformance: **11.3% genuine pass rate** (399/3532 tests, Node.js v22.14 | Category | Tests | |----------|-------| | Passing (genuine) | 399 | -| Blocked by fixable issues | 1570 | -| Blocked by unfixable/out-of-scope | 1563 | -| **Total** | **3532** | +| Blocked by classified fixes (FIX-01 through FIX-33) | 1,570 | +| In UNSUPPORTED-MODULE (many mislabeled, see breakdown below) | 1,226 | +| Other (TEST-INFRA, UNSUPPORTED-API, HANGS, OTHER, VACUOUS) | 337 | +| **Total** | **3,532** | -*36 "vacuous" tests self-skip and exit 0 without testing anything — listed under VACUOUS below, counted in unfixable/out-of-scope.* +*Of the 1,226 UNSUPPORTED-MODULE tests, ~822 are from modules that are actually bridged/deferred (https, http2, tls, net, dgram, readline, diagnostics_channel, async_hooks) and should be reclassified as implementation-gap. Only ~404 are truly architecture-limited (cluster, worker_threads, vm, inspector, repl, domain, snapshot, quic, shadow realm).* + +*36 "vacuous" tests self-skip and exit 0 without testing anything — listed under VACUOUS below.* ## Cross-Validation Testing Policy @@ -66,7 +69,9 @@ When implementing polyfill/bridge features where both sides of a test go through | FIX-33 | process.on('unhandledRejection') handler | 1 | -*FIX-17 (Sign/Verify), FIX-27 (compose), FIX-34 (vm), FIX-35 (worker_threads), FIX-36 (async_hooks), FIX-37 (net/tls), FIX-38 (readline), FIX-39 (diagnostics_channel) have 0 individually-classified tests — their tests are absorbed into UNSUPPORTED-MODULE glob patterns.* +*FIX-17 (Sign/Verify), FIX-27 (compose), FIX-34 (vm), FIX-35 (worker_threads), FIX-36 (async_hooks), FIX-37 (net/tls), FIX-38 (readline), FIX-39 (diagnostics_channel) have 0 individually-classified tests — their tests are currently absorbed into UNSUPPORTED-MODULE glob patterns. Many of these modules are actually bridged or deferred (not truly unsupported) and their glob categorizations in expectations.json need to be updated. See the UNSUPPORTED-MODULE section below for the breakdown of what's truly unsupported vs mislabeled.* + +*dgram (UDP) is planned for implementation — ~76 tests currently in UNSUPPORTED-MODULE should move to a dgram FIX category once the UDP bridge is built.* --- @@ -1989,9 +1994,28 @@ No unhandled Promise rejection capture. Fix: hook into V8's Promise rejection ha ### UNSUPPORTED-MODULE: entire module not implemented (1226 tests) -**Resolution: ~50-100 tests rescuable with net bridge** - -Breakdown: cluster (~83, never feasible), http2 (~256, feasible if net+tls bridged), tls (~192, feasible with OpenSSL bindings), net (~149, high effort TCP bridge), domain (~50, deprecated, never implement), inspector (~60, never feasible), repl (~75, never feasible), worker (~132, architecture-limited), readline (~19, partially feasible), dgram (~76, low priority), debugger (~25, never feasible), compiler (~15, never feasible), snapshot (~27, never feasible), shadow realm (~10, never feasible), quic (~4, never feasible), eslint (~24, not runtime), permission (~31, not runtime), trace (~35, not runtime), runner (~40, not runtime). Implementing net+tls bridge would rescue a subset of http2/https/tls tests. +**Resolution: Many modules here are mislabeled — they are bridged or deferred, not truly unsupported.** + +Modules that ARE bridged/deferred and should be reclassified to implementation-gap: +- **https** (~62 tests) — IS a BRIDGE_MODULE. Glob is stale. +- **http2** (~256 tests) — IS a BRIDGE_MODULE. Glob is stale. +- **tls** (~192 tests) — DEFERRED_CORE_MODULE with stubs. Some tests only check API shape. +- **net** (~149 tests) — DEFERRED_CORE_MODULE. `net.isIP()`/`isIPv4()`/`isIPv6()` work. Needs TCP bridge. +- **dgram/UDP** (~76 tests) — Needs UDP bridge implementation. NOT out of scope. +- **readline** (~19 tests) — DEFERRED_CORE_MODULE. Stateless tests could pass. +- **diagnostics_channel** (~32 tests) — DEFERRED_CORE_MODULE. Simple pub/sub, easy to implement. +- **async_hooks** (~36 tests) — DEFERRED_CORE_MODULE. AsyncLocalStorage partially feasible. + +Modules that are truly unsupported (architecture-limited): +- **cluster** (~83 tests) — requires multi-process coordination, shared handles +- **worker_threads** (~132 tests) — requires multi-isolate architecture +- **vm** (~79 tests) — requires multi-context V8 +- **inspector/debugger** (~85 tests) — V8 inspector is a security surface +- **repl** (~75 tests) — interactive, requires full shell integration +- **domain** (~50 tests) — deprecated since Node 4, intentionally not implementing +- **snapshot/compile** (~42 tests) — V8 snapshot APIs, native-only +- **quic** (~4 tests) — experimental, depends on tls+net +- **shadow realm** (~10 tests) — V8 ShadowRealm API, not exposed - `test-arm-math-illegal-instruction.js` (fail) - `test-assert-fail-deprecation.js` (fail) From 99a97f492376f2cc62ba51a44870f1d9ffc39759 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:14:16 -0700 Subject: [PATCH 04/10] docs: add permanently unsupported features section to Node.js compatibility Lists modules (cluster, worker_threads, vm, inspector, domain, repl, trace_events, wasi), APIs (fork, execPath, V8 flags, snapshots, native addons), and behaviors (OS signals, fs.watch, multi-context, QUIC) that cannot be supported due to sandbox architecture constraints, with explanations for each. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/nodejs-compatibility.mdx | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/nodejs-compatibility.mdx b/docs/nodejs-compatibility.mdx index ac28e245..e81dde11 100644 --- a/docs/nodejs-compatibility.mdx +++ b/docs/nodejs-compatibility.mdx @@ -70,6 +70,42 @@ Unsupported modules use: `" is not supported in sandbox"`. | `trace_events` | ⛔ Unsupported | `require()` fails immediately with deterministic unsupported-module error. | | `domain` | ⛔ Unsupported | `require()` fails immediately with deterministic unsupported-module error. | +## Permanently Unsupported Features + +Some Node.js features cannot be supported in secure-exec due to fundamental architectural constraints of the sandboxed V8 isolate. These are not planned for implementation. + +### Modules + +| Module | Reason | +| --- | --- | +| `cluster` | Requires multi-process coordination with shared server handles and IPC. The sandbox runs a single V8 isolate — there is no process table to fork into. | +| `worker_threads` | Requires spawning OS threads with separate V8 isolates and shared memory (`SharedArrayBuffer`). The sandbox architecture is single-isolate-per-session. | +| `vm` | `vm.createContext()` and `vm.runInNewContext()` require creating isolated V8 contexts within the same isolate. The sandbox provides one context. `vm.runInThisContext()` works (equivalent to `eval`). | +| `inspector` | Exposes the V8 debugger protocol (breakpoints, heap snapshots, CPU profiling). This is a security surface that allows arbitrary code introspection and cannot be exposed in a sandbox. | +| `domain` | Deprecated since Node.js v4 and removed from documentation. Not worth implementing — use `async_hooks` or structured error handling instead. | +| `repl` | Interactive read-eval-print loop requiring full terminal integration, tab completion, and command history. Not meaningful in a sandboxed execution context. | +| `trace_events` | Requires V8 tracing infrastructure and file-based trace log output. Not available in the sandboxed isolate. | +| `wasi` | WASI (WebAssembly System Interface) requires a separate WASM runtime within the V8 isolate. Not applicable — secure-exec IS the sandbox. | + +### APIs + +| API | Reason | +| --- | --- | +| `child_process.fork()` | Creates a new Node.js process with IPC channel. Requires a real `node` binary and multi-process architecture. `spawn`/`exec`/`execFile` ARE supported. | +| `process.execPath` | Returns path to the Node.js binary. The sandbox has no `node` binary on disk — code runs in an embedded V8 isolate, not a Node.js process. | +| V8 CLI flags (`--expose-gc`, `--expose-internals`, `--harmony-*`) | The V8 isolate is pre-configured at sandbox creation time. Runtime flag injection is a security risk. `--expose-gc` may be supported in the future as a bridge call. | +| V8 snapshot APIs (`v8.writeHeapSnapshot`, `v8.startupSnapshot`) | Require direct V8 C++ API access for heap serialization. Not exposed through the bridge. | +| Native addons (`.node` files) | Require loading compiled shared libraries (`.so`/`.dylib`/`.dll`) into the process. The sandbox does not permit native code execution. | + +### Behaviors + +| Behavior | Reason | +| --- | --- | +| Real OS signals (`SIGTERM`, `SIGUSR1`, etc.) | The sandbox is not an OS process — it's a V8 isolate within a host process. There are no real POSIX signals to deliver. `process.on('SIGINT')` may be emulated in the future. | +| Real file system watchers (`fs.watch`) | The VFS (virtual file system) has no inotify/kqueue equivalent. `fs.watch()` returns a stub that never emits events. Writes to VFS do not trigger watcher notifications. | +| Multi-context execution | The sandbox runs one V8 context per isolate. Features requiring context isolation (ShadowRealm, `vm.createContext`) cannot work. | +| QUIC protocol | Experimental in Node.js, depends on `tls` + `net` + OpenSSL QUIC support. Not planned. | + ## Tested Packages The [project-matrix test suite](https://github.com/rivet-dev/secure-exec/tree/main/packages/secure-exec/tests/projects) validates that real-world npm packages produce identical output in secure-exec and host Node.js. Each fixture is a black-box Node project with no sandbox-specific code. From ac1f6597868e3d2505909d5fa554a20861714693 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:17:32 -0700 Subject: [PATCH 05/10] docs: add architecture section to Node.js compatibility page Explains the virtual kernel architecture: all I/O routes through VFS, network stack, process table, and permissions engine. Clarifies that HTTP server loopback routes through the kernel without real TCP, VFS is not the host filesystem, and embedders provide host adapters. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/nodejs-compatibility.mdx | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/nodejs-compatibility.mdx b/docs/nodejs-compatibility.mdx index e81dde11..39de11d6 100644 --- a/docs/nodejs-compatibility.mdx +++ b/docs/nodejs-compatibility.mdx @@ -10,6 +10,41 @@ icon: "list-check" `22.x` (derived from the `@types/node` `22.x` validation baseline used by tests and type checks). +## Architecture + +secure-exec runs Node.js code inside a V8 isolate with a **virtual kernel** that mediates all system access. Nothing in the sandbox touches the host OS directly: + +``` +┌─────────────────────────────────────────────────┐ +│ Sandbox (V8 Isolate) │ +│ │ +│ User Code (require, fs, http, etc.) │ +│ │ │ +│ ▼ │ +│ Bridge Layer (polyfills + bridge modules) │ +│ │ │ +│ ▼ │ +│ Virtual Kernel │ +│ ├── VFS (virtual file system) │ +│ ├── Process table (spawn, signals, exit) │ +│ ├── Network stack (TCP, HTTP, DNS, UDP) │ +│ └── Permissions engine (deny-by-default) │ +│ │ │ +│ ▼ │ +│ Host Adapters (embedder-provided) │ +└─────────────────────────────────────────────────┘ + │ + ▼ + Host OS (file system, network, etc.) +``` + +**Key points:** + +- **All I/O routes through the virtual kernel.** `fs.readFile()` goes through the VFS, `http.request()` goes through the network stack, `child_process.spawn()` goes through the process table. The kernel enforces permissions at every boundary. +- **Network calls are kernel-mediated.** `http.createServer()` registers a virtual listener in the kernel's network stack. `http.request()` to localhost routes through the kernel without touching real TCP — the kernel connects the virtual server to the virtual client directly. External requests go through the host adapter after permission checks. +- **The VFS is not the host file system.** Files written by sandbox code live in the VFS (in-memory by default). The host file system is accessible only through explicit read-only overlays (e.g., `node_modules`) configured by the embedder. +- **Embedders provide host adapters** that implement the actual I/O. A Node.js embedder provides real `fs` and `net`; a browser embedder provides `fetch`-based networking and no file system. The sandbox code doesn't know or care which adapter backs the kernel. + ## Support Tiers | Icon | Tier | Label | Meaning | From 65d54a90afd78c328aba0fcd4688d41aec996e8d Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:18:16 -0700 Subject: [PATCH 06/10] docs: add virtual kernel architecture rules to CLAUDE.md All I/O must route through the virtual kernel. Network loopback is kernel-mediated. VFS is not the host filesystem. New I/O features must go through the kernel, never bypass to host directly. Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CLAUDE.md b/CLAUDE.md index e33c3435..efcacf99 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -107,6 +107,16 @@ - read `docs-internal/arch/overview.md` for the component map (NodeRuntime, RuntimeDriver, NodeDriver, NodeExecutionDriver, ModuleAccessFileSystem, Permissions) - keep it up to date when adding, removing, or significantly changing components +## Virtual Kernel Architecture + +- **all sandbox I/O routes through the virtual kernel** — user code never touches the host OS directly +- the kernel provides: VFS (virtual file system), process table (spawn/signals/exit), network stack (TCP/HTTP/DNS/UDP), and a deny-by-default permissions engine +- **network calls are kernel-mediated**: `http.createServer()` registers a virtual listener in the kernel's network stack; `http.request()` to localhost routes through the kernel without real TCP — the kernel connects virtual server to virtual client directly; external requests go through the host adapter after permission checks +- **the VFS is not the host file system** — files written by sandbox code live in the VFS (in-memory by default); host filesystem is accessible only through explicit read-only overlays (e.g., `node_modules`) configured by the embedder +- **embedders provide host adapters** that implement actual I/O — a Node.js embedder provides real `fs` and `net`; a browser embedder provides `fetch`-based networking and no file system; sandbox code doesn't know which adapter backs the kernel +- when implementing new I/O features (e.g., UDP, TCP servers, fs.watch), they MUST route through the kernel — never bypass it to hit the host directly +- see `docs/nodejs-compatibility.mdx` for the architecture diagram + ## Code Transformation Policy - NEVER use regex-based source code transformation for JavaScript/TypeScript (e.g., converting ESM to CJS, rewriting imports, extracting exports) From 5d2e6210b3c0d5be38a94682ce2c6b7af9d1b579 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:35:42 -0700 Subject: [PATCH 07/10] docs: add kernel networking consolidation spec Covers virtual socket table, loopback routing, server sockets, UDP, Unix domain sockets, socket options, network permissions, signal handlers, VFS change notifications, and migration of 13 Node.js bridge components to the shared kernel. Includes standalone test strategy and migration order. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../specs/kernel-networking-consolidation.md | 474 ++++++++++++++++++ 1 file changed, 474 insertions(+) create mode 100644 docs-internal/specs/kernel-networking-consolidation.md diff --git a/docs-internal/specs/kernel-networking-consolidation.md b/docs-internal/specs/kernel-networking-consolidation.md new file mode 100644 index 00000000..a8d29e9a --- /dev/null +++ b/docs-internal/specs/kernel-networking-consolidation.md @@ -0,0 +1,474 @@ +# Kernel Networking & Resource Consolidation + +## Problem + +The virtual kernel (`packages/core/src/kernel/`) provides unified VFS, process table, FD table, pipes, PTY, and permissions — shared across Node.js and WasmVM runtimes. However, **networking and several resource management subsystems bypass the kernel entirely**, implemented directly in the Node.js bridge/driver layer. This means: + +1. WasmVM has no TCP/UDP/Unix socket support (WASI extensions #1, #2, #17) +2. WasmVM has no HTTP server support +3. HTTP server loopback goes through real host TCP instead of kernel routing +4. 492 Node.js conformance tests are blocked (FIX-01: createServer) +5. 76 Node.js dgram tests are blocked (UDP) +6. Resource tracking (timers, handles, sockets) is Node-specific, not kernel-managed +7. SSRF/network permissions are enforced in the host adapter, not the kernel + +## Goal + +Move all networking and resource management into the kernel so that: +- Node.js and WasmVM share the same socket table, port registry, and network stack +- Loopback connections route in-kernel without real TCP +- External connections route through host adapters after kernel permission checks +- Resource budgets (timers, handles, sockets) are kernel-enforced per-process + +--- + +## Part 1: Kernel Network Stack + +### 1.1 Virtual Socket Table (K-1) + +Add `packages/core/src/kernel/socket-table.ts`: + +``` +KernelSocket { + id: number + domain: AF_INET | AF_INET6 | AF_UNIX + type: SOCK_STREAM | SOCK_DGRAM + protocol: number + state: 'created' | 'bound' | 'listening' | 'connected' | 'closed' + localAddr?: { host: string, port: number } | { path: string } + remoteAddr?: { host: string, port: number } | { path: string } + options: Map // SO_REUSEADDR, TCP_NODELAY, etc. + pid: number // owning process + readBuffer: Uint8Array[] // incoming data queue + readWaiters: Array<(data: Uint8Array) => void> + writeBuffer: Uint8Array[] // outgoing data queue (for non-blocking) + backlog: KernelSocket[] // pending connections (listening sockets only) + acceptWaiters: Array<(socket: KernelSocket) => void> +} + +SocketTable { + private sockets: Map + private nextSocketId: number + private listeners: Map // "host:port" → listening socket + + create(domain, type, protocol, pid): number // returns socket ID + bind(socketId, addr): void + listen(socketId, backlog): void + accept(socketId): KernelSocket | null // null = EAGAIN + connect(socketId, addr): void // in-kernel for loopback, host adapter for external + send(socketId, data, flags): number // bytes sent + recv(socketId, maxBytes, flags): Uint8Array | null + close(socketId): void + setsockopt(socketId, level, optname, optval): void + getsockopt(socketId, level, optname): number + getLocalAddr(socketId): SockAddr + getRemoteAddr(socketId): SockAddr +} +``` + +**Testing:** Standalone test in `packages/core/test/kernel/socket-table.test.ts`: +- Create socket, bind to port, verify state transitions +- Bind two sockets to same port — verify EADDRINUSE (unless SO_REUSEADDR) +- Close socket, verify port is freed +- Create 256+ sockets — verify EMFILE +- Verify per-process socket isolation (process A can't close process B's socket) + +### 1.2 Loopback Routing (K-2) + +When `connect(socketId, { host: 'localhost', port: P })` is called and port P has a listening socket in the same kernel: + +1. Kernel creates a pair of connected sockets (like `socketpair()`) +2. Client socket is returned to the connector +3. Server socket is placed in the listener's `backlog` queue +4. `accept()` on the listener returns the server-side socket +5. Data written to either side is buffered in the kernel (like pipes) — no real TCP + +For external connections (no listener on that port): +1. Kernel calls `hostAdapter.connect(addr)` after permission check +2. Host adapter creates a real TCP connection +3. Data relay between kernel socket buffer and host socket + +**Testing:** Standalone test in `packages/core/test/kernel/loopback.test.ts`: +- Create listener on port 8080, connect to localhost:8080 — verify accept() returns socket +- Write data from client → read from server socket — verify data matches +- Write data from server → read from client socket — verify data matches +- Close client — verify server gets EOF +- Close server — verify client gets ECONNRESET or EOF +- Connect to external port (no listener) — verify host adapter is called +- Verify loopback never calls host adapter + +### 1.3 Server Sockets (K-3) + +`listen()` on a bound socket transitions it to 'listening' state and registers it in the kernel's listener map. `accept()` dequeues from the backlog. + +For external-facing servers (sandbox wants to accept real TCP connections): +1. Kernel calls `hostAdapter.listen(addr)` to create a real TCP listener on the host +2. Host adapter forwards incoming connections as new kernel sockets +3. Sandbox code calls `accept()` and gets kernel socket IDs +4. Data relay between host TCP and kernel socket buffers + +**Testing:** Standalone test in `packages/core/test/kernel/server-socket.test.ts`: +- Listen on port, accept connection, exchange data, close +- Listen on port already in use — verify EADDRINUSE +- Accept with no pending connections and O_NONBLOCK — verify EAGAIN +- Accept with pending connections — verify FIFO order +- Close listener — verify pending connections get ECONNREFUSED +- Backlog overflow — verify ECONNREFUSED for excess connections + +### 1.4 UDP Sockets (K-4) + +UDP sockets use the same socket table but with `SOCK_DGRAM` semantics: + +- `send(socketId, data, flags, destAddr)` — datagram send (no connection required) +- `recv(socketId, maxBytes, flags)` — returns `{ data, srcAddr }` +- `bind()` registers in listener map for receiving +- No `listen()`/`accept()` — datagrams are connectionless +- `connect()` sets a default destination (optional, for `send()` without dest) + +For external UDP: +1. Kernel calls `hostAdapter.sendDatagram(data, destAddr)` after permission check +2. Host adapter sends via real UDP +3. Incoming datagrams from host adapter are queued in kernel socket buffer + +**Testing:** Standalone test in `packages/core/test/kernel/udp-socket.test.ts`: +- Create UDP socket, bind, send datagram to self — verify recv gets it (loopback) +- Send to another bound UDP socket in same kernel — verify delivery +- Send without bind — verify ephemeral port assigned +- Send to unbound port — verify datagram is silently dropped (UDP semantics) +- Verify message boundaries preserved (two 100-byte sends → two 100-byte recvs, not one 200-byte recv) + +### 1.5 Unix Domain Sockets (K-5) + +Unix domain sockets bind to VFS paths instead of host:port: + +- `bind(socketId, { path: '/tmp/my.sock' })` — creates socket file in VFS +- `connect(socketId, { path: '/tmp/my.sock' })` — connects to bound socket via kernel +- Always in-kernel (no host adapter involvement) +- Support both `SOCK_STREAM` and `SOCK_DGRAM` modes + +**Testing:** Standalone test in `packages/core/test/kernel/unix-socket.test.ts`: +- Bind to VFS path, connect, exchange data +- Verify socket file appears in VFS (stat returns socket type) +- Remove socket file — verify new connections fail with ECONNREFUSED +- Bind to existing path — verify EADDRINUSE + +### 1.6 Socket Options (K-6) + +Kernel tracks socket options per-socket. For loopback sockets, most are no-ops. For host-connected sockets, options are forwarded to host adapter. + +Supported options: +- `SO_REUSEADDR` / `SO_REUSEPORT` — kernel-enforced (allow port reuse) +- `SO_KEEPALIVE` — forwarded to host adapter for real connections +- `TCP_NODELAY` — forwarded to host adapter for real connections +- `SO_RCVBUF` / `SO_SNDBUF` — kernel buffer size limits +- `SO_LINGER` — kernel-enforced close behavior + +**Testing:** Inline in socket-table tests: +- Set SO_REUSEADDR, bind two sockets to same port — verify success +- Without SO_REUSEADDR — verify EADDRINUSE +- Set SO_RCVBUF, send more data than buffer — verify behavior + +### 1.7 Network Permissions (K-7) + +Move SSRF and network permission checks from host adapter into kernel: + +``` +Kernel.checkNetworkPermission(op: 'connect' | 'listen' | 'send', addr: SockAddr): void +``` + +- Called by socket table before `connect()`, `listen()`, `send()` to external +- Loopback connections (to kernel-owned ports) always allowed +- External connections checked against permissions policy +- Replaces the scattered SSRF validation in `driver.ts` + +**Testing:** Standalone test in `packages/core/test/kernel/network-permissions.test.ts`: +- Deny-by-default: connect to external IP — verify EACCES +- Allow specific host: connect to allowed.com — verify success +- Loopback always allowed: connect to localhost kernel port — verify success regardless of policy +- Listen on denied port — verify EACCES + +--- + +## Part 2: Kernel Resource Management + +### 2.1 Kernel Timer Table (N-5, N-8) + +Move timer tracking from Node bridge to kernel. Add `packages/core/src/kernel/timer-table.ts`: + +``` +TimerTable { + private timers: Map + private nextTimerId: number + + createTimer(pid, delayMs, repeat, callback): number // returns timer ID + clearTimer(timerId): void + getActiveTimers(pid): KernelTimer[] + enforceLimit(pid, maxTimers): void // throws on budget exceeded + clearAllForProcess(pid): void // cleanup on process exit +} +``` + +Host adapter provides the actual scheduling (setTimeout/setInterval on host). Kernel tracks ownership and enforces budgets. + +**Testing:** Standalone test in `packages/core/test/kernel/timer-table.test.ts`: +- Create timer, verify it fires callback +- Create timer, clear it — verify callback never fires +- Create N+1 timers with limit N — verify budget error +- Kill process — verify all its timers are cleared +- Timer in process A can't be cleared by process B + +### 2.2 Kernel Handle Table (N-7, N-9) + +Move active handle tracking from Node bridge to kernel. Extend process table: + +``` +ProcessEntry { + // existing: pid, ppid, pgid, status, driver, ... + activeHandles: Map // id → description + handleLimit?: number +} +``` + +**Testing:** Inline in process table tests: +- Register handle, verify it's tracked +- Register beyond limit — verify error +- Process exit — verify all handles cleaned up + +### 2.3 DNS Cache (N-10) + +Add kernel-level DNS cache shared across runtimes: + +``` +DnsCache { + private cache: Map + + lookup(hostname, rrtype): DnsResult | null // cache hit + store(hostname, rrtype, result, ttl): void + flush(): void +} +``` + +Runtimes call kernel DNS before falling through to host adapter. + +**Testing:** Standalone test in `packages/core/test/kernel/dns-cache.test.ts`: +- Lookup miss → host adapter called → result cached +- Lookup hit → host adapter NOT called +- TTL expiry → host adapter called again +- Flush → all entries cleared + +--- + +## Part 3: Node.js Bridge Migration + +### 3.1 FD Table (N-1) + +**Current:** `bridge/fs.ts` maintains its own `fdTable` Map with `nextFd` counter. +**Target:** Bridge calls `kernel.fdTable.open()`, `kernel.fdTable.read()`, etc. +**Migration:** Replace all `fdTable.get(fd)` / `fdTable.set(fd, ...)` with kernel FD table calls. The kernel already has `ProcessFDTable` — wire the bridge to use it. + +### 3.2 HTTP Server (N-2, N-3, N-9) + +**Current:** `driver.ts` creates real host TCP servers, `network.ts` routes requests via `serverRequestListeners` Map. +**Target:** `http.createServer()` calls `kernel.socketTable.create() → bind() → listen()`. Incoming connections are kernel sockets. Request parsing happens in the bridge (polyfill layer), not the kernel. +**Migration:** +1. Bridge calls `kernel.socketTable.listen(port)` instead of `hostAdapter.httpServerListen()` +2. For loopback: kernel connects client→server directly +3. For external: kernel calls `hostAdapter.tcpListen(port)` and relays connections as kernel sockets +4. Remove `servers` Map, `ownedServerPorts` Set, `serverRequestListeners` Map from bridge/driver +5. HTTP protocol parsing stays in the bridge (it's Node.js-specific, not kernel) + +### 3.3 Net Sockets (N-4) + +**Current:** `bridge/network.ts` maintains `activeNetSockets` Map, `bridge-handlers.ts` maintains separate socket Map. +**Target:** `net.connect()` calls `kernel.socketTable.create() → connect()`. Data flows through kernel socket buffers. +**Migration:** Replace `activeNetSockets` / `netSockets` Maps with kernel socket IDs. Bridge reads/writes via `kernel.socketTable.send()` / `recv()`. + +### 3.4 Child Process Registry (N-6) + +**Current:** `bridge/child-process.ts` maintains `activeChildren` Map separate from kernel process table. +**Target:** All child processes are in the kernel process table. Bridge queries kernel for process state. +**Migration:** Bridge calls `kernel.processTable.register()` on spawn, queries `kernel.processTable.get()` for events. Remove `activeChildren` Map. + +### 3.5 SSRF/Network Permissions (N-11) + +**Current:** SSRF validation in `driver.ts` NetworkAdapter with `ownedServerPorts` whitelist. +**Target:** Kernel permission engine checks all `connect()` calls. Loopback to kernel-owned ports is always allowed. +**Migration:** Move SSRF logic into `kernel.checkNetworkPermission()`. Remove SSRF code from driver. + +### 3.6 Crypto Sessions (N-12) + +**Current:** `bridge-handlers.ts` maintains `cipherSessions` Map with `nextCipherSessionId`. +**Target:** Consider stateless API (single-call encrypt/decrypt) or move session state to kernel resource table. +**Migration:** Low priority — crypto sessions don't affect WasmVM interop since WasmVM uses host crypto directly. + +--- + +## Part 4: WasmVM Integration + +WasmVM already communicates with the kernel via synchronous RPC (`kernel-worker.ts` with Atomics.wait + SharedArrayBuffer). New kernel network APIs are exposed the same way: + +``` +// In kernel-worker.ts, add syscall handlers: +case 'sock_open': return kernel.socketTable.create(domain, type, protocol, pid); +case 'sock_bind': return kernel.socketTable.bind(socketId, addr); +case 'sock_listen': return kernel.socketTable.listen(socketId, backlog); +case 'sock_accept': return kernel.socketTable.accept(socketId); +case 'sock_connect': return kernel.socketTable.connect(socketId, addr); +case 'sock_send': return kernel.socketTable.send(socketId, data, flags); +case 'sock_recv': return kernel.socketTable.recv(socketId, maxBytes, flags); +case 'sock_close': return kernel.socketTable.close(socketId); +case 'sock_setopt': return kernel.socketTable.setsockopt(socketId, level, opt, val); +case 'sock_getopt': return kernel.socketTable.getsockopt(socketId, level, opt); +``` + +WasmVM WASI extensions (`native/wasmvm/crates/wasi-ext/src/lib.rs`) call these via the existing host import mechanism. The C sysroot patches route `socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`, `close()`, `setsockopt()`, `getsockopt()` through these host imports. + +--- + +## Part 5: Host Adapter Interface + +The host adapter interface (`packages/core/src/types.ts` or similar) needs new methods for the kernel to delegate external I/O: + +```typescript +interface HostNetworkAdapter { + // TCP + tcpConnect(host: string, port: number): Promise + tcpListen(host: string, port: number): Promise + + // UDP + udpBind(host: string, port: number): Promise + udpSend(socket: HostUdpSocket, data: Uint8Array, host: string, port: number): Promise + + // DNS + dnsLookup(hostname: string, rrtype: string): Promise +} + +interface HostSocket { + write(data: Uint8Array): Promise + read(): Promise // null = EOF + close(): Promise +} + +interface HostListener { + accept(): Promise + close(): Promise + readonly port: number // actual bound port (for port 0) +} + +interface HostUdpSocket { + recv(): Promise<{ data: Uint8Array, remoteAddr: { host: string, port: number } }> + close(): Promise +} +``` + +Node.js driver implements this using `node:net` / `node:dgram`. Browser driver implements TCP via WebSocket proxy or marks as unavailable. + +--- + +## Testing Strategy + +All kernel components are tested standalone — no Node.js runtime, no WasmVM, no browser. Tests import kernel classes directly and exercise them in isolation. + +### Test files: + +``` +packages/core/test/kernel/ + socket-table.test.ts # K-1: Socket lifecycle, state transitions, EMFILE + loopback.test.ts # K-2: In-kernel client↔server routing + server-socket.test.ts # K-3: listen/accept, backlog, EADDRINUSE + udp-socket.test.ts # K-4: Datagram send/recv, message boundaries + unix-socket.test.ts # K-5: VFS-path binding, stream + dgram modes + network-permissions.test.ts # K-7: Deny-by-default, loopback exemption + timer-table.test.ts # Timer lifecycle, budgets, process cleanup + dns-cache.test.ts # Cache hit/miss, TTL, flush +``` + +### Test pattern: + +```typescript +import { KernelImpl } from '../../src/kernel/kernel'; +import { InMemoryFileSystem } from '../../src/shared/in-memory-fs'; + +describe('socket table', () => { + let kernel: KernelImpl; + + beforeEach(() => { + kernel = new KernelImpl({ vfs: new InMemoryFileSystem() }); + }); + + afterEach(async () => { + await kernel.dispose(); + }); + + it('creates a TCP socket', () => { + const socketId = kernel.socketTable.create(AF_INET, SOCK_STREAM, 0, /*pid=*/1); + expect(socketId).toBeGreaterThan(0); + const socket = kernel.socketTable.get(socketId); + expect(socket.state).toBe('created'); + expect(socket.domain).toBe(AF_INET); + expect(socket.type).toBe(SOCK_STREAM); + }); + + it('loopback TCP connect routes in-kernel', async () => { + // Server + const serverSock = kernel.socketTable.create(AF_INET, SOCK_STREAM, 0, 1); + kernel.socketTable.bind(serverSock, { host: '127.0.0.1', port: 8080 }); + kernel.socketTable.listen(serverSock, 5); + + // Client + const clientSock = kernel.socketTable.create(AF_INET, SOCK_STREAM, 0, 2); + kernel.socketTable.connect(clientSock, { host: '127.0.0.1', port: 8080 }); + + // Accept + const accepted = kernel.socketTable.accept(serverSock); + expect(accepted).not.toBeNull(); + + // Exchange data + kernel.socketTable.send(clientSock, Buffer.from('hello')); + const data = kernel.socketTable.recv(accepted!.id, 1024); + expect(Buffer.from(data!).toString()).toBe('hello'); + }); +}); +``` + +### Integration test (cross-runtime): + +```typescript +// packages/secure-exec/tests/kernel/cross-runtime-network.test.ts +it('WasmVM server accepts Node.js client connection', async () => { + const kernel = createKernel(); + + // WasmVM process listens on port 9090 + const wasmProc = await kernel.spawn('wasm-server', [], { driver: wasmDriver }); + // (WASM binary calls socket() → bind(9090) → listen() → accept()) + + // Node.js process connects to port 9090 + const nodeResult = await kernel.exec('node', ['-e', ` + const net = require('net'); + const client = net.connect(9090, '127.0.0.1', () => { + client.write('ping'); + client.on('data', (d) => { console.log(d.toString()); client.end(); }); + }); + `]); + + expect(nodeResult.stdout).toContain('pong'); +}); +``` + +--- + +## Migration Order + +1. **Socket table + loopback** (K-1, K-2, K-3) — core abstraction, everything depends on it +2. **Network permissions** (K-7) — must exist before exposing sockets to runtimes +3. **Node.js HTTP server migration** (N-2, N-3) — highest ROI, unlocks 492 tests +4. **Node.js net socket migration** (N-4) — needed for HTTP server +5. **UDP sockets** (K-4) — unlocks 76 dgram tests + WasmVM #17 +6. **Unix domain sockets** (K-5) — unlocks WasmVM #2 +7. **WasmVM syscall wiring** — expose socket table via RPC +8. **Signal handlers** (K-8) — independent, can parallel with above +9. **Timer/handle migration** (N-5, N-7, N-8) — lower priority, mainly cleanup +10. **VFS change notifications** (K-9) — independent, lower priority +11. **DNS cache** (N-10) — nice-to-have +12. **FD table unification** (N-1) — important but risky, do after networking stabilizes +13. **Crypto session cleanup** (N-12) — lowest priority From 6ef16c98f25ca329bff8897be61844133c6f3381 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:40:58 -0700 Subject: [PATCH 08/10] docs: expand kernel spec with full WasmVM integration and proofing section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Detail WasmVM current state (TCP/TLS/DNS/poll exists but bypasses kernel) - Specify migration path: driver sockets → kernel socket table - Add new WASI extensions: net_bind, net_listen, net_accept, net_sendto, net_recvfrom - Specify C sysroot patches for bind/listen/accept/sendto/recvfrom - Detail kernel-worker.ts and driver.ts changes - Specify blocking semantics (Atomics.wait for accept/recv) - Specify cooperative signal delivery at syscall boundaries - Add WasmVM-specific test files and C test programs - Add proofing section: implementation review, conformance re-test, expectations update, and PRD update via Ralph Co-Authored-By: Claude Opus 4.6 (1M context) --- .../specs/kernel-networking-consolidation.md | 330 +++++++++++++++++- 1 file changed, 317 insertions(+), 13 deletions(-) diff --git a/docs-internal/specs/kernel-networking-consolidation.md b/docs-internal/specs/kernel-networking-consolidation.md index a8d29e9a..f7d60571 100644 --- a/docs-internal/specs/kernel-networking-consolidation.md +++ b/docs-internal/specs/kernel-networking-consolidation.md @@ -305,23 +305,253 @@ Runtimes call kernel DNS before falling through to host adapter. ## Part 4: WasmVM Integration -WasmVM already communicates with the kernel via synchronous RPC (`kernel-worker.ts` with Atomics.wait + SharedArrayBuffer). New kernel network APIs are exposed the same way: +### 4.1 Current State + +WasmVM ALREADY has TCP/TLS/DNS/poll support, but it **bypasses the kernel entirely** and goes direct to host: + +- **Rust WASI extensions** (`native/wasmvm/crates/wasi-ext/src/lib.rs`): `host_net` module with `net_socket`, `net_connect`, `net_send`, `net_recv`, `net_close`, `net_tls_connect`, `net_getaddrinfo`, `net_setsockopt`, `net_poll` +- **C sysroot patches** (`native/wasmvm/patches/wasi-libc/0008-sockets.patch`): `host_socket.c` with libc implementations of `socket()`, `connect()`, `send()`, `recv()`, `poll()`, `select()`, `getaddrinfo()`, `setsockopt()` +- **Kernel worker** (`packages/wasmvm/src/kernel-worker.ts`): `createHostNetImports()` routes network calls through permission check then RPC +- **Driver** (`packages/wasmvm/src/driver.ts`): `_sockets` Map holds real Node.js `net.Socket` objects, `_nextSocketId` counter, handlers for `netSocket`/`netConnect`/`netSend`/`netRecv`/`netClose`/`netTlsConnect`/`netGetaddrinfo`/`netPoll` + +**What's missing in WasmVM:** +- `bind()` — no WASI extension (WasmVM #1: no server sockets) +- `listen()` — no WASI extension (WasmVM #1) +- `accept()` — no WASI extension (WasmVM #1) +- `sendto()`/`recvfrom()` — no UDP datagram support (WasmVM #17) +- Unix domain sockets — no AF_UNIX support (WasmVM #2) +- `setsockopt()` — returns ENOSYS (WasmVM #19) +- Signal handlers — no `sigaction()` (WasmVM #9) +- Socket FDs are NOT kernel FDs — stored in driver's `_sockets` Map, separate from kernel FD table + +### 4.2 Migration: Route Existing Sockets Through Kernel + +The existing WasmVM network path (`kernel-worker.ts` → RPC → `driver.ts` → real host TCP) must be rerouted through the kernel socket table: + +**Step 1: Driver stops managing sockets directly** + +Current `driver.ts` handlers (`netSocket`, `netConnect`, etc.) manage `_sockets` Map with real Node.js `Socket` objects. After migration: +- `netSocket` → calls `kernel.socketTable.create()` instead of allocating local ID +- `netConnect` → calls `kernel.socketTable.connect()` which handles loopback vs external routing +- `netSend` → calls `kernel.socketTable.send()` +- `netRecv` → calls `kernel.socketTable.recv()` +- `netClose` → calls `kernel.socketTable.close()` +- `netPoll` → calls `kernel.socketTable.poll()` (unified with pipe poll via `kernel.fdPoll()`) + +**Step 2: Unify socket FDs with kernel FD table** + +Currently WasmVM socket FDs (`_nextSocketId` in driver.ts) and kernel FDs (`localToKernelFd` map in kernel-worker.ts) are separate number spaces. After migration: +- `kernel.socketTable.create()` returns a kernel FD +- Kernel worker maps local WASM FD → kernel socket FD (same `localToKernelFd` map used for files/pipes) +- `poll()` works across file FDs, pipe FDs, and socket FDs in one call + +**Step 3: TLS stays in host adapter** + +TLS handshake requires OpenSSL — it can't run in-kernel. The kernel socket table delegates TLS to the host adapter: +- `kernel.socketTable.upgradeTls(socketId, hostname)` → host adapter wraps the host-side socket in TLS +- From the kernel's perspective, the socket is still a kernel socket — TLS is transparent + +### 4.3 New WASI Extensions for Server Sockets + +Add to `native/wasmvm/crates/wasi-ext/src/lib.rs` under `host_net`: + +```rust +// New host imports +fn net_bind(fd: i32, addr_ptr: *const u8, addr_len: u32) -> i32; +fn net_listen(fd: i32, backlog: i32) -> i32; +fn net_accept(fd: i32, ret_fd: *mut i32, ret_addr: *mut u8, ret_addr_len: *mut u32) -> i32; +fn net_sendto(fd: i32, buf: *const u8, len: u32, flags: i32, + addr_ptr: *const u8, addr_len: u32, ret_sent: *mut u32) -> i32; +fn net_recvfrom(fd: i32, buf: *mut u8, len: u32, flags: i32, + ret_addr: *mut u8, ret_addr_len: *mut u32, ret_received: *mut u32) -> i32; +``` + +Add safe Rust wrappers following the existing pattern (`pub fn bind()`, `pub fn listen()`, etc.). + +### 4.4 C Sysroot Patches for Server/UDP/Unix + +Extend `native/wasmvm/patches/wasi-libc/0008-sockets.patch` (or create `0009-server-sockets.patch`) to add to `host_socket.c`: + +```c +// Server sockets +int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { + char addr_str[256]; + sockaddr_to_string(addr, addrlen, addr_str, sizeof(addr_str)); + return __host_net_bind(sockfd, addr_str, strlen(addr_str)); +} + +int listen(int sockfd, int backlog) { + return __host_net_listen(sockfd, backlog); +} + +int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen) { + int new_fd = -1; + char remote_addr[256]; + uint32_t remote_addr_len = sizeof(remote_addr); + int err = __host_net_accept(sockfd, &new_fd, remote_addr, &remote_addr_len); + if (err != 0) { errno = err; return -1; } + if (addr && addrlen) { + string_to_sockaddr(remote_addr, remote_addr_len, addr, addrlen); + } + return new_fd; +} + +// UDP +ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest_addr, socklen_t addrlen) { + char addr_str[256]; + sockaddr_to_string(dest_addr, addrlen, addr_str, sizeof(addr_str)); + uint32_t sent = 0; + int err = __host_net_sendto(sockfd, buf, len, flags, addr_str, strlen(addr_str), &sent); + if (err != 0) { errno = err; return -1; } + return (ssize_t)sent; +} + +ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, + struct sockaddr *src_addr, socklen_t *addrlen) { + char addr_str[256]; + uint32_t addr_len = sizeof(addr_str), received = 0; + int err = __host_net_recvfrom(sockfd, buf, len, flags, addr_str, &addr_len, &received); + if (err != 0) { errno = err; return -1; } + if (src_addr && addrlen) { + string_to_sockaddr(addr_str, addr_len, src_addr, addrlen); + } + return (ssize_t)received; +} +``` + +Also add AF_UNIX support in `sockaddr_to_string()` / `string_to_sockaddr()` — serialize `struct sockaddr_un` path to/from string. + +### 4.5 Kernel Worker Updates + +In `packages/wasmvm/src/kernel-worker.ts`, update `createHostNetImports()`: + +```typescript +// Existing imports route through kernel instead of direct RPC: +net_socket: (domain, type, protocol, ret_fd) => { + if (isNetworkBlocked()) return ERRNO_EACCES; + const res = rpcCall('kernelSocketCreate', { domain, type, protocol, pid }); + // ... +}, +net_connect: (fd, addr_ptr, addr_len) => { + const kernelFd = localToKernelFd.get(fd) ?? fd; + const res = rpcCall('kernelSocketConnect', { socketId: kernelFd, addr }); + // ... +}, + +// New imports: +net_bind: (fd, addr_ptr, addr_len) => { + if (isNetworkBlocked()) return ERRNO_EACCES; + const kernelFd = localToKernelFd.get(fd) ?? fd; + const addr = decodeString(addr_ptr, addr_len); + const res = rpcCall('kernelSocketBind', { socketId: kernelFd, addr }); + return res.errno; +}, +net_listen: (fd, backlog) => { + if (isNetworkBlocked()) return ERRNO_EACCES; + const kernelFd = localToKernelFd.get(fd) ?? fd; + const res = rpcCall('kernelSocketListen', { socketId: kernelFd, backlog }); + return res.errno; +}, +net_accept: (fd, ret_fd, ret_addr, ret_addr_len) => { + if (isNetworkBlocked()) return ERRNO_EACCES; + const kernelFd = localToKernelFd.get(fd) ?? fd; + const res = rpcCall('kernelSocketAccept', { socketId: kernelFd }); + if (res.errno !== 0) return res.errno; + // Map new kernel socket FD to local FD + const localFd = nextLocalFd++; + localToKernelFd.set(localFd, res.intResult); + writeI32(ret_fd, localFd); + // Write remote address to ret_addr buffer + return 0; +}, +net_sendto: (fd, buf, len, flags, addr_ptr, addr_len, ret_sent) => { + // ... permission check, decode, rpcCall('kernelSocketSendTo', ...) +}, +net_recvfrom: (fd, buf, len, flags, ret_addr, ret_addr_len, ret_received) => { + // ... rpcCall('kernelSocketRecvFrom', ...), blocks via Atomics.wait +}, +``` + +### 4.6 Driver Updates + +In `packages/wasmvm/src/driver.ts`, replace socket handlers with kernel delegation: + +```typescript +// Remove: _sockets Map, _nextSocketId counter +// Replace handlers with kernel calls: + +case 'kernelSocketCreate': + return kernel.socketTable.create(args.domain, args.type, args.protocol, args.pid); +case 'kernelSocketBind': + return kernel.socketTable.bind(args.socketId, parseAddr(args.addr)); +case 'kernelSocketListen': + return kernel.socketTable.listen(args.socketId, args.backlog); +case 'kernelSocketAccept': + return kernel.socketTable.accept(args.socketId); // blocks until connection or EAGAIN +case 'kernelSocketConnect': + return kernel.socketTable.connect(args.socketId, parseAddr(args.addr)); +case 'kernelSocketSendTo': + return kernel.socketTable.sendTo(args.socketId, args.data, args.flags, parseAddr(args.addr)); +case 'kernelSocketRecvFrom': + return kernel.socketTable.recvFrom(args.socketId, args.maxBytes, args.flags); +``` + +### 4.7 Blocking Semantics + +WasmVM uses `Atomics.wait()` to block the worker thread during syscalls. For blocking socket operations: + +- **`accept()`**: If no pending connection, the main thread handler waits for a kernel socket event (connection arrival) before responding. The worker thread stays blocked on `Atomics.wait()`. Timeout: 30s (existing `RPC_WAIT_TIMEOUT_MS`). +- **`recv()`**: If no data in kernel buffer, main thread waits for data or EOF. Same blocking pattern. +- **`connect()` to external**: Main thread creates host TCP connection, waits for connect event, then responds. +- **`connect()` to loopback**: Kernel instantly connects via in-kernel routing — no host wait. +- **Non-blocking mode**: If `O_NONBLOCK` is set on the socket, kernel returns `EAGAIN` immediately instead of blocking. The WASM program uses `poll()` to wait for readiness. + +### 4.8 Signal Handler Delivery + +WASM cannot be interrupted mid-execution. Signals must be delivered cooperatively: + +1. **Registration**: Add `net_sigaction` WASI extension. WASM program calls `sigaction(SIGINT, handler, NULL)`. Kernel worker stores handler function pointer + signal mask in kernel process table entry. + +2. **Delivery**: When kernel delivers a signal to a WasmVM process: + - Kernel sets a `pendingSignals` bitmask on the process entry + - At next syscall boundary (any `rpcCall` from worker), kernel worker checks `pendingSignals` + - If signal pending and handler registered: worker invokes the WASM handler function via `instance.exports.__wasi_signal_trampoline(signum)` before returning from the syscall + - If no handler: default behavior (SIGTERM → exit, SIGINT → exit, etc.) + +3. **Trampoline**: The C sysroot patch adds a `__wasi_signal_trampoline` export that dispatches to the registered `sigaction` handler. This is called from the JS worker side when a signal is pending. + +4. **Limitations**: + - Signals only delivered at syscall boundaries — long-running compute without syscalls won't see signals (WasmVM #10, fundamental WASM limitation) + - `SIGKILL` always terminates immediately (kernel-enforced, no handler invocation) + - `SIGSTOP`/`SIGCONT` handled by kernel process table, not user handlers + +### 4.9 WasmVM-Specific Tests + +Add to existing test files: + +``` +packages/wasmvm/test/ + net-socket.test.ts # UPDATE: migrate existing tests to use kernel sockets + net-server.test.ts # NEW: bind/listen/accept, loopback server + net-udp.test.ts # NEW: UDP send/recv, message boundaries + net-unix.test.ts # NEW: Unix domain sockets via VFS paths + net-cross-runtime.test.ts # NEW: WasmVM server ↔ Node.js client and vice versa + signal-handler.test.ts # NEW: sigaction registration, cooperative delivery +``` + +**C test programs** (compiled to WASM): ``` -// In kernel-worker.ts, add syscall handlers: -case 'sock_open': return kernel.socketTable.create(domain, type, protocol, pid); -case 'sock_bind': return kernel.socketTable.bind(socketId, addr); -case 'sock_listen': return kernel.socketTable.listen(socketId, backlog); -case 'sock_accept': return kernel.socketTable.accept(socketId); -case 'sock_connect': return kernel.socketTable.connect(socketId, addr); -case 'sock_send': return kernel.socketTable.send(socketId, data, flags); -case 'sock_recv': return kernel.socketTable.recv(socketId, maxBytes, flags); -case 'sock_close': return kernel.socketTable.close(socketId); -case 'sock_setopt': return kernel.socketTable.setsockopt(socketId, level, opt, val); -case 'sock_getopt': return kernel.socketTable.getsockopt(socketId, level, opt); +native/wasmvm/c/programs/ + tcp_server.c # bind → listen → accept → recv → send → close + tcp_client.c # socket → connect → send → recv → close + udp_echo.c # socket(SOCK_DGRAM) → bind → recvfrom → sendto + unix_socket.c # socket(AF_UNIX) → bind → listen → accept + signal_handler.c # sigaction(SIGINT, handler) → busy loop → verify handler called ``` -WasmVM WASI extensions (`native/wasmvm/crates/wasi-ext/src/lib.rs`) call these via the existing host import mechanism. The C sysroot patches route `socket()`, `bind()`, `listen()`, `accept()`, `connect()`, `send()`, `recv()`, `close()`, `setsockopt()`, `getsockopt()` through these host imports. +These programs are built via `native/wasmvm/c/Makefile` (add to `PATCHED_PROGRAMS` since they use `host_net` imports) and tested via the WasmVM driver in vitest. --- @@ -472,3 +702,77 @@ it('WasmVM server accepts Node.js client connection', async () => { 11. **DNS cache** (N-10) — nice-to-have 12. **FD table unification** (N-1) — important but risky, do after networking stabilizes 13. **Crypto session cleanup** (N-12) — lowest priority + +--- + +## Part 7: Proofing + +After the kernel networking consolidation is implemented, a full audit must be performed before the work is considered complete. + +### 7.1 Implementation Review + +An adversarial review agent must verify: + +1. **Kernel completeness**: Every socket operation (create, bind, listen, accept, connect, send, recv, sendto, recvfrom, close, poll, setsockopt, getsockopt) works in the kernel standalone tests without any runtime attached. + +2. **Node.js migration completeness**: No networking code remains in the Node.js bridge that bypasses the kernel. Specifically verify: + - `packages/nodejs/src/driver.ts` has no `servers` Map, no `ownedServerPorts` Set, no `netSockets` Map, no `upgradeSockets` Map + - `packages/nodejs/src/bridge/network.ts` has no `serverRequestListeners` Map, no `activeNetSockets` Map + - `packages/nodejs/src/bridge-handlers.ts` has no socket Maps + - All `http.createServer()` calls route through `kernel.socketTable.listen()` + - All `net.connect()` calls route through `kernel.socketTable.connect()` + - SSRF validation is in the kernel, not the host adapter + +3. **WasmVM migration completeness**: No networking code remains in the WasmVM driver that bypasses the kernel. Specifically verify: + - `packages/wasmvm/src/driver.ts` has no `_sockets` Map, no `_nextSocketId` counter + - All `netSocket`/`netConnect`/`netSend`/`netRecv`/`netClose` handlers delegate to kernel + - New handlers exist for `kernelSocketBind`, `kernelSocketListen`, `kernelSocketAccept`, `kernelSocketSendTo`, `kernelSocketRecvFrom` + - Socket FDs are unified with kernel FD table (no separate number space) + - `net_bind`, `net_listen`, `net_accept`, `net_sendto`, `net_recvfrom` WASI extensions exist in `lib.rs` + - C sysroot patches exist for `bind()`, `listen()`, `accept()`, `sendto()`, `recvfrom()` + - `setsockopt()` no longer returns ENOSYS for supported options + +4. **Loopback routing**: Verify that a server in one runtime can accept connections from another runtime without any real TCP: + - Node.js `http.createServer()` on port 8080 → WasmVM `curl http://localhost:8080` works + - WasmVM `tcp_server` on port 9090 → Node.js `net.connect(9090)` works + - Neither connection touches the host network stack + +5. **Permission enforcement**: Verify deny-by-default for all socket operations through the kernel, for both runtimes. + +6. **Signal delivery**: Verify WasmVM signal handlers fire at syscall boundaries for SIGINT, SIGTERM, SIGUSR1. + +7. **Resource cleanup**: Verify all sockets, timers, and handles are cleaned up when a process exits, for both runtimes. + +### 7.2 Conformance Re-test + +After kernel migration: + +1. Run the full Node.js conformance suite (`packages/secure-exec/tests/node-conformance/runner.test.ts`) +2. Run the full WasmVM test suite (`packages/wasmvm/test/`) +3. Run the full POSIX conformance suite if socket-related os-tests exist +4. Run the project-matrix suite (`packages/secure-exec/tests/projects/`) + +### 7.3 Expectations Update + +Tests that were blocked by networking gaps should be re-tested and reclassified: + +1. Re-run all 492 FIX-01 (HTTP server) tests — remove expectations for tests that now pass +2. Re-run all 76 dgram tests — remove expectations for tests that now pass +3. Re-run https/tls/net/http2 glob tests — reclassify from `unsupported-module` to specific failure reasons +4. Update `docs-internal/nodejs-compat-roadmap.md` with new pass counts +5. Regenerate conformance report (`scripts/generate-report.ts`) + +### 7.4 PRD Update via Ralph + +After the review, any remaining gaps, regressions, or incomplete items must be captured as new stories in `scripts/ralph/prd.json`: + +1. Load the Ralph skill (`/ralph`) +2. For each gap found during proofing: + - Create a new user story with specific acceptance criteria + - Include the exact test names that are still failing + - Reference the kernel component that needs fixing +3. Stories should be right-sized for one Ralph iteration (one context window) +4. Set priorities sequentially after existing stories +5. Ralph then executes the remaining stories autonomously until all pass + +This ensures no gaps are left undocumented and the work converges to completion through automated iteration. From 9d03f2fe6fa099f5d390557c14ebd2f69f181106 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:41:23 -0700 Subject: [PATCH 09/10] docs: rename spec to kernel-consolidation (covers more than networking) Co-Authored-By: Claude Opus 4.6 (1M context) --- ...el-networking-consolidation.md => kernel-consolidation.md} | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename docs-internal/specs/{kernel-networking-consolidation.md => kernel-consolidation.md} (99%) diff --git a/docs-internal/specs/kernel-networking-consolidation.md b/docs-internal/specs/kernel-consolidation.md similarity index 99% rename from docs-internal/specs/kernel-networking-consolidation.md rename to docs-internal/specs/kernel-consolidation.md index f7d60571..74e005af 100644 --- a/docs-internal/specs/kernel-networking-consolidation.md +++ b/docs-internal/specs/kernel-consolidation.md @@ -1,4 +1,6 @@ -# Kernel Networking & Resource Consolidation +# Kernel Consolidation + +Networking, resource management, and runtime-specific subsystems that need to move into the shared kernel. ## Problem From 92e9ed98767180210008f01d0aac73af6cb81ed9 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Mon, 23 Mar 2026 18:47:02 -0700 Subject: [PATCH 10/10] docs: add missing kernel spec sections from adversarial review Addresses all 8 use cases: - K-10: Unified blocking I/O wait system (WaitQueue/WaitHandle) - K-11: Inode layer (allocator, refcount, deferred unlink, hard links) - K-8 expanded: Full sigaction (SA_RESTART, sigprocmask, coalescing) - Socket API: add shutdown(), socketpair(), sendTo(), recvFrom(), poll() - Socket flags: MSG_PEEK, MSG_DONTWAIT, MSG_NOSIGNAL, O_NONBLOCK - Socket states: add read-closed/write-closed for half-close - HostSocket: add setOption(), shutdown() - Wildcard address matching, error semantics, datagram limits - Updated test file list and migration order Co-Authored-By: Claude Opus 4.6 (1M context) --- docs-internal/specs/kernel-consolidation.md | 210 +++++++++++++++++--- 1 file changed, 184 insertions(+), 26 deletions(-) diff --git a/docs-internal/specs/kernel-consolidation.md b/docs-internal/specs/kernel-consolidation.md index 74e005af..03f5c2ac 100644 --- a/docs-internal/specs/kernel-consolidation.md +++ b/docs-internal/specs/kernel-consolidation.md @@ -36,36 +36,59 @@ KernelSocket { domain: AF_INET | AF_INET6 | AF_UNIX type: SOCK_STREAM | SOCK_DGRAM protocol: number - state: 'created' | 'bound' | 'listening' | 'connected' | 'closed' + state: 'created' | 'bound' | 'listening' | 'connected' | 'read-closed' | 'write-closed' | 'closed' + nonBlocking: boolean // O_NONBLOCK localAddr?: { host: string, port: number } | { path: string } remoteAddr?: { host: string, port: number } | { path: string } options: Map // SO_REUSEADDR, TCP_NODELAY, etc. pid: number // owning process - readBuffer: Uint8Array[] // incoming data queue - readWaiters: Array<(data: Uint8Array) => void> + readBuffer: Uint8Array[] // incoming data queue (SOCK_DGRAM: each element = one datagram) + readWaiters: WaitHandle[] // unified wait/wake (see K-10) writeBuffer: Uint8Array[] // outgoing data queue (for non-blocking) backlog: KernelSocket[] // pending connections (listening sockets only) - acceptWaiters: Array<(socket: KernelSocket) => void> + acceptWaiters: WaitHandle[] } SocketTable { private sockets: Map private nextSocketId: number - private listeners: Map // "host:port" → listening socket + private listeners: Map // "host:port" OR "/vfs/path" → listening socket create(domain, type, protocol, pid): number // returns socket ID + socketpair(domain, type, protocol, pid): [number, number] // returns two connected socket IDs bind(socketId, addr): void listen(socketId, backlog): void accept(socketId): KernelSocket | null // null = EAGAIN connect(socketId, addr): void // in-kernel for loopback, host adapter for external - send(socketId, data, flags): number // bytes sent - recv(socketId, maxBytes, flags): Uint8Array | null + shutdown(socketId, how: 'read' | 'write' | 'both'): void // half-close + send(socketId, data, flags): number // bytes sent (SOCK_STREAM) + sendTo(socketId, data, flags, destAddr): number // bytes sent (SOCK_DGRAM) + recv(socketId, maxBytes, flags): Uint8Array | null // SOCK_STREAM + recvFrom(socketId, maxBytes, flags): { data: Uint8Array, srcAddr: SockAddr } | null // SOCK_DGRAM close(socketId): void + poll(socketId): { readable: boolean, writable: boolean, hangup: boolean } setsockopt(socketId, level, optname, optval): void getsockopt(socketId, level, optname): number - getLocalAddr(socketId): SockAddr - getRemoteAddr(socketId): SockAddr + getLocalAddr(socketId): SockAddr // getsockname() + getRemoteAddr(socketId): SockAddr // getpeername() } + +// Flags for send/recv: +// MSG_PEEK — read without consuming from buffer +// MSG_DONTWAIT — non-blocking for this single call (regardless of O_NONBLOCK) +// MSG_NOSIGNAL — don't raise SIGPIPE on broken connection + +// For SOCK_DGRAM readBuffer: each Uint8Array element is one complete datagram. +// Message boundaries are preserved — two 100-byte sends produce two 100-byte recvs. +// For SOCK_STREAM readBuffer: elements may be coalesced or split at arbitrary boundaries. +// Max UDP datagram size: 65535 bytes. Max receive queue depth: 128 datagrams. + +// Wildcard address matching: connect('127.0.0.1', 8080) matches a listener +// bound to '0.0.0.0:8080'. The listeners map must check both exact and wildcard. + +// Error semantics for send() on closed connection: EPIPE (+ SIGPIPE unless MSG_NOSIGNAL). +// Error semantics for send() on reset connection: ECONNRESET. +// Error semantics for send() on unconnected SOCK_STREAM: ENOTCONN. ``` **Testing:** Standalone test in `packages/core/test/kernel/socket-table.test.ts`: @@ -258,6 +281,130 @@ Runtimes call kernel DNS before falling through to host adapter. - TTL expiry → host adapter called again - Flush → all entries cleared +### 2.4 Unified Blocking I/O Wait System (K-10) + +Currently each blocking operation (pipe read, socket recv, flock, poll) implements its own wait/wake logic. Add a unified `WaitHandle` primitive in `packages/core/src/kernel/wait.ts`: + +``` +WaitHandle { + wait(timeoutMs?: number): Promise // suspends caller until woken or timeout + wake(): void // wakes one waiter + wakeAll(): void // wakes all waiters +} + +WaitQueue { + private waiters: WaitHandle[] + enqueue(): WaitHandle // creates and enqueues a new WaitHandle + wakeOne(): void + wakeAll(): void +} +``` + +All kernel subsystems use `WaitQueue` for blocking: +- **Pipe read** (buffer empty) → `pipeState.readWaiters.enqueue().wait()` +- **Pipe write** (buffer full) → `pipeState.writeWaiters.enqueue().wait()` +- **Socket accept** (no pending connection) → `socket.acceptWaiters.enqueue().wait()` +- **Socket recv** (no data) → `socket.readWaiters.enqueue().wait()` +- **flock** (lock held by another process) → `fileLock.waiters.enqueue().wait()` +- **poll() with timeout -1** → `waitQueue.enqueue().wait()` on each polled FD, race with timeout + +**WasmVM integration:** The WasmVM worker thread blocks on `Atomics.wait()` during any syscall. The main thread handler calls `waitQueue.enqueue().wait()` (which is a JS Promise). When the condition is met, `wake()` resolves the Promise, the main thread writes the response to the signal buffer, and `Atomics.notify()` wakes the worker. The existing 30s `RPC_WAIT_TIMEOUT_MS` applies — for indefinite waits (poll timeout -1), the main thread handler loops: wait → timeout → check condition → re-wait. + +**Node.js integration:** The Node.js bridge is async. Blocking semantics are implemented via `applySyncPromise` (V8's synchronous Promise resolution). `recv()` returns a Promise that resolves when the WaitHandle is woken. The isolate event loop pumps until the Promise settles. + +**Testing:** Standalone test in `packages/core/test/kernel/wait-queue.test.ts`: +- Create WaitHandle, wake it — verify wait() resolves +- Create WaitHandle with timeout — verify it times out +- Multiple waiters, wakeOne — verify only one wakes +- wakeAll — verify all wake +- Wait on pipe read with empty buffer — write data — verify read unblocks +- Wait on flock held by process A — process A unlocks — verify process B unblocks + +### 2.5 Inode Layer (K-11) + +Add `packages/core/src/kernel/inode-table.ts`: + +``` +Inode { + ino: number // unique inode number + nlink: number // hard link count + openRefCount: number // number of open FDs referencing this inode + mode: number // file type + permissions (S_IFREG, S_IFDIR, etc.) + uid: number + gid: number + size: number + atime: Date + mtime: Date + ctime: Date + birthtime: Date +} + +InodeTable { + private inodes: Map + private nextIno: number + + allocate(mode, uid, gid): Inode + get(ino: number): Inode | null + incrementLinks(ino): void // hard link created + decrementLinks(ino): void // hard link or directory entry removed + incrementOpenRefs(ino): void // FD opened + decrementOpenRefs(ino): void // FD closed — if nlink=0 and openRefCount=0, delete data + shouldDelete(ino): boolean // nlink=0 && openRefCount=0 +} +``` + +VFS nodes reference inodes by `ino` number. Multiple directory entries (hard links) share the same inode. `stat()` returns inode metadata. + +**Deferred deletion:** When `unlink()` removes the last directory entry (`nlink → 0`) but FDs are still open (`openRefCount > 0`), the inode and its data persist. The file disappears from directory listings but remains accessible via open FDs. When the last FD is closed (`openRefCount → 0`), the inode and data are deleted. `stat()` on an open FD to an unlinked file returns `nlink: 0`. + +**Hard links:** `link(existingPath, newPath)` creates a new directory entry pointing to the same inode. `incrementLinks()` bumps `nlink`. Both paths return the same `ino` from `stat()`. + +**Integration with FD table:** `ProcessFDTable.open()` calls `inodeTable.incrementOpenRefs(ino)`. `ProcessFDTable.close()` calls `inodeTable.decrementOpenRefs(ino)` and checks `shouldDelete()`. + +**Testing:** Standalone test in `packages/core/test/kernel/inode-table.test.ts`: +- Allocate inode, verify ino is unique +- Create hard link — verify nlink increments, both paths return same ino +- Unlink file with open FD — verify data persists, stat returns nlink=0 +- Close last FD on unlinked file — verify inode and data are deleted +- stat() on unlinked-but-open file — verify correct metadata + +### 2.6 Signal Handler Registry (K-8, expanded) + +Expand beyond section 4.8's basic signal delivery to full POSIX sigaction semantics: + +``` +SignalHandler { + handler: 'default' | 'ignore' | FunctionPointer // SIG_DFL, SIG_IGN, or user function + mask: Set // signals blocked during handler execution (sa_mask) + flags: number // SA_RESTART, SA_NOCLDSTOP, etc. +} + +ProcessSignalState { + handlers: Map // signal number → handler + blockedSignals: Set // sigprocmask: currently blocked signals + pendingSignals: Map // signal → count (queued while blocked) +} +``` + +**sigaction(signal, handler, mask, flags):** Registers a handler for `signal`. When the signal is delivered: +1. If handler is `'ignore'` → signal is discarded +2. If handler is `'default'` → kernel applies default action (SIGTERM→exit, SIGINT→exit, SIGCHLD→ignore, etc.) +3. If handler is a function pointer → kernel invokes it with `sa_mask` signals temporarily blocked + +**SA_RESTART:** If a signal interrupts a blocking syscall (recv, accept, read, wait, poll) and SA_RESTART is set, the syscall is restarted automatically after the handler returns. Without SA_RESTART, the syscall returns EINTR. + +**sigprocmask(how, set):** `SIG_BLOCK` adds signals to `blockedSignals`, `SIG_UNBLOCK` removes them, `SIG_SETMASK` replaces. Signals delivered while blocked are queued in `pendingSignals`. When unblocked, pending signals are delivered in order (lowest signal number first, per POSIX). + +**Signal coalescing:** Standard signals (1-31) are coalesced — if SIGINT is delivered twice while blocked, only one instance is queued. The `pendingSignals` count is capped at 1 for standard signals. + +**Testing:** Standalone test in `packages/core/test/kernel/signal-handlers.test.ts`: +- Register SIGINT handler, deliver SIGINT — verify handler called instead of default exit +- SA_RESTART: handler interrupts blocking recv, verify recv restarts +- No SA_RESTART: handler interrupts blocking recv, verify EINTR returned +- sigprocmask SIG_BLOCK SIGINT, deliver SIGINT, verify not delivered until SIG_UNBLOCK +- Two SIGINTs while blocked — verify only one delivered (coalescing) +- SIG_IGN for SIGCHLD — verify child exit doesn't invoke handler + --- ## Part 3: Node.js Bridge Migration @@ -579,6 +726,8 @@ interface HostSocket { write(data: Uint8Array): Promise read(): Promise // null = EOF close(): Promise + setOption(level: number, optname: number, optval: number): void // forward kernel socket options + shutdown(how: 'read' | 'write' | 'both'): void // TCP FIN } interface HostListener { @@ -605,14 +754,19 @@ All kernel components are tested standalone — no Node.js runtime, no WasmVM, n ``` packages/core/test/kernel/ - socket-table.test.ts # K-1: Socket lifecycle, state transitions, EMFILE - loopback.test.ts # K-2: In-kernel client↔server routing + socket-table.test.ts # K-1: Socket lifecycle, state transitions, EMFILE, socketpair + loopback.test.ts # K-2: In-kernel client↔server routing, wildcard address matching server-socket.test.ts # K-3: listen/accept, backlog, EADDRINUSE - udp-socket.test.ts # K-4: Datagram send/recv, message boundaries - unix-socket.test.ts # K-5: VFS-path binding, stream + dgram modes + udp-socket.test.ts # K-4: Datagram send/recv, message boundaries, max dgram size + unix-socket.test.ts # K-5: VFS-path binding, stream + dgram modes, socketpair network-permissions.test.ts # K-7: Deny-by-default, loopback exemption + wait-queue.test.ts # K-10: Unified wait/wake, pipe blocking, flock blocking + inode-table.test.ts # K-11: Inode alloc, hard links, deferred unlink, refcount + signal-handlers.test.ts # K-8: sigaction, SA_RESTART, sigprocmask, coalescing timer-table.test.ts # Timer lifecycle, budgets, process cleanup dns-cache.test.ts # Cache hit/miss, TTL, flush + socket-shutdown.test.ts # shutdown() half-close, read-closed/write-closed states + socket-flags.test.ts # MSG_PEEK, MSG_DONTWAIT, MSG_NOSIGNAL, O_NONBLOCK ``` ### Test pattern: @@ -691,19 +845,23 @@ it('WasmVM server accepts Node.js client connection', async () => { ## Migration Order -1. **Socket table + loopback** (K-1, K-2, K-3) — core abstraction, everything depends on it -2. **Network permissions** (K-7) — must exist before exposing sockets to runtimes -3. **Node.js HTTP server migration** (N-2, N-3) — highest ROI, unlocks 492 tests -4. **Node.js net socket migration** (N-4) — needed for HTTP server -5. **UDP sockets** (K-4) — unlocks 76 dgram tests + WasmVM #17 -6. **Unix domain sockets** (K-5) — unlocks WasmVM #2 -7. **WasmVM syscall wiring** — expose socket table via RPC -8. **Signal handlers** (K-8) — independent, can parallel with above -9. **Timer/handle migration** (N-5, N-7, N-8) — lower priority, mainly cleanup -10. **VFS change notifications** (K-9) — independent, lower priority -11. **DNS cache** (N-10) — nice-to-have -12. **FD table unification** (N-1) — important but risky, do after networking stabilizes -13. **Crypto session cleanup** (N-12) — lowest priority +1. **Unified wait/wake system** (K-10) — foundation for all blocking I/O +2. **Inode layer** (K-11) — foundation for correct VFS semantics (deferred unlink, hard links) +3. **Socket table + loopback + shutdown** (K-1, K-2, K-3) — core networking, depends on K-10 for blocking +4. **Network permissions** (K-7) — must exist before exposing sockets to runtimes +5. **FD table unification** (N-1) — sockets need to share the FD number space with files/pipes +6. **Node.js net socket migration** (N-4) — migrate existing Node.js sockets to kernel +7. **Node.js HTTP server migration** (N-2, N-3) — highest ROI, unlocks 492 tests +8. **WasmVM socket migration** — route existing WasmVM sockets through kernel +9. **WasmVM server sockets** — add bind/listen/accept WASI extensions +10. **UDP sockets** (K-4) — unlocks 76 dgram tests + WasmVM #17 +11. **Unix domain sockets + socketpair** (K-5) — unlocks WasmVM #2 +12. **Signal handler registry** (K-8) — sigaction, SA_RESTART, sigprocmask, cooperative WASM delivery +13. **Socket flags** — MSG_PEEK, MSG_DONTWAIT, MSG_NOSIGNAL, expanded setsockopt +14. **Timer/handle migration** (N-5, N-7, N-8) — cleanup, kernel-enforced budgets +15. **VFS change notifications** (K-9) — fs.watch support +16. **DNS cache** (N-10) — shared across runtimes +17. **Crypto session cleanup** (N-12) — lowest priority ---