chore(deps): Go module updates — x/text advisory GO-2026-5970, sqlite 1.55.0 (+libc lockstep), client_golang 1.24.1, yaml 2.4.4, goose 3.27.3 [schedule: Daily agent update check] #250
Labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
Cloonar/coding-lab#250
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Goal
Bring the five stale Go module pins in
go.modup to current. One of them closes a security advisory that our pinned version is inside; the rest are routine. All five are low-risk — none of the reviewed changelog entries touches an API this repo calls — but one of them (modernc.org/sqlite) has a hard lockstep requirement that will silently break the build if missed.Everything below was checked against the upstream changelogs on 2026-07-31; the "does it break us" verdicts are stated per module with the reasoning, so you can re-check rather than take them on faith.
Evidence — what is behind
go.modgolang.org/x/text(indirect)v0.38.0v0.40.0modernc.org/sqlitev1.53.0v1.55.0modernc.org/libc(indirect)v1.73.4v1.74.1github.com/prometheus/client_golangv1.23.2v1.24.1go.yaml.in/yaml/v2v2.4.2v2.4.4github.com/pressly/goose/v3v3.27.2v3.27.3Already current, do not touch:
github.com/jackc/pgx/v5 v5.10.0,github.com/SherClockHolmes/webpush-go v1.4.0,github.com/prometheus/client_model v0.6.2,golang.org/x/crypto v0.52.0,golang.org/x/sys v0.47.0,golang.org/x/term v0.45.0.Security
One advisory reaches a version we pin:
GO-2026-5970.We pin
golang.org/x/text v0.38.0(go.mod, indirect block) — inside the affected range. Reachability was not verified (this investigation ran in an environment with no Go toolchain, so nogovulncheck).x/textarrives only transitively; nothing underinternal/orcmd/imports it directly. So this may well be unreachable in practice — but the fix is a one-line pin move, so bump it and letgovulnchecksay so definitively.Deliberately not a reason to bump — stated so nobody re-derives it:
golang.org/x/cryptolooks alarming in the vulnerability database (14 advisories in 2026 alone:GO-2026-5005,5006,5013–5021,5023,5033). Every one of them is fixed inv0.52.0, which is exactly what we already pin, and every one is ingolang.org/x/crypto/ssh*— this repo imports onlygolang.org/x/crypto/argon2(internal/httpapi/password.go:11). The one still-open advisory,GO-2026-5932, is the unmaintainedx/crypto/openpgppackage, which we do not import.x/cryptoneeds no bump. Same story forgolang.org/x/sys(GO-2026-5024fixed inv0.44.0, we are onv0.47.0) andpgx/v5(GO-2026-5004fixed in5.9.2,GO-2026-4771/4772fixed in5.9.0, we are onv5.10.0).What changed, per module, and whether it breaks us
modernc.org/sqlitev1.53.0 → v1.55.0 — read this one carefullyHard requirement, stated by upstream in its own changelog: "downstream modules must pin the exact same
modernc.org/libcversion this module'sgo.modpins."sqlite v1.55.0pinsmodernc.org/libc v1.74.1(verified fromhttps://proxy.golang.org/modernc.org/sqlite/@v/v1.55.0.mod). We currently carrymodernc.org/libc v1.73.4. Both lines must move together. Do not independently bumplibctov1.74.4(its own latest) — match whatsqlite v1.55.0pins.go mod tidyshould do the right thing; verify the resultinggo.modline readsmodernc.org/libc v1.74.1._texttotimeDSN parameter; without it, behavior is byte-for-byte unchanged.mattn/go-sqlite3-compatible shorthand DSN keys (_busy_timeout,_fk,_journal_mode,_synchronous,_auto_vacuum,_query_only). Upstream flags this as a real behavior change: those keys were previously ignored, and now they take effect, and an unrecognized value now fails the connection.internal/store/store.go:83-86: We use the_pragma=name(value)form and_txlock, not the mattn shorthand keys, so none of the newly-honored keys appear in our DSN. The second v1.55.0 change ("validate every DSN query parameter before applying any of them") does cover the pre-existing_txlock, butimmediateremains a valid value. Re-readstore.gowhen you do this and confirm the DSN recipe has not drifted from the quote above.masteralready documents a v1.56.0 (2026-07-30, addsNewConnector), but it is not yet on the Go module proxy (https://proxy.golang.org/modernc.org/sqlite/@v/listtops out atv1.55.0as of 2026-07-31). Targetv1.55.0; ifv1.56.0has published by the time you run this, taking it instead is fine — it is additive and its libc pin must be re-checked the same way.github.com/prometheus/client_golangv1.23.2 → v1.24.1go 1.26(go.mod:3) — fine.model.NameValidationScheme = LegacyValidationloses legacy enforcement. We never set it (no match forNameValidationSchemeanywhere underinternal/) — fine.api/prometheus/v1signature changes (Rules,LabelNames) andexp/api/remotereshaping. We import none of those packages — we useprometheus,promhttp, andcollectorsonly (internal/metrics/metrics.go,internal/metrics/lab.go) — fine.WithUnitoption,Desc.Err(). Additive.promhttp: fix panic on requests with a nil URL (#2065). We servepromhttp— a straight robustness win.internal/metrics/metrics_test.go:170asserts the presence oflab_http_requests_total,lab_http_request_duration_seconds, andgo_goroutines. All three survive; if that assertion fails, treat it as a real finding and report it rather than loosening the test.golang.org/x/textv0.38.0 → v0.40.0 — the advisory fix (see Security above). Indirect only.go.yaml.in/yaml/v2v2.4.2 → v2.4.4 — patch releases on the drop-ingopkg.in/yaml.v2replacement. Single call site:internal/seeder/skillsindex.go:8.github.com/pressly/goose/v3v3.27.2 → v3.27.3 — upstream release notes read, in full: "### Changed — Various dependency upgrades". No API surface change. Migration runner +migrations/.Scope
go.mod,go.sum— the six lines above (five direct/indirect targets plus whatevergo mod tidypulls behind them).nix/package.nix:56—vendorHash. This is the trap. Both Go derivations share onegoModulesfetch (nix/package.nix:55), and the hash is hard-coded: Anygo.sumchange invalidates it and the hermetic nix gate (.forgejo/workflows/ci-nix.yml) fails with a fixed-output-derivation hash mismatch. Set it tolib.fakeHash, run the build, and paste thegot:hash from the error. This must land in the same commit as thego.modchange.How to verify
make testandmake lintare the Makefile equivalents of the middle two.Done means
go mod tidyclean,go.sumregenerated.modernc.org/libcis exactly the versionmodernc.org/sqlite v1.55.0pins (v1.74.1), not its own latest.nix/package.nixvendorHashregenerated in the same commit.go build ./...,go test ./...,golangci-lint runall green.govulncheck ./...reports no findings — in particular noGO-2026-5970.nix flake checkpasses (proves the vendorHash is right).internal/store/store.gois not edited as part of this.Closes #<this issue>.Out of scope
golang.org/x/crypto,golang.org/x/sys,golang.org/x/term,pgx/v5,webpush-go,client_model— all already current; leave them alone (rationale under Security above).go 1.26) and the nixpkgs flake input. Both current enough;flake.lockwas locked 2026-07-05 anddocs/ops.mdrecords the nixpkgs pin deliberately (it must shipgo_1_26) — moving it is a separate, ops-facing decision.Filed by the Daily agent update check schedule, 2026-07-31. Versions from
proxy.golang.org/<module>/@latest; advisory data fromvuln.go.dev; changelogs from each project's own release notes.Finding:
goose/v3cannot move to v3.27.3 — blocked by the sqlite/libc lockstep. Left at v3.27.2.Evidence (verified against proxy.golang.org during the run):
goose v3.27.3's own go.mod requiresmodernc.org/libc v1.74.3 // indirect(its v3.27.3 release — release notes: "Various dependency upgrades" — bumped its own sqlite to v1.54.0 and libc to v1.74.3).modernc.org/libc v1.74.3(and v1.74.2) are retracted upstream: "freeaddrinfo leaks a locked ___lock entry; deadlocks name resolution, fixed in v1.74.4".modernc.org/sqlite v1.55.0lockstep-pinslibc v1.74.1exactly.So under MVS the six targets are mutually unsatisfiable: taking goose v3.27.3 forces libc to v1.74.3 (retracted, deadlock bug) or — if bumped past the retraction — v1.74.4, which violates the lockstep requirement this issue rightly flags as hard.
go getconfirms:goose/v3@v3.27.3 requires modernc.org/libc@v1.74.3, not modernc.org/libc@v1.74.1.Decision: honor the lockstep (libc v1.74.1, sqlite v1.55.0) and keep goose at v3.27.2. goose v3.27.3 has no code changes, only the dependency bumps that create this very conflict, so nothing is lost. The goose bump unblocks when either (a) sqlite ships a release pinning libc ≥ v1.74.4 (the changelog's unpublished v1.56.0 is a candidate — re-check its libc pin), or (b) a later goose release lands on a lockstep-compatible libc. Suggest the daily schedule will simply pick it up then.
One more scope note:
go getopportunistically movedgolang.org/x/cryptov0.52.0 → v0.54.0 (v0.54.0 is now upstream latest, so the issue's "already current" table entry was stale by a hair). Nothing in the module graph requires > v0.52.0 and the issue says leave it alone, so it was reverted to v0.52.0. All 2026 x/crypto advisories remain fixed at that version; govulncheck is clean either way.Re-verified 2026-08-01 (Daily agent update check). The advisory driver and the sqlite/libc lockstep both stand unchanged — but the "already current, do not touch" list has two errors. Two more pins are stale.
Correction 1 —
golang.org/x/cryptois NOT currentThe body lists
golang.org/x/crypto v0.52.0under "Already current, do not touch". It is not:go.mod:12pinsv0.52.0, so we are two releases behind. The security reasoning in the body is still correct and needs no revision — every advisory listed there is fixed in v0.52.0, and nothing new has landed (see re-check below). Only the "already current" claim is wrong.What is in v0.52.0 → v0.54.0 (from the
golang/cryptocommit log, 2026-06-02 .. 2026-07-23): ~35 commits, of which all but two are underssh/,ssh/agent,ssh/knownhosts,ssh/test,acme/,x509roots/fallback,ocsp/,pkcs12/, oropenpgp/. This repo imports exactly onex/cryptopackage —golang.org/x/crypto/argon2(internal/httpapi/password.go:11). The onlyargon2commit in the window is:That is a doc-comment change only — no exported signature, no default, no behavior.
internal/httpapi/password.go:23-29pins the RFC 9106 second recommended set (time=3, memory=64MiB, threads=4, keyLen=32, saltLen=16) as explicit constants, so the revised example in upstream's docs does not reach us. Do not touchdefaultArgonParams— it is a design §12 decision, not a copy of upstream's example.So: bump
golang.org/x/crypto v0.52.0 → v0.54.0as routine hygiene, expect zero code impact, and leavepassword.goalone.Correction 2 —
golang.org/x/syncis stale and was omitted entirelygo.mod:38pinsgolang.org/x/sync v0.21.0 // indirect; latest is v0.22.0. Not mentioned anywhere in the body. Indirect, low-risk, letgo mod tidycarry it.Re-confirmed, no change needed
GO-2026-5970(x/text, fixed 0.39.0) is still the only advisory reaching any pin we carry. Checked the fullvuln.go.devmodule index for all 13 modules in our graph on 2026-08-01: no new advisory since this issue was filed.x/crypto's newest entries (GO-2026-5005/5006/5013–5021/5023/5033) are allfixed: 0.52.0; the one unfixed entryGO-2026-5932isx/crypto/openpgp, which we do not import.x/sysGO-2026-5024isfixed: 0.44.0(we are on v0.47.0). The body's security section is accurate as written.modernc.org/sqlite v1.56.0is still NOT on the Go module proxy — the body flagged this as a thing to re-check:v1.55.0remains the target. The lockstep requirement is unchanged: it pinsmodernc.org/libc v1.74.1exactly.modernc.org/libc @latestis now v1.74.4 — consistent with the retraction note in the earlier comment (v1.74.2/v1.74.3 retracted). Do not take v1.74.4; take thev1.74.1thatsqlite v1.55.0pins, exactly as the body says.golang.org/x/term v0.45.0andgolang.org/x/sys v0.47.0really are current — those two entries in the "do not touch" list are correct.goose/v3stays at v3.27.2, blocked by the libc lockstep for the reason given in the earlier comment. Unchanged.Updated target table
go.modgolang.org/x/text(indirect)modernc.org/sqlitemodernc.org/libc(indirect)github.com/prometheus/client_golanggo.yaml.in/yaml/v2golang.org/x/cryptogolang.org/x/sync(indirect)github.com/pressly/goose/v3Everything else in the body — the
vendorHashtrap atnix/package.nix:56, the DSN check atinternal/store/store.go:83-86, theclient_golanganalysis, the verification commands, and the done-list — stands as written.