Bug hunt ledger: Go modules #317
Replies: 13 comments
|
[agent] 2026-09-30: Go modules bug-hunt run This is the first run, so the ledger started empty and there were no Tested: main Setup: a hermetic file GOPROXY (plus a Cells
Issues
False positives ruled out
Probe runs
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 Go modules puts global installs: What to check (prove each with a real global install, not by reading source):
Add OS × Go modules version cells for |
|
[agent] 2026-10-01: Go modules bug-hunt run Tested: main Setup: a hermetic file GOPROXY (zips must be built with Re-triage
Cells (maintainer backlog item 0: global
|
|
[agent] 2026-10-01 (run 4): Go modules bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe branchesNone pushed. Next
|
|
[agent] 2026-10-01 (run 5): Go modules bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Probe branchesNone pushed. Next
|
|
[agent] 2026-10-01 (run 6): Go modules bug-hunt run Tested: main New this run: a local mock patch API (Python
The module proxy is served over Re-triage
Cells
Issues
False positives ruled out
Probe branchesNone pushed. Next
|
|
[agent] 2026-10-02 (run 7): Go modules bug-hunt run Tested: main Re-triage
Cells (agent mode unless noted)
Issues
False positives ruled out
Probe branchesNone pushed. The three stale run-1 Next
|
|
[agent] 2026-10-02 (run 8): Go modules bug-hunt run Tested: main Re-triageSkipped this run. Main hasn't moved since runs 6–7, which re-checked #344, #392, #393, #343 and #458 on this same SHA. Cells (agent mode, hermetic file GOPROXY + hand-staged manifest)
Issues
False positives ruled out
Probe branchesNone pushed. Next
|
|
[agent] 2026-10-02 (run 9): Go modules bug-hunt run Tested: main New this run: a reusable vendored mock. A Python Re-triage
Cells
Issues
False positives ruled out
Probe branchesNone pushed. The three stale run-1 branches still need a maintainer to delete them. Next
|
|
[agent] 2026-10-02 (run 10): Go modules bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Notes
Probe branchesNone pushed. The three stale run-1 branches still exist ( Next
|
|
[agent] 2026-10-03 (run 11): Go modules bug-hunt run Tested: main Re-triageSkipped this run. Main hasn't moved since run 10, which re-confirmed #484 and #343, and no Go code has changed since. Nothing new to report on open issues beyond the #618 comment below. Cells
Issues
False positives ruled out
Probe branchesNone pushed. Next
|
|
[agent] 2026-10-03 (run 12): Go modules bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Notes
Probe branchesNone pushed. The three stale run-1 branches still exist and need a maintainer to delete them. 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 Go modules bug-hunt routine (label pm:go).
Last updated: 2026-10-03 (run 12), main
045d7ec(unchanged since run 10; CLI 4.0.0), latest release 4.0.0 (previous 3.3.0). Run 12 filed #682 (a hosted patch update leaves the superseded gopatch go.sum lines behind, so tidy isn't a no-op), passed hosted/v2,+incompatible, pseudo-version and indirect-dep cells on 1.21/1.24/1.26, and re-confirmed #391 and #393 on 1.21.13 and 1.26.8. Run 11 confirmed #618 in hosted mode (1.21/1.22/1.24/1.26), passed #531's shape in hosted mode, and covered global-gon Linux 1.22/1.26. Run 10 filed #618 (a patch that edits the module's own go.mod breaks the default build) and re-confirmed #484 and #343. Run 9: #549 and #531 confirmed in vendored mode; a reusable vendored mock is described in the run-9 entry.Coverage matrix
Cells are "pass", "fail #N" or "untested". Every cell uses a real
go build/go runagainst a hermetic file GOPROXY and a hand-staged.socket/manifest.jsonplus blob (thetests/e2e_golang_build.rsshape). Since run 6, hosted and vendored cells use a local Python mock patch API (hosted:view/<uuid>+/patches/packagewith agoproxyoverride, as ine2e_golang_hosted_build.rs; vendored: a granted tarball withsha512, as invendor/golang.rsmount_go_granted). The module proxy is served over http so hosted rollback works. Global cells use a realgo installas a non-root user plus a local mock patch API. Rows before run 3 were tested onf6b7fb9. Since v5, vendoredvendorneeds the patch service (--vendor-source=service), so new vendored cells need a mock.apply(plain)+incompatible/ no-go.mod module (%2Bkey)vendor(plain)vendor/dirgo env -wsettingsuse .+incompatibleblocked (server contract)<path>pass;<path>+ user replace fail #393Global (
-g/--global-prefix/SOCKET_GLOBAL)scan -greport (+--json)-g --mode hostedrefusalscan -g --mode agent/get -gapplygo installbinaryrollback -gvex -gBacklog
-g) mode on macOS and Windows. Linux 1.22 / 1.24 / 1.25 / 1.26 is done (see the table and Global Go patching (-g) reports success and VEX attests not_affected, but tools already built withgo installkeep running the unpatched code, and nothing tells the user to reinstall them #422). The full checklist is in the 20261001T040000Z entry.bughunt/go/20260930-goenv-vendor,bughunt/go/20260930-windows-applyandbughunt/go/20260930-windows-bisect.git push --deletefrom the sandbox is denied by the permission classifier (runs 6 and 11). Until they're gone, no new probe branches get pushed.scan --mode hosted(crawl-driven, with/patches/batchadded to the mock) with a%2Bpurl, and whether its refresh path hits Hosted Go redirect leaves the superseded gopatch module's go.sum lines behind when a newer patch replaces an existing redirect, sogo mod tidyis no longer a no-op #682. Hosted/v2and+incompatiblepassed in run 12, but the+incompatiblespellingvX-socketpatch.N+incompatibleis still unconfirmed against the service.--global-prefixshapes (GOPATH root, multi-entry GOPATH).GOFLAGS=-mod=vendor,go.work.sumin hosted workspace mode, and a CRLF go.sum in vendored mode.go getupgrades the patched module, although the go-patches replace no longer applies and the build links the unpatched code #391, Agent-mode Go apply writes a go-patches replace for a module version the build graph doesn't select, reports it applied, and on a go 1.16 go.mod apply --check and vex also report it as patched #392, A user replace in go.work silently overrides the Socket go.mod replace: Go apply and vendor report success and VEX attests not_affected while the build links the user's target #393 and Hosted Go redirect's not_in_module_graph gate counts a go.sum/go.mod-only line as "in the graph", so on a go 1.16 module it writes an inert replace for an unselected version and VEX attests not_affected #509 on Linux via the proxy toolchains.HOMEvsUSERPROFILEmismatch (go_crawler.rs::get_gomodcacheprefers HOME, but Go on Windows uses USERPROFILE).GOSUMDB(a mirror or private sumdb) in hosted rollback:gosumdb_basetreats any value other thanoffas sum.golang.org.Known non-bugs
search/issuescan return 403 from the sandbox. Dedupe by fetchingrepos/…/issues?state=all&per_page=100&page=Nand grepping locally.patches-api.socket.devis blocked by the sandbox proxy. Stage.socket/manifest.jsonplus blobs locally.proxy.golang.orgIS reachable from the sandbox.patches-api.socket.devis blocked, but a local mock API works for hosted and vendored cells (see the run-6 entry). In the mock'sview/<uuid>record, give real before/after hashes: hosted vex checks the cached gopatch module against them (hash_mismatchotherwise). Hosted rollback refuses afile://upstream proxy URL, so serve the proxy overhttp://.applyfrom a package subdirectory (no go.mod in cwd) fails closed with "matched no installed package". Use--cwd <module root>.go get M@newer) refuses withpatched_ref_invalidand points atgit checkout -- go.mod: fails closed by design.applyexit 1), so it can't be compared on these cells. 4.0.0vexneeds an explicit--productin these fixtures (there's no git remote).applyrefuses (exit 1) when go.mod has a user-authoredreplace M => …for the patched module: intended. (The same line in go.work is NOT refused, which is A user replace in go.work silently overrides the Socket go.mod replace: Go apply and vendor report success and VEX attests not_affected while the build links the user's target #393.)repairdoesn't rebuild a deleted.socket/go-patches/copy.repair --helpscopes rebuilding to vendored artifacts; re-runapply.go ... -modcacherwleaves cache FILES read-only (directories only), so it's not a workaround for On Windows, Go apply and vendor always fail with "Access is denied. (os error 5)" because the copied module-cache files keep their read-only attribute #346.manifest_not_found): documented ine2e_golang_build.rs.GOFLAGS=-mod=mod(a go restriction); unset GOFLAGS in go.work fixtures.zip -D(directory entries change the h1 hash, sogo mod verifyfails on a pristine cache). As non-root,chmod -R u+wbeforerm -rfof a module cache. A partly deleted cache survives and contaminates the next run.rollback -gneeds the before blob (fetched frompatches-api.socket.dev, which the sandbox blocks). Stage it in.socket/blobs/and use--offline. A loud failure without it is expected.go mod verifyreportsdir has been modifiedafter a global (-g) in-place patch. That's inherent to patching the module cache in place, and rollback restores it.applyexits 1 "matched no installed package" and writes nothing (root-only discovery, fails closed). Run with--cwd <member>instead, which builds PATCHED. Not filed.use ( . ./svc )on one line is a go parse error; put eachuseon its own line or in a multi-line block.rollbackremoves the manifest entry, so a laterremove <purl>reports "No patch found". Expected.GOPROXY=file://with a space in the path breaksgo mod download(fixture issue). Keep proxy and cache paths plain.applyruns are serialized by.socket/apply.lock; the losers fail fast with a--lock-timeouthint. Expected.vendor --offlinefails with "--vendor-source=service needs the network": by design (local artifact building was removed in v5).GOWORK=offwith a root go.work that doesn'tuse .: builds use go.mod only and are PATCHED, so Go apply writes its replace into a root go.mod that go.work doesn'tuse, so the workspace build links the unpatched module while apply, apply --check and VEX all report it patched #458 doesn't apply.apply --checkaudits only the manifest's files in.socket/go-patches/<m>@<v>/. An edited unpatched file, or an added.gofile, passes--checkand gets built. That's by design (docs: commit and review the copy like vendored code). Not filed.applywith a cold module cache exits 1 withpackage_not_installed: correct. Rungo mod downloadfirst.SOCKET_VENDOR_URL=<mock>plusPOST */patch/packagegranted tarball (see the run-9 entry).vexneeds non-emptyvulnerabilitiesin the manifest, otherwise it errors with "No applied patches with vulnerability metadata".rollbackneeds the upstream go.sum hashes. For a module sum.golang.org doesn't know, it exits 1 ("Cannot restore … restore it from version control") unlessGOSUMDB=off/ GONOSUMDB is set: fails closed by design.getwith a userreplacefor the patched module in go.mod (versioned or versionless) writes nothing and warnsredirect_golang_replace_conflict: intended.GOMODCACHE=<dir> GOTOOLCHAIN=go<ver> GOPROXY=https://proxy.golang.org GOSUMDB=sum.golang.org go version, then run<dir>/golang.org/toolchain@v0.0.1-go<ver>.linux-amd64/bin/godirectly against the fixture proxy.go mod tidyis no longer a no-op #682) still restores byte for byte, because it prunes everypatch.socket.dev/gopatch/line. Only the forward rewrite leaves stale lines.All reactions