Skip to content

Commit 033cb3f

Browse files
committed
uv: run 19 ledger (#840; #806/#821 verified on #822)
1 parent 6b5458c commit 033cb3f

2 files changed

Lines changed: 45 additions & 4 deletions

File tree

‎entries/uv/20261005T085148Z.md‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
[agent] 2026-10-05: uv bug-hunt run
2+
3+
**Tested:** main `045d7ec` (unchanged; the latest release is still v4.0.0) and PR #822 `77686c4`. uv 0.5.31, 0.8.17 and 0.12.23 (0.12.23 is still the newest on PyPI), using the run-15 mock (recovered from the `20261005-dev-group-drift` probe branch).
4+
5+
## Re-triage
6+
- **#806 and #821:** PR #822 fixes both on Linux × 0.5.31 / 0.8.17 / 0.12.23. Main still fails. I commented with the tables: https://github.com/SocketDev/socket-patch/issues/806#issuecomment-5991011511 and https://github.com/SocketDev/socket-patch/issues/821#issuecomment-5991012409. Both stay open until #822 merges.
7+
- #836 (pm:uv perf issue) isn't a `bughunt` issue from this routine; I left it alone. No human replies on the discussion.
8+
9+
## Cells
10+
| Cell | main | PR #822 |
11+
| --- | --- | --- |
12+
| #806: user `override-dependencies` + `uv add` / `uv lock --upgrade-package` → `vendor --revert` / `remove` / `rollback` | fail | pass (3 versions) |
13+
| #821 neighbours: six in two groups, `include-group`, six in both `dependencies` and `dev`, + `uv add --dev` / `--group` | fail | pass (3 versions) |
14+
| User `constraint-dependencies` edit (`attrs>=21`) + relock → revert (backlog item) | fail (same half revert as #806) | pass |
15+
| V→H takeover after `uv add --dev` | – | pass |
16+
| 0.5.31 marker edit on six (`; python_version >= "3.9"`) | half revert (#806 class) | both files kept, `--locked` ok |
17+
| **User changes six's own specifier** (`uv add "six>=1.16,<1.17"` or a hand edit + `uv lock`), then `vendor --revert` / `remove` / `rollback` | **fail, new #840**: uv.lock is byte-identical after the edit (path sources carry no specifier), and revert writes back the stale `==1.16.0`. Exit 0, `--locked` fails. 3 OS × 0.5.31 / 0.8.17 / 0.12.23 (probe), deps and dev | fail |
18+
| Same edit, V→H takeover (`scan --mode hosted`) | pass (3 OS × 3 versions) | – |
19+
| Hosted scan → `uv add "six>=1.15"` → rollback | pass (re-derives `>=1.15`) | – |
20+
| Hosted scan → `uv add "six>=1.16,<1.17"` → rollback / remove / H→V | refused: multi-clause guard (documented non-bug) | – |
21+
22+
## Issues
23+
- Filed #840: https://github.com/SocketDev/socket-patch/issues/840
24+
- Commented on #806 and #821 (PR #822 verified).
25+
26+
## False positives ruled out
27+
- The marker edit on 0.8.17 / 0.12.23 passes: uv records nothing new, so the restored `==1.16.0` still matches.
28+
- The hosted multi-clause refusal is already under Known non-bugs.
29+
30+
## Probe runs
31+
- https://github.com/SocketDev/socket-patch/actions/runs/37284791550 (`bughunt/uv/20261005-spec-edit-revert`: 3 OS × 0.5.31 / 0.8.17 / 0.12.23; vendored fails in 72/72 cells, hosted takeover passes in 36/36)
32+
- `git push --delete` failed again ("remote end hung up"), so **17** `bughunt/uv/*` branches need maintainer cleanup.
33+
34+
## Next
35+
1. Re-verify #806 / #821 on main once #822 merges, and re-check #840 against it.
36+
2. #840 neighbours: script lock (`uv add --script "six>=…"`), extras (`requires-dist` with `extra`), and transitive override / constraint records (`[manifest]` elements keep their specifier?).
37+
3. Windows probe of hosted write atomicity; hosted with a release that has several sdists.
38+
4. Re-triage #788 (#789), #742 (#743), #670 (#672), #606 / #473 (#625) when they land.

‎state/uv.md‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[agent] Progress ledger for the scheduled uv bug-hunt routine (label pm:uv).
22

3-
Last run: 2026-10-05 (run 18) on main `045d7ec` (new #821: vendored package in a dependency group; after `uv add --dev` / `uv remove --dev`, `vendor --revert` / `remove` / `rollback` / V→H takeover revert pyproject.toml but keep uv.lock's whole-line `requires-dev` fragment, so `uv sync --locked` fails; 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 main `045d7ec` (new #806: vendored transitive override + a user-authored `override-dependencies`; after a relock, `vendor --revert` / `remove` / `rollback` revert pyproject.toml but drift-keep uv.lock's `[manifest] overrides`, so `uv sync --locked` fails; 3 OS × 0.8.17 / 0.12.23. PR #789 verified to fix #788. Agent mode on a project `.venv` passes on 3 OS × 3 link modes; script-lock CRLF / BOM, `uv pip compile` flavours, git / path / url siblings, name normalization and `--dry-run` all pass). Run 16 (new #788: uv 0.6.15–0.6.17 locks spell `upload_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 that `uv sync --locked` rejects 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. `-g` lifecycle 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 fails `pypi_uv_source_already_exists`. #701 extended to the `uv pip compile --universal` requirements 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; vendored `repair` with two packages and a vendored platform wheel pass). Run 11 was on main `045d7ec` (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 main `045d7ec` + draft PR #625 (new #639 `dynamic = ["dependencies"]`; `conflicts`, `required-environments`, `dependency-metadata` pass; PR #625 verified fixing #606 / #473). Run 9 was on main `045d7ec` (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 main `61cfb9b` (unchanged; this run added `no-sources` (#564), root-level dotted sources (#544, verified fixed on PR #545), vendored script dotted sources and `repair` on 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 on `61cfb9b` (the dotted-name, sources-spelling, lock-only and UV_PROJECT_ENVIRONMENT cells). Run 5 was also on main `61cfb9b` (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 from `2463257` / `6e7ef74`. Linux runs use real uv against a local mock patch API (with `integrity.sha512` in SRI form, a deterministic wheel, the `/blob/` route and `--patch-server-url`), plus `SOCKET_PYPI_JSON_API` → a local pypi.org pass-through that must not rewrite file URLs. uv 0.1.x needs `SSL_CERT_FILE`; uv 0.0.5 needs `PUFFIN_INDEX_URL` → a local `/simple/` proxy. macOS and Windows runs use probe branches.
3+
Last run: 2026-10-05 (run 19) on main `045d7ec` (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, so `vendor --revert` / `remove` / `rollback` write the stale pre-vendor `==1.16.0` back and `uv sync --locked` fails 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; after `uv add --dev` / `uv remove --dev`, `vendor --revert` / `remove` / `rollback` / V→H takeover revert pyproject.toml but keep uv.lock's whole-line `requires-dev` fragment, so `uv sync --locked` fails; 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 main `045d7ec` (new #806: vendored transitive override + a user-authored `override-dependencies`; after a relock, `vendor --revert` / `remove` / `rollback` revert pyproject.toml but drift-keep uv.lock's `[manifest] overrides`, so `uv sync --locked` fails; 3 OS × 0.8.17 / 0.12.23. PR #789 verified to fix #788. Agent mode on a project `.venv` passes on 3 OS × 3 link modes; script-lock CRLF / BOM, `uv pip compile` flavours, git / path / url siblings, name normalization and `--dry-run` all pass). Run 16 (new #788: uv 0.6.15–0.6.17 locks spell `upload_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 that `uv sync --locked` rejects 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. `-g` lifecycle 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 fails `pypi_uv_source_already_exists`. #701 extended to the `uv pip compile --universal` requirements 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; vendored `repair` with two packages and a vendored platform wheel pass). Run 11 was on main `045d7ec` (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 main `045d7ec` + draft PR #625 (new #639 `dynamic = ["dependencies"]`; `conflicts`, `required-environments`, `dependency-metadata` pass; PR #625 verified fixing #606 / #473). Run 9 was on main `045d7ec` (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 main `61cfb9b` (unchanged; this run added `no-sources` (#564), root-level dotted sources (#544, verified fixed on PR #545), vendored script dotted sources and `repair` on 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 on `61cfb9b` (the dotted-name, sources-spelling, lock-only and UV_PROJECT_ENVIRONMENT cells). Run 5 was also on main `61cfb9b` (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 from `2463257` / `6e7ef74`. Linux runs use real uv against a local mock patch API (with `integrity.sha512` in SRI form, a deterministic wheel, the `/blob/` route and `--patch-server-url`), plus `SOCKET_PYPI_JSON_API` → a local pypi.org pass-through that must not rewrite file URLs. uv 0.1.x needs `SSL_CERT_FILE`; uv 0.0.5 needs `PUFFIN_INDEX_URL` → a local `/simple/` proxy. macOS and Windows runs use probe branches.
44

55
## Coverage matrix
66
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).
@@ -36,6 +36,8 @@ H = hosted, V = vendored, A = agent. "pass/fail" is Linux unless an OS is named.
3636

3737
| 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 after `uv 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 for `dependencies` / extras / other groups | – | – | V→H takeover on #821's shape: half revert, exit 0 |
3838

39+
| 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) |
40+
3941
### Global (`-g`) mode
4042
| OS | uv | scan -g default tool dir | `UV_TOOL_DIR` / `XDG_DATA_HOME` | `UV_PYTHON_INSTALL_DIR` | hosted refusal | get / rollback / vex -g |
4143
| --- | --- | --- | --- | --- | --- | --- |
@@ -46,11 +48,11 @@ H = hosted, V = vendored, A = agent. "pass/fail" is Linux unless an OS is named.
4648
`SOCKET_GLOBAL=1`, `--global-prefix` / `SOCKET_GLOBAL_PREFIX` with space and unicode paths, and project isolation (`-g` skips `.venv`) all pass on Linux.
4749

4850
## Backlog
49-
0. Re-triage #821 (new), #806, #788 (PR #789 verified in run 17), #767, #742 (hosted half verified on PR #743; vendored slice pending), #670 once PR #672 merges, #606 / #473 once PR #625 merges, and #723 when a fix lands. Also #411, #564, #639 and #701, and the #612 / #638 uv shapes. #407, #408, #474, #525, #524, #544 and #449 (all OS, incl. `UV_PYTHON_INSTALL_DIR`) are verified fixed.
50-
1. #821 neighbours: two groups pinning six identically, a group plus `include-group`, six in both `dependencies` and `dev`. #806 neighbour: vendored `[manifest] constraints` after the user edits `constraint-dependencies`. (Done in run 18: requires-dev after relock → #821; script lock with user override drift-keeps both files.) Also a Windows probe of hosted write atomicity (uv.lock held open without delete sharing). (Done in run 17: lockless PEP 723 script, rev-5 with git / path / url sources, agent mode on 3 OS.)
51+
0. Re-triage #840 (new), #821 and #806 (PR #822 verified in run 19), #788 (PR #789 verified in run 17), #767, #742 (hosted half verified on PR #743; vendored slice pending), #670 once PR #672 merges, #606 / #473 once PR #625 merges, and #723 when a fix lands. Also #411, #564, #639 and #701, and the #612 / #638 uv shapes. #407, #408, #474, #525, #524, #544 and #449 (all OS, incl. `UV_PYTHON_INSTALL_DIR`) are verified fixed.
52+
1. #840 neighbours: script lock `uv add --script "six>=…"`, extras, `[manifest]` override / constraint elements. (Done in run 19: #821 neighbours and the constraint-dependencies edit, all fixed on PR #822.) Older: #821 neighbours: two groups pinning six identically, a group plus `include-group`, six in both `dependencies` and `dev`. #806 neighbour: vendored `[manifest] constraints` after the user edits `constraint-dependencies`. (Done in run 18: requires-dev after relock → #821; script lock with user override drift-keeps both files.) Also a Windows probe of hosted write atomicity (uv.lock held open without delete sharing). (Done in run 17: lockless PEP 723 script, rev-5 with git / path / url sources, agent mode on 3 OS.)
5153
2. Patch-upgrade follow-ups: (grant-token rotation passes, run 16); vendored re-vendor once PR #743's follow-up lands.
5254
3. Interrupted runs with fault injection (a slow mock route), since SIGKILL can't hit the write window against the local mock. Hosted with a release that has several sdists. Vendored multi-package on Windows (CRLF) after #672 lands.
53-
4. **Probe branches can't be deleted from the cloud session** (`git push --delete` hangs up through the proxy). Sixteen `bughunt/uv/*` branches need maintainer cleanup, including `20261005-dev-group-drift`, `20261004-upload-time`, `20261004-agent-venv` and `20261004-override-drift`.
55+
4. **Probe branches can't be deleted from the cloud session** (`git push --delete` hangs up through the proxy). Seventeen `bughunt/uv/*` branches need maintainer cleanup, including `20261005-spec-edit-revert`, `20261005-dev-group-drift`, `20261004-upload-time`, `20261004-agent-venv` and `20261004-override-drift`.
5456
5. (Done in run 15) The maintainer request for `-g` rollback / vex and the macOS `-g` re-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 `-g` while the target is patched (likely the root-owned system six); confirm with stderr.
5557

5658
## Known non-bugs
@@ -106,3 +108,4 @@ H = hosted, V = vendored, A = agent. "pass/fail" is Linux unless an OS is named.
106108
- `remove` matches only canonical PyPI purls (`Typing_Extensions`, `typing.extensions` and qualifiers → `not_found`). This is generic, so it was handed over to pip (run 17). An uppercase UUID is covered by #705.
107109
- A PEP 723 script lock with a user `override-dependencies` that is relocked after vendoring (`uv add --script`, `uv lock --script --upgrade-package`): `vendor --revert` drift-keeps both the script and the `.py.lock`, so `uv lock --script --locked` still passes. That's the documented pair rule (run 18); the non-semantic match itself is #806's.
108110
- A vendored scan of a project whose six is transitive (python-dateutil) with no constraint wires nothing: uv resolves six 1.17.0, which has no patch (harness artifact, run 18).
111+
- Vendored revert on uv 0.5.31 after a marker edit on six (`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).

0 commit comments

Comments
 (0)