ReviewOS

home-lang/home

Bun parity: remaining open items to reach 100% test-suite pass

#66
Open chris opened this 14 days ago · 1753 comments
14 days ago

Native Bake full-suite checkpoint: source ccecdcf9b and 1,185 Git-verified evidence artifacts. All 24 unchanged Bake files pass 177 cases with zero failures/zero skips and two original TODOs; native output, exact identities and source inventory validate. Genuine frozen Home locks replace the empty React marker. The suite budget preserves per-test deadlines; spawned fixture cwd and production source-map retrieval are repaired. Canonical graph identities fix changed-dependency path aliases. Coordinator controls retain 29 complete journals; development/HMR/production pass. The fresh 157-file regression has 396 passing cases, 142 process checks, zero failures, 37 case skips and three file skips. Build, validators, ABI, lint and corpus integrity pass. The initial 175-pass/two-failure run remains retained. #902 is complete for this tranche; #901 keeps optimized native/platform gates and #564 keeps Linux TODO coverage. TODOs/skips receive zero pass credit. The full Bun feature/suite/all-platform objective remains open.

Tracking issue for the remaining work to reach 100% parity with Bun's official test suite (~/Code/bun; current native artifact source SHA 4982b91e3702094330f3be3883354c52b8c01323, original historical pin fd0b6f1a27), runnable here via home test. Each item has the root cause traced during investigation. We tackle them top-to-bottom; check off as landed (small fix:/feat: commits, pushed).

Current main checkpoint (2026-10-13)

Native console methods, buffered replay and cleared-realm lifetime (2026-10-13) landed in source 56df99d7f, merged integration be4364972, and verified evidence de6aea239. Canonical SDK records provide count/reset, typed timeLog/timeEnd and per-session buffered replay with actual stacks/timestamps. Owner attachment differs from VM console state; Runtime.disable suppresses notifications while preserving connected state. groupEnd/clear arguments match the native contract. Clearing the buffer and remote group now retires idle realm injected-script roots; actual still-bound handles, pending calls and paused debugger state prevent retirement. Unrelated object handles and an in-flight async call remain usable. Last frontend detach retires injected-script state, and the non-owning console registry retires across finalization threads. Both source and merged builds pass 56/56 steps; fresh merged validation passes all nine focused commands, six broad drivers, 33 native groups, seven Node/seven Home realm controls, 14 ABI tests/453 assertions and 32 report-validator tests. All 64 report outcomes match expected counts/errors/exits, including twelve negatives. Twenty unchanged originals retain 53 passed cases, one unchanged unsupported-method expectation failure and 17 passed process checks, with zero skips/TODO/filter/retries; #886 receives no pass credit. Failed Node oracle assumptions, the Home post-clear lifetime failure and resource stops remain immutable; temporary tracing is removed. Full schema, independent remote-object/session ownership, evaluated-realm retirement outside explicit console clearing, module/export/callback/owner-shutdown acceptance and full suite/platform validation remain open under #888/#428/#885/#66.

Native profiler sharing at 5cd57e8ea with verified evidence: CLI and inspector owners consume actual JSC samples through detached native records, preserving CLI JSON/Markdown history and independent repeated session windows. Shortest active owner interval is selected; session stop/disconnect preserves CLI profiling and active-session process exit exports successfully. Debug 56/56, all 28 native groups, 14 ABI controls/453 assertions and 32 report-validator controls pass. Twenty unchanged originals retain 53 passed cases, one failed unsupported Runtime.evaluate expectation and 17 process checks; no skips/TODO/filter/retries and no #886 pass credit. Evidence preserves the first inlined-workload assertion failure and 64 replayed report outcomes including 12 negatives; earlier eight resource stops remain in investigation evidence. Full Bun parity, complete realms, worker-to-main inspector attachment, coverage, precise cadence measurement, all ownership schedules, Release/ASAN/all-platform remain open under #428/#66.

Historical publication checkpoint (2026-09-20)

Native phase/context work landed in 64481fe09 with evidence publication b83c54f4d. Vendor checkout and install/build became separately verified phases, with revision checks before hooks and live remap/Docker settings carried into children. The build passed 23/23 steps and 21/21 harness tests, plus launcher, service/lifetime and validator controls. Fresh pinned Elysia setup matched all 283 expected source hashes; all 129 selected original files completed once with 1,516 registered passes, zero failures/skips/TODOs, retaining the one original WebSocket exclusion. This checkpoint did not claim complete primary execution, Linux Docker verification, or full parity. Boundary and API · Evidence

Previous publication / remaining work (2026-09-08)

Full logical Bun parity remains incomplete. Published to origin/main: native service/preparation source a2e2863fc, verified evidence c9fc9bf63. Home SHA256 91d6b1024f9d4c02c6b7f9089b476d8a0646294f4ed7392e5e3ce549e52db763.

Native service lifetime and explicit vendor preparation are implemented. home test --bun-corpus-remap launches the original installed remap service with its original arguments and 5,000 ms startup deadline, drains output throughout its lifetime, and owns shutdown until parent stdin closes or the service exits unexpectedly. home test --bun-corpus-prepare-vendor elysia selects and journals clone/fetch/checkout/revision/install/build, retains separate Git/Home executable identities, and preserves the original 180-second Git/install and 60-second build deadlines. A failed install leaves build visibly unstarted. These operations earn zero registered-case or passing-process credit.

23/23 native build steps and 21/21 harness tests pass, along with four service lifetime units, four journal units, 18 validator controls and five private CLI controls. The private CLI evidence retains invalid readiness, the five-second deadline after output EOF, unexpected service exit with parent stdin open, install failure and build failure. The real pinned remap service passes five HTTP protocol checks through the native command, with complete captures and unchanged dependency hashes. Fresh native Elysia preparation completes all seven steps in 49.8 seconds; its 283 resulting source hashes match the earlier independently verified setup/lockfile normalization. Formatting, targeted Pickier and 50 pinned setup-input checks pass.

The latest complete Elysia run is not green: all 129 selected files complete once with 1,515 registered passes, one failure, zero skips/TODOs. handle distinct union in test/validator/response.test.ts calls .listen(3000); the unrelated PredictHQ development server (PID 28404 at diagnosis) owns that port. Pinned Bun fails the same unchanged case in a separate one-file diagnostic (27 passes, one failure). The listener and original tests were not changed, and no retry or alternate port was used to obtain a pass. Both full-run source integrity and the original selection match. The original WebSocket exclusion remains separate. The first diagnostic verifier expected the same error literal; a separate retained-capture analysis confirms the conflict without rerunning either runtime. A private error-object comparison additionally found message/errno/address/port differences, now tracked in #726; Home's existing preservation of real OS failures must be retained while auditing compatibility.

572 committed compressed artifacts have verified decompressed hashes. Restored journals reproduce successful service/preparation, failed private controls, the failed complete Elysia run and failed pinned-Bun diagnostic separately. The first build was stopped below the unchanged 1 GB critical disk floor after macOS allocated more swap; verification did not run. A cleanup preflight and refused admission are retained too. Corrected cleanup preserved protected binaries and linked native inputs; the completed rebuild required 5 GB free to start. Removed 6,083,408,581 logical bytes of generated caches/dependencies, old vendor data and unused build outputs. Source and other active work are preserved.

Still open: connect these operations with the original CI ordering and selection gates, Docker coordination, live service settings and default unified coordinator (#724); free the original fixed-port prerequisite before claiming a successful new Elysia run; resolve the missing optional legacy DuckDB and earlier lifecycle failures (#725); audit bind-error compatibility (#726); execute the whole applicable primary/vendor suite and finish remaining runtime features, native Linux/Windows/ASAN verification and independent native ownership. Earlier root/test setup process success and the separate 18-case N-API DuckDB run remain evidence on their recorded earlier binary; they are not new execution on this one.

API and scope · Native service/preparation evidence · Earlier native setup evidence

Earlier prepared Elysia execution checkpoint

Published to origin/main: implementation 9d6815afa, evidence 176f685f7. Home SHA256 19e41223c7fc2d2dcda763470fcc84570900db08b4d547340bdae5286d42bc98.

Complete pinned-selected Elysia execution: 129/129 files completed, 1,516 registered cases passed, zero failed, zero registered skips, zero TODOs. The run used no positional filter or start/limit and one attempt with original per-file deadlines. The selection matches pinned Bun exactly, including the separately recorded original ws/connection.test.ts exclusion; that excluded file earns no passing or skipped-case credit. All 129 captures reached EOF. Raw output and JUnit hashes, registered cases, selection completeness, all 283 post-install vendor source hashes and the Home executable hash validate.

The production home test --bun-corpus-prepared-vendor elysia command verifies Git HEAD against the manifest tag and executes each selected vendor file in its own project's cwd with ordinary config discovery, forced vendor test mode, correct validation paths and serial environment. Ordinary failures remain recorded and later files continue. This command explicitly requires prior checkout/install/build and journals setup_performed: false. The preceding Home 716f39bd… build performed the independently verified native install/build; the new 19e41223… build executed the suite. This is not a fresh end-to-end CI setup claim.

23/23 build steps, 17/17 native harness tests and 11/11 validator controls pass. Private controls exercise project config, custom test paths/extensions, serial environment and a real assertion failure followed by a successful file. Targeted Pickier and whitespace checks pass. 409 committed compressed artifacts have verified decompressed hashes; restoring the archived reports reproduces all 129 complete outcomes and 1,516 passing cases. Cleanup removed another 371,467,160 bytes of obsolete owned generated objects, preserving source work.

API and verification boundary · Complete execution evidence

Earlier outcome and lifetime batch at 61670c72b (#722/#723): 23/23 build steps and 12/12 native corpus harness tests pass, plus 2 child-ownership units, 3 journal units, 9 validator units and targeted Pickier. The original per-file deadline now covers a child that stays alive after both output pipes reach EOF. Actual libc close through Home FFI reproduced the pre-fix 30-second supervisor failure; the corrected native runner times out at the unchanged 20-second Node deadline and preserves early successful exit. Child status remains unreaped until final cleanup. The wait helper also cross-compiles for x86_64 Linux/musl and Windows/GNU; native Linux/Windows execution remains unverified, so #723 stays open for that work. Schema 2 records verified stream completeness; legacy schema 1 remains readable with completeness marked unknown.

That earlier six-file original batch validates with 402 passing cases, 1 original platform skip, 10 TODOs, one successful Node script, one verified expected-failure process check and one comment-only file. All six captures reached EOF. The original negative fixture retains its one-failure JUnit case and contributes no passing test credit. Every selected original source/snapshot hash and the executable identity remain unchanged. Private controls verify mixed outcomes, invalid negative contracts, overwrite refusal, both open-pipe and actual closed-pipe timeouts, SIGTERM, interruption, and failed writes. Original failures and first unsuccessful controls remain retained. Final evidence; baseline and remaining scope.

#724 remains the full-suite prerequisite: selection/API and Elysia setup are now verified as described above; native host discovery, complete root/test installation and registry/service setup, vendor execution, and complete applicable-suite outcomes remain unfinished. The pre-exclusion discovery inventory alone is not the complete CI suite. Excluded, skipped, TODO, unstarted and unsupported files never count as passing implementation coverage.

Previous native launch batch (#703): 23/23 native/harness build steps and 9/9 harness tests pass. Five focused units pass. All 19,016 launch-rule selections match pinned Bun over 4,754 discovered files and four CI/local/ASAN contexts; these are rule comparisons, not passing corpus files. Production capture now applies original ordinary/integration/Node/script deadlines, CI GC/integrity/transpiler-cache settings, validation-list rules, fresh per-file storage and real Home command aliases. Real cache/child/cleanup regressions verify the corrected allocation ownership and initially empty install cache. Launch baseline, 64 final artifacts.

Prior grouped launch verification: seven native private regression files pass. Unique selected original cases are Home 71 pass / 1 fail; pinned Bun 72 pass: HTML 45, link/binlink 11, audit 16. Two additional original Node files complete real process checks, and one original comment-only file contributes no passing cases. All selected original sources and snapshots remain unchanged. The generated fresh-cache control passes in both runtimes. The first build's three allocator crashes and Home-only cache-control failure are retained, with their fixes independently verified.

#721 retains the one failing original audit snapshot assertion. Audit remains Home 15/16 versus pinned Bun 16/16. The only differing line expects express › connect › csurf › csrf › uid-safe › base64-url. Its pinned fixture resolves that UID package to csrf/uid-safe@2.1.4, which depends on random-bytes and has no base64-url edge. Home reports the actual express › connect › express-session › uid-safe@2.0.0 › base64-url@1.2.1 path. No nonexistent edge or passing assertion was fabricated. #720/#721 remain open; native protocol/authentication, exact production reachability, affected-version/workspace paths, cycles and lock preservation are covered by the passing native audit regression.

#722 retains the remaining full-inventory execution and outcome-verification requirement, following the verified storage/JUnit/skip/TODO implementation above. The inventory contains 4,754 pre-exclusion entries (1,863 test-runner entries and 2,891 scripts); a completed full-suite execution is still missing. Synthetic corpus rewriting/bootstrap fallback is removed. Full integration/vendor/service setup, native ASAN and other platforms, default CLI fallback removal, and independent native build ownership remain open under #703/#709/#202.

Previous patch checkpoint a4b73596f passed 58 original cases per runtime (link 4, native-binlink 7, patch 29, install-patch 18), six private files, and build 46/46; evidence. #719 is complete for native patch activation and tested lifecycles. The original patch aggregate was not rerun for this launch batch; all six older private files plus audit were. #718 bin ownership is fixed on macOS, with native Windows filesystem verification still open. #717 remains complete for the tested native link lifecycle.

Previous package milestones #713/#714/#715/#716 remain verified and closed: local dependency identity/deduplication, long-prerelease frozen lock equality, native update/outdated and cache-freshness regression. The preceding selected original update/outdated/interactive/semver batch passes 78 cases per runtime, excluding filtered-out cases. Create entrypoints and required native parser restoration are verified. #190 self-upgrade and #710 fixture validity are now closed; #438 JSX failures and #701/#694 unexplained deadline failures remain open.

Current compressed build/test artifacts are committed under docs/docs/bun-port-evidence/. Generated fixtures and aged compiler cache data were cleaned after preserving evidence; source changes and installed binaries were retained. Earlier raw logs lost when the previous worktree disappeared are not claimed retained; their committed summaries/hashes remain historical evidence.

Earlier checkpoints

Earlier verified checkpoint: 1cbac2921, with implementation e1a5d0e20 and scanner correction 6448d628a, all pushed to origin/main. #702 is complete for native HTML activation and removal of fabricated FormData child output/RSS. 100% logical Bun parity remains incomplete.

  • Ordinary and single-native-VM HTML directory routes each pass 145 tests / one original Linux-only skip / zero failures. The native aggregate's 530 assertions match pinned Bun. Home's real 100-iteration file-error child measures 1.78 MB growth, within the unchanged 10 MB limit. Build 46/46; focused harness 23/23 steps / 3/3 tests, with independent registration metadata.
  • Adjacent routes pass: Blob 65/65, body/stream 9,467 passes / four upstream skips, Headers/Response 170/170, Request 24/24, bootstrap FormData 5/5, microtasks 2/2. #701 remains unexplained and open; a passing run is not a repair. #694 remains open.
  • #703 is the next broad migration. Exact routing predicates show 175 native test-runner paths, 266 native scripts and 4,267 bootstrap paths among Home's 4,708 classifications. Exact pinned CI discovery selects 4,754 tracked paths before exclusions, exposing 78 missing and 32 extra Home entries, plus mode/config differences. These are inventory counts, not suite passes. The audit command and full path sets are now published in the repository.
  • The native triage scanner no longer extends original test deadlines or retries timeout-only failures as slow. Its negative control retains one attempt and a failure. It remains a triage tool, not the complete acceptance gate; discovery and full outcome preservation remain in #703.
  • Pinned-object integrity remains 12,990 identical regular files, five raw-identical symlinks, zero missing paths and zero mode differences, with only historical expectations metadata different. Remaining substitutes, faithful full-suite execution, other platforms and independent native build ownership remain unfinished under #202/#703. Logs: zig-out/bun-port-702/; verified Home SHA-256 4a937ded48d609b76e336fdc192dd96439653a228073a234aaafcba176a5e783.

Previous Blob publication: f491cacd7 closed #700 with 65 native passes, preserved the original allocation/prototype/ownership workloads and four snapshots, and removed UTF-16 child and array-prototype descriptor substitutes.

Previous body/stream publication: 04644b2d0 closed #699 with 9,467 native passes and four original skips, removed three clone-specific substitutes, and retained the full HTTP/3 matrix and child/GC workloads. Its adjacent Request run exposed the original 5-second deadline failure now tracked in #701; subsequent diagnostic passes were not counted as a repair.

Previous Headers/Response publication: 649c3c48f closed #698 with 170 native passes, corrected mirror cwd/startup environment and absolute-path CLI rewriting, and preserved the original Response snapshot. Its build passes 46/46 and focused harness 6/6; the initial 4/5 run exposed the additional CLI root defect and remains recorded as historical evidence.

Previous Request publication: 5e45c58a3 closed #697 for native Request activation and removed unused bootstrap VM initialization from native corpus dispatch. Its complete four-file matrix passes 24/24. Direct native stress peak footprints were 22,594,376 bytes for clone stress and 194,872,232 bytes for method-allocation stress; original loops and limits remain intact. The older bootstrap implementation is not claimed repaired.

Previous paired repair: e148e06c1, published to origin/main. #695 and #696 are fixed: complete TypeScript conformance is 1,419/1,419; both optimized Bake integration scripts and gzip decoding with both libdeflate settings pass. 100% logical Bun parity remains incomplete.

The preceding main commit 2129e4a82 enters the macOS WebView host before CLI/JSC initialization and restores native execution of the shell and both complete WebView matrices. All three remaining whole-file TODO substitutions and their helper are removed. #693 is complete for that integration.

  • Unchanged pinned WebKit: 57 pass / 1 upstream TODO / 0 fail / 141 assertions. Shell: 378 pass / 83 upstream TODOs / 0 fail / 1,035 assertions.
  • Four ordinary native corpus routes: 487 pass / 89 upstream TODOs / 0 fail / 0 unsupported registrations. Chrome WebSocket contributes zero passes and five upstream TODOs, not implemented coverage.
  • The first strict Chrome run still fails its original first-navigation deadline (51 pass / 1 fail); pinned Bun passes 52/52. Later probes and a full Home run pass but do not erase that failure: #694 remains open. No retry, warm-up, sleep, timeout extension, assertion change, or workload reduction was added.
  • Optimized native build: 46/46 steps. Earlier feature-flag units: 6/6 with defaults and in each explicit 0/1 fresh-process run; unit build 23/23 steps. Both complete Bake production/development integration scripts pass; absent/0/false opt-in is correctly rejected. Unchanged gzip/fetch is 24/24 / 43 assertions with each libdeflate setting.
  • Nested-rest checker regressions: 4/4; complete TypeScript conformance 1,419/1,419; standalone reproduction exits zero. The original regression now requires zero diagnostics, and new negatives retain element-type and tuple-order errors.
  • Earlier source-restoration regression: 1 pass, zero logged errors/leaks. Earlier completed native runtime units: 1,826 pass / 19 skip / 0 fail; that entire unit artifact was not rerun for the latest paired repair.
  • The earlier optimized aggregate was interrupted (exit 143) and is still incomplete. Its nested-rest and Bake/feature-flag failures are repaired and verified separately above (#695, #696); no completed aggregate or whole-suite pass is claimed. The default Debug aggregate was not established by that run.
  • The earlier bootstrap Request stress test reached 13.7 GB sampled footprint / 14.4 GB peak and was stopped. Its obsolete execution path is replaced by verified native coverage in #697 above; the bootstrap shim used by other adapters is not claimed repaired. The earlier full aggregate was not resumed, and no completed corpus aggregate or whole-suite pass count is claimed.
  • Pinned Bun 4982b91e3702094330f3be3883354c52b8c01323: 12,996 tracked paths present; 12,990 identical regular files, five identical symlinks, one differing expectations.txt, zero missing. The expectation delta removes four historical FAIL entries; executable test sources are unchanged.
  • Changed-file formatting, documentation Pickier and whitespace checks pass. Repository Pickier retains 59,302 findings (31,238 errors / 28,064 warnings). The README's Settlers checkout is absent. External Bun C++ build artifacts, other adapters (#202), upstream TODOs/skips, other platforms and full source/build ownership remain unfinished.

Publication correction: all 18 commit URLs in this issue's historical body were verified as ancestors of main at this checkpoint. Historical statements below saying those commits were not merged describe their original publication state and are superseded by this audit.

How to run / verify

  • Native debug build: zig build debug -Denable_jsc=true -j2 --summary all from the Home repository. External native dependencies and ownership limits are documented in docs/docs/NATIVE_RUNTIME_BINDINGS.md.
  • Native regression: HOME_NATIVE_VM=1 ./zig-out/bin/home-debug tests/runtime/native-worker-inbox-shutdown.test.mjs (substitute the desired regression file).
  • Strict native corpus: HOME_NATIVE_VM=1 HOME_CORPUS_FULL_VM=1 ./zig-out/bin/home-debug test <corpus-file>; both overrides are required to bypass the pragmatic corpus adapter.
  • Outer corpus CLI: unset HOME_NATIVE_VM and HOME_CORPUS_FULL_VM; any nonempty value, including 0, enables those overrides. Keep native execution and the pragmatic adapter's results separate.
  • Use bounded subprocesses and per-child timeouts; limit concurrency to 2–3 small fixtures. Clean only owned temporary artifacts. Do not use blanket pkill commands.
  • Leak measurements must retain their original workloads and thresholds; Debug and ReleaseSafe results are not interchangeable.
  • Skips, disabled bodies, timeouts, unsupported cases, external dependencies, and failing negative controls do not count as completed parity.

Historical publication checkpoints (through 2026-08-28)

  • Published HTTP/3 verification-isolation checkpoint: 0fd884f59, pushed on codex/runtime-port, not merged to main. #539 is closed after a controlled environment correction: the complete unchanged adversarial file passes 12/12 serialized Home processes and 12/12 serialized pinned Bun processes, all 27/27 / 163 assertions. Three eight-way waves reproduce the same first-64-KiB deadline sequence in both binaries (Home 11/12 process passes; pinned Bun 5/12) while all sixteen UDP ports are distinct and the shared eleven-CPU host is saturated by native tests, a ReleaseFast build, and system work. No runtime source, test deadline, workload, retry, sleep, skip, or protocol fallback changed. Heavy HTTP/3 files must be verified serially and away from builds. #530 retains platform/integration and native dependency ownership; all other explicit suite gaps remain. 100% logical Bun parity is not achieved.
  • Previous native TLS SNI/ALPN checkpoint: a9a95f6a4, pushed on codex/runtime-port, not merged to main. #542 now ports per-connection synchronous/asynchronous SNICallback, pending-certificate resumption, original callback error propagation, same-host precedence, offered-protocol ALPNCallback validation, callback-safe teardown, and ALPN selector handoff across SNI contexts. The complete unchanged server file is 38/38 / 147 assertions, exactly matching pinned Bun. The new combined lifecycle regression passes 20/20 independent processes plus VM destruction. The seven-file TLS sweep is 120 pass / 1 skip / 3 TODO / 2 fail / 380 assertions; both failures are live bun.sh OCSP checks reproduced in pinned Bun. Build 17/17; units 1,828 pass / 19 skip / 0 fail (19/19 steps); sequential regressions 63/63, including full spawn and child-process. Home's vendored C source compiles with reconstructed pinned release flags, while the debug build still links the pinned Bun object. Darwin only; #530 platform/integration, other open subsystems, skipped/TODO behavior, dependency ownership and whole-suite parity remain incomplete. 100% logical Bun parity is not achieved.
  • Previous native TLS session/keylog checkpoint: 04569d8f9, pushed on codex/runtime-port, not merged to main. #543 replaces the no-op native dispatch with retained FIFO session/keylog delivery for direct TCP TLS and upgraded Duplex TLS, preserving session-before-data ordering across destructive callbacks. The complete unchanged connect file is now 28 pass / 2 fail / 1 skip / 106 assertions, exactly matching pinned Bun; both remaining live OCSP assertions also fail in Bun. The native lifetime/GC regression passes 20/20 independent processes. Build 17/17; units 1,828 pass / 19 skip / 0 fail (19/19 steps); sequential regressions 62/62, including 31 native files. Adjacent TLS is 47 pass / 2 skip / 7 fail / 424 assertions; all seven failures are SNI/ALPN work in #542, now next. The checked-in Home uSockets source has the logical queue implementation and compiles with the linked release object's exact flags, but the debug build still links that pinned Bun object. Darwin only; platform/integration, skipped/TODO behavior, native dependency ownership and full parity remain incomplete. Whole-suite parity is not achieved.
  • Previous native TLS context checkpoint: fbdfbf890, pushed on codex/runtime-port, not merged to main. #532 now provides private contexts/CA isolation, binary PFX, detailed certificate chains, hostname authorization and TLS min/max propagation. Six unchanged core files pass; context 7/7, cache 9/9, cert 28 pass / 3 TODO, hostname 5/5. Native normal/destruction and original leak checks pass. Native build 17/17; runtime units 1,828 pass / 19 skip / 0 fail, 19/19 steps; sequential regressions 61/61, including 30 native files. Complete compression 32/32, HTTP/2 client 60/60, HTTP/3 client 52/52, both proxy files, full body-stream 9,086/9,086 / 135,984 assertions, five EOF/fetch files and both abort files pass. The initial HTTP/3 adversarial run failed 24 pass / 3 fail / 160 assertions, followed by three 27/27 / 163 serial replays. #539 remains unresolved; passing retries do not erase the final artifact’s initial failure or prior Home/Bun failures. 249 TLS sources, 48 HTTP/regression sources, and 13 TLS implementations match the pin. Full TLS server/connect files still fail: #542 tracks SNI/ALPN callbacks, #543 session/keylog delivery; two live certificate assertions also fail in pinned Bun. Failed attempts and all skips/TODOs are retained. Darwin only; integration, platform and full ownership remain incomplete. Whole-suite parity is not achieved.
  • Previous compression/CONNECT checkpoint: 2c5df8cce, pushed on codex/runtime-port, not merged to main. #531 ports all four request-compression encodings and file/buffer ownership; #535 repairs CONNECT writer/envelope handling. Complete unchanged compression 32/32 / 78 assertions, HTTP/2 client 60/60 / 197, HTTP/3 client 52/52 / 241, and both proxy files pass against pinned controls. Full body-stream 9,086/9,086 / 135,984; build 17/17, units 1,827 pass / 19 skip / 0 fail (19/19 steps), regressions 60/60, including 29 native files; all five EOF/fetch and both abort files pass. HTTP/3 reliability remains unresolved in #539: initial adversarial failure, then three passing Home replays; failures also reproduce in published Home and pinned Bun. TLS context work remains #532. Forty-eight test/harness/fixture sources and eleven implementations match the pin. Failed attempts remain recorded. Darwin only; skips/TODOs, platform/integration and full source ownership remain incomplete. Whole-suite parity is not achieved.
  • Previous HTTP/2 checkpoint: fd239c3ac, pushed on codex/runtime-port, not merged to main. #533 now preserves the idle-session Host hash and rejects invalid response-name tokens while consuming complete HPACK blocks. Complete unchanged HTTP/2 adversarial 15/15 / 33 assertions (parent 13 pass / 2 fail); lifetime 7/7 / 21 assertions with original 200-request workloads. Full body-stream 9,086/9,086 / 135,984 assertions. Build 17/17, units 1,825 pass / 19 skips / 0 fail (19/19 steps), sequential regressions 59/59 including 28 native files. HTTP/2 client remains 58 pass / 2 fail / 2 errors; HTTP/3 client 50 pass / 2 fail, both compression #531. HTTP/3 adversarial retains 27/27. Newly exercised CONNECT-proxy crashes reproduce in both parent and candidate; pinned Bun passes both files, tracked separately in #535. TLS context work remains #532. Forty measured test/harness/fixture sources and six consulted implementations match the pin. Darwin only; platform/integration, skips/TODOs and full source ownership remain unverified. Whole-suite parity is incomplete.
  • Previous TLS/HTTP transport checkpoint: 29c196835, pushed on codex/runtime-port, not merged to main. TLS ABI offsets, HTTP/3 trust eligibility and duplex progress are repaired. Full unchanged body-stream 9,086/9,086 / 135,984 assertions; HTTP/3 adversarial 27/27; client 50 pass / 2 fail (compression #531). HTTP/2 client 58 pass / 2 fail / 2 errors (#531); adversarial 13 pass / 2 fail (#533 verification-host isolation/header validation). TLS server validation 16/16; remaining context/CA/version work is #532. Build 17/17, units 1,824 pass / 19 skips / 0 fail (19/19 steps), sequential regressions 58/58 (27 native files); full spawn 126 passes, child-process 32 passes. Five complete fetch files and both abort files retain their passes. 72 test/harness sources and six implementation sources match the pin. Earlier timeout and disk-exhaustion attempts are retained; complete sequential reruns pass with original workloads/deadlines. See #530 for detailed evidence. Shared Darwin checkout; platform/integration, skipped/TODO behavior and full ownership remain unverified. Whole-suite parity is incomplete.
  • Earlier body-abort checkpoint: fb161314a, pushed on codex/runtime-port, not merged to main. #529 ports terminal response-error settlement before upload cancellation; unchanged abort file 2/2 / 6 assertions (parent 1 pass / 1 fail), queued-abort 1/1, and native 24-scenario normal/destruction/reentry checks pass. Build 17/17; units 1,824 pass / 19 skips / 0 failures (19/19 steps); regressions 57/57 (26 native files); 64 measured upstream sources match the pin. Five body files pass, including clone 25/25 and body 346 passes / 4 skips; five fetch files retain their passes including gzip 24/24. At that earlier checkpoint, the full body-stream matrix was not green: parent 4,883 pass / 4,203 fail / 2 errors, candidate 4,883 pass / 4,203 fail / 10 errors, pinned Bun 9,086/9,086. #530 tracks the HTTP/3 server path: parent client/adversarial files are 6 pass / 46 fail and 5 pass / 22 fail; both clients fail against Home's server before its JS handler, both succeed against Bun's server. Original assertions/workloads/deadlines retained. Historical HTTP/3 completion claims below are corrected. Shared Darwin checkout; unrelated compiler edits excluded. Platform/integration, skips/TODOs and full source ownership remain unverified. Whole-suite parity is incomplete.
  • HTTP/installer checkpoint: 90ced0ed6, pushed on codex/runtime-port, not merged to main. #526 repairs buffered EOF completion and fragmented tar-format selection; native real-install, streaming-handshake, VM-destruction and three 404 transport controls pass. #527 advances unchanged fetch-gzip from 22/2 to 24/24 / 43 assertions, preserving the 1,025 MiB workload. #528 advances unchanged streaming-extract from 5/1 to 6/6 / 180 assertions, enforcing the pinned 2 GiB buffered limit against the original 2.25 GiB payload. Four further complete fetch files pass; full zlib retains 378 passes / 2 skips / 434 assertions. Retains bun-run 291/291, native hard-link-PATH bunx 33 pass / 1 Windows-only skip / 0 fail, workspaces 58/58, eval 33/33, tsconfig 6/6, resolver 39 pass / 2 skips / 1 TODO plus its spawned 9 pass / 1 TODO, and 21 config controls. Build 17/17; units 1,824 pass / 19 skips / 0 failures (19/19 steps); regressions 56/56 (25 native files); 46 measured upstream test sources match the exact pin. No upstream assertion/workload/deadline changes. #526–#528 retain platform/integration scope. Shared Darwin checkout; unrelated compiler edits excluded. Skips/TODOs, other platforms, integration and full source ownership remain unverified. Whole-suite parity is incomplete.
  • Resolver checkpoint: 9b3a5c1ad, pushed on codex/runtime-port, not merged to main. #525 ports canonical resolver diagnostics and fallible, retained installer initialization errors; readable-file dispatch now precedes cwd scanning. Unchanged tsconfig-override 6/6 / 17 assertions (parent 5/1), resolver 39 pass / 2 skips / 1 TODO / 0 fail / 59 assertions plus spawned file 9 passes / 1 TODO / 41 assertions (parent's unreadable-cwd failure resolved under the original 5,000 ms deadline). Native repeated-error and VM-destruction checks pass. Retains bun-run 291/291 / 416 assertions, native hard-link-PATH bunx 33 pass / 1 Windows-only skip / 0 fail / 161 assertions, workspaces 58/58 / 192 assertions, eval 33/33 / 70 assertions, and 21 config controls. Build 17/17; units 1,820 pass / 19 skips / 0 failures (19/19 steps); regressions 56/56 (25 native files); 37 sources match the exact pin. No upstream assertion/workload/deadline changes. #526 remains a reproduced failure: EOF-delimited registry 404s trigger a pending-task assertion in parent and final candidate; length-delimited controls pass. Other platforms, branch integration, skips/TODOs and full source ownership remain unverified. Shared Darwin checkout; unrelated compiler edits excluded. Whole-suite parity is incomplete.
  • CLI config checkpoint: 828ecc729, pushed on codex/runtime-port, not merged to main. #517 optional-config and entrypoint scanning now match all 21 pinned-control boundary cases; native normal/destruction regression passes and published parent fails the new assertion. Full unchanged bun-run 291/291 / 416 assertions, native hard-link-PATH bunx 33 pass / 1 Windows-only skip / 0 fail / 161 assertions, workspaces 58/58 / 192 assertions, and eval 33/33 / 70 assertions (declared React dependency installed by Home). Build 17/17; units 1,820 pass / 19 skip / 0 fail (19/19 steps); regression commands 56/56 (25 native files); 35 measured sources byte-identical to pin. No upstream assertion/workload/deadline changes. New #525 tracks the unchanged tsconfig-override failure: Home parent/candidate 5 pass / 1 fail, pinned Bun 6/6, due to auto-install 404 diagnostics. #517 now retains platform/integration and help-rendering verification. Shared Darwin checkout; unrelated compiler edits excluded. Skips/TODOs, other platforms and full source ownership remain unverified. Whole-suite parity is incomplete.
  • Native installer checkpoint: 3be72ca5b, pushed on codex/runtime-port, not merged to main. Native bunx and the real installer chain (#518) now resolve all three remaining bun-run failures: 291 pass / 0 fail / 416 assertions. Full unchanged bunx passes 33 tests / 1 Windows-only skip / 0 failures / 161 assertions with isolated PATH hard links named node/bun to the exact Home binary (no installed JS runtime delegation). Ordinary PATH remains 32/1/1 because of an installed claude binary; pinned Bun reproduces it. An earlier native symlink PATH run's old CLI-basename failure is separately recorded. Native registry credentials, actual installation, both analyzers, auto-install HTTP initialization and VM destruction checks pass; Angular's original 300,000 ms timeout is resolved without changing the deadline. Workspace suites 58/58 / 192 assertions; regression commands 56/56 (25 native files); build 17/17; units 1,820 pass / 19 skips / 0 failures (19/19 steps). All 33 measured upstream sources match the pin; generated test-tarball bytes are archived and restored. No assertion/workload/deadline changes. #508 now retains platform/integration scope; #517 optional-config scanning and #519 platform/integration verification remain open. Shared Darwin checkout; unrelated compiler edits excluded. Skips/TODOs and other platforms are unverified. Whole-suite parity is incomplete.
  • Compression checkpoint: 095f90396, pushed on codex/runtime-port, not merged to main. #516 ports Zlib/Brotli/Zstd async buffer pins, GC roots and fresh write-result resolution. The complete unchanged zlib file now passes 378 tests / 434 assertions, with 2 skips and 0 failures; bounds 9/9, reentrancy 3/3, native regression commands 55/55 (24 native files), and runtime units 1,819 pass / 19 skip / 0 fail. Twenty lifetime stress runs plus VM destruction pass. No upstream assertions/workloads/deadlines were changed. This supersedes the prior zlib failure linked from #513. Darwin only; #514's four remaining stream-file gaps, broader CLI/runtime gaps and whole-suite parity remain open.
  • The 65 previously local port commits through 6de9852ea8443c3b5d4a58dcdbcf11944456fd2e are now published on codex/runtime-port. Their original hashes were recovered from the existing local codex-git-shadow.git metadata; no replacement history or force push was used. They are published on the branch, not merged into main.
  • Worker checkpoints on the published branch: descendant shutdown 41f10cbebe6d65340304f4b93eb4fd3fa10d0e19 (#470), native parentPort 3b0721c32b2d237c38380900ed449217ef1af853 (#477), and snapshot cancellation c6a4e4a3513dfb2a05a13357c06f598ad9f1d6ce (#471). Not merged into main. Snapshot tasks carry IDs only; the parent thread owns promise handles and completed payloads through success, worker exit, and parent-VM shutdown.
  • Snapshot checkpoint: 20/20 native regression files, 16 byte-identical upstream Node fixtures, and native build/cache 16/16 pass. The six-scenario snapshot suite passes four complete runs, including two with VM destruction enabled. The unchanged upstream snapshot-GC test passes its full 15 × 300 = 4,500 snapshot workload (1 test / 15 assertions). No sanitizer claim.
  • Strict native MessagePort corpus: 15 pass / 3 existing debug-sanitizer guard skips / 0 fail / 529 assertions. Both native execution flags were set. Skips are not completed parity.
  • The full worker_threads corpus file is not green: at the snapshot checkpoint, 33 pass / 1 timeout / 1 between-test error, although its three snapshot cases pass. The test-name filter failure is now fixed in #481; the current filtered snapshot run is 3 pass / 31 filtered out / 0 fail. This does not resolve the full-file timeout. The unchanged 100 MiB eval-source case exceeds its original five-second deadline (#482); its standalone memory-threshold check passes in native debug in 20.22 s versus 2.20 s in Bun. Debug/optimized timing and the full-file deadline remain distinct from snapshot cancellation.
  • Native test CLI checkpoint 1340cebd5 (#481), published on codex/runtime-port, not merged into main: real argument and bunfig parsing, fatal diagnostics, and buffered/direct output semantics. Build/cache 16/16, all 20 native regression files, and 50 unchanged upstream tests / 119 assertions pass across filtering, configuration, retry/repeat hooks, concurrency, path ignores, and full coverage. The snapshot selection filters out 31 cases; they are not counted as passes. No tests or snapshots were weakened.
  • Newly exposed test-runner feature gaps: isolated global/module records #484 (1 pass / 3 fail, Bun control 4 pass) and parallel coordinator/worker IPC #485 (0 pass / 3 fail, Bun control 3 pass). Both retain their unmodified upstream reproducers and remain open. Other unverified CLI/runtime features are not implied complete by #481.
  • Remaining shutdown work: generic queued task cancellation #465 and work-pool quiescence #468. Snapshot request ownership #471, parent-port lifecycle #477, and descendant shutdown #470 are implemented and verified on the published branch, with integration context retained in their issues. Related ownership: #461, #462, #466, #469.
  • Other active parity gaps include the core corpus exclusions in #456, reduced-context realms in #454, and Node-API/FFI follow-ups #459 and #460. Historical checkbox sections below are not a current whole-suite completion report.
  • 100% logical Bun parity is not achieved.

A. node:tls socket layer

  • SNI/ALPN callback handling and asynchronous suspension — implemented in a9a95f6a4 (#542); the complete unchanged server file passes 38/38 / 147 assertions, matching pinned Bun.
  • Session/keylog events and teardown ordering — implemented in 04569d8f9 (#543); the complete unchanged connect file matches pinned Bun, with two live OCSP failures retained in both.
  • getCipher() cluster works — was a false diagnosis: the null cipher/session came from the broken (cert-less) handshake caused by the Buffer-cert gap, now fixed (b3492d3). Verified locally: getCipher {TLS_AES_128_GCM_SHA256, version:"TLSv1/SSLv3"} (matches pin test), getProtocol TLSv1.3, getSession 1106-byte Buffer, getEphemeralKeyInfo/getSharedSigalgs/exportKeyingMaterial/isSessionReused all correct. The pin test connects to bun.sh (crashes on this macOS 27 box) so it can't be run here, but the behavior is confirmed.
  • Detailed getPeerCertificate at the current pin — implemented in fbdfbf890 (#532): peer/trust-store issuer chains, self-issued roots, checked conversion and native reference ownership. Complete cert suite 28 passes / 3 TODO, original leak workload and memory threshold pass. The earlier claim that the detailed TODO matched the pin was historical and does not describe the current pin.
  • ALPN — fixed in 428aa2c (hand-mirror SSLConfig.fromJS never parsed ALPNProtocols).
  • Static SNI server.addContext() selection — the complete context suite and most-recent-context Node program now pass (#532). Dynamic SNI/ALPN callbacks and asynchronous handshake resumption remain #542.
  • Cert-chain verification — "unable to verify the first certificate" / "unable to get issuer certificate" on incomplete-chain + intermediate-CA scenarios (basic single-CA verify works).
  • Config validation — tls.createServer({passphrase: wrong}) should reject but listens; passphrase IS passed to us_ssl_ctx_from_options, so it's uws-level validation timing/error-surfacing.
  • getPeerCertificate '\0' handling (CVE-2009-2408 test).

B. Bun Shell ($)

  • Bun Shell template commands and command substitution — closed by #73. Basic template execution and the mixed-output/error command-substitution stress case run through real Home execution. Follow-up 31e2dc603 forwards explicit spawn environments and pins the installed Home executable for the fixture-free corpus path.

C. fetch / HTTP client

  • redirect + gzip — fixed in c508e00 (NativePromiseContext wiring; see below). fetch-gzip.test.ts 2/3 → 5/0.
  • streamed gzip with delay — fixed in c508e00 (same root).
  • body-stream.test.ts — full unchanged matrix passes 9,086/9,086 / 135,984 assertions at 2c5df8cce, including HTTP/3. Original workloads/deadlines preserved. Abort settlement remains green (2/2 plus queued 1/1, #529). This file-level result does not close HTTP/3 reliability/platform work in #530/#539.

D. HTTP/2 & HTTP/3

  • Native HTTP/2 completion — complete unchanged client 60/60 / 197, adversarial 15/15 / 33, lifetime 7/7 / 21 at 2c5df8cce (#531/#533). Earlier client compression failures are repaired. Platform/integration remain unverified; file-level passes do not establish complete HTTP/2 parity.
  • HTTP/3 — platform and integration verification, #530: 2c5df8cce brings client 52/52 / 241 and full body matrix 9,086/9,086 / 135,984. Request compression is implemented (#531). #539 is closed by 0fd884f59 as a verified host-contention artifact: serialized Home and pinned Bun each pass 12/12 processes, while intentional eight-way waves reproduce the same first-upload deadlines in both. Original tests/deadlines retained. Other platforms/integration remain unverified.

E. Deep/unported subsystems

  • napi-FFI cc.test.ts crash — resolved: exact upstream file is 5 pass / 10 upstream skips / 0 fail in Home; the extended mirrored file is 8 pass / 10 upstream skips / 0 fail. Pinned Bun at 4982b91e3 currently reports 4 pass / 10 skips / 1 fail on the upstream file because napi_main is not exported from the fixture compile.
  • S3Client remaining platform/external integration (#597) — deterministic native matrix is 66 pass / 3 upstream credential-gated skips / 0 fail in 5c2ac4542; the stream-cancel crash, task/body ownership, proxy resolution, early-response multipart reuse, malformed ListObjects parsing, and eight-file production routing are fixed. Linux/Windows and credentialed S3/R2 integration remain open.
  • Bake/HMR remaining optimized/platform verification (#901) — native production/development/HMR is functional (#551/#553/#555). The complete native suite checkpoint validates all 24 unchanged files (177 pass / 2 upstream TODO / 0 fail / 0 skip), genuine frozen locks, complete journal identities and original test deadlines (#902 closed). Spawned fixture cwd, production source maps and changed-path aliases are repaired. Debug ownership and release frontend checks pass; optimized runtime and wider platform/SDK acceptance remain open. #564 tracks Linux TODO coverage.
  • Worker corpus remaining platform/performance verification — e1523b1ee and eae013190 promote 16 exact native files: 264 pass / 3 upstream release-mode skips / 1 upstream TODO / 0 fail. The corpus runner applies its real preload and preserves sentinel path ownership. Web Worker messaging, transfer, structured clone, Blob, termination, leak, heap-snapshot GC, unchanged 15787.test.ts, and the complete worker-destruction matrix are green; #598 is closed after preserving cached exit code 0. The complete worker_threads.test.ts is green in ReleaseFast under #482 but retains its documented Debug-only five-second eval-source deadline gap. Linux/Windows verification, the upstream TODO/skips, and whole-suite worker parity remain open.

F. Memory-leak tests (triaged on ReleaseSafe 2026-07-07 — build target un-rotted in 55f7140)

  • setTimeout-clear-in-callback — ✅ FALSE ALARM: all 3 variants (clear/refresh/repeat) pass on ReleaseSafe; debug-build overhead as suspected.
  • text-decoder utf16le output-buffer leak — ✅ FALSE ALARM: both utf-16le and utf-16be pass on ReleaseSafe.
  • streams-leak — ✅ FALSE ALARM: passes on ReleaseSafe.
  • serve-body-leak — ✅ CLOSED (4ee746c): root cause was the libc mimalloc shim (allocator page retention, not a leak — see forensics comment). Real mimalloc re-attached (Phase 12.2); 7 pass / 0 fail on ReleaseSafe.
  • inspect-error-leak — ✅ CLOSED (4ff003d): ZigException.Holder.deinit was a stub that dropped the pin's deferred resetArena — every inspected error left one full transpile in the module loader arena (74MB/100k iters). Now passes with 'RSS increased by 4 MB', exactly real Bun's number.
  • node:util test-aborted gc-cleanup — ✅ CLOSED (d459e0d): FinalizationRegistry callbacks never fired AT ALL — JSCScheduler.zig was a no-op placeholder and the two event-loop exports were noop stubs, severing JSC's DeferredWorkTimer delivery chain. Pin's scheduler ported; test-aborted now 5/5 (gc-cleanup passes in 2.5ms).
  • (new) HTMLRewriter handler leak — reclassified, NOT a leak: all 58 lol_html_* symbols are noop stubs (lol-html Rust crate unported — link_bun_rust_archive = false); the child panics on the first .on() (else => unreachable on a garbage return at lolhtml_sys/lol_html.zig:253) and the test fails on stderr. Belongs with section E as an unported-library item: link lol_html_c_api (rlibs exist in the Bun build tree), delete the stubs, and restore the pin's HTMLString.toString free (lol_html.zig:623 — latent leak once real lolhtml links).

G. Environmental / infra (mostly resolved)

  • Test runner: home test defaults to native bun:test runner (078c659)
  • bun:internal-for-testing gated in release (13deb08)
  • node v24 + bun v1.3.14 installed via pantry (clears differential-spawn "node not found" failures)
  • Build recovery recipe after /tmp wipe (memory: home-build-portability.md)

Done this session (context)

signals (db0df4d), native-VM file runner (f296bb6), Worker cross-thread + teardown (dcb6db6, 85aba46), native test runner default (078c659), translateUVErrorToE (188268e), Bun.markdown renderer (2768d9a), MD4 (1279c18), Bun.CSRF (96b8f05), node:tls SecureContext ~40 tests (6cf4a6b), release build + build-recovery (dff7bfa, df83921, 13deb08).

Native isolation checkpoint — 6e092777a

Published on codex/runtime-port; not yet merged to main. #484 now passes the entire unchanged isolation file: 19 tests / 67 assertions, plus three consecutive repeat runs. The real JSC module-record bridge replaces the parked panic path. File-boundary cleanup releases watcher, server, timer, watch-file scheduler, and AbortSignal GC references; server callback protections are balanced across reload and destruction.

Verification: native build and unchanged cached rebuild 17/17; generator/ABI tests 8 tests / 135 assertions; all 20 native regression files pass, including expanded isolation probes. Fourteen selected unchanged upstream commands total 92 passing tests / 242 assertions, including the 50-test CLI regression set. Two platform skips and 231 filtered cases in those selections are not passes. The existing AbortSignal spawn-glyph-only check alone is not proof of child assertion execution; direct native lifecycle and timeout checks provide separate evidence. Workloads, deadlines, and upstream assertions were preserved. Full details and control limitations are in docs/docs/NATIVE_RUNTIME_BINDINGS.md.

Separate newly tracked failures: fake clocks #490 (16 pass / 14 fail, also reproduced before this checkpoint; Bun control 30 pass) and deferred imports #491 (0 pass / 1 fail / 19 filtered out in the selected parser reproduction). Parallel orchestration #485 and the full worker eval deadline #482 remain open. Installed Bun 1.3.14 fails four newer isolation cases itself, so no passing full-file Bun control is claimed. The full port and 100% logical Bun-suite compatibility are still incomplete.

Native fake-clock checkpoint — d0ed7c906

Committed and pushed on codex/runtime-port; not yet merged to main. #490 now passes the unchanged core fake-timer file: 30 tests / 83 assertions, up from 16 pass / 14 fail. Installed Bun 1.3.14 passes the same 30 / 83 control. Mockable timer deadlines now share the fake clock, fractional advancement retains nanoseconds, real option/getter validation runs before clock mutation, and both reset paths release timer/AbortSignal references outside the heap lock.

Verification:

  • Native build and cached rebuild: 17/17 steps.
  • All 21 native regression files pass; the new fake-clock test also passes three consecutive repeats and fails against the cached pre-change Home binary. It checks actual Home execution, inherited/throwing getters, Date/performance agreement, fractional nested callbacks, retained cancelled handles, natural exit and bounded GC counts after allocating 3,072 timeout/interval wrappers plus 1,536 AbortSignal timeouts across resets.
  • Entire unchanged fake-timer directory: 61 reported pass / 438 TODO / 0 fail / 115 assertions in Home and Bun. 14 reported passes are it.failing cases, not implemented features; all 438 TODOs are excluded from logical completion. There are 47 ordinary passing tests, including the core 30.
  • Unchanged isolation: 19 tests / 67 assertions. Unchanged timers/promises: 4 / 7. Twenty-four selected corpus files match the pinned Bun checkout byte-for-byte. Focused Pickier, timer-file Zig formatting and whitespace checks pass.

The wider Node timer file still hangs after printing 19 passes on its final caught-immediate-exception fixture. This happens in the pre-change Home binary too. The standalone fixture times out in both Home binaries and exits successfully in Bun; the original-checkout Bun control passes the full 20 / 31. Tracked separately in #493; neither incomplete runs nor expected failures count as logical parity.

Deferred imports #491, parallel coordinator/IPC #485, the full worker deadline #482, remaining native ownership, other platforms and full-suite parity remain open. The full port and 100% logical Bun-suite compatibility are not complete. See docs/docs/NATIVE_RUNTIME_BINDINGS.md for the implementation and verification boundary.

Native POSIX spawn checkpoint — 6d797186c

Published on codex/runtime-port; not yet merged to main. #493 is now implemented and verified. The timer fixture hung during import, before scheduling immediates: Node's common helper spawned a missing absolute openssl-cli, and Home misread libc's direct positive errno as success and watched PID 0. The fix propagates spawn and file-action/attribute setup errors, preserves executable paths, and releases failed registration lists. No immediate dispatch code was changed.

Verification: 28 selected commands pass, including all 21 native regression files, the unchanged complete Node timer file (20 tests / 31 assertions), its standalone fixture, isolation (19 / 67), core fake clocks (30 / 83), timers/promises (4 / 7), PATH selection (1 / 2) and the selected missing-command/invalid-fd cases (2 / 9; 32 filtered out excluded). Native build and cached rebuild 17/17; repeated native spawn failures preserve descriptor counts and recover to a valid spawn without re-entering user microtasks. Eight relevant upstream files are byte-identical to source pin 4982b91e3702094330f3be3883354c52b8c01323.

New linked follow-ups keep the failing boundaries explicit: extra stdio pipes #495, real native counter snapshots #496, and package-script passthrough #497. Full child-process remains 30 pass / 2 fail / 1 skip / 1 TODO / 70 assertions; spawnSync remains 4 pass / 1 fail / 1 platform skip / 11 assertions. Installed Bun 1.3.14 passes those three failing scenarios but fails the newer invalid-fd case itself. Deferred imports #491, parallel test orchestration #485, full worker timing #482 and the other open work remain. The full port and 100% logical Bun-suite compatibility are still incomplete.

14 days ago

js/node provisioned and fully classified: 242/267, with the remaining gap measured at 13 files / 82 tests

Continuing from the previous comment. Four more commits on main as glennmichael123, no coauthors, Darwin arm64. 100% logical Bun parity is not achieved.

  • f2ee14f4d — the corpus's npm dependencies were never installed, so every file importing verdaccio, happy-dom, strip-ansi, detect-libc or body-parser aborted before its first test, and the scanner counted those aborts as crashes. scripts/provision-corpus-deps.sh runs the --frozen-lockfile install (2,896 packages, ~20s, bun.lock untouched — the script fails if it changes). Only the two file: dependencies that resolve against Bun's own repository layout remain, detailed on #618. The scanner gained a deps status so this cannot be misread as a runtime defect again.
  • 27e2cfc0f — handleInternalMessagePrimary unwrapped the cluster worker object and callback without checking they were attached, so a plain child_process.fork() from a non-cluster parent panicked with "attempt to use null value". The holder already carries isReady() for exactly this and Bun's Rust calls it here; Home did not. js/node/cluster.test.ts panic → 4 pass / 0 fail, matching Bun.
  • e0e0c363e — legacy url.parse accepted https://[:::1], http://[::banana] and https://[\n::1]. Home had replaced Bun's new URL(...) delegation with a character-class test to stop WHATWG IPv4 canonicalization reaching legacy hosts like 127.1; that test cannot tell a real IPv6 literal from a malformed one. The address is now validated through the WHATWG parser while Home keeps its own spelling, and the authority's TAB/LF/CR strip stops at a bracketed literal so it cannot repair [\n::1] before validation. 31 pass / 3 fail → 34 pass / 0 fail, matching Bun; url.test.ts stays 6/0.
  • 475621266 — the scan no longer runs __snapshots__/*.test.ts.snap sidecars as if they were tests.

Baseline: 267 files, 242 pass / 21 fail / 3 hang / 1 crash (from 233 / 25 / 3 / 6 earlier today, and from a tool that reported every file as a crash this morning).

Every remaining failure is now classified against a pinned Bun control and tabulated in #621. Six of the 21 fail identically in Bun and are corpus expectations rather than parity work. The real gap is 13 files / 82 tests, of which crypto/node-crypto (28) and http2/h2-conformance (19) overlap #587 and #426 — so 47 of the 82 likely belong to work already in flight. The single crash is #620.

Runtime regressions stayed 64/64 across all of it. Unchanged: Darwin only, no Linux or Windows, and js/bun (447 files), regression/issue (396) and js/web (155) remain unmeasured. No corpus file, fixture, assertion, workload, deadline or skip was modified. CI has still run nothing repo-wide since 2026-06-01.

14 days ago

Eight more parity fixes; js/node now 249/267

Continuing from the previous two comments. Eight commits on main as glennmichael123, no coauthors, Darwin arm64. Runtime regressions stayed 64/64 throughout. 100% logical Bun parity is not achieved.

Every fix below was measured against a pinned Bun 1.4.0-canary.1+4982b91 control built from the same artifact SHA, not merely "no longer crashes".

commitdefectunchanged upstream file
326b2e969process.release.sourceUrl reported the bare repository URL: native_stubs.zig defined Bun__githubURL as a placeholder that shadowed the real per-platform value in upgrade_command.zigprocess.test.js 100/2 → 102/0
a24f04fc1Module._nodeModulePaths leaked one string per path component — createFormat hands back a +1 reference and toJSArray only reads the slicenode-module-module.test.js 29/1 → 30/0
78714ef5dVLQ decode ran a fixed trip count and read past the end of a truncated mapping, then reported progress so callers' no-progress check never firedsourcemap-simd 23/1 → 24/0, sourcemap 12/2 → 14/0
fe99606c8Brotli/Zstd estimatedSize switched on live stream state, so closing a handle collapsed its reported footprint; it is also read on the concurrent GC threadzlib-estimated-size-gc 2/4 → 6/0; whole js/node/zlib 9/9
0ca202c1bBuffer.fill(str, 'ascii') masked to 7 bits — Node treats ascii-on-encode as latin1, as write already didbuffer.test.js (with below) 500/7 → 506/1
147545bcfbase64 write and construct transcoded UTF-16 to UTF-8 instead of narrowing to each code unit's low byte, so the decode produced nothingsame
0544dabc4fs flags rejected an integer-valued double — Go's syscall/js reads arguments with getFloat64, so valid flags arrive double-boxed (oven-sh/bun#32505)fs.test.ts 248/14 → 251/11
889d4275f, 2b6ec0a09fs.write/writeFile let JavaScript transfer the source backing store while a thread-pool worker was still reading it through a raw pointerfs.test.ts 251/11 → 254/8

js/node baseline: 267 files, 249 pass / 14 fail / 1 crash / 3 hang (from 242 / 21 / 3 / 1).

New issues

  • #623 — the remaining fs backing-store pinning: the readv/writev vector path, fs.read's destination view, readSync's detach-during-coercion rejection, and a Buffer used as the path argument. It records a trap: pinning in Read.fromJS the same way regresses six fs.read and three createReadStream cases, because the read path does not route through deinitAndUnprotect and the pin is never released. That attempt was reverted rather than left in.
  • #622 — assert.deepStrictEqual prints a 4,504-line diff for large arrays where Bun prints 55. Both runtimes execute the same JavaScript, so this is an engine-level difference, not a port gap.

A structural limit worth deciding on

build-support/bundle-native-modules.ts carries an explicit ownership manifest:

const ownedModules = ['node/url.ts', 'node/worker_threads.ts']

Only those two builtins are compiled from Home's source; everything else is served verbatim from the linked build, and the mirrored copies under packages/runtime/upstream/src/js/ are reference material that is not compiled. I confirmed this by porting a fix into internal/assert/assertion_error.ts, rebuilding, and measuring no change — then reverting it. Any remaining gap whose fix lives in internal/* or most of node/* needs its module added to that manifest, with its ABI validated, before a source change can take effect. That gates a whole class of the work in #621.

Limits

Darwin arm64 only; no Linux or Windows execution. Only js/node is surveyed — js/bun (447 files), regression/issue (396) and js/web (155) remain unmeasured. Two of fs.test.ts's eight remaining failures (stat/lstat > folder metadata) fail identically in the Bun control: they resolve a path that exists beside Bun's own test/ but not where the corpus is copied to. No corpus file, fixture, assertion, workload, deadline or skip was modified. CI has still run nothing repo-wide since 2026-06-01.

14 days ago

Progress update: pushed 907ebf8d5 (fix(runtime): restore webcrypto and body stream matrices) to main.

This batch removes the injected WebCrypto generateKey TODO and all nine body-stream workload reductions. The routed runtime now executes Bun WPT generateKey behavior with canonical algorithm names, validation/error ordering, usage validation/deduplication/splitting, public extractability, raw public exports, and CryptoKey identity. The unchanged body-stream corpus now covers both HTTP/1.1 and HTTP/3, every body reader and representation, request/clone and fast-path variants, delays, original payload sizes through 2 MiB, and direct/default streams.

Evidence:

  • Home Debug routed: body-stream 9,086/9,086; WebCrypto 10,226/10,226; 0 failures/todos
  • Home ReleaseSafe routed WebCrypto: 10,226/10,226
  • Home strict full VM combined: 19,312/19,312 and 165,330 assertions
  • pinned Bun combined: 19,312/19,312 and 165,330 assertions
  • full runtime units: 1,823 passed, 19 skipped, 0 failed
  • both fixtures byte-identical to the current local Bun checkout

Detailed suppression accounting and hashes: /home-lang/home/issues/202#issuecomment-5542576893

The overall port remains incomplete. The broader home_test package gate currently reports 1,337 pass, 1 skip, 106 fail; this run surfaced current follow-on work including corpus-count drift against the changed local Bun checkout, N-API build configuration, and HTTP/HTTP2 event-loop behavior. Those failures were not hidden or weakened.

14 days ago

Landed 97c128c25 (fix(corpus): mirror pinned Bun git tree exactly) on main.

This closes a corpus-integrity hole that made the acceptance gate depend on incidental working-tree state:

  • scripts/sync-bun-tests.sh now archives the pinned Git tree at 4982b91e3702094330f3be3883354c52b8c01323:test, rather than rsyncing the mutable ~/Code/bun/test checkout.
  • Added BUN_TRACKED_FILES.txt as the exact 12,996-entry source-of-truth manifest and made full/directory corpus discovery consume it.
  • Restored all 255 Bun-tracked fixture files beneath ignored node_modules paths, preserving upstream modes, executable bits, symlink blobs, and content.
  • Generated .bake-debug output and provisioned N-API dependency/build trees can no longer alter corpus counts or get executed as tests.
  • Restored the pinned upstream blobs for README, expectations, and two MessagePort worker tests; removed the stray fetch.js.txt.big artifact and zz-probe.test.ts diagnostic.
  • Kept the two Node-tooling-generated WPT URL resources explicit in MATERIALIZED_FILES.txt without counting them as Git-tracked Bun entries.
  • Corrected two stale native-route matrix assertions exposed by the exact resync.

Validation:

  • zig test packages/home_test/src/corpus.zig: 10/10 pass.
  • Sync idempotence: rerunning the sync leaves the binary diff unchanged.
  • Index audit across every pinned entry: 12,996 upstream vs 12,996 Home, zero mode/blob/symlink differences.
  • Integrated zig build test -Dfilter=home_test -Denable_jsc=true --summary failures: 1,344 pass, 1 skip, 101 fail, 0 crashes (1,446 total). Previous measured baseline was 1,337 pass, 1 skip, 106 fail (1,444 total), so this batch adds two manifest tests and removes five existing failures.
  • The remaining 101 failures are wider runtime parity debt, not corpus accounting failures.
  • Default zig build -Denable_jsc=true still reaches the separate pre-existing home-tool link error for _Home__JSC__ensureCurrentAtomStringTable.

The sync removed only reproducible generated/install output from the corpus (including the provisioned N-API tree); it is recoverable via the existing provisioning flow.

14 days ago

Port progress: pushed 9087c6e0 (fix(test): isolate WPT import decoration).

This removes an observable generic module.harness probe from __home_import. WPT test-name decoration is now gated to the vendored Node common/wpt module path, so ESM namespace proxies such as Node common can throw for unknown properties without imports failing. Added an actual JSC regression test whose proxy throws if harness is ever read.

Also synchronized two stale Web Streams source-contract assertions with the already-ported implementations: the BYOB request helper includes its cancellation callback, and TextEncoderStream wraps String(chunk) coercion in its error-context guard.

Validation:

  • zig build debug -Denable_jsc=true passed.
  • All four upstream files that previously failed with Using invalid common property: harness now complete with exit 0: child-process fork URL, HTTP proxy connection refusal, global proxy fetch empty, and proxy POST server failure.
  • The proxy POST server failure exercises the real lifecycle and produces Status Code: 500 plus Proxy error ECONNRESET: socket hang up.
  • A real Node WPT URL file still reaches its underlying known URL conformance assertion with the WPT test description attached, confirming WPT decoration remains active.

The complete home_test command was also allowed to finish, but it exhausted peak filesystem space during its multi-process test-server run. It ended at 1,308 pass, 1 skip, 133 fail, 5 crash (1,447 total) with cascading NoSpaceLeft harness-install/tmp-dir failures, so I am explicitly not recording that storage-invalid result as the new logical baseline. Space recovered from 8.7 GiB to 52 GiB after the test processes released their working sets. The prior valid baseline remains 1,344 pass, 1 skip, 101 fail, 0 crash (1,446 total) until the next storage-clean full run.

14 days ago

Port update — 108d6005f (fix(test): align DOMException and timer scheduling) is now on main.

Implemented two runtime parity fixes without changing Bun corpus fixtures, assertions, workloads, or deadlines:

  • DOMException now uses internal state with readonly prototype accessors for message, name, and code; preserves empty names; exposes the correct [object DOMException] brand; defines readonly WebIDL constants; and keeps explicitly supplied cause present but non-enumerable while omitting it otherwise.
  • Real one-shot timers now have virtual deadlines that Bun.sleep() drains in deadline/id order. Timeout callbacks fire exactly once, remain not-destroyed during callback execution, become destroyed afterward, and correctly stay active when refresh() is called from the callback. This fixes malformed-string clear handling at the scheduler level rather than special-casing inputs.

Validation on the rebuilt JSC debug runtime:

  • zig build debug -Denable_jsc=true — pass
  • js/node/timers/node-timers.test.ts — 20/20 pass
  • js/node/timers.promises/timers.promises.test.ts — 4/4 pass
  • js/node/domexception-node.test.js — 7/7 pass
  • js/web/abort/abort.test.ts — 5/5 pass
  • js/web/abort/abort-controller-gc-reason.test.ts — 2/2 pass
  • js/web/abort/abort-signal-event-listener-leak.test.ts — 5/5 pass
  • Node's standalone DOMException cause script exits cleanly.

I also attempted a narrow Zig test invocation, but the umbrella step did not honor the test-name filter and encountered pre-existing unrelated failures: the known parser inline-asm allocation leak and an unresolved _Home__JSC__ensureCurrentAtomStringTable symbol while linking home-tool. I stopped that unintended broad run. No new full-corpus total is claimed; the last storage-valid baseline remains 1,344 pass / 1 skip / 101 fail / 0 crash.

14 days ago

Port progress: pushed 7fca45a (fix(test): align zlib streams and virtual files).

This batch adds four logical runtime fixes without changing upstream corpus fixtures:

  • real RFC gzip members are decompressed through the existing native gzip bridge, with Z_DATA_ERROR wrapping and max-output enforcement;
  • zlib Transform backpressure now clears processed writable length and emits drain, allowing ReadStream -> zlib -> WriteStream pipelines to complete;
  • byte/sparse filesystem overlays are decoded by text reads, keeping fs.readFileSync and Bun.file(...).text() consistent;
  • unlinkSync records virtual-file existence before deletion clears the overlay, fixing Unix socket cleanup.

Focused results on the unchanged corpus:

  • js/sql/adapter-env-var-precedence.test.ts: 38/38 pass
  • js/node/zlib/zlib.kMaxLength.global.test.js: 8/8 pass
  • zlib real gzip fixture filter: 1 pass, 0 fail (2 upstream todos)
  • Brotli/Zstd fully-works-as-a-stream.Transform filter: 2 pass, 0 fail (2 upstream todos)
  • debug JSC build and formatting/diff checks pass

The full zlib.test.js now advances past both prior blockers and reaches the next independent mismatch: gzip/gunzip truncated input with finishFlush=Z_SYNC_FLUSH. That is the next zlib parity item; no fixture, timeout, or assertion was weakened.

14 days ago

Port progress: pushed e0ba121 (fix(test): use native flate codecs).

This removes the JSC corpus runtime dependence on synthetic marker frames for gzip, zlib-wrapped deflate, and raw deflate. The adapter now provides native std.compress.flate compression/decompression bridges, supports concatenated gzip members and zero padding, preserves partial output for finishFlush=Z_SYNC_FLUSH on truncated streams, and reports exact consumed compressed bytes so streaming decompressors handle trailing data and bytesWritten correctly.

Unchanged upstream corpus results:

  • js/node/zlib/zlib.test.js: 378 pass, 0 fail, 2 upstream todos
  • truncated-input matrix: 4/4 pass
  • premature-end/bytesWritten matrix: 18/18 pass
  • remaining eight non-leak zlib files: all pass (35 tests outside zlib.test.js and the leak file)
  • js/node/zlib/leak.test.ts: 8/8 pass after the full 10,000-iteration async/sync workloads, with zero reported RSS growth in every phase
  • complete nine-file zlib directory total: 421 pass, 0 fail, 2 upstream todos
  • debug JSC build, Zig formatting, and diff checks pass

No corpus fixture, workload, timeout, or assertion was changed.

14 days ago

Pushed 7a568caa4 (fix(test): preserve source lines through imports).

This removes the stale file-specific capture-stack-trace.test.js line-number correction. Generated corpus modules now publish their actual prelude line offset, V8 callsite normalization applies it only to the currently executing source file, and static import lowering preserves the exact newline count of the original import syntax (including multiline imports). A focused Zig regression now guards that newline invariant.

Validation on unchanged Bun corpus sources:

  • zig build debug -Denable_jsc=true passed.
  • js/node/v8/capture-stack-trace.test.js: 38 pass, 0 fail.
  • Full js/node/v8 directory: 43 pass, 0 fail.
  • Multiline-import js/sql/sqlite-url-parsing.test.ts: 176 pass, 0 fail.
  • js/node/zlib/zlib.test.js: 378 pass, 0 fail, 2 unchanged upstream todos.
  • git diff --check and zig fmt --check passed.

I also started the broad zig build test -Dfilter=home_test -Denable_jsc=true gate. It compiled the updated test artifact (including the new unit regression), then spent several minutes executing the entire large home_test artifact; I stopped that overbroad run after roughly seven minutes so it is not counted as a completed pass. No fixtures, assertions, workloads, deadlines, or expected results were weakened.

14 days ago

Pushed ee3387052 (fix(test): preserve corpus paths and DNS errors).

Two logical parity fixes landed together:

  • Corpus transforms now pass the real relative source path into the production Bun parser during both explicit-resource lowering and the final TypeScript strip. Previously the parser used its generic input.ts name, so __filename inside transformed modules became input.ts; file-relative reads then resolved outside the corpus. A focused adapter regression rejects that synthetic-name leak.
  • dns.lookupService(\"\", ...) now reports Bun exact empty-address validation contract, while non-IP strings retain the separate Node-compatible invalid-address message.

Validation on unchanged corpus files:

  • zig build debug -Denable_jsc=true passed.
  • js/node/events/event-emitter.test.ts: 67 pass, 0 fail (the readline/file-relative case now reads the real fixture).
  • js/node/dns/node-dns.test.js: 69 pass, 0 fail.
  • Full js/node/dns directory: 71 pass, 0 fail.
  • js/bun/resolve/lower-using-bun-target.test.ts: 11 pass, 0 fail.
  • Diff and formatter checks passed.

I also re-baselined regression/issue/26460.test.ts; it remains a distinct macOS /private/tmp versus /tmp shell-cwd normalization failure and was not hidden or folded into this source-identity change. No fixture, assertion, workload, deadline, or expected result was altered.

14 days ago

Pushed 3dc041f26 (fix(test): resolve package scripts without fixture shims).

This batch removes the file-specific execution paths for regression/issue/10132.test.ts and regression/issue/26460.test.ts. Shell execution now preserves canonical physical cwd paths (including macOS /private/tmp), resolves package scripts from the nearest real package.json, walks ancestor node_modules/.bin directories, executes ordinary output builtins through the general shell evaluator, and splits command sequences only at top-level separators so quoted/interpolated newlines remain intact.

Unchanged upstream results:

  • regression/issue/10132.test.ts: 2 pass, 0 fail
  • regression/issue/26460.test.ts: 4 pass, 0 fail
  • js/bun/shell/commands/echo.test.ts: 22 pass, 0 fail
  • js/bun/shell/assignments-in-pipeline.test.ts: 38 pass, 0 fail
  • js/bun/shell/file-io.test.ts: 25 pass, 0 fail
  • js/bun/shell/bunshell-instance.test.ts: 16 pass, 0 fail
  • js/bun/shell/exec.test.ts: 19 pass, 0 fail

The unchanged 128 MB regression/issue/10139.test.ts sourcemap workload is still running separately; it has not been weakened or replaced.

14 days ago

Pushed 77fa1483d (fix(test): write binary build fixtures natively).

This removes the file-specific regression/issue/10139.test.ts shell-build handler. Binary tempDirWithFiles entries now cross a native typed-array write bridge instead of expanding into JavaScript number arrays and UTF-8 strings, sourcemap traversal skips binary loader assets, and shell bun build commands route through the shared CLI build implementation.

The unchanged upstream 128 MB workload now completes in 1.56 seconds:

  • regression/issue/10139.test.ts: 2 pass, 0 fail
  • bundler/bun-build-compile-sourcemap.test.ts: 9 pass, 0 fail
  • bundler/compile-sourcemap-internal.test.ts: 1 pass, 0 fail
  • regression/issue/10132.test.ts: 2 pass, 0 fail

A broader bundler/bun-build-api.test.ts probe now gets past its relocated module-comment snapshot but still stops at the next independent gap: Home currently returns the placeholder artifact hash home-88424 where Bun expects its content hash est79qzq. That remains real follow-up work; no snapshot or assertion was changed.

14 days ago

Split the canonical BuildArtifact.hash parity work into focused follow-up #625 so it can be completed without hiding it inside the umbrella tracker.

14 days ago

Pushed f88370c (fix(test): align global events and native build outputs) directly to main.

This batch removes three current parity failures at their shared implementation boundaries:

  • global event dispatch now always routes through Home’s realm-owned EventTarget instead of calling JavaScriptCore host functions with an incompatible receiver; MessageEvent now initializes inherited Event state
  • per-file process setup uses an internal global process reference, so default process imports no longer trigger a temporal-dead-zone failure before module evaluation
  • native Bun.build results are read back from the physical output and synchronized into the virtual filesystem, with correct CSS output path/type/kind metadata

Unchanged upstream corpus results after the fix:

  • js/web/web-globals.test.js: 21/21
  • js/web/workers/message-event.test.ts: 10/10
  • js/web/workers/worker_blob.test.ts: 5/5
  • js/node/process/call-constructor.test.js: 2/2
  • internal/int_from_float.test.ts: 4/4
  • regression/issue/08757.test.ts: 1/1
  • js/bun/shell/env.positionals.test.ts: 6/6

The focused BuildArtifact hash parity work remains tracked in #625; no hash special-case was added.

14 days ago

Porting update: pushed f0013d6 (fix(test): lower TypeScript and canonicalize Blob MIME types) directly to main.

Logical parity changes:

  • Route ordinary typed Bun corpus modules through the production Bun TypeScript parser/printer before compatibility rewriting, with safe fallback for syntax the production parser does not yet accept.
  • Preserve the structural optional-parameter marker fallback without fixture-specific source substitutions.
  • Compare URL and URLSearchParams values by their canonical serialized values in deep equality.
  • Resolve Bun.file before Blob in toHaveLength so a missing file throws instead of being treated as an empty Blob.
  • Port the special MIME canonicalization cases from Bun MimeType.Compact.toMimeType, preserving custom MIME values such as text/foo while canonicalizing JavaScript, JSON, CSS, HTML, plain text, WebAssembly, JSX, and URL-encoded bodies.
  • Apply the same canonical MIME handling at Blob structured-clone deserialization boundaries.

Unchanged upstream focused results:

  • js/bun/test/expect.test.js: 398 pass, 10 todo
  • js/bun/test/spyMatchers.test.ts: 145 pass, 5 todo
  • js/web/fetch/blob.test.ts: 26 pass
  • js/web/structured-clone-blob-file.test.ts: 36 pass
  • js/bun/test/expect-extend.test.js: 28 pass
  • regression/issue/10380/spy-matchers-diff.test.ts: 5 pass
  • js/web/fetch/blob-file-name-ownership.test.ts: 1 pass
  • js/web/workers/message-event.test.ts: 10 pass
  • js/web/workers/worker_blob.test.ts: 5 pass
  • js/bun/shell/env.positionals.test.ts: 6 pass
  • internal/int_from_float.test.ts: 4 pass

Validation: zig build debug -Denable_jsc=true, zig fmt --check, and git diff --check all pass. The full umbrella suite was intentionally not rerun for this batch; the previously recorded 101-failure total is stale and must not be treated as current.

14 days ago

Pushed 2e7f13294 (fix(test): preserve archive and timeout ownership) directly to main as Chris Breuer.

This batch closes three reproduced semantic gaps without changing upstream fixtures or assertions:

  • Bun.Archive now snapshots entry bytes at construction, so later mutation of the source typed array cannot mutate archive contents.
  • Express res.sendFile() now stats candidates before reading and classifies directories as 404s instead of serving them as empty/opaque files.
  • Client-side TLS identity-check failures now reject fetch() instead of being routed through the server request-handler error path.
  • Bun.sleep() now participates in ordered timer scheduling, allowing an earlier AbortSignal.timeout() deadline to win over a longer response-body sleep while preserving independent sleep completion.

Validation on unchanged vendored Bun tests:

  • js/bun/archive.test.ts: 101 pass, 1 upstream todo
  • js/third_party/express/res.sendFile.test.ts: 39 pass, 11 upstream todos
  • js/web/fetch/fetch.tls.test.ts: 21 pass
  • js/web/fetch/fetch-tls-abortsignal-timeout.test.ts: 6 pass
  • js/web/timers/setTimeout.test.js: 30 pass, 1 upstream todo
  • js/web/timers/performance.test.js: 7 pass
  • js/node/timers/node-timers.test.ts: 20 pass
  • js/web/timers/setInterval.test.js: 8 pass
  • js/web/timers/setImmediate.test.js + setImmediate2.test.ts: 4 pass
  • js/node/timers.promises/timers.promises.test.ts: 4 pass
  • js/bun/test/test-timers.test.ts: 1 pass

Also clean: zig build debug -Denable_jsc=true, zig fmt --check, and git diff --check. The full-suite total has not been rerun yet, so the older aggregate should still be treated as stale. Continuing with the next reproduced failures; artifact hashing remains tracked separately in #625.

14 days ago

Pushed 2577960fc (fix(test): align HTTP body and upload semantics) directly to main.

This batch ports four related Bun/Node behaviors without changing upstream fixtures or workloads:

  • accepts repeated identical Content-Length values while continuing to reject malformed or conflicting framing;
  • preserves already-materialized byte arrays during multipart serialization, including exact uploaded file bytes;
  • distinguishes a merely locked request body from a disturbed/consumed body after reader.read();
  • recognizes Home branded large Buffers in Node fs writes, preserving the full 128 MiB upload/sendfile/hash round trip.

Fresh focused coverage:

  • request-smuggling.test.ts: 59 pass
  • FormData.test.ts: 129 pass
  • FormData-multipart-serialization.test.ts: 3 pass, 1 upstream todo
  • FormData-file-error-leak.test.ts: 1 pass
  • form-data-boundary-crash.test.ts: 5 pass
  • form-data-set-append.test.js: 4 pass
  • http-server-chunking.test.ts: 11 pass
  • client-fetch.test.ts: 29 pass, 2 upstream todos
  • body-mixin-errors.test.ts: 2 pass
  • fetch-file-upload.test.ts: 6 pass (including unchanged 128 MiB sendfile workload)
  • buffer-concat.test.ts: 14 pass
  • bun-cryptohasher.test.ts: 397 pass
  • test-fs-write-file-flush.js: 6 pass

The previously identified canonical BuildArtifact hashing mismatch remains separately tracked in #625.

14 days ago

Pushed a8d4529a7 (fix(test): decode deflate and protocol-relative redirects) directly to main.

This ports two connected Bun fetch behaviors:

  • Content-Encoding: deflate now detects a valid zlib header and otherwise uses the native raw-deflate decoder, matching Bun support for both wrapped and raw deflate responses;
  • redirect locations beginning with ://host/path now inherit the current HTTP(S) scheme during fetch redirect resolution, matching Bun’s protocol-relative handling without mutating the original Response.redirect() header.

Fresh validation:

  • fetch.stream.test.ts: 110 pass, 5 upstream todos
  • fetch-gzip.test.ts: 24 pass
  • fetch-redirect.test.ts: 2 pass
  • fetch.brotli.test.ts: 1 pass
  • client-fetch.test.ts: 29 pass, 2 upstream todos
  • node/zlib/zlib.test.js: 378 pass, 2 upstream todos
  • node/zlib/deflate-streaming.test.ts: 1 pass

The canonical BuildArtifact hash work remains tracked in #625.

14 days ago

Pushed 8a09a47cc (fix: preserve asm ownership and literal unions) directly to main.

A refreshed full native run exposed two current correctness failures that the older aggregate did not isolate cleanly, and this batch fixes both without fixture exceptions:

  • operand-form inline asm now owns and releases output/input expression trees, owned operand/clobber slices, and concatenated adjacent instruction text while preserving borrowed lexer slices;
  • TypeScript generic inference now dispatches union containers before aggregate literal flags, so heterogeneous conditional literals such as "a" | 10 are not incorrectly collapsed to string and rejected with TS2345.

Added regressions cover adjacent asm strings with named input/output operands plus multiple clobbers, and constrained/unconstrained generic calls with heterogeneous conditional literal unions.

Fresh validation:

  • parser test artifact: pass, allocator leak check clean
  • AST test artifact: pass
  • full TypeScript checker artifact: pass
  • TypeScript conformance artifact: 1,419 pass
  • the refreshed runtime artifact also completed 1,823 pass, 19 skip, 0 fail before this batch; the wider umbrella run continues to expose independent build/corpus work, including the separately tracked BuildArtifact hash gap in #625.
14 days ago

Pushed 7b79c9b (fix(runtime): bound diffs and tool JSC callbacks) directly to main as Chris Breuer, with no coauthor.

Completed two independent parity fixes:

  • home-tool no longer assumes Bun private JSC callback machinery when it intentionally links Zig-JS or system JavaScriptCore. linkBunNative now reports whether the pinned Bun/WebKit graph actually linked, use_bun_jsc records that backend invariant, and AtomStringTable repair remains active only for the Bun-native realm. zig build home-tool, zig build home-tool-smoke, and two zig build debug -Denable_jsc=true builds pass.
  • Closed #622. Myers diff trace storage is now deterministically bounded at Bun effective 64 MiB ceiling with overflow-safe arithmetic and a unit regression. The unchanged upstream typed-array assertion file passes 45/45. Home and pinned Bun match the measured boundary exactly: 104 replacements emit the full 940-line diff; 105 emit the 55-line bounded fallback. No corpus/fixture/assertion/deadline/workload changes.

The wider umbrella run got past its previously reported runtime count (1823 passed; 19 skipped; 0 failed) but exposed a new hard blocker in the expansion-tail bootstrap mini-suite. It stayed in recursive JSC microtask draining for over an hour and reached 16.3 GiB resident / 17.8 GiB peak, so I sampled and stopped it. Focused issue #626 records the stack, first hanging unchanged text-encoder corpus path, later util-inspect hang, and no-workaround acceptance criteria.

#625 remains open for the canonical BuildArtifact content hash mismatch (home-88424 / native r00pwt21 vs est79qzq); no expected-hash special case was introduced.

14 days ago

Parity batch 6ce4fe1 is now on main; focused tracker #626 has the detailed measurements.\n\nThis ports native TextEncoder.encodeInto and non-streaming UTF-8 TextDecoder paths into the Home JSC globals, preserves ArrayBuffer/DataView/typed-array and detached-buffer semantics in the corpus runtime, and mirrors Bun indirect circular-reference collapsing in util.inspect.\n\nVerified unchanged corpus totals: 183 encoding passes, 0 failures, 2 existing todos; util.inspect long-running passes in about 1.6 seconds instead of 31.94 seconds with max RSS reduced from 7.35 GB to about 616 MB. Broader focused inspect output checks also have 0 failures. Debug JSC build passes.\n\n#626 remains open until the complete expansion-tail and wider umbrella runs traverse beyond the previous blockers; the available build-level filter did not honor a Zig test-name filter.

14 days ago

Lifecycle follow-up 399bb5f is now on main after rebasing over the concurrent #624 series. It removes the test-only JSGlobalContextRelease suppression, so each bootstrap corpus realm is actually destroyed.\n\nFull unfiltered home_test result after 6ce4fe1 + 399bb5f: 1,330 passed, 1 skipped, 118 failed out of 1,449 tests in 24m18s. This is the first run here to complete the expansion-tail suite and traverse all later tests; #626 is closed.\n\nObserved remaining failure families include N-API addon compilation using pre-C++20 flags, package-manager logical contracts, one child_process spawnSync contract, unsupported ESM syntax in several HTTP proxy files, async HTTP/HTTP2 event-loop completion, HTTP2 response/socket lifecycle assertions, and a WebCrypto generateKey rewrite gap. These are now actionable parity failures rather than an umbrella hang.

14 days ago

Progress update:

  • Landed and pushed b49ba22d0 (fix(test): lower Node proxy helper imports) directly to main as Chris Breuer, without coauthors.
  • Generalized the static import lowerer for the Node proxy helper and canonicalized the .mjs fixture alias to the already-registered fixture module.
  • Two unchanged files that previously stopped at unsupported module syntax now execute cleanly:
    • test-http-proxy-request-connection-refused.mjs — exit 0
    • test-http-set-global-proxy-from-env-https-request.mjs — exit 0
  • The neighboring unchanged proxy POST failure case now gets past parsing but exposes a separate target-reset teardown loop. Tracked with reproduction, measurements, and strict acceptance criteria in #628.
  • The latest complete unfiltered corpus baseline remains 1330 pass / 1 skip / 118 fail (1449 total); the next full run will follow the next logical batch rather than rerunning the long suite after this small focused change.

No corpus fixtures, assertions, deadlines, payloads, or workloads were changed.

14 days ago

Follow-up on #628: after rebasing b49ba22d0 onto current main and rebuilding from source, the unchanged proxy POST target-reset case is reproducibly green. It returns the expected ECONNRESET: socket hang up, emits the 500 response, and exits cleanly; 10 consecutive runs completed in roughly 0.11–0.14 seconds. Temporary diagnostics were removed and the worktree is clean. #628 is closed with the exact caveat that no dedicated HTTP source commit can be credited for the disappearance of the earlier runaway.

Additional unchanged focused controls are green:

  • js/bun/spawn/spawnSync.test.ts: 5 pass / 0 fail / 1 upstream skip
  • js/bun/crypto/wpt-webcrypto.generateKey.test.ts: 10,226 pass / 0 fail

This narrows the full-suite child-process and WebCrypto failures to other integration/rewrite cases rather than these core contract files.

14 days ago

Correction to my previous #628 follow-up: the green proxy runs used absolute files under ~/Code/bun, which exercise Home’s full VM. The parity artifact uses the copied packages/runtime/test/bun-corpus path and reduced adapter. On the correct reducer path, the POST target-reset case still recurses and reached 3,554,720 KB RSS in 36 seconds before termination. I reopened #628 with the corrected reproduction. No workaround or test-specific branch was retained.

The full-VM spawnSync and WebCrypto controls remain useful evidence about their native implementations, but they do not clear the reduced-adapter integration failures from the 1,449-test baseline.

14 days ago

Pushed 2edc96ed2 (fix(test): enforce Node callback lifecycles) to main as Chris Breuer, with no coauthors.

This batch closes several reducer correctness gaps without changing Bun fixtures:

  • implements Node common.mustCall, mustCallAtLeast, and mustSucceed bookkeeping with exact/minimum call-count validation;
  • keeps the bounded adapter event-loop checkpoints running while required callbacks or referenced net/HTTP/TLS/HTTP2 handles remain;
  • reports unmet callback counts and identifies referenced registry entries instead of accepting false zero-test passes;
  • resets both Node HTTP server registries between files and makes them visible to lifecycle ownership checks;
  • lowers both worker_threads and node:worker_threads through the generic named-import path;
  • formats synchronous proxy-child URL failures with the Node console.error error header/stack contract;
  • adds a permanent reducer regression covering one unmet exact count and one fulfilled two-callback sequence.

Validation:

  • zig build debug -Denable_jsc=true passed;
  • the home_test artifact compiled successfully; its long execution phase was intentionally interrupted rather than starting another full 24-minute run;
  • a synthetic unchanged-style Node file correctly failed with Expected exactly 2, actual 1;
  • isolated copied reducer passes:
    • test-http-proxy-request-invalid-url.mjs;
    • test-http-proxy-request-connection-refused.mjs;
    • test-http-proxy-request-max-sockets.mjs;
    • test-http-proxy-request-socket-keep-alive.mjs;
  • invalid URL + max-sockets + keep-alive also pass together in one invocation, confirming HTTP registry isolation.

The stricter lifecycle contract exposed real remaining transport work rather than masking it. I split that work into focused issues:

  • #628 now uses the corrected copied reducer paths and covers both successful and target-reset POST forwarding recursion;
  • #629 tracks worker-backed sanitized-URL proxy completion (message 1/2, no worker exit, nested completions missing);
  • #630 tracks HTTPS proxy, port-specific NO_PROXY, reset-to-500, and IPv6 nested transport lifecycles.

The last full baseline remains 1,330 pass / 1 skip / 118 fail; I did not rerun it for this batch because the newly compiled full artifact would still take roughly 24 minutes and the focused transport failures are now reproducible directly.

14 days ago

Pushed b1fa1d017 (fix(test): align proxy URL and connection handling) to main as Chris, with no coauthors. This closes #629: string-form HTTP request URLs now apply WHATWG/Node ASCII tab/CR/LF preprocessing; object-form host and port validation stays strict; and HTTP proxy plus HTTPS CONNECT headers now use Buns real Agent reuse condition (keepAlive or finite maxSockets). Validation: debug JSC build passed; unchanged HTTP and HTTPS sanitized-URL cases passed; combined sanitized-URL + max-sockets + socket-keep-alive passed (3 files, 0 failures, 0 unsupported); HTTP and HTTPS invalid-character option cases passed (2 files, 0 failures, 0 unsupported). The broader general-proxy hang and IPv6 routing failure remain tracked in #630; no fixture assertions, workloads, or deadlines were changed.

14 days ago

Pushed 0eeca8a4e (fix(test): prevent recursive proxy forwarding) to main as Chris with no coauthors, closing #628 and #630. Valid IPv6 literals now route instead of failing DNS label validation, and agent: false/custom-connection upstream requests no longer inherit NODE_USE_ENV_PROXY and recurse. Validation: complete HTTP proxy tranche passed 30/30 unchanged .mjs files in 3.8 seconds; both POST proxy cases passed together in 0.2 seconds; the five #630 acceptance cases passed together in 0.6 seconds. A full HTTPS proxy tranche then passed 10/17 and isolated seven remaining tunnel failure/reuse lifecycle cases, now tracked in #631. No fixture assertions, workloads, or deadlines changed.

14 days ago

Pushed 36b99ce78 (fix(test): complete HTTPS proxy tunnel lifecycles) to main as Chris with no coauthors, closing #631. CONNECT now handles Basic auth, exact response parsing, non-200 and premature-end errors, request/Agent timeouts, tunneled TLS trust, finite-socket queuing, and keep-alive reuse; simulated child requests retain correct Agent isolation and exit/error output. Added a permanent 17-file HTTPS proxy tranche. Final validation from the committed source: HTTPS proxy 17/17 passed and HTTP proxy 30/30 passed, both with zero failures and zero unsupported; debug JSC build and Zig formatting checks passed. No fixtures, assertions, workloads, or deadlines changed.

14 days ago

Pushed e6e7aab (fix(test): preserve native build artifact identity).

Completed #625:

  • Preserved upstream test/... module identities across the mirrored corpus boundary with native resolver/load hooks.
  • Routed compatible JS/JSX disk builds through Home’s production Bun.build implementation and returned real native artifact hashes and metadata.
  • Preserved sourcemap object linkage and structured native BuildMessage warning positions.
  • Ported Bun’s React 18.3.1 root test dependency through package.json, pantry.json, and pantry.lock, with the native child resolver pointed at Pantry.

Validation:

  • JSC debug build passed.
  • Unchanged bundler/bun-build-api.test.ts: 45 pass, 0 fail, 0 unsupported, 3 upstream todos, including artifact hash, entry naming, sourcemap, Response, and JSX warning cases.
  • Parent NODE_PATH was explicitly unset during the green run.

The neighboring unchanged bundler/cli.test.ts now reaches a separate nested standalone outfile failure; tracked as #632.

14 days ago

Parity progress: closed #632 via f975227, now pushed to main.

Home now runs compatible single-entry Bun-target standalone builds through the production compiler instead of the corpus placeholder/bundle simulation. Logical CLI entrypoints are resolved without duplicating an already-present logical cwd, so both shallow and deep nested --outfile paths are created by the native compiler and the generated executables run successfully.

Unchanged upstream validation:

  • bundler/cli.test.ts: 15 pass, 0 fail, 0 unsupported, 2 todos
  • bundler/bun-build-api.test.ts: 45 pass, 0 fail, 0 unsupported, 3 todos
  • native debug build, diff check, and Zig formatting check all pass.

This is a real production-path port for #632, not adapter-emulated success.

14 days ago

Landed #635 in 6fe245d: native Buffer validators and SIMD encoding parity.

This closes the seven Home-only failures previously recorded for js/node/buffer.test.js without workarounds. The reduced JSC realm now installs native isAscii/isUtf8 functions with Bun-compatible call and construct behavior, routes hex/latin1 conversion through native encoding, enables the copied Bun SIMD policy, and derives public version/SHA/debug metadata from the pinned build configuration. The fake throughput subprocess output and exact-source rewrite were removed.

Post-push verification on current main:

  • debug native-JSC build: pass
  • true ReleaseFast native-JSC build: pass
  • unchanged upstream Buffer file, debug: 506 pass / 1 upstream debug skip / 0 fail
  • copied Buffer corpus, debug: 506 pass / 1 todo / 0 fail / 0 unsupported
  • unchanged upstream Buffer file, ReleaseFast: 507 pass / 0 fail; 28,365 expectations and real throughput benchmark executed
  • copied Buffer corpus, ReleaseFast: 507 pass / 0 fail / 0 todo / 0 unsupported

#621 has the baseline-row update. I did not rerun the full corpus scan in this batch, so this does not claim overall suite completion.

14 days ago

Bun parity progress landed on main:\n\n- closed #636 with a real Highway SIMD source-map decoder and Bun scoped Debug logging\n- a380b8b ports the native decoder, scalar fallback state, feature flag, logger activation, and Zig 0.17 compatibility\n- 05cc558 routes the tracked runtime-owned test through Home native VM automatically\n\nValidated without changing test source, assertions, timeouts, or workloads:\n- source-map SIMD upstream: 24/24 in Debug and ReleaseFast\n- tracked copy: 24/24 in Debug and ReleaseFast\n- marker proof: Debug SIMD child emits simd consumed; forced scalar child does not\n- ReleaseFast compiles the scoped marker out\n- both Debug and true ReleaseFast builds complete cleanly\n\nAdditional current spot checks recorded on #621 show sourcemap, typed-array assert, node:module, string_decoder, and fs.watch rows passing. Full-suite parity remains open; #454 is still the correct real implementation track for the two node:vm sourceURL failures.

14 days ago

Bun parity progress pushed directly to main as Chris, without coauthors:

  • #638 / 635328f35776eada816ad7f65da5894a9cea7f05 ports Bun’s shared, case-insensitive crypto algorithm alias resolution across createHash, crypto.hash, Bun.CryptoHasher, and HMAC keys.
  • #637 / d8cdf06d88abf37cfa12af4ec3f4a6fc4084c9f2 ports node:fs ownership sentinels, two-pass vector snapshotting, async backing-store pin/release, and buffer-path pinning.

Unmodified upstream validation:

  • js/node/crypto/node-crypto.test.js: 187 pass / 0 fail in Debug and true ReleaseFast (was 159/28)
  • js/node/fs/fs.test.ts: 262 pass / 0 fail / 7 upstream platform skips in Debug and true ReleaseFast (was 258/4; 5,405 assertions)
  • js/bun/util/bun-cryptohasher.test.ts: 397 pass / 0 fail in both modes (55,642 assertions)
  • checked-in crypto copies: 187/0 and 397/0 in Debug
  • exact Debug and true ReleaseFast builds: clean

No assertions, workloads, deadlines, source tests, or skip conditions were changed. The checked-in fs copy’s reduced directory layout still lacks Bun’s surrounding test/ fixture, so I did not mask that with a fake fixture or claim a green mirrored run; the authoritative unmodified upstream file is green. Aggregate full-suite parity remains open, with #621 updated from fresh row measurements.

14 days ago

HTTP/2 protocol-conformance checkpoint landed on main in 7b12502.

Ported and verified together:

  • strict SETTINGS, PING, GOAWAY, PRIORITY, RST_STREAM, WINDOW_UPDATE, stream-state, and max-frame validation
  • incremental HEADERS and CONTINUATION reassembly with HPACK synchronization and strict header validation
  • inbound and outbound PUSH_PROMISE, including reserved-stream lifecycle, sensitive headers, oversized block fragmentation, and client push events
  • corrected GOAWAY last-stream semantics and network byte order
  • deferred inbound JS stream creation so rejected headers do not surface invalid application streams
  • cleanup for server pushes rejected before being announced on the wire

Exact upstream fixture results, with no test changes:

  • h2-conformance.test.ts: 23 pass / 0 fail
  • five-file Debug matrix: 329 pass / 6 upstream-authored memory-leak skips / 0 fail / 12,246 assertions
  • five-file ReleaseFast matrix: 329 pass / 6 upstream-authored memory-leak skips / 0 fail / 12,246 assertions
  • Debug build: 21/21 steps
  • ReleaseFast build: 21/21 steps

Closed focused tranches #425 and #426. Updated #420 with GOAWAY and teardown progress and left it open for its remaining broader criteria. Updated #621 to clear the stale node-http2.test.js crash row. The overall Bun parity goal remains active.

14 days ago

HTTP/2 corpus configuration tranche landed on main in https://github.com/home-lang/home/commit/25feaf2f4690bbb4b82a1cd5e4e8cabddcf66d11.

What changed:

  • Full-VM Bun corpus targets now execute from the mirrored corpus root, matching upstream test/bunfig.toml discovery and preload.ts behavior.
  • Root, directory, single-file, and multi-file corpus arguments are normalized before native TestCommand execution.
  • Removed stale failure expectations for node-http2.test.js, h2-conformance.test.ts, and node-http2-invalid-padding.test.ts.
  • No Bun test source, assertion, workload, deadline, skip, or module-loader semantic was changed.

Verification:

  • Debug exact five-file HTTP/2 matrix: 329 pass / 6 upstream memory-leak skips / 0 fail / 12,246 assertions.
  • ReleaseFast exact five-file matrix: 329 pass / 6 upstream skips / 0 fail / 12,246 assertions.
  • ReleaseFast directory target: 343 pass / 6 upstream skips / 0 fail across 6 files.
  • Maintained non-full-VM checks: 287 pass / 6 todo, 23 pass, and 7 pass respectively; 0 fail / 0 unsupported.
  • Adjacent require/ESM regression batch: 6 pass / 0 fail.
  • zig build test -Dfilter=bun-corpus: pass.

Closed #620 after correcting its root cause and closed #427 after satisfying the full-matrix acceptance criteria.

Broad-suite note (not caused by this two-file change): an unfiltered zig build test exposed an existing parser diagnostic golden mismatch (37_ast_check_agreement.home), one Bun static hash-class test failure, and then slept in an unrelated SQL-oriented test child for roughly 15 minutes; the verification run was stopped after scoped gates had completed.

14 days ago

Port update — CryptoHasher key semantics + parser diagnostic integrity

Pushed commit e207ca3 to main.

What changed:

  • Fixed the unit-realm Bun.CryptoHasher shim so omitted/null HMAC keys remain ordinary hashes, matching pinned Bun.
  • Preserved explicit empty string/byte keys as empty-key HMAC inputs.
  • Fixed CryptoHasher.copy(): an unkeyed SHA-256 copy no longer silently becomes HMAC-SHA-256.
  • Split the combined static-hash assertion into independently attributable Bun contracts and added null/empty-key vectors.
  • Added -Dhome-rt-test-filter for exact runtime regression selection.
  • Repaired the stale AST/check diagnostic fixture: bodyless functions are valid Home forward declarations, so the malformed case now uses a trailing comma.
  • Added direct parser coverage proving bodyless functions are marked as forward declarations and the following declaration is preserved.

Verification:

  • Pinned Bun comparison: omitted/null keys produce SHA-256; explicit empty keys produce the expected HMAC-SHA-256 vector.
  • Exact filtered runtime artifact: 4/4 passed.
  • Full home_rt artifact: 1,824 passed, 19 Zig-level skips, 0 failed.
  • Parser package selection: 145/145 passed.
  • Diagnostic snapshots: 95/95 passed.
  • zig fmt --check and git diff --check passed.

The project-wide Pickier invocation was attempted, but the lint runner hung without output and left its Bun process alive; that specific process was terminated. The compiler/runtime verification above completed cleanly afterward.

Overall Bun parity remains incomplete; this removes one real semantic mismatch and one stale broad-suite blocker without weakening any test.

14 days ago

Published two parity commits directly to main, authored solely by Chris Breuer with no coauthors:

  • d2cd9444c — preserves Error source divots across realms and eval. Unchanged vm-sourceUrl.test.ts is now 3/3 in Debug and ReleaseFast; subclasses, cross-realm Error objects, and eval sourceURL retain their pinned new columns while ordinary same-realm builtin errors use the callee column.
  • aace34384 — completes reproducible lock-pinned provisioning for both unchanged corpus file: dependencies. #618 is closed with full evidence.

Verification:

  • ReleaseFast primary VM/process/zlib/React matrix: 179 pass / 1 upstream skip / 3 upstream TODOs / 0 fail, 493 assertions.
  • Debug combined matrix: all VM, process, zlib, React, and Svelte bundling cases passed; only the separately isolated spawned HTML server case failed.
  • React/Markdown: Home 68/68 in Debug and ReleaseFast; pinned Bun 68/68.
  • Svelte bundling: 1/1 in Debug and ReleaseFast; pinned Bun consumer matrix totals 70/70.
  • Adjacent error printer: 87 pass / 1 filtered / 0 fail in ReleaseFast. The remaining filtered dynamic-import BuildMessage failure is #640.
  • Exact full-VM lifecycle now provisions, loads the unchanged harness, starts Verdaccio, and runs all 60 tests. Home reaches 24 pass / 36 implementation failures; the dominant npm_manifest_test_helpers.parseManifest binding gap is now the next implementation target. The pinned release canary reaches the same 60 tests but lacks its test-only internal module, so its 20/40 result is not treated as a passing baseline.
  • git diff --check, script syntax, Zig formatting for the touched VM file, Debug build, ReleaseFast build, and repeated frozen/idempotent provisioning all passed.

Focused follow-ups: #640 for structured BuildMessage preservation and #641 for spawned Svelte HTML dev-server reachability. The full 267-file js/node scan was not rerun; #621 was updated only with directly measured resolved rows. Complete Bun parity remains unfinished.

14 days ago

Published the next two-feature parity batch directly to main, authored solely by Chris Breuer with no coauthors:

  • 988b757fc connects the real npm_manifest_test_helpers.parseManifest internal binding and ports its dormant implementation to current Zig filesystem/list APIs.
  • 54684429c preserves parser BuildMessage diagnostics in the concurrent transpiler instead of letting JSC replace them with a plain SyntaxError.

Measured results:

  • Unchanged js/bun/util/inspect-error.test.js: 10/10, six snapshots, in Debug and ReleaseFast. #640 is closed.
  • Exact Verdaccio-backed lifecycle file: improved from 24/36 to 48 pass / 12 fail / 699 assertions in both Debug and ReleaseFast.
  • Complete runtime unit target: 1,824 pass / 19 existing Zig skips / 0 fail across 1,843 tests.
  • Debug and ReleaseFast builds, Zig formatting, diff checks, and clean-worktree verification passed.

The remaining lifecycle surface is split into focused issues instead of being collapsed into this tracker: #642 for native pm trust/untrusted, #643 for exact trusted-dependency identity/source rules, and #644 for the temporary node-gyp self-executable path. #518 contains the narrowed installer checkpoint; #618 remains closed as provisioning-complete.

No corpus source, snapshots, fixtures, assertions, workloads, deadlines, or PATH setup were changed. Complete Bun parity remains unfinished.

14 days ago

Checkpoint pushed to main: 7774c52 (native trust/remove dispatch) and 78cad9f (active-runtime temporary Bun shim). No corpus assertions, timeouts, workloads, or skips changed. Verification: Debug and ReleaseFast focused lifecycle batch 5/5 with 100 assertions; unchanged full lifecycle file 54 pass / 6 fail / 758 assertions in both modes; runtime units 1,824 pass / 19 existing skips / 0 fail across 1,843. #642 and #644 are closed. #643 is narrowed to six exact trusted-dependency identity/source rules; its prior unhoisted case now passes through the native trust path.

14 days ago

Progress: pushed df4dff8 and closed #643. The unchanged Bun lifecycle-script corpus is now fully green in Home: 60/60 tests, 808 assertions, 0 failures in both Debug and ReleaseFast. The batch enforces full trusted-package keys, resolved npm names rather than aliases, root/workspace-only non-npm trust, canonical registry tarball sources, fail-closed legacy binary trust records, explicit node-gyp trust propagation, and canonical npm-name persistence in text lockfiles. Additional gates: focused security slice 6/6 (77 assertions) in both modes; runtime suite 1,824 passed / 19 existing skips / 0 failed; both builds, formatter, and diff hygiene pass; manual alias lockfile round trip passes in both modes. No test corpus edits, skips, deadline/workload reductions, or weakened assertions. Related checkpoint: #518.

14 days ago

HTML entrypoint/dev-server parity batch landed in f2b5792 and closes #641.

This ports two coupled behaviors: Home now dispatches .html as a native runtime entrypoint (implicit and explicit run), and the Home-owned VM sets Bun main_is_html_entrypoint from the configured loader so the real internal HTML bootstrap starts and retains Bun.serve/Bake.

Unchanged upstream Svelte corpus results:

  • Debug: 2 pass, 0 fail, 4 assertions.
  • ReleaseFast: 2 pass, 0 fail, 4 assertions.

Also verified both builds, 1,824 runtime units passed with 19 existing skips and 0 failures, the focused CLI unit passed, and an ungated direct HTML launch returned HTTP 200 text/html on a requested custom port. No fixture, deadline, retry, server substitution, or assertion changes.

14 days ago

Advanced the strict native js/node corpus and refreshed its complete 267-file baseline on main with 2fc1d72e8 (fix(test): preserve explicit corpus file paths), authored and committed solely by Chris Breuer.

Fresh bounded scan:

SUB=js/node pass=260 fail=6 crash=0 hang=0 deps=0 oom=1 total=267

This supersedes #621's historical 233/25/6/3 baseline. The scanner no longer copies enormous Debug logs into a Bash variable, exports Bun's canonical Debug quiet flag before launch, and completed with flat supervisor RSS. The former three hang rows are all cleared: DNS 69/69, unchanged 4 GiB HTTP backpressure 1/1 standalone, and release-strength worker heap-snapshot/GC stress 15 processes × 300 snapshots.

The dispatcher now retains ./ after rebasing explicit corpus files to the corpus root, preserving explicit-file semantics for nonstandard companion names. Unchanged upstream results now pass:

  • HTTP CONNECT: 6 pass / 4 upstream TODO / 0 fail (nested companion 7/7)
  • HTTP proxy URL: 2/2 (nested companion 3/3)
  • streams: 65 pass / 5 upstream TODO / 0 fail
  • child-process IPC large disconnect: 1/1 with exact stdout

All seven remaining scanner non-passes are classified: backpressure passes unchanged but exceeds the scanner's intentional 4 GiB RSS ceiling; process immediately replays 102/0; double-connect, readline, and TLS exactly match pinned Bun's current failures; the two Home-only failures are a physical mirror-root mismatch tracked in new #646. No tests, assertions, workloads, deadlines, or skips changed, and no installed runtime was used for Home results.

Verification: Debug build 21/21, focused dispatcher unit, exact suites above, full 267-file scan, zig fmt --check, bash -n, and git diff --check. #621 is closed as its measured crash/hang triage is complete; #646 and this parent remain open because 100% whole-suite logical parity is not complete.

14 days ago

Checkpoint: real Bun checkout topology is now landed on main in 65f3065; focused issue #646 is complete.

This batch moved the byte-identical mirror to packages/runtime/test/test, added the Bun-root test configuration at packages/runtime/test/bunfig.toml, and changed dispatch to run from the matching parent root with explicit ./test/... paths. All sync/provision/scanner paths, source-path normalization, docs, and path-dependent native regressions were updated. No corpus fixture was modified and no alias, skip, weakened assertion, workload reduction, or timeout workaround was introduced.

Current verified js/node baseline under the restored topology:

  • 263 pass
  • 3 fail, all reproduced on the pinned Bun binary: double-connect, readline.node, node-tls-connect
  • 0 Home-specific failures
  • 0 crashes
  • 0 hangs
  • 0 dependency failures
  • 1 unchanged scanner OOM classification for the 4 GiB HTTP backpressure case; the exact test passes standalone

Additional verification: Debug and ReleaseFast builds are 21/21; fs.test.ts is 262 pass / 7 upstream platform skips / 0 fail / 5,405 assertions in each configuration; pause-stdin is 1/1; CONNECT, proxy URL, stream, all 10 path-dependent native regression suites, and bundler-core-itbundled (318 pass / 16 upstream TODO / 0 fail) pass.

Whole Bun-suite parity is still incomplete, so this umbrella remains open. The next work should continue expanding measured corpus coverage and resolving genuine Home-specific gaps outside this now-clean js/node slice.

14 days ago

Port checkpoint pushed in 3588ec9 (fix(runtime): preserve decoder and method state).

This closes two real Web API/runtime gaps without corpus substitutions or reduced workloads:

  • Native TextDecoder now owns its WebKit TextCodec across streaming calls and releases/resets it on flush or finalization. Split Big5, Shift_JIS, EUC-JP, EUC-KR, GBK, GB18030, and ISO-2022-JP sequences now preserve decoder state.
  • Removed the harness's fixture-specific CJK byte/result lookup table. The generic bridge now replays accumulated input through the production codec.
  • Method.toJS now uses the linked Bun__HTTPMethod__toJS common-string bridge rather than allocating a fresh ZigString for each Request.method access.
  • Removed both Request-specific workload-reduction rewrites. The checked-in Bun fixtures remain unchanged.

Verification:

  • Debug and ReleaseFast builds: 21/21 steps.
  • text-decoder-cjk.test.ts: 30/30; complete js/web/encoding scan: 8 files passed, zero failures/crashes/hangs.
  • request-method-getter.test.ts: 6/6 at Bun's original 524,288 clone reads and 131,072 constructions. A small heap probe reports only the one-time lazy-init string delta; the construction loop delta is zero.
  • request-clone-leak.test.ts: 12/12 at the original 1,000/2,000/500 iteration workloads, with stable RSS (about 28 seconds in Debug and 7.7 seconds in ReleaseFast).
  • TextDecoder single-byte: 13/13; streaming: 39/39; WPT decoder coverage: 2,207/2,207 tests and 5,012 expectations.
  • Final Zig formatting and diff checks pass; worktree is clean; commit author and committer are Chris Breuer with no coauthors.

The umbrella home_test runner still is not a clean aggregate signal: server mode stalled, while direct terminal mode reproduced unrelated existing bundler/plugin/package-manager failures and then entered a Debug glob trace flood exceeding 300 MB. The focused native and unchanged corpus coverage above completed cleanly. Overall Bun parity remains in progress.

14 days ago

Landed and pushed native WebCore ownership/slice parity in f5a3065a.

Ported Bun's post-pin semantics rather than adding harness behavior:

  • ReadableStream native-source onClose callbacks now use the generated wrapper's GC-traced cached field, breaking the wrapper/source/bound-callback/stream strong cycle while retaining callback delivery.
  • FileReader balances the associated pending-read reference on Windows startup and reader-error paths.
  • Memory-backed Blob structured-clone serialization writes only the logical slice window at offset zero and does not mutate the source Blob.
  • Blob size resolution preserves known slice lengths and clamps them to the backing store, fixing stream(), Response body, and Content-Length slice bounds.

Verification against unchanged corpus fixtures:

  • Debug and ReleaseFast builds pass.
  • js/web/streams/native-source-onclose-leak.test.ts: 4/4 in both modes.
  • Complete js/web/streams scan: 7 files passed, 0 failed/crashed/hung/dependency/oom in both modes.
  • js/web/structured-clone-blob-file.test.ts: 36/36, 163 assertions, in both modes.
  • js/web/fetch/body-clone.test.ts: 25/25 in ReleaseFast (also clean in Debug).
  • All three slice-bound cases in js/web/fetch/blob.test.ts now pass. The file is 24/26 overall because two unrelated gaps remain; split into #647 (object-part coercion/join order) and #648 (odd-offset UTF-16LE child regression).

No corpus fixtures, workloads, assertions, deadlines, or skip state changed.

14 days ago

Closed #647 and #648 with the native WebCore port in d25fc0bd.

What changed:

  • Replaced Blob multipart construction's deferred LIFO traversal with ordered part processing. Non-Blob DOM wrappers, objects, and nested arrays stringify once at their source position.
  • Buffer-source and inner-Blob parts are still snapshotted immediately, preserving bytes across later user-code detachment, resize, or GC.
  • Corrected the single-part DOM-wrapper path to stringify the unwrapped value rather than its enclosing array.
  • Added an aligned fast path plus unaligned little-endian pair decoding for UTF-16LE Blob text()/json(); odd-address slices no longer abort, and an incomplete trailing byte is safely dropped.
  • Added joiner cleanup on constructor exceptions.

Unchanged-corpus verification in both Debug and ReleaseFast:

  • Six Blob-focused files: 65/65 tests, 215 assertions, four snapshots.
  • js/web/fetch/blob.test.ts: 26/26, 145 assertions (previously 24/26).
  • blob-array-fast-path.test.ts: 11/11, including 10,000 parts, sparse arrays, prototype indexed getters, and mixed parts.
  • blob-oom.test.ts: 16/16.
  • body-clone.test.ts: 25/25.
  • structured-clone-blob-file.test.ts: 36/36, 163 assertions.
  • Complete js/web/streams scan: 7/7 files, zero failures/crashes/hangs/dependency gaps/OOM.

No fixture, workload, assertion, timeout, or skip was changed. The commit was rebased over the concurrent TypeScript checker change, rebuilt, pushed to main, and remote-SHA verified.

14 days ago

Landed and pushed native fetch Host/TLS identity parity in 2dfc3c506.

What changed:

  • Physical HTTP connections now retain the exact pool discriminator captured at acquisition. Releasing a direct-TLS connection no longer recomputes the key from redirect-mutated state or drops an explicit Host/SNI override.
  • Repeated requests with the same explicit Host header reuse the negotiated connection, while a request with the URL-derived Host cannot borrow that socket.
  • Cross-origin redirects remove the explicit Host header and clear the HTTP clients TLS verification override. The destination request now derives both wire Host and certificate identity from its redirected URL.
  • Redirect release, normal completion, preconnect, direct TLS, and proxy-tunnel paths use the captured identity consistently.

Strict full-VM verification (HOME_NATIVE_VM=1 and HOME_CORPUS_FULL_VM=1), with unchanged corpus sources:

  • fetch-keepalive.test.ts: 2/2, 5 assertions, Debug and ReleaseFast.
  • fetch.tls.test.ts: 21/21, 65 assertions, Debug and ReleaseFast.
  • Complete ReleaseFast js/web/fetch scan: 58 pass, 1 fail, 1 over the generic 20-second file bound, 1 over the generic 4 GiB RSS guard, 61 total.
  • The two resource classifications pass when run with their legitimate unchanged envelopes: fetch-leak.test.ts is 21 pass / 1 upstream TODO / 0 fail in about 39 seconds; fetch-gzip.test.ts is 24/24 with its original 1,025 MiB payload outside the scan-only RSS guard.
  • Therefore 60/61 fetch files are logically clean. The sole strict full-VM failing file is fetch.test.ts at 346/350 with 7,423 assertions. Its maxRedirects validation/counting gaps are tracked in #649; bodyless Content-Length and interim-1xx storage reclamation are tracked in #650.

The pragmatic adapter reports fetch.test.ts as 350/350, but that result is explicitly excluded from the parity claim. Five strict bounded repetitions reproduce the same four failures. No corpus fixture, assertion, workload, deadline, threshold, or skip state changed.

Debug and ReleaseFast builds pass; Zig formatting and whitespace checks pass. The disk initially filled while writing Debug output, so only this worktrees disposable generated Zig cache was pruned before clean rebuilds; no source or user data was removed. The commit is on main, remote-SHA verified, authored and committed by Chris Breuer without coauthors. Overall Bun parity remains in progress.

14 days ago

Landed and pushed the next strict fetch checkpoint in cefad9226, closing #649 and #650.

Production changes:

  • Ported pinned Buns Rust-side maxRedirects option into Homes Zig fetch path. Values must be numeric, finite, non-negative integers; values above 126 clamp to 126; AsyncHTTP stores limit + 1 for exact hop accounting.
  • Added the native is_node_http_client carrier used by pinned Bun framing semantics.
  • Public fetch drops a caller-supplied nonzero Content-Length when the request has no body, while explicit zero and the internal node:http path preserve their intended framing authority.
  • HTTP/1 informational-response parsing compacts the owned accumulation buffer after every parsed 1xx response and retains only the unread suffix, preventing the full interim history from remaining resident while the final response is withheld.

Strict full-VM verification, with original fixtures/workloads/deadlines/thresholds unchanged:

  • fetch.test.ts: 350/350, 7,427 assertions, Debug and ReleaseFast. The original roughly 48 MiB interim-response flood passes its memory threshold.
  • Direct Debug and ReleaseFast edge probes reject Infinity, -Infinity, NaN, negative, fractional, and string maxRedirects values; zero and large finite integers are accepted with the production clamp.
  • ReleaseFast adjacent matrix: Undici 10/10; node-http 128 pass / 1 upstream skip / 0 fail; Content-Length 1/1; HTTP/2 client 60/60; HTTP/3 client 52/52; redirect 2/2; keepalive 2/2; TLS 21/21.
  • Final uncontended complete js/web/fetch scan: 60 pass, 0 fail, 0 crash, 0 dependency gaps, 0 OOM, 1 over the generic 20-second outer cap, 61 total.
  • The sole scan timeout is unchanged fetch-leak.test.ts, which passes separately in about 39 seconds with 21 passes / 1 upstream TODO / 0 failures. The TODO remains excluded from completed parity.
  • fetch-gzip.test.ts, including the original 1,025 MiB payload, passes 24/24 inside the final ordinary scan.

One scan taken while an unrelated external Bun benchmark saturated a CPU core recorded a Blob process exit and an HTTP/3 failure. Both are retained as unsuccessful evidence; after the benchmark exited, Blob ownership passed 3/3 strict process replays, HTTP/3 client passed 3/3 at 52/52, and the uncontended complete scan produced the final classification above.

Debug and ReleaseFast builds pass; Zig formatting and diff checks pass. The commit was rebased over the concurrent TypeScript owner change, pushed to main, remote-SHA verified, and authored/committed by Chris Breuer without coauthors. No corpus source, assertion, workload, timeout, threshold, or skip changed. Overall Bun parity remains in progress.

14 days ago

Follow-up on the sole upstream TODO in fetch-leak.test.ts: it is explicitly marked TODO for Buns Rust rewrite (the fixture comment says the Rust pool-return path skips Body.Value.deinit). Homes active Zig HiveRef.unref path already calls value.deinit() before pool.put().

I ran the TODO bodys exact String workload directly against the pushed ReleaseFast Home binary without changing the corpus: 8 warmup cycles plus 32 measured cycles, each constructing/finalizing 512 Requests with unique 128 KiB string bodies (2 GiB through the measured pool path), forced GC, original 64 MiB threshold. Result: baseline 142 MiB, final 142 MiB, delta 0 MiB, exit 0.

The upstream test remains untouched and still reports TODO in the file runner, so it is not counted as a passing test. The underlying Home logical contract is independently green.

Sign in to comment on this issue.