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

Parity checkpoint: native corpus value semantics landed and pushed in 635a8df.

Ported against pinned Bun 4982b91:

  • node:path now matches Bun native bindings for boxed/subclassed String values, unboxes them before joining, rejects arbitrary objects, and reports indexed join arguments.
  • AbortSignal.timeout() now exposes the exact keyless TimeoutError DOMException shape (message The operation timed out., legacy code 23) instead of Home-only enumerable metadata.
  • Bun.inspect(Bun.file(fd)) now preserves FileRef identity ahead of Blob prototype inspection, including fd 0 across GC.
  • Removed the fixture-level String(...) source rewrites for invalid-escape-sequences, minify-new-array-with-if, and issue 8254; these upstream sources now pass unchanged.

Native Home validation:

  • js/bun/io: 37 pass, 0 fail, 3 files.
  • js/web/abort: 12 pass, 0 fail, 3 files, including the subprocess AbortSignal GC regression.
  • js/node/path: 121 pass, 0 fail, 2 upstream TODO, 19 files.
  • formerly rewritten regression files: 22 pass, 0 fail, 3 files.
  • pinned Bun probes independently confirmed all three observable contracts.
  • full debug build passed with the repository previous pinned Zig 0.17.0-dev.1441+d5181a9.

The concurrent pantry/deps update to Zig dev.1963 is not part of this commit and currently exposes 55 repository-wide migration errors; those working-tree changes were preserved. A standalone js/bun/util/inspect.test.js run still stops before test execution with the separate existing prototype: Illegal invocation harness initialization gap; this batch covers the FileRef contract through the full IO corpus plus an internal regression.

14 days ago

Parity checkpoint: Bun inspect corpus parity landed and was pushed to main in 8e32515.

Generic native corpus improvements:

  • replaced the inspect.test.js filename-specific prototype shortcut with descriptor-based prototype inspection that never invokes Web IDL getters;
  • hide only automatically synthesized Response text content-type headers while preserving explicit/file-derived types;
  • expose Bun.inspect.custom as the same Symbol.for(nodejs.util.inspect.custom) value as node:util.inspect.custom;
  • inspect Blob/File names through their observable accessor state;
  • retained FileRef-before-Blob identity dispatch from the preceding commit.

Validation:

  • js/bun/util/inspect.test.js: 72 pass, 0 fail;
  • inspect-error-leak.test.js: 1 pass, 0 fail;
  • js/bun/io: 37 pass, 0 fail;
  • js/web/abort: 12 pass, 0 fail;
  • js/node/path: 121 pass, 0 fail, 2 upstream TODO;
  • full js/bun/util discovery: 852 pass, 24 fail, 1 unsupported, 2 TODO across 56 files. The next first failure is bun-cryptohasher.test.ts HMAC with a string key, now tracked separately.
14 days ago

CryptoHasher/HMAC parity batch landed on main in 37215a5: https://github.com/home-lang/home/commit/37215a5f72fdac44d47d63b3af772da01600b5ac

Closed #585. This replaces all fixed HMAC fixture tables with real BoringSSL HMAC, adds real missing digest routes (BLAKE2s, SHAKE, MD4, RIPEMD-160, SHA-512/224, SHA-512/256, md5-sha1), normalizes accepted binary inputs, matches sha128 and keyed unsupported-algorithm behavior, and uses caller-owned output buffers so mixed high-volume hashing remains GC-safe.

Validated:

  • Bun CryptoHasher: 397 / 397
  • Bun hash: 20 / 20
  • Node HMAC: 74 / 74
  • Node HMAC algorithm validation: 5 / 5
  • arbitrary HMAC messages/keys match pinned Bun byte-for-byte
  • mixed 16,000-call digest stress: pass
  • full js/bun/util: 1,249 pass / 23 fail / 1 unsupported / 2 TODO, improving from 852 pass / 24 fail; first remaining failure remains unrelated

The broader Node crypto test now clears its hash checks and reaches SHA-224 RSA signing. Tracked separately in #586: /home-lang/home/issues/586

14 days ago

RSA signing parity batch landed on main in 911b411: https://github.com/home-lang/home/commit/911b4119de5656d8059061572ab7ce5c749ee8c6

Closed #586. RSA createSign/createVerify and one-shot sign/verify now use real BoringSSL EVP for PEM, PKCS#8, public/private key, and certificate material. Digest aliases such as sha224WithRSAEncryption and RSA-SHA224 normalize correctly, PKCS#1/PSS padding uses Node/Bun salt sentinel behavior, and the canned fixture-signature lookup/acceptance paths were removed.

Validated:

  • js/node/crypto/crypto.test.ts: 369 / 369
  • crypto-sign-regression.test.ts: 1 / 1
  • node-crypto.test.js: 187 / 187
  • async sign/verify key-format matrix: pass
  • full js/node/crypto directory: 740 pass / 4 fail across 17 files

The first remaining directory failure is now the unrelated DiffieHellmanGroup.verifyError getter in crypto-invalid-this.test.ts.

14 days ago

Pushed another Node crypto parity batch in 36a086326 (fix(runtime): complete Node crypto parity contracts; authored/committed by Chris, no coauthors).

Completed:

  • added a real BoringSSL EVP RSA cipher binding for publicEncrypt/privateDecrypt and privateEncrypt/publicDecrypt;
  • added password-callback parsing for encrypted PEM keys, including native signing;
  • wired OAEP digest, MGF1 digest, OAEP label, padding, and wrong-passphrase failure behavior;
  • fixed DiffieHellmanGroup verifyError as a branded own accessor with ERR_INVALID_THIS;
  • made synthetic EC/DSA signature records encoding-aware so DER signatures are rejected under ieee-p1363;
  • aligned the PKCS#1/SPKI decode failure with Bun/BoringSSL’s error contract.

Validation on Home’s native runner:

  • crypto-invalid-this.test.ts: 3 pass / 0 fail
  • crypto.key-objects.test.ts: 83 pass / 0 fail / 23 TODO
  • sign-jwk-ieee-p1363.test.ts: 3 pass / 0 fail
  • crypto-rsa.test.js: 22 pass / 0 fail
  • node-crypto.test.js: 187 pass / 0 fail
  • full js/node/crypto: 851 pass / 0 fail / 0 unsupported / 23 TODO across 17 files

The next structural RSA step is tracked separately in #587: native DER/JWK import/export and real key generation, followed by removal of the temporary cross-representation operation-record bridge. This keeps the remaining backend work explicit and avoids treating the current passing matrix as full RSA completion.

14 days ago

Pushed the next Node utility parity batch in 0ea047c18 (fix(runtime): complete Node util parity contracts; authored/committed by Chris, no coauthors).

Completed:

  • insulated internal entry resolution from user mutation of the public process.cwd property;
  • made the Node common ESM compatibility proxy genuinely lazy and anchored its eventual load to the canonical corpus module path, so reflection cannot execute or mis-resolve it;
  • classified Blob module syntax failures as Bun-compatible BuildMessage native errors while preserving ordinary runtime Blob errors.

Validation on Home’s native runner:

  • util-inspect.test.js: 5 pass / 0 fail
  • test-util-types.test.js: 52 pass / 0 fail
  • full js/node/util: 527 pass / 0 fail / 0 unsupported / 1 TODO across 17 files
  • full js/node/crypto regression: 851 pass / 0 fail / 0 unsupported / 23 TODO across 17 files

The remaining util TODO is the upstream-skipped promisify fs calls / all cases block, which explicitly awaits the Node common mustCall/vm path; it is not being counted as completed.

14 days ago

Pushed 3e1d4a233 (fix(runtime): complete Bun utility parity) against pinned Bun 4982b91e3702094330f3be3883354c52b8c01323.

This batch completes the native js/bun/util directory:

  • 56/56 files executed
  • 1,780 passed
  • 0 failed
  • 0 unsupported
  • 13 upstream TODOs

Implemented contracts:

  • isolated every corpus file in its own JSC runtime for gate, directory, and subset execution, eliminating cross-file global/prototype pollution
  • captured intrinsic Promise operations for runner and stream internals, so replacing globalThis.Promise does not break native bookkeeping; removed the fuzzer-specific Promise static-property patch
  • implemented live FIFO delivery and byte-accurate FileSink flush/end behavior; removed both FileSink pipe/EPIPE suppressions (44/44)
  • added cross-platform null-device behavior and correct ENOENT handling for missing Buffer reads
  • matched Bun CookieMap behavior by ignoring empty cookie names (101 passed, 3 TODO)
  • forwarded validated sync zstd compression levels to the native compressor (75/75)
  • separated CommonJS compilation failures from runtime exceptions so execution errors propagate with Bun-compatible identity and rendering (inspect-error 10/10)
  • retained focused regressions for null-device (3/3), GC/error reads (4/4), ReadableStream internal Promise behavior (1/1), and fuzzy API traversal (66/66)

Validation:

  • debug compiler build passed
  • full native js/bun/util directory passed with the totals above
  • Zig formatting, diff checks, and extracted harness JavaScript syntax checks passed

No delegated bun test result was used for parity.

14 days ago

Bun parity checkpoint — Bun object and write contracts completed.

Pushed commit 3b6a811e7: fix(runtime): complete Bun object parity.

Results on the pinned Bun corpus (4982b91e3702094330f3be3883354c52b8c01323):

  • js/bun/bun-object: 3/3 files, 106 passed, 0 failed, 0 unsupported, 3 upstream TODO
  • js/bun/io: 3/3 files, 37 passed, 0 failed, 0 unsupported
  • js/bun/util regression gate: 56/56 files, 1,780 passed, 0 failed, 0 unsupported, 13 upstream TODO
  • js/node/util regression gate: 17/17 files, 527 passed, 0 failed, 0 unsupported, 1 upstream TODO
  • Existing Bun.write regression files: issue 25903 7/7, issue 8254 1/1
  • Debug build, extracted harness JavaScript syntax, Zig formatting, and whitespace checks all pass.

This implements branded Date/RegExp/Map/Set comparisons (so prototype-spoofed fake built-ins do not throw or compare equal), honors the Bun.deepEquals strict argument, matches Bun function/object validation in Bun.deepMatch, implements the asynchronous error-code matcher used by the unchanged corpus harness, and gives Bun.write real destination validation plus path-buffer, file-slice, file-descriptor, and read-only Blob behavior. The accidental -1 path side effect from stringifying an invalid descriptor is eliminated.

No copied Bun tests, assertions, workloads, or pin metadata changed. The remaining goal is still open; the next larger shared frontier is nested Home subprocess execution over virtual temp files for the import-attributes/DNS/sourcemap/cron cluster.

14 days ago

Pushed d1d63daf2 (fix(runtime): add Bun loader DNS and sourcemap parity) to main.

This batch closes three shared runtime gaps:

  • home -e subprocesses now materialize their temporary module in the requested cwd, so relative imports have Bun-compatible resolution semantics.
  • Simple disk-backed Bun-target Bun.build() calls use the real Home compiler, covering static/dynamic import attributes, inferred tsconfig.json JSONC, SQLite/file/text loaders, invalid-loader failures, and ?raw; temp roots are canonicalized before being exposed.
  • Bun.dns.lookupService() and Bun.dns.resolve() now provide the promise APIs and synchronous argument validation expected by Bun, including UTF-16-backed strings.
  • bun:internal-for-testing.internalSourceMap now supports validated VLQ decoding, Bun's 32-byte-header / 24-byte-sync-entry / 64-mapping-window blob format, VLQ re-encoding, and generated-position lookup. Build sourcemaps are derived from the recursively resolved source graph instead of a one-source placeholder.

Focused native corpus results:

  • js/bun/import-attributes: 1/1 files, 12 passed, 0 failed, 0 unsupported, 0 TODO
  • js/bun/dns: 2/2 files, 80 passed, 0 failed, 0 unsupported, 0 TODO
  • js/bun/sourcemap: 2/2 files, 18 passed, 0 failed, 0 unsupported, 0 TODO

Regression checkpoint:

  • js/bun/cron: 91 passed, 0 failed, 0 unsupported, 11 TODO
  • js/bun/bun-object: 106 passed, 0 failed, 0 unsupported, 3 TODO
  • js/bun/util: 1,780 passed, 0 failed, 0 unsupported, 13 TODO
  • js/node/util: 527 passed, 0 failed, 0 unsupported, 1 TODO

Debug build, extracted harness node --check, Zig format check, and git diff --check all pass. The overall Bun parity effort remains in progress.

14 days ago

Port progress: compile, TypeScript build, and YAML parity landed in 0e7deb015 (fix(runtime): add compile TypeScript and YAML parity).

This batch adds logical runtime behavior rather than fixture-only output:

  • disk-backed Bun.build() now delegates to Home's real builder for both the implicit default target and explicit target: "bun";
  • build --compile can produce and execute a real Home bundle, preserving cwd/env, direct/run/script argv offsets, exit status, stdout/stderr, and debug madvise diagnostics;
  • type-only re-export/build/compile flows now complete through the native build path;
  • YAML document streams now preserve block-scalar boundaries and distinguish document-start/document-end errors inside multiline quoted scalars;
  • YAML directives, comments, plain scalar continuations, folded newlines, anchors/tags, property-only nodes, indentation/tab rules, and nested block scalars now follow Bun's tested behavior;
  • YAML byte input now accepts logical SharedArrayBuffer values through the common binary-view path.

Native Home verification on the rebased commit (Bun delegation is explicitly rejected by the runner):

  • js/bun/compile: 1 pass, 0 fail, 0 unsupported, 0 todo
  • js/bun/typescript: 70 pass, 0 fail, 0 unsupported, 18 upstream todo
  • js/bun/yaml: 2,091 pass, 0 fail, 0 unsupported, 23 upstream todo
  • focused compile regressions: compile-argv 10, compile-process-execargv 2, compile-sourcemap-internal 1 passing; Windows metadata 1 todo and outfile-subdirectory 3 todo, with no failures/unsupported fallbacks
  • regression directories: bundler 2, JSONC 14, JSON5 433, Bun util 1,780, Bun object 106, cron 91, and Node util 527 passing, all with 0 failures and 0 unsupported (28 explicit upstream todos across those directories)

Static verification also passed: debug build, extracted harness node --check, zig fmt --check, and git diff --check.

The source corpus remains pinned to Bun 4982b91e3702094330f3be3883354c52b8c01323. Continuing with the next multi-feature parity batch.

14 days ago

Pushed the next parity batch in d3aeb7022 (fix(runtime): complete console crypto and glob parity; Chris Breuer only, no coauthors).

Implemented logical contracts:

  • Bun.inspect(..., { compact: true }) now renders Map and Set values in Bun's single-line form, allowing the unchanged Bun.inspect.table snapshot names and table output to resolve normally;
  • the crypto cipher validator now admits the already-supported AES CFB and OFB modes, completing the unchanged well-known encryption/decryption vector matrix;
  • Bun.Glob.scanSync() copies only own option properties into a null-prototype options record, so prototype pollution cannot implicitly enable followSymlinks (or inject other scan options).

Native Home corpus results:

  • js/bun/console: 3/3 files, 52 pass, 0 fail, 0 unsupported, 0 TODO
  • js/bun/crypto: 3/3 files, 23 pass, 0 fail, 0 unsupported, 1 upstream TODO
  • js/bun/glob: 6/6 files, 196 pass, 0 fail, 0 unsupported, 0 TODO
  • js/bun/util regression: 56/56 files, 1,780 pass, 0 fail, 0 unsupported, 13 upstream TODO
  • js/node/util regression: 17/17 files, 527 pass, 0 fail, 0 unsupported, 1 upstream TODO
  • js/node/path/matches-glob.test.ts: 31 pass, 0 fail, 0 unsupported

The real full-VM SQLite directory was also verified separately: 90 pass, 1 upstream skip, 0 fail, 880 assertions across all three files. I did not add adapter-level SQLite stand-ins.

During the broader Node crypto regression, the plain-context adapter reproducibly trapped in JSC SourceProviderCache teardown on the large key-object file. The identical file passes Home's strict full VM with 83 pass, 22 upstream skips, 1 TODO, 0 fail, 905 assertions, isolating crypto behavior from adapter lifetime debt. That crash is now tracked explicitly in #590 rather than being omitted from the checkpoint.

Debug build, harness node --check, zig fmt --check, and git diff --check pass. Corpus pin remains Bun 4982b91e3702094330f3be3883354c52b8c01323. Overall parity remains open; continuing with the next grouped frontier.

14 days ago

Pushed 14e60d112 (fix(runtime): complete native socket configuration parity).

This batch ports three native runtime behaviors from Bun instead of adding corpus fixtures or output stand-ins:

  • Bun.listen / Bun.connect socket handlers now parse binaryType as arraybuffer, uint8array, or buffer and reject invalid values.
  • socket tls options now reject truthy non-object/non-boolean values with Bun-compatible validation.
  • the BoringSSL JSC bridge now matches Buns active Rust implementation: raw crypto message plus library, function, reason, and Node-compatible ERR_OSSL_* / ERR_SSL_* codes.

Verification on the rebased runtime commit:

  • strict full-VM tcp-server.test.ts: 8 pass, 0 fail, 369 assertions (including all payload modes, invalid TLS, and the isolated listener leak check)
  • strict full-VM upgradeTLS handles errors: 1 pass, 0 fail, 1,000 assertions
  • adapter js/bun/udp: 208 pass, 0 fail/unsupported, 1 TODO
  • adapter js/bun/websocket: 5 pass, 0 fail/unsupported, 1 TODO
  • adapter js/bun/crypto: 23 pass, 0 fail/unsupported, 1 TODO

The full strict-VM js/bun/net directory improved from 46 pass / 11 fail to 49 pass / 8 fail (4 upstream platform skips). Remaining failures are seven native fd/connect/event-loop lifecycle timeouts plus a cross-file listener-retention count; the listener leak test passes when run in isolation. The ordinary corpus adapter remains 20 pass / 1 fail / 2 TODO because the spawned Home child cannot connect to the adapters virtual in-process listener. I did not add a workaround for that process boundary.

14 days ago

Pushed b2de7f1e0 (fix(runtime): restore native crypto hashers; Chris Breuer only, no coauthors).

This batch replaces the pure-Zig compatibility shim with the native BoringSSL digest implementations used by Bun for SHA-1/SHA-2, MD4, MD5, RIPEMD-160, MD5-SHA1, and Blake2b-256. EVP-backed static hashers now release their digest contexts. CryptoHasher algorithm-name dispatch also converts UTF-16 ZigString input correctly, so unsupported non-Latin-1 names throw instead of trapping.

The change fixes a real scheduler/runtime interaction rather than raising timeouts: hashing the unchanged 1 GiB network fixture with SHA-256 dropped from about 5,246 ms to about 426 ms in the Home debug runtime (pinned Bun release: about 379 ms). That removes the synchronous ~11-second block caused by the fixtures two digests and clears all seven concurrent network lifecycle timeout failures from the prior checkpoint.

Verification on the rebased commit:

  • debug build: pass
  • strict full-VM hash/CryptoHasher files: 417 pass, 0 fail, 55,778 assertions
  • strict full-VM js/bun/crypto: 10,249 pass, 0 fail, 29,402 assertions across 3 files
  • adapter js/bun/util: 1,780 pass, 0 fail, 0 unsupported, 13 upstream TODO across 56 files
  • strict full-VM js/bun/net: 56 pass, 4 upstream platform skips, 1 fail across 5 files
  • formatting and diff checks: pass

The sole strict-network failure is now isolated: the listener heap assertion passes by itself but observes 4 Listener wrappers (limit 2) after prior files in the directory. This appears tied to prior-file realm/global retention, not the fd/connect/socket lifecycle behavior, whose tests all pass individually. I did not relax the threshold, force cleanup, mutate the fixture, or split execution as a workaround. It is tracked as #592.

Corpus pin remains Bun 4982b91e3702094330f3be3883354c52b8c01323. Overall parity remains open; continuing with the next grouped frontier.

14 days ago

Porting milestone pushed in 31c865d1ba8a13f422a7abccc30d0ef6cb9a0e65 (fix(runtime): restore JSC atom-table ownership).

The plain Bun-corpus adapter could enter a reduced-realm Zig host callback with the WTF thread naming another JSC VM's AtomStringTable; an allocation-triggered GC then trapped on JSC's VM/thread identity assertion. The shared callback-registration boundary now restores the callback context's atom table before dispatch, covering all reduced-realm host functions without corpus edits or workload changes.

Verification:

  • key-object adapter stress: 30/30 fresh processes green, each 83 pass / 0 fail / 23 existing TODO (before fix: 2/3 trapped);
  • full js/node/crypto adapter directory: all 17 files, 851 pass / 0 fail / 0 unsupported / 23 existing TODO;
  • complete home_rt suite repeated twice: 1,814 passed / 19 skipped / 0 failed each run.

#590 is resolved and closed. #568 has the root-path evidence and repeated stability results, but stays open until its focused deterministic pre-fix regression criterion is satisfied.

Separately, #592 now documents that the remaining strict node:net listener-count failure reproduces unchanged in pinned Bun itself at 4982b91e3702094330f3be3883354c52b8c01323 (54 pass, 6 skip, 1 fail after only stubbing Bun's unavailable internal test helper). I did not weaken the assertion or add Home-only cleanup; that upstream order-sensitive assertion remains isolated for disposition.

14 days ago

Progress: Bun.JSONL is fully unparked and at pinned-corpus parity in c664897 (feat(runtime): complete Bun JSONL parity).

  • Home: 269 passed, 0 failed, 0 unsupported, 0 TODO.
  • Pinned Bun 4982b91e3702094330f3be3883354c52b8c01323: 269 passed, 0 failed, 2,462 assertions.
  • Removed all 12 Home-injected JSONL skip/TODO rewrites, restoring 119 tests.
  • The original upstream 4 GiB bounds cases and 50,000-iteration leak cases run unchanged.
  • Runtime and corpus adapter now share the same JSONL implementation instead of maintaining a test-only duplicate.
  • Full home_rt: 1,816 passed, 19 skipped, 0 failed (1,835 total).

Rewrite-debt detail is tracked in #202. Continuing with the next uncovered Bun runtime gap; #66 remains open.

14 days ago

Progress: Bun macOS static-initializer parity is now active and passing in b52d597 (perf(runtime): eliminate worker static initializers).

  • Converted the Home-added worker parent-port, exit-task, and heap-snapshot registries from eager namespace-scope objects to thread-safe function-local lifetime storage.
  • Removed both Home C++ startup constructors: __GLOBAL__sub_I_HomeMessagePort.cpp and __GLOBAL__sub_I_HomeWorker.cpp.
  • Home arm64 Mach-O __mod_init_func is now exactly 2 entries (mi_process_attach plus libc++), meeting pinned Bun’s unchanged <=2 budget.
  • Replaced the harness hardcoded macOS-version false result with Bun’s real sw_vers -productVersion behavior.
  • Instrumented --version children with DYLD_PRINT_INITIALIZERS=1 now bypass the synthetic version fixture and execute the real Home binary.
  • The byte-identical pinned test js/bun/perf/static-initializers.test.ts now reports 1 pass, 0 fail, 0 unsupported, 0 TODO in Home.
  • Production worker smoke passed parent-port round-trip, heap-snapshot streaming, and termination after the registry change.
  • Full home_rt: 1,816 passed, 19 skipped, 0 failed (1,835 total).

The broader #66 tracker remains open; continuing with the next Bun gap.

14 days ago

Bun.color native parity batch landed in 82d6559 (feat(runtime): run Bun.color through native callback).

What changed:

  • Home reduced JSC realms now bind the production BunObject_callback_color callback instead of routing the copied corpus through the JavaScript approximation.
  • Removed the color-specific corpus rewrite that replaced the exhaustive ANSI-256 fuzz with a TODO and boundary samples.
  • Fixed the shared Node ErrorCode constructor to support plain JSGlobalObject realms without a Zig::GlobalObject or BunClientData, so native callback argument errors retain the expected TypeError / ERR_INVALID_ARG_TYPE contract.
  • The native unity generator now owns the corrected copied ErrorCode.cpp, so this is linked behavior rather than a reference-only source change.

Parity evidence at pinned Bun SHA 4982b91:

  • Copied color.test.ts SHA-256 exactly matches the pinned Bun file: 1a71516ce85cafb51bc14e07c322ea0f4b53e95d244c263a7477b18e424c1935.
  • Pinned Bun baseline: 917 pass, 0 fail, 432 snapshots, 619 expect calls.
  • Home unchanged corpus: 917 pass, 0 fail, 0 TODO, 0 unsupported, including the original 256 x 256 x 256 ANSI-256 fuzz loop.
  • Full home_rt gate: 1816 passed, 19 skipped, 0 failed.
  • Native module generator tests: 3 passed, 0 failed.

This closes the Bun.color-specific TODO/rewrite gap; issue #66 remains active for the remaining corpus surface.

14 days ago

Bun.Terminal corpus parity is admitted on main in 2427cb8f2.

This removes the three blanket Home TODO rewrites for the terminal lifecycle, subprocess PTY, and platform-behavior suites. The normal aggregate Home corpus runner now runs the unchanged PTY matrix through the production VM instead of substituting reduced-realm TODOs.

Verification against pinned Bun 4982b91e3702094330f3be3883354c52b8c01323:

  • Home aggregate terminal directory: 3 files, 123 pass, 0 fail, 0 unsupported, 2 upstream non-running registrations.
  • Pinned Bun: 123 pass, 1 platform skip, 1 TODO, 0 fail, 323 assertions.
  • All three corpus files have matching SHA-256 hashes between Home and ~/Code/bun/test.
  • Full home_rt: 1,816 passed, 19 skipped, 0 failed.

The shared native-child accounting now preserves upstream test.skip alongside TODO accounting rather than misreporting a platform/debug skip as missing Home support. #202 records suppression removal; #503 stays open only for Linux/Windows/ConPTY verification.

14 days ago

Bun.Image production corpus admission is complete on macOS in bbe83cd4f.

The four Home blanket TODOs are gone. The normal aggregate corpus path now runs the unchanged image pipeline, adversarial/security and memory-hygiene tests, all resize kernels, and Sharp/libvips pixel-reference suite through Home's production VM.

  • Home: 4 files, 222 pass, 0 fail, 0 unsupported, 0 TODO.
  • Pinned Bun 4982b91e3702094330f3be3883354c52b8c01323: 222 pass, 0 fail, 7,132 assertions.
  • All four copied files are byte-identical to ~/Code/bun/test.
  • Full home_rt: 1,816 passed, 19 skipped, 0 failed.

#202 records suppression removal. #593 tracks only the remaining Linux/Windows backend verification so it is not hidden in this master issue.

14 days ago

WebSocket server parity advanced and landed on main in 351e1b1.

Home now matches pinned Bun for ServerWebSocket.cork(callback): the callback receives the same ws object as both this and argument 0. That production fix allowed the untouched, byte-identical websocket-server.test.ts corpus file to leave the TODO suppression ledger.

Parity evidence:

  • Home: 93 pass, 3 upstream TODO, 0 fail, 0 unsupported.
  • Bun 4982b91: 93 pass, 3 TODO, 0 fail.
  • Whole Home WebSocket directory: 4 files, 98 pass, 3 TODO, 0 fail, 0 unsupported.
  • home_rt: 1,816 passed, 19 skipped, 0 failed.

Detailed suppression-ledger update: /home-lang/home/issues/202#issuecomment-5524329695

14 days ago

Native HTTP TLS parity advanced in e526ac1: the untouched Bun.serve SSL-validation and custom-TLS keepalive/cache-stress files are no longer blanket TODOs.

Current macOS parity is exact: Home 22 pass / 0 fail / 0 unsupported / 0 TODO, matching pinned Bun at 22 pass / 0 fail and 40 assertions. This includes the 100,000-request memory-stability case and the 200-distinct-config cache-eviction case.

Suppression evidence: /home-lang/home/issues/202#issuecomment-5524381628 Cross-platform follow-up: #594.

14 days ago

Pushed c4ebc94 (fix(runtime): release abandoned promise contexts) and activated the exact untouched serve-pending-promise-abort-leak.test.ts corpus test.

The underlying production bug was real rather than a test-runner gap: GC destruction used a private fake VM task queue in JSC builds, leaving 100 aborted, never-settled Promise<Response> request contexts alive. Production now schedules deferred derefs on the real VM event loop.

Parity result:

  • Home: 6/6 passed, 0 failed/unsupported/TODO, 20 assertions
  • pinned Bun: 6/6 passed, 20 assertions
  • stable full home_rt: 1,816 passed, 19 skipped, 0 failed

Detailed suppression-ledger evidence: /home-lang/home/issues/202#issuecomment-5524552455 Cross-platform/lol-html follow-up: #595

14 days ago

Pushed de6c192 (fix(runtime): harden HTTP proxy handling), authored and committed solely as Chris.

Completed in this batch:

  • Native exact proxy.test.js: Home 16 pass / 8 upstream-conditional TODO / 0 fail / 0 unsupported, matching pinned Bun at 16 pass / 8 skip / 0 fail.
  • Proxy Basic credentials now use standard padded Base64 per RFC 7617 instead of URL-safe Base64, including redirect resets.
  • Failed CONNECT responses are surfaced without following a malicious Location, per RFC 9110.
  • Stable home_rt: 1,816 pass / 19 skip / 0 fail.

The untouched 1,763-line TLS proxy file is now 45 pass / 1 upstream skip / 2 fail in Home versus 47 pass / 1 skip / 0 fail in pinned Bun. Its remaining certificate-rejection and S3 runtime-proxy lifetime paths are tracked in #596.

Detailed suppression ledger: #202.

14 days ago

Pushed f813c1d2b7e2d6fa0105a707726739f5ecd35b70 (fix(runtime): complete TLS proxy parity) as Chris-only attribution.

This batch closes the macOS semantic gap for the untouched js/bun/http/proxy.test.ts:

  • TLS checkServerIdentity now gates request transmission for direct and CONNECT-tunneled targets, with HTTP-thread resume/shutdown handling and zero target bytes on rejection;
  • proxy Basic auth / failed CONNECT behavior from the preceding batch remains covered;
  • S3 stat now observes runtime HTTP(S)_PROXY/NO_PROXY against the signed URL, safely owns env-derived bytes, and completes through the real main-thread task bridge;
  • the corpus TODO rewrite is removed and the .ts file is native-routed.

Parity evidence:

  • Home exact file: 47 passed, 1 upstream skip, 0 failed, 177 assertions
  • pinned Bun 4982b91e3702094330f3be3883354c52b8c01323: 47 passed, 1 upstream skip, 0 failed, 177 assertions
  • stable home_rt: 1,816 passed, 19 skipped, 0 failed

Tracking links: TLS/platform verification #596, suppression ledger #202, and newly isolated remaining S3 facade/proxy scope #597.

14 days ago

Pushed 7542a8e1834d2e1c047a3244949094f5eb9ddf3b (fix(runtime): restore S3 client facade) as Chris-only attribution.

Home's central S3 facade no longer drops full/ranged downloads, deletes, ListObjectsV2 operations, list options, or structured signing errors into Phase-12 no-op placeholders. A real local production-VM fixture passes 5/5 tests and 11 assertions across those paths; stable home_rt remains 1,816 passed, 19 skipped, 0 failed.

Detailed remaining S3 proxy/corpus/platform work continues in #597.

14 days ago

S3 proxy parity advanced in 0e0af17efbf381b3f8ad51c701fcb70d94b44479 (tracked in #597).

All non-explicit S3 paths now defer proxy selection until the signed URL is available, so HTTP_PROXY/HTTPS_PROXY scheme selection and NO_PROXY hostname/host matching agree with native fetch. This covers simple read/range/write/delete, list, streaming download, and multipart requests while retaining the real explicit proxy path for fetch("s3://…", { proxy }). Resolved proxy bytes are owned for the asynchronous HTTP lifetime.

macOS validation: focused production diagnostic 6/6 passed with 21 assertions; stable home_rt 1,816 passed, 19 skipped, 0 failed; production debug build and source audits passed. #597 now has the implementation items checked, with only untouched-corpus activation and Linux/Windows verification remaining.

14 days ago

Native S3 parity advanced in 5c2ac45420be0462c315e6c31bfe6ba7bbd8817e (details in #597).

The batch ports pinned Bun's S3 request-body ownership, prevents HTTP/1.1 connection reuse when an early response arrives before a buffered upload has drained, bounds malformed ListObjects XML parsing to linear work, and promotes eight validated S3 corpus files to the production Home VM.

Home and pinned Bun now match exactly across that matrix: 66 passed, 3 upstream credential-gated skips, 0 failed. This includes the original 100 MiB multipart upload at queueSize: 10, requester-pays signing/read/write paths, ListObjects parsing and encoding, storage classes, validation, insecure HTTP endpoints, and stream-cancellation GC. The added 5 MB malformed-XML regression completes in about 129 ms in Home. Stable home_rt remains 1,816 passed, 19 skipped, 0 failed.

#597's deterministic corpus-activation item is now complete; Linux/Windows verification remains open. Credential-dependent S3/R2 suites are not being counted as deterministic passes while their external secrets are unavailable.

14 days ago

Published the native worker corpus batch on main in e1523b1ee (test(runtime): promote native worker corpus batch), authored and committed by Chris Breuer without coauthors.

The corpus runner now applies packages/runtime/test/bun-corpus/preload.ts to every native bun test child. This is required corpus configuration, not a test workaround: without it, the unchanged 15787.test.ts cannot see the harness toRun matcher; with it, the real SharedArrayBuffer worker subprocess passes. Routing is an exact-file allowlist and excludes helper fixtures plus unresolved suites.

Promoted unchanged/validated coverage:

  • 12 js/web/workers files: 257 pass / 3 upstream release-mode skips / 1 upstream TODO / 0 fail across 261 registered tests.
  • 3 js/node/worker_threads files (15787, async disposal, heap-snapshot GC): 4 pass / 0 fail.
  • Combined: 261 pass / 3 skips / 1 TODO / 0 fail across 15 native files. Skips and TODO are retained as non-passing coverage.

The 26-second Home Debug heap-snapshot GC race completed under its unchanged workload. Pinned Bun 4982b91e3 matches the three Node files at 4/4. Home also passes four extended MessagePort close/lifetime regressions that the pinned Bun binary times out on; those local regression additions are not claimed as byte-identical upstream controls.

Validation:

  • Debug native build: pass.
  • ReleaseSafe compiler build: pass.
  • Stable home_rt: 1,816 pass / 19 skip / 0 fail (1,835 total).
  • Exact worker matrix: counts above, zero failures.
  • Zig format and git diff --check: pass; no generated heap snapshots remain.

The umbrella default install still fails in the unrelated home-tool target because the external zig-js archive lacks _Home__JSC__ensureCurrentAtomStringTable; the runtime/compiler targets used here pass. The home_test aggregate also retains previously documented unrelated failures, so neither is represented as a green gate.

Remaining worker boundaries are explicit: worker_destruction.test.ts passes its connect/listen cases but hangs while terminating a Worker with in-flight fetch, now #598. The complete worker_threads.test.ts passes unchanged in ReleaseFast under closed #482; Debug remains slower than its original five-second 100 MiB eval-source deadline. Other platforms and whole-suite parity remain open.

14 days ago

Published the zero-exit worker completion fix on main in eae013190, authored/committed by Chris Breuer without coauthors, and closed #598.

Worker.terminate() now treats only undefined as “no completion”; cached numeric exit code 0 is returned immediately instead of waiting forever for a second close event. The unchanged worker-destruction file is admitted to the native corpus runner. Route verification also caught and fixed loss of the sentinel allocation type for the injected corpus preload path—DebugAllocator is now clean.

Evidence:

  • deterministic old-binary negative control: times out at terminate-after-natural-exit code 0;
  • new regression: 20/20 independent Debug processes;
  • unchanged 50-worker fetch fixture: 10/10 processes (500 worker terminations total);
  • unchanged destruction file: 3/3 in Debug and ReleaseSafe, matching pinned Bun;
  • promoted worker matrix: 264 pass / 3 upstream skips / 1 upstream TODO / 0 fail across 16 files;
  • ordinary corpus route: 3 pass / 0 fail / 0 unsupported / 0 TODO, no allocator diagnostics;
  • builtin generation/ABI: 3 pass / 117 assertions;
  • stable runtime: 1,816 pass / 19 skip / 0 fail;
  • Debug and ReleaseSafe builds: pass.

No deadline, skip, retry, fixture load, or fetch implementation changed. The worker checklist remains open only for Linux/Windows, upstream skipped/TODO coverage, and the documented Debug-only eval-source deadline (optimized full-file coverage is green under #482). Whole-suite Bun parity remains incomplete.

14 days ago

Native worker-termination checkpoint — 01d4636eb

Pushed directly to main as Chris Breuer without coauthors; focused issue #599 is closed. This supersedes the prior zero-exit termination accounting in #598: after a natural or forced zero exit, a later Worker.terminate() now settles to Bun-compatible undefined without waiting for an already-fired close event, while nonzero exits retain their cached code and concurrent calls share one promise. JSC termination exceptions are distinguished from ordinary exceptions at TopExceptionScope, and queued Immediate callbacks no longer execute after script status stops. Corpus child selection now recognizes every real Home build flavor, preventing ReleaseSafe verification from silently falling back to a stale installed binary.

Twelve unchanged Node parallel termination scripts are newly routed through native Home execution. Debug and ReleaseSafe each pass 12/12. The complete promoted worker matrix is now 28 files / 276 pass / 4 upstream TODO/skips / 0 fail / 0 unsupported in ReleaseSafe. The dedicated lifecycle regression passes in Debug and ReleaseSafe; stable runtime units remain 1,816 pass / 19 skip / 0 fail. No upstream source, assertion, workload, timeout, or deadline changed. Linux/Windows verification, the four upstream TODO/skips, the Debug-only large-eval timing boundary in #482, and whole-suite parity remain open. 100% logical Bun parity is not yet achieved.

14 days ago

Complete Node parallel worker-script checkpoint — ea2e6aab8

Pushed directly to main as Chris Breuer without coauthors; focused issue #600 is closed. This supersedes the 28-file worker count from the preceding #599 checkpoint.

The native corpus route now covers the complete exact 58-file Node parallel worker-script inventory at pinned Bun 4982b91e3, adding 46 unchanged fixtures to the 12 termination scripts already promoted. A single shared allowlist drives routing and its existence test, and an inventory comparison reports no missing or extra paths. Every script passes in serialized direct runs under both Home Debug and pinned Bun. Captured Debug execution is 58/58.

Combined with the existing 16 worker test-runner files, the ReleaseSafe worker checkpoint is now 74 files / 322 pass / 4 upstream TODO-skips / 0 fail / 0 unsupported. Coverage includes worker data/environment data, CJS/ESM loading and failure paths, MessagePort transfers, SharedArrayBuffer/Wasm, ref/unref and process-exit ordering, uncaught exceptions, watcher teardown, heap snapshots, zero-fill stress, path resolution, and clean shutdown under active JS/module loading. No upstream fixture, assertion, workload, timeout, or deadline changed. Linux/Windows verification, the four upstream TODO/skips, #482's Debug-only large-eval timing boundary, non-parallel worker suites, and whole-suite parity remain open. 100% logical Bun parity is not yet achieved.

14 days ago

Worker-corpus checkpoint: 4233b8c16 closes #601 and removes the remaining Debug deadline boundary from #482 through a general runtime transpiler fix.

Coverage now includes the exact complete dedicated worker directories plus the Node parallel worker script corpus:

  • 12/12 js/web/workers test files
  • 5/5 js/node/worker_threads test files
  • 58/58 promoted Node parallel worker scripts
  • 75 files total
  • Debug: 356 pass / 4 upstream TODO-skips / 0 fail / 0 unsupported
  • ReleaseSafe: 356 pass / 4 upstream TODO-skips / 0 fail / 0 unsupported
  • Runtime units: 1,817 pass / 19 skip / 0 fail

The newly admitted unchanged worker_threads.test.ts passes 34/34 in 4.079 s under Debug and 1.066 s under ReleaseSafe, against pinned Bun at 1.269 s. Before the fix, Debug produced 33 pass / 1 timeout at the original five-second deadline.

The fix aligns runtime eval/stdin/data/Blob whitespace-only handling with bundler ParseTask and vectorizes the canonical exact ASCII-whitespace scan. No upstream assertion, fixture workload, or deadline changed.

Issue #66 remains open: this is a substantive worker-runtime parity milestone, not a claim that the complete Bun suite is finished.

14 days ago

Bun parity checkpoint: 2d212a7d8 closes #602 and removes another real suppression cluster from #202.

This batch deletes the test.failing corpus rewrite that injected 8 TODO registrations across four nested-runner behaviors:

  • expected failing subprocesses that throw/reject;
  • unexpected passing subprocess diagnostics;
  • timeout reporting;
  • done-callback pass/fail reporting.

It also deletes the stale async-generator IPC/header-continuation suppression helper.

Unchanged native corpus results, in both Debug and ReleaseSafe:

  • async iterator streaming: 86 pass / 0 fail / 0 TODO / 0 unsupported;
  • test.failing: 8 pass / 0 fail / 0 TODO / 0 unsupported;
  • combined: 94 pass / 0 fail / 0 TODO / 0 unsupported.

Both files are byte-identical to pinned Bun, which reports the same totals. Native routing is now 280 files. No assertion, fixture, timeout, subprocess workload, snapshot, or done-callback behavior was weakened.

#66 remains open; the remaining suppression and feature gaps still need to be eliminated.

14 days ago

Checkpoint: pushed 0a08ebb (fix(runtime): promote require and snapshot workflows), tracked in #603.

This removes the require and snapshot corpus rewrites instead of weakening fixtures. Home now performs real Latin-1 to UTF-8 formatting for snapshots, honors Bun FORCE_COLOR / NO_COLOR and TTY precedence, and correctly reads ANSI outer test summaries without double-counting nested bun test subprocesses.

Debug validation:

  • build passes
  • runtime units: 1819 pass, 19 existing skips, 0 fail
  • unchanged require.test.ts: 10 pass, 3 upstream TODOs, 0 fail in strict and routed modes
  • unchanged snapshot.test.ts: 62 pass, 1 upstream skip, 0 fail in strict and routed modes with FORCE_COLOR=1 and NO_COLOR unset, matching the pinned Bun test condition
  • both fixtures are SHA-256 identical to Bun 4982b91

ReleaseSafe was stopped without a diagnostic when another root-checkout full test left only about 1.3 GiB free. I preserved that other work and the shared cache; #603 stays open until ReleaseSafe can be rerun. Overall Bun parity remains in progress.

14 days ago

Checkpoint: pushed c33a265 (test(runtime): promote module mock corpus), tracked in #604.

This deletes both module-mock adapter rewrites and runs the byte-identical Bun fixtures through the full native VM. Debug strict and routed totals match pinned Bun exactly: 2 pass / 0 fail for 6879, and 9 pass / 1 upstream TODO / 0 fail for mock-module.

The overall parity goal remains active. ReleaseSafe verification for #603 and #604 is waiting for a separate root-checkout full suite to release disk capacity.

14 days ago

Bun parity progress: pushed 11a7bcc (test(runtime): promote sinon and hspec corpus) and completed #603, #604, and #605.

This batch removes the Sinon issue-347 and HTTP hspec source rewrites, promotes both byte-identical Bun tests to exact native routes, and deletes the remaining hspec filename-specific HTTP gate in favor of the general raw-request parser. Debug and ReleaseSafe routed/strict results match pinned Bun: 3/3 for the new batch, 11 pass + 1 upstream TODO for module mocks, and 72 pass + 1 upstream skip + 3 upstream TODO for require/snapshots, all with zero failures or unsupported cases.

The optimized ReleaseSafe build passed at current main. No fixtures, assertions, expected results, or deadlines were weakened.

14 days ago

Parity progress: #606 is complete and closed in 57fa4d277.

This batch fixes brace alternation so commas inside character classes are parsed as class members, not brace separators, and promotes three byte-identical Bun fixtures to unchanged native execution:

  • js/bun/glob/match.test.ts
  • js/node/buffer-resolveObjectURL.test.ts
  • js/node/async_hooks/async-local-storage-thenable.test.ts

Evidence on synchronized origin/main:

  • pinned Bun 4982b91e3: 33 pass / 0 fail
  • Home Debug strict and routed: 33 pass / 0 fail each; routed has 0 unsupported / 0 TODO
  • Home ReleaseSafe strict and routed: 33 pass / 0 fail each; routed has 0 unsupported / 0 TODO
  • focused runtime units: 1,820 pass / 19 skip / 0 fail
  • all three vendored sources are byte-for-byte identical to Bun

The umbrella remains open for the remaining parity work. The suppression ledger is updated at #202.

14 days ago

Parity progress: #607 is complete in 63fbba675.

Nine Node URL/inspection source rewrites were removed. Home now leaves Bun upstream TODO/skip registrations untouched rather than force-activating them in the corpus adapter.

Exact combined parity:

  • pinned Bun 4982b91e3: 6 pass / 3 skip / 7 TODO / 0 fail
  • Debug strict: 6 pass / 3 skip / 7 TODO / 0 fail
  • ReleaseSafe strict: 6 pass / 3 skip / 7 TODO / 0 fail
  • routed Debug and ReleaseSafe: 6 pass / 10 deferred / 0 fail / 0 unsupported
  • all nine fixtures remain byte-identical to Bun

The umbrella remains open for the remaining runtime and rewrite parity work; #202 has the detailed mutation-ledger update.

14 days ago

Progress update: #608 is complete and pushed to main as 6d9bf217be80896f40320bd888f266b1180ea293.

This batch fixed native TextEncoder.encodeInto UTF-16 scalar boundaries, ported current Bun fixed-buffer conversion semantics, added direct native coverage, removed ten Deno/Web fixture rewrites, preserved 14 upstream skips, routed generated Deno TypeScript through the production parser, and corrected the Event isTrusted descriptor. All 10 authoritative fixtures are byte-identical to pinned Bun.

Verification:

  • selected pinned Bun / Home strict Debug / Home strict ReleaseSafe: 136 pass / 14 skip / 0 fail
  • selected Home routed Debug / ReleaseSafe: 136 pass / 14 deferred / 0 fail / 0 unsupported
  • full 16-file Deno directory, pinned Bun and Home strict: 226 pass / 17 skip / 1 TODO / 0 fail
  • core runtime units: 1,821 pass / 19 skip / 0 fail

The broader routed Deno directory still has two pre-existing URL compatibility failures (down from four failures before this batch); they remain visible for subsequent parity work rather than being rewritten away.

14 days ago

Progress update: pushed 77fa3b9 (fix(runtime): preserve URL authority semantics) and closed #610. This fixes shared IPv6 authority extraction/validation, bare-empty-query href state, and URLSearchParams internal-list forEach behavior without changing pinned Bun fixtures. The full 16-file Deno directory now passes in both Debug and ReleaseSafe (strict: 226 pass, 17 skip, 1 TODO, 0 fail; routed: 226 pass, 18 deferred, 0 fail, 0 unsupported). Runtime units: 1,821 passed, 19 skipped, 0 failed. The broader Bun parity goal remains active.

14 days ago

Progress update: pushed a0e4e7b and closed #611, removing two more fixture-specific source rewrites. undici-types imports are now handled as declaration-only by the shared module lowerer, and compact parser-emitted side-effect imports are lowered generically. The unchanged Request subclass + fetch.preconnect fixtures pass 14/14 in Debug and ReleaseSafe routed mode with zero unsupported/TODO cases. Strict Request is 2/2; the independent strict --fetch-preconnect startup-socket defect is open as #612 with the exact 11-pass/1-timeout reproduction. No fixture, deadline, or assertion was weakened.

14 days ago

Production parity update: fixed and closed #612 in a142501. The direct native VM boot had parsed --fetch-preconnect but skipped Bun’s startup preconnect lifecycle; both boot paths now share AsyncHTTP.preconnectFromCli. Verified malformed-URL rejection, a real accepted TCP startup connection, unchanged fixture byte parity with pinned Bun, Debug + ReleaseSafe strict 12/12, routed 12/12, and runtime units 1821 pass / 19 skip / 0 fail. No corpus rewrites, timeout changes, or synthetic socket behavior.

14 days ago

Progress update: ee0b5ee removes five stale loader/query corpus rewrites; #613 tracks and documents the completed batch.

JSON5, YAML, TOML, text-loader, and import-query now pass through shared/native behavior rather than exact fixture substitutions. The final rebased Debug and ReleaseSafe binaries each pass all five files in strict and routed modes: 35/35 tests and 104/104 expect calls, matching pinned Bun. All five upstream test files are byte-identical to /Users/chris/Code/bun, including the original 10,000 dynamic-import workload. No assertions, deadlines, fixtures, or workloads were weakened.

14 days ago

Progress update: fd95751 removes another four stale fixture rewrites and one exact memfd child-result emulation; #614 documents the completed batch.

The original 100,000-character shell lookup workload now runs unchanged, Linux-only memfd tests remain skipped on macOS, the upstream snapshot TODO remains a TODO, and RuntimeError uses shared import lowering. Pinned Bun plus Home Debug/ReleaseSafe in strict and routed modes all match exactly: 3 pass, 2 skip, 1 todo, 0 fail, 4 expect calls across four byte-identical upstream files. No assertions, deadlines, fixtures, or workloads were weakened.

14 days ago

Progress update: 54eabc0 ports Bun Archive extraction path safety and closes #615.

The real Zig extractor now skips overlong GNU longname entries before fixed-buffer normalization and blocks relative component stacks that climb above the extraction root before filesystem *at calls. The current upstream Archive regression file is synced byte-for-byte from /Users/chris/Code/bun, and the stale blanket using/await using corpus rewrite is removed.

Parity is exact across pinned Bun and Home Debug/ReleaseSafe strict+routed: 101 pass, 1 skip, 0 fail, 10,473 expect calls. Runtime units: 1,822 passed, 19 skipped, 0 failed. No test weakening or heap snapshots.

14 days ago

Pushed two parity commits to main:

  • a6a7c4e38 fix(runtime): harden installer symlink writes
  • 078363fa4 test(runtime): remove stale io corpus rewrites

This batch did three things without changing upstream expectations:

  1. Activated and validated the already-ported real lol-html C API. Bun.write's HTMLRewriter stream now works in Debug and ReleaseSafe; #199 has the exact native evidence and remains open for self-contained build-graph integration.
  2. Ported Bun's current installer hardening: buffered .bun-tag writes use O_NOFOLLOW, and bin executable permissions no longer follow symlink targets. Focused issue #616 is complete.
  3. Removed the Bun.write import rewrite and symlink fixture using rewrite, and synchronized the lagging Bun.write mirror with the three new upstream BunFile name/GC tests. #202 has the corpus details.

Exact validation over Bun.write, three HTMLRewriter regressions, and the six-test installer security fixture:

  • all five corpus files byte-identical to /Users/chris/Code/bun
  • pinned Bun: 49 pass, 0 fail, 1,457 assertions
  • Home Debug strict: 49 pass, 0 fail, 1,457 assertions
  • Home Debug routed: 49 pass, 0 fail
  • Home ReleaseSafe strict: 49 pass, 0 fail, 1,457 assertions
  • Home ReleaseSafe routed: 49 pass, 0 fail
  • installer security fixture additionally passed four consecutive Debug strict runs and three routed runs
  • Home runtime units: 1,822 passed, 19 skipped, 0 failed (1,841 total)
  • no heap snapshots produced

Both commits are authored and committed solely by Chris Breuer and are pushed on top of current origin/main.

14 days ago

Parity batch landed on main as 3ff2b32 (fix(runtime): preserve install corpus controls).

This removes two unacceptable corpus mutations at once:

  • Bun's lifecycle install suite now runs with its original MAX_CONCURRENT = 12 anti-forkbomb semaphore; Home no longer rewrites it to 100000.
  • Bun's config-version suite now runs its original bounded Verdaccio readiness probe; Home no longer forces registryCanServe=true or deletes the probe.

The underlying support is real and reusable: the routed registry harness now has start/stop-scoped HTTP registry semantics and npm metadata, and module preparation uses Home's production parser to detect top-level await. The runner tracks the module initialization promise and starts tests only after it settles.

Exact unchanged-current-Bun fixture hashes:

  • bun-install-lifecycle-scripts.test.ts: e8a61329a8ff80dc32b20e9ee48d566bf55b8e279f04b465dc5cc64f8f1b5e95
  • config-version.test.ts: e404811420ee5ce82e193212d64c1e049403f853fd71d99d4878b2c69247086f

Results:

  • Debug routed: 63/63 pass, 0 unsupported.
  • ReleaseSafe routed: 63/63 pass, 0 unsupported.
  • Post-rebase Debug: 63/63 pass.
  • Runtime units: 1,822 passed, 19 skipped, 0 failed.
  • No heap snapshots or generated tracked artifacts.

The separate real-harness/full-VM reference axis cannot currently load verdaccio/bin/verdaccio because the dependency is absent despite being locked. #618 tracks reproducible dependency provisioning; this batch does not use a symlink, fixture rewrite, skip, deadline change, or workload relaxation to conceal it. Detailed rewrite accounting is in #202.

14 days ago

Progress update: pushed ea49b0e (fix(runtime): execute small list growth corpus) to main.

The upstream CSS SmallList growth regression is now exercised logically end-to-end in Home. I removed three layers of canned corpus behavior, including a blanket interceptor for every bun -e script containing Bun.build. The unchanged Bun fixture now runs its real 3000 x 100 selector workload in a real Home child process, validates first/last selector preservation, and measures actual RSS under the original 300 MB bound. The fixture is byte-identical to Bun (2f4983ed9131bb7d2a0a543e17ad4c082c0e9d0c1a68210254fd89144bf0785c).

Production regression coverage now also records allocator request sizes through repeated SmallList heap-to-heap growth, so the original new_cap * @sizeOf(T) element-count bug cannot silently return.

Validation is green in Debug routed, Debug strict full VM, ReleaseSafe routed, and pinned Bun canonical runs (1/1 each). Full runtime suite: 1,823 passed, 19 skipped, 0 failed (1,842 total; 1 fuzz). Debug and ReleaseSafe builds passed; post-rebase Debug passed; no heap snapshots were produced.

Focused rewrite-removal details are tracked in #202.

14 days ago

Native artifact selection: $HOME-relative defaults and a whole-table JSC ABI guard

Two build-guard commits on main, pushed as glennmichael123 without coauthors. This is native-artifact selection work, not suite parity: no corpus file was run, no assertion or workload changed, and 100% logical Bun parity is not achieved.

What was wrong. build.zig defaulted HOME_BUN_OBJ_ROOT / HOME_BUN_WEBKIT_LIB to one contributor's home directory, so every other machine silently fell through to the system JavaScriptCore framework unless it set both by hand. Worse than the fallback is the near-miss: a checkout at the original historical pin fd0b6f1a27 downloads WebKit 5488984d20e0dbfe, whose JSType table is not the pinned one — it inserts HeapDouble/HeapInt32 at 4–5, has no WebAssemblyStreamingContextType or SentinelType, and collapses the two async-generator cell types into one. Building against it produced a wall of static_assert failures out of jstype_abi.cpp with nothing naming the cause. The current native artifact source SHA 4982b91e3702094330f3be3883354c52b8c01323 pins WEBKIT_VERSION = cd821fecca0d39c8 (scripts/build/deps/webkit.ts); Home's table is correct for that build, and only for that build.

6b53bdff9 — resolve Bun native artifact defaults from $HOME. Both artifacts live in the layout Bun's own build system produces under $HOME, so a leading ~/ is expanded instead of naming a machine, and the WebKit cache directory's os/arch segments follow the build target rather than assuming macOS arm64. The resolved paths are byte-identical to the previous hardcoded ones on the machine they were written for. The WebKit hash stays pinned, because JSC's ABI is only valid for the exact build Bun pins; the missing/mismatched case is now reported up front — expected build, and the command that produces it — falling back to the system framework as the missing-objects path already did.

b9ea2245b — assert the whole JSC type table. The guard covered 28 of the enum's 98 members, so 70 could drift undetected across a pin move, and a drifted table links cleanly and then reclassifies values at runtime. jstype_abi.cpp is now generated by scripts/gen-jstype-abi.mjs from the linked JSType.h: WebKit derives enum JSType from FOR_EACH_JS_TYPE in declaration order with no explicit values, which makes that macro list the authority for every member's number. The generator validates JSType.zig against it — same count, same order, positional values — and refuses to write when they disagree, rather than baking drift into the asserts meant to catch it. Each assert names its Home member, so a future failure says which type moved.

Verification. All 98/98 members of JSType.zig match the pinned header positionally; the two name divergences (PromiseAllContext, PromiseAllGlobalContext against WebKit's renamed JSPromiseCombinatorsContextType/…GlobalContextType) are naming only. The generated file compiles clean against WebKit cd821fecca0d39c8, and the same unchanged file raises drift diagnostics against 5488984d20e0dbfe, so the guard demonstrably fires. zig build configure resolves the pinned WebKit and the $HOME-relative object root. pickier is clean on the new script.

Limits. A full native build is not claimed here: this machine is still rebuilding Bun at the pinned SHA, and the existing HomeScriptExecutionContext.cpp include-order drift guard correctly rejects the stale local objects until it finishes. Darwin only. No corpus, regression, or unit run is reported in this comment.

14 days ago

Native build restored on a second machine, and the first measured js/node baseline

Seven commits on main, pushed as glennmichael123 without coauthors. Darwin arm64 only. 100% logical Bun parity is not achieved; this closes three crashes and makes the corpus scanner produce real numbers, nothing more.

The native build could not compile away from one machine

build.zig defaulted both Bun artifact paths to a single contributor's home directory, so any other checkout fell back to the system JavaScriptCore framework. The near-miss was worse than the fallback: a ~/Code/bun at the original historical pin fd0b6f1a27 downloads WebKit 5488984d20e0dbfe, whose JSType table genuinely differs from the pinned cd821fecca0d39c8 (HeapDouble/HeapInt32 inserted at 4–5, no WebAssemblyStreamingContextType/SentinelType, one async-generator cell type), and the only symptom was a wall of static_assert failures naming nothing. Home's table is correct for the pin; the environment was stale.

  • 6b53bdff9 — resolve the artifact defaults from $HOME and derive the WebKit cache directory's os/arch from the build target. Resolves byte-identically on the machine the hardcoded paths were written for. The missing/mismatched WebKit is now reported up front with the expected build and the command that produces it.
  • b9ea2245b — jstype_abi.cpp asserted 28 of the enum's 98 members, so 70 could drift undetected across a pin move, and a drifted table links cleanly and then reads a Promise as a Map. It is now generated by scripts/gen-jstype-abi.mjs from the linked header's FOR_EACH_JS_TYPE list, which validates JSType.zig (count, order, positional values) and refuses to write on disagreement. All 98 hold against the pinned WebKit; the same file raises drift diagnostics against the other one.
  • afa365b1f — UnifiedSource-src_jsc_bindings-4.cpp was the one owned unit whose sibling include list was checked in. Because Home links its object instead of Bun's bundle, that list must name the bundle's exact partition; the copy in the tree named decodeURIComponentSIMD.cpp (bundle 5 in a faithful build of the pin) and omitted c-bindings.cpp (bundle 4), which would duplicate one translation unit and drop another. Bundle 4 now goes through bundle-native-modules.ts alongside the six other owned units, which also checks ScriptExecutionContext.h against the external header's class ABI — that check passes, so the pinned layout really is preserved.

zig build debug -Denable_jsc=true is 21/21, and the runtime regression suite is 64/64.

The corpus scanner was reporting fiction on Darwin

acbe0c0c8, 475621266. vm-corpus-scan.sh bounded every run with coreutils timeout, which macOS does not ship — the only platform the native runtime currently supports. Each run exited 127 and was classified as a crash: the tool reported 19/19 crashes for js/node/path where 18 actually passed. It also captured output through command substitution, so a test that left a server running held the pipe open and the scan wedged on one file instead of recording a hang; and *.test.* matched __snapshots__/*.test.ts.snap, adding a phantom crash. Separately, both scanners resolved the binary release-before-debug with no staleness check, so a leftover release binary from an earlier artifact generation shadowed a fresh debug build — that reported 63 of 64 runtime regressions as failing with module-resolution errors belonging to the artifacts the old binary was linked against.

Three crashes closed, each against the pinned Bun control

  • c90e1c7b0 — path.format counted only name.len + ext.len, spending its separator budget on the dot formatExt inserts for a dot-less ext and writing one byte past the allocation. Bun corrected this on its Rust side (name.len() + ext.len() + 1); the pinned Zig it was ported from still carries the original. js/node/path is now 19/19.
  • 47586f1ee — HTTP/2 request() asked for padding with the full available_payload, so the pad-length byte could push an otherwise-fitting header block onto the CONTINUATION path, which slices a whole frame payload out of a shorter block. Bun reserves that byte (available_payload - 1); Home's other three getPadding call sites already did. node-http2-continuation.test.ts: panic: index out of bounds: index 16384, len 16272 → 9 pass / 0 fail, matching Bun.
  • 6492703f7 — BlockList.check entered the 32-bit comparison whenever both addresses answered as_v4(), which IPv4-mapped IPv6 addresses do, so an addSubnet('::ffff:…', 96, 'ipv6') rule reached the IPv4 mask with an IPv6 prefix and underflowed 32 - prefix — a panic reachable from any caller that can add a rule. Switch on the subnet's own family as Bun's as_sin()/as_sin6() do; the IPv6 arm also now maps IPv4 addresses into ::ffff:a.b.c.d instead of ignoring them. node-net.test.ts: panic: integer does not fit in destination type → 40 pass / 4 skip / 0 fail, matching Bun's 40/0.

First measured js/node baseline

267 files: 233 pass / 25 fail / 6 crash / 3 hang — recorded with the remaining rows in #621. Several of the failures are dependency provisioning (verdaccio, body-parser) and belong to #618, not to parity. #620 covers node-http2.test.js, where Home's loader refuses require() of a linked ESM record that has no top-level await and never reaches the file's tests; pinned Bun runs 287 pass / 6 skip / 0 fail there. A reduced repro of that one fails in Bun too, so the mechanism is not yet isolated and the issue records that so it is not re-derived.

Limits

Darwin arm64 only. No Linux or Windows execution. Only js/node was surveyed — js/bun (447 files), regression/issue (396) and js/web (155) are unmeasured. No corpus file, fixture, assertion, workload, deadline, or skip was changed. CI has run nothing repo-wide since 2026-06-01, so all of the above is local evidence.

Sign in to comment on this issue.