The converted standard library moves to Go 1.24.13

go2cs

Full text of the September 24, 2026 announcement, condensed in the go2cs News Archive.


The measure

go2cs now converts Go 1.24.13’s standard library, and the validated roster crossed the hop re-derived, not carried: 218 of the 230 testable standard-library packages validate their own Go 1.24.13 test suites in C# — 56,974 matching verdicts against go test -json, with 283 divergences disclosed by exact failure signature — and, measured against the 224 packages a faithful managed conversion can honestly validate at all, 97.3%. On Linux, 187 of the 216 applicable rows validate at their own Linux counts, at 53,048 matching verdicts. Every validated row is proved by a run at Go 1.24.13, and the roster links each row’s proof page.

What moved

The count rises by fourteen from the Go 1.23.12 record’s 204 while the testable set grows by fifteen, so both percentages dip — 97.6% to 97.3% of the implementable set, 94.9% to 94.8% of the testable one — and every movement has a name.

One package validated at Go 1.23.12 is not validated at Go 1.24.13: net/http. It matches 1,370 of its 1,387 verdicts. All 17 divergences trace to tests that run inside Go 1.24’s new synctest “bubbles” — internal/synctest, the runtime support behind the experimental testing/synctest package — which go2cs does not yet support. net/http still ships as go.net.http.

Go 1.24 moved ten validated packages to new import paths, and none is a loss: their tests validate under the packages that now hold them. Counting those, twenty-five rows join the roster, among them unique, one of the five packages the Go 1.23.12 record left open, and Go 1.24’s new public packages crypto/hkdf, crypto/mlkem, crypto/pbkdf2, crypto/sha3 and weak. Six implementable packages are not yet validated: reflect, runtime, runtime/pprof, net/http/pprof, net/http and Go 1.24’s new internal/synctest.

Linux

On Linux the count falls from 198 to 187, for two named reasons. The relocated packages’ tests are not yet run on Linux at their new paths. And go/internal/srcimporter has no Linux result: Go’s own test of it fails on the Linux reference machine, which leaves nothing to compare against, so it stays validated on Windows. Of the 29 validated packages without a Linux result, 25 joined the roster at this release.

The verdict total doubles, but that is Go’s suites growing rather than a wider claim — crypto/cipher alone matches 27,272 verdicts at Go 1.24.13, against 13 at Go 1.23.12 — so verdict totals do not compare across Go releases, and the package count is the headline.

For converted programs

The converted standard library carries Go 1.24’s APIs — os.Root, weak.Pointer, crypto/mlkem and strings.Lines, among others. //go:embed is honored for the first time: its patterns resolve at conversion time, and its files are embedded behind their string, []byte or embed.FS variable.

go2cs itself now builds with Go 1.24.13, where it built with Go 1.23.12. A -recurse=nuget conversion run with Go 1.24.13 references the 1.24.13 packages, and it needs the module to resolve to Go 1.24: go2cs refuses, before it writes a file, a module that resolves to a different Go release — Go 1.23 included — rather than hand back a project that cannot restore. To stay on Go 1.23, build the converter at the nuget-1.23.12.3 tag with Go 1.23.12 and use the 1.23.12.3 packages.

Go 1.24’s FIPS 140-3 module converts and its tests validate, but go2cs makes no FIPS 140-3 claim. The module’s integrity self-check hashes a binary layout that Go’s linker writes and a .NET assembly does not have, so under GODEBUG=fips140=on the converted check reports success without verifying anything.

Package IDs

Fifty-one package IDs are new, six of them for packages a Go program can import: go.crypto.fips140, go.crypto.hkdf, go.crypto.mlkem, go.crypto.pbkdf2, go.crypto.sha3 and go.weak.

Fourteen IDs end at 1.23.12.3, their last release, because Go 1.24 moved or deleted their packages:

Go 1.23.12 package Package ID At Go 1.24.13
crypto/internal/alias go.crypto.internal.alias crypto/internal/fips140/alias
crypto/internal/bigmod go.crypto.internal.bigmod crypto/internal/fips140/bigmod
crypto/internal/edwards25519 go.crypto.internal.edwards25519 crypto/internal/fips140/edwards25519
crypto/internal/edwards25519/field go.crypto.internal.edwards25519.field crypto/internal/fips140/edwards25519/field
crypto/internal/mlkem768 go.crypto.internal.mlkem768 crypto/internal/fips140/mlkem, behind the public crypto/mlkem
crypto/internal/nistec go.crypto.internal.nistec crypto/internal/fips140/nistec
crypto/internal/nistec/fiat go.crypto.internal.nistec.fiat crypto/internal/fips140/nistec/fiat
internal/concurrent go.internal.concurrent internal/sync
internal/weak go.internal.weak the public weak
runtime/internal/math go.runtime.internal.math internal/runtime/math
runtime/internal/sys go.runtime.internal.sys internal/runtime/sys
vendor/golang.org/x/crypto/hkdf go.vendor.golang.org.x.crypto.hkdf crypto/internal/fips140/hkdf, behind the public crypto/hkdf
vendor/golang.org/x/crypto/sha3 go.vendor.golang.org.x.crypto.sha3 crypto/internal/fips140/sha3, behind the public crypto/sha3
go/internal/typeparams go.go.internal.typeparams deleted, with no successor

Code outside the standard library cannot import any of the fourteen, so a converted project reaches their successors through the new packages’ own dependencies. Each ended ID stays restorable at 1.23.12.3 and is never unlisted.

The release

The converted standard library publishes as NuGet 1.24.13.1 — 344 packages, author-signed, still targeting .NET 10 — with every proof page frozen at validation/1.24.13.1 for the badges the packed READMEs link, and the exact shipped tree browsable at the nuget-1.24.13.1 tag. The Go 1.23.12 record stays frozen as it shipped, at validation/1.23.12.3.