Skip to content

Commit f86521c

Browse files
committed
pnpm bug-hunt run 48 ledger
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HLxAzi4MrNis7sGsqnLznR
1 parent 3d0e84c commit f86521c

2 files changed

Lines changed: 58 additions & 2 deletions

File tree

‎entries/pnpm/20261017T133336Z.md‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
[agent] 2026-10-17: pnpm bug-hunt run
2+
3+
**Tested:** main `657fce2` (unchanged since run 45), release 5.0.1. Linux only. Node 22.22.0, plus Node 16.20.2 for pnpm 5/6. pnpm 5.18.10, 6.35.1, 7.33.7, 8.15.9, 9.15.9, 10.34.7, 11.28.6, 12.12.1 and 12.14.0. No new pnpm release since run 47. I rebuilt the Python mock: the org patch API for `left-pad@1.3.0` and scoped `@sp/pad@1.0.0`, plus a registry serving those, the unpatched `left-pad@1.2.0`, and `sp-wrap@1.0.0` → `left-pad@1.3.0`.
4+
5+
### Re-triage
6+
- No commits since run 45, so nothing was re-run for a fix. Nothing was closed.
7+
- Commented on **#1619** (https://github.com/SocketDev/socket-patch/issues/1619#issuecomment-6234481441): on 12.12.1, `remove pkg:npm/%40sp/pad@1.0.0` and the hosted → vendored takeover followed by `rollback` also drop the scoped `tarball:` URL (2/2 each). A vendored-only rollback stays byte-exact, which points at the hosted upstream restore. 12.14.0 is byte-exact on every path.
8+
9+
### Issues
10+
- None filed. No new defect cleared the filing bar.
11+
12+
### Cells (all on Linux)
13+
- After a hosted pin, ran `install --fix-lockfile`, `install --resolution-only`, `install --lockfile-only` and `dedupe --check` on 9 / 10 / 11 / 12.14:
14+
- `--fix-lockfile` drops the pin on 11 / 12 (upstream re-resolution; added to Known non-bugs).
15+
- `--lockfile-only` keeps it everywhere.
16+
- pnpm 12 has no `--resolution-only`.
17+
- Hosted scoped pin on 12.12.1: `remove` **fail #1619**, takeover → rollback **fail #1619**. 12.14.0: pass.
18+
- Two-version workspace (member a uses left-pad 1.3.0, member b uses 1.2.0), on 9 / 10 / 11 / 12.14:
19+
- Hosted and vendored fresh frozen install patches only a, and `--filter b` works: **pass**.
20+
- vex + rollback (hosted / vendored / agent) on 9 / 12.14: **pass**.
21+
- Concurrent scans on 12.14:
22+
- Same cwd (hosted and vendored, ×3 each): **pass**. The loser gets `lock_held`, and the lock stays valid.
23+
- Root + member cwd: the member run refuses as documented. The fresh install is patched.
24+
- `resolution-mode=time-based` lock (`time:` block) on 8 / 9 / 10: hosted pin → dead-registry frozen install → byte-exact rollback **pass**.
25+
- `npm:` alias + scoped package:
26+
- Hosted on 5.18.10 / 6.35.1 / 7.33.7: **pass**.
27+
- Agent apply → vex → rollback on 5 / 6 / 7 / 8: **pass**. (These closed legacy-lock cells that were still untested.)
28+
- Agent with hashed virtual store dirs (`virtual-store-dir-max-length=12`), direct and transitive (`sp-wrap`), on 9 / 10 / 11 / 12.14: **pass**.
29+
30+
### False positives ruled out
31+
- My first hosted fresh-clone check passed with upstream bytes because my fixture committed `node_modules`. I fixed the fixture (`.gitignore`), and the cell passes.
32+
- `vex` exit 1 on pnpm 9 after a hosted pin + plain `pnpm install`: pnpm 9 keeps the upstream bytes, so the decline is honest. That's already a Known non-bug.
33+
- Vendored from a workspace member cwd fails `vendor_lockfile_missing`. That's already a Known non-bug.
34+
35+
### Blocked
36+
- No probe branches. The stale `bughunt/pnpm/20260930-virtual-store` still needs a maintainer to delete it.
37+
38+
### Next
39+
1. #1619: a Rush lock with `pnpmVersion` 12.12, then re-verify once fixed.
40+
2. #1597 follow-ups: a transitive build package (`sp-wrap` is now in the mock fixture recipe) and a supersede.
41+
3. Agent mode over the member alias fixture.
42+
4. Re-verify the #1007 fixes: #435 (`-g` on 11/12), #713 / #714 (Rush), #830, #853, #1006.
43+
5. macOS / Windows global-mode probes, once branch cleanup works.

‎state/pnpm.md‎

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[agent] Progress ledger for the scheduled pnpm bug-hunt routine (label pm:pnpm).
22

3-
Last updated: 2026-10-17 (run 47), main `657fce2`, latest release 5.0.1. (main was force-pushed before runs 39, 43, 44 and 45, so older SHAs in this ledger may not resolve any more.)
3+
Last updated: 2026-10-17 (run 48), main `657fce2`, latest release 5.0.1. (main was force-pushed before runs 39, 43, 44 and 45, so older SHAs in this ledger may not resolve any more.)
44

55
Method: real pnpm installs. Hosted, vendored and global agent mode run against a local Python mock of the patch API (the batch and by-package routes must answer only for the purls they actually serve, or an upgraded tree looks like a failure; batch, by-package, view with inline blobs, `patches/blob/<hash>`, package grant, hosted tarball, `/registry/<name>/<ver>` mirror; `ajv-keywords@3.5.2` serves as the peer-dependency package). On v5, set `SOCKET_PATCH_SERVER_URL=<mock>` and `SOCKET_NPM_REGISTRY=<mock>/registry` so that hosted pins are recognised and rollback can restore upstream. The oracle is a marker prepended to `index.js`, checked after a fresh `--frozen-lockfile` install against a dead registry, or by running the global tool. The repo's pinned matrix (`.github/workflows/pnpm-compatibility.yml`) already covers plain hosted and vendored installs on pnpm 1–12. This ledger tracks what it doesn't.
66

@@ -510,9 +510,21 @@ Run 47 additions (main `657fce2`, release 5.0.1, Linux, Node 22.22.0; mock rebui
510510

511511
#1619 isn't a regression: release 5.0.1 behaves the same. pnpm 12.0.0–12.12.1 record a scoped registry's `tarball:` unconditionally; 7–11 and 12.13+ don't; a non-scoped `registry=` mirror isn't recorded by 12.12.1.
512512

513+
Run 48 additions (main `657fce2`, release 5.0.1, Linux, Node 22.22.0, Node 16.20.2 for pnpm 5/6; mock rebuilt: org patch API for `left-pad@1.3.0` and scoped `@sp/pad@1.0.0`, registry serving those plus unpatched `left-pad@1.2.0` and `sp-wrap@1.0.0` → `left-pad@1.3.0`):
514+
515+
| pnpm | `install --fix-lockfile` / `--resolution-only` / `--lockfile-only` / `dedupe --check` after a hosted pin | Hosted scoped pin: `remove` (scoped / other) / takeover hosted → vendored → `rollback` / vendored-only rollback | Workspace, member a = left-pad 1.3.0, member b = 1.2.0: hosted / vendored fresh frozen + `--filter b` | Same workspace: vex + rollback (hosted / vendored / agent) | Concurrent scans: same cwd (hosted, vendored ×3) / root + member cwd | `resolution-mode=time-based` lock (`time:` block): hosted pin → dead-registry frozen → rollback | `npm:` alias + scoped package: hosted pin → frozen → rollback / agent apply → vex → rollback | Agent with hashed virtual store dirs (`virtual-store-dir-max-length=12`): direct / transitive (`sp-wrap`) |
516+
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
517+
| 5.18.10 (5.2) / 6.35.1 (5.3) / 7.33.7 (5.4) | — | — | — | — | — | — | pass / pass | — |
518+
| 8.15.9 (6.0) | — | — | — | — | — | pass | — / pass | — |
519+
| 9.15.9 | kept / dropped / kept / clean | — | pass / pass | pass (vex declines after plain install: documented) / pass / pass | — | pass | — | pass / pass |
520+
| 10.34.7 | kept / kept / kept / clean | — | pass / pass | — | — | pass | — | pass / pass |
521+
| 11.28.6 | dropped / dropped / kept / clean | — | pass / pass | — | — | n/a | — | pass / — |
522+
| 12.12.1 | — | **fail #1619** / as expected / **fail #1619** (2/2) / pass (2/2) | — | — | — | n/a | — | — |
523+
| 12.14.0 | dropped / n/a (flag removed) / kept / exit 1 (would dedupe) | pass / pass / pass / pass | pass / pass | pass / pass / pass | pass (`lock_held` for the loser) / documented refusals (`redirect_pnpm_lockfile_elsewhere`, `vendor_lockfile_missing`) | n/a | — | pass / pass |
524+
513525
## Backlog
514526

515-
0ac. **#1619** (rollback drops scoped-registry `tarball:` on pnpm 12.0–12.12): re-verify once fixed on 12.0.0 / 12.12.1 and that 12.13+ stays bare; also `remove` and the hosted → vendored takeover restore over the same lock, and a Rush lock with `pnpmVersion` 12.12.
527+
0ac. **#1619** (rollback drops scoped-registry `tarball:` on pnpm 12.0–12.12): re-verify once fixed on 12.0.0 / 12.12.1 and that 12.13+ stays bare. Run 48 showed `remove` and the hosted → vendored takeover restore drop it too (commented). Still to do: a Rush lock with `pnpmVersion` 12.12.
516528
0ab. **#1597** (vendored pnpm ≥ 10.34.2 breaks build approvals for the `file:` tarball): re-verify once fixed on 10.34.7 / 11 / 12. Denials done in run 46 (12.11.2 breaks with `allowBuilds: false`, commented; 9/10/11 pass). Run 47 on 12.14.0: `allowBuilds: true` still fails (`ERR_PNPM_IGNORED_BUILDS`), an unscoped `sp-build: false` denial holds, and `false` + `dangerouslyAllowAllBuilds: true` (12.12.0 semantics) holds. Still to do: a transitive build package, a supersede (the uuid in an approval key changes), and the pnpm 10.34.2 changelog to cite the upstream change. Also check whether `vex` should stay honest about an unbuilt native addon.
517529

518530
0w. #1460 is verified fixed (run 40, all 16 env × major cells). Still to do: the `gitBranchLockfile` env variant on 12 after the fix, and the #1437 refusal over a `configDependencies` two-document lock.
@@ -558,6 +570,7 @@ Run 47 additions (main `657fce2`, release 5.0.1, Linux, Node 22.22.0; mock rebui
558570
10. Vendored on Windows and macOS (autocrlf: expect the `vendor_lockfile_crlf_unsupported` refusal, and the #853 un-hosting when switching from hosted; check that hosted handles the same checkout; hosted CRLF passes on Linux).
559571

560572
## Known non-bugs
573+
- `pnpm install --fix-lockfile` re-resolves and drops hosted pins on pnpm 11 / 12 (9 / 10 keep them), like `pnpm dedupe` and `--resolution-only`. `pnpm 12 dedupe --check` then exits 1. That's upstream re-resolution (run 48).
561574

562575
- pnpm 12.0.0–12.12.1 record `tarball:` for every scoped-registry package, and 12.13.0 stopped doing that (pnpm#16866). A lock that differs between those pnpm versions only in that field is pnpm's own behaviour. Only socket-patch's rollback dropping the field is a bug (#1619).
563576

0 commit comments

Comments
 (0)