Repository navigation
Bug hunt ledger: Bun #306
Replies: 32 comments
|
[agent] 2026-09-30: Bun bug-hunt run Tested: main Method: the patch API is unreachable from the sandbox ( This is the first run: there was no earlier ledger and no Cells
Issues
False positives ruled out
Probe
Next
|
|
[agent] 2026-10-01: Bun bug-hunt run Tested: main Method: same as run 1, with the mock rebuilt ( Re-triage (on
|
|
[agent] 2026-10-01: maintainer note: test global ( This is a maintainer request, not a run report. Add it to the top of the backlog and keep it there until the cells below are covered. Ask: make sure we correctly scan global installs when Where Bun puts global installs: What to check (prove each with a real global install, not by reading source):
Add OS × Bun version cells for |
|
[agent] 2026-10-01: Bun bug-hunt run Tested: main Method: real Re-triage (on
|
|
[agent] 2026-10-01: Bun bug-hunt run Tested: main Method: a Python mock of the authenticated patch API ( Re-triage
Cells
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-01: Bun bug-hunt run Tested: main No probe branch this run: Method: a Python mock of the patch API ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-02: Bun bug-hunt run Tested: main Method: a fresh Python mock of the org-scoped patch API ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-02: Bun bug-hunt run Tested: main Method: a fresh Python mock of the org-scoped patch API ( Re-triage
Cells (Linux): backlog item 5,
|
|
[agent] 2026-10-02: Bun bug-hunt run Tested: main Method: a fresh Python mock of the org-scoped patch API ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
|
|
[agent] Janitor: ledger drift. The coverage matrix still lists these issues as
This is a heads-up only. The janitor never edits ledgers. Generated by Claude Code |
|
[agent] Janitor: ledger drift. The coverage matrix still lists these issues as
This is a heads-up only. The janitor never edits ledgers. Generated by Claude Code |
|
[agent] 2026-10-02: Bun bug-hunt run Tested: main Method: a fresh Python mock of the public proxy ( Re-triage
Cells (Linux)
IssuesFalse positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-03: Bun bug-hunt run Tested: main Method: a fresh Python mock of the public proxy ( Re-triage
Cells (Linux)
IssuesFalse positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-03: Bun bug-hunt run Tested: main Method: a fresh Python mock of the public proxy ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-03: Bun bug-hunt run Tested: main Method: a fresh Python mock of the public proxy ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-04: Bun bug-hunt run Tested: main Method: rebuilt the Python mock (npm registry + authenticated patch API + hosted tarball route, with an optional per-patch marker variant for superseding patches). New fixture rule: run the registry on a different origin (port) from Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-05: Bun bug-hunt run Tested: main Method: a fresh Python mock of the patch API (batch, by-package, view, blob, the Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-05: handover from the Yarn classic (1.x) bug-hunt routine I filed #831 (#831) for yarn classic. Vendored mode writes
With The tarball backends look like they share this, but I haven't tested bun. Please check it with a real bun install (repro shape in #831). If it reproduces, comment on #831 with your matrix rather than filing a duplicate, unless the fix clearly differs. |
|
[agent] 2026-10-05: Bun bug-hunt run Tested: main Method: the self-contained Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-05: Bun bug-hunt run Tested: main Method: the probe-workflow Re-triage
Cells (Linux)
Issues
Handover
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-06: Bun bug-hunt run Tested: main Method: a fresh local mock of the public-proxy routes ( Re-triage
Cells (Linux): all pass
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-06: Bun bug-hunt run Tested: main Method: a fresh local mock of the public-proxy routes ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-06: Bun bug-hunt run Tested: main Method: a fresh local mock of the public-proxy routes ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-06: Bun bug-hunt run Tested: main Method: a fresh local mock of the authenticated org API ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-07: Bun bug-hunt run Tested: main Method: a new fixture with a fake npm registry on its own origin (bunfig Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
|
[agent] 2026-10-07: Bun bug-hunt run Tested: main Method: a fresh fixture with a fake npm registry on Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
[agent] Progress ledger for the scheduled Bun bug-hunt routine (label pm:bun).
Last updated: 2026-10-07 (run 27), main
9c43dfc, latest release 4.0.0, latest Bun 1.4.2 (canary 1.4.3-canary.1).Method (run 16 note: the sandbox shell exports
BUN_OPTIONS=--smol, so unset it; run 17 note: on Bun ≥ 1.2,bunfig [install] saveTextLockfile = falsewrites a binarybun.lockb): real Bun installs (npm@oven/bun-*or GitHub release binaries) and a local Python mock of the patch API: batch, by-package, thepatches/packagegrant,patches/viewwith blob contents,blob/<hash>, the hosted tarball route, and a/registry/passthrough forSOCKET_NPM_REGISTRY. SetSOCKET_PATCH_SERVER_URLto the mock. The oracle is the marker bytes after a fresh-checkoutbun install --frozen-lockfilewith an empty cache, plus byte comparison of the lockfiles andnode requirewhere runtime matters. The repo's own matrix (scripts/backtest-bun.py,bun-compatibility.yml) already covers plain hosted and vendored shapes across Bun 0.8.1–1.4.2. It always runs with--ignore-scriptsand never in agent mode, and it never runsvexon an isolated-linker tree. This ledger tracks what it doesn't.Run 9: #366, #405 (fixed by #496) and #469 (fixed by #472) were verified fixed on Linux. Their cells below now read pass (Linux), and the macOS/Windows cells for them are untested on the fixed main.
Run 10: #599 still reproduces on
045d7ec. New: #635 (Bun ≥ 1.3.14globalStore).Run 11 (main unchanged at
045d7ec): #599 still reproduces. No new bugs. All the new cells pass: the run 11 section below, and the vendored row of theglobalStoretable.Run 12 (main unchanged at
045d7ec, so no re-triage): no new bugs. Bun 1.1.39, the oldest release in range, is now covered and passes. All the new cells pass: the run 12 section below.Run 13 (main unchanged at
045d7ec, so no re-triage): new #720. Lockfile-only discovery can't see hosted pins, so a hosted re-run in CI never picks up a superseding patch, andscan --mode vendoredskips the takeover. Both report success. The other new cells pass: the run 13 section below.Run 14 (main unchanged at
045d7ec, so no re-triage): new #739. Abun.lockbholdingX@1.0.0+X@1.0.0-beta.1is refused as a metadata-hash mismatch, and hosted exits 0 with nothing patched (a regression since 4.0.0). Bun cells added to #626 (agent mode overwrites first-party workspace members). The other new cells pass: the run 14 section below.Run 15 (main unchanged at
045d7ec, so no re-triage): new #764. Afterrollback/vendor --revert, the advisedbun installkeeps the patched bytes on the hoisted linker. The other new cells pass: the run 15 section below.Run 16 (main unchanged at
045d7ec, so no re-triage): new #784. A vendoredbun.lockbmigrated bybun install --save-text-lockfilecan't be reverted or rolled back, and a superseding re-vendor on it drops the pre-vendor original.removeadded to #764. The other new cells pass: the run 16 section below.Run 17 (main unchanged at
045d7ec, so no re-triage): new #803. A hosted or vendored workspacebun.lockbmigrated to text by Bun 1.4.2 carries socket-patch's path-normalized workspace literals, so frozen installs fail and the unfrozen install drops the pins. The other new cells pass: the run 17 section below.Run 18 (main unchanged at
045d7ec, so no re-triage): no new bugs. #764 is confirmed on a Bun 1.2.23 hoisted workspace. A member-levelbun adddropping that member's hosted pins is Bun behaviour (see Known non-bugs). The other new cells pass: the run 18 section below.Run 19 (main unchanged at
045d7ec, so no re-triage): no new issue. The yarn-classic handover #831 reproduces on Bun: a vendored tarball covered by.gitignore(*.tgz,vendor/,.socket/) exits 0, the commit drops it, and fresh frozen installs fail. That holds on text v1/v2,bun.lockband an isolated workspace, and the Bun matrix is commented on #831.bun cireproduces #803. The other new cells pass: the run 19 section below.Run 20 (new main
6811b4e): #803, #739 and #720 were fixed by #811, #741 and #722, closed by the maintainers, and verified on Linux (#803 heal: hosted + vendored re-run; #720: lockfile-onlybun.lockbsupersede + vendored takeover). #599 and #497 still reproduce, and #497 also gives a falsenot_affectedfrom lockfile-only defaultvex(commented). New: #861. A vendored re-run after a new dependent duplicates abun.lockbtarball record, and isolated frozen installs fail EEXIST intermittently on 1.3.9/1.4.2. The other new cells pass: the run 20 section below.Run 21 (new main
9c43dfc): #861 still reproduces. No new issue. The isolated-workspace member-run shape (hostedscanfrom a member:success, nothing pinned) is now tracked on #884 (commented), and is no longer a known non-bug. Three generic npm-family findings were handed to npm. The other new cells pass: the run 21 section below.Run 22 (main unchanged at
9c43dfc, so no re-triage): no new bugs. All the new cells pass: multi-package and large-tree (express)bun.lockbhosted / vendored / takeover by writers 1.1.45–1.4.2, two versions of one patched package (nested + direct, and per workspace member), and scopedrollback/removeof one of two same-name pins. See the run 22 section below.Run 23 (main unchanged at
9c43dfc, so no re-triage): no new issue. #861 also reproduces whenbun addruns inside an existing member (commented). All the new cells pass: a vendoredbun.lockbupgraded from binary format 2 to 3 by a newer Bun,bun.lockbtakeovers by writers 1.1.39 / 1.3.4 / 1.3.10,globalStore+ hosted workspace, and BOM / no-final-newline text locks. See the run 23 section below.Run 24 (main unchanged at
9c43dfc, so no re-triage): no new bugs. The Bun 1.3.10 text-lock row is now covered (agent hoisted + isolated, hosted, rollback byte-exact). A hosted 1.2.0 workspacebun.lockbupgraded to format 3 by 1.4.2 picks up a superseding uuid. Concurrent and SIGKILLed vendored runs, mixed-case names (JSONStream) and catalogs all pass. See the run 24 section below.Run 25 (main unchanged at
9c43dfc, so no re-triage): no new bugs. Mixed per-package modes (vendored ⇄ one package hosted, on text andbun.lockb, single and workspace, 1.2.23 / 1.3.9 / 1.4.2) pass, as doglobalStore+ vendored workspace lockb,overrides/resolutionsand Bun lock re-serializations. #861 also reproduces underglobalStore.bun removeof a vendored package leavesvendor --checkred with a no-op remedy; it's generic, so it was handed to npm (related #900). See the run 25 section below.Run 26 (main unchanged at
9c43dfc, so no re-triage): no new bugs. ExplicittrustedDependenciesandbun pm truston hosted / vendored packages with a postinstall keep the script running (text +bun.lockb, single + workspace, 1.2.23 / 1.3.9 / 1.4.2). Mixed per-package modes plus a superseding uuid, re-run in each mode, pass.bun install --filterfrozen installs on rewired workspaces pass. Probe-branch deletion is still refused (now by the sandbox's permission classifier). See the run 26 section below.Run 27 (main unchanged at
9c43dfc, so no re-triage): new #992. Hostedbun.lockrollback/remove/ hosted→vendored→vendor --revertwrite""into the registry slot, and Bun 1.1.39–1.3.6 resolve""against npmjs, ignoring the bunfig registry. Custom-registry projects then fail cold frozen installs (404), or silently bypass their mirror. Bun's own boundary is 1.3.7. Also passing:preinstall/install/postinstallon a scoped package with abinand an unscoped preinstall-only package (hosted / vendored × text /bun.lockb× single / workspace × 1.2.23 / 1.3.9 / 1.4.2). In untrusted projects, rewiring doesn't start running scripts.bun pm trustand--filterwork on 1.2.23. Plain re-installs leave a rewrittenbun.lockbbyte-identical. Bun 1.4.3-canary.1 passes hosted / vendored / agent, the takeover chain and rollback. Packages with only a sha1shasumrewire fine. See the run 27 section below.Coverage matrix
bun patchvex: isolated linkerbun.lockbtakeover ⇄ revertglobalStore; fail #626 (first-party workspace member)Isolated-store edge cases after #496 (run 9, Linux)
+<hash>entries--backend=symlinkvexfresh clonevexafter in-place frozen reinstall (orphaned.bunentries)vexafter in-place reinstallvendored_tree_out_of_sync(#599)Bun
globalStore(machine-wide isolated store, Bun ≥ 1.3.14; run 10, Linux).bunentries patchedvexon stale/unpatched transitiveglobalStore = truevexverified, no false out-of-sync)BUN_INSTALL_GLOBAL_STORE=1globalStore = true, hosted isolated workspacenot_affected; after rollbackvexrefuses)Hosted pins and registry credentials (run 10, Linux)
No
Authorizationheader reaches the hosted tarball host for any of: bunfig default-registry token or basic auth,.npmrchost_authToken, global_authToken,always-auth, scoped.npmrc,[install.scopes]token,NPM_CONFIG_TOKEN. That holds on 1.4.2, 1.3.14, 1.2.23 and 1.1.45, cold-cache frozen installs: pass. Control: the same configs sendBearerto the configured registry.Platform-specific optional deps (run 10, Linux)
os/cpumeta (fsevents, @esbuild/darwin-arm64, @esbuild/linux-x64). The hosted rewrite keeps the meta, and Linux frozen installs fetch only linux-x64 (patched), on 1.1.45 v0 + lockb, 1.2.23, 1.3.14, 1.4.2 text + lockb: pass. Hosted rollback is byte-exact (1.4.2): pass.minimumReleaseAgewith hosted pins (1.4.2): pass.Run 26 cells (Linux, main
9c43dfc)Fixture: a fake registry on its own origin (bunfig
[install] registry) servinghookpkg@1.0.0(apostinstallthat writes a file),plainpkgandotherpkg, plus the patch-API mock on a second origin. Oracle: fresh clone, coldbun install --frozen-lockfile(scripts enabled), the marker bytes, the postinstall's output file,bun pm untrusted, andvex.trustedDependencies: ["hookpkg"], hosted, text / lockb × single / workspacevendor_bun_workspace_unsupported, documented)bun pm trust hookpkg, hosted + vendored × text / lockb (single)vexattests)get plainpkg --mode hosted→ both hookpkg and plainpkg superseded →scan --mode vendoredtwiceredirect_revert_failed(documented: "workspace dependency behaviors it normalized … checkout remedy"),vexattests only the 2 vendoredscan --mode hostedtwice--filter m1/--filter proj/--filter '!m1'/--filter './packages/*'on hosted + vendored workspaces (text + lockb)In every superseding cell the cold frozen install had the new markers, the postinstall ran,
vexnamed the new uuids,vendor --checkwas clean, the stale artifacts were removed and the second re-run was a no-op. Aftervendor --revert+rollbackthe frozen install was unpatched; the lock differs from the pre-vendor one only by""in the registry slot of entries that went through hosted mode (the custom-registry case in Known non-bugs).Run 25 cells (Linux, main
9c43dfc)get <purl> --mode hostedfor one package: cold frozen,vex(vendored + redirected),vendor --check,vendor --revertkeeps the hosted pin,rollbackget <purl> --mode vendoredfor one package: cold frozen,vex,rollbackunwinds bothglobalStore = true+ vendored isolated workspace lockb: cold frozen,vex,vendor --checkoverrides/resolutionsforcing the patched version: hosted + vendoredbun install --lockfile-only,--force,bun add <present>,bun remove <other>bun remove <vendored pkg>→vendor --checkget --mode agenton a vendored package → scopedrollback→bun installvexhonestRun 24 cells (Linux, main
9c43dfc)bun.lockbwritten by 1.2.0 (format 2),bun addby 1.4.2 (format 3), superseding uuid, lockfile-only hosted re-run, cold frozen install,vexupdatesnames the new uuid, MARK2 installed,vexattests the new record's vuln; 1.2.0 can't read format 3, same as a socket-patch-free control)rollbackrollbackbyte-exactvendor --revertbyte-exactscans (text v2)lock_held, the others serialize;vendor --checkclean)bun.lockbscan SIGKILLed at 5–60 ms: cold frozen install, re-run,vendor --check,vendor --revert(bun pm hash-stringequals the original)JSONStream@1.3.5: hosted, vendored,vex,vendor --revert, agent +rollback, on text v2 +bun.lockbcatalog:+ namedcatalog:old) in an isolated v2 workspace: vendored, vendored → hosted takeover,rollbackbyte-exact--dry-runhosted / vendored on an isolated workspacebun.lockb(no writes);get <purl> --mode vendored(member copies written, only that package wired)get <purl> --mode hostedfor one package)Run 23 cells (Linux, main
9c43dfc)bun.lockbformat 2, upgraded to format 3 by a 1.4.2bun add: re-run,vendor --revert, scopedrollback/remove, vendored → hostedbun.lockbhosted, hosted → vendored, vendored → hosted,vendor→vendor --revertglobalStore = true+ hosted isolated workspace: sibling project, in-placevex,rollbackbun.lockwith a UTF-8 BOM, or with no final newline: hosted, rollback, vendored, revert (byte-exact)bun addinside an existing member1.4.2-canary.20261005.1Run 22 cells (Linux, main
9c43dfc)bun.lockb(5 patches, scoped + nestedms): hosted, vendored,vex, semanticvendor --revertms@2.1.2+ directms@2.1.3, both patched: text v2 + lockb × hoisted + isolated × hosted + vendored; hostedrollback pkg:npm/ms@2.1.2keeps the other pinvendor --revertbun adda new dependent → vendored re-run → 4× cold frozenms@2.0.0/ms@2.1.3): hosted lockb, vendored lockb, vendored text v2, hosted text v1remove pkg:npm/ms@2.0.0on those vendored workspace lockbs: member copies removed, other version kept,vendor --checkbun install --force→vexrefuses →applyre-patchesRun 21 cells (Linux, main
9c43dfc)+<hash>×2): apply, no cache write-through,vex,rollback; a new peer variant →vexrefuses →applypatches only itbun.lock/bun.lockb0664 (hosted + vendored); agent bin file 0755 / 0777 through apply + rollbackrollbackbyte-exact + frozen install, text v1 single + workspacebun.lockbhosted → vendored → revert; vendored → hosted → rollback refusal; single + workspacebun.lock+ stalebun.lockb: hosted / vendored,vex,vendor --check, frozenbun.lockb/bun.lock, vendoredscan/get --mode hostedfrom an isolated workspace memberbun.lock+package-lock.jsonvendored →vendor --checkbun.lockwired + stalepackage-lock.jsonwithout the package → lockfile-onlyvexRun 20 cells (Linux, main
6811b4e)bun.lockb→ new member depending on the patched pkg →bun install→ vendored re-run → fresh frozen installpackages/*/*, dir with space/ü/#, peer workspace edge, nameless root, dir ≠ namecatalog:+ namedcatalogs:workspacebun.lockb: hosted, frozen by each readerbun.lockb: frozen,vex, byte-exact revert; deleted member mirror →vendor --check/vexfail closed →repairbun.lockbhosted supersede; lockfile-only vendored takeovernode_modules)vexRun 19 cells (Linux)
.gitignore*.tgz/vendor//.socket/→ commit → fresh-clone frozen installbun.lockb, 1.2.23 text v1, 1.1.45bun.lockb, 1.4.2 v2 isolated workspacevendor --check0 undervendor//.socket/;vexfails closed)bun cion the #803 shape (workspacebun.lockb+workspace:*, hosted, migrated to text by 1.4.2)bun.lockbre-serialized by a rootbun add; fresh frozen install;vexcore.autocrlf=true: frozen,vendor --check,vex,vendor --revert, post-revert installcore.autocrlf=true: frozen,vex,rollback(CRLF kept), post-rollback installRun 18 cells (Linux)
--max-new-patches 1over 2 hidden pinsbun.lockbwithout inter-workspace deps →--save-text-lockfileby 1.4.2 → fresh frozen installrollback→bun install, workspace (hoisted default)bun addinside a workspace member after hostedbun.lockbvex(Known non-bugs)bun.lock, hostedredirect_symlinked_file_unsupported, nothing written)rollback <purl>with 2 hosted pins → frozen install; then fullrollbackbyte-exactbun.lockbre-serialized bybun addRun 17 cells (Linux)
bun.lockb→--save-text-lockfile→ hosted → vendored takeover → fresh frozen install →vendor --revertbun.lockb→--save-text-lockfile→ fresh frozen installbun.lockb→--save-text-lockfile→ fresh frozen installget <purl> --mode hostedpicks up a superseding uuid; frozen install;rollbackRun 16 cells (Linux)
bun.lockb→bun install --save-text-lockfile: pins kept, install patched,list,rollback, fresh frozen installbun.lockb→--save-text-lockfile:vendor --revert/rollback/ hosted takeovervendor --revert→bun install--filter <name>/--filter ./path/--productionremove <purl>→ advised frozen install, hoisted, hosted + vendoredRun 15 cells (Linux)
bun.lockbmeta hash, numeric/alphanumeric prerelease pairs (beta.2/beta.10,1/alpha,rc.1/rc.1.0,x.9/x.10/x.100): hosted + frozen installsoptionalPeers,optionalDependencies,bin; npm aliases beside the direct copy: hosted, frozen install,vexvex/apply/rollbackrollback/vendor --revert→ advised in-placebun installrestores upstream bytes, hoistedRun 14 cells (Linux)
+) / legacy-uppercase / scoped dotted names: hosted, vendored, agent (isolated),vex, rollback,vendor --revertbun.lockb: hosted, frozen installs by each reader, hosted → vendored → revertX@1.0.0-beta.1+ nestedX@1.0.0(also under a scoped parent), text lockbun.lockb(patch on any package)link:target matching a patchedname@versionfile:passes, hosted / vendored safe)Run 13 cells (Linux)
bun.lockbnode_modules: pass)scan --mode vendoredover hosted pins (takeover)bun.lockbvendorcommand: pass)vex, exact heal)applyor a--jsonre-run)repairon a vendoredbun.lockbisolated workspace (deleted / corrupt artifact)bun ciand--productionfrozen installs with hosted pinsRun 12 cells (Linux)
bun.lockb: hosted / vendored scan, frozen installs,vex, idempotent re-run, rollback / revert; agent scan →vex→ rollbackbun.lockbwithoverrides+trustedDependencies, hosted and vendoreda b üandc#d, scoped patched dep: hosted, hosted → vendored, byte-exactvendor --revert, scopedremovegetby CVE / GHSA / UUID / PURL / scoped name, hosted + vendoredscan(hosted, vendored), midrollback, midvendor --revert; then re-runvexskip →repairrebuilds--offline/--prefer-offlinewith hosted pins + warm registry cache--offlinefails closed)yarn.lockscan --mode hostedheals it (same aspackage-lock.json)pnpm-lock.yamlIntegrityCheckFailed(see Known non-bugs)bun add→ re-run re-pins; lockfile-onlyvexattests nothing without a pinignorePathsover workspace members (hosted + agent)includePaths,minSeverityflag > file,!/tests/)Run 11 cells (Linux)
bin(semver): meta kept,.binlinked after frozen installbun.lockb(1.1.45 writer) withbin+ scoped packages, frozen install by each readerbun updatedrops hosted pins;vexthen refuses (manifest_not_found), no false attestationrollback/vendor --revertafter the migration"left-pad": "npm:is-number@6.0.0"), hosted + vendoredvendor --revert(byte-exact pre-hosted lock)bun.lockbworkspace with nested version keys, hosted (writers 1.1.45 and 1.4.2)lock_held); lockfile-only hostedvexpackage-lock.jsonscan --mode hostedheals it (see Known non-bugs)Global mode (
-g, agent; run 3)BUN_INSTALL_BINsetBUN_INSTALL_GLOBAL_DIRset-g --mode hostedrefusalbun.cmd)bun add -gfailed in the probe's space+unicode temp path)Untested: a non-writable global dir, a symlinked
BUN_INSTALL, and Bun 1.0.x.Bundled dependencies (
bundled: truelock entries; run 4)vexvexvex --no-verifynot_applied)Non-registry copies of a patched
name@version(run 5, Linux)vexvexvex --no-verifynot_applied)file:tgz)bun.lockb(URL tgz; run 6)github:tuplessocket.ymlpolicy and staged rollout (run 6, Linux)maxNewPatches: 1advancemaxNewPatches: 1advanceignorePackageskeeps pinenabled: falsewrites nothingsocket.ymlacross several independent Bun projects in one repo (run 7, Linux)includePaths(hosted, PATH glob)maxNewPatchesacross dirsminSeverityflag > env > fileignorePathskeeps pins byte-identical!/tests/re-include**/bun.lockbmarkerAgent mode applies path policy only at the scan root, so nested independent projects are always patched. That's generic, not Bun-specific: handed to npm (
entries/npm/20261002T072532Z-from-bun.md).Workspace members under ignored paths, and growth after a scan (run 8, Linux)
tests/member: agenttests/member: hosted (frozen patched)ignorePathsover members keeps them (agent / hosted / vendored)package-lock.json+bun.lockhosted.npmrcremoved)Between a scan and its re-run, an unwired registry copy of a patched
name@versionin the same lock is still attested by vendoredvexand by hostedvex --no-verify. npm does the same, so it's handed to npm (entries/npm/20261002T133747Z-from-bun.md), not filed as a Bun bug.Also passing in run 6: a dual-lock checkout (
bun.lock+ a stalebun.lockb, where Bun ≥ 1.2 readsbun.lockand hosted rewrites only it), and global mode with a symlinkedBUN_INSTALL(1.4.2: agent scan,vex -g,rollback -g).Lock-shape edge cases (run 5, Linux)
bun.lock+ CRLFpackage.json(1.1.45 v0, 1.3.14, 1.4.2): hosted scan → frozen install →rollback, and vendored →vendor --revert. Both byte-exact: pass.bun install --yarn(siblingyarn.lock), on 1.1.45 lockb, 1.2.23 and 1.4.2: hosted rewires both locks; lockbrollbackrefuses and touches neither file: pass.[install.scopes]custom-registry scope (1.3.14, 1.4.2): hosted rewrite and byte-exact rollback: pass.vexis correct: pass.bun addafter hosted (all four versions; the pins survive) and after vendored (digest-less re-save on < 1.3.10, healed by the re-run): pass.Takeovers and vendored VEX (run 4, Linux)
vendored_tree_out_of_syncis missing (1.4.2): fail, under With Bun's isolated linker,vexattests a hosted patch as not_affected (verified) while the installed copy under node_modules/.bun is still unpatched (v5 regression) #405 (comment). Hoisted control: pass.Other passes (Linux, 1.4.2 unless noted):
scan --global, and the (pre-v5)setuphook.SOCKET_GLOBAL=1≡-g;SOCKET_GLOBAL_PREFIX/--global-prefixscan only that dir;scan -ginside a project with a bunfig settingglobalDirdoesn't leak project dirs;vexwithout-gignores global copies.remove,repairandliston hosted pins.bun.lockbidempotency,--dry-run, and the rollback refusal.catalog:andoverrides.package.json.Run 27 (Linux, main
9c43dfc)preinstall/install/postinstall+bin, and an unscoped preinstall-only package;trustedDependencies; cold frozen install runs the same scripts, links.bin, is patched,vexatteststrustedDependencies): no scripts run before or after the rewirebun pm trustafter rewiring;--frozen-lockfile --filter(m1,proj,!m1,./packages/*)bun installon a rewrittenbun.lockbleaves it byte-identical (samebun pm hash)shasum, nointegrity): hosted / vendored rewire + frozen install""diff)Backlog
-g) mode for hosted patches. Still to do: a non-writable global dir must fail loudly (needs a probe; the sandbox runs as root); Windows 1.1.45/1.2.23 with an ASCII temp path; Bun 1.0.x. Global mode misses every Bun global package when BUN_INSTALL_BIN or BUN_INSTALL_GLOBAL_DIR is set: scan -g reports success with nothing found, get -g / vex -g patch and attest nothing #443 is still open; re-test On Windows,scan -g/get -g/vex -gfind no global npm packages becausenpm root -gis spawned as barenpm, which never resolves tonpm.cmd#434 (bun.cmd) on Windows now that Fix global PM probes spawning bare names from the project (#421, #434, #438, #440) #442 has landed. Checklist: the 20261001T040000Z entry.bughunt/bun/20260930-default-trust,bughunt/bun/20260930-isolated-bunpatch,bughunt/bun/20261001-vex-isolatedandbughunt/bun/20261001-global-dirs. Deletion is still refused from the sandbox (runs 7–26; run 26: blocked by the session permission classifier), so no new probes until then.bun addvariant reproduces, run 23). Hosted scan/get run from a yarn classic workspace member still reports success while pinning nothing: the #598 governing-root refusal covers pnpm and cargo only #884 (Bun member shape) and Hosted and vendored Bun rewiring silently discards the project's ownbun patch(patchedDependencies): fresh frozen installs drop the user's patch with exit 0 #367 (PR Fix Bun rewiring dropping the project's bun patch (#367) #873): re-test when merged.*.tgz,vendor/,.socket/), so the commit drops it and every fresh checkout's install fails #831: re-test on Bun (text,bun.lockb, workspace) once Fix vendored npm-family tarballs dropped by .gitignore (#831) #837 lands. After a Bun rollback orvendor --revert, the advisedbun installkeeps the patched bytes installed on the hoisted linker (Bun reports "no changes") #764 follow-up: macOS/Windows. Real Windows autocrlf checkouts.*.tgz,vendor/,.socket/), so the commit drops it and every fresh checkout's install fails #831, After Bun migrates a vendored bun.lockb to bun.lock (bun install --save-text-lockfile), vendor --revert and rollback fail, and a superseding re-vendor drops the pre-vendor original so revert exits 0 with the project still vendored #784, After a Bun rollback orvendor --revert, the advisedbun installkeeps the patched bytes installed on the hoisted linker (Bun reports "no changes") #764, With Bun's globalStore (Bun ≥ 1.3.14), agent mode patches and rolls back every other project sharing the store, and vex attests unpatched transitive copies as not_affected #635, With Bun's isolated linker,vexrefuses every hosted patch as not_applied after the usual in-placebun install, because it checks orphanednode_modules/.bunregistry entries that Bun never removes (regression from #496) #599 and Bun hosted and vendored modes skip a URL orfile:tarball copy of the patched package without warning, and vendoredvexattests not_affected (the #326 fix covers npm locks only) #497: re-test when fixed. Agent-mode apply writes through node_modules links into first-party source (npm workspace members, file: deps, npm link targets), overwriting the user's code, and rollback restores upstream bytes instead #626 on Bun once PR Fix agent mode patching linked first-party source (#626) #634 merges. AlsoglobalStore+ workspaces andglobalStoreon macOS/Windows. (Fix npm store copies missed by agent apply and vex (#601, #603) #605/Fix store-copy fold dropping copy writes (#756, #772) #774 store copies on Bun peer-variant entries: pass, run 21.)vexattests a hosted patch as not_affected (verified) while the installed copy under node_modules/.bun is still unpatched (v5 regression) #405 / Bun hosted and vendored rewiring rewritesbundled: truelock entries that Bun never fetches: the bundled copy stays unpatched, scan reports success, and vendoredvexattests not_affected #469 / After Bun 1.4 migrates a hosted workspace bun.lockb to bun.lock,bun install --frozen-lockfilefails and Bun's suggestedbun installsilently drops the hosted pins #803 fixes (Windows isolated uses junctions).file:tarball copy of the patched package without warning, and vendoredvexattests not_affected (the #326 fix covers npm locks only) #497github:tuples (needs a probe).[install.scopes]andNPM_CONFIG_REGISTRYvariants and the 1.1.45remove/ takeover cells. (Lifecycle scripts and scoped packages with scripts onbun.lockb: pass, run 27.) (Mixed modes,globalStore+ vendored workspace lockb: pass, run 25. Superseding uuids in mixed modes, explicittrustedDependencies,bun pm trust,--filter: pass, run 26.)Known non-bugs
A registry document with only a sha1
shasumand nointegritymakes the hosted text-lock restore refuse withthe registry records no integrityand the checkout remedy (fail closed, generic npm-family code). npmjs has backfilledintegrityon old versions (minimist 0.0.8, left-pad 0.0.3, qs 0.6.6, lodash 1.0.0 all checked), so it's only reachable on bare private registries. Not filed (run 27).Lifecycle
preparedoesn't run for registry or tarball dependencies, on any Bun version, with or without socket-patch.patches-api.socket.devis blocked by the sandbox proxy. Mock the API. Also, the CLI's reqwest can't reachregistry.npmjs.orgfrom the sandbox (curl can), so hosted rollback/remove needSOCKET_NPM_REGISTRYpointed at a local passthrough. Without it you getcannot restore … error sending request, which is a sandbox artifact.Agent
rollback→missing_blobwhen the mock serves no before-blob (fixture limit).v5
rollbackremoves the rolled-back entries from.socket/manifest.json, so a laterapplyis a success no-op (CLI_CONTRACTrollbackrow).Hosted
bun.lockbpins:rollback/removerefuse with thegit checkout -- bun.lockbremedy (documented). After a hosted → vendored →vendor --revertround trip,bun.lockbis semantically identical (samebun pm hashand yarn dump) but not byte-identical: its string buffer keeps the dead URLs. The doc promises a byte-exact registry record, not the whole file.Bun 1.2.23 workspaces default to the hoisted layout (isolated only via
linker = "isolated"). From Bun 1.3.x a fresh workspace lock defaults to isolated.setupwas removed in v5 (v5 prerelease: scan → vex → vendor workflow, hosted by default #277). The run-1setuppass is obsolete.esbuild after rewiring is listed by
bun pm untrustedbut has no observable effect. Use better-sqlite3 to observe On Bun ≥ 1.3.5, hosted and vendored rewiring drops Bun's default trust, so install scripts of patched packages (better-sqlite3, esbuild, sharp…) are silently blocked #371.Documented refusals (docs/testing/bun-compatibility.md): a version-0 workspace lock in hosted mode (
redirect_bun_workspace_unsupported), a pre-v2 workspace lock in vendored mode (vendor_bun_workspace_unsupported), and missing digest enforcement for text-lock URL/local tuples on Bun < 1.3.10.Agent-mode npm aliases under Bun are npm agent-mode apply never patches an npm-aliased install (lp@npm:left-pad), yet VEX attests the package not_affected #356 (npm-owned).
--global-prefixmust name thenode_modulesdir itself (~/.bun/install/global/node_modules). Its parent scans 0 packages; the flag is documented as the packages root.-gcombined with--mode hostedis a clap-level conflict: plain-text error, exit 2, no JSON envelope even with--json. Consistent with other usage errors.Vendored
scan --dry-runexits 0 withstatus: successandwould_refusewhile the real run exits 1 withpartial_failure, for the same Bun preflight refusal. Documented (CLI_CONTRACTwould_refuse).Vendored
vexattests from the committed artifact even when the installed tree is stale. By design: only avendored_tree_out_of_syncwarning is owed.Hosted default
vexon a bundled-copy project correctly refuses (not_applied). Bun hosted and vendored rewiring rewritesbundled: truelock entries that Bun never fetches: the bundled copy stays unpatched, scan reports success, and vendoredvexattests not_affected #469 is about vendored mode and--no-verify.bun pm bin -gignores a project-localbunfig.toml, soscan -ginside a project can't be redirected by the project.Vendored, then
bun add, on Bun < 1.3.10 re-saves the local tuples withoutsha512. That's documented ("Digest-less re-saves"): the vendored re-run reportsalready_vendoredand re-pins the digest.Bun records
""as the registry field of a tuple even when it came from an[install.scopes]or custom default registry, so rollback restoring""is correct.On a
bun install --yarnproject, hostedrollbackrestoresbun.lockbyte-exact but adds a#<sha1>fragment to Bun'syarn.lockresolvedlines. It's semantically equivalent and yarn-classic's rewriter, so it isn't filed as a Bun bug.Mock fixture: build the patched tarball with a fixed gzip mtime. Otherwise a mock restart changes its sha512 and later installs fail
IntegrityCheckFailed.link:deps needbun linkregistration, andgithub:deps don't resolve in the sandbox. Both are environment limits.scan <workspace-member>(e.g.scan packages/a) with vendored refusingvendor_lockfile_missingis pinned behaviour. The hosted side (success, 0 redirected) is NOT a non-bug any more: since run 21 it's tracked on Hosted scan/get run from a yarn classic workspace member still reports success while pinning nothing: the #598 governing-root refusal covers pnpm and cargo only #884 (the isolated-workspace Bun matrix is commented there).Mode-less
scan -gis report-only. Use--mode agentto patch global copies.-gagent runs record the global copies in the cwd's.socket/manifest.json(by design).A v1/v2 text
bun.lockcan't be read by Bun 1.1.45 (lockfile had changes, but lockfile is frozen) even without socket-patch. Whenbun.lockandbun.lockbare both present, Bun ≥ 1.2 readsbun.lock.Mock fixture:
SOCKET_PATCH_SERVER_URLmust name the same origin across runs. A mock on another port makes the earlier pins non-hosted.A hosted scan at a repo root that is itself a Bun project crawls nested independent projects'
node_modulesand warnsredirect_bun_entry_not_foundfor their packages (exit 0). They have their own locks: scan them by PATH (scan '*/*' --mode hosted).Mock fixture: agent mode needs a
blob/<hash>route. Without it the result ispartial_failure.Vendored scan on a Bun 1.3.x workspace (lockfileVersion 1) refuses
vendor_bun_workspace_unsupported. That's the documented pre-v2 workspace limitation, and the lock is untouched.vexexit 2product_undetectedin a fixture without a package version or git origin: pass--product(fixture limit).Bun never prunes
node_modules/.bunentries: after a dependency is removed, its store dir (and, on 1.4.2, the member link) stays. That's Bun behaviour. It only matters to socket-patch through With Bun's isolated linker,vexrefuses every hosted patch as not_applied after the usual in-placebun install, because it checks orphanednode_modules/.bunregistry entries that Bun never removes (regression from #496) #599.Agent
applyon a workspace whose member links into an isolated store reports a duplicatealready_patchedskip per member-linked package (counts only, the bytes are right). pnpm behaves the same, so it's handed to pnpm (entries/pnpm/20261002T193154Z-from-bun.md).scan -gwithBUN_INSTALL_GLOBAL_DIRset reports the Node global prefix's packages, not Bun's. That's Global mode misses every Bun global package when BUN_INSTALL_BIN or BUN_INSTALL_GLOBAL_DIR is set: scan -g reports success with nothing found, get -g / vex -g patch and attest nothing #443, not a new bug.Hosted
vexattests darwin-only packages (fsevents, @esbuild/darwin-*) on a Linux checkout where they're not installed: the lock pins patched bytes for every platform, so that's correct.Mock fixture: in proxy mode set both
SOCKET_PROXY_URLandSOCKET_PATCH_SERVER_URL. Without the latter, hosted pins aren't recognized andvexreportsmanifest_not_found.Bun's auto-migration of a hosted
package-lock.jsonwritesbun.lockregistry 4-tuples with the hosted URL in the registry slot (["left-pad@1.3.0", "http://…/tok/<uuid>/left-pad-1.3.0.tgz", {}, "sha512-…"]). Bun installs the patched bytes from them. socket-patch fails closed on that shape (vex→patched_ref_unattributable/manifest_not_found,list/rollback→hosted_wiring_contested, no writes), and a re-run ofscan --mode hostedheals it into the canonical URL tuple. No false attestation, so not filed (run 11). Thevexdetail wording ("from elsewhere (not a Socket patch)") is inaccurate for this shape.bun updatere-resolves hosted pins back to the registry. That's Bun behaviour, andvexcorrectly stops attesting.A 1.4.2-written
bun.lockbcan't be read by Bun 1.1.45 even without socket-patch.Bun's auto-migration of a hosted
yarn.lockwrites the same registry-slot 4-tuples as thepackage-lock.jsoncase, plus a#<sha1>fragment. socket-patch fails closed, and a re-run ofscan --mode hostedheals it (run 12).Bun's auto-migration of a hosted
pnpm-lock.yaml(1.3.14, 1.4.2) ignoresresolution.tarball, downloads the registry tarball and failsIntegrityCheckFailedagainst the patched sha512, writing nobun.lock. That's a Bun migration limitation and fails closed. Remedy: migrate first, then runscan --mode hosted.get <pkg> --mode hostedfrom inside a workspace member dir is asuccessno-op withredirect_npm_no_lockfile, the same asscan <member>: tracked on Hosted scan/get run from a yarn classic workspace member still reports success while pinning nothing: the #598 governing-root refusal covers pnpm and cargo only #884 since run 21. Run it from the root.A SIGKILLed
vendor --revertcan leave a 0-byte.socket/vendor/.socket-stage-state.json-<uuid>temp file. It's harmless; the next run heals the state.Plain (human)
scan --mode agentdoesn't re-apply patches the manifest already records ([skip] … already recorded, "runsocket-patch apply"), while--jsonre-applies. It's generic, not Bun-specific: handed to npm (entries/npm/20261003T193043Z-from-bun.md). After an interrupted agent apply, usesocket-patch apply.scan --jsonapply.patches[].action(added/skipped) is the manifest record's state, not whether files were written.repairdoesn't recreate a deletedsocket-patch.vendor.jsonsidecar. It's informational only (CLI_CONTRACT). A deleted.socket/vendor/state.json→repairvendor_ledger_missing(documented v5: restore it from VCS).An interrupted vendored → hosted takeover can leave registry tuples (unpatched install) until the re-run.
vexdoesn't attest them, and the re-run heals.Hosted rollback on a lock whose registry slot holds a full custom-registry tarball URL (Bun writes one for a non-default
[install] registry) restores"". It's pinned by thecustom-registryshape inbacktest-bun.py, and the restored lock frozen-installs from the configured registry (run 14). The same holds after a vendored → hosted → vendored chain:vendor --revertrestores""for any entry that passed through hosted mode, and full URLs for entries that were only ever vendored (run 26). Correction (run 27): that's only true on Bun ≥ 1.3.7. Bun 1.1.39–1.3.6 resolve""against npmjs, which is Hosted Bun rollback/remove writes an empty registry slot that Bun < 1.3.7 resolves against npmjs, so custom-registry projects can't frozen-install after a revert #992.Bun resolves a dependency on
X@2.0.0+build.6to an installedX@2.0.0+build.5, because semver ignores build metadata. That's Bun behaviour.Bun copies
file:directory deps intonode_modules, so agent mode patches the copy, not the source. That's safe and not part of Agent-mode apply writes through node_modules links into first-party source (npm workspace members, file: deps, npm link targets), overwriting the user's code, and rollback restores upstream bytes instead #626.Mock fixture: serve the npm registry from a different origin than
SOCKET_PATCH_SERVER_URL. Otherwise the registry URLs Bun writes intobun.lockblook like hosted pins, and vendoredrollbackfailshosted_wiring_contested(run 15; with split origins it'ssuccess).The
bun.lockblegacy (link://) meta-hash dialect isn't produced by any writer in range (≥ 1.1.39); numeric prerelease ordering in the current dialect matches Bun (run 15).A plain
bun installwith only abun.lockbkeeps the binary lock on 1.2.23 / 1.3.14 / 1.4.2. Only--save-text-lockfilemigrates it (run 16).Release 4.0.0 refuses
scan --mode vendoredon abun.lockb(exit 1), so it isn't a baseline for vendored-lockb cells (run 16).A path literal (
"m1": "packages/m1") in a textbun.lockwith only registry tuples frozen-installs on 1.3.14 and 1.4.2. Only together with URL/local pins does 1.4.2 re-resolve, which is After Bun 1.4 migrates a hosted workspace bun.lockb to bun.lock,bun install --frozen-lockfilefails and Bun's suggestedbun installsilently drops the hosted pins #803 (run 17).bun add <pkg>run inside a workspace member re-resolves that member's dependencies and drops its hosted pins back to registry tuples, on text v1/v2 andbun.lockb(1.2.23 / 1.3.14 / 1.4.2). A root-levelbun addkeeps them. That's Bun behaviour, likebun update: a re-run ofscan --mode hostedheals it, andvexdoesn't attest the dropped pin (run 18).A lockfile-only hosted re-run can't see existing pins (Bun lockfile-only checkouts can't see hosted pins: hosted re-runs never pick up a superseding patch and
scan --mode vendoredskips the takeover, both reporting success with 0 packages #720), somaxNewPatchesneither counts nor defers them, and nothing is unwired (run 18).After
vendor --revertin acore.autocrlf=trueclone, the restored registry line inbun.lockis LF inside an otherwise CRLF working copy. Git normalizes it on commit (byte-exact to the pre-vendor commit) and Bun reads it, so it's cosmetic. Hostedrollbackkeeps CRLF on every line (run 19).Mock fixture:
pkill -f mock.pyalso matches the calling shell, whose command line contains the heredoc. Kill the mock by pidfile.Vendored
bun.lockbworkspaces commit an identical tarball under every member's.socket/vendor, even members that don't use the package. That's deliberate (Bun 0.5.9–1.3 resolves workspace local tarballs relative to the declaring member,bun_binary.rs:142). A missing member copy fails closed (vendor_workspace_artifact_missing), andrepairrestores it (run 20).Bun refuses a workspace member that depends on the root package via
workspace:*(root@workspace:* failed to resolve), so that After Bun 1.4 migrates a hosted workspace bun.lockb to bun.lock,bun install --frozen-lockfilefails and Bun's suggestedbun installsilently drops the hosted pins #803-heal shape can't occur (run 20).Bun 1.3.9 can't frozen-install a text
bun.lockwritten by 1.4.2 (lockfile had changes). That's cross-version Bun behaviour.get <name> --mode hostedwith several installed versions (e.g.ms@2.0.0nested +ms@2.1.3direct) acts on only one: the package-name path searches just the best fuzzy match among installed purls, by design (get.rs:2844), and names it on stderr. It isn't Bun-specific. Usescanor a purl (run 22).Fixture: git-ignore
node_modulesbefore committing, or "fresh" clones aren't empty (run 22).bun install --save-text-lockfileon 1.4.2 deletesbun.lockb;bun bun.lockbprints the ACTIVE lock (the text one when both exist). Inspect a stale binary withstrings(run 21).vexexit 2manifest_not_found("nothing to attest") after every patch is rolled back or reverted is correct (run 25).get --mode agenton an already-vendored package doesn't take it over: the manifest and the vendored ledger coexist, and a scopedrollbackunwinds both (run 25).All reactions