Repository navigation
Bug hunt ledger: Go modules #317
Replies: 20 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
|
|
[agent] Janitor: drift. The 1.21.13 row still says 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] Janitor: ledger drift on main
Please re-verify them on the next run and update the cells. Generated by Claude Code |
|
[agent] 2026-10-28 (run 16): Go modules bug-hunt run Tested: main Re-triage
Cells
IssuesNone filed or commented on. The one failing cell is already covered by open PR #1763. False positives ruled out
Probe branchesNone pushed. 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-28 (run 16), main
103a664(5.0.1+191), latest release v5.0.1. Main has merged the fixes for #1751, #1753, #1766 and #1777 (all closed); #1766 was re-verified with two members in run 16. Run 16 found that in a go.work, a member that pulls a newer version transitively (through a dependency's go.mod) still makes apply/--check/VEX report an inert replace as patched. Not filed: open PR #1763 covers it, and its head refuses correctly. Re-check when it merges. #549 is still open (PR #1698 pending). Runs 14 and 15 filed #1766 and #1777 (both now fixed). Between runs 12 and 13, fixes closed #343, #344, #346, #391, #392, #393, #422, #458, #484, #509, #531, #618 and #682. Cells marked "fixed #N" haven't been re-verified unless they say "pass (run N)".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 .go work vendor(non-root member)+incompatibleblocked (server contract)<path>pass;<path>+ user replace fixed #393Global (
-g/--global-prefix/SOCKET_GLOBAL)scan -greport (+--json)-g --mode hostedrefusalscan -g --mode agent/get -gapplygo installbinaryrollback -gvex -gBacklog
Mode takeovers (runs 15-16, Linux, go 1.24.7)
get --mode hostedover a go-patches replace)applyexits 1 (refuses the hosted replace). Docs say to roll back first: known non-bugapply)vendoreject)vendor --checkpass,vendor --revertrestores upstream byte for bytevendor/vendorover a go-patches replace)vendor --check, VEX;vendor --revertbyte for byte, thenapplyrestores-g) mode on macOS and Windows. Linux is done (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 is fixed; its warning passed in run 13). 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 was denied by the permission classifier again in run 16. Until they're gone, no new probe branches get pushed.brequiresx,xrequires upstream v1.1.0, memberarequires v1.0.0), go.work roots without go.mod, ausemember that is the patched module, and hosted go.work/go.work.sum rollback.go mod tidydrop the replace but not restore the module's go.sum lines, so the next defaultgo buildfails with "missing go.sum entry" while rollback exits 0 with no warning #549 once Fix Go patch delivery, audits, and reinstalls #1698 merges, and hosted pins after tidy once Keep Go hosted pins after go mod tidy drops the zip line #1748 merges.scan --mode hostedwith/patches/batchin the mock and a%2Bpurl. Vendored mode on 1.21.13 and 1.26.8.go env -ware ignored: GOPRIVATE modules are requested from proxy.golang.org, a GOPROXY mirror is bypassed, and a GOMODCACHE cache is not found #344/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/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/Running Go apply in a second go.work member writes a second replace for the same module@version, so every workspace build fails with "conflicting replacements" while apply, apply --check and VEX all report success #531 fixes on 1.21 and 1.26, and of Vendored Go undo (vendor --revert, rollback, remove) stays silent about a stale vendor/modules.txt, so every build fails with "inconsistent vendoring" #1777 on 1.26.go.work.sumin hosted workspace mode; a CRLF go.sum in vendored mode.HOMEvsUSERPROFILEmismatch (go_crawler.rs::get_gomodcache).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.GOWORK: go rejects it ("not an absolute path"). socket-patch still resolves the file and refuses on its replace, so it fails closed.usespellings (a,./a/,./b/../a, quoted, absolute) and symlinked members all match correctly for the 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 member check (run 14).go installkeep running the unpatched code, and nothing tells the user to reinstall them #422go_installed_tool_stalecheck dates binaries by mtime: an older-touched rebuilt binary is flagged again (conservative). A tool built later from its ownvendor/isn't built from the patched cache, so it's out of scope for-g.get --mode hostedwithoutrollbackfirst) leaves the agent manifest entry and.socket/go-patches/copy, and laterapplyexits 1 refusing the hosted replace. migrating-to-v5.md says to runrollbackbefore moving to hosted. Not filed.rollbackof that mixed state removes the agent record, then fails the hosted restore (exit 1, "restore it from version control"). It fails closed.getreturnsnotFound.GOPRIVATE,GONOPROXY,GOPROXY=offorGOPROXY=directexits 1, writes nothing and points atSOCKET_GOPROXY/ version control. That's fail-closed by design (run 16).GOPRIVATE+SOCKET_GOPROXYrestores byte for byte.rollback,.socket/blobsis gone too. To re-apply in a fixture, re-stage the blob as well as the manifest.vendor --revertafter an agent → vendored takeover leaves the project unpatched and warns to runapply. That's documented in the warning;applyrestores it.All reactions