Repository navigation
Bug hunt ledger: uv #310
Replies: 54 comments
|
[agent] 2026-09-30: handover from the Poetry bug-hunt routine (ledger #311) While checking Poetry mode switches I hit the same defect on a uv project. I filed it as #328 with the Poetry evidence. Here's the uv side so you can add a uv comment to that issue, or file a uv-specific one if the root cause differs. hosted → vendored on a uv project is refused as a "user-authored" source. main printf '[project]\nname = "uvp"\nversion = "0.1.0"\nrequires-python = ">=3.9"\ndependencies = ["six==1.16.0"]\n' > pyproject.toml
uv lock && uv sync
socket-patch scan --mode hosted --json --yes # redirected: 1
uv sync
socket-patch scan --mode vendored --json --yes
# -> failed pypi_uv_source_already_exists "[tool.uv.sources] already declares a source for six; refusing to overwrite a user-authored source"
# uv.lock still: source = { url = "http://127.0.0.1:18080/patch/pypi/six/1.16.0/<token>/<uuid>/six-1.16.0-py2.py3-none-any.whl" }Root cause (shared): Not yet checked for uv: vendored → hosted, and lock-only hosted → vendored (on Poetry that fails Also unconfirmed for uv: on Poetry, vendored |
|
[agent] 2026-09-30: uv bug-hunt run This is the first run. The ledger started empty and there were no Tested: main Setup: the sandbox blocks the Socket patch hosts, so a local mock of the authenticated patch API ( Cells (Linux unless noted)
Issues
False positives ruled out
Probe runs
I couldn't delete either probe branch: the git proxy silently ignores ref deletes ("Everything up-to-date"), the same as for the siblings. A maintainer needs to delete Next
|
|
[agent] 2026-09-30: handover from the PDM bug-hunt routine (ledger #312) While filing #382 (hosted PDM rollback/remove stuck once the patched package leaves This may already be covered by #379 (uv drift after |
|
[agent] 2026-10-01: uv bug-hunt run Tested: main Harness changes for v5: hosted mode now keeps no ledger. Rollback/remove re-derive the upstream entry from PyPI's JSON API, and they need Re-triage
Cells (Linux 0.12.21 unless noted)
Issues
False positives ruled out
Probe runs
Branch deletes are still silently ignored by the git proxy. A maintainer needs to delete 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 uv puts global installs: What to check (prove each with a real global install, not by reading source):
Add OS × uv version cells for |
|
[agent] 2026-10-01: uv bug-hunt run Tested: main Re-triageMain hasn't moved since #407, #408 and #411 were filed, so they're still open and unchanged. No re-test was needed. Cells (global mode)
Issues
False positives ruled out
Probe runs
Branch deletes are still silently ignored by the git proxy. A maintainer needs to delete Next
|
|
[agent] 2026-10-01: uv bug-hunt run Tested: main Re-triage
Cells (Linux 0.8.17 unless noted)
Issues
False positives ruled out
Probe runs
The git proxy still silently ignores branch deletes. A maintainer needs to delete Operator note: a failed Next
|
|
[agent] 2026-10-01: uv bug-hunt run Tested: main The harness is new this run. It uses a Python mock patch API: the wheel is deterministic (fixed zip dates), Re-triage
Cells (Linux 0.8.17 unless noted)
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] 2026-10-02: uv bug-hunt run Tested: main Re-triageMain hasn't moved, so nothing needed re-running. Fixes are in flight: #512 (#407, #408), #481 (#474), and #449 is claimed (agent/fix-python-global-tool-roots). Cells (Linux, uv 0.8.17 unless noted)
Issues
False positives ruled out
Probe runsNone this run (everything new was OS-independent text edits or Linux env-var probing). No branches pushed. Next
|
|
[agent] 2026-10-02: uv bug-hunt run Tested: main Re-triageMain hasn't moved, so I re-ran nothing. Open fix PRs: #540 (#525 and the env discovery issues), #512 (#407, #408), #481 (#474). Cells (Linux)
Issues
False positives ruled out
Probe runsNone this run. #525 already has a fix PR (#540), and the new finding is a CLI text match that doesn't depend on the OS. Next
|
|
[agent] 2026-10-02: uv bug-hunt run Tested: main Re-triageMain hasn't moved, so nothing was re-run on main. I tested PR #545 against the new #544 spellings (below): fixed. Cells (Linux)
Issues
False positives ruled out
Probe runsNone this run. #564 is driven by config, not the OS. No branches pushed. Next
|
|
[agent] 2026-10-02: uv bug-hunt run Tested: main Re-triage (current main)
Cells (Linux)
Issues
False positives ruled out
Probe runsNone. #606 is OS-independent TOML logic. No branches were pushed. Next
|
|
[agent] 2026-10-03: uv bug-hunt run Tested: main Re-triage
Cells (Linux)
Issues
False positives ruled out
Probe runsNone. #639 is OS-independent TOML logic. Next
|
|
[agent] 2026-10-03: uv bug-hunt run Tested: main Re-triageMain hasn't moved since run 9, and PR #625 is still open, so nothing was re-run for #606 / #473 / #411 / #564 / #639.
Cells (Linux unless noted)
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] 2026-10-08: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] 2026-10-08: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] 2026-10-09: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] Janitor: drift. #567 was closed as completed by a maintainer on 2026-10-08 23:17Z, with no linked PR. The matrix still has a Generated by Claude Code |
|
[agent] 2026-10-09: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe runs
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-09: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe runs
Next
|
|
[agent] 2026-10-12: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-13: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-13: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
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: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-15: uv bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
[agent] Progress ledger for the scheduled uv bug-hunt routine (label pm:uv).
Last run: 2026-10-15 (run 42) on main
e76cb9b(release v5.0.1; main gained only non-uv fixes since306ec81). uv 0.13.1 (2026-10-14) is the newest release: hosted / vendored project, PEP 723 script-lock and pylock baselines pass. New #1569: hosted scan emits nopypi_uv_override_requires_uv_0_5_6/pypi_uv_constraints_require_uv_0_5_6advisory (vendored does) for transitive overrides or repointed[manifest] constraints, so on uv 0.4.30 / 0.5.3 / 0.5.4 a plainuv syncsilently reinstalls the unpatched wheel after a clean exit 0 (also v5.0.1). Draft PR #1566 (for #1545) verified against real uv: it fixes the reported shapes, but over-refuses a parent[tool.uv]/uv.tomlthat holds onlyconstraint-dependencies/override-dependencies/build-constraint-dependencies, which uv does not pass down to a child project (commented on #1545). #1525 holds: the orphan unwind and the user's own override are fine on 0.4.30 / 0.5.3 / 0.5.31 / 0.13.1. Previous: 2026-10-14 (run 41) on main306ec81(release v5.0.1; main gained #1504 (closed #1501), #1525 (bare uv manifest overrides of old uv), #1526 (fixes #1524, mixed-flavor PyPI vendor revert) and #1529 (pyproject product detection)). New #1545: a uv project with no[tool.uv]under a parentuv.toml/ parent[tool.uv]gets[tool.uv.sources]added by hosted and vendored scan, which hides every parent setting from uv;uv sync --lockedfails and a plainuv lockre-resolves without them (0.5.31 / 0.8.17 / 0.13.0, both modes, also v5.0.1). #1501 fix verified (parent / grandparent /[tool.uv]-less pyproject in between all refuse, nothing written). #1105 / #639 have no fix PR (not re-run). Previous: 2026-10-13 (run 40) on mainabd5eff(release v5.0.1; main gained #1453 / #1458 (closed #1445 / #869) and #1486 (read-only TOML parse for VEX)). New #1501: a PEP 723 script in a subdirectory is wired although a parentuv.toml/pyproject [tool.uv]setsno-sources = true, which uv honours for scripts (0.5.31 / 0.8.17 / 0.13.0, both modes; a gap in #1434). #1105 and #639 still fail. These pass: the #1486 CRLF / BOM VEX cells, the PEP 503 spellings in the 5.0 target grammar, and the vendored takeover over a #1453 orphan (silent no-op, rollback cleans it). The macOS / Windows probe is blocked (no probe runs, and branch deletion is denied). Previous: 2026-10-13 (run 39) on main15c2c83(v4.0.0 is still the latest release; main gained #1434 (fixes #564, uvno-sourcesrefusal), #1440 (bare scan/getmode_ambiguouson vendored + hosted state), #1419 (system-site venvs) and non-uv fixes). No new issue. #1434 holds:no-sources = true/uv.toml/no-sources-packagerefuse with nothing written in project and PEP 723 script lanes (also with no uv.lock), unwinds of wiring made before the setting was added still work, and the setting precedence matches real uv 0.5.31 / 0.8.17 / 0.12.24 / 0.13.0. Its scan/get vendored dry run previewsverified, while the wet run refusespypi_uv_no_sources(commented on #891 as the same missing-preflight root cause). #1440 holds on uv.lock, script-lock and pylock hosted pins. PR #1453 verified to fix #1445 in project and script lanes (the script lane is new evidence), and PR #1458 verified to fix #869 (36 cells). The macOS / Windows probe (20261013-uv013-baseline) never started: nopushworkflow ran on any bughunt probe branch in the last day. Previous: 2026-10-12 (run 38) on main7236190(v4.0.0 is still the latest release; main gained #1384 (fixes #1374), #1391 (fixes #1285 / #890), #1390, #1337 (fixes #1287), #1335 (fixes #1138), #1332 (fixes #767), #1331 (fixes #411)). uv 0.13.0 (2026-10-09) is the newest release: the vendored / hosted / agent baselines pass, and so does Python 3.15 (its new default). New #1445: a hosted transitive six whose parent is dropped (uv remove isodateoruv lock --upgrade-package isodate) leaves the override plus source URL, and rollback / remove / list then failhosted_wiring_contestedforever (the uv twin of yarn's #1203; 0.5.31 / 0.12.24 / 0.13.0). The #1374 fix holds in 72 promotion / demotion cells, and vendored upgrade-drop unwinds pass. #869 and #891 still fail. Previous: 2026-10-09 (run 37) on main85105c9(v4.0.0 is still the latest release; main gained #1265 (fixes #1252,*.lockexports), #1034 (one target grammar for get / remove / rollback), #1277 (BOM handling), #1259 and non-uv fixes). New #1374: a vendored transitive six promoted to a direct dependency (uv add six==1.16.0, with or without removing its parent) is half-reverted byvendor --revert/remove/rollback: the rootrequires-distpath element socket never recorded is left,uv sync --lockedfails, revert exits 0 andvendor --checkfalsely says nothing references the wheel (0.5.31 / 0.12.24; the PEP 723 lane fails closed instead). PR #1337 verified to fix #1287 in 24 cells (main / dev / group parent × revert / remove / rollback / prune × 0.5.31 / 0.12.24; commented). #1285 still reproduces. #1034 PyPI target spellings pass (dotted / underscore / mixed-case names, versionless and versioned purls, uuid) in vendored / hosted / agent. Agent mode underUV_LINK_MODE=symlink/ hardlink / copy passes on Linux / macOS / Windows × 0.8.17 / 0.12.24 (probe; no cache pollution, vex, rollback). Previous: 2026-10-09 (run 36) on maine9be746(v4.0.0 is still the latest release; main gained #1223 (fixes #1213), #1231 (fixes #1214, auto-closed), #1245, #1254). New #1285: with two vendored PEP 723 scripts,uv remove --script b.py sixleaves a.py wired by every unwind (the #1231 'removed' check is global per entry). New #1287: a transitive vendored six whose parent isuv removed (project and script lanes) drift-keeps, sovendor --checkstays red andscan --pruneloops. #1214 single-script fix verified (commented). PR #1265 fixes #1252 (*.lockexports);requirements.pip/ extensionless /*.frozenexports still lose the wheel (commented on #1252). Previous: 2026-10-09 (run 35) on maine03a666(v4.0.0 is still the latest release; nothing uv-specific landed since run 34). New #1252: a rootuv export -o requirements.lock(Rye's name; alsorequirements-dev.lock,deploy/requirements.lock) loses the vendored wheel on revert / remove / rollback / takeover, exit 0 (0.5.31 / 0.8.24 / 0.12.24; PR #1223 doesn't cover it). PR #1223 fixes #1213. PR #1231 fixes #1214's single-script shape, but not two scripts where only one drops six (commented on #1214). Agent mode underUV_LINK_MODE=symlinkpasses on Linux. Previous: 2026-10-09 (run 34) on mainb76d7ab(v4.0.0 is still the latest release; main gained #1147 (fixes #1140 project lane), #1168 (fixes #1167*.txtonly), #1152 (fixes #1120), #1031 (dropsscan --apply/--vendor), #1058, #1151, #1027). uv 0.12.24 is the newest release. New #1213: a subdirectoryuv export --format pylock.toml(deploy/pylock.toml,deploy/pylock.prod.toml,a/b/pylock.toml) still loses the vendored wheel on revert / remove / rollback / takeover, exit 0, and the export can no longer install (0.8.24 / 0.12.24). New #1214: afteruv remove --script, every unwind of a vendored script lock still drift-keeps andvendor --checkstays red (0.5.31 / 0.12.24). #1138 and #1105 still reproduce onb76d7ab. Previous: 2026-10-08 (run 33) on main4657813(v4.0.0 is still the latest tag; main gained #997 residual-reference keep, #1091 requirements include tree, #1039 atomic V→H takeover, #1121). No new issues: every uv defect found was already filed. Comments on #1167 (subdirectoryuv exportrequirements / pylock still lose the wheel; #1168 plans*.txtonly), #567 (the uv lane: hosted wires uv.lock, leaves the-rinclude pin, and rollback is stuck onhosted_wiring_contested), #1138 (any Hatch config triggers it, even with uv_build), and #1140 (script lock + upgrade shapes; fix PR #1147). Handed a pip-lane constraints rollback bug to pip. #1140 and #1120 still reproduce. Previous: 2026-10-08 (run 32) on main3b4ac84(v4.0.0 is still the latest tag; main gained #1050 one in-use verdict for prune/check, #1045 PurlKey). New #1138: a scan run from a hatchling member of a uv workspace rewrites the member as a lockless Hatch project (vendored{root:uri}wheel / hosted URL), so the root uv.lock goes stale,uv sync --frozeninstalls unpatched six and vendored vex attests not_affected (0.5.31 / 0.12.23). New #1140: afteruv remove six, scan --prune / vendor --revert / remove / rollback all drift-keep the vendored entry, sovendor --checkstays red and itsscan --pruneremedy loops (it was stuck pre-#1050 too). #1120 and #1105 still reproduce on3b4ac84. Passes: #1050 prune keeps live project / script / pylock / lockfile-only entries; the #612 probe gives no false warning on a requirements.txt re-exported from the vendored lock; #1045 MarkupSafe spellings. Previous: 2026-10-08 (run 31) on mainb96a785(v4.0.0 is still the latest tag; main gained #1035 superseded-generation re-pin, #1044 governing-lock table + #612 requirements warning, #724 UTF-16 requirements). New #1120: a UTF-16 (BOM)requirements.txtexported beside uv.lock is read as absent, so vendored gives nopypi_multiple_lockfiles,vendor --checkpasses andvexattests not_affected whileuv pip install -rinstalls unpatched six (0.5.31 / 0.12.23; UTF-8 twin is caught). #1105 still reproduces onb96a785. Passes: #1044's #612 warning on uv.lock + UTF-8uv export(scan and H→V takeover), #1035 on uv (H A→H B→rollback byte-identical; V A + manifest B →remove <B>reverts A byte-identically,uv lock --checkok). Previous: 2026-10-08 (run 30) on main77f305d(v4.0.0 is still the latest tag). New #1105: hosted A → vendored B takeover (a superseding patch uuid) exits 1package_not_installedwhen the venv holds hosted A's bytes, while--dry-runpreviews success (0.5.31 / 0.8.17 / 0.12.23, uv project anduv piprequirements lane). #411 commented with a third path (the H→V takeover drops the user'soverride-dependenciespin, and vendor --revert makes the loss permanent). #996 still reproduces. Passes: #946 (#723 drift takeover now refused, kept vendored), forked lock refused in both modes, agent mode × symlink / hardlink link modes × plain / symlinked.venv/UV_PROJECT_ENVIRONMENT(no cache pollution, rollback, VEX omits a reinstalled six), patch-detail 5xx parity in 3 modes (404 gap = #1062), and superseding-uuid upgrades V→V / V→H / H→H on project / script / pylock with byte-identical unwinds. Run 29: 2026-10-07 (run 29) on main05ecc6e(v4.0.0 is still the latest tag). #964 and #979 are closed by #965 / #980. #996 still reproduces after #1015 (comment). Passes: PyPI name-spelling remove/rollback after #1025, uv-projectsix[x]==vendored round trip, agent mode on 0.2.34 / 0.4.30 / 0.12.23 (frozen/locked sync, VEX, rollback),uv sync --activeagent, and ledger-less revert/gc/repair/rollback over uv.lock, script locks andpylock[.name].toml. Pip-lanesix[x]==requirements dry-run parity gap handed over to pip. Run 28 on main6fe81ad(34 commits after9c43dfc. No new issue. #944's data loss is fixed by #963; only the documented dry-run preview gap is left. #964 still reproduces (PR #965 open). #701 and #928 are verified fixed. #742 vendored still fails on main and passes on PR #943, where a superseding re-vendor deletes a wheel that auv exportstill names (comment on #996). The platform-wheel takeover, the mixed vendored/hosted unwind and root-only[tool.uv.workspace]were also covered). Run 27 on main9c43dfc(main unchanged since run 21. New #996: afteruv export(requirements.txt,--format pylock.toml, or--script) of a vendored lock,vendor --revert/remove/rollbackrestore the uv pair but delete the wheel the exported file still references, exit 0, no warning;revert_uvhas no residual-reference sweep, andunwired_pypi_reference_clauseruns only for unwired entries; Linux × 0.5.31 / 0.8.17 / 0.12.23. Interrupted vendored runs (110 SIGKILL points) and concurrent vendor/revert pass). Run 26 on main9c43dfc(main unchanged since run 21. New #979: standalonevendor --dry-runpreviewssuccess/verified(exit 0) on a uv project with an inline[tool.uv]/sourcestable, where the wet run refusespypi_uv_lock_parse_failed(exit 1) after downloading the prebuilt; the refusal lives only inwire_uv, not in thecheck_target_guardspreflight; Linux × 0.5.31 / 0.8.17 / 0.12.23. Cross-uv-version relocks (rev 1→3→5) andexclude-newerpass. A full vendored mock now wraps the repo'stests/prebuilt_commonfixture). Run 25 on main9c43dfc(main unchanged since run 21. New #964 from the Pipenv handover: on a fresh uv checkout (uv.lock, no.venv), the crawler falls back to the global site-packages, so a vendored scan exits 1pypi_uv_lock_package_missingon a system-only PyYAML while--dry-runreports success; Linux × 0.5.31 / 0.8.17 / 0.12.23. A missingUV_PROJECT_ENVIRONMENTand a script-lock-only directory (pypi_no_requirements) hit it too. PR #950 fixes only Pipenv). Run 24 on main9c43dfc(main unchanged since run 21. New #944: the hosted → vendored takeover (scan/get --mode vendored) restores six to PyPI BEFORE the uv vendored refusals run, so an inline[tool.uv] sources = {…}table (pypi_uv_lock_parse_failed) or a #928 marker-split requirements.txt (pypi_requirement_not_pinned) leaves six unpatched in both modes, exit 1, while--dry-runpreviewswould_vendor; Linux × 0.5.31 / 0.8.17 / 0.12.23. Standalonevendorkeeps it hosted (pass). #928 commented: the split across a-rinclude refuses the same way). Run 23 on main9c43dfc(main unchanged since run 21. New #928: vendoredrequirements.txtfromuv pip compile --universalwith a marker-split package (six==1.16.0 ; python<3.12+six==1.17.0 ; python>=3.12) refusespypi_requirement_not_pinned("not pinned to ==1.16.0", which is false) while--dry-runpreviewswould_vendor; hosted and vendored pylock handle the same split; Linux × 0.5.31 / 0.8.17 / 0.12.23. Universal pylock (hosted + vendored), the vendored pylock lifecycle with vex and a regenerated lock, and a forked script lock refusal all pass). Run 22 on main9c43dfc(main unchanged since run 21. macOS confirms #890 and #891, so both now fail on all 3 OS. #890 also hits the project lane: a deleteduv.lockblocks revert / remove / rollback, and the takeover exits 0.--cwd(relative, absolute,.., space in the path), VEX after partial unwiring, agent mode on uv 0.2.37–0.12.23, a vendored pyproject-variant sweep andlistall pass). Run 21 on main9c43dfc(main moved: #858 atomic-write core, #802 vendored symlink refusal, #807 pip pylock rollback and others. New #890: once the user deletes one of several vendored PEP 723 scripts (or its.py.lock, or one of two pylocks),vendor --revert/remove/rollbackfail oncannot readfor the whole entry, and the V→H takeover exits 0 telling the user to run that same revert; Linux × 0.8.17 / 0.12.23 and Windows × 0.12.23. New #891: the vendored dry run (scan / get) gives novendor_would_refuse_symlinked_filefor a symlinkeds.py,s.py.lock,pylock.tomlorpylock.<name>.toml, although the wet run refuses (exit 1); Linux × 0.8.17 / 0.12.23 and Windows × 0.12.23. #723 and #767 (vendored half) re-checked: still fail. File modes, symlink refusals (hosted + vendored, no residue), uv-exported pylock hosted rollback, script-lock constraint / CRLF / index-source variants andvendor --checkafter unwiring all pass). Run 20 on main99f61d2(main moved: #789, #743, #822, #841, #625 and #672 merged, and #788 / #806 / #821 / #840 / #670 / #606 / #473 are closed. New #869: the #840 shape on PEP 723 script locks, where vendoredvendor --revert/remove/rollbackwrite the stale==1.16.0back intos.py.lockafter a specifier edit anduv run --lockedfails with exit 0; Linux × 0.5.31 / 0.8.17 / 0.12.23 and Windows. #411 and #564 re-checked: still fail. The #841 project-lane fix passes on 5 versions × deps / extra / dev × 11 specifier spellings). Run 19 on main045d7ec(new #840: after the user changes the vendored package's own specifier (uv add "six>=1.16,<1.17"), uv.lock stays byte-identical, because path sources carry no specifier, sovendor --revert/remove/rollbackwrite the stale pre-vendor==1.16.0back anduv sync --lockedfails with exit 0; 3 OS × 0.5.31 / 0.8.17 / 0.12.23, and not fixed by PR #822. PR #822 verified to fix #806 / #821 and their neighbours (two groups, include-group, deps + dev, user constraint-dependencies edit)). Run 18 (new #821: vendored package in a dependency group; afteruv add --dev/uv remove --dev,vendor --revert/remove/rollback/ V→H takeover revert pyproject.toml but keep uv.lock's whole-linerequires-devfragment, souv sync --lockedfails; 3 OS × 0.8.17 / 0.12.23, plus 0.2.37 / 0.4.30 / 0.5.31 on Linux. Script lock with a user override drift-keeps both files (consistent)). Run 17 on main045d7ec(new #806: vendored transitive override + a user-authoredoverride-dependencies; after a relock,vendor --revert/remove/rollbackrevert pyproject.toml but drift-keep uv.lock's[manifest] overrides, souv sync --lockedfails; 3 OS × 0.8.17 / 0.12.23. PR #789 verified to fix #788. Agent mode on a project.venvpasses on 3 OS × 3 link modes; script-lock CRLF / BOM,uv pip compileflavours, git / path / url siblings, name normalization and--dry-runall pass). Run 16 (new #788: uv 0.6.15–0.6.17 locks spellupload_time, so hosted rollback / remove / H→V takeover always refuse; 3 OS. Version sweep 0.6.17 / 0.7.22 / 0.9.30 / 0.10.12 / 0.11.33 otherwise passes; grant-token rotation passes; #767 extended to optional-dependencies and constraint-dependencies; requirements direct reference handed to pip). Run 15 (new #767: a PEP 508 direct-reference dependency (six @ https://…/git+…) gets vendored into a lock thatuv sync --lockedrejects while vex attests, and hosted overrides the user's URL and then refuses rollback; 3 OS × 3 uv versions. PR #743 verified to fix the hosted half of #742.-glifecycle passes on macOS / Windows via a probe. A uv lockless-pyproject shape was added to #638). Run 14 (new #742: a superseding patch uuid is never applied on uv. Hosted re-scan refuses its own[tool.uv.sources]pin with exit 0 while listing the upgrade; vendored failspypi_uv_source_already_exists. #701 extended to theuv pip compile --universalrequirements lane and to script locks. 0.12.23 baseline passes on 3 OS via a probe). Run 13 (new #723 V→H takeover strands a version-pinned-down vendored package while the dry run previews success; uv evidence added to #612, where vendored uv.lock + an exported requirements.txt is left silently unpatched; uv 0.12.23 baseline passes). Run 12 (#670 verified fixed on PR #672; new #701 hosted platform-specific wheel narrows the universal uv.lock; vendoredrepairwith two packages and a vendored platform wheel pass). Run 11 was on main045d7ec(new multi-package harness: requests / urllib3 / click / dateutil / jsonschema patches; hosted with deps / extras / partial unwind all pass; new #670 vendored multi-package revert residue; #449 Windows verified fixed on a probe). Run 10 was 2026-10-03 on main045d7ec+ draft PR #625 (new #639dynamic = ["dependencies"];conflicts,required-environments,dependency-metadatapass; PR #625 verified fixing #606 / #473). Run 9 was on main045d7ec(re-verified #525, #407, #408, #474 and #449-Linux as fixed; #473 and #411 still fail; new #606;[tool.uv]resolution settings, symlink link-mode). Run 8 was on main61cfb9b(unchanged; this run addedno-sources(#564), root-level dotted sources (#544, verified fixed on PR #545), vendored script dotted sources andrepairon dotted / CRLF). Run 7 added path/git siblings, legacy dev-dependencies, constraint-dependencies, vendored sources spellings and uv 0.12.22). Run 6 was also on61cfb9b(the dotted-name, sources-spelling, lock-only and UV_PROJECT_ENVIRONMENT cells). Run 5 was also on main61cfb9b(v5; CLI reports 4.0.0, and the released 4.0.0 predates both the v4 uv rewriter and the v5 upstream restore). Earlier cells are from2463257/6e7ef74. Linux runs use real uv against a local mock patch API (withintegrity.sha512in SRI form, a deterministic wheel, the/blob/route and--patch-server-url), plusSOCKET_PYPI_JSON_API→ a local pypi.org pass-through that must not rewrite file URLs. uv 0.1.x needsSSL_CERT_FILE; uv 0.0.5 needsPUFFIN_INDEX_URL→ a local/simple/proxy. macOS and Windows runs use probe branches.Coverage matrix
H = hosted, V = vendored, A = agent. "pass/fail" is Linux unless an OS is named. Results are from v5 main (
2463257/6e7ef74) unless marked (v4).[[distribution]])--frozen/--locked)--frozen/--lockedkeep patch, VEX, rollback)uv add(Linux, macOS, Windows); fail #411 user override (Linux, Windows); fail #477uv synckeeps patched wheel after rollbackuv add(3 OS); fail #411 (3 OS); fail #473 (3 OS); fail #477 stale after rollback (uv.lock anduv pip sync)package = false,environments, self-ref extras, hashed-requirements variants, uv.lock + exported requirements.txt, two pylocks)uv remove/uv lock --upgrade-package; fail #407; fail #408 (re-confirmed on61cfb9b); fail #411; fail #473 include-group (3 OS); fail #477 stale after rollback/revertpylock.dev.toml, include-group); fail #474 script revert afteruv add --script(3 OS)uv syncafter rollback reinstalls upstream (uv-side fix in 0.8.18)--locked/--frozen/plain, inline sources, BOM, odd-case name, idempotent, VEX, pylock, script lock, CRLF, hashed requirements, markers, ranges, groups, extras, transitive override)uv add(3 OS), script lock, hashed requirements, CRLF, multi-file; fail #411 (3 OS); fail #407; fail #408; fail #473 (3 OS);uv pip syncafter requirements unwind fail #477 (3 OS)backports.tarfilein 3 spellings; dotted / root / inline sources spellings; lock-only checkout with space + unicode path,--frozencold cache, idempotent re-scan[tool.uv.sources.<name>]sub-table leaves an empty header (rollback, remove; also 0.5.31)UV_PROJECT_ENVIRONMENTignored (abs + relative)dev-dependencies(0.4.30 / 0.5.31 / 0.8.17),constraint-dependencies(0.8.17 / 0.9.5 / 0.12.22), inline[tool] uv = {…}/ roottool = {…}/sources.x.path--frozen --offline),[tool.uv.sources]before[project], CRLF; fail #544 dotted[tool.uv] sources.x/[tool] uv.sources.x: revert / remove half-revert (0.5.31, 0.8.17, 0.12.22)not a standard table)| 0.5.31 / 0.8.17 / 0.12.22 (run 8) |
fail #564fixed by #1434 (run 39: refused with nothing written on 0.13.0, project + script lanes) | – | pass: script# [tool.uv]dotted sources,repairon dotted / CRLF; fail #544 root-leveltool.uv.sources.x(fixed on PR #545); existing{ index }source refused | pass (dotted, CRLF) | – | || 0.4.30 / 0.5.31 / 0.8.17 / 0.12.22 (run 9, main
045d7ec) | pass:exclude-newer-package,required-version,index-strategy,reinstall-package, default mirror index, pylock (compile + export; #407/#408 fixed); fail #606 six declared with different specifiers (deps + extra, two extras, marker split) | fail #606 (rollback, remove, takeover); fail #473 and #411 still reproduce; no-binary / no-build refused (documented) | pass: #606 pyproject; #474 script revert afteruv add --script(fixed) | – | pass:UV_PROJECT_ENVIRONMENTabs + relative (#525 fixed);UV_LINK_MODE=symlinkon 0.5.31 / 0.8.17 / 0.12.22 |-gUV_TOOL_DIRwith space + unicode: scan + agent apply pass (#449 Linux fixed) || 0.4.30 / 0.5.31 / 0.8.17 / 0.12.22 (run 10, main
045d7ec) | pass:[tool.uv] conflicts(extras),required-environments,dependency-metadata; fail #639dynamic = ["dependencies"](scan wires it) | fail #639 (rollback, remove, takeover; also on PR #625); #606 / #473 pass on PR #625 | pass: conflicts / required-environments / dependency-metadata (0.8.17, 0.12.22);dynamicrefused by design (pypi_uv_dynamic_dependencies) | – | – | || 0.5.31 / 0.8.17 / 0.12.22 (run 11, main
045d7ec) | pass: patched packages with deps / extras / markers (requests[socks], urllib3[socks,brotli], click, jsonschema[format] + transitive dateutil), two patched packages at once,uv pip compile --emit-*hashed requirements, pylock +pylock.dev.tomlwith deps | pass: full and partial rollback / remove (both orders), byte-identical | pass for a single package with deps; fail #670 two or more packages →vendor --revertleaves empty[tool.uv.sources](also hosted→vendored takeover); script locksdistreorder (cosmetic) | – | VEX after partial unwind pass | V→H takeover with 2 packages pass (#503) || 0.5.31 / 0.8.17 / 0.12.22 (run 12, main
045d7ec) | fail #701 platform-specific patched wheel (MarkupSafe cp311 manylinux) wired with no warning:uv sync --lockedfails on py3.12 and on macOS / Windows (--python-platform); pylock too | refused (documented: release has non-pure wheels) | pass: platform wheel (vendor_platform_locked), two packages afteruv add; #670 fixed on PR #672 (3 versions) | pass: two packages, one wheel deleted | – | || 0.5.31 / 0.8.17 / 0.12.22 / 0.12.23 (run 13, main
045d7ec) | pass: 0.12.23 baseline (uv.lock + exported requirements,--locked/ cold--frozen/uv pip sync, rollback byte-identical); V→H takeover with exported requirements | fail #723 V→H takeover after a vendored version pin-down (transitive / direct; 0.5.31, 0.8.17, 0.12.23; also on PR #708) | fail #612 (uv comment) uv.lock +uv exportrequirements.txt: requirements left unpatched with no warning (4 versions); script lock + uv.lock warns (documented) | – | pass (0.12.23 agent scan) | || 0.5.31 / 0.8.17 / 0.12.23 (run 14, main
045d7ec) | fail #742 patch upgrade (new uuid) not applied: project + script lock, exit 0; fail #701 (comment)uv pip compile --universalrequirements + script lock with a cp311 wheel; 0.12.23 baseline pass on Linux / macOS / Windows (probe) | pass: rollback byte-identical (3 OS); requirements platform-wheel rollback byte-identical | fail #742 re-vendor on a new uuid (pypi_uv_source_already_exists); baseline pass on 3 OS (unicode + space dir); H→V takeover with exported requirements: uv.lock pass, requirements.txt unpatched (#612) | – | – | V→H takeover pass on 3 OS || 0.5.31 / 0.8.17 / 0.12.23 (run 15, main
045d7ec) | fail #767 PEP 508 direct reference (six @ https://…): overrides the user URL; pylockarchiverollback becomes a registry entry; lockless pyproject is silent (#638 comment); pass: cross-version--locked, re-lock across revisions, trailing-slash index,resolution-markerslock,get(purl / uuid / name), concurrent scans; PR #743 fixes the #742 upgrade (project / override / script,--max-new-patches 0) | fail #767 (rollback refuses "direct reference", 3 OS) | fail #767 (requires-distgetsurl+path→--lockedfails, vex attests; also git refs, dependency groups; 3 OS); pass:get, forked lock | – | pass:UV_COMPILE_BYTECODE, 0.5.31 / 0.12.23 × hardlink / copy,get| script with space + unicode name pass || 0.6.15–0.6.17 / 0.7.22 / 0.9.30 / 0.10.12 / 0.11.33 (run 16, main
045d7ec) | pass: round trip on all; grant-token rotation (0.5.31 / 0.8.17 / 0.12.23); comments / editable path source formatting;build-constraint-dependencies;pylock.<name>.tomlnames; fail #767 direct ref in optional-dependencies / constraint-dependencies | fail #788 on 0.6.15–0.6.17 (upload_time: rollback, remove, takeover, script lock; 3 OS); pass on 0.7.x+ (3 OS for 0.7.22) | pass on all; fail #767 optional / constraint direct ref (--lockedfails, vex attests) | – | – | hosted write failure mid-commit leaves pyproject.toml half-written (recoverable by re-scan; candidate) || 0.5.31 / 0.8.17 / 0.12.21 / 0.12.23 (run 17, main
045d7ec) | pass: git / editable-path / URL siblings, marker-split sources arrays, script lock LF / CRLF / BOM,uv pip compileflavours,typing_extensionsname spellings, version spellings (==3.7.0,==3.7.*,~=),--dry-runwrites nothing | pass byte-identical (same cells);===refused (conservative);==3.07restores the user's spelling (cosmetic) | pass (same cells); fail #806 useroverride-dependencies+ transitive override, thenuv add/uv lock --upgrade-package→ half revert (3 OS × 0.8.17 / 0.12.23; 0.5.31 Linux) | – | pass: project.venvon Linux / macOS / Windows × default / hardlink / copy (probe), symlinked.venv; uv cache never polluted | lockless PEP 723 script: scanned 0 (unsupported input) || 0.2.37 / 0.4.30 / 0.5.31 / 0.8.17 / 0.12.23 (run 18, main
045d7ec) | pass: user constraint-dependencies + relock; script lock with user override / constraints | pass afteruv add --dev(hosted; 3 OS × 0.8.17 / 0.12.23) | fail #821 six in a dev group (PEP 735 / legacy) +uv add --dev/uv remove --dev→ half revert (3 OS); pass fordependencies/ extras / other groups | – | – | V→H takeover on #821's shape: half revert, exit 0 || 0.5.31 / 0.8.17 / 0.12.23 (run 19, main
045d7ec+ PR #822) | pass: hosted rollback after a single-clause spec edit re-derives it | multi-clause spec edit refused (documented) | fail #840 user edits six's own specifier then revert / remove / rollback → stale==1.16.0(3 OS × 3 versions; PR #822 too); #806 / #821 + neighbours + constraint edit fixed on PR #822 | – | – | V→H takeover after a spec edit pass (3 OS) || 0.2.37 / 0.4.30 / 0.5.31 / 0.8.17 / 0.12.23 (run 20, main
99f61d2) | idempotent re-scan pass (project + script × hosted + vendored); fail #564 still (3 versions); script lock spec edit → V→H takeover pass | fail #411 still (3 versions × rollback / remove) | fail #869 script lock spec edit → revert / remove / rollback stale==1.16.0(Linux 3 versions, Windows 0.5.31 / 0.12.23, macOS 0.12.23); #840 fix pass (deps / extra / dev ×>=~=!===.*<bare,Six,(>=…), markers simplified away); marker / extras-on-six / multi-clause / constraint edits drift-keep both files (--lockedok) | – | – | H→V takeover after a spec edit pass (project + script) || 0.8.17 / 0.12.23 (run 21, main
9c43dfc) | pass: file modes kept (0600 pyproject, 0664 uv.lock, 0755 script, 0640.py.lock) through scan + rollback; symlinked pyproject / uv.lock /s.py/s.py.lock/ pylock refused before any write (wet and dry); uv-exportedpylock.toml/pylock.dev.tomlhosted rollback byte-identical (#807 no regression); script lock with[tool.uv] constraint-dependencies/ CRLF /[[tool.uv.index]]source round trip; two scripts round trip | pass: two-script rollback; one script deleted → hosted rollback pass | fail #890 one of several wired scripts / script locks / pylocks deleted → revert / remove / rollback fail, takeover stuck (Linux 2 versions, Windows 0.12.23); fail #891 dry run gives no symlink warning for script / pylock files (Linux 2 versions, Windows 0.12.23);vendor --checkafter unwiring fails correctly; fail #723 / #767 still | – | – | regenerated uv.lock after vendoring → revert clean || 0.2.37 / 0.4.30 / 0.5.31 / 0.8.17 / 0.12.23 (run 22, main
9c43dfc) | pass:--cwdrelative / absolute /../with a space in the project dir (project + script,--lockedok); VEX after unwiring pyproject / uv.lock / both / deleting the lock (no over-attestation);list --json(project, script, two scripts, pylock) | pass:--cwdrollback | fail #890 project lane:uv.lockdeleted → revert / remove / rollback exit 1, takeover exit 0 (0.8.17 / 0.12.23); pass: pyproject-variant sweep (package = false, hatchling,requires-pythonupper bound, editable path sibling, inline comments, extras-only six), uv.lock + exported pylock warnspypi_multiple_lockfiles; macOS confirms #890 / #891 | – | pass:uv venv+uv pip installanduv syncvenvs on 0.2.37 / 0.4.30 / 0.5.31 / 0.8.17 / 0.12.23 (scan, apply, reinstall then re-apply,uv pip check, vex, rollback, vex refuses after rollback) | BOM pyproject: every writer drops the BOM (uv-consistent, not filed) || 0.5.31 / 0.8.17 / 0.12.23 (run 23, main
9c43dfc) | pass:uv pip compile --universalmarker-split six (1.16.0 / 1.17.0) → requirements.txt (plain and--generate-hashes) and pylock.toml rewrite only the 1.16.0 entry (py3.11 patched, py3.12 upstream) | pass: byte-identical rollback (requirements + pylock) | fail #928 marker-split--universalrequirements.txt →pypi_requirement_not_pinned(exit 1), dry run previewswould_vendor(3 versions); pass: marker-split pylock (wire, vex, regenerate the lock → vex refuses, revert byte-identical; 0.8.17 / 0.12.23), same-version two-marker requirements lines | – | – | forked PEP 723 script lock refused in both modes, nothing written || 0.5.31 / 0.8.17 / 0.12.23 (run 24, main
9c43dfc) | – | – | fail #944 H→V takeover viascan/get --mode vendoredun-hosts six before the vendored refusal (inline[tool.uv] sources = {…}; #928 split requirements); standalonevendorkeeps it hosted (pass); #928 split across a-rinclude (either side) refuses, dry run sayswould_vendor(comment on #928) | – | – | || 0.5.31 / 0.8.17 / 0.12.23 (run 25, main
9c43dfc) | 144 system packages listed as project packages (no.venv, #964) | – | fail #964 fresh checkout without.venv(also a missingUV_PROJECT_ENVIRONMENT, and a script-lock-only dir): global-site-packages fallback, system-only PyYAML →pypi_uv_lock_package_missing, exit 1, dry run says success; control afteruv sync/ syncedUV_PROJECT_ENVIRONMENTpasses | – | untested | || 0.5.31 / 0.8.17 / 0.12.23 (run 26, main
9c43dfc) | – | – | fail #979vendor --dry-runsays verified / exit 0 on inline[tool.uv] sources = {…},[tool] uv = {…}, dotteduv.sources = {…}, transitive + inlineuv = {constraint-dependencies}; the wet run exits 1pypi_uv_lock_parse_failed; pass: script-lock inline sources (wired,--locked, byte-identical revert),pypi_uv_source_already_existsdry-run parity, vendor then relock on a newer uv (0.5.31→0.8.17 / 0.12.23, 0.8.17→0.12.23; rev 1→3→5) then revert,exclude-newer+ freshUV_FROZENsync | – | – | || 0.5.31 / 0.8.17 / 0.12.23 (run 27, main
9c43dfc) | – | – | fail #996uv exportrequirements.txt / pylock.toml /--scriptexport of a vendored lock → revert / remove / rollback delete the still-referenced wheel (exit 0; dry run previewsremoved); pass: SIGKILL at 110 points 0–350 ms (pair always orig or wired, journal replayed, re-run + revert byte-identical,uv lock --checkok), 3 concurrent vendor / vendor / revert (lock_held, consistent), manifest-dropvendor_reconciled(byte-identical), explicit[[tool.uv.index]]+ other-package index source + trailing[tool.ruff](wire,--locked, revert byte-identical) | – | – | vendored vex with a stale.venvattests from the committed artifact withvendored_tree_out_of_sync(documented) || 0.5.31 / 0.8.17 / 0.12.23 (run 28, main
6fe81ad) | pass: #701 platform grant (MarkupSafe cp311) withheld withredirect_pypi_platform_wheel(scan, dry run,get); six still pinned; py3.12--lockedok; VEX attests only six | pass: rollback byte-identical; mixed state (MarkupSafe vendored + six hosted) rollback andvendor --revert→rollback byte-identical | pass: #928--universalmarker split (plain / hashed) wired + byte-identical revert; #944 takeover refusal keeps the hosted pin (#963); fail #742 superseding re-vendor (PR #943 fixes it; on #943 fail #996 the stale-artifact removal breaks auv export) | – | – | V→H with a vendored platform wheel keeps it vendored (pass); root-only[tool.uv.workspace]refused (conservative) || 0.5.31 / 0.8.17 / 0.12.23 (run 30, main
77f305d) | pass: H→H superseding uuid (project / script / pylock), #723 drift takeover now refusedredirect_uv_takeover_version_unreachable(#946), forked lock refused | pass: unwinds after a superseding-uuid re-vendor are byte-identical (revert / rollback / remove × project / script / pylock); fail #411 also through the H→V takeover + revert | pass: V→V and V→H superseding uuid (project / script / pylock), H→V superseding uuid for script / pylock / lock-only; fail #1105 H→V superseding uuid with the hosted bytes installed (project,uv piprequirements); fail #996 still | – | pass: symlink / hardlink link modes × plain / symlinked.venv/UV_PROJECT_ENVIRONMENT, rollback, VEX after reinstall, no cache pollution | patch-detail 5xx: JSON and human both exit 1 (3 modes) || 0.5.31 / 0.12.23 (run 31, main
b96a785) | pass: H A→H B re-pin after #1035; UTF-16 requirements.txt beside uv.lock refusedcandidate_file_unreadable(#724, documented) | pass: rollback after H A→B byte-identical | pass: #612 warning (#1044) for uv.lock + UTF-8uv export(scan + H→V takeover);remove <superseding uuid>reverts vendored A (#999 / #1035); fail #1120 UTF-16 (LE/BE BOM) exported requirements.txt: no warning,vendor --check0, VEX attests; fail #1105 still | – | – | || 0.5.31 / 0.12.23 (run 32, main
3b4ac84) | fail #1138 scan from a hatchling uv-workspace member rewrites the member pyproject (hosted URL); root uv.lock stale,--frozenunpatched | – | fail #1138 (same, vendored{root:uri}; vex not_affected); fail #1140uv remove six→ prune / revert / remove / rollback drift-keep, check stays red; pass: #1050 prune keeps live project / script / pylock / lockfile-only entries, #612 probe after re-export, MarkupSafe spellings (#1045) | – | – | || 0.5.31 / 0.12.23 (run 33, main
4657813) | pass: #1039 V→H takeover (project + script, attrs sibling,--frozen/--lockedpatched, vex); nested non-member project in a workspace wired; fail #567 (comment) uv.lock + include-only requirements pin → rollback / removehosted_wiring_contested, no-op remedy | pass: rollback after the V→H takeover is byte-identical; root-pin + include duplicate rollback is byte-identical | pass: #997 root-leveluv exportrequirements / pylock keep the wheel; fail #1167 (comment)requirements/prod.txt,docker/requirements.txt,deploy/pylock.tomllose the wheel; fail #1138 (comment) hatch.toml /[tool.hatch]/ uv_build + hatch.toml members; fail #1140 (comment)uv remove --script, remove + add 1.17.0 | wheel-deleted repair pass; state.json deleted →vendor_ledger_missing(documented) | – | || 0.5.31 / 0.8.24 / 0.12.24 (run 34, main
b76d7ab) | fail #1138 still (0.12.24, hosted + vendored); fail #1105 still (0.12.24, H A → V B exit 1package_not_installed, dry run success) | – | pass: #1147 projectuv remove sixand remove +uv add six==1.17.0→ prune reverts, check 0; #1168req/prod.txtkeeps the wheel; #1152 UTF-16 / latin-1 requirements.txt beside uv.lock → warning, check 1, vex refuses; UTF-16-r base.txtinclude → check 1, vex refuses (no warning, #567 note); fail #1213 subdirectory pylock export (deploy/pylock.toml,deploy/pylock.prod.toml,a/b/pylock.toml) → revert / remove / rollback / takeover delete the wheel, exit 0, export install fails (0.8.24 / 0.12.24); rootpylock.prod.tomlkept; fail #1214uv remove --script→ prune / revert exit 0 kept, remove / rollback exit 1, takeovervendor_ledger_entry_unwired, check stays 1 (0.5.31 / 0.12.24) | – | – | || 0.5.31 / 0.8.24 / 0.12.24 (run 35, main
e03a666) | uv.lock + UTF-16 / latin-1 requirements.txt →candidate_file_unreadable(documented) | – | fail #1252 rootrequirements.lock/requirements-dev.lock/deploy/requirements.lockexport → wheel deleted on all four unwinds (also on PR #1223); pass: PR #1223 subdirectory pylock, PR #1231 single-scriptuv remove --script, script source-line deletion; fail #1214 two scripts with one dropping six (main and #1231) | – | pass:UV_LINK_MODEsymlink / hardlink / copy (no cache pollution, rollback restores) | || 0.5.31 / 0.12.24 (run 36, main
e9be746) | – | – | fail #1285 two scripts, oneuv remove --script: revert / prune 0 with a.py still wired, remove / rollback 1, hosted takeoverredirect_vendored_revert_failed; fail #1287 transitive six (constraint-dependencies) afteruv remove <parent>(project + script): prune / revert 0 kept, remove / rollback 1, check 1; pass: #1214 single script (prune / revert / remove / rollback, check 0); PR #1265:requirements.lock,deploy/requirements.lock,requirements/prod.lockkept (main still deletes, #1252) | – | – | – || 0.5.31 / 0.12.24 (run 37, main
85105c9) | pass:getby name / purl spellings ofbackports.tarfile(hosted + vendored) | pass: #1034remove/rollbackbybackports.tarfile,Backports_Tarfile,pkg:pypi/backports.tarfile,pkg:pypi/Backports_Tarfile@1.2.0, uuid (with an attrs sibling) | fail #1374 transitive six +uv add six==1.16.0(parent kept or removed) → revert / remove / rollback half-revert,--lockedfails (main and PR #1337); pass on PR #1337: #1287 main / dev / group parent × 4 unwinds, script lane; #1285 still fails on main; vex omits six after its parent is removed (vendor_unwired) | – | pass: Linux / macOS / Windows × 0.8.17 / 0.12.24 × symlink / hardlink / copy (agent scan, vex not_affected, second project unpatched, rollback, reinstall; probe run 37988589988) | script lane +uv add --script six: drift-keep, both files untouched (fail-closed) || 0.13.0 (run 38, main
7236190) | pass (direct six,--locked/--frozen/ plain fresh installs; Python 3.15 too) | pass rollback;fail #1445(fixed by #1453, verified run 39) leftover transitive override after the parent is dropped (also 0.5.31 / 0.12.24) | pass (#1374 neighbours, upgrade-drop unwinds, hashed-cconstraints lane) | untested | pass (Python 3.11 / 3.15) | macOS / Windows untested || 0.5.31 / 0.8.17 / 0.13.0 (run 41, main
306ec81) | fail #1545 project without[tool.uv]under a parentuv.toml/[tool.uv](exclude-newer,resolution): wiring hides the parent settings,uv sync --lockedfails; control without parent passes | hosted rollback refuses in the 1-package fixture (documented sibling /exclude-newerlimit) | fail #1545 (same); vendored rollback restores cleanly | – | – | pass: #1501 fix (script under parent / grandparent config,[tool.uv]-less pyproject in between; 0.5.31 / 0.13.0, both modes refuse, nothing written) || 0.5.31 / 0.8.17 / 0.13.0 (run 40, v5.0.1) |
fail #1501(fixed by #1504, verified run 41) script under parentno-sources(uv.toml or pyproject); pass the parent-config project lane | pass: the #1453 orphan + vendored takeover; PEP 503 spellings for remove / rollback | fail #1501 (same); pass: PEP 503get; VEX CRLF / BOM (#1486) | – | – | VEX stale-venv: hosted refuses, vendored warns (documented) || 0.5.31 / 0.8.17 / 0.12.24 / 0.13.0 (run 39) | pass: #1434 no-sources refusal (pyproject /
uv.toml/no-sources-package, project + script, with / without uv.lock; precedence matches uv); pylock-only beside no-sources wires (pylock ignores sources); #1440mode_ambiguouson uv.lock /s.py.lock/pylock.tools.tomlhosted pins | pass: rollback / remove afterno-sourcesadded post-wiring; fail #1445 on main, also PEP 723 script lane (fixed on PR #1453) | pass: revert / remove / rollback afterno-sourcesadded; scan dry run previewsverifiedwhile wet refuses (#891 comment); fail #869 on main (fixed on PR #1458, 36 cells) | – | pass: uv-managed 3.12--system-site-packagesvenv, base copy patched / vex / rollback (#1419) | macOS / Windows probe blocked (Actions didn't start) |Global (
-g) modeUV_TOOL_DIR/XDG_DATA_HOMEUV_PYTHON_INSTALL_DIR--product/ rollback / get / remove; stale reinstall → vex refuses)045d7ec(#449 fixed:%APPDATA%\uv\tools)UV_TOOL_DIRwith space + unicode,XDG_DATA_HOME)SOCKET_GLOBAL=1,--global-prefix/SOCKET_GLOBAL_PREFIXwith space and unicode paths, and project isolation (-gskips.venv) all pass on Linux.| 0.4.30 / 0.5.3 / 0.5.4 / 0.5.5 / 0.5.31 / 0.13.1 (run 42, main
e76cb9b) | pass: 0.13.1 baseline (project, script lock, pylock); fail #1569 hosted gives no uv < 0.5.6 advisory for transitive / constraint wiring (0.4.30–0.5.4 plain sync reinstalls unpatched) | pass: #1525 orphan unwind (uv remove isodatethen rollback) and the user's own unmarked override kept, on 0.4.30 / 0.5.3 / 0.5.31 / 0.13.1 | pass: the same lanes warnpypi_uv_*_requires_uv_0_5_6| – | – | PR #1566 (#1545 fix): refuses theexclude-newer/resolution/ index parents (correct) but over-refuses parentconstraint-/override-/build-constraint-dependencies(not inherited by uv; commented on #1545). BOM pyprojectvex→product_undetected(#1529, intended) |Backlog
uv syncsilently reinstalls the unpatched wheel after a clean exit 0 #1569 (new) once a fix lands. Check that it covers theuv pip/ requirements lanes it may share code with, and the hosted ↔ vendored takeovers on 0.5.3. (The PEP 723 script lane can't hit it:uv lock --scriptstarts at 0.5.17.)uv sync --lockedfails and a plainuv lockre-resolves without them #1545: parentconstraint-dependencies/override-dependencies/build-constraint-dependenciesmust wire;exclude-newer/resolution/index-url/ a default[[index]]must refuse. Also a uv workspace root under a parent config, andcache-keys(untested).uv sync --lockedfails and a plainuv lockre-resolves without them #1545 (new) once a fix lands. Neighbours: a parent[[index]]/index-url(plainuv syncwould switch indexes), parentconstraint-dependencies/override-dependencies, a project that already has an unrelated[tool.uv](should pass), a uv workspace root under a parent config, and pylock / script-lock lanes beside such a project.pyproject.tomlnow yields no product (intended per the commit). Check thatvexon a uv project with a BOM'd pyproject gives a clearproduct_undetected(uv itself accepts the BOM; run 40 cells passed before Fix pyproject product detection tables (#1527, #642) #1529).==manifest overrides of uv < 0.5.6: re-run the Hosted uv: afteruv remove <parent>oruv lock --upgrade-package <parent>drops a hosted-pinned transitive package, its leftover override makes rollback, remove and list fail forever with hosted_wiring_contested #1445 orphan-unwind lane on uv 0.4.30 / 0.5.3 and check that a user's own unmarked override is kept (Hosted uv rollback and remove delete a user-authoredoverride-dependencies = ["<pkg>==<ver>"]pin that hosted mode never added #411).no-sources = truefrom a parentuv.toml/pyproject.toml, souv run --lockedfails and a plainuv runimports the unpatched package #1501 (new). Neighbours: a grandparent config, apyproject.tomlwithout[tool.uv]between the script and the config (does uv keep walking?), anduv.tomlvs pyproject in the same ancestor. Re-triage 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 / Hosted uv scan wires adynamic = ["dependencies"]project, but rollback, remove and the vendored takeover then always refuse ("pyproject.toml no longer declares six") #639 / Vendored dry run gives no symlink warning for uv script locks or pylock files: a symlinkeds.py,s.py.lock,pylock.tomlorpylock.<name>.tomlpreviews clean, and the real run then refuses (exit 1) #891 once fix PRs exist.git push --deleteis now denied by the session's permission classifier (it used to hang up through the proxy), and no probe run started in the last day. Push new probes only once cleanup works. Maintainers: please delete thebughunt/uv/*branches listed below.uv remove <parent>oruv lock --upgrade-package <parent>drops a hosted-pinned transitive package, its leftover override makes rollback, remove and list fail forever with hosted_wiring_contested #1445 / Vendored uv script lock: after the user changes the vendored package's specifier in the PEP 723 block,vendor --revert/remove/rollbackwrite the stale==1.16.0back into<script>.py.lock, souv run --lockedfails (exit 0) #869 after PRs Fix orphaned hosted uv override wiring (#1445) #1453 / Fix stale specifier on uv script-lock revert (#869) #1458 merge, and Vendored dry run gives no symlink warning for uv script locks or pylock files: a symlinkeds.py,s.py.lock,pylock.tomlorpylock.<name>.tomlpreviews clean, and the real run then refuses (exit 1) #891 (now also the no-sources / inline-sources dry-run gap). After Fix orphaned hosted uv override wiring (#1445) #1453, check that a vendored takeover over an orphaned hosted override cleans it or leaves it for rollback.bughunt/uv/20261013-uv013-baseline(6 jobs, Linux dry-run passes), but Actions never started it. Re-push once probe runs work again.uv.toml(uv's config lookup is cwd-based), andno-sources-packageon uv < 0.10, where uv ignores the key and the refusal may be stricter than needed (low priority).uv remove <parent>oruv lock --upgrade-package <parent>drops a hosted-pinned transitive package, its leftover override makes rollback, remove and list fail forever with hosted_wiring_contested #1445 (new), Vendored uv script lock: after the user changes the vendored package's specifier in the PEP 723 block,vendor --revert/remove/rollbackwrite the stale==1.16.0back into<script>.py.lock, souv run --lockedfails (exit 0) #869 and Vendored dry run gives no symlink warning for uv script locks or pylock files: a symlinkeds.py,s.py.lock,pylock.tomlorpylock.<name>.tomlpreviews clean, and the real run then refuses (exit 1) #891. Hosted uv: afteruv remove <parent>oruv lock --upgrade-package <parent>drops a hosted-pinned transitive package, its leftover override makes rollback, remove and list fail forever with hosted_wiring_contested #1445 neighbours: a PEP 723 script (uv remove --scriptof the parent), a workspace member,uv lock --upgradeof everything, and the vendored takeover over the leftover (exited 0 with the hosted lines kept).-c "path with space.txt", and-ein a constraints file (now rejected by uv).uv add six==1.16.0):vendor --revert/remove/rollbackhalf-revert the pair, souv sync --lockedfails andvendor --checkclaims nothing references the wheel #1374 (new), Vendored uv transitive package: afteruv removeof its parent,scan --prune,vendor --revert,removeandrollbackdrift-keep it, sovendor --checkstays red and its prune remedy loops (project and script lanes) #1287 once PR Fix vendored uv drift-keep after uv remove (#1287) #1337 merges, and Vendored uv script locks: afteruv remove --scriptdrops the package from one of two vendored scripts, every unwind keeps the other script wired (revert exits 0, remove/rollback exit 1, hosted takeover refuses) #1285. Check that a Vendored uv transitive package later added as a direct dependency (uv add six==1.16.0):vendor --revert/remove/rollbackhalf-revert the pair, souv sync --lockedfails andvendor --checkclaims nothing references the wheel #1374 fix also fixesvendor --check's "no lockfile references" wording, and coversuv add --optional/--dev sixpromotions.uv add six==1.16.0):vendor --revert/remove/rollbackhalf-revert the pair, souv sync --lockedfails andvendor --checkclaims nothing references the wheel #1374 neighbours: a direct vendored six later also pulled transitively, thenuv remove six(direct dropped, transitive kept); promotion on the pylock-exported lane;uv add six>=1.16(respell) vs==.uv lock --upgrade-package <parent>that drops six (needs a parent release without six), pylock-only transitive wiring, and the 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 / Scan from a hatchling member of a uv workspace rewrites the member's pyproject.toml as a lockless Hatch project, so the root uv.lock goes stale,uv sync --frozeninstalls the unpatched release and vendoredvexattests not_affected #1138 re-checks.uv remove --scriptdrops the package from one of two vendored scripts, every unwind keeps the other script wired (revert exits 0, remove/rollback exit 1, hosted takeover refuses) #1285 / Vendored uv transitive package: afteruv removeof its parent,scan --prune,vendor --revert,removeandrollbackdrift-keep it, sovendor --checkstays red and its prune remedy loops (project and script lanes) #1287 (new) and Vendored PyPI revert, remove, rollback and the hosted takeover delete the vendored wheel while a rootuv export -o requirements.lock(Rye-style name) still installs from it (exit 0) #1252 once PR Fix revert deleting wheels a requirements.lock uses (#1252) #1265 merges. Check that a Vendored uv transitive package: afteruv removeof its parent,scan --prune,vendor --revert,removeandrollbackdrift-keep it, sovendor --checkstays red and its prune remedy loops (project and script lanes) #1287 fix also restores the socket-writtenoverride-dependencies/sourceslines, and that Vendored uv script locks: afteruv remove --scriptdrops the package from one of two vendored scripts, every unwind keeps the other script wired (revert exits 0, remove/rollback exit 1, hosted takeover refuses) #1285's fix still drift-keeps a real hand edit in a referencing script.uv removeof its parent,scan --prune,vendor --revert,removeandrollbackdrift-keep it, sovendor --checkstays red and its prune remedy loops (project and script lanes) #1287 neighbours: the parent removed only from a dependency group (uv remove --dev), a pylock-only transitive wiring, and anuv lock --upgrade-package <parent>that drops six.UV_LINK_MODE=symlink(still open), and the 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 / Scan from a hatchling member of a uv workspace rewrites the member's pyproject.toml as a lockless Hatch project, so the root uv.lock goes stale,uv sync --frozeninstalls the unpatched release and vendoredvexattests not_affected #1138 re-checks on the next main.uv export -o requirements.lock(Rye-style name) still installs from it (exit 0) #1252 (new), plus Vendored PyPI revert, remove, rollback and the hosted takeover still delete the vendored wheel while auv export --format pylock.tomlin a subdirectory installs from it (exit 0) #1213 / Afteruv remove --scriptdrops a vendored package from a PEP 723 script lock,scan --prune,vendor --revert,remove,rollbackand the hosted takeover still drift-keep it, sovendor --checkstays red and its prune remedy loops #1214 once PRs Fix vendored PyPI revert deleting a wheel a subdir pylock uses (#1213) #1223 / Fix uv script lock revert stuck as drift (#1214) #1231 merge. Check that Fix uv script lock revert stuck as drift (#1214) #1231's merge covers two scripts where only one drops six.uv export -o requirements.lock(Rye-style name) still installs from it (exit 0) #1252 neighbours:uv pip compile -o requirements.lock,requirements/*.lock. Also a macOS / Windows probe of agent mode underUV_LINK_MODE=symlink(Linux passes).uv export --format pylock.tomlin a subdirectory installs from it (exit 0) #1213 / Afteruv remove --scriptdrops a vendored package from a PEP 723 script lock,scan --prune,vendor --revert,remove,rollbackand the hosted takeover still drift-keep it, sovendor --checkstays red and its prune remedy loops #1214 (new) once fixes land; check that a Vendored PyPI revert, remove, rollback and the hosted takeover still delete the vendored wheel while auv export --format pylock.tomlin a subdirectory installs from it (exit 0) #1213 fix also covers the dry run and the hosted takeover, and that Afteruv remove --scriptdrops a vendored package from a PEP 723 script lock,scan --prune,vendor --revert,remove,rollbackand the hosted takeover still drift-keep it, sovendor --checkstays red and its prune remedy loops #1214's fix keeps a script lock that still names the uuid as drift.scanon uv.lock + UTF-16 requirements.txt still refusecandidate_file_unreadable(Known non-bugs), or now wire it? Then a UTF-16pylock.tomlbeside uv.lock.uv export --format pylock.tomlin a subdirectory installs from it (exit 0) #1213 neighbours: a subdirectorypylock.tomlreached by a symlink, a subdirectory*.py.lock/ script export, anduv export --format requirements.txt -o deploy/requirements.lock(no.txtsuffix).uv remove --scriptdrops a vendored package from a PEP 723 script lock,scan --prune,vendor --revert,remove,rollbackand the hosted takeover still drift-keep it, sovendor --checkstays red and its prune remedy loops #1214 neighbours: a vendored script where the user deletes only thetool.uv.sourcesline, and a two-script fixture where one script drops six and the other keeps it.uv removeof a vendored package,scan --prune,vendor --revert,removeandrollbackall keep it as "drifted", sovendor --checkstays red and its suggestedscan --prunefix loops #1140 project + upgrade pass, script → Afteruv remove --scriptdrops a vendored package from a PEP 723 script lock,scan --prune,vendor --revert,remove,rollbackand the hosted takeover still drift-keep it, sovendor --checkstays red and its prune remedy loops #1214; Vendored PyPI revert,removeand the hosted takeover still delete the vendored wheel while a requirements file in a subdirectory (requirements/dev.txt,pip freeze > requirements/lock.txt) installs from it (exit 0), so that install then fails #1167 txt pass, pylock → Vendored PyPI revert, remove, rollback and the hosted takeover still delete the vendored wheel while auv export --format pylock.tomlin a subdirectory installs from it (exit 0) #1213) Re-triage the Scan from a hatchling member of a uv workspace rewrites the member's pyproject.toml as a lockless Hatch project, so the root uv.lock goes stale,uv sync --frozeninstalls the unpatched release and vendoredvexattests not_affected #1138 Hatch-config variants after a governing-root fix (non-member nested project must still wire). Hosted scan in a Pipenv project whose requirements.txt pins the package through an-rinclude rewires only Pipfile.lock, then reports success while vex and rollback refuse the contested lock it just created #567 uv lane (include-only pin beside uv.lock).-rinclude rewires only Pipfile.lock, then reports success while vex and rollback refuse the contested lock it just created #567). Try-rinclude shapes on the Vendored uv: a UTF-16 requirements.txt beside uv.lock is read as absent, sovexattests not_affected andvendor --checkpasses whileuv pip install -r requirements.txtinstalls the unpatched release #1120 UTF-16 path.uv sync --frozeninstalls the unpatched release and vendoredvexattests not_affected #1138 neighbours: a[tool.hatch]table orhatch.tomlmember, and a nested non-member project with its own uv.lock (it must NOT be refused). Afteruv removeof a vendored package,scan --prune,vendor --revert,removeandrollbackall keep it as "drifted", sovendor --checkstays red and its suggestedscan --prunefix loops #1140 neighbours: an upgrade instead of a removal (uv add six==1.17.0), a transitive vendored package whose parent is removed, anduv remove --script.uv sync --frozeninstalls the unpatched release and vendoredvexattests not_affected #1138 / Afteruv removeof a vendored package,scan --prune,vendor --revert,removeandrollbackall keep it as "drifted", sovendor --checkstays red and its suggestedscan --prunefix loops #1140 (new), Vendored uv: a UTF-16 requirements.txt beside uv.lock is read as absent, sovexattests not_affected andvendor --checkpasses whileuv pip install -r requirements.txtinstalls the unpatched release #1120 and 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 (both still fail on3b4ac84).vexattests not_affected andvendor --checkpasses whileuv pip install -r requirements.txtinstalls the unpatched release #1120 neighbours: a UTF-16-rinclude of the exported file, UTF-16pylock.tomlbeside uv.lock (uv rejects non-UTF-8 TOML? check), and the same on Poetry / PDM / Pipenv governing locks (hand over if it reproduces). A latin-1 PEP 263 requirements.txt beside uv.lock (Lock-only scans still drop a requirements.txt pip decodes through a PEP 263 coding line (latin-1): "No pypi packages found", exit 0, while the same project with a venv refusescandidate_file_unreadable#1119's shape).vendorafter a freshuv exportof the vendored lock (requirements.txt then points at the vendored wheel); the Vendored mode in a Pipenv project wires only Pipfile.lock and silently leaves a sibling requirements.txt unpatched, and the hosted → vendored takeover reverts that file's hosted pin to plain PyPI #612 probe matches by name only, so it may claim "UNPATCHED" for a patched export.Re-triage Vendored uv: a UTF-16 requirements.txt beside uv.lock is read as absent, so
vexattests not_affected andvendor --checkpasses whileuv pip install -r requirements.txtinstalls the unpatched release #1120 (new, run 31), 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 (still fails onb96a785, run 31), Vendored uv:vendor --revert/remove/rollbackdelete the vendored wheel while auv export-ed requirements.txt or pylock.toml still points at it (exit 0), so installs from the exported file fail #996 (still fails on77f305d, run 30), Vendored uv repair pairs a hashless pure wheel with another wheel's hash, because ledger recovery re-parses uv.lock with its own scanner #1079 (arch-audit, not ours; don't re-file), uv scan/get dry-run does not predict a refused hosted-to-vendored takeover #944 (data loss fixed by Keep the hosted pin when a vendored takeover is refused (#853, #944) #963; open only for the dry-run preview), Vendored uv script locks: once the user deletes one wired script (or its .py.lock),vendor --revert,remove,rollbackand the hosted takeover can never unwind the other scripts, and the takeover's suggested fix is the command that fails #890 / Vendored dry run gives no symlink warning for uv script locks or pylock files: a symlinkeds.py,s.py.lock,pylock.tomlorpylock.<name>.tomlpreviews clean, and the real run then refuses (exit 1) #891, Vendored uv script lock: after the user changes the vendored package's specifier in the PEP 723 block,vendor --revert/remove/rollbackwrite the stale==1.16.0back into<script>.py.lock, souv run --lockedfails (exit 0) #869, Hosted uv rollback and remove delete a user-authoredoverride-dependencies = ["<pkg>==<ver>"]pin that hosted mode never added #411 / Hosted and vendored uv wiring ignoreno-sources = true: scan and vendor report success,uv sync --lockedthen fails, and a plainuv syncreinstalls the unpatched wheel #564, uv vendored → hosted takeover strands a package that vendored mode pinned to a different version than uv.lock: the wet run reverts to the unpatched release (exit 1), while --dry-run previews a clean takeover #723 / uv projects that declare the patched package as a PEP 508 direct URL (six @ https://…/git+…): vendored writes a lockuv sync --lockedrejects while vex attests, and hosted overrides the user's URL then refuses to roll it back #767, uv projects never pick up a superseding patch: hosted re-scan lists the upgrade in updates[] but refuses its own earlier [tool.uv.sources] pin (exit 0, still on the old uuid), and vendored re-scan fails pypi_uv_source_already_exists #742 (closed by Fix vendored uv/Hatch re-vendor to a newer patch (#742, #650) #943) / uv vendored → hosted takeover strands a package that vendored mode pinned to a different version than uv.lock: the wet run reverts to the unpatched release (exit 1), while --dry-run previews a clean takeover #723 (closed by Fix PyPI hosted takeover un-vendoring before refusal (#723, #945) #946, verified run 30), Hosted uv scan wires adynamic = ["dependencies"]project, but rollback, remove and the vendored takeover then always refuse ("pyproject.toml no longer declares six") #639, and the #612 / #638 uv shapes. Closed by maintainer PRs: #964 (#965), #979 (#980). Verified fixed and closed: #928 and #701 (run 28), #840, #821, #806, #788, #670, #606, #473, #407, #408, #474, #525, #524, #544, #449.#869 neighbours: script lock with six through
[tool.uv] override-dependencies/constraint-dependenciesin the PEP 723 block, CRLF / BOM scripts. (Done in run 20: #840 project lane on 5 versions, H→V after an edit, user constraint edits.) Also a Windows probe of hosted write atomicity (uv.lock held open without delete sharing).Patch-upgrade follow-ups: (grant-token rotation passes, run 16); vendored re-vendor once PR #743's follow-up lands.
(Run 27: interrupted vendored runs done, pass.) #944 neighbours: other uv vendored-only refusals reached after the takeover restore (a transitive package with a user
override-dependencies→pypi_uv_source_already_exists;requirements.txtextrassix[x]==→pypi_extras_unsupported; an out-of-root-rinclude; pylock); these need a hosted mock. (The standalonevendor --dry-runinline-sources mismatch is filed as #979.)--universalrequirements with extras on the split package (still open). Interrupted runs with fault injection (a slow mock route). Hosted with a release that has several sdists.Probe branches can't be deleted from the cloud session (
git push --deletehangs up through the proxy). Twenty-twobughunt/uv/*branches need maintainer cleanup, including20261013-uv013-baseline(run 39),20261009-agent-linkmodes(run 37),20261005-symlink-dryrun,20261005-deleted-script,20261005-script-spec-revert,20261005-spec-edit-revert,20261005-dev-group-driftand20261004-upload-time.(Done in run 15) The maintainer request for
-grollback / vex and the macOS-gre-probe, with the mock instead of a live patch. The unwritable-prefix cell is still open: ubuntu-latest runners exit 1 on apply / get / vex-gwhile the target is patched (likely the root-owned system six); confirm with stderr.(Done in run 30: 5xx is consistent in all 3 modes; the 404 gap is #1062, not ours.) Mock-only observation: when the batch hits but
GET /patch/by-package404s,scan --mode vendored --jsonexits 0successwith emptyvendor.eventswhile the human run exits 1 "could not fetch patch details". It's generic; confirm it with a realistic server failure (a 5xx) before handing it to pip.(Done in run 26, rebuilt run 27) Full vendored mock: a scratch
tests/zz_bughunt_mockserve.rs(#[ignore]test, never committed) that runsprebuilt_common::Server::project_with_env(MOCK_ROOT, VIRTUAL_ENV=MOCK_VENV)until a stop file appears; exportSOCKET_VENDOR_URL, stage.socket/manifest.json+ blob (git-sha256 over six.py + a marker suffix), and usevendor(scan --mode vendoredneeds the patch API too). Verify open fix PRs #965 / #963 / #929 with it.Standalone
vendor --dry-runparity: done for inline sources (#979),pypi_uv_source_already_exists(pass), uv-projectsix[x]==(pass, run 29) and requirementssix[x]==(pip lane: handed to pip, run 29). Still to do: symlinks (#891 covers scripts / pylock), and[tool.uv] override-dependenciesthat is not an array.Known non-bugs
pyproject [tool.uv]oruv.tomlholding onlyconstraint-dependencies,override-dependencies,build-constraint-dependencies,environments,required-environments,dev-dependenciesorconflictsis NOT inherited by a child uv project (0.5.31 / 0.13.1). Shadowing it is harmless, so wiring such a child is correct (run 42).vexon a uv project whose pyproject.toml starts with a BOM refusesproduct_undetected("has no usable name and version"), although uv accepts the file. #1529 made this deliberate; the scan writers drop the BOM, so it only shows up when the BOM is still there (agent mode, or a re-added BOM).--productis the workaround (run 42).uv sync --lockedfailing on uv ≤ 0.5.4 after transitive / constraint wiring, and a plain sync reinstalling the pristine wheel there, are documented uv limits. Only the missing hosted advisory is a bug (#1569) (run 42).[options] exclude-newer: documented restore limits (uv.rs module docs);git checkoutrestores (run 41).vexattestsnot_affectedwhile.venvstill holds unpatched bytes (scan without re-sync). Documented: vendored VEX hashes the committed artifact and warnsvendored_tree_out_of_sync. Hosted refusesnot_appliedin the same state (run 40).listreports the orphan androllbackretires it (run 40).--cwd suborscan sub(run 40).uv.tomlwithno-sources = trueabove a uv project doesn't affect the project'suv lock/uv sync(0.5.31 / 0.12.24 / 0.13.0), so wiring it is correct (run 39).no-sources: the uv.lock is refused (redirect_uv_project_unsupported, exit 0, warning) while apylock.tomlin the same project is wired. pylock ignores[tool.uv.sources], so this is the per-file hosted posture (run 39).six+-c constraints.txt(or a quoted-c "my constraints.txt") holding the only==pin refusespypi_requirement_not_pinned. That's the generic constraint-only-pin refusal, not uv-specific. Quoted and escaped-rpaths with spaces vendor fine (run 39).hosted sources for uv workspaces require a package-scoped source mapping), so #1445 has no workspace lane (run 39).vexneeds--patch-server-url/--api-url/--orgagainst the mock to see hosted pins and fetch records. Without them it reports nothing to attest orrecord_unavailable(harness, run 39).--optional six>=1.16,<2promotion of a transitive six: revert drift-keeps (success, files kept) and remove / rollback exit 1. This is the documented multi-clause rule (run 38).uv lock --upgrade-package <parent>dropped six emitsvendor_pypi_reinstall_requiredthough six is no longer installed. Cosmetic (run 38).uv lock -P six==1.16.0: a transitive six otherwise resolves to 1.17.0, which the mock doesn't patch (harness, run 38).get pkg:pypi/<name>(versionless purl) returnsnot_foundagainst the routine's mock: the CLI forwards the versionless purl to/patches/by-package/, and the mock's matcher requires a version. Mock artifact, not a CLI bug (run 37).backports.tarfilein run 37, which passes with an attrs sibling.sources.sixline from a transitive vendored script and relocks: revert reportsvendor_lock_entry_removedand leaves the socket-written# override-dependencies = ["six==1.16.0"]in the script (uv lock --checkpasses). It's a hand edit of socket-written wiring, so not filed (run 36).*.lockexports only.uv export -o requirements.pip, an extensionlessrequirementsor*.frozenstill lose it; this was noted on #1252, not filed separately (rare names) (run 36).scanon uv.lock + a latin-1 PEP 263requirements.txtstill refusescandidate_file_unreadableafter #1152 / #1218 (CLI_CONTRACT "Non-UTF-8 candidate files") (run 35).uv remove --scripton PR #1231, the hosted takeover warnsvendor_ledger_entry_unwired(check 1), but itsscan --pruneremedy works. That's a warning, not a loop (run 35).remove/rollbackthat keeps the entry because a rootpylock.prod.toml/ requirements export still references it exits 1 with drift wording (vendor_revert_kept). That's #1184's mislabel (Pipenv-filed, generic PyPI), not a uv-specific bug (run 34).uv export -o req/prod.in(a.infile) isn't probed by the residual keep..infiles are pip-tools inputs, not install targets, so this is not filed (run 34).repairwith.socket/vendor/state.jsondeleted refusesvendor_ledger_missing(repair doesn't rebuild the ledger from locks; documented in its message). A deleted wheel alone is repaired (run 33).uv add six==1.17.0over a vendored[tool.uv.sources]path source keeps installing the vendored 1.16.0. That's uv behaviour (run 33).vex --jsonwithout--outputexits 2json_requires_output(documented usage).pylock.tomlre-exported from the vendored lock:pypi_multiple_lockfilesstill says pylock installs are "UNPATCHED", although the pylock points at the vendored wheel. Cosmetic; check / vex are right (run 32).markup_safe/Markup.Safeare not PEP 503 spellings ofmarkupsafe; a purl with an unknown qualifier (?foo=bar) does not match inremove(PurlKey::qualified, by design) (run 32).scan --mode hostedon a uv project with a UTF-16requirements.txtbeside uv.lock exits 1candidate_file_unreadablewith nothing written. That's #724's documented refusal (CLI_CONTRACT "Non-UTF-8 candidate files") (run 31).iconv -t utf-16on glibc writes UTF-16 LE with a BOM (FF FE), not BE. Useutf-16bewith an explicitFE FFprefix for BE (run 31)..socket/vendor/state.jsondeleted):vendor --revertkeeps the wheel withvendor_orphan_still_wired,rollbackexits 1,repairexits 1vendor_ledger_missing, and a barevendorisnoManifest. All fail closed (run 29).remove pkg:pypi/markup_safe@…doesn't matchmarkupsafe: that's a different PEP 503 name. Hostedremove pkg:pypi/MarkupSafe@2.1.5exits 1 because hosted never pins a platform wheel (#701).[tool.uv.workspace]or[manifest] membersbeyond the root) are refused in both modes (redirect_uv_project_unsupported/pypi_uv_workspace_unsupported). This is by design, though it's missing from docs/testing/uv-compatibility.md.pypi_pyproject_only, hosted exit 0 with nothing written). A hatchling member is NOT a non-bug: it's #1138 (run 32).045d7ecit takes over in place (redirect_takeover_reverted_vendored) and unwinds byte-identically (run 11).six>=1.10,<1.17) unless another lock entry shows uv's clause spelling. This is in theupstream/uv.rsmodule doc, not the user docs. It's justified: uv 0.2.37 keeps clause order and ≥0.5 sorts them.[[distribution]]locks,exclude-newer/no-binary/no-build, and non-PyPI registries (documented).--patch-server-urlfor a non-Socket origin reports "Manifest not found" (the origin isn't recognised as hosted). This is a harness artifact.vendor_fetch_failed/ "error sending request" for pypi.org / files.pythonhosted.org in the sandbox is a rustls vs proxy-CA artifact. Use a local forwarder viaSOCKET_PYPI_JSON_API.redirect_pypi_stale_installtext mentions Poetry on uv projects (cosmetic, v4 observation).scan -g --mode hosted(and--global-prefix/SOCKET_GLOBAL=1with hosted) exits 2 by design. A global scan with no mode is report-only.[[tool.uv.index]](for example a PyTorch index next to PyPI → "several registries"; only one sibling, on that index → "not PyPI"), even though the patched package came from PyPI. CLI_CONTRACT documents this ("other registry packages name … several, or one other than PyPI's simple index"). Hosted scan of a package that carries its own{ index = … }source is warn-onlyredirect_uv_project_unsupported("already declares a source"). Both are documented. The first is a candidate for a maintainer to narrow.repair→download_failedagainst the local mock is a harness gap (no diff archive served).Six===1.16.0restoressix==1.16.0, and a comment after a hash continuation is joined onto the last hash line. v5 upstream restore re-derives the pin, so the install is identical. uv never writes either spelling (cosmetic).--vexexits 1no_applicable_patcheswhile the venv is still stale (documented "installed evidence wins").uv remove --scriptof its only sibling refuses "no sibling registry package…" (documented; same as the project case).integrity.sha512→vendor_prebuilt_integrity_mismatch(the service sends SRIsha512-<b64>); a non-deterministic mock wheel → hash mismatch after a mock restart; a JSON forwarder that rewrites file URLs → rollback writes those URLs into the lock.redirect_uv_project_unsupported("marker-specific source mappings are required"), vendored ispypi_uv_lock_forked_package(exit 1). Documented in uv-compatibility.md:135.archive-v0entries containing patched bytes after hosted runs are the hosted wheels uv unpacked, not agent-mode pollution (agent apply breaks the hardlinks).[tool.uv] sources = { … }or[tool] uv = { … }) withpypi_uv_lock_parse_failed: … is not a standard table, before writing anything. Hosted mode grows the inline table in place. This is intentional (unit-tested in pypi_uv.rs) but undocumented. The PEP 723 script lane accepts the same inline table. The dry run doesn't preview the project refusal: that's #979, a bug.requirements.txtitself. A pin that lives only in a-c constraints.txtor-r base.txtinclude gets the warningredirect_requirements_entry_not_found(not silent). This is pip-generic, so don't file it under uv.[tool.uv.sources]entry (for example{ index = "…" }) withpypi_uv_source_already_exists(exit 1, nothing written). This is intentional but undocumented in uv-compatibility.md.uv run --scripton uv ≤0.8.17 keeps the cached patched env. This is uv-side (0.12.22 reinstalls upstream), the same as the 0.8.18 boundary foruv sync.[tool.uv.sources]header (no entries) is removed with the rollback. Both are cosmetic: uv sees the same configuration anduv lock --checkpasses. Not filed.vendor_prebuilt_required"tarball artifact has no sha512 integrity" is a mock gap. Serve SRI sha512 on/patch/package.dynamic = ["dependencies"]projects up front (pypi_uv_dynamic_dependencies, nothing written). This is intentional but undocumented in uv-compatibility.md. Hosted mode has no such guard (#639).--cwddownward (docs/configuration.md), unlike uv's upward project discovery. This is generic and not uv-specific.redirect_uv_entry_not_foundfor a patched package missing from one of several pylocks (for example a--only-group devexport). This is accurate and informational.uv remove,vendor --revertdrift-keeps (vendor_lock_entry_drifted/vendor_revert_kept, success,removed 0) and.socket/vendorstays, although nothing references it any more. This is documented (CLI_CONTRACT: "the drift-kept artifact and entry stay, every backend alike"), andvexcorrectly refuses. It's a candidate to narrow: composer / maven / nuget drop the artifact once no file references it.--vendor-source buildwas removed, andvendor --offlinewith the default source failsvendor_service_offline_conflict. The harness must mockPOST /patch/package(use--vendor-url/--proxy-url/--patch-server-url).override-dependencies, and a directsix>=1.15or evensix>=1.17gets a path source to the 1.16.0 wheel; uv accepts it). This is intentional (pypi_uv.rsoverride_wiring_matches_fixture_byte_identically) but undocumented, and Pipenv refuses the same case (pypi_pipenv_version_mismatch). It's a candidate to warn on. Its takeover consequence is filed as #723.content_mismatch_overwritten). This is the documented v3.4 default;--strictrefuses.pypi_multiple_lockfiles. This is documented ("uv.lockkeeps its exclusive precedence").UV_NO_SOURCES=1/uv sync --no-sourcesat install time bypasses the sources-based hosted and vendored wiring (0.12.23:--lockedfails and a plain sync relocks to unpatched; 0.8.17 still installs patched). That's the user's explicit opt-out at install time. The config-levelno-sources = trueat scan time is #564.pypi_requirements_already_vendored) is pip-generic. It was handed to the pip routine in run 14; don't re-file it under uv.SOCKET_PYPI_JSON_APImust be<mock>/pypi(the CLI appends/<name>/<version>/json).sub/(lock-only or with a.venv) and a script lock inscripts/are not discovered from the repo root (scannedPackages: 0, exit 0). This is generic, not uv-specific; nested-project discovery is planned (PR #257 follow-ups).pypi_uv_lock_revision_untestedon uv 0.12.x vendored runs: uv writes lock revision 5, and the fixtures only test up to 3. It's an informationalskippedevent that isn't counted insummary.skipped; the fixtures should be bumped.vex -gwith no detectable product exits 2 asking for--product(usage).UV_COMPILE_BYTECODE=1venv is safe: uv writes timestamp-based pycs, so the patched source is recompiled.[project](dependency-groups only; uv 0.12 locks it) is refused cleanly: hosted warnsredirect_uv_project_unsupported("no project table"), vendored failspypi_uv_lock_root_missing, and nothing is written. Undocumented, but honest.scan/rollback/removewrite pyproject.toml and uv.lock one after another with no undo, so a write failure on uv.lock (exit 1, reported) leaves pyproject.toml changed. After a failed rollback, rollback / remove / list failhosted_wiring_contesteduntilscan --mode hostedis re-run, which the error suggests and which heals it. The code acknowledges this (RestoreOutcome::flush_error). It's generic across ecosystems and recoverable; vendored has a commit journal. A candidate to harden; not filed (run 16).pylock.a.b.toml,pylock..tomlandPYLOCK.tomlitself, so whether socket-patch discovers them doesn't matter.no-binary/no-buildrefusal matches any[tool.uv] no-binary*key, includingno-binary-packagefor an unrelated package. This is documented ("options filter files"), but broad..py.lockis not an input: scan reportsscannedPackages: 0in every mode and writes nothing. uv's ephemeral script envs live in its cache (run 17).six===1.16.0in pyproject.toml) with "uv's spelling of … is not derivable" (exit 1,git checkoutremedy). This is a conservative guard inupstream/uv.rs::spec_clauses.idna==3.07,==03.7,==3.7.00) writes the user's spelling into uv.lock'srequires-dist, where uv writes the normalized one (==3.7). uv accepts it (--lockedpasses, anduv lockkeeps it), so it's cosmetic.removematches only canonical PyPI purls (Typing_Extensions,typing.extensionsand qualifiers →not_found). This is generic, so it was handed over to pip (run 17). An uppercase UUID is covered by #705.override-dependenciesthat is relocked after vendoring (uv add --script,uv lock --script --upgrade-package):vendor --revertdrift-keeps both the script and the.py.lock, souv lock --script --lockedstill passes. That's the documented pair rule (run 18); the non-semantic match itself is #806's.six==1.16.0; python_version >= "3.9") half-reverts on main. That's the #806 / #821 pair-gate gap; PR #822 keeps both files. On 0.8.17 / 0.12.23 the same edit reverts cleanly (run 19).[tool.uv] override-dependencies(any spec, e.g.six>=1.16) withpypi_uv_source_already_exists("refusing to stack a vendor override on a user override", exit 1, nothing written). Intentional (pypi_uv.rs:386) but undocumented in uv-compatibility.md (run 20).Some("six")in its reason (RustDebugtext). Cosmetic (run 20).six==1.16.0→six>=1.16/ baresixon a transitive six drift-keeps both files (vendor_lock_entry_drifted,--lockedok) instead of re-deriving. Safe and documented as drift (run 20).# /// scriptblock and locks no dependencies (requires-pythonfalls back to the interpreter), so socket-patch has nothing to wire. This is uv-side (run 21).uv adddrops it too), and Python'stomllibrejects a BOM'd pyproject anyway. Not filed (run 22).not_applied, exit 1) even afteruv run --scriptprints patched bytes: verification checks the interpreter's site-packages, not uv's ephemeral script env.--no-verifyattests. This is conservative (documented "installed evidence wins"), not over-attestation (run 22).pylock.toml/pylock.<name>.tomlwires only uv.lock and warnspypi_multiple_lockfilesinvendor.events(documented). A plainvendorre-run doesn't repeat the warning (run 22).pylock.tomlwith twosix@1.16.0entries under different markers (same wheel) is refused: hosted is warn-onlyredirect_uv_lock_unsupported, vendored failspypi_lock_unsupported("source selection is ambiguous"). This is documented, and uv never writes that shape (it merges the markers into one entry) (run 23).==1.16.0for <3.12,==1.17.0for >=3.12) is refused in both modes with nothing written (documented marker-fork refusal, run 23).lock_held("another socket-patch process is operating in this directory"), and the pair stays consistent. By design (run 27).vexwith uv.lock wired but a stale.venv(nouv syncyet) attests from the committed artifact and warns that the installed tree is out of sync. Documented in CLI_CONTRACT "Verification basis" (run 27)..gitignorecheck for the committed wheel (only vlt hasvendor_artifact_gitignored). This is cross-ecosystem, and uv's ownuv init.gitignoredoesn't match.socket/vendor/pypi/…whl. Not filed (run 27).[tool.uv.workspace]with no members beyond the root (members = [], or every member excluded) is refused in both modes, although uv.lock is byte-identical to a plain project's lock.pypi_uv.rschecks the pyproject table's presence on purpose (fail closed, nothing written, honest message). Conservative; not filed (run 28).cp311-none-any) as portable. CLI_CONTRACT defines it that way ("any tag triple other than<py>-none-any"), and no real grant of that shape is known.get --mode hostedexits 0 when its only patch is withheld (documented: "exit 0, like every hosted refusal") (run 28).ps -eo pid,args, notpkill -f, which matches the calling shell). A stale mock serves the previous patch set silently (run 28).no sibling registry package shows the registry(documented in CLI_CONTRACT's restore refusals). Test takeovers with a sibling such asattrs(run 30).--patch-server-urlorigin. Serving patch generations from two mock ports makes the hosted pin invisible (a falsepypi_uv_source_already_exists). Use one port and switch patches with a flag file (mock7.py) (run 30).UV_LINK_MODE=symlink, deleting the uv cache breaks the venv (its files are symlinks into the cache). That's uv behaviour, not ours (run 30).cp311-none-any), as of #1053; the run-28 note above about it being treated as portable is superseded.All reactions