Bug hunt ledger: NuGet / dotnet #320
Replies: 13 comments
|
[agent] 2026-09-30: NuGet / dotnet bug-hunt run This is the first run, so the ledger started empty and there were no Tested: main Setup: there's no Socket API. Agent and vendored cells use a hand-staged Cells
Issues
False positives ruled out
Probe runs
I couldn't delete probe branch Next
|
|
[agent] 2026-09-30 (23:50 UTC): NuGet / dotnet bug-hunt run Tested: main Re-triage: #352, #353 and #354 were not re-run, because main hasn't moved since they were filed (same SHA, same binary). They stay open. Cells
Issues
False positives ruled out
Probe runs
I couldn't delete the probe branches: 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 NuGet / dotnet puts global installs: The global packages folder ( What to check (prove each with a real global install, not by reading source):
Add OS × NuGet / dotnet version cells for |
|
[agent] 2026-10-01 (05:47 UTC): NuGet / dotnet bug-hunt run Tested: main This run focused on the maintainer's global-mode ( Setup: global installs are real ones: Re-triage
Cells (global mode)
Issues
False positives ruled out
Observed, not filed (cross-PM, not NuGet-specific)
Probe runs
Next
|
|
[agent] 2026-10-01 (12:20 UTC): NuGet / dotnet bug-hunt run Tested: main Setup: a non-root user ( Re-triage
Cells
Issues
False positives ruled out
Next
Probe branches still waiting for a maintainer to delete: |
|
[agent] 2026-10-01 (23:45 UTC): NuGet / dotnet bug-hunt run Tested: main Setup: a scratch copy of Re-triage
Cells (Linux, SDK 8.0.131)
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-02 (05:58 UTC): NuGet / dotnet bug-hunt run Tested: main Setup: a scratch copy of Re-triage
Cells
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-02 (11:44 UTC): NuGet / dotnet bug-hunt run Tested: main Setup: a scratch copy of Re-triage
Cells (Linux, SDK 8.0.131)
Issues
False positives ruled out
Blocked
Next
|
|
[agent] 2026-10-03 (UTC): NuGet / dotnet bug-hunt run Tested: main Setup: the Re-triage
Cells (Linux, SDK 8.0.131; hosted + vendored unless noted)
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-03 (11:44 UTC): NuGet / dotnet bug-hunt run Tested: main Setup: the Re-triage
Cells (Linux, SDK 8.0.131)
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 NuGet / dotnet bug-hunt routine (label pm:nuget).
Last run: 2026-10-03 11:44 UTC, main
045d7ec, release v4.0.0.Coverage matrix
Cells: OS × SDK × mode. "warm" means the global packages folder already holds the upstream package; "sln" means the lock sits in
src/<Project>/. "agent custom gpf" meansglobalPackagesFolder/RestorePackagesPathis set.<clear/>, CPM, re-run, revert); user exact-id mapping: config tie #462packages/)repositoryPath)Per-project lock
packages.<Project>.lock.json(vendored + hosted): fail #514 (Linux 8; vendored also on ubuntu/macOS/Windows × SDK 8/10). CustomNuGetLockFilePath(vendored): fail #514 (all 3 OSes × SDK 8/10).Vendored revert on a
core.autocrlf=truecheckout (vendor --revert,remove,rollback, rescan→revert): fail #537 on Linux 8/10, macOS 8 and Windows 8/10 (macOS 10 not inspected). Without autocrlf: pass. Vendored, thendotnet nuget add source(re-serialized config), then revert: pass (Linux 8). Self-closing<packageSourceMapping />and aNewtonsoft.*prefix mapping: pass (Linux 8, vendored + hosted).Mode takeovers (Linux 8): hosted → vendored via
scan --mode vendored: fail #553 (no takeover, purl case mismatch; autocrlf on and off; http and patch.socket.dev URLs). Viavendor: pass.remove/rollbackwith the mixed-case purl on a hosted project: fail #553. Vendored → hosted: no NuGet takeover by design (stays vendored, patched).Hosted with a commented-out
<packageSources>or<packageSourceMapping>block (Linux 8): fail #585 (splice lands inside the comment; v4.0.0 too). Vendored with the same configs: pass.get --mode vendoredover a hosted project: fail #553.CPM with
CentralPackageTransitivePinningEnabled(CentralTransitivelock entry), Linux 8: hosted pass, vendored pass.BOM
packages.lock.json, Linux 8: hosted fail #623 (exit 0, nothing wired), vendored fail #623 (apply_failed). Hosted BOM + CRLFnuget.config: pass.Hosted unwind (
remove,rollback <purl>, hosted →vendortakeover →vendor --revert), Linux 8: fail #624 (lock gets the catalogpackageHash, NU1403 on every restore; sincede316b4). Config side is byte-exact for LF / CRLF / BOM. Vendoredremove/rollbackwith a lowercase purl:not_found(the inverse of #553; commented there).Symlinked
nuget.config/packages.lock.json(Linux 8): hosted pass (refuses); vendored fail, see the #627 comment (link replaced, revert never restores it; v4.0.0 too).Also passed on Linux 8 (2026-10-03): RID lock sections, custom source key +
<clear />, an existingNewtonsoft.*prefix mapping, lowercaseInclude, hosted/vendored re-run idempotency,--dry-run(no writes), space/unicode/&paths, CPMVersionOverride, hostedremove/rollback --offline(loud refusal, nothing written), and concurrent scans (lock_held).Section close tags with whitespace (
</packageSources >,</packageSourceMapping >), Linux 8: vendored fail #685 (duplicate section; NU1100 / NU1403; v4.0.0 too); hosted pass. Long-form<clear></clear>: hosted fail (NU1100 / NU1403), fixed by open PR #597, not filed; vendored pass. Multi-TFM with the id at two versions: hosted silently upgrades the other framework, vendored NU1102 (#593, commented). SIGKILL mid-scan then re-run (hosted + vendored): pass. Vendoredrepairafter a deleted or tampered nupkg: pass.Project-mode agent scan (no
-g) patches unrelated cached packages and VEX attests them: fail #427 (Linux 8; v4.0.0 too).Global mode (
-g)"default" =
~/.nuget/packages, "tool" =dotnet tool install -g(~/.dotnet/tools/.store), "user gpf" =globalPackagesFolderin the user-level NuGet.Config.--tool-path)-grun from inside a vendored project (scan -g --mode agent→rollback -g): Linux 8 fail #489 (vendored: regression from #446,551c362; hosted: pre-existing; still failing on6cd3754). macOS / Windows untested.Also passed on Linux 8:
SOCKET_GLOBAL=1,SOCKET_GLOBAL_PREFIX,--global-prefixwith spaces + unicode, and-gfrom inside a packages.config project (no leak).Backlog
<clear></clear>once PR Unify hosted NuGet routing and XML splice anchors #597 lands, and whether it covers vendored Vendored NuGet doesn't recognise a close tag with whitespace (</packageSources >,</packageSourceMapping >), so it appends a second section that NuGet ignores and every restore fails NU1100 / NU1403 while scan reports success and VEX attests #685.xmlnson<configuration>,</configuration >, attributes on<packageSources>.scan --mode vendoredover a hosted pin skips the takeover (purl case mismatch), keeps the hosted feed wired, writes no vendor ledger and still reports success #553's case sensitivity invexoutput purls andlist.<packageSourceMapping>after a commented one, plus hosted revert after a hand-fixed config.scan -g --mode agentthenrollback -gfrom a vendored NuGet project reverts the project's patched package in the shared global packages folder; the locked restore stays "up-to-date" and VEX keeps attesting #489 / Hosted/vendored NuGet mapping isn't exclusive when nuget.config already maps the exact package id to another source, so restore races the Socket feed against nuget.org (NU1403 with a lock, silently unpatched without one) #462 / Vendored and hosted NuGet leave member-project packages.lock.json unpinned in a solution layout, so every fresh restore fails NU1403 #353 / NuGet nuget.config authored by vendored/hosted mode maps '*' only to nuget.org, cutting off sources inherited from parent or user-level configs (NU1101) #354 / Vendored NuGet doesn't recognise a close tag with whitespace (</packageSources >,</packageSourceMapping >), so it appends a second section that NuGet ignores and every restore fails NU1100 / NU1403 while scan reports success and VEX attests #685 on macOS / Windows and SDK 6/9/10 (probe harness:scratch_serve+SCRATCH_SCRIPT; vendored legs need--vendor-source service; hosted unwind probes must sed the feed URL tohttps://patch.socket.dev). Local SDK installs beyond apt 8.0 are blocked (dotnet-install 403), so this needs a probe branch.dotnet-tools.json) in agent mode;apply -g/remove -g <purl>from a vendored project; apply/rollback/vex-gon macOS / Windows.bughunt/nuget/*branches are still on the remote and need a maintainer. No new probe branches until then.Also passed on Linux 8 (no issue): vendored with a BOM + CRLF
NuGet.Config(+ byte-exact revert), multi-TFM +RestoreLockedMode, a transitive-only patched package,rollback -galone from a v5 vendored project (no manifest → refused, nothing touched), SIGKILL-interrupted scans (re-run converges), and vendoredrepairof a missing or corrupt nupkg.Known non-bugs
remove/rollbacknow unwind manifest-less, see Hosted NuGet remove / rollback / takeover restore packages.lock.json to the nuget.org catalog packageHash, which isn't NuGet's contentHash for signed packages, so every later dotnet restore fails NU1403 #624.) A hosted unwind probe against thehttp://127.0.0.1stand-in givesmanifest_not_found, because lockfile discovery only recogniseshttps://patch.socket.devfeeds. That's a harness artifact; sed the URL first.vendor_nuget_no_lockfile). The missing pin is documented. The false claim that the feed "forces" the patched copy is not; that's Vendored and hosted NuGet patches are shadowed by a warm global packages folder: silently unpatched without a lock, NU1403 with one #352.nuget.config/packages.lock.json(CLI_CONTRACT.md, README VEX table). Root-only scope is documented. Wiring the root config without pinning the member locks is Vendored and hosted NuGet leave member-project packages.lock.json unpinned in a solution layout, so every fresh restore fails NU1403 #353.applydeletes.nupkg.metadata. That's documented, and a later restore rewrites it without reverting the patch.rollbackwith no targets drops every manifest entry and GCs the blobs (README command table), so a laterremove <purl>reportsnot_found. That's documented.scan -g --mode hosted/--global-prefix --mode hostedrefuse with exit 2 by design (CLI_CONTRACT.md).apply -gon a global tool fails loudly (rc 1, not found). The silent part isscan -g(Global scan (-g) never crawls .NET global tools (~/.dotnet/tools/.store), so a patcheddotnet tool install -gpackage is silently left out of scan, apply and vex on every OS #426).NuGet.Configwith CRLF gets LF-terminated inserted lines (mixed endings). NuGet parses it fine, and revert is byte-exact, so it's cosmetic.partialFailure), VEX omits it, and rollback restores it.<packageSourceMapping />appends a second mapping section. NuGet merges them, so it's cosmetic.vex -ois--org; the output flag is-O/--output. Not a bug.*→nuget.org catch-all mapping that vendor created stays innuget.config. That's intentional (revert_config_recorddoc) and harmless.vendor -g/vendor --revert -grewiring the cwd project is the genericvendor -gandvendor --revert -gstill rewire the current project: on vlt,--revert -gsilently unpatches a vendored project (the #446 fix skipped vendor.rs) #498, not NuGet-specific.scan --mode hostedover a vendored NuGet project doesn't take over (takeover_capable= cargo/npm/golang):redirected: 0,already: 1, and it stays vendored and patched. Not a bug. On an autocrlf checkout, a later revert hits Vendored NuGet on a core.autocrlf checkout: vendor --revert / remove / rollback revert packages.lock.json but leave nuget.config wired, so every restore fails NU1403 (vendor --revert exits 0) #537.~/.nuget/packages. NuGet agent mode patches the global packages folder by design, so that's not a bug.packageSourceMappingroutes the id only to a feed holding the patched version. This is a design limitation; unwind first.remove --offlinehint names onlynuget.configthoughpackages.lock.jsonis also rewired. A wording nit, not filed.<packageSourceMapping>key with different case from its<add key>, or a duplicate<packageSources>section: plaindotnet restorefails before socket-patch runs. Invalid fixtures.vexafter a hosted scan on a warm, unpatched store saysnot_applied. That's correct: the installed bytes are pristine (Vendored and hosted NuGet patches are shadowed by a warm global packages folder: silently unpatched without a lock, NU1403 with one #352 shape).<clear />placed after an existing<add>: the vendored/hosted catch-all still maps*to the cleared key. NuGet ignores mappings for undefined sources, so it's cosmetic.nuget.configspelling priority (nuget.config>NuGet.config>NuGet.Config) matches NuGet in both modes.All reactions