Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
195 commits
Select commit Hold shift + click to select a range
08a4de9
docs(compat): design runnable corpus sprint
Sunrisepeak Aug 2, 2026
0cfcd59
docs(compat): add W43 execution plan
Sunrisepeak Aug 2, 2026
7d137cc
research(compat): freeze W43 corpus baseline
Sunrisepeak Aug 2, 2026
45c1fe4
test(compat): freeze W43 Wave A worklists
Sunrisepeak Aug 2, 2026
71b2c2b
fix(node): honor buffer and zlib output limits
Sunrisepeak Aug 2, 2026
e7b8d99
fix(assert): expose Assert instances
Sunrisepeak Aug 2, 2026
c48839f
fix(permission): preserve native fs denials
Sunrisepeak Aug 2, 2026
09fd2b7
fix(node): enforce limits before materialization
Sunrisepeak Aug 2, 2026
0a102f6
fix(assert): narrow Assert compatibility surface
Sunrisepeak Aug 2, 2026
8b656ff
merge(compat): integrate W43 A1 zlib buffer lane
Sunrisepeak Aug 2, 2026
1a167dc
merge(compat): integrate W43 A2 assert partial lane
Sunrisepeak Aug 2, 2026
bacd246
test(node): select dialect for compatibility probes
Sunrisepeak Aug 2, 2026
1ce9f03
merge(test): integrate W43 A1 dialect gate fix
Sunrisepeak Aug 2, 2026
f0d7533
fix(permission): validate fs calls before denial
Sunrisepeak Aug 2, 2026
bef02c6
fix(permission): discard denial callback returns
Sunrisepeak Aug 2, 2026
c2c5802
merge(compat): integrate W43 A3 permission lane
Sunrisepeak Aug 2, 2026
41793d5
test(async-hooks): wait for real timer deadline
Sunrisepeak Aug 2, 2026
9a0d067
chore(async-hooks): record fix attribution
Sunrisepeak Aug 2, 2026
7e84e13
merge(test): stabilize W43 async hooks gate
Sunrisepeak Aug 2, 2026
6f93696
research(compat): record W43 Wave A batch one
Sunrisepeak Aug 2, 2026
d222075
fix(test): retain async rejection after done callback
Sunrisepeak Aug 2, 2026
444e495
fix(test): backpatch mocks through canonical cache keys
Sunrisepeak Aug 2, 2026
29e12e3
fix(napi): deliver deferred finalizer callbacks
Sunrisepeak Aug 2, 2026
d9fdc85
fix(napi): fail closed on finalizer dispatch
Sunrisepeak Aug 2, 2026
e9207a3
fix(napi): stop finalizer batch on fatal dispatch
Sunrisepeak Aug 2, 2026
dcff2bd
merge(compat): integrate W43 A4 Bun N-API lane
Sunrisepeak Aug 2, 2026
d62163c
merge(compat): integrate W43 A5 Bun test runner lane
Sunrisepeak Aug 2, 2026
78262d9
research(compat): record W43 Wave A result
Sunrisepeak Aug 2, 2026
0cbb4e1
test(compat): freeze W43 Wave B worklists
Sunrisepeak Aug 2, 2026
0350565
chore(plan): mark W43 Wave B lists frozen
Sunrisepeak Aug 2, 2026
eb4dd9f
fix(repl): tolerate unavailable legacy captures
Sunrisepeak Aug 2, 2026
bd0e29d
fix(fetch): route explicit HTTP2 requests
Sunrisepeak Aug 2, 2026
bff0b76
fix(fetch): frame empty payload requests
Sunrisepeak Aug 2, 2026
1af50d6
fix(fetch): enforce HTTP2 redirect and TLS policy
Sunrisepeak Aug 2, 2026
ff08854
fix(fetch): stream HTTP2 responses from headers
Sunrisepeak Aug 2, 2026
1bbdf40
fix(fetch): use one H1 request framing mode
Sunrisepeak Aug 2, 2026
3fd2766
fix(repl): harden legacy capture bookkeeping
Sunrisepeak Aug 2, 2026
6810721
fix(fs): upgrade FILE stdio to writable streams
Sunrisepeak Aug 2, 2026
e47c17d
fix(fetch): omit HTTP2 null response bodies
Sunrisepeak Aug 2, 2026
b119613
fix(fs): observe live fstat in FileHandle readFile
Sunrisepeak Aug 2, 2026
d056b05
fix(repl): close primordial regex paths
Sunrisepeak Aug 2, 2026
43d87b8
merge(compat): integrate W43 B1 REPL lane
Sunrisepeak Aug 2, 2026
a6e0b35
merge(compat): integrate W43 B3 HTTP lane
Sunrisepeak Aug 2, 2026
d8f0546
fix(run): resolve extensionless node-shim entries
Sunrisepeak Aug 2, 2026
699fa78
fix(run): honor explicit tsconfig overrides
Sunrisepeak Aug 2, 2026
5412a20
fix(fs): preserve FileHandle fstat failures
Sunrisepeak Aug 2, 2026
7b40c4a
merge(compat): integrate W43 B5 fs lane
Sunrisepeak Aug 2, 2026
2361ee5
fix(run): complete resolver context routing
Sunrisepeak Aug 2, 2026
860f964
fix(run): preserve tsconfig override runtime semantics
Sunrisepeak Aug 2, 2026
25eb5ed
merge(compat): integrate W43 B4 CLI lane
Sunrisepeak Aug 2, 2026
667d31e
fix(run): close B4 resolver review findings
Sunrisepeak Aug 2, 2026
69b8b15
merge(compat): integrate W43 B4 review closure
Sunrisepeak Aug 2, 2026
8b79c14
chore(integration): add W44 lane manifests
speak-agent Aug 2, 2026
ea63a19
feat(trace-events): emit real trace records for async_hooks, console,…
Sunrisepeak Aug 2, 2026
c0d2d39
feat(napi): implement the ArrayBuffer/TypedArray/DataView/Buffer, Big…
Sunrisepeak Aug 2, 2026
5940f16
fix(test-runner): report the inspector-disabled coverage warning and …
Sunrisepeak Aug 2, 2026
27c18c8
fix(repl): route async REPL errors through a capture callback, not a …
Sunrisepeak Aug 2, 2026
8c69474
fix(trace-events): keep fs entry-point own properties when wrapping
Sunrisepeak Aug 2, 2026
5c6422f
feat(jsc): port node's module compile cache (NODE_COMPILE_CACHE, enab…
Sunrisepeak Aug 2, 2026
f6e107d
fix(repl): define the REPL capture seam as a non-enumerable global
Sunrisepeak Aug 2, 2026
168426f
revert(trace-events): drop the fabricated environment, bootstrap and …
Sunrisepeak Aug 2, 2026
bc7eb6a
feat(trace-events): trace fs.realpathSync.native and fs.realpath.native
Sunrisepeak Aug 2, 2026
46c8e53
feat(trace-events): site node.environment milestones on real runtime …
Sunrisepeak Aug 2, 2026
b31c36a
fix(module): let require('internal/*') reach the vendored node lib fr…
Sunrisepeak Aug 2, 2026
f92fc0c
fix(jsc): only consult the permission model for the compile cache whe…
Sunrisepeak Aug 2, 2026
094b01f
fix(napi): report out-of-range bigint/typedarray requests the way nod…
Sunrisepeak Aug 2, 2026
419088d
fix(integration): repair a staged libstdc++.a that is not the pinned …
speak-agent Aug 2, 2026
0054a61
merge(compat): integrate W44 lane r-repl
speak-agent Aug 2, 2026
8373df3
merge(compat): integrate W44 lane n3-trace-events
speak-agent Aug 2, 2026
6b46a18
fix(jsc): trace the compile cache's enable failure the way node does
Sunrisepeak Aug 2, 2026
356afb8
fix(napi): screen bigint word_count before JSC reads the caller's buffer
Sunrisepeak Aug 2, 2026
8ab7184
fix(test-runner): use node's own MockTimers for t.mock.timers
Sunrisepeak Aug 2, 2026
5143a95
fix(jsc): key compile-cache saves so flushCompileCache() cannot dangl…
Sunrisepeak Aug 2, 2026
5f5c991
fix(napi): a .node with no registration entry point is node's Error, …
Sunrisepeak Aug 2, 2026
f2a948c
merge(compat): integrate W44 lane n1-compile-cache
speak-agent Aug 2, 2026
ceb3727
fix(test-runner): support the object form of expectFailure
Sunrisepeak Aug 2, 2026
fde3c06
fix(napi): napi_get_value_int64 yields 0 for every non-finite input, …
Sunrisepeak Aug 2, 2026
2e17acc
feat(napi): add node_api_create_property_key_utf8/latin1/utf16
Sunrisepeak Aug 2, 2026
83308b5
fix(test-runner): honour --test-force-exit in isolated child processes
Sunrisepeak Aug 2, 2026
f76e88d
fix(jsc): restore the NODE_DISABLE_COMPILE_CACHE trace and decide it …
Sunrisepeak Aug 2, 2026
b0de279
merge(compat): integrate W44 lane n1-compile-cache
speak-agent Aug 2, 2026
0ec993d
merge(compat): integrate W44 lane n2-test-runner
speak-agent Aug 2, 2026
5e93230
merge(compat): integrate W44 lane b1-bun-napi
speak-agent Aug 2, 2026
6ba7466
Revert "fix(module): let require('internal/*') reach the vendored nod…
Sunrisepeak Aug 2, 2026
5607b34
merge(compat): integrate W44 lane n2-test-runner resolver revert
speak-agent Aug 2, 2026
0c014cd
docs(resume): record W44's module-identity blocker and infrastructure…
speak-agent Aug 2, 2026
4b0f69b
chore(integration): record W44 lane measurements and re-evaluate stra…
speak-agent Aug 2, 2026
6e7f6ed
fix(jsc/test): locate the bun harness from __FILE__, not the working …
Sunrisepeak Aug 2, 2026
96fae63
chore(integration): add W45 lane manifests
speak-agent Aug 2, 2026
ee395c5
merge(compat): fix the http2 member test's cwd assumption
speak-agent Aug 2, 2026
9a51b1a
fix(resolver): honour node LOAD_AS_FILE for bare specifiers in node_m…
speak-agent Aug 2, 2026
2edf27c
feat(napi): implement the async-work, callback-scope and threadsafe-f…
Sunrisepeak Aug 2, 2026
1e71f68
fix(repl): give the REPL module node's null filename and MODULE_NOT_F…
speak-agent Aug 2, 2026
d156156
fix(napi): deliver napi_fatal_exception to 'uncaughtException' instea…
Sunrisepeak Aug 2, 2026
a3f079f
fix(repl): stop the uncaught-exception capture swallowing completion …
speak-agent Aug 2, 2026
69e4595
fix(timers): port node lib/timers/promises.js semantics
Sunrisepeak Aug 2, 2026
38707c0
fix(timers): schedule an overflowing delay at 1ms, as the warning pro…
Sunrisepeak Aug 2, 2026
3f5fac0
fix(console): keep the timer map on the public `_times` property
Sunrisepeak Aug 2, 2026
11399e3
fix(console): split a Map ENTRIES iterator into Key/Values in console…
Sunrisepeak Aug 2, 2026
ff2bd00
merge(compat): integrate W45 lane B resolver and REPL require fixes
speak-agent Aug 2, 2026
c5cfd85
fix(cli): evaluate -p/--print source as a script, not an expression
Sunrisepeak Aug 2, 2026
16218c2
merge(compat): integrate W45 lane D bun N-API async families
speak-agent Aug 2, 2026
640915b
merge(compat): integrate W45 lane A timers and console
speak-agent Aug 2, 2026
2777cde
feat(integration): fail before GCC does on an oversized constexpr JS …
speak-agent Aug 2, 2026
908c415
revert(repl): restore the completion-error masking, pending its gap f…
speak-agent Aug 2, 2026
d58174b
fix(repl): port the completion gaps node's completer covers and mbun'…
speak-agent Aug 2, 2026
6d40e8d
fix(repl): stop the uncaught-exception capture swallowing completion …
speak-agent Aug 2, 2026
e3aac52
fix(repl): stop require completion skipping the files it should offer
speak-agent Aug 2, 2026
466c128
Revert "fix(console): split a Map ENTRIES iterator into Key/Values in…
Sunrisepeak Aug 2, 2026
646942a
fix(jsc): skip the HTTP/2 harness sections when compat/bun is not che…
speak-agent Aug 2, 2026
5e7d8b1
merge(compat): integrate W45 lane B completion ports and masking removal
speak-agent Aug 2, 2026
dd9a4f4
merge(compat): integrate W45 lane A revert of the console.table split
speak-agent Aug 2, 2026
d93040b
fix(module): make internal/<x> name one implementation, then widen it…
Sunrisepeak Aug 2, 2026
9854782
merge(compat): integrate W45 lane M0 module identity
speak-agent Aug 2, 2026
ed2af76
fix(events): answer node's kEvents from mbun's own listener state
Sunrisepeak Aug 2, 2026
4eea070
merge(compat): integrate W45 lane M0 kEvents projection
speak-agent Aug 2, 2026
44a0fd2
docs(resume): the module-identity block is gone; record the next bott…
speak-agent Aug 2, 2026
30716f0
chore(integration): add W46 lane manifests
speak-agent Aug 2, 2026
f3bb5a4
fix(worker): reject execArgv/NODE_OPTIONS a thread cannot carry
Sunrisepeak Aug 2, 2026
cf59ecd
fix(worker): give worker stdio message boundaries, not a pipe's
Sunrisepeak Aug 2, 2026
c721d29
fix(worker): report node's stack-exhaustion wording across the boundary
Sunrisepeak Aug 2, 2026
c834cda
fix(http2): session.destroy(code) is an NGHTTP2 code, not an error ob…
Sunrisepeak Aug 2, 2026
93c3986
feat(node): implement internalBinding('modules')
Sunrisepeak Aug 2, 2026
e5acda0
fix(test-runner): a filtered-out test must be invisible, not just unr…
Sunrisepeak Aug 2, 2026
4624e75
feat(crypto): argon2 / argon2Sync over OpenSSL's ARGON2 KDF
speak-agent Aug 2, 2026
756cd5c
fix(integration): seed a new worktree's package cache, and stop delet…
speak-agent Aug 2, 2026
7e95769
merge(compat): integrate W46 lane p0-test-runner
speak-agent Aug 2, 2026
1699e66
merge(compat): integrate W46 lane p1-crypto
speak-agent Aug 2, 2026
ea018cf
merge(compat): integrate W46 lane p2-http2
speak-agent Aug 2, 2026
64b70ec
fix(shell): expand a leading `~` whose tilde-prefix is empty
speak-agent Aug 2, 2026
cdb9a59
fix(console): Bun.inspect.table right-aligns column 0, left-aligns th…
speak-agent Aug 2, 2026
ec35308
fix(s3): reject an endpoint-supplied multipart UploadId with control …
speak-agent Aug 2, 2026
156bded
docs(resume): correct the port-shaped sizing premise with W46's measu…
speak-agent Aug 2, 2026
4ded055
chore(integration): add W46 P4 manifest for the ContextifyScript gate
speak-agent Aug 2, 2026
1972ca3
feat(crypto): ML-DSA / ML-KEM / SLH-DSA keys — the provider was never…
speak-agent Aug 2, 2026
ff923b2
fix(worker,console): keep the per-write boundary all the way to the p…
Sunrisepeak Aug 2, 2026
1c3f1a7
fix(crypto): each PQC family admits exactly one private raw form
speak-agent Aug 2, 2026
2a4ae18
fix(worker): NODE_OPTIONS is a different table from execArgv
Sunrisepeak Aug 2, 2026
fad1108
merge(compat): integrate W46 lane p1-crypto PQC families
speak-agent Aug 2, 2026
2e1b117
fix(shell): do not lower a tilde against a pre-mutation environment
speak-agent Aug 2, 2026
075d67e
fix(net): listen(host) with a non-wildcard IPv6 literal must bind AF_…
speak-agent Aug 2, 2026
cdd1308
merge(compat): integrate W46 lane p3-worker
speak-agent Aug 2, 2026
9fe3845
docs(vm): record that options.timeout is engine-blocked, not unimplem…
Sunrisepeak Aug 2, 2026
e0a9a3a
docs(resume): record the worker thread-vs-process ceiling with the fi…
speak-agent Aug 2, 2026
42e99fa
merge(compat): integrate W46 lane b-bun-near
speak-agent Aug 2, 2026
1ffbbd9
merge(compat): integrate W46 lane p4-vm engine finding
speak-agent Aug 2, 2026
e6b06a4
docs(resume): pin the checkpoint format -- running total and ETA ever…
speak-agent Aug 2, 2026
0f9e55f
fix(worker): `--` ends the options in execArgv, it is not a flag
Sunrisepeak Aug 2, 2026
162c8b1
merge(compat): integrate W46 lane p3-worker execArgv separator fix
speak-agent Aug 2, 2026
9f5b22a
chore(integration): add W47 lane manifests, weighted toward bun
speak-agent Aug 2, 2026
dc0cc4d
chore(integration): record W46 measurements -- goal accuracy 0.40
speak-agent Aug 2, 2026
7b2b368
fix(async_hooks): port node's fatalError so a throwing hook prints no…
Sunrisepeak Aug 2, 2026
8de3520
fix(async_hooks): internalBinding('async_wrap') must be the payload's…
Sunrisepeak Aug 2, 2026
024e6ad
fix(net): dial IPv6 for real, so a ::1 bind stops colliding with 127.…
speak-agent Aug 2, 2026
ac7c33b
fix(test-runner): frame each file block with a leading blank line on …
Sunrisepeak Aug 2, 2026
52dff50
fix(bun:test): .failing semantics, jest.setTimeout, and the CI snapsh…
Sunrisepeak Aug 2, 2026
959f3c5
fix(tty): initialise the net.Socket base in tty.ReadStream/WriteStream
Sunrisepeak Aug 2, 2026
8a3de48
fix(util): styleText only gates on a stream the caller names
Sunrisepeak Aug 2, 2026
d1d4ca6
fix(process): execve rejects a NUL in execPath and throws node's Errn…
Sunrisepeak Aug 2, 2026
b7f1a1d
fix(bun:test): restart the toMatchSnapshot() counter on each retry/re…
Sunrisepeak Aug 2, 2026
6314ca9
chore(integration): recognise bun's stale-`.failing` wording in the c…
Sunrisepeak Aug 2, 2026
047b533
merge(compat): integrate W47 lane n1-async
speak-agent Aug 2, 2026
790c1f6
merge(compat): integrate W47 lane b1-bun-jsbun
speak-agent Aug 2, 2026
621cd30
merge(compat): integrate W47 lane b2-bun-jsnode
speak-agent Aug 2, 2026
8d9ac28
fix(net): a blocked address ends Happy Eyeballs, it is not a failed a…
speak-agent Aug 2, 2026
04556d7
chore(integration): add W48 feature-block manifests (inspector 132, q…
speak-agent Aug 2, 2026
6c55aac
merge(compat): integrate W47 lane n2-http-net IPv6 connect and Happy …
speak-agent Aug 2, 2026
28ab4da
fix(tls): defer an undecodable server key/cert to listen, as bun does
Sunrisepeak Aug 2, 2026
d71c0f4
fix(serve,fetch): report the real peer from requestIP, key the keepal…
Sunrisepeak Aug 2, 2026
c3cf99a
merge(compat): integrate W47 lane b3-bun-regression
speak-agent Aug 2, 2026
3ab3c35
chore(integration): W48 manifests -- untouched dense areas, struck fi…
speak-agent Aug 2, 2026
c90d0f9
docs(resume): manifest entries need ran>0 and failed>0, not just non-…
speak-agent Aug 2, 2026
0ef87f6
fix(js/parser): async function declarations end the statement
speak-agent Aug 2, 2026
9b3e87d
fix(module): honour node's schemeless block list in the builtin lookup
speak-agent Aug 2, 2026
feda424
fix(process): define the externalize-string globals only under the flag
speak-agent Aug 2, 2026
de9678d
fix(timers): stop the runaway guard from being a lifetime timer quota
Sunrisepeak Aug 2, 2026
deedd81
feat(fetch): implement fetch.preconnect and --fetch-preconnect
Sunrisepeak Aug 2, 2026
a89a7ef
fix(cli): run node's stdin main script and let -p compose with -e
Sunrisepeak Aug 2, 2026
a06f4e5
fix(cli): refuse mode-selecting options in NODE_OPTIONS
Sunrisepeak Aug 2, 2026
a7c35ba
fix(runtime): print node's --check error frame
Sunrisepeak Aug 2, 2026
7d306e8
fix(worker): refuse util.setTraceSigInt off the main thread
Sunrisepeak Aug 2, 2026
4087603
feat(trace_events): node.net connect and node.http request spans
Sunrisepeak Aug 2, 2026
f65d01d
fix(trace-exit): tag the exit warning with the worker thread
Sunrisepeak Aug 2, 2026
359b896
merge(compat): integrate W48 lane c5-node-repl-runner
speak-agent Aug 2, 2026
a1d4417
merge(compat): integrate W48 lane c2-bun-jsweb timer quota and fetch.…
speak-agent Aug 2, 2026
136e1c4
fix(require): survive a CJS module shadowing its own `require` binding
Sunrisepeak Aug 2, 2026
ce8a823
fix(install): warn instead of swallowing an optional dependency's fai…
Sunrisepeak Aug 2, 2026
bf5f658
fix(add): announce the saved lockfile, the resolved version and the e…
Sunrisepeak Aug 2, 2026
92fd494
merge(compat): integrate W48 lane c1-bun-cli-install
speak-agent Aug 2, 2026
b7efd62
merge(compat): integrate W48 lane c3-bun-thirdparty
speak-agent Aug 2, 2026
4678b82
docs(resume): record two coordinator failures -- unread struck.tsv, s…
speak-agent Aug 2, 2026
592f99e
merge(compat): integrate W48 lane c4-node-trace-cli
speak-agent Aug 2, 2026
b718991
chore(integration): record W48 measurements -- goal accuracy 0.30
speak-agent Aug 2, 2026
d3a1053
fix(build): drop the empty js_engine.cppm that breaks the LLVM lane
speak-agent Aug 3, 2026
d3c742a
docs(readme): refresh compatibility data from a fresh full measurement
speak-agent Aug 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
422 changes: 422 additions & 0 deletions .agents/docs/20260802-corpus-coverage-w43-design.md

Large diffs are not rendered by default.

772 changes: 772 additions & 0 deletions .agents/docs/20260802-corpus-coverage-w43-plan.md

Large diffs are not rendered by default.

372 changes: 372 additions & 0 deletions .agents/docs/20260802-corpus-coverage-w43.md

Large diffs are not rendered by default.

44 changes: 38 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# mbun | [Rewrite Bun in MC++](https://github.com/Sunrisepeak/mbun/pull/1) - Linux coverage: Node 3,136/4,433 (70.7%), Bun 1,042/1,902 (54.8%)
# mbun | [Rewrite Bun in MC++](https://github.com/Sunrisepeak/mbun/pull/1)

[中文文档](README.zh-CN.md)

Expand Down Expand Up @@ -116,13 +116,45 @@ still being defined.

## Compatibility data

Measured 2026-08-03 by the runners in `tools/integration/`, both corpora executed
in full on **one frozen binary** (`f65f960b7ac7d212…`). Nothing unsupported is
counted as a pass.

| Target | Result | Rate |
| --- | ---: | ---: |
| Node.js native tests (`compat/node/test/parallel`) | 3,136 / 4,433 files pass | 70.7% |
| Node.js native tests, excluding files that skip themselves | 3,136 / 3,898 files pass | 80.5% |
| Bun native full corpus (`compat/bun/test`) | 1,042 / 1,902 files fully green | 54.8% |
| Both corpora combined | 4,178 / 6,335 files | 66.0% |
| Elysia test suite | 1,522 pass / 3 fail | 99.8% |
| Node.js native tests (`compat/node/test/parallel`) | 3,267 / 4,433 files pass | 73.7% |
| Node.js native tests, excluding files that skip themselves | 3,267 / 3,919 files pass | 83.4% |
| Bun native full corpus (`compat/bun/test`) | 1,076 / 1,902 files fully green | 56.6% |
| Bun corpus, excluding files with no runnable tests here | 1,076 / 1,806 files fully green | 59.6% |
| Both corpora combined | 4,343 / 6,335 files | 68.6% |
| Both corpora combined, runnable only | 4,343 / 5,725 files | 75.9% |
| Elysia test suite (measured 2026-07-30, not re-run since) | 1,522 pass / 3 fail | 99.8% |

The "excluding" rows are not a softer denominator: a file counts as excluded only
when it reports no runnable tests on this platform — it skipped itself, it has no
tests upstream, or it needs a service this machine does not provide. Those
denominators **grew** this round (Node 3,898 → 3,919) because 21 files that used
to skip themselves now run.

**What stands between here and 100%, counted rather than estimated.** 514 Node
files decline to run, and the reasons are not interchangeable:

| Self-skip reason | Files | Nature |
| --- | ---: | --- |
| QUIC not enabled | 238 | no `node:quic` subsystem; node's own build disables it by default too |
| V8 inspector disabled | 180 | needs a CDP backend; JSC speaks the WebInspector protocol instead |
| missing ESLint | 29 | node's own lint tests; ESLint is not vendored here |
| no OpenSSL CLI | 10 | crypto build configuration |
| requires Amaro | 6 | TypeScript loader |
| Windows-specific | 6 | unreachable on Linux by construction |
| other (Temporal, debug-only builds, cipher availability) | 45 | assorted |

The two large blocks are priced. QUIC needs no protocol work — node builds it on
vendored ngtcp2, and the linked OpenSSL 3.5.1 already exports everything that
backend calls — but it does need node's ~19k-line binding re-expressed against
JSC. The inspector block has **no per-file gate**: all of it hangs on one global
capability flag, so no partial slice can score, and flipping it early converts
skips into failures.

## Related projects

Expand Down
35 changes: 22 additions & 13 deletions README.zh-CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,30 +109,39 @@ skill,已经知道本仓规范。选一个适合你的层级,开 PR 前务必 re

## 兼容性数据

以下是源码快照针对 `compat/` 下 submodule 固定的上游测试集的测量结果,由 `tools/integration/` 中的 runner 产出。未支持项不会被伪造成通过,数据也不是 release 保证。两个语料集最近一次全量测量均在 2026-07-30,各自在同一个冻结二进制上对全部文件跑一遍
以下是源码快照针对 `compat/` 下 submodule 固定的上游测试集的测量结果,由 `tools/integration/` 中的 runner 产出。未支持项不会被伪造成通过,数据也不是 release 保证。两个语料集最近一次全量测量均在 **2026-08-03**,在**同一个冻结二进制**(`f65f960b7ac7d212…`)上各自对全部文件跑一遍

| 测试对象 | 结果 | 通过率 |
| --- | ---: | ---: |
| Node.js 原生测试(`compat/node/test/parallel`) | 4,433 个文件中 3,065 个通过(直接执行) | 69.1% |
| Node.js 原生测试,剔除自我 skip 的文件 | 3,880 个文件中 3,065 个通过 | 79.0% |
| Bun 原生测试集(`compat/bun/test`) | 1,902 个文件中 934 个全绿 | 49.1% |
| 两个语料集合计 | 6,335 个文件中 3,999 个 | 63.1% |
| Elysia 测试套件 | 1,522 通过 / 3 失败 | 99.8% |
| Node.js 原生测试(`compat/node/test/parallel`) | 4,433 个文件中 3,267 个通过(直接执行) | 73.7% |
| Node.js 原生测试,剔除自我 skip 的文件 | 3,919 个文件中 3,267 个通过 | 83.4% |
| Bun 原生测试集(`compat/bun/test`) | 1,902 个文件中 1,076 个全绿 | 56.6% |
| Bun 测试集,剔除本机无可运行测试的文件 | 1,806 个文件中 1,076 个全绿 | 59.6% |
| 两个语料集合计 | 6,335 个文件中 4,343 个 | 68.6% |
| 两个语料集合计,仅可运行部分 | 5,725 个文件中 4,343 个 | 75.9% |
| Elysia 测试套件(2026-07-30 测量,此后未重跑) | 1,522 通过 / 3 失败 | 99.8% |

**距离 100% 还差什么,是数出来的而不是估的。** Node 侧有 553 个文件自己选择跳过,原因彼此不可互换:
"剔除"两行不是更宽松的分母:只有当一个文件在本平台报告不出可运行测试时才被剔除——它自己 skip 了、上游本就没有测试、或者它需要本机不具备的服务。而且这两个分母这一轮是**变大的**(Node 3,898 → 3,919),因为有 21 个此前自我 skip 的文件现在真的跑起来了。

**距离 100% 还差什么,是数出来的而不是估的。** Node 侧有 514 个文件自己选择跳过(上一轮是 553),原因彼此不可互换。下表由本次全量 run 的日志直接分组产出,不是沿用旧表:

| 自我 skip 的原因 | 文件数 | 性质 |
| --- | ---: | --- |
| QUIC 未启用 | 236 | mbun 没有这个子系统(Node 自身默认也不开) |
| V8 inspector 未启用 | 178 | `node:inspector` 存在且能应答,但 `Session.post()` 返回 `{}`,只有形状没有实现 |
| ESLint 测试需要 crypto 和 Intl | 25 | 需要 ESLint 本身,本仓库未 vendor |
| OpenSSL 版本 / `openssl` CLI | 19 | crypto 构建配置 |
| QUIC 未启用 | 238 | mbun 没有这个子系统(Node 自身默认也不开) |
| V8 inspector 未启用 | 180 | 需要 CDP 后端;JSC 说的是 WebInspector 协议,两者语义不同 |
| 缺少 ESLint | 29 | node 自己的 lint 测试,本仓库未 vendor ESLint |
| OpenSSL CLI | 10 | crypto 构建配置 |
| 需要 Amaro | 6 | TypeScript loader |
| Windows 专属 | ~8 | 在 Linux 上根本不可达 |
| Windows 专属 | 6 | 在 Linux 上根本不可达 |
| 其他(Temporal、仅 debug 构建、cipher 可用性等) | 45 | 零散 |

两个大块都已定价。**QUIC 不需要写协议**:node 是在 vendored 的 ngtcp2 上实现的,而链接进来的 OpenSSL 3.5.1 已经导出了那个后端调用的全部函数——缺的是把 node 约 1.9 万行的绑定层按 JSC 重写。**inspector 那一块没有逐文件的门**:全部 180 个挂在同一个全局能力标志上,所以任何部分切片都拿不到分,而提前翻开标志位只会把 skip 变成 fail。

这份清单里另有两块原本被归为"缺能力"的,实测是**检测缺口而不是缺能力**,现已关闭:`node:sqlite` 未注册,而 `bun:sqlite` 背后是一份可用的 SQLite 实现;`process.config.variables.v8_enable_i18n_support` 未设置,而引擎本身带完整 ICU。这个区别只能靠**探测模块**得知 —— 模块存在什么都不证明,inspector 就是反例。

所以诚实的说法是:**靠长尾测试工作每个语料集大约能到 82%**,剩下的需要整个子系统(QUIC、inspector 协议)或者在本平台上根本关闭;可达部分还剩约 1,150 个 actionable 失败。
所以诚实的说法是:**靠长尾测试工作,两个语料集合计大约能到 96–98% 的可运行覆盖**(Node 侧现已到 83.4%),剩下的需要整个子系统(QUIC、inspector 协议)或者在本平台上根本关闭。可达部分还剩约 **1,378 个 actionable 失败**(Node 652 = fail 565 + timeout 85 + OOM 2;Bun 726 = test-failure 666 + timeout 45 + crash 4 + OOM 7 + load-error 4)。

近几轮的实测速率是每轮 12–20 个文件、约 2–3 文件/lane-小时,且在下降——密集的单一根因簇已经被消耗完,尾部是一个文件一个原因。按这个速率,可达部分还需要几十轮;真正决定终局的不是再开多少并行 lane,而是上面那几个子系统级决策做不做。

文件级"全绿"要求文件内所有执行的测试全部通过、且文件未报告测试之外的错误,比 API 清单严格,因此低于测试级通过率。上游本就没有可运行测试的文件、全部被 skip 的文件、以及需要本机不具备的服务(MySQL、Redis、npm registry)的文件各自单独归类,一律不算通过。Node.js 文件通过 mbun 直接执行(退出码 0 记为通过),不模拟 Node 自身 harness 提供的服务,所以该数据是诚实的文件级覆盖,不等同 API 完成度。崩溃被修复后测试级通过率会下降——此前段错误或被 OOM 杀掉的文件现在能跑完并报出真实失败。细节与复现方法见 [`compat/README.md`](compat/README.md)。

Expand Down
Loading
Loading