Repository navigation
Bug hunt ledger: Poetry #311
Replies: 33 comments
|
[agent] 2026-09-30: Poetry 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 (proxy 403), so a local mock API served a real patched Cells
Issues
False positives ruled out
Probe runs
I couldn't delete either probe branch: the git proxy returned HTTP 403 on Next
|
|
[agent] 2026-09-30: Poetry bug-hunt run Tested: main Setup: the vendored cells used a synthetic Re-triage#327, #328 and #329 are still open. The fix for #327/#329 is draft PR #330, not merged. Main hasn't moved, so there was nothing to re-check. Cells
Issues
False positives ruled out
Blocked / environment
Next
|
|
[agent] 2026-10-01: Poetry bug-hunt run Tested: main Setup:
Re-triage
Cells
Issues
False positives ruled out
Observations (not filed)
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 Poetry puts global installs: Poetry has no global install; check What to check (prove each with a real global install, not by reading source):
Add OS × Poetry version cells for |
|
[agent] 2026-10-01: Poetry bug-hunt run Tested: main Focus: the maintainer request at the top of the backlog: global ( Re-triageMain is the same commit run 3 re-triaged, so I didn't re-run #327 / #328 / #329. I added new #327 evidence, below. Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-01: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-01: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02: Poetry bug-hunt run Tested: main Re-triageMain hasn't moved since run 6, so #476, #450 and #501 are unchanged. I re-ran nothing and posted no comments. #328 is now claimed by draft PR #503. Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02: Poetry bug-hunt run Tested: main
Re-triageMain hasn't moved, so #526, #501, #476, #450 and #328 are unchanged. I re-ran nothing. Cells
Issues
Leads I couldn't prove on Linux (not filed)
False positives ruled out
Next
|
|
[agent] 2026-10-02: Poetry bug-hunt run Tested: main
Re-triage
Cells
IssuesFiled nothing, commented on nothing, closed nothing. #476, #526 and #501 were already closed by maintainers. 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: Poetry bug-hunt run Tested: main
Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] Janitor: ledger drift. This ledger's matrix still lists this issue as
Please re-check those cells on main Generated by Claude Code |
|
[agent] Janitor: ledger state drift. The matrix row " Generated by Claude Code |
|
[agent] 2026-10-05: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-06: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-06 15:37Z: handover from the Pipenv bug-hunt routine (#313) On main Worth checking in your lane: a lock-only checkout (no |
|
[agent] 2026-10-07: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] Janitor: drift. The matrix still says Generated by Claude Code |
|
[agent] 2026-10-08: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] Janitor: drift. #1136 was closed as completed on 2026-10-08 20:36Z by #1137 ( Generated by Claude Code |
|
[agent] 2026-10-09: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Docs drift (not filed)
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: Poetry bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-13: Poetry bug-hunt run Tested: main Re-triage
Cells (Linux, main
|
| Poetry | Cell | Result |
|---|---|---|
| 2.5.1 | #409: system-site-packages = true in-project; six only in user site (Poetry 2 skips installing it). Agent patches the user-site copy, dpkg six untouched, vex attests, rollback byte-identical |
pass |
| 2.5.1 | same, hosted: redirect_pypi_stale_install before install; poetry install puts the patched wheel into .venv; vex attests |
pass |
| 2.5.1, 1.8.5 | same, vendored + install + vex | pass |
| 2.5.1 | same, out-of-tree env: hosted stale warning, vex refuses before install (no_applicable_patches); agent patches user site; rollback restores |
pass |
| 2.5.1 | system-site venv on a uv-managed CPython 3.12 base (six in its site-packages): agent / vex / rollback; hosted stale warning, vex refuses before install and attests after |
pass |
| 2.5.1 | system-site venv with six 1.15.0 in the venv and 1.16.0 in the base: nothing patched (shadowed by name) | pass |
| 2.5.1 | #450 | still fails (2/2) |
| 2.5.1 | #866 re-check | pass (2/2) |
| 2.5.1, 1.1.15, 1.0.10 | Vendored A → B supersede, then wheel deleted + repair, fresh install (oracle 2), vendor --check, --revert (byte-identical / equal to a fresh lock) |
pass |
| 2.5.1 | Vendored B → A with --prune (dry run verified + oldUuid, wet re-vendors) |
pass |
| 2.5.1 | Bare scan / get on a hosted-only project: stays hosted, lock unchanged |
pass |
| 1.0.10, 1.1.15, 1.8.5, 2.5.1 (+ CRLF on 1.1.15 / 2.5.1) | #1437: six vendored + toml hosted (get --mode hosted), then bare scan / get / scan --dry-run |
pass (exit 2 mode_ambiguous, nothing written; install patched both; rollback pristine) |
| 1.0.10, 1.1.15, 1.8.5, 2.5.1 (LF / CRLF) | Partial takeovers from that mixed state (--mode hosted, --mode vendored): fresh install, vex, rollback |
pass |
| 2.5.1 | Mixed state: list (both modes labelled), repair, vendor --check |
pass |
| 2.5.1 | Mixed state: remove of either package, then bare scan |
pass (mode follows the remaining state; re-adds offered patches by design) |
| 2.5.1 | Vendored via a symlinked project path (--cwd through a symlink): relative url, install, check, vex, revert |
pass |
| 2.5.1 | Nested monorepo (root + path-dep lib, each with its own lock), vendored with two directory targets: both wired to their own .socket, installs, vex, root revert byte-identical |
pass |
| 2.5.1 | six as a git dependency: hosted refuses (redirect_poetry_lock_unsupported), vendored refuses (pypi_poetry_source_already_exists, exit 1), lock untouched; agent patches the git-built install |
pass (documented) |
| 2.5.1 | poetry.toml in-project = false as [virtualenvs], dotted key, inline table, CRLF, with a stray .venv |
pass (only the Poetry env patched) |
| 2.5.1 | Global config.toml vs local poetry.toml precedence (4 combinations) + stray .venv |
pass |
| 2.5.1, 1.8.5 | POETRY_CACHE_DIR, POETRY_CONFIG_DIR (custom virtualenvs.path / cache-dir), POETRY_DATA_DIR + {data-dir} path |
pass |
| 2.5.1 | Lock 2.1 per-group markers = {main = …, dev = …}, hosted: install --only main, sync --only dev, rollback |
pass |
| 2.5.1, 1.1.15 | six as a transitive dep (via python-dateutil), hosted + vendored (depClass: transitive), fresh install, rollback |
pass |
| 2.5.1, 1.8.5 | [[tool.poetry.source]] name = "PyPI" priority = "primary" + a supplemental mirror, hosted + vendored |
pass |
| 2.5.1 | #1220 cap: hosted rollback and hosted → vendored takeover of 2 pins under ulimit -n 100 (concurrency 1) |
pass (no deadlock) |
| 2.5.1 | pyproject with a UTF-8 BOM | n/a (Poetry itself rejects it) |
| macOS / Windows | anything | blocked: deleting bughunt/poetry/* was denied again (run 19), so I pushed no probes |
Issues
None filed, commented on or closed this run.
False positives ruled out
rollbackexit 1 (vendor_revert_kept) after a hosted → vendored takeover. My harness had copied a "fresh" checkout inside the project, and itspoetry.lockstill pointed at the vendored wheels, so the residual-reference guard was right. With the copy outside the project, rollback exits 0.- A re-vendor dry run "verified with the new uuid": the event carries
oldUuid, as the e2e test asserts. - A hosted re-scan reporting
applied: 1withrewrittenFiles: []is the established idempotent shape (explicit--mode hosteddoes the same).
Next
- Re-check The #1282 source-pin guard misses Poetry 1.3 locks (no version in the @generated stamp), so hosted and vendored still rewrite a
source = "pypi"dependency andpoetry install1.3 fails with a solver error #1447 once Fix Poetry 1.3 source-pin guard (#1447) #1451 merges (1.3.x refuses; 1.2.2 / 2.3+ still rewrite; writer ≠ installer). - Re-check uv hosted → vendored takeover onto a newer patch uuid fails "no installed package found on disk" (exit 1) when the venv holds the hosted patch's bytes, while --dry-run previews success #1105 /
removeandrollbackcall a vendored PyPI residual-reference keep "lockfile wiring drifted", and their "re-runscan --mode vendoredto normalize, then remove" remedy loops (Pipenvpipenv requirementsexport) #1184 when fixed; Agent-mode rollback in the other scope (rollback -g after a project apply, or rollback after a -g apply) deletes the manifest entry and blobs while the patched copy stays patched, and exits 0 #450 when fixed. - Lead 4 (
create = falsepatches the dpkg six) still needs a maintainer call. Note that In a--system-site-packagesvenv, pip keeps the base interpreter's unpatched copy after a hosted rewrite, no stale-install warning fires, andvexattests it as patched #409 makes the in-venv analogue (a system-site venv importing a base copy) patch the base copy on purpose. - Interrupted vendored runs (kill between lock write and ledger write), using a slow-mock delay.
- macOS / Windows probes once deleting
bughunt/poetry/*is allowed.
|
[agent] 2026-10-13: Poetry bug-hunt run Tested: main Re-triage
Cells (Linux, main
|
| Poetry | Cell | Result |
|---|---|---|
| 1.3.2 | #1447 re-check, hosted + vendored | pass (refused) |
| 1.2.2 | same | pass (rewritten, installs patched) |
| writer 1.1.15 / 1.2.2 (lock 1.1) → installers 1.3.2, 2.0.1, 2.2.1, 2.3.4, 2.4.3, 2.5.1 | source = "pypi" rewrite, hosted + vendored |
fail, filed #1503 |
| writer 2.3.4 / 2.5.1 (lock 2.1) → installers 2.3.4 / 2.5.1 | same | pass |
| 1.1.15, 1.8.5, 2.5.1 × LF / CRLF | #1475: 8 hosted pins in one lock, byte-compared to v5.0.0 | pass (identical) |
| same | fresh install 8/8 patched, vex (8 subcomponents), rollback byte-identical | pass |
| 1.1.15 CRLF | lock-only hosted vex (#1486 read-only parse) | pass |
| 1.1.15, 2.5.1 × LF / CRLF | vendored 8-package batch: install, check, revert byte-identical | pass |
| 2.5.1 | Interrupted vendored scan (SIGKILL at timed points, right after the lock write, right after state.json), then check / rescan / revert / fresh install |
pass |
| 2.5.1, 1.8.5 | hosted rollback, then poetry sync / install --sync: upstream bytes return, vex refuses |
pass |
| macOS / Windows | anything | blocked: deleting bughunt/poetry/* was denied again, so no probes were pushed |
Issues
- Filed Poetry source-pin guard lets hosted and vendored rewrite a lock-version 1.1 poetry.lock that no Poetry 2.x can install, and the advisory says 2.3+ install it #1503: the source-pin guard is keyed on the lock's writer, so a lock-version 1.1
poetry.lock(written by Poetry 1.1 / 1.2) withsix = {source = "pypi"}is rewritten by hosted and vendored with exit 0. Every Poetry 2.x installer (2.0.1 – 2.5.1) then fails withRepository "pypi" does not exist., and the advisory says "2.3+ install it". Root cause: Poetry 2.x re-solves any lock older than format 2.1 (Locker.is_locked_groups_and_markers). Poetry source-pin guard lets hosted and vendored rewrite a lock-version 1.1 poetry.lock that no Poetry 2.x can install, and the advisory says 2.3+ install it #1503
False positives ruled out
- Poetry 1.0.10 can't lock a
source = "pypi"dependency at all, so lock format 1.0 isn't a case for Poetry source-pin guard lets hosted and vendored rewrite a lock-version 1.1 poetry.lock that no Poetry 2.x can install, and the advisory says 2.3+ install it #1503. - CRLF rollbacks first compared against the LF original and differed. Against the CRLF original they are byte-identical.
- A vendored scan killed partway leaves
.socket/apply.lockand partial wheels with the lock untouched. The next scan proceeds and converges.
Next
- Re-check Poetry source-pin guard lets hosted and vendored rewrite a lock-version 1.1 poetry.lock that no Poetry 2.x can install, and the advisory says 2.3+ install it #1503 once fixed (lock 1.0 / 1.1 refused or the advisory corrected; lock 2.1 from 2.3+ still rewrites).
- Re-check uv hosted → vendored takeover onto a newer patch uuid fails "no installed package found on disk" (exit 1) when the venv holds the hosted patch's bytes, while --dry-run previews success #1105 /
removeandrollbackcall a vendored PyPI residual-reference keep "lockfile wiring drifted", and their "re-runscan --mode vendoredto normalize, then remove" remedy loops (Pipenvpipenv requirementsexport) #1184 / Agent-mode rollback in the other scope (rollback -g after a project apply, or rollback after a -g apply) deletes the manifest entry and blobs while the patched copy stays patched, and exits 0 #450 once fixed. - Lead 4 (
create = falsepatches the dpkg six) still needs a maintainer call. - Concurrent
poetry installduring a scan; interrupted hosted runs. - macOS / Windows probes once deleting
bughunt/poetry/*is allowed.
|
[agent] 2026-10-14: Poetry bug-hunt run Tested: main Re-triage
Cells (Linux, main
|
| Poetry | Cell | Result |
|---|---|---|
| 1.1.15 | #1503 re-check, hosted + vendored | pass (refused, lock untouched) |
| 2.5.1 | Hosted scan killed with SIGKILL at 50 ms – 1 s | pass (the run finishes in under 50 ms; the lock is always the original or the full rewrite) |
| 1.1.15, 1.8.5, 2.5.1 | Optional extra (six optional, [tool.poetry.extras]): hosted, install without and with -E s, vex |
pass (absent / patched) |
| 1.1.15, 2.5.1 | Same, vendored + vendor --check |
pass |
| 2.0.1, 2.2.1 (LF + CRLF) | hosted → vendored → hosted takeovers, fresh install after each, rollback | pass (patched each time; rollback byte-identical) |
| 2.0.1, 2.2.1, 2.5.1 | PEP 621 [project] dynamic = ["version"] + [tool.poetry] version, no git remote: vex, scan --mode hosted --vex |
fail, filed #1527 |
| 2.5.1 | Same with a static [project].version (control) |
pass |
| 2.5.1 | #450 | still fails |
| macOS / Windows | anything | blocked: deleting bughunt/poetry/* was denied again, so no probes were pushed |
Issues
- Filed VEX product detection fails on Poetry 2 projects that declare dynamic = ["version"] with the version in [tool.poetry], so scan --vex exits 1 after rewriting poetry.lock #1527:
vex/product.rs::parse_pyprojectneedsnameandversionfrom the same section. Poetry 2's documented dynamic-version layout keepsnamein[project]andversionin[tool.poetry], sovexexits 2 andscan --vexexits 1 withproduct_undetected, after writing the hosted pin. This isn't a duplicate of VEX product detection ignores PDM 0.x's [tool.pdm] name/version, so vex and scan --vex fail with product_undetected on PDM 0.12 projects (after scan has already rewritten pdm.lock) #642, which is about the missing[tool.pdm]fallback. VEX product detection fails on Poetry 2 projects that declare dynamic = ["version"] with the version in [tool.poetry], so scan --vex exits 1 after rewriting poetry.lock #1527
False positives ruled out
- An early "scan patched the global six" came from a broken test
pyproject.toml(invalid TOML from my harness), so the project wasn't recognised as Poetry. Not a product bug. Restored withrollback -g. - The source-pin guard already reads
dev-dependenciesand everygroup.*.dependencies(unit-tested), so a group-onlysource = "pypi"pin isn't a gap.
Next
- Re-check VEX product detection fails on Poetry 2 projects that declare dynamic = ["version"] with the version in [tool.poetry], so scan --vex exits 1 after rewriting poetry.lock #1527 once fixed. Also check the variant where
[project]has a name and dynamic version and[tool.poetry]also has a stalename: the current code would then pick the[tool.poetry]name. - Re-check uv hosted → vendored takeover onto a newer patch uuid fails "no installed package found on disk" (exit 1) when the venv holds the hosted patch's bytes, while --dry-run previews success #1105 /
removeandrollbackcall a vendored PyPI residual-reference keep "lockfile wiring drifted", and their "re-runscan --mode vendoredto normalize, then remove" remedy loops (Pipenvpipenv requirementsexport) #1184 / Agent-mode rollback in the other scope (rollback -g after a project apply, or rollback after a -g apply) deletes the manifest entry and blobs while the patched copy stays patched, and exits 0 #450 once fixed. - Lead 3 (
create = falsepatches the dpkg six) still needs a maintainer call. - Concurrent
poetry installduring a scan; untested Linux cells (1.2.2 agent, 2.1.x, 1.0.10 vendored repair). - macOS / Windows probes once deleting
bughunt/poetry/*is allowed.
|
[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: Poetry bug-hunt run Tested: main Re-triage
Cells (Linux, main
|
| Poetry | Cell | Result |
|---|---|---|
| 2.5.1 | #1527 re-check | pass |
| 2.5.1 | #1527 variant with a stale [tool.poetry].name |
product_undetected, deliberate (Poetry 1.x and 2.x build different names); known non-bug |
| 2.1.4 | Hosted (install, poetry sync, rollback byte-identical), vendored (vendor --check), agent in-project (scan, re-run, vex) and out-of-tree venv, hosted ⇄ vendored takeovers with a fresh install after each, vendored repair with the wheel deleted |
pass |
| 1.8.5, 2.5.1 | explicit / supplemental [[tool.poetry.source]] that six doesn't come from: hosted + vendored + fresh install |
pass |
| 1.8.5, 2.5.1 | VEX product purl for My_Service / Demo_Pkg.Core |
fail, filed #1547 |
| 2.5.1 | #450 | still fails |
| macOS / Windows | anything | blocked: deleting bughunt/poetry/* is still denied, so no probes were pushed |
Issues
- Filed VEX product purl detected from pyproject.toml keeps the raw project name (pkg:pypi/My_Service) instead of the normalized pypi name #1547:
vex/product.rs::parse_pyprojectputs the raw project name into the product purl (pkg:pypi/My_Service@1.2.0) instead of the normalized pypi name (my-service). Reproduces in hosted--vex(Poetry 1.8.5,[tool.poetry]) and agent + standalonevex(Poetry 2.5.1,[project]). VEX product purl detected from pyproject.toml keeps the raw project name (pkg:pypi/My_Service) instead of the normalized pypi name #1547
False positives ruled out
- The first hosted → vendored takeover on 2.1.4 failed (exit 1, "already declares a [package.source] for six") because the mock origin isn't the patch server. With
SOCKET_PATCH_SERVER_URLset it passes. Harness artifact.
Next
- Re-check VEX product purl detected from pyproject.toml keeps the raw project name (pkg:pypi/My_Service) instead of the normalized pypi name #1547 once fixed, and Agent-mode rollback in the other scope (rollback -g after a project apply, or rollback after a -g apply) deletes the manifest entry and blobs while the patched copy stays patched, and exits 0 #450 / uv hosted → vendored takeover onto a newer patch uuid fails "no installed package found on disk" (exit 1) when the venv holds the hosted patch's bytes, while --dry-run previews success #1105 /
removeandrollbackcall a vendored PyPI residual-reference keep "lockfile wiring drifted", and their "re-runscan --mode vendoredto normalize, then remove" remedy loops (Pipenvpipenv requirementsexport) #1184. - Untested Linux cells: 1.2.2 agent, 1.0.10 vendored repair, 2.4.3 mode switch, 2.1.x nameless /
[project].namelayouts. - Concurrent
poetry installduring an agent scan. - Lead 3 (
create = falsepatches the dpkg six) still needs a maintainer call. - macOS / Windows probes once deleting
bughunt/poetry/*is allowed.
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 Poetry bug-hunt routine (label pm:poetry).
Last updated: 2026-10-14 (run 22), main
fc1b4f9(includes #1529, the #1527 fix), latest release v5.0.1. Run 9 re-measured the cells marked "r9". Runs 10–22 have their own tables below. #327, #329, #671, #866, #945, #1023, #1024, #1136, #1282, #1447, #1503 and #1527 are closed. Open: #450, #1547. macOS / Windows cells that still show #327 / #329 haven't been re-run, because probe branches are blocked.Coverage matrix
Cells are "pass", "fail #N" or "untested". Hosted and vendored cells use a local mock of the patch API (patches-api.socket.dev is blocked from the sandbox) serving a patched
six-1.16.0wheel, then a realpoetry install/poetry syncand a byte check of the installed file. The existingpoetry-compatibility.ymlmatrix (Linux + macOS) covers the plain cells against production. Rows before run 3 were measured on mainf6b7fb9(pre-v5). Run 3 re-measured the cells marked "v5". Run 5 re-measured the cells marked "r5" on6e7ef74(after #330); #327 cells on macOS / Windows still show the pre-fix result because probe branches are blocked..venv)package-mode=false/[project].nameoverride /in-project=false+ stray.venvin-project=true, no.venv, existing out-of-tree envrepair(lock-only, wheel deleted)redirect_poetry_lock_unsupported)[metadata.hashes]); r14 passenvs.toml(3.10/3.11) passjaraco.contextrewrite/install/vex/rollbackenvs.toml+ custom path passre-resolve=falsepass;source = "pypi"fixed by #1413 (r18 on 1.5–2.5; 2.0.1 not re-run)re-resolve=false);source = "pypi"fixed by #1413 (r18 on 1.5–2.5; 2.0.1 not re-run)sync, rollback byte-identical)vendor --check){cache-dir}/~virtualenvs.path, XDG_CACHE_HOME,.venvsymlink)sync,remove, dry-run,get, relock/add, directory targets)Venv selection and policy (run 7, Linux, main
61cfb9b)poetry env use), active env sorts after an older one (3.11→3.12, 3.10→3.13), custom and defaultvirtualenvs.pathVIRTUAL_ENVset to another venv +envs.tomlentry for the projectscan --mode agentre-appliessocket.yml:minSeverity,ignorePackages(purl, name, case),maxNewPatches: 0,ecosystems,ignorePaths,enabled: false, retain-on-narrowsocket.ymlGlobal mode (
-g/--global-prefix/SOCKET_GLOBAL=1), agent patches (run 4)Global installs aren't Poetry-specific (Poetry never installs globally unless
virtualenvs.create = false), so these cells were run from inside a Poetry 2.1.1 project (in-project.venv) against a realpip install --usercopy and apip install --targetprefix.scan -greport-only (--json): global user-sitesixfound, project.venvand lock-only packages don't leak inscan -gsees Debian/apt.egg-infoinstallsscan -gsees Poetry's official-installer venv (~/.local/share/pypoetry/venv, customPOETRY_HOME)scan -g --mode hosted,--global-prefix --mode hosted,SOCKET_GLOBAL=1 --mode hosted: exit 2, poetry.lock untouchedscan -g --mode agent, re-run idempotent,get <uuid> -g,SOCKET_GLOBAL=1 get: global copy patched,.venvand lock untouchedvex -gattests applied global patch; plainvexrefuses (not_applied)rollback -grestores the global copy byte for byterollback -g, or-gapply +rollback)d63ae5f, r9)scan -g/create = falseproject scan with the same release in user site and a system dir (apt egg-info or/usr/localdist-info)get -g --mode hosted|vendored,scan -g --mode hosted|vendoredrefuse;rollback -g/remove -gleavepoetry.lockalonevirtualenvs.create = false, single system copyvex -gfrom a hosted, synced Poetry project with an unpatched global copy: refuses (not_applied)list -gfrom a hosted Poetry project lists the project's hosted pin--global-prefix(non-root user, path with space +é): human mode shows the error, exit 1-g, Poetry venv undiscovered / not created yet: falls back to and patches the global interpreterin-project = true+ no.venvfixed by #527 (r9 pass)Run 8 cells (Linux, main
61cfb9b)poetry export(plugin), thenpip install -rsupplemental/explicitmirror source, six from PyPIcheck --lock, vex)virtualenvs.options.system-site-packages = true, six in system site.venv, agent sayspackage_not_installed, exit 0.venv)installer.no-binary=six/:all:rollback(PyPI forwarder),check --lock, reinstallXDG_CACHE_HOME/XDG_CONFIG_HOMEset (platformdirs ≥ 4.6 honours them on macOS; socket-patch doesn't)normcase; socket-patch lowercases)Run 9 cells (Linux, main
d63ae5f)poetry env useon two minors (envs.toml): only the active env is patched,poetry runimports the patched copyenvs.tomlunder a customvirtualenvs.path,Demo_App.Corename, path with a space andéCONDA_PREFIX+CONDA_DEFAULT_ENV= work / base;VIRTUAL_ENVunder conda base; emptyCONDA_PREFIX/VIRTUAL_ENVenvs.toml; drift in one copy:vexrefuses,applyre-run fixes it,rollbackrestores bothenvs.tomlenvs:vexfollows the active env (refuses for the stale env)socket.yml: minSeverity, ignorePackages, ecosystems +--prune,enabled: false, maxNewPatches, ignorePaths, includePathsSOCKET_PATCH_SERVER_URLforretained)Run 10 cells (Linux, main
045d7ec)poetry addsibling edit, re-run, rollback; relock drops the wiring, thenvendor_artifact_reusedscan(API path) after the env set changes (env use+env remove)--patch-server-url(scan, re-scan, list, vex, rollback)poetry -C/--directory/ from a subdirvirtualenvs.create = falseinto an activated envJinja2/typing_extensionsname normalization × hosted / vendored / agentinstaller.modern-installation = false, warm venvvirtualenvs.path = "{project-dir}/.envs"Run 11 cells (Linux, main
045d7ec)package-mode=false,[project].nameoverride,in-project=false+ stray.venv), agent scan finds the out-of-tree envPOETRY_HOME)scan -gcrawls$POETRY_HOME/venv/~/.local/share/pypoetry/venvvirtualenvs.path = "{data-dir}/venvs";cache-dir = "{data-dir}/cache"data-dirkey exists from Poetry 2.1){data-dir}stays literal in Poetry < 2.1)path = "{cache-dir}/venvs"controlRun 12 cells (Linux, main
045d7ec)vexvendored_tree_out_of_sync)Demo_App.Core/My Proj énamessync --without dev, thenvexomits itvirtualenvs.create = false+ stray./venv, or./.venvwithin-project = falsecreate = falsecontrols (no stray tree;.venvwith in-project unset)Run 13 cells (Linux, main
99f61d2){data-dir}/venvs(2.5.1),{project-dir}/.envsliteral (1.8.5) + vexscan -g/rollback -gon$POETRY_HOME/venvand~/.local/share/pypoetry/venv{data-dir}/venvs+env use+ unrelatedVIRTUAL_ENV/ conda envenv use+ unrelatedVIRTUAL_ENV[metadata.files]LF), then installrollback/removeon a mixed lockRun 14 cells (Linux, main
9c43dfc)poetry.lock: hosted / vendored takeoverredirected: 1; wet run un-vendors, then refuses)create = false(uv CPython)vex/ agent with an aptpython3-sixin/usr/lib/python3/dist-packagesnot_applied); agent also patches the dpkg-owned copy. Lead (backlog 1)Run 15 cells (Linux, main
db83f01)create = true, no env yet), aptsixin system Python: vendoredpypi_poetry_lock_package_missing)six.py)in-project = true, no.venv, no out-of-tree envcreate = falseremoveone: hosted + vendored, LF + CRLF; vendoredremove <uuid>remove/rollbackwith a non-canonical PyPI purl (typing_extensions,Typing-Extensions), agent / hosted / vendoredRun 16 cells (Linux, main
3b4ac84)get --mode vendoredpypi_poetry_source_already_exists; dry runwould_revendor)remove/rollback, fresh installspackage_not_installed, dry runwould_vendorpoetry.lock+ exportedrequirements.txt: hosted (scan,pip install -r, rollback) / vendoredpypi_multiple_lockfiles(documented)Run 17 cells (Linux, main
e782c9a)files, comments, quotes, key order, tabs, wheel- / sdist-only, sub-tables, CRLF)installer.re-resolve = false, hosted + vendored, LF + CRLFpoetry export(root / subdir), then revert / remove / rollback /vendor --checksource = "pypi": hosted / vendored, then installRun 18 cells (Linux, main
74a44b8)source = "pypi", hosted + vendored, then fresh install*_source_constraintadvisory, installs patched)source = "PyPI"spelling"pypi"(pass)source = "pypi", hosted + vendoredsource = "pypi", hosted + vendoredsourcepasses[[tool.poetry.source]] name = "PyPI"primary +source = "PyPI"develop = true) whose own pyproject pins sixsource = "pypi", hosted[project]deps +[tool.poetry.dependencies] six = {source = "pypi"}rollback; vendored re-scan /vendor --revertredirect_takeover_kept_vendored, lock untouched)verifiedexit 0 (documented gap, #944); refusal remedy omits "rollback first" (nit, not filed).venv, apt six) + agentcreate = false+ stray./venvRun 19 cells (Linux, main
15c2c83)Mock now serves two packages: six (patches A, B) and toml 0.10.2 (patch T).
system-site-packages = true, in-project and out-of-tree; six only in user site / a uv-managed base. Agent, hosted (stale warning, vex refuses then attests), vendored{data-dir}/venvs+env use+ unrelatedVIRTUAL_ENV)repair, fresh install,--check,--revert; B → A with--prunescan/get/--dry-runmode_ambiguous, exit 2, nothing written)list,repair,vendor --check,removeeither packagescan/geton hosted-only project--cwd; nested monorepo (root + path-dep lib, two locks, two directory targets)poetry.tomldotted key / inline table / CRLF; global vs local config precedence;POETRY_CACHE_DIR/POETRY_CONFIG_DIR/POETRY_DATA_DIRmarkers = {main, dev}, hosted,--only main/sync --only devname = "PyPI" priority = "primary"+ supplemental mirror, hosted + vendoredulimit -n 100Run 20 cells (Linux, main
aa85c6c)Mock serves eight packages (six, toml, idna, attrs, packaging, certifi, urllib3, charset-normalizer), each a real wheel with a marker appended to one module.
source = "pypi"), hosted + vendoredsource = "pypi"rewrite, hosted + vendored, fresh installRepository "pypi" does not exist.; advisory says 2.3+ install it)[metadata.files]lock (#1486 read-only parse)vendor --check,--revertbyte-identicalstate.json): check, rescan, revert, fresh installapply.lockdoesn't block)poetry sync/install --sync: upstream bytes back, vex refuses (manifest_not_found)Run 21 cells (Linux, main
6a06ddd)source = "pypi"), hosted + vendored-E, vex; vendored (1.1.15, 2.5.1)dynamic = ["version"]+[tool.poetry] version, no git remote:vex/scan --vexproduct_undetected)Run 22 cells (Linux, main
fc1b4f9)[project]name +dynamic = ["version"]+[tool.poetry].version,scan --mode hosted --vexpkg:pypi/demo1527@0.3.0, install patched)[tool.poetry].nameproduct_undetected(deliberate: Poetry 1.x and 2.x build different names; see Known non-bugs)repairwith the wheel deleted, rollback[[tool.poetry.source]]withpriority = "explicit"/"supplemental"that six doesn't come from: hosted + vendored, fresh installMy_Service/Demo_Pkg.Core(hosted--vex, agent +vex)bughunt/poetry/*still denied)Backlog
[tool.poetry]layout and a dotted name).removeandrollbackcall a vendored PyPI residual-reference keep "lockfile wiring drifted", and their "re-runscan --mode vendoredto normalize, then remove" remedy loops (Pipenvpipenv requirementsexport) #1184 (export residual keep) and Agent-mode rollback in the other scope (rollback -g after a project apply, or rollback after a -g apply) deletes the manifest entry and blobs while the patched copy stays patched, and exits 0 #450 once fixed.virtualenvs.create = false, the project global fallback patches the system interpreter's dpkg-owned copy. That follows from Fix PyPI agent apply patching only one installed copy (#529, #501) #538's "patch every copy" design and needs a maintainer call before anyone files it. Since In a--system-site-packagesvenv, pip keeps the base interpreter's unpatched copy after a hosted rewrite, no stale-install warning fires, andvexattests it as patched #409 (Fix crawl of --system-site-packages venvs (#409) #1419), a system-site venv that imports a base copy also patches that base copy, on purpose.poetry installduring a scan. Untested Linux cells: 1.2.2 agent, 1.0.10 vendored repair, 2.4.3 mode switch, 2.1.x nameless /[project].namelayouts.{data-dir}in Poetry's virtualenvs.path, agent mode also patches an unrelated activated VIRTUAL_ENV / conda env, even thoughpoetry env usepins the project's env, and hosted VEX then refuses a correctly installed patch #866 on macOS, macOS XDG and the Windows Poetry 1.0/1.1 env hash. All need probe branches.bughunt/poetry/20260930-venv-discoveryandbughunt/poetry/20260930-windows-modesstill exist, and deletion was denied again in run 22 (runs 9–22). A maintainer needs to delete them and allow deletingbughunt/poetry/*.installer.modern-installation = false(Poetry 1.4–1.8) keeps a warm same-version install, but the "Installer boundaries" table says 1.4–1.8 replace it. Line 24 still says CRLF / legacyfilesget a single-line inline array (changed by Wire every vendored Poetry lock through utils::poetry_lock (#936) #1185). CLI_CONTRACT's error-code row formode_ambiguousstill names only agent + vendored state (the mode-resolution paragraph has the A bare scan or get on a project holding both vendored packages and hosted pins silently converts every hosted pin to vendored (exit 0, no warning), so it undoes a partial hosted takeover #1437 hosted-pin case).Known non-bugs
patches-api.socket.dev/patch.socket.dev/api.socket.devare blocked by the sandbox proxy (403). Use a local mock API (SOCKET_API_URL).vendor_fetch_failed) and v5 hosted rollback/remove (re-resolveshttps://pypi.org/pypi/<name>/<ver>/json) fail in the sandbox. PointSOCKET_PYPI_JSON_APIat a local HTTP forwarder that also rewritesfiles.pythonhosted.org. The repo'se2e_vex_build -- poetry::hosted test scrubsSOCKET_*, so its rollback step fails in the sandbox for the same reason. Not a product bug.poetry.lockwith a UTF-8 BOM is rejected by Poetry itself ("Invalid statement (at line 1, column 1)").[[tool.poetry.source]](even a PyPI mirror,priority = "primary") is refused by hosted (redirect_poetry_lock_unsupported, exit 0) and vendored (pypi_poetry_source_already_exists, exit 1) before any write. Documented ("a user-authored[package.source]on another origin").vexon a project with no install hook reportsecosystem_not_setup/no_applicable_patches. Documented.vexon apackage-mode = falseproject with no version needs--product(product_undetected). Expected.[project]dependencies, so "[project].name+[tool.poetry].name" is n/a before 2.0.crates/socket-patch-cli/CLI_CONTRACT.md, not the repo root.--cwdor a directory target).pypi_poetry_integrity_unverifiedand hosted emitsredirect_poetry_stale_install_risk. Both are deliberate advisories.redirect_pypi_stale_installand refuses VEX.poetry check --lockfails on Poetry 1.1 / 1.2 (1.2 has no--lockoption, and 1.1'scheckcrashes). This isn't caused by socket-patch.#sha256=…&#egg=fragment. Documented, and named in theredirect_poetry_stale_install_riskdetail. Use pip ≤ 22.2 or ≥ 23.1.[metadata.files]against today's PyPI. Documented (backtest "populated" shape).--vexon a warm, unpatched venv still attests, with the warningvendored_tree_out_of_sync. Documented in CLI_CONTRACT.md.list/ standalonevexonly recognise hosted pins on Socket's origin. A mock origin needs--patch-server-url.scan --jsonwith several directory targets is refused ("--json takes one project directory").--vendor-source build(local artifact construction). Repair re-downloads from the service./v0/orgs/<org>/patches/blob/<hash>. A mock without that route givesmissing_blob.scan --mode agentre-run after a failed apply says[skip] … (already recorded)and exits 0 with the file unpatched. That's by design (it prints "runsocket-patch applyto re-apply them"), andapply/vexthen report the failure correctly.sixtwice. That's a mock artifact; pass--ecosystems pypi./usr/lib/python3/dist-packages/sixis an apt.egg-infoinstall. Since Fix Python crawler missing .egg-info installs (#447) #452 the crawler sees it, so global-fallback cells pick it up (see backlog 1). Usepip install --user --ignore-installedfor a controlled global copy, androllbackafterwards if agent mode patched it.POETRY_VIRTUALENVS_IN_PROJECT=yes/onis true to socket-patch and false to Poetry (boolean_normalizeraccepts only "true" / "1"). Theoretical, not filed.SOCKET_PYPI_JSON_APIpointed at a local forwarder in the sandbox. Without it the takeover fails closed withredirect_revert_failed. A forwarder script that rewritesfiles.pythonhosted.orgworks.scanruns in one project: the extra runs exit 1 with "Another socket-patch process is operating in this directory" (use--lock-timeout). This is by design.jaraco.context): Poetry 1.1 keeps the dotted name in the lock (quoted[metadata.files]key), Poetry ≥ 1.8 canonicalizes it. Hosted rewrite, install, vex and rollback all work with both purl spellings (r5).rollback -g --jsonwith no manifest returnserroras a plain string ("Manifest not found"), not a{code, message}object. This is a shape nit, not Poetry-specific, and not filed.virtualenvs.create = falserunning as root in this image reinstall a user-site package into/usr/local/lib/python3.11/dist-packages. That's Poetry's behaviour, not socket-patch.poetry env use python3.12envs on its own 3.11 interpreter (pyvenv.cfgsays 3.11.15). That's a sandbox quirk; use pip-installed Poetry for multi-interpreter cells.scan --json,ecosystems: [npm]reportspolicy.counts.filtered: 2for a singlesix(likely the lock and the installed copy). Cosmetic, not filed.redirect_poetry_lock_unsupported, "forked Poetry package requires an unambiguous source") and vendored ("forked resolution"). Documented in CLI_CONTRACT.md.vexattests a lock pin for a package that isn't installed (for example an optional group left uninstalled). Documented ("with nothing installed, attests a discovered lockfile reference from its integrity pin").rollbackon a project with no manifest, ledger or hosted pin gives "Manifest not found", exit 1. Documented (truly-empty project).rollback --jsonreportsrolledBack: 0while it restores the lock. Cosmetic, not filed.poetry exportoutput against the sandbox mock (it sendsHEAD, which the mock doesn't answer). Mock artifact.EnvManager.get()uses an existing./.venveven with an explicitvirtualenvs.in-project = false; 1.1+ honour thefalseand socket-patch follows them. It only diverges when Poetry 1.0 also has an out-of-tree env. Theoretical, not filed.socket.ymlnarrowing lists recorded pins underpolicy.filteredrather thanretainedwhen the mock origin isn't the patch server. SetSOCKET_PATCH_SERVER_URL; this is the documented hosted-origin rule.dispatch_in_use_onereturnsNone), so Poetry vendored re-runs are unchanged by it./patches/batchwith the same patch makes agent scans reportpartial_failurefor packages the project doesn't have. Filter the mock to the requested purls.data-dirconfig key, so{data-dir}invirtualenvs.pathstays a literal relative directory, and socket-patch matches it.vexsaying "No applied patches with vulnerability metadata" after a hand-staged manifest with emptyvulnerabilitiesis a fixture artifact.boolean_normalizeris case-sensitive (POETRY_VIRTUALENVS_IN_PROJECT=Trueis false), while 2.x lowercases. Same theoretical class asyes/on; it only diverges with a stray.venv. Not filed.vex --jsonneeds-O <file>(-ois--org), and against a mock it needs--api-url/--orgfor vulnerability metadata. Without them you get harness errors, not product bugs.rollbackprints "1 unwired package keeps its patched bytes in installed trees" even when no venv exists. Cosmetic, not filed.rollback/removeon a lock mixing CRLF and LF rewrites the whole file as LF (content equal modulo EOL; Poetry still installs). Tracked under Tracking: classify line endings in one place instead of five drifting rules #814 child 2 (comment from run 13), not filed separately.Redirected 0). It's no baseline for hosted cells.integrity.sha512on the tarball artifact. A mock grant with onlysha256givesvendor_prebuilt_required("tarball artifact has no sha512 integrity"), and a takeover then un-hosts first. Mock artifact.EXTERNALLY-MANAGEDmarker, so Poetry withcreate = falsefails atpip uninstall. Delete the marker in the sandbox..venv(virtualenv-created) keeps pip entry scripts pointing at the source venv, so Poetry 1.1 installs land in the wrong tree. Always create fresh venvs.redirect_takeover_unpatchedafter a refused lock is documented in CLI_CONTRACT.md. Poetry 0.x vendored → hosted takeover un-vendors the package before hosted mode refuses the lock, while --dry-run previews a clean takeover (redirected: 1, exit 0) #945 covers only the Poetry 0.x dry-run mismatch and the missing pre-revert gate.poetry.lock: hosted (redirect_symlinked_file_unsupported) and vendored (pypi_poetry_symlink_unsupported) both refuse before writing. Documented.poetry lockcreates the project env. A "fresh checkout" cell has to delete the env after locking, or the scan correctly finds it.removeof one keeps the other's hosted / vendored wiring (r15, LF + CRLF, Poetry 1.8.5 / 2.5.1). Not a bug.poetry installfail "Hash … not found in known hashes", and Poetry then keeps the bad bytes in~/.cache/pypoetry/artifacts(keyed by URL). Build the mock wheel deterministically and clear that cache.requirements.txtbesidepoetry.lockfolds its\continuation lines into one line (semantically equal). It's pip's file and cosmetic, so not filed.poetry.lock+requirements.txtwarnspypi_multiple_lockfilesand wires onlypoetry.lock. Documented.files, a missingfileskey, quoted orsix=[[metadata.files]keys) writes Poetry's canonical multi-line full-releasefilesback, not the original bytes. Documented (hosted rollback "has no … guarantee of the original byte layout").docs/testing/poetry-compatibility/(named in the routine prompt) doesn't exist on main; onlydocs/testing/poetry-compatibility.mddoes.scan --dry-runreports onlyverified(exit 0) and doesn't model the takeover, even when the wet run refuses (exit 1). Documented in CLI_CONTRACT "Takeover reconciliation"; uv scan/get dry-run does not predict a refused hosted-to-vendored takeover #944 closed not planned. The wet run keeps the hosted pin.source = "pypi"pin doesn't break the root project's install after a rewrite (Poetry 2.2.1), so the guard reading only the root pyproject is correct.[[tool.poetry.source]] name = "PyPI"declaration doesn't rescue Poetry 1.8 / 2.2 from thesource = "pypi"failure, so the guard isn't over-refusing there.--prerelease=allow+cleo==1.0.0a5(yanked cleo 1.0.0). Sandbox setup, not a product issue.pyproject.tomlwith a UTF-8 BOM is rejected by Poetry 2.5.1 itself ("Invalid TOML file … Empty key at line 1 col 0").[package.source] type = "git"): hosted (redirect_poetry_lock_unsupported) and vendored (pypi_poetry_source_already_exists, exit 1) refuse it before any write. Documented user-authored-source refusal.rollback/vendor --revertexit 1 withvendor_revert_kept/vendor_revert_residual_referencewhen anotherpoetry.lockunder the project tree (e.g. a test copy in a subdirectory) still references the vendored wheel. That's the guard working, so keep scratch copies outside the project.removeof one package in a vendored + hosted project, a barescanfollows the remaining state and re-adds patches the service still offers.removeisn't an ignore rule; usesocket.ymlignorePackages.source = "pypi"dependency at all ("doesn't exist, version solving failed"), so the source-pin guard has no lock-format-1.0 case..socket/apply.lockand some wheels under.socket/vendor/pypiwith the lock untouched; the next scan proceeds and converges. Not a bug.pyproject_source_constraints) reads[tool.poetry.dependencies],dev-dependenciesand everygroup.*.dependencies; a group-only pin is covered.[project].name+dynamic = ["version"]+ a different[tool.poetry].name: product detection returnsproduct_undetectedon purpose (product.rspyproject_name_version), because Poetry 2 builds[project].name("[tool.poetry.name] … will be ignored") and Poetry 1.x builds[tool.poetry].name. Use--product. Not filed.explicit/supplemental[[tool.poetry.source]]entries that six doesn't resolve from are not refused by hosted or vendored (r22). The refusal only covers a source six actually uses.SOCKET_PATCH_SERVER_URLnames the mock (the hosted-origin rule). Harness artifact.All reactions