Repository navigation
Bug hunt ledger: vlt #307
Replies: 29 comments
|
[agent] 2026-09-30: vlt bug-hunt run Tested: main This is the first run: there was no earlier ledger and no CI status found
Cells
Issues
False positives ruled out
Probe
Next
mock.mjs (registry + patch API;
|
|
[agent] 2026-10-01: vlt bug-hunt run Tested: main Focus this run: v5 regressions. #277 replaced v4's hosted ledger with the upstream restore ( Re-triage
Cells (all pass unless noted)
Issues
False positives ruled out
Infra
Next
|
|
[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 vlt puts global installs: Whatever vlt's global install surface is on each vlt version (none, or What to check (prove each with a real global install, not by reading source):
Add OS × vlt version cells for |
|
[agent] 2026-10-01: vlt bug-hunt run Tested: main vlt has no global install surface: none of 1.0.10, 1.2.0 or 1.3.3 has Re-triage
Cells: probe run https://github.com/SocketDev/socket-patch/actions/runs/36834317384 (ubuntu / macos / windows × vlt 1.0.10 / 1.2.0 / 1.3.3) plus the Linux sandbox
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-01: vlt bug-hunt run Tested: main Re-triage
Cells: probe run https://github.com/SocketDev/socket-patch/actions/runs/36871535059 (ubuntu / macos / windows × vlt 1.0.10 / 1.2.0 / 1.3.3) plus the Linux sandbox
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-01: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-02: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-02: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-02: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-03: vlt bug-hunt run Tested: main vlt 1.3.6 vs 1.3.5: the bundle diff only touches manifest picking ( Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-03: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] Janitor: state drift. Next-steps item 9 still says to watch #579 (vlt/hosted perf regression after #472), but a maintainer closed #579 at 2026-10-03 12:24Z as expected: the slowdown comes from correctly scanning code that was skipped before. Please drop or update the item. Generated by Claude Code |
|
[agent] Janitor: ledger drift. This ledger was last updated on main
Please re-verify those cells on main Generated by Claude Code |
|
[agent] 2026-10-05: vlt bug-hunt run Tested: main Re-triage
Cells (Linux, vlt 1.2.0 and 1.3.6 unless noted)
Issues
False positives ruled out
Infra
Next
|
|
[agent] Janitor: state drift for the bug-hunt routine to pick up (this ledger body is not edited). #372 (vlt 1.3 brotli Generated by Claude Code |
|
[agent] 2026-10-06: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] Janitor: ledger drift. This ledger still lists these issues as Generated by Claude Code |
|
[agent] 2026-10-07: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] Janitor: drift. The 1.3.7 row and the next-steps list still treat #941 (brotli rollback/remove/takeover) and #942 (scan/get from a Generated by Claude Code |
|
[agent] 2026-10-08: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-09: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] Janitor: ledger drift. These issues are now closed but this ledger still lists them as Generated by Claude Code |
|
[agent] 2026-10-12: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-13: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Infra
Next
|
|
[agent] 2026-10-13: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-14: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
IssuesNone filed, none commented on: nothing met the bar. False positives ruled out
Next
|
|
[agent] 2026-10-14: vlt bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Next
|
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 vlt bug-hunt routine (label pm:vlt).
Last updated: 2026-10-14 (run 21), main
fc5458e(run 20:313d532; run 19:d4af25a) (main was squashed on 2026-10-10, so older SHAs here no longer resolve), latest release 5.0.1 (5.0.0 before it; 4.0.0 has no vlt support). Newest vlt: 1.3.8 (2026-10-09). The run-20 mock is the run-19 mock plusPEER=1(left-pad peers onpeer-host1 || 2;peer-host1.0.0 / 1.5.0 / 2.0.0, intermediatesi1→ peer-host 1,i2→ peer-host 2). The run-19 mock (left-pad@1.3.0+right-pad@1.3.0, both patchable, with a body filter;NO_ALT=enablestar.br) is attached in full to #1494, which makes it the easiest one to rebuild. Run 18 mock: two patchable packages (left-pad@1.3.0,right-pad@1.0.0), with/patches/batchand/patches/packagefiltered by body;PEER=1plus intermediatesi1/i2(peer-host 1 / 2) force two~peer.<hex>instances. Run 17 mock addsRP=/npm(registry under a path prefix): start only the registry instance with it, because a prefixed patch server gives a falseredirect_unattributable. Locally, runvlt ci --allow-scripts :scripts(otherwise vlt POSTs to api.socket.dev and the sandbox's 403 failscion 1.0.10 / 1.2.0; see #448). Run 9 mock addsleft-pad@1.2.0('old') for bump tests. The run-11 mock adds atimemap andWDEP=(wrapper's left-pad spec) for version-changing modifiers. The run-12 mock (rebuilt from the run-2 mock) addsADD=1(the patch addslib/extra/deep/new.js) andEMPTYDIR=1(the tarball ships empty dir entries), plusCDN=1andbundler. Run 14 mock (the run-2 mock from branchbughunt/vlt/20261001-v5-rollback-3os) addsCDN=1andPKG=. Run 15 addsleft-pad@1.2.0to the run-2 mock and filters/patches/batchby request body (without that filter a bumped project shows a falsepartial_failure). The sandbox has noss, so poll ports with/dev/tcp. Wait for ports 18555/18556 to free up before restarting the mock: a stale mock silently serves the previous mode. Kill mocks withpkill -f '^node .*mock[.]mjs': a bare path pattern also kills the calling shell. The run-16 mock (the run-2 mock plus the batch filter) addsFAIL_PKG=1/FAIL_ART=1,DELAY_PATH+DELAY_MS,bundler@1.0.0andPEER=1(left-pad peers onpeer-host1 || 2). Use${NO_ALT-1}, not${NO_ALT:-1}, or an emptyNO_ALT=silently keepstar.broff. To SIGINT a backgrounded run from a script, reset SIGINT toSIG_DFLfirst.Method: real vlt installs (
scripts/install-vlt.sh) against a local Node mock of the npm registry plus the patch API. It's a pure-JS tar writer, so it runs on every OS. The registry is on :18555 and the patch server on :18556 viaSOCKET_PATCH_SERVER_URL; setSOCKET_NPM_REGISTRYto the registry for v5 rollback. The oracle isrequire('left-pad')printingpatched/pristine. The 3-OS probe scripts are in the run-2 workflow (run 36803186961), the run-3 global-mode workflow (run 36834317384) and the run-4 bundled-copy workflow (run 36871535059, whose mock adds abundler@1.0.0that bundles left-pad). Run 6 mock addsPKG=(scoped names) andCDN=1(non-conventionaldist.tarball); the patch artifact leaf must be the unscoped basename. The mock's/patches/batchmust answer only for purls in the request body, orscan -gshows false hits. CI already runs the capstones and the native backtest on 57 releases × 3 OS.Coverage matrix
warmOrdinary, PR #277 run), root cause blockedconfig.registry3-tuple)tar.brregistriestar.bralternatestar.brvlt cipatched (probe run 3); peer-extra DepID across workspaces, alias / remote / file mix: pass (Linux, run 5); fail #372 withtar.br(Linux)vlt cipatched (probe run 3); frozen / vex / workspaces untested~peer.<hex>×2; lock mutation between scan and rollback); fail #372 withtar.brb1f9818(#541 fixed by #543, verified 1.2.0 / 1.3.5)dist.tarballrollback / remove: fail #521 (run 6); scoped target scan / vex: pass (1.3.3)tar.br):semver()/:v()selectors, plus a direct copy): pass; root peer+dev and peer-only: pass; #372 fixed by #820 (run 13); brotli rollback fails #941vendor_lock_entry_unsupported(documented); peer+dev root: pass:root > #wrapper > #left-pad): scan / ci / vex / rollback, plusget/repair/remove(1.3.6): pass (run 11); modifier down to 1.2.0 + direct 1.3.0: pass6811b4e): #601 fixed; #521 still fails (coldci404); npm aliaslp→left-pad: pass; pin survivesvlt install <other>/vlt uninstall <direct>, rollback = fresh lock: pass; patch adds a file in a new dir: passdb83f01): non-conventionaldist.tarballrollback / remove (also scoped): pass when the vlt registry differs fromSOCKET_NPM_REGISTRY, fail #521 residual when they're the same; scalarconfig.registry3-tuple rollback: pass (1.0.10 / 1.3.7); #941 / #942 still fail9472be4): run-2 matrix pass; #942 fixed (member refusal for every vlt pattern shape,package.jsonfallback); catalogs (1.3.7) pass; member with a strayvlt-lock.json: fail #1134--prune/--check) pass; catalogs pass; member refusedvendor_lockfile_missingpass; stray member lock: fail #1134 (vex attestsnot_affected)4aec9d7): run-2 matrix pass; #1134 fixed (#1161); dual-root member (ownvlt.json) pass; siblingpackage-lock.json(with / withoutnode_modules) pass; brotli pin survives 1.3.7 re-saves;~peer.<hex>across 2 workspaces pass; hostedremovepassvendor_multiple_lockfiles(documented);~peer.<hex>pass;removepass~peer.<hex>pass1bd3da5, v5 envelopes): run-2 matrix pass; rollback envelope incl.rollback_failedpass;--dry-runresidue-free; DepID-special member dirs (~ _ + % # ; ?) pass; path-prefixed registry pass;vlt updatedrops the pin (documented), vex refusesvlt updatekeepsfile:pass; missing vendor ledger →vendor_ledger_missingapply --checkdrift detection pass; #862 still reprosd4af25a): hosted pin beside afile:dir / tarball copy (root and member) warns, in-run VEX omits, standalone vex refuses: pass; #1437 with an alias pin and with a brotli pin: pass (#941 still restores gzip)scan packages/awith member alias (#1266): pass; scan run from a member with an alias dep: fail #1494 (also pnpm 10.28); plain-name dep from a member: pass313d532): #1494 fixed (agent alias from a member: scan / rollback / re-run / remove / vex, 2× each on 1.2.0 / 1.3.8); scoped alias@sc/x→npm:left-padfrom the root: scan / ci / vex / re-run / rollback byte-exact pass (hosted, vendored, agent; 1.2.0 / 1.3.8), from a member: documented refusals; BOMvlt.json, CRLFvlt.json, BOM memberpackage.json: pass (1.3.8); 2~peer.<hex>instances shared with a workspace member: scan / vex / remove pass, takeover refused and pin keptfile:dir / tarball copy beside a registry copy (member and root, #1511 analog): refusedvendor_lock_entry_unsupported; afile:copy added after vendoring:vexomits (patched_ref_unattributable) andvendor --checkexits 1 (pass, 1.2.0 / 1.3.8); BOM / CRLF: pass; multi-peer + member: refused (documented)fc5458e): #1134 stray member lock × root glob syntax:packages/*,{a,b},**,[ab], object group refuse (pass); extglob+(a|b)/@(a|b): fail #1542 (exit 0, pin vlt ignores)package.jsonrewritten, rootvlt ciout of sync, vexnot_affected)15c2c83): #1437 vendored + hosted mixed state → barescan/getmode_ambiguous, nothing written (1.0.10 / 1.2.0 / 1.3.8); mixed vex / list / remove / rollback pass; #1220 registry cap underulimit -n 64(rollback / remove / takeover) pass; two transitive~peer.<hex>instances pass--pruneaftervlt uninstallreverts the entry (documented GC)tar.br) scan / warm + cold install / frozen / vex / mixed lock / dev node: pass (#372 fixed); brotli rollback / remove / takeover: fail #941; scan /getfrom avlt.jsonworkspace member: fail #942 (also 1.2.0)catalog:specs, peer-shapelist/remove: pass (run 8)catalog:, peer-shape takeover refusal: pass; named catalogscatalog:<name>in workspaces: pass (run 9, also 1.2.0)catalog:: passBundled copies (a package bundling the patched name@version; vlt-lock.json never records the bundled copy)
b1f9818: pass (skip warning, vex refuses)6811b4e(run 12)6811b4e)Global mode (
-g; vlt has no global install, so this is an npm global prefix with a vlt project in the cwd)scan -greport-g/SOCKET_GLOBAL/--global-prefix×--mode hostedrefusal-g,get -g, env)--global-prefixwith space + unicoderollback -g/remove -gleave the project alonevendor -g/vendor --revert -gleave the project alonegetre-run → npm handoverglobal_scope_unsupported, project kept; run 10)Backlog
?( ),*( ),!( )), the!-order case (["!packages/a","packages/*"]) andpackage.jsonworkspaces...segments, dot-dirs (packages/.x), case on case-insensitive filesystems.remove, macOS / Windows).patch/rollback.rsis still unchanged onfc5458e; rebuild the run-12ADD=1/EMPTYDIR=1mock to re-run it.repairfrom a member with an alias dep (needs a mock that serves diff archives; the current mock givesdownload_failed).~peer.<hex>instances: vlt dedupes a member's peer-dependent package onto an existing instance even when the member pins a different peer version (see Known non-bugs). Try three intermediates (peer-host 1.0.0 / 1.5.0 / 2.0.0) with no root or member direct dep./<name>/-/<leaf>-<ver>.tgzURL instead of the registry's dist.tarball, so the next coldvlt ci404s #521 residual (same-mirrorSOCKET_NPM_REGISTRY, comment): re-check after the next restore change.vlt-compatibility.ymlisdisabled_manuallysince 2026-10-09, so CI covers no vlt macOS / Windows legs either; re-check itsnativelegs once a maintainer re-enables it.scan -g/get -g/vex -gfind no global npm packages becausenpm root -gis spawned as barenpm, which never resolves tonpm.cmd#434 (closed by Fix global PM probes spawning bare names from the project (#421, #434, #438, #440) #442): Windows with the default prefix, and the rest of the maintainer-grequest (20261001T040000Z).bughunt/vlt/*branches still need a maintainer to delete them. The run-2 mock lives inbughunt/vlt/20261001-v5-rollback-3os.Known non-bugs
patch.socket.devorSOCKET_PATCH_SERVER_URL. Against a mock without it,rollbacksays "Manifest not found" (documented).config.registryorigin, vlt omits slot [3] on re-save and the pin becomes invisible. That's a mock artifact only.\rthrough scan and rollback.vendor_lock_entry_unsupported). That's loud and fail-closed.registries.npm.vendor_vlt_transitive_unsupportedfor a target that is also a transitive dep is documented and fail-closed.vlt installwith "Integrity check failure" against registries advertisingtar.bralternates (a vlt bug, fixed in 1.3.1).redirect_npm_no_lockfileon vlt projects: it predates vlt support.vlt install -g, as of 1.0.10 … 1.3.3).-gonly covers npm/pnpm/yarn/bun globals.vex -gin a hosted or vendored project attests the cwd project's patches (the project is the VEX product). That's deliberate percommands/vex.rs:1013(cwd ledgers gate discovery under--global).-g"unwritable prefix" test needs files the user doesn't own: socket-patch may chmod files it owns.vexattests not_affected while a bundled copy of the same name@version in node_modules/.vlt stays unpatched (the #325 fix covers npm locks only) #471 (not detecting it).vlt cifails EINTEGRITY on aremote~(tarball URL) dependency whenever vlt's machine cache is warm, with or without socket-patch. It's a vlt bug that's gone by 1.2.0.~peer.<hex>instance across workspaces when the peer range is*, even with different peer versions installed.@sc/name-ver.tgz) is refused aspatched_ref_invalid. The real service uses the unscoped leaf, so that's a mock artifact..socket/apply.lock,--lock-timeout). That's by design.~peer.<hex>instances (vendor_lock_entry_unsupported, "peer/modifier variants; use --mode hosted"). That's loud and fail-closed. Hosted and agent handle the shape.vexexits 1 after the vendored target was bumped away: nothing patched is installed, so that's correct.~peer.<hex>instance, sorequirefails untilvlt install/vlt ci. That's documented, and the scan prints a warning.ci/installwith a cold machine cache fails "Failed to fetch security data" (403host_not_allowedto api.socket.dev) in the sandbox. That's a sandbox artifact; use--allow-scripts :scripts.rm -rf node_modules && vlt ci. That's expected: a reinstall replaces agent edits.~<selector>DepID suffix) and root peer-only edges withvendor_lock_entry_unsupported("use --mode hosted"). That's loud and fail-closed; hosted and agent handle both.rollbackafter a refused vendored scan returns "Manifest not found": nothing was written.catalog:member rewrites its spec tofile:, so a later catalog bump doesn't move it until rollback restorescatalog:(consistent with vendored owning the spec).node_moduleslink to a first-party workspace member /file:dir that shares the patched name@version (Fix agent mode patching linked first-party source (#626) #634, 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). That's intended. The missing failure count inscan --jsonis scan/get --json drop the agent-mode apply failure: exit 1 with failed: 0, the patch shown as "added", and no error anywhere (e.g. a read-only global ~/.m2) #424 (generic, not vlt).config.registry(3-tuple lock) and a registry whosedist.tarballisn't conventional, vlt drops the URL and a coldvlt ci404s even without socket-patch (vlt 1.0.10 … 1.3.7). That's vlt behavior.config.registry("Missing npm registry configuration"). Setregistries.npmtoo.not_plannedon 2026-10-08 pending Decide: should hosted rollback keep an originals sidecar, or restore only formats whose original is a pure function of registry data? #1130. Don't re-file it unless Decide: should hosted rollback keep an originals sidecar, or restore only formats whose original is a pure function of registry data? #1130 decides to restore the brotli entry./patches/batchanswers every request gives a bumped or uninstalled project a falsepartial_failure/redirect_vlt_entry_not_found. Filter by the request body.vlt.jsonis its own vlt project root. A refusal from it before its first install is acceptable.vlt.json, also listed by the root'sworkspaces): socket-patch treats the member as its own project, as vlt does from there. A vendored run from the member then makes the root'svlt cifail "out of sync", because the sharedpackage.jsonchanged. Run from the root to patch the root's install.redirect_vlt_artifact_unverifiableand stays vendored (documented).node_modules/<name>link ornode_modules/.vltonvlt install, with or without socket-patch. Usevlt ci.vlt cire-resolves the peer edge of a vendoredfile:node (e.g.peer-host1.0.0 → 2.0.0) and re-saves the lock. A later rollback keeps vlt's edge, so it isn't byte-exact against the pre-scan lock. That's vlt's change.resolved/integrityinto a siblingpackage-lock.jsonentry that npm wrote without them. Rollback restores the upstream registry entry (contract).vlt-lock.jsonwithout"modifiers": {}, so a hosted pin there installs pristine. socket-patch warnsredirect_vlt_old_lockfile_ignored. vlt 0.0.0-18 has nocicommand.repairagainst the mock failsdownload_failed: the mock serves no diff archives.vlt update(>= 1.0.8) re-resolves an exact spec and drops a hosted pin (documented,docs/ecosystems.md). vex then refuses. A vendoredfile:spec survives it.vexwith nothing installed attests from the lock's pin (documented in the CLI_CONTRACT hosted VEX row).rollbackwith.socket/vendordeleted fails loudly withvendor_ledger_missingand changes nothing (fail-closed).vlt ciexits 0 in that state with thefile:target missing, which is vlt's behavior.RP=on port 18556) givesredirect_unattributable: the artifact URL is off the patch host. That's a mock artifact.apply --checkon hosted / vendored vlt projects prints "No patch manifest found": vendor-owned and hosted patches are out of its scope by contract.scan --pruneon a vendored vlt project is report-only for patching, but its GC runs for real: it reverts a ledger entry whose dependencyvlt uninstalldropped and deletes that.socket/vendor/npm/<uuid>dir (documented,CLI_CONTRACT.mdmode resolution and--pruneleg (b)).scan/getfrom a vlt workspace member while the vendor ledger sits at the root runs hosted mode and refusesredirect_workspace_lockfile_elsewherewithout writing. That's fail-closed; run from the root.vlt ci(1.2.0 / 1.3.8), andvlt installin a workspace member, link afile:tarball dependency straight to the raw.tgz(node_modules/x -> ../x.tgz) instead of extracting it, with or without socket-patch. No copy can be loaded, sovexattesting the registry pin there isn't a false attestation. With the tarball copy extracted pristine (a fresh rootvlt install),vexrefuses correctly.vlt-compatibility.yml(with every other*-compatibility.yml) wasdisabled_manuallyon 2026-10-09, so it has no runs on main since. That's a maintainer choice, not a trigger bug; the blocking vlt rows run inci.yml.~peer.<hex>instance (peer-host 1.0.0) even when the member itself depends on peer-host 1.5.0, and a rootpeer-hostdep collapses every instance into one. That's vlt's peer resolution.vendor --checkon a vendored project that later gained afile:copy of the same name@version says "wiring missing: no lockfile or config references …" although the lock still references the vendored dir. The exit code (1) and VEX omission are right; only the wording is imprecise.!pattern excludes regardless of its position, but a later literal path re-includes;"packages"lists nothing. A directory excluded by!isn't its own project (vlt installthere installs the root), so socket-patch refusing from it is fail-closed.package.jsonworkspaceswith extglobs whenvlt.jsonexists withoutworkspaces(the member gets no edge), so a vendored write to that directory's own lock isn't the Hosted and vendored scans from a vlt workspace member with a stray vlt-lock.json still write to that lock and exit 0 when the root's workspaces glob uses an extglob (packages/+(a|b), packages/@(a|b)); vendored VEX then attests not_affected #1542 bug.All reactions