Summary
benchmarks.vlt.sh tracks pacquet (now 0.2.9 ≈ current main) against pnpm 11.3.0 across 8 install variations × 6 fixtures. Two of three original sub-issues landed (#11899, #11901) and one was closed as a debunked diagnosis (#11900). All three retargeted investigations are now fixed on main and waiting for vlt's nightly to pick up the next pacquet release:
Updated chart (2026-05-25)
pacquet 0.2.9 vs pnpm 11.3.0, ratio = pacquet ÷ pnpm. Bold = pacquet slower or DNF.
| Variation |
next |
astro |
svelte |
vue |
large |
babylon |
cache+lockfile+node_modules |
0.08 |
0.16 |
0.07 |
0.12 |
6.11 |
DNF |
lockfile+node_modules |
5.49 |
10.74 |
1.98 |
11.53 |
9.75 |
DNF |
cache+lockfile |
0.17 |
4.47 |
0.11 |
0.73 |
0.54 |
DNF |
cache |
0.26 |
4.03 |
0.27 |
0.46 |
0.18 |
DNF |
clean |
0.44 |
4.21 |
0.48 |
0.88 |
0.39 |
DNF |
lockfile |
0.92 |
5.50 |
0.75 |
1.61 |
1.56 |
DNF |
node_modules |
0.46 |
3.03 |
0.46 |
0.78 |
0.65 |
DNF |
cache+node_modules |
0.15 |
1.37 |
0.18 |
0.21 |
0.14 |
DNF |
Numbers from benchmarks.vlt.sh/latest/chart-data.json (commit 572a02be63). babylon cells are flagged pacquet_dnf=true in every variation. These numbers predate #11930, #11931, #11934, and #11944 — the babylon column, the lockfile+node_modules row, and the astro column are all expected to collapse once vlt's nightly picks up the next pacquet release.
Status of original sub-issues
Other trackers
Follow-ups from local vlt verification
Local re-bench against pacquet 0.2.10 (comment, investigation) confirmed the astro column collapse but surfaced two residual gaps. Both are tracked as follow-up issues; this issue stays open until they ship and vlt's nightly confirms.
Retargeted work
-
-
-
Methodology note
vlt invokes pacquet as pacquet install (no flags), so every variation that wipes the lockfile lands on the fresh-resolve path — currently the least-developed install path (Stage 2 in #11633). pacquet's integrated-benchmark mostly exercises --frozen-lockfile, which is why internal numbers look better than the published vlt chart. Reproduce with:
BENCH_INSTALL_PNPM="corepack pnpm@latest install --ignore-scripts --silent"
BENCH_INSTALL_PACQUET="pacquet install"
Goal
Pacquet ≥ pnpm on every (variation × fixture) cell in the vlt.sh chart. The astro column collapsed cleanly under pacquet 0.2.10. The remaining gap reduces to one follow-up: #11940 (no-op short-circuit ordering). Once that lands and vlt's nightly picks up the resulting release, the chart should show pacquet ahead of pnpm on every cell that previously regressed.
Written by an agent (Claude Code, claude-opus-4-7).
Summary
benchmarks.vlt.sh tracks pacquet (now
0.2.9≈ current main) against pnpm11.3.0across 8 install variations × 6 fixtures. Two of three original sub-issues landed (#11899, #11901) and one was closed as a debunked diagnosis (#11900). All three retargeted investigations are now fixed onmainand waiting for vlt's nightly to pick up the next pacquet release:→ diagnosed as a feature gap, fixed by fix(pacquet/resolving-npm-resolver): honor linkWorkspacePackages for bare-semver deps #11930 (babylonworkspaces monorepo DNFlinkWorkspacePackagesfor bare-semver deps). Residualbabylon × {node_modules, lockfile+node_modules, cache+*}DNF cells were a separate panic, fixed by fix(pacquet): port pnpm's workspace-link short-circuit and depPath helpers #11944.→ diagnosed as alockfile+node_modules(every fixture) +cache+lockfile+node_modules largeno-op missvirtualStoreDirround-trip bug + the missing abbreviated-modified verifier shortcut, fixed by perf(pacquet): unlock no-op short-circuit + port abbreviated-modified verifier shortcut #11931.→ diagnosed as a correctness bug (registryastrodeep-transitive treeoptionalDependencies+peerDependenciesMetasilently dropped during deserialization → every optional peer auto-installed → 1535 vs 377 resolutions). Fixed by fix(pacquet/registry): deserialize optionalDependencies and peerDependenciesMeta #11934. Was not any of the four perf candidates listed below; the 4–5× gap was almost all wasted work, not slow work.Updated chart (2026-05-25)
pacquet 0.2.9vspnpm 11.3.0, ratio = pacquet ÷ pnpm. Bold = pacquet slower or DNF.cache+lockfile+node_moduleslockfile+node_modulescache+lockfilecachecleanlockfilenode_modulescache+node_modulesNumbers from
benchmarks.vlt.sh/latest/chart-data.json(commit572a02be63).babyloncells are flaggedpacquet_dnf=truein every variation. These numbers predate #11930, #11931, #11934, and #11944 — the babylon column, thelockfile+node_modulesrow, and the astro column are all expected to collapse once vlt's nightly picks up the next pacquet release.Status of original sub-issues
virtualStoreDirround-trip bug fixed by perf(pacquet): unlock no-op short-circuit + port abbreviated-modified verifier shortcut #11931; thelockfile+node_modulescells should now collapse.not_planned(context). The prescription was tried in perf(pacquet): prefetch packuments during fresh-resolve tree walk #11903 and regressed the integrated-bench fresh-install path 34-40% — cooperativetry_join_allover siblings already gives the same concurrency shape pnpm gets fromPromise.all. The astro gap is real but the bottleneck lives elsewhere (likelyasync_recursionBox-pinning, per-node mutex acquires, or manifest serde — needs profiling).linkWorkspacePackagesfeature gap, fixed by fix(pacquet/resolving-npm-resolver): honor linkWorkspacePackages for bare-semver deps #11930.Other trackers
pacquet installslower thanpnpm installdue to syscall contention #11851 —pacquet installslower thanpnpm installdue to syscall contention. Now the home for install-phase sys-time work that perf(pacquet): close the remaining install-phase sys-time gap to pnpm #11857 used to track.perf(pacquet): close the remaining install-phase sys-time gap to pnpm #11857— closednot_planned(context).Follow-ups from local vlt verification
Local re-bench against
pacquet 0.2.10(comment, investigation) confirmed the astro column collapse but surfaced two residual gaps. Both are tracked as follow-up issues; this issue stays open until they ship and vlt's nightly confirms.bug(pacquet/lockfile):—PkgNameVerPeer::without_peerpanics withMismatchParenthesison some snapshot keys #11939bug(pacquet/lockfile): PkgNameVerPeer::without_peer panics with MismatchParenthesis on some snapshot keys. Cause of the 37–38× ratios inbabylon × node_modules/lockfile+node_modules. Fixed by fix(pacquet): port pnpm's workspace-link short-circuit and depPath helpers #11944 — root cause was an unported piece of pnpm's resolver: workspacelink:nodes weren't short-circuited (depth === -1arm inresolvePeersOfNode) and ended up flowing through peer resolution, producing depPaths of the shapelink:<rel-path>(<peers>)that downstream code mis-parsed. PR also closed three smaller divergences:pkgIdWithPatchHashconstruction at four call sites was using the wrong strip semantics;is_runtime_dep_pathandtry_get_package_idfromdeps/pathweren't ported.verify_lockfile_resolutions, defeating the fast path on cache wipes #11940 —perf(pacquet/install): no-op short-circuit fires after verify_lockfile_resolutions, defeating the fast path on cache wipes. Cause of thelockfile+node_modulesrow being 1.6–7.2× across fixtures even though the on-disk state is already a no-op. Two ways forward — reorder so the no-op fires first, or port pnpm's earlier shortcut.Retargeted work
pacquet/resolving-npm-resolver: honorlinkWorkspacePackagesfor bare-semver deps). Diagnosis: long-standing feature gap, not a recent regression. Babylon's root depends on@dev/build-tools: ^1.0.0(a workspace package); pacquet's resolver only routedworkspace:-prefixed specs through the workspace path, so the bare semver 404'd against npm. Residualbabylon × {node_modules, lockfile+node_modules, cache+*}DNFs after fix(pacquet/resolving-npm-resolver): honor linkWorkspacePackages for bare-semver deps #11930 were a separatewithout_peerpanic, fixed by fix(pacquet): port pnpm's workspace-link short-circuit and depPath helpers #11944.pacquet/registry: deserializeoptionalDependenciesandpeerDependenciesMeta). Diagnosis was not in the candidate list —PackageVersion(the type the npm resolver deserializes registry version metadata into) was missing those two fields, soserde_json::to_value(picked)produced a manifest with neither. Downstream,extract_childrensaw nooptionalDependenciesedges (astro'ssharpgot dropped) andextract_peer_dependenciessaw nopeerDependenciesMeta(every optional peer became "required" and theautoInstallPeersfallback inhoist_peersinstalled it). On astro that cascadedunstorage's 19 optional peers (@azure/*,@vercel/*,@netlify/blobs,@upstash/redis, ...) plus all their transitives into the install: 1535 resolutions vs pnpm's 377. After fix(pacquet/registry): deserialize optionalDependencies and peerDependenciesMeta #11934 the lockfile shape matches pnpm (377 resolutions,astro@5.18.1(rollup@4.60.4)(typescript@5.9.3)root suffix,sharppresent); warm-store install 39.6 s → 8.5 s (4.7× faster, pnpm 7.0 s); warm-cache hyperfine pacquet 670 ms vs pnpm 1.27 s (1.89× faster). See comment for full numbers.lockfile+node_modulesno-op miss → fixed by perf(pacquet): unlock no-op short-circuit + port abbreviated-modified verifier shortcut #11931 (pacquet: unlock no-op short-circuit + port abbreviated-modified verifier shortcut). Two bugs in one cell:modules-yaml'sresolve_virtual_store_dirjoined the stored relativevirtualStoreDirwithmodules_dirwithout normalising.., so the on-disk path never byte-matched the config side and the perf(pacquet): no-op short-circuit when node_modules and lockfile are already consistent #11899 short-circuit silently skipped every install with a global store. Even after that, the resolution verifier paid a full-meta GET per name because pacquet only ported 2 of pnpm's 4 publish-timestamp layers; the abbreviated-modified shortcut + on-disk mirror are now in place. Cold-cachesvelteran 2.16 s → 0.71 s (3.0× faster, vs pnpm 0.54 s); the residual ~150 ms is install-bootstrap overhead.Methodology note
vlt invokes pacquet as
pacquet install(no flags), so every variation that wipes the lockfile lands on the fresh-resolve path — currently the least-developed install path (Stage 2 in #11633). pacquet'sintegrated-benchmarkmostly exercises--frozen-lockfile, which is why internal numbers look better than the published vlt chart. Reproduce with:Goal
Pacquet ≥ pnpm on every (variation × fixture) cell in the vlt.sh chart. The astro column collapsed cleanly under
pacquet 0.2.10. The remaining gap reduces to one follow-up: #11940 (no-op short-circuit ordering). Once that lands and vlt's nightly picks up the resulting release, the chart should show pacquet ahead of pnpm on every cell that previously regressed.Written by an agent (Claude Code, claude-opus-4-7).