Repository navigation
Bug hunt ledger: Go modules #317
Replies: 27 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
|
|
[agent] 2026-10-28 (run 17): Go modules bug-hunt run Tested: main Re-triage
Cells
Issues
False positives ruled out
Next
|
|
[agent] 2026-10-29 (run 18): Go modules bug-hunt run Tested: main Re-triage
New on main#1764 ( Cells (agent mode, go.work shared replace)
IssuesFalse positives ruled out
Probe branchesNone. The stale run-1 branches are still waiting for a maintainer to delete them. Next
|
|
[agent] 2026-10-29 (run 19): Go modules bug-hunt run Tested: main Re-triageMain hasn't moved since run 18, so nothing to re-check. #1810 (fix PR #1812), #1799 (PR #1800) and #549 (PR #1698) are still open. I read #1812's diff: it makes a Cells
IssuesFalse positives ruled out
Probe branchesNone. Next
|
|
[agent] Janitor: ledger drift. #1810 was closed as completed at 2026-10-29 13:31Z by #1812 ( Generated by Claude Code |
|
[agent] 2026-10-29 (run 20): Go modules bug-hunt run Tested: main Re-triage
Cells
IssuesFalse positives ruled out
Probe branchesNone. 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-30 (run 22), main
5ca5623, latest release v5.0.1. Run 22 found that the #1840 shape also breaks hosted mode on go 1.16: the rewriter confirms an inert redirect and prunes go.sum lines the fork needs, so the day-1-mod=readonlybuild fails. #1843 fixes it; commented on #1840. Also commented on #595 (a Go project without go.sum crawls the whole module cache). Run 21 filed #1862, and run 20 filed #1840 (fix PR #1843 open). #549 is still open (fix PR #1698). Earlier: runs 14-19 filed #1766, #1777, #1799, #1810 and #1823, all 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)go getdowngrade (go 1.16 directive)-modfilefixed #1799 (e2e pass run 20)+incompatibleblocked (server contract)<path>pass;<path>+ user replace fixed #393;-modfile(env andgo env -w) pass (run 20)Global (
-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.go_build_list::select); hosted done in run 22 (On a go 1.16 go.mod, Go apply, apply --check and vex trust a stale go.sum zip line left by a downgrade, so they report an inert replace as applied (or refuse a selected version) #1862 pass, Go apply, apply --check and vex still treat a replace-target module as built when the replaced fork is required only by a dependency (go 1.16 module), so the patch is attested while the build stays unpatched #1840 fail, commented). Re-check Go apply, apply --check and vex still treat a replace-target module as built when the replaced fork is required only by a dependency (go 1.16 module), so the patch is attested while the build stays unpatched #1840 agent + hosted once Fix Go replace target missed in go 1.16 graphs (#1840) #1843 merges. Unpruned (go 1.16) graphs elsewhere ingo_build_list: a versioned fork replace at a version MVS raises.-overlayin GOFLAGS, and-modfilein hosted/vendored modes. Still to do from before: ausemember that is the patched module, hosted go.work/go.work.sum rollback, memberexcludevs a transitive raise,ci.work.sumvsgo.work.sumpin reading in hosted/vex.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 (still reproduces onc07af61), 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. (Run 20: the repo's agent/hosted/vendored Go e2e suites pass on 1.21.13 and 1.26.8.)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.usemember: the build is PATCHED through the mirrored root go.mod replace (only a stray go.work write). Covered by Go apply writes the shared replace into ./go.work when GOWORK names another file in the same directory, reports success, and the workspace builds unpatched #1810 and not filed separately.vendor --revertafter an agent → vendored takeover leaves the project unpatched and warns to runapply. That's documented in the warning;applyrestores it.*_needs_go_work_vendor_in_workspacee2e tests fail on go 1.21.x in fixture setup, becausego work vendoronly exists from go 1.22. That's a toolchain limit, not a product bug.requirelines for one module: go refuses them under-mod=readonly("updates to go.mod needed"), so the last-wins parse inparse_required_versionsisn't reachable (run 22).GOMODCACHE. With go 1.16, agent apply/vex then attest cached modules that are absent from the build (Unknownselection). Tracked under Tracking: scope project-mode cache crawls to what the project resolves #595 (comment, run 22), not filed separately: nothing unpatched ships.excludeaftergo mod tidy: go.sum holds only the selected version, so selection is correct (run 22).All reactions