Repository navigation
Bug hunt ledger: Bundler (RubyGems) #316
Replies: 57 comments
|
[agent] 2026-09-30: Bundler (RubyGems) bug-hunt run This is the first run, so the ledger started empty and there were no Tested: main Setup: the sandbox can't reach the Socket patch API. I used a temporary, uncommitted copy of Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-09-30: Bundler (RubyGems) bug-hunt run Tested: main Setup: a temporary, uncommitted copy of Cells
Issues
False positives ruled out
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 Bundler (RubyGems) puts global installs: What to check (prove each with a real global install, not by reading source):
Add OS × Bundler (RubyGems) version cells for |
|
[agent] 2026-10-01: Bundler (RubyGems) bug-hunt run Tested: main Setup: for agent and Re-triage
Cells (global mode, maintainer checklist)Probe run: https://github.com/SocketDev/socket-patch/actions/runs/36816092864 (ubuntu, macos and windows × Ruby 2.7 / 3.3 / 3.4).
Other cells
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-01: handover from the Composer bug-hunt routine (lead, unverified for gem) While I was confirming #438 (Composer, Windows), the root cause turned out to be Composer evidence: #438 and the probe run https://github.com/SocketDev/socket-patch/actions/runs/36827949605 |
|
[agent] 2026-10-01: Bundler (RubyGems) bug-hunt run Tested: main Setup: a hold-open copy of Re-triage
Cells
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-01: Bundler (RubyGems) bug-hunt run Tested: main Setup: a copy of Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02: Bundler (RubyGems) bug-hunt run Tested: main Setup: uncommitted probe tests added to a copy of Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02: Bundler (RubyGems) bug-hunt run Tested: main Setup: uncommitted probes in copies of Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02: Bundler (RubyGems) bug-hunt run Tested: main Setup: uncommitted probe tests in a copy of Re-triage
Cells
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. This ledger still lists these issues as failing, but they are now closed:
Please re-check them and update the matrix on your next run. Generated by Claude Code |
|
[agent] 2026-10-02: Bundler (RubyGems) bug-hunt run Tested: main Setup: a ~30-line Python mock of the patch API serving Re-triage
Cells
Issues
False positives ruled out
Probe branches
Next
|
|
[agent] 2026-10-03: Bundler (RubyGems) bug-hunt run Tested: main Setup: a temporary Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-09: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Bundler 4.1.0.beta2 vs beta1 (lib diff): the lock Issues
False positives ruled out
Next
|
|
[agent] 2026-10-09: Bundler (RubyGems) bug-hunt run Tested: main New harness: a Python mock serving 3–4 gems (colorize / paint / rainbow / rack-test, each its own uuid, so the patch-registry Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] Janitor: drift. #1224 was closed as completed on 2026-10-09 08:01Z by #1228 ( Generated by Claude Code |
|
[agent] 2026-10-09: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] Janitor: ledger drift. These issues are now closed but this ledger still lists them as Generated by Claude Code |
|
[agent] Janitor: ledger drift. These issues are now closed but this ledger still lists them as Generated by Claude Code |
|
[agent] 2026-10-12: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-13: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Filed: #1476 (#1476), #1477 (#1477). Ruled out
Next
|
|
[agent] 2026-10-13: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Ruled out
Next
|
|
[agent] 2026-10-14: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Ruled out / notes
Next
|
|
[agent] Janitor: ledger drift for the bug-hunt routine to pick up. These issues are now closed as completed, but this ledger's body still lists them as
Generated by Claude Code |
|
[agent] 2026-10-14: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Filed: nothing. Ruled out / notes
Next
|
|
[agent] 2026-10-15: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Filed: #1573 (#1573): VEX gemspec product detection reads commented-out Ruled out / notes
Next
|
|
[agent] 2026-10-15: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
Filed: #1594 (#1594): vendored unwind after a hosted→vendored takeover leaves the patched Ruled out / notes
Next
|
|
[agent] 2026-10-16: Bundler (RubyGems) bug-hunt run Tested: main Re-triage
Cells
I read the 4.0.23 changelog: a lockfile-DSL fix in Filed / commented / closed: none. 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 Bundler (RubyGems) bug-hunt routine (label pm:bundler).
Last updated: 2026-10-16 (run 45), main
657fce2, latest release v5.0.1 (npm; no git tags). Newest Bundler tested: 4.1.0.beta2; newest stable 4.0.23 (full gem suites pass, run 45).Coverage matrix
Cells are "pass", "fail #N" or "untested". Hosted and vendored cells use a local mock of the patch API (the sandbox blocks the real one) around real
gem buildfixtures, followed by a realbundle installon a fresh checkout. The repo's own e2e suites (e2e_redirect_gem_build.rs,e2e_vendor_gem_build.rs,e2e_redirect_gem_stale_install.rs) already cover the plain single-line Gemfile cells across 1.17 → 4.x. This ledger tracks what they don't.setupand the Bundler plugin were removed in v5 (#277), so those columns are retired (the last results were 2.2–2.4 fail #389 → closed, and 2.5 / 4.x pass).Project modes
ifmodifiergroupblockBUNDLE_GEMFILEin.bundle/configGemfileonlygems.rb+GemfiletwinBUNDLE_GEMFILEgems.rbonlyvexHosted unwind (
rollback/remove, v5 upstream restore; real rubygems.org upstream)~>)groupblock + optionsOther hosted shapes (run 4)
gemspecproject (PATH)Declaration and cache shapes (run 5, hosted, Linux, Ruby 3.3.6)
eval_gemfiledeclarationgem gvendor/cacheguardcache_patheval_gemfileBUNDLE_GEMFILEenv vs.bundle/config(run 6, Linux, Ruby 3.3.6)Gemfile.next+ envGemfileGemfile.nextGemfile.nextVendored declaration shapes and lifecycle (run 7, Linux, Ruby 3.3.6)
ifmodifiergroup+platforms:gem(...)--revertbyte-exactRun 8 (Linux, Ruby 3.3.6)
groupblocksgroupdupgemspectransitiveBUNDLE_CACHE_PATHBUNDLE_APP_CONFIG+Gemfile.nextsource … do/platforms:/install_if/group:/ quotesBundler global config tier (run 9, Linux, Ruby 3.3.6)
cache_path(~/.bundle/config)cache_path(BUNDLE_USER_CONFIG)gemfile Gemfile.nextpathRun 10 (agent mode, Bundler project on system gems,
colorize@0.8.1mock patch)scan/get/vex/rollback, path with a spaceBUNDLE_PATH+ local configpathRun 11 (hosted, git-sourced declarations, Linux, Ruby 3.3.6)
git_sourcekeygitlab:"git" =>"github" =>Run 12 (Linux, Ruby 3.3.6)
git_sourcegemmirror.allin.bundle/config, no CHECKSUMSmirror.all, CHECKSUMS lockRun 13: hosted lifecycle on more shapes (mock patch API + registry, real rubygems.org upstream)
gems.rbredirect → install →rollback→ frozen installGemfile+gems.rbtwin unwindremovepurl / uuid (CRLFgems.rb)~>/group+ optsZenTest), 2-constraint declpathoutside the project (stale guard + VEX)Gemfiletoo)D:/…)Gemfiletoo)Controls for #709 (Linux, 4.0.17): config
pathrelative, configpathabsolute inside the project, envBUNDLE_PATHabsolute outside the project, andpath.system: trueall pass (stale warning;vexrefusesnot_applied).Run 14: stale-install warning flavor and
BUNDLE_IGNORE_CONFIG(Linux, Ruby 3.3.6)--cwdomitted /.../proj--cwdBUNDLE_IGNORE_CONFIG+ configpath vendor/bundlevex, same shapeRun 15: Bundler 1.17 / 2.2 / 2.3 hosted, custom lockfiles, odd files
Gemfileonlygems.rbonlyGemfile+gems.rbtwinlockfile/ envBUNDLE_LOCKFILEGemfile.lock→ pre-installvexAlso on 4.0.17: BOM
Gemfilepasses; symlinkedGemfile/ lock is refused (pass);--dry-runwrites nothing (pass).Run 16: mode takeovers (Linux, Ruby 3.3.6; OS-independent logic)
scan --mode vendored,groupdeclget --mode vendored,groupdeclvendoreject,groupdeclscan --mode hostedremove→ hosted)Run 17: vendored
repair, custom lock, standalone installs (Linux, Ruby 3.3.6)repair(corrupt / missing file / missing dir / extra file)lockfile custom.lockapply+vexonbundle install --standaloneRun 18: multi-gem hosted lifecycle and takeover (Linux, Ruby 3.3.6, real rubygems.org upstream)
rollback1 of 3, then allRun 19: single-line declaration shapes, deployment config, 2.6.9 suites (Linux, Ruby 3.3.6, real rubygems.org upstream)
# commentgem(...)y; gem "x"(patched 2nd)gem "x"; gem "y"(patched 1st)gem "x", opt; gem "y"gem "x"; gem "y"BUNDLE_DEPLOYMENTconfigvex: staleruby/<old ABI>scopegems.rb, and PR #637)Run 20 (Linux, Ruby 3.3.6, real rubygems.org upstream; plus a macOS/Windows global-mode probe)
gem "x", "1"; # c/# …; gem "y"in a commentgroup … do gem … end/gem %q(x)*V/ENV.fetch(…)/ tab /:require =>/platforms: [...]/group: [...]/"x" ,rollbackof those shapes=begin/heredoc/__END__gem "x-y", path:next to the patchedgem "x"BUNDLE_GEMFILE(6 spellings)*V/ENV.fetch(…)/CONST, require: false;now refused since #637, comment)redirect_gem_declaration_not_visible)declared_more_than_once);refused);refused)Run 21 (main
0d302dc; Linux Ruby 3.3.6 unless noted; real rubygems.org upstream)Gemfileandgems.rbpath:gem) /groupblock / CRLFGemfile, thenrollback→ frozen installPLATFORMS=x86_64-linuxonlygem(...), trailing# … if …, 2 constraints,%i[],"#{…}",!=,!true,group:+require:)gem "x", "1";/gem "x", "1"; # crollbackafter a userbundle updateof another gem--standaloneinstall (./bundle)path)CONST/*%w[]/*EXTRA/**OPTS/ two constants (after #849)uri 0.13.1), system gemsRun 22 (main
9c43dfc; Linux Ruby 3.3.6 unless noted; real rubygems.org upstream)rollback→ frozen installgems.rb+ staleGemfile.locktwin (#736 fix) + rollbackgit … do/path … do/git:(#652 fix)BUNDLE_GEMFILE= project Gemfile via symlinked dir (env /--cwd/ config);vex/rollback/tmp, ubuntu-latest)gem "x", "1"; gem "y"(bare 2nd gem)Run 23 (main
9c43dfc; Linux Ruby 3.3.6; agent mode, hand-written manifest +apply --offline)path.system: true+ leftovervendor/bundle:apply/vexBUNDLE_PATH__SYSTEM=true+ leftovervendor/bundlepath.system: true, no leftover (control)Run 24 (main
9c43dfc; Linux Ruby 3.3.6; Bundler 4.1.0.beta1)apply --offline+vex, unquotedBUNDLE_PATH: vendor/my bundle(4.1 config spelling).bundle/config(BUNDLE_PATH/GEMFILE/CACHE_PATH/PATH__SYSTEM)mirror.<patch source>quoted key vs PR #684Run 25 (main
9c43dfc; Linux Ruby 3.3.6; agentapply --offline+vexwith a hand-written manifest, realbundle install/bundle exec).bundle/configBUNDLE_PATH: .gems # comment(system copy also present)BUNDLE_PATH: .gemscontrolBUNDLE_CACHE_PATH: vendor/gems # comment+ stale archive (e2e harness case)BUNDLE_GEMFILE=gemfiles/alt.gemfile,path vendor/bundleingemfiles/.bundle/configBUNDLE_GEMFILE=gemfiles/alt.gemfile+ envBUNDLE_PATH=vendor/bundle(relative)Run 26 (main
9c43dfc; Linux Ruby 3.3.6; agentapply --offline+vex, realbundle install/bundle exec).bundledefault path (localsimulate_version 5on 4.x /default_install_uses_path trueon 2.x)BUNDLE_SIMULATE_VERSION=5/BUNDLE_DEFAULT_INSTALL_USES_PATH=true)52542dbon the #951 agent shapeRun 27 (main
9c43dfc; Linux Ruby 3.3.6;gemspeclibrary projects)redirect_gem_declaration_not_visible)gemline → fresh frozen installgemline → fresh frozen installgemline → fresh frozen installRun 28 (main
9c43dfc; Linux Ruby 3.3.6; hosted mock + real rubygems.org upstream)path vendor/bundlenot installed + unused system copysimulate_version 5, unpatched.bundleinstall25e3ca6rollback→ frozen installgit:gem: cycle +rollbackBUNDLE_PATH='~/x'Run 29 (main
d47eab3; Linux Ruby 3.3.6; hosted mock + real rubygems.org upstream, agent hand-written manifest)BUNDLE_PATH: .gems # comment)BUNDLE_GEMFILE=gemfiles/alt.gemfile)~> 1.0locked at 1.1.0, 0.8.1 only in the shared system gem home~> 1.0)source "https://rubygems.org" do(4 shapes),rollbackandremove1.0.0.pre.1ruby "3.3.6"/ruby file:/# frozen_string_literal/ trailing;/; # c(#875)install_if/platforms/group :a, :b/envblockssource: "https://rubygems.org"optionRun 30 (main
05ecc6e; Linux; agent hand-written manifest +apply --offline; realbundle install/bundle exec)ffi-1.17.2/+ffi-1.17.2-x86_64-linux-gnu/invendor/bundle(force_ruby_platformtoggled), unqualified and?platform=x86_64-linux-gnukeysGEM_HOME(gem install --platform ruby+ default)apply -gon the same pairBUNDLE_GEMFILE=gemfiles/alt.gemfile, root Gemfile present)Gemfilevexwrites nothing)Run 31 (main
05fd82b; Linux Ruby 3.3.6; hosted stale guard via thee2e_redirect_gem_stale_install.rsharness, ×2 incl. realgem env; realbundle installfor Bundler's own behaviour)pathnot installed + unused system copy (#1001 fix)deployment true(nopath)vendor/bundle)BUNDLE_DEPLOYMENT=truevendor/bundlesimulate_version 5/default_install_uses_path true.bundle)Run 32 (main
b96a785; Linux Ruby 3.3.6; agent hand-written manifest +apply --offline/apply --check; hosted via a scratch copy ofe2e_redirect_gem_build.rswith realbundle install)apply --check: system install / #915 / #967 / #951 / out-of-tree config + env path shapesapply --check: #952 shapeapply --check: #1092 dual-platform pair (both key spellings);rollback~> 2.0, older version only in the shared homeRun 33 (main
823810a; Linux Ruby 3.3.6; scratch copy ofe2e_redirect_gem_build.rs, realbundle install)lockfile custom.lockvia.bundle/config+ leftoverGemfile.lock(#749 fixture)Gemfile+gems.rbtwin (#751 fixture)lockfile "custom.lock"+ leftoverGemfile.lockRun 34 (main
cb16bdd; Linux Ruby 3.3.6; scratch copies ofe2e_redirect_gem_build.rs, realbundle install, CHECKSUMS lock)vexRun 35 (main
f3c6313; Linux Ruby 3.3.6; scratch copies ofe2e_redirect_gem_build.rs; rollout cap)--max-new-patches 0--max-new-patches 1×44d06019)--max-new-patches 0, no-CHECKSUMSupgrade: 1)Run 36 (main
a80b89e; Linux Ruby 3.3.6; 3–4 gem hosted mock + real rubygems.org upstream)rollbackfirst / middle / last / all,removemiddle → frozen installrollbackrack-test→rack) cycle +rollback--vexwith 1 of 3 refusedGemfile/gems.rb/ locklessbundle cacheafter scan →rollback/removeRun 37 (main
a8e9397, v5.0.0; Linux Ruby 3.3.6)bundle cache→rollback <bare name>/remove <versionless purl>/rollback VULN-GEM/ barerollback(#1034 target grammar)upstream_gem_stale_cachenames the archive)cache_path vendor/gemssetupplugin registered, then the v5 cleanup commit lands (block +.socket/bundler-plugin/removed)LoadError)bundle plugin uninstall)rollbackRun 38 (main
6ad6add, v5.0.0; Linux Ruby 3.3.6; agent hand-written manifest +apply --offline/vex/rollback, realbundle install/bundle exec; hosted via a scratch copy ofe2e_redirect_gem_build.rs)BUNDLE_GEMFILE=gemfiles/alt.gemfile+gemfiles/.bundle/configpathgemfile(+ gemfiles path / + root-only path), envBUNDLE_PATHrelative,gemfilesdeployment, absolute env gemfilegemfiles/gems.rb, leftover unpatched rootvendor/bundle(left untouched)ffi-1.17.2/+ffi-1.17.2-x86_64-linux-gnu/in one home: apply both / runtime /vex/rollbackbothplugin/index→applygem_bundler_plugin_stalev = if … end/v = case … endinside the user'ssource … doblock → unwind drops!Run 39 (main
15c2c83, v5.0.0; Linux Ruby 3.3.6; scratch copies ofe2e_redirect_gem_build.rs, realbundle install)v = if … endin the user'ssource … doblock →rollbackkeeps the!lockfile "custom.lock"DSL → hosted scan refusedRun 40 (main
aa85c6c, v5.0.1; Linux Ruby 3.3.6; scratch copy ofgem_hosted_unwind_keeps_a_source_block_bang, realbundle install)x = while/until/unless … end, endless def, one-linex = if … then … endin a source block (unit probe)source(\n "…"\n) do→rollback/removekeeps the!source("…") { … }→rollback/removeRun 41 (main
a8da202, v5.0.1; Linux Ruby 3.3.6; scratch copies ofe2e_redirect_gem_build.rs/e2e_vendor_gem_build.rs, realbundle install)source(opener / brace block →rollback/remove→ frozen installzz = 1; source "…" do→rollback/removein_source_blockunit probe, 52 other shapeslockfile "custom.lock"/lockfile falsegemfile_not_loaded)lockfile "Gemfile.lock"Run 42 (main
015e871, v5.0.1; Linux Ruby 3.3.6; scratch copies ofgem_hosted_unwind_keeps_a_source_block_bang, realbundle install);-opener insidegroup … do,source … do end; source … do,if true; source … doin_source_blockunit probe, 64 shapesself.sourcemiss, see Known non-bugs)Run 43 (main
e76cb9b, v5.0.1; Linux Ruby 3.3.6, Bundler 2.5.22; agent hand-written manifest +apply --offline/vex, realbundle install)GEM_HOME=BUNDLE_APP_CONFIG= one dir, committed project.bundle/configBUNDLE_PATH: vendor/bundle(ignored by Bundler) → agentapplypatches theGEM_HOMEcopy,vexattests$BUNDLE_APP_CONFIG/configsets aBUNDLE_PATHwith no install →vexrefuses# spec.version = "…"abovespec.version = Acme::VERSIONpkg:gem/acme@0.0.1)# spec.name = "…"above the real oneRun 44 (main
657fce2, v5.0.1; Linux Ruby 3.3.6; scratch copies ofe2e_redirect_gem_stale_install.rs/e2e_redirect_gem_build.rs, realbundle install/bundle cache)=begin/ heredocspec.name/spec.version, last assignment winsGEM_HOME=BUNDLE_APP_CONFIG): project.bundle/configBUNDLE_PATH/BUNDLE_DEPLOYMENTignored → shared-home warning + not attested; same keys in$BUNDLE_APP_CONFIG/config→ quiet + attested (6 variants)vendor/cachearchive → takeover advisoryupstream_gem_stale_cachevendor --revert/remove/rollbackof the vendored gem → no warning, fresh frozen install keeps patched bytesredirect_revert_failed, documented)Run 45 (main
657fce2, v5.0.1; Linux Ruby 3.3.6; the repo's real-Bundler suites withSOCKET_PATCH_BUNDLER_E2E_REQUIRED=1)e2e_redirect_gem_build(hosted, 51 tests)e2e_redirect_gem_stale_install(42 tests)e2e_vendor_gem_build(vendored, 43 tests)Global mode (
-g)scan -greport-gvs project scopingscan -g --mode hostedrefusedget -g/apply -grollback -gbyte-exactvex -g--global-prefix <gems dir>/SOCKET_GLOBAL=1Permission denied)--user-install)/Library/Ruby/Gemspartial_failure, nothing written)partial_failure, exit 1)-ginside a project leavesvendor/bundlealone)--global-prefix-ginside a Bundler projectGEM_HOME=~/.gem/ruby/<v>)@app+@globalgemsets, incl. a shadowing gemset copy)partial_failure, nothing written)-ginside a projectvendor/bundleuntouched)Backlog
(= v)!vs Bundler's merged(>= 0, = v)!) #985 / Hosted gem stale-install guard still flags an unused system gem-home copy under Bundlerdeploymentor the.bundledefault path, soscan --mode hosted --vexfails withno_applicable_patcheson fresh checkouts #1109 (agent:needs-human) and Gem vendoredremove/rollback/vendor --revertafter a hosted→vendored takeover leave the patched.geminvendor/cachewith no warning, so fresh installs of the restored upstream lock keep installing patched bytes #1594 when fixes merge.remove/rollback/vendor --revertafter a hosted→vendored takeover leave the patched.geminvendor/cachewith no warning, so fresh installs of the restored upstream lock keep installing patched bytes #1594 CHECKSUMS arm against real rubygems.org (needs an upstream the takeover can re-derive a checksum for; the mock upstream is refused).vendor/cache(does a hosted re-pin leave the vendored-era cache consistent?).BUNDLE_GEMFILE=gemfiles/x.gemfilemovesBundler.root, so a relative bundle path resolves to the wrong dir,applypatches the system copy andvexattestsnot_affectedwhile Bundler loads the unpatchedgemfiles/vendor/bundlecopy #952 withBUNDLE_GEMFILE=gemfiles\alt.gemfile, Gem agentapplypatches only the ruby-platformx-1.0/dir when ax-1.0-x86_64-linux-gnu/sibling is also installed, so Bundler loads the unpatched platform gem whilevexattestsnot_affected#1092x64-mingw-ucrt/arm64-darwinpairs, the Hosted gemrollback/removeleave the patched.gemin the project's committedvendor/cache, so every laterbundle installfails with mismatched checksums (exit 37) while the unwind reports success #1260 stale-cache warning.Known non-bugs
e2e_redirect_gem_build.rs, mount a priority-1/patches/packageanswer with asha512tarball artifact and agem-stub-gemspecartifact (gem spec <archive> --ruby); without them vendored mode failsvendor_prebuilt_required(run 44).bundle config set --local path vendor/bundlewrites to$BUNDLE_APP_CONFIG/config(Bundler's own behaviour); it still takes effect (run 44).patches-api.socket.dev/api.socket.devare blocked from the sandbox. Use a local mock API (--api-url,--api-token fake --org org). A ~60-line Python mock serving/v0/orgs/org/patches/{batch,view/<uuid>,by-package/…}withblobContentis enough for agent and-gflows; for hosted, use a hold-open copy ofe2e_redirect_gem_build.rs.--vendor-source buildis gone). To drive vendored cells, copye2e_vendor_gem_build.rs(itsprebuilt_commonfixture serves the artifact) rather than calling the CLI by hand:vendor --offlinewithout a prestaged artifact fails withvendor_service_offline_conflict, which is expected.--global-prefixtakes the package-leaf dir (<gem home>/gems), likenode_modules/site-packagesfor the other ecosystems. Pointing it at the gem home itself scans 0 packages; that's the convention, not a bug.-gagent runs keep their manifest at<cwd>/.socket/manifest.json, androllback -gremoves the entry.vex -gthen needs a freshget -gplus--product(no project to auto-detect from).bundler/gems/<name>-<sha>) isn't crawled in agent mode. Patches target registry bytes, so this is plausibly intended (unconfirmed with the docs).gems.rb-only project can't vendor. It's documented, and the refusal isno Gemfile at …/Gemfile.redirect_gem_no_checksums_section+redirect_gem_frozen_installand needs one unfrozenbundle install. Documented.-x86_64-linux) on a CHECKSUMS-less lock is redirected, and the next install switches to the patched ruby-platform gem. It's intended. With CHECKSUMS it fails closed (redirect_gem_platform_unsupported).bundle install --deploymentexits 15 on Bundler 4 (the flag was removed). UseBUNDLE_DEPLOYMENT=true/--frozen.sourceblock inside agroup … doblock dedents it. Cosmetic.String#untaintwas removed). Use Ruby 2.7 / 3.1 (setup-ruby probe) for 1.x cells.rollback/removerefuse a gem whose upstreamGEMremote isn't rubygems.org (its CHECKSUMS can't be re-derived). To test the restore, use a real rubygems.org upstream with the patch registry mocked on loopback, and pass--patch-server-url <mock>: discovery only trustspatch.socket.devor that origin.rollback, a direct dep's original constraint (~> 1.1) comes back as the exact pin"1.1.0". That's documented in "Hosted unwind coverage".rollbackreportsManifest not found. The pin is Gemfile-only, which is documented as out of the restore's reach.bundle lock --add-checksumsto get the converged shape.^\s*gemmatch). That's cosmetic, androllbackre-derives the layout.git push --deletegets 403 from the git proxy).bughunt/bundler/20261001-global-modeis left behind; its workflow is push-triggered only.scan --vextakes--vex-product, not--product(that'svex's flag). Without either, a gem project fails withproduct_undetected.vendor/cachewith a stale archive still installs unpatched on Bundler 2.4 after the hosted scan. That's documented: theredirect_gem_stale_installremedy says to delete it.require "bundler/setup"(withoutbundle exec) reads only theBUNDLE_GEMFILEenv var, not.bundle/config; the CLI commands (install,lock,exec) let.bundle/configwin. Gem manifest resolution lets theBUNDLE_GEMFILEenv var override.bundle/config, but Bundler does the reverse, so hosted mode wiresGemfilewhile bundler installsGemfile.nextunpatched and VEX attests it #507 is about the CLI order, which decides what gets installed.if/unless), indented (group) and parenthesizedgem(...)declarations withgemfile_declaration_not_editableand writes nothing. That's fail-closed by design, unlike the hosted rewriter (Hosted gem redirect breaks a multi-linegemdeclaration (the Gemfile stops parsing) and drops a trailingif/unlessmodifier #340).BUNDLER_VERSION=<v>alongsideSOCKET_PATCH_BUNDLER_E2E_VERSION=<v>to pick a Bundler older than the Ruby default (2.5.22 on 3.3.6).scanrun from a project subdirectory (or with--cwdpointing at one) scans 0 packages: the cwd is the project root, and there's no walk-up the way Bundler does it.ffi-…-x86_64-linux-gnu) is refused withplatform_gem_unsupported. Documented.source:option (redirect_gem_source_option). With--vexthe scan exits 1 and writes no VEX. That's fail-closed by design.bundle config set <key>without--local/--global, run inside a project, writes the local.bundle/configon Bundler 2.4 / 2.6 / 4.0 (verified in run 9). Only an explicit--globalreaches the global tier (Gem settings resolution skips Bundler's global config (~/.bundle/config/BUNDLE_USER_CONFIG), so a globalcache_pathorgemfilegets no warning or refusal and VEX attests an unpatched install #577).scan -g"0 found" was a "connection refused" race, not a crawler miss.bughunt/bundler/20261002-win-recheckis also left behind (git push --deletegets 403); its workflow is push-triggered only.gem_tail_source_optionmatches substrings, so a symbol such asgroup: :gitlab_ciwould trip the:gitrefusal. It's fail-closed and contrived, so it's not filed.git:,gitlab:, customgit_source) fails closed withapply_failed("GEM specs has no entry"), because the lock check fires before the Gemfile token list matters. It writes nothing, so it's not a Hosted gem redirect treats agitlab:or customgit_sourcegem as patched, so Bundler keeps loading the unpatched git checkout while VEX attestsnot_affected#652 twin.vexstill attests the redirected gem. That's consistent with the "missing files never prove staleness" rule in CLI_CONTRACT.md.get <uuid> --mode hostedfor a version the lock doesn't hold pins (and downgrades to) the patched version, adds a second CHECKSUMS entry, and leaves a mixed pair thatrollback/removecan't see (Manifest not found) until the prescribed unfrozenbundle installconverges it (after that, rollback works). The uuid path is documented as exempt from installed narrowing (run 13).BUNDLE_FROZEN, including the pristine lock. It's Bundler's own behaviour.source … doblock with LF endings (mixed endings). Bundler, frozen installs androllbackaccept it, so it's cosmetic.rollback/removecan be exercised by hand with no Rust harness: a Python mock of the patch API + the patch-registry compact index (rebuild the real.gemwithgem unpack/gem spec --ruby/gem build), with rubygems.org as the real upstream. The run-13 entry describes it; the mock must ignore nothing the CLI checks (registryOverride.identifiers.gemChecksumSha256= the sha256 of the served.gem).bughunt/bundler/20261003-hosted-xosis also left behind (git push --deletehangs up / 403); its workflow is push-triggered only.BUNDLE_IGNORE_CONFIGis not honored when the crawler reads.bundle/configpath(it is forcache_path/gemfile). It's harmless on its own: a non-default config path still gets thegem envhomes appended. The only harmful shape is a populatedvendor/bundlethat bundler doesn't use (agent patches it,vexattests while the system copy loads), and that's the documented "vendor/bundleholds stores, so nogem envhomes" rule; a leftovervendor/bundlewith no config does the same (run 14).npm pack @socketsecurity/socket-patch-linux-x64-gnu@<ver>(package/socket-patch). v4 needs--mode hostedexplicitly.bughunt/bundler/20261004-bundler1is also left behind (git push --deletehangs up); its workflow is push-triggered only.lockfile "x.lock"DSL, Bundler 4.0.17 itself refuses frozen/deployment installs ("requires a lockfile"), even with no socket-patch involvement.starts_with(cwd)sweep (run 15): the only gem-path hits arescan/hosted.rs:218/:423(Hosted gem stale-install warning calls the project's ownvendor/bundlea "shared gem home" when--cwdis left at its default (or relative), so it gives the wrong remedy and drops the committed cache archive from the delete list #729).resolve_config_bundle_pathabsolutizes before comparing.redirect_gem_source_option("carriespath:pointing into .socket/vendor … un-vendor this gem first"), exit 0, nothing written; the gem stays vendored-patched. The remedy (remove <purl>, thenscan --mode hosted) works (run 16). It's fail-safe, so it's not filed even though the contract says takeovers work both ways.crates/socket-patch-cli/tests/that startsprebuilt_common::Server::project_with_env(<root>), writes its URI, and blocks; exportSOCKET_VENDOR_URL. The root needs.socket/manifest.json+ blobs + an unpatched install. Don't let another mock answer/patches/package(→vendor_prebuilt_integrity_mismatch). Delete the scratch file afterwards.vendor/bundle/first, or the patched install travels along (run 16 false alarm).repairdoesn't restore Gemfile / lock wiring the user reverted. It reports success with no events, matching the docs ("preserves project wiring");vexreportsvendor_unwired(run 17).source … dowrites its ownGEMsection): vendored is tracked by Vendored gem refuses a gem whose spec is not in the lock's first GEM section #779 / Read Gemfile.lock sections and DEPENDENCIES entries through formats::gem in hosted and vendored modes #780 (arch audit). Hosted redirects a gem from anyGEMremote; mirrors are legitimate, so that's policy, not a bug.pkill -f/pgrep -fa name that also appears in the same shell command; it kills the agent's own shell (exit 144).--patch-server-url <api mock>is needed so vendored mode recognizes the loopback patch-registry wiring, but it also rewrites artifact download hosts. Have the API mock proxy/artifacts/*(every non-/v0, non-/patch-registryGET) to the prebuilt server, and exportSOCKET_VENDOR_URL=<prebuilt uri>as well.gemfile_declaration_not_editableand writes nothing. The takeover can't see the unconverged hosted wiring, consistent with the documented mixed-state limits (run 18).CARGO_TARGET_DIR; reusing one silently tests the wrong head (run 18 near-miss).scandefaults to hosted mode in v5. An agent probe must pass--mode agent, or it fails with "Failed to resolve patch references" against a mock with no/patches/package(run 19).cargo test --test <t> -- --ignored --include-ignoredprints no results (conflicting flags). Use--include-ignoredalone (run 19).# commenton the patched gem's line. That's cosmetic; vendored does the same and keeps the original in its ledger.vexrefusesnot_appliedwhen any crawled copy (e.g. a leftovervendor/bundle/ruby/<old ABI>scope) is unpatched, even if the live scope is patched. It's fail-safe, so it's not filed (run 19).mock.pyagent,mock2.pyhosted grant + patch-registry compact index, with ETags) are described in the run-19 entry. Each is about 50 lines, and a rebuilt marker gem (gem unpack→ append →gem spec --ruby→gem build) is enough for full hosted cycles against real rubygems.org.get --jsonon an apply that fails (e.g. a root-owned gem dir) reportsstatus: partial_failure, exit 1,applied: 0andfailed: 0:failedcounts download failures only (get.rs:2492-2506), and the reason ("Permission denied (os error 13)") only reaches the human output. That's by design and not specific to gems, so it's not filed (run 20).=begin/=end, a heredoc or after__END__is refused withredirect_gem_declared_more_than_once(nothing written). It's fail-closed, so it's not filed (run 20).rollbackofgem "x", *V/gem "x", ENV.fetch(…)leavesgem "x", "<ver>", *V: the documented exact-pin restore plus the kept argument. The lock is byte-restored and frozen installs pass (run 20).bughunt/bundler/20261005-global-macosis left behind ifgit push --deletefails; its workflow is push-triggered only.cooldownignores versions with nocreated_atand never retracts a locked version, so it doesn't affect a hosted exact pin (checked in the 4.0.22 source, run 21).--standaloneproject says "runbundle install". Plainbundle installthen installs into system gems, and the standalone app fails loudly (LoadError) untilbundle install --standaloneis re-run, which yields the patched copy. That's a remedy wording nit with no silent unpatching, so it's not filed (run 21).rollbackcan leave one extra blank line after thesourceline in the Gemfile. That's cosmetic; the lock is byte-restored (run 21).uri 0.13.1on Ruby 3.3.6) gets a regular installed copy from Bundler 4, so the crawler sees and patches it. Default gems only exist as stdlib files (gems/<name>-<ver>/empty) outside Bundler (run 21). Clean up after agent tests on system gems: they patch the real system copy.icaclsneedsMSYS2_ARG_CONV_EXCL="*", or/denyis converted into a path. A deny-write ACE(OI)(CI)(W,D,DC)on the gem dir also makes Ruby'srequirefail, so it only tests fail-closed behavior. Don't check writability by appending to the gem file (echo >>): it changes the hash and breaks the cell (run 21).bughunt/bundler/20261005-win-rois also left behind (git push --deletehangs up); its workflow is push-triggered only.vexneeds--patch-server-url <mock>too, or it finds no hosted references.vexattests as long as the installed bytes are patched (verified on disk), and refuses oncebundle installre-resolves the lock to upstream (Bundler keeps the patched installed copy, but the reference is gone). That's fail-safe, so it's not filed (run 22).bughunt/bundler/20261005-symlink-gemfileis also left behind (git push --deletehangs up); its workflow is push-triggered only..socket/manifest.json(fileskeyspackage/<rel>, git-sha256beforeHash/afterHash) plus.socket/blobs/<afterHash>by hand and runapply --offline(run 23). Restore a patched system gem withgem pristine <gem> -v <ver>.vendor/bundlewith no config while Bundler uses system gems makes agentapplypatch the unused copy andvexattest. That matches the documented "vendor/bundleholds stores, so nogem envhomes" heuristic and isn't filed; Gem crawler ignores Bundler'spath.system: truewhen a leftovervendor/bundleexists, so agentapplypatches the unused copy andvexattestsnot_affectedwhile Bundler loads the unpatched system gem #915 covers only the explicitpath.systemsignal (run 23).pathtogether withpath.system(ordisable_shared_gems) in the same tier ("Using a custom path while using system gems is unsupported"), so the crawler's handling of that combination can't mislead an install. Only the Gem crawler ignores Bundler'spath.system: truewhen a leftovervendor/bundleexists, so agentapplypatches the unused copy andvexattestsnot_affectedwhile Bundler loads the unpatched system gem #915 shape (nopath, leftovervendor/bundle) matters (run 24).parse_dir_name_versionmisparses gem names that contain-<digits>.<…>(32 of 197k rubygems.org names, all obscure, e.g.citus-rails-4.2). Not filed (run 24)..bundle/configwith unquoted values and double-quotes any key containing:(URL-scopedmirror./ credential keys). The keys main reads have no:, and backslash escaping inside quotes predates 4.1 (4.0'sinspectdid it too) (run 24).overrideDSL can't silently unpatch a hosted pin (the pinned source only serves the patched version), and it isn't counted as agemdeclaration (run 24).BUNDLE_PATH: ".gems" # c→"\".gems\"") or by trailing spaces. Bundler itself breaks there, so only the unquotedvalue # commentshape (Gem.bundle/configreader keeps a trailing# commentin the value, so a commentedBUNDLE_PATHis missed, agentapplypatches the system copy andvexattestsnot_affectedwhile Bundler loads the unpatched project copy #951) is a socket-patch bug (run 25).inspect-written values ("D:\\a\\proj","\u00FC"), and neither does socket-patch, so they agree (run 25).BUNDLE_GEMFILE=gemfiles/x.gemfile, Bundler readsgemfiles/.bundle/configand ignores the root.bundle/config(verified with 4.0.22: the rootpath vendor/bundlewent unused and the gem landed in system gems). setup-ruby'sbundler-cachewrites an absolute$PWD/vendor/bundle, so the crawler's defaultvendor/bundleprobe happens to find it; only relative paths hit Gem agent crawl ignores thatBUNDLE_GEMFILE=gemfiles/x.gemfilemovesBundler.root, so a relative bundle path resolves to the wrong dir,applypatches the system copy andvexattestsnot_affectedwhile Bundler loads the unpatchedgemfiles/vendor/bundlecopy #952 (run 25).mylib.gemspec+lib/into every fresh or scratch checkout; otherwise Bundler aborts with "There are no gemspecs" (a harness artifact, not a bug). A gemspec dev dependency with no Gemfile line is refused by hosted mode (redirect_gem_declaration_not_visible), which is fail-closed by design..bundle/configpath "~/x"(tilde, so out of tree) is skipped as a write root withgem_bundle_config_path_ignored, andvexrefusesnot_applied. Documented (Hosted gem VEX attestsnot_affectedfor an unpatched install when.bundle/configsets an out-of-treepath(absolute or~/…), because the skipped bundle root counts as "nothing installed" #709 contract); envBUNDLE_PATH='~/x'is expanded and works (run 28).gem install <gem>from a cwd that holds a rebuilt*.gemof the same name and version: RubyGems installs the local file first, which silently patches the system copy and fakes "pass" results. Reinstall from an empty dir, and check the system cache.gemsha (run 28 near-miss).pathdoesn't reuse a non-default gem from the system home (verified withrexml 3.3.9: it fetches intovendor/bundle). Default gems can still come from the system homes (run 28).~/.bundle/config)mirror.allisn't inspected by the Hosted gem redirect ignores Bundler'smirror.allsetting, so the nextbundle installfetches the redirected gem's upstream bytes from the mirror while the in-run VEX attestsnot_affected#681 mirror guard. That's documented in the docs/ecosystems.md RubyGems row ("user-global config … not inspected"), so it's not filed (run 29).Settings#pathappliesdeployment→vendor/bundleonly when no tier setspath/path.system/disable_shared_gems, so a globalpath.system trueplus a localdeployment truereally does use system gems; the crawler agrees (run 29).disable_shared_gems: falsemeans system gems in Bundler, and the crawler ignores it, but Bundler never writesfalseitself (1.x writestrueor removes the key), so it's contrived and not filed.gem "x"whose lock resolves a newer version than the shared-home copy hits Hosted gem scan pins a version that only another project installed into the shared gem home, rewritinggem "x", "~> 1.0"to the older patched"0.8.1", so the prescribedbundle installdowngrades the project's locked gem #1055, not a separate bug (run 29)..bundle/configreader keeps a trailing# commentin the value, so a commentedBUNDLE_PATHis missed, agentapplypatches the system copy andvexattestsnot_affectedwhile Bundler loads the unpatched project copy #951 fix (Fix .bundle/config values keeping a trailing # comment (#951) #953) models Bundler'sstrip_commentexactly as Bundler 2.5.22 / 2.6.9 / 4.0.18 do (x#y→x,"a#b"→a, a value starting with#kept), so those spellings are not bugs (run 30).GEM_HOMEper cell so the system gems stay clean (run 30).gem install <x> -v V --platform rubythengem install <x> -v V(needs gcc + libffi-dev forffi, both present). Bundler 2.6+ locks list every platform variant by default (run 30).deployment true(local or env) andsimulate_version 5never reuse a system gem-home copy: they fetch intovendor/bundle/.bundle(verified with real installs, run 31). The hosted stale guard's false warning there is Hosted gem stale-install guard still flags an unused system gem-home copy under Bundlerdeploymentor the.bundledefault path, soscan --mode hosted --vexfails withno_applicable_patcheson fresh checkouts #1109./usr/local/bin/ruby3.3.6 with Bundler 2.5.22 (default) + 4.0.18. Install other Bundlers into an isolatedGEM_HOME(run 31).beforeHashandafterHash) in.socket/blobs, orrollback --offlinefails with "Before blob not found" (run 32 near-miss). Never derive a fixture from an already-patched file.e2e_redirect_gem_build.rsneedsGEM_PATH=<shared home>:<system gem dir>to pick a non-default Bundler viaBUNDLER_VERSION; otherwise it silently falls back to the default 2.5.22 (run 32).lockfile "x.lock"DSL when noGemfile.lockexists ("The frozen setting requires a lockfile"). With a leftoverGemfile.lockit passes that check and reads the DSL lock. That's Bundler's own behaviour (run 33).#749/#751are fixed for the config / env / global spellings and the twin (Fix gem pair model ignoring custom lockfile and Bundler 1 twins (#749, #751) #768). The DSL spelling is tracked as a comment on Hosted gem redirect ignores Bundler 4's custom lockfile (lockfilesetting /BUNDLE_LOCKFILE), so it never pins the lock Bundler uses and frozen installs fail with no warning #749.hosted::takeover::takeover_ecosystem(cargo / npm / golang / pypi / maven), so the run-16 gem V→H refusal is unchanged (run 34).Mock::with_priority(1|2)(default priority is 5);cargo teston a cold target takes >10 min, so run it with a long background timeout (run 34).sourceblock stays, so Capped hosted gem re-scan counts a Gemfile-only (no-CHECKSUMS) pin as NEW, so--max-new-patches Nspends its budget on gems it already wired and starves the next one forever (regression from #1058) #1224 is a stuck rollout, not silent unpatching (run 35).OPTIONSregex allows_forsparse_checkout:, theoverride from:/to:DSL, empty-CHECKSUMS re-resolve only when fetching remotely) don't touch the shapes socket-patch writes; the gem suites pass (run 35).binary()in the e2e file honour aZZ_BINenv override, and build the old commit's release binary into its ownCARGO_TARGET_DIR(about 6 min) (run 35).std::env::var("X").is_ok()is true forX="", so leave scratch toggles unset rather than empty.GEMsections sort in a known order, and the compact-indexinfocarriesdeps(rack-test→rack:>= 1.3). Its/patches/batchoffers every gem whatever the query, so a lockless or shared-home scan "finds" gems the project never declared (a mock artifact, not Hosted gem scan of a Gemfile with no lock still pins shared-gem-home versions:gem "x", "~> 2.0"becomes the older patched"1.0.0", and a gem the project never declared is appended as a new dependency #1125).rollbackleaves a VEX statement whose subcomponents list only the still-patched gems, even when they share one advisory with the rolled-back gem (correct OpenVEX scoping, run 36).rollback/removeleave the patched.gemin the project's committedvendor/cache, so every laterbundle installfails with mismatched checksums (exit 37) while the unwind reports success #1260 CHECKSUMS branch can only be driven with a real rubygems.org upstream (run-36 harness); the e2e capstone covers the no-CHECKSUMS branch (run 37).Source::Path#cachenever copies a path gem that lives inside the project root, sobundle cache --allleaves vendored.socket/vendor/...gems alone andvendor/cache/<name>/can't shadow them (checked in the 4.0.18 source, run 37).setupfor migration tests (npm pack @socketsecurity/socket-patch-linux-x64-gnu@4.0.0);bundle plugin uninstallexists on Bundler 2.3+ and clears.bundle/plugin/indexeven after the plugin dir is gone (run 37).liston a hosted gem project with a loopback patch registry shows 0 results unless--patch-server-url <mock>is passed (discovery trust rule, same asvex).gem_bundler_plugin_stalereads only<root>/.bundle/plugin/index(orBUNDLE_APP_CONFIG), not the movedgemfiles/.bundleunder aBUNDLE_GEMFILEAppraisal layout. It's warning-only, so a miss there isn't filed (run 38).scan --mode agentwith an unreachable API returnsstatus: errorwith no warnings, so the v5 Bundler plugin cleanup leaves.bundle/pluginregistered in every other checkout, sobundle installcrashes with LoadError on Bundler 2.3–2.5 #1295 warning isn't shown on that path. That's expected;apply --offlineshows it (run 38).bughunt/bundler/20261012-win-mac-recheckis also left behind (git push --deletehangs up), and no run ever triggered on it; its workflow is push-triggered only.!is missing. 4.0.19+ fails with exit 16. Use 4.0.22 to show the frozen-install impact of!bugs (run 39).bundle/bundle_envhelpers ine2e_redirect_gem_build.rsstripGEM_*, so a Bundler installed into a scratchGEM_HOMEis silently not used.gem install bundler -v <v>into the system gems, then setBUNDLER_VERSION+SOCKET_PATCH_BUNDLER_E2E_VERSION(run 39).source "…", type: "rubygems" doisn't a valid Bundler source (type:selects a plugin source; Bundler fails with "Could not find gem 'bundler-source-rubygems'"). Use a paren multi-line opener to test multi-linesourceshapes (run 40).x.match? /end/) and a%w[end]argument with no parentheses. Both are contrived, so they're not filed (run 40).BUNDLE_LOCKFILEenv above the GemfilelockfileDSL, butDsl#to_definitionlets the DSL win forinstall(4.0.23 changes onlybundle lock, #9661). socket-patch follows the install order and refuses any DSL lock other than the default one, so the mismatch can't mislead an install (run 41).gemfile_not_loadedmessage forlockfile falsereads "bundler reads the lockfilelockfile false". That's cosmetic (run 41).while pgrep -f "cargo test …"match their own shell and never exit. Wait on an output file instead (run 41 near-miss).zz = 1; self.source "…" doisn't seen as a source block by the Hosted gemrollback/removestrip the DEPENDENCIES!when the user'ssource … doblock opens after a;on the same line, so frozen installs fail on Bundler 4.0.19+ #1531 fix, which deliberately excludes receiver calls (x.source). An explicitself.on a Gemfile DSL call is contrived, so it's not filed (run 42).vex --jsonneeds--output(json_requires_output); grep the human output instead in probes (run 43).e2e_gem.rsneeds the real public patch API (patches-api.socket.dev), which the sandbox blocks, so its 3 lifecycle tests fail with "tunnel error". That's a sandbox artifact. Run the Bundler suites withcargo test --no-fail-fast, or cargo stops at that first failing binary (run 45).Gem::Specification.new "name", "1.0" do |s|constructor arguments aren't read, so the purl falls back to the file stem with no version. That's rare and only touches the VEX product id, so it's not filed (run 45, read-only).All reactions