You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vendor -g and vendor --revert -g still rewire the current project: on vlt, --revert -g silently unpatches a vendored project (the #446 fix skipped vendor.rs) #498
[agent] Found by the scheduled vlt bug-hunt routine (ledger #307).
Summary
PR #446 (fixing #436 / #445) made every -g / --global-prefix run leave the cwd project's hosted pins and vendored wiring alone, but only in get, scan, apply, rollback and remove. The standalone vendor command was not changed, and it ignores global scope completely:
vendor -g run inside a project whose .socket/manifest.json holds a record (for example one written by get -g, which records the global patch in the cwd manifest) vendors into the project. It creates .socket/vendor/npm/<uuid>/…, rewires vlt-lock.json to a file~.socket+vendor+… node, and does a hosted→vendored takeover (vendor_takeover_reverted_redirect) when the project was hosted. It exits 0.
SOCKET_GLOBAL=1 / SOCKET_GLOBAL_PREFIX behave the same as the flags.
Impact
A user who patched a global tool (get -g) and then runs vendor --revert -g or vendor -g from inside their project gets their project's lockfile rewritten, with exit 0 and no warning. With --revert -g the project is unpatched on the next frozen install. This is the same class of damage as #445, which was rated p1.
Expected (CLI_CONTRACT.md)
Global scope never touches the project's state (v5.0). A --global/--global-prefix run that starts inside a project acts on the global installs only. The --cwd project's hosted pins and vendor ledger are not its target …
scan and get with --mode vendored under -g are a usage error (exit 2: "global installs have no project lockfile … to wire vendored artifacts into"). vendor -g should be refused the same way, or be a no-op on the project. vendor --revert -g must not revert the project's ledger entries.
Repro (Linux, vlt 1.3.3; a local mock registry plus patch API, as in the ledger)
The vendor -g variant: skip the scan --mode vendored step, then run get … -g followed by vendor -g --global-prefix …. vlt-lock.json gains "file~_d left-pad": "prod file:./.socket/vendor/npm/<uuid>/left-pad-1.3.0/node_modules/left-pad …" and the next vlt ci installs the vendored copy into the project.
Actual vs expected
Command (inside the project, global copy patched)
Expected
Actual
vendor --revert -g (flag or SOCKET_GLOBAL=1)
project's vendoring kept
project's vendoring reverted, rc 0, vlt ci → pristine
vendor -g
exit 2 usage error (as scan -g --mode vendored), or no project change
vendors into .socket/vendor, rewires vlt-lock.json, hosted→vendored takeover, rc 0
OS × version
OS
vlt 1.0.10
vlt 1.2.0
vlt 1.3.3
npm control (package-lock)
Linux
repro (vendor -g and --revert -g)
repro
repro (2/2 runs, flag and env)
repro (vendor --revert -g unwinds the npm project too)
macOS / Windows
untested (no probe branch this run)
untested
untested
—
The logic doesn't depend on the package manager: it reproduces against npm too. I'm filing it under vlt because that's where I found it, as with #445.
First bad
Release 4.0.0 predates vlt support. On main, vendor has never consulted global scope. #446 (551c362) fixed the sibling commands but left vendor.rs untouched, so this is a gap in that fix rather than a regression. Tested on main 61cfb9b.
Suspect code
crates/socket-patch-cli/src/commands/vendor.rs:665: only the manifest-less eject path checks is_global(). The manifest-driven vendor path (falling through to the vendoring at ~:810) and run_revert (vendor.rs:3119) never consult crate::commands::project_state_in_scope (commands/mod.rs:44) or global_mode_conflict.
[agent] Found by the scheduled vlt bug-hunt routine (ledger #307).
Summary
PR #446 (fixing #436 / #445) made every
-g/--global-prefixrun leave the cwd project's hosted pins and vendored wiring alone, but only inget,scan,apply,rollbackandremove. The standalonevendorcommand was not changed, and it ignores global scope completely:vendor --revert -grun inside a vendored project reverts the project's vendoring:vlt-lock.jsongoes back to the upstream registry entry and.socket/vendor/is deleted. It exits 0 and the global copy is untouched. The nextvlt ciinstalls pristine left-pad, so the project is silently unpatched. This is therollback -gandremove <purl> -galso unwind the current project's hosted pins and vendored wiring; on vlt they delete node_modules/left-pad too #445 failure again, reached throughvendorinstead ofrollback.vendor -grun inside a project whose.socket/manifest.jsonholds a record (for example one written byget -g, which records the global patch in the cwd manifest) vendors into the project. It creates.socket/vendor/npm/<uuid>/…, rewiresvlt-lock.jsonto afile~.socket+vendor+…node, and does a hosted→vendored takeover (vendor_takeover_reverted_redirect) when the project was hosted. It exits 0.SOCKET_GLOBAL=1/SOCKET_GLOBAL_PREFIXbehave the same as the flags.Impact
A user who patched a global tool (
get -g) and then runsvendor --revert -gorvendor -gfrom inside their project gets their project's lockfile rewritten, with exit 0 and no warning. With--revert -gthe project is unpatched on the next frozen install. This is the same class of damage as #445, which was rated p1.Expected (CLI_CONTRACT.md)
scanandgetwith--mode vendoredunder-gare a usage error (exit 2: "global installs have no project lockfile … to wire vendored artifacts into").vendor -gshould be refused the same way, or be a no-op on the project.vendor --revert -gmust not revert the project's ledger entries.Repro (Linux, vlt 1.3.3; a local mock registry plus patch API, as in the ledger)
The
vendor -gvariant: skip thescan --mode vendoredstep, then runget … -gfollowed byvendor -g --global-prefix ….vlt-lock.jsongains"file~_d left-pad": "prod file:./.socket/vendor/npm/<uuid>/left-pad-1.3.0/node_modules/left-pad …"and the nextvlt ciinstalls the vendored copy into the project.Actual vs expected
vendor --revert -g(flag orSOCKET_GLOBAL=1)vlt ci→ pristinevendor -gscan -g --mode vendored), or no project change.socket/vendor, rewiresvlt-lock.json, hosted→vendored takeover, rc 0OS × version
vendor -gand--revert -g)vendor --revert -gunwinds the npm project too)The logic doesn't depend on the package manager: it reproduces against npm too. I'm filing it under vlt because that's where I found it, as with #445.
First bad
Release 4.0.0 predates vlt support. On main,
vendorhas never consulted global scope. #446 (551c362) fixed the sibling commands but leftvendor.rsuntouched, so this is a gap in that fix rather than a regression. Tested on main61cfb9b.Suspect code
crates/socket-patch-cli/src/commands/vendor.rs:665: only the manifest-less eject path checksis_global(). The manifest-driven vendor path (falling through to the vendoring at ~:810) andrun_revert(vendor.rs:3119) never consultcrate::commands::project_state_in_scope(commands/mod.rs:44) orglobal_mode_conflict.