Skip to content

[WASM W3] Complete compatibility acceptance and consolidation - #2582

Closed
cpunion wants to merge 119 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-w3-acceptance-20260913
Closed

cpunion wants to merge 119 commits into
xgo-dev:mainfrom
cpunion:codex/wasm-w3-acceptance-20260913

Conversation

@cpunion

@cpunion cpunion commented Sep 13, 2026 •

Copy link
Copy Markdown
Collaborator

Tracks #2152. Stacked on #2580.

This adds complete host-driven compatibility acceptance for the supported single-worker WebAssembly targets. Tests that require subprocesses, native binary inspection, or host services now have explicit portable contracts; fatal WASM checks run from the host against retained artifacts, including exact panic/repanic traceback locations.

Scope

  • Discover and execute every applicable repository test package on J32-GoJS (wasm32 with the Go-compatible JavaScript host), J32-Emscripten (wasm32 with the Emscripten JavaScript host), J64-Emscripten (wasm64 with Emscripten Memory64), and W32-WASI (wasm32 with WASI Preview 1).
  • Run the complete applicable GOROOT corpus on J32-GoJS (wasm32 with the Go-compatible JavaScript host), plus representative GOROOT sentinels on all four paths.
  • Exercise an asynchronous syscall/js callback in real headless Chrome. Provision the browser explicitly and fail if the executable, artifact, or expected result is missing.
  • Audit source exclusions, xfail/not-applicable classifications, fatal-child results, and complete package/shard accounting. Emit JSON reports and per-package logs; unexpected exclusions, incomplete execution, missing witnesses, and resource-guard failures fail acceptance.
  • Clarify the bilingual proposal in Proposal: complete LLGo WebAssembly profiles and compatibility #2152 and doc/wasm-proposal.md: the Go source layer, Memory ABI, Host ABI, and provider are presented as a list and complete provider tree, with a concise assembly/runtime adaptation boundary. All supported profiles share the Go data model, including J64 (wasm64 with JavaScript).

Review boundary

The original W3 range is 748483792502..cb588686a49b0: 39 commits, 97 files, +4,442/-498, based on the final W2-B head from #2580. The range consists of tests, acceptance tools, CI, fixtures, classifications, and proposal documentation. Compiler/runtime changes visible in the full PR-versus-main diff belong to the stacked dependencies. The latest follow-up, 10b96399b..14a2f5247, changes only two GOROOT configuration/unit-test files (+32/-6): two measured case budgets and classification/platform regression assertions. The preceding acceptance-only follow-up adjusted two other case budgets and GOROOT sharding.

The W3 range introduces no production implementation changes or new t.Skip calls. It cannot itself change generated release size or runtime performance; benchmarks and coverage remain required gates for the complete stack.

The branch also carries the isolated main-branch packaging fix from #2588 as 62d85a811: .github/windows/build-release.ps1 (+3/-1) validates ESP tools after relocation and temporary cleanup. All four Windows MSVC/MinGW × amd64/arm64 release builds and their four artifact tests passed on that commit.

CI and validation

  • The entire CI round on 14a2f5247 finished with 99 passing checks, zero failures, and one normally skipped release-publication job. All 28 WASM acceptance jobs passed, as did native tests, release builds/artifact checks, benchmarks, and coverage. The acceptance checkout was synthetic merge 1d19cd9, combining this head with main 6eaf7eb982. No push interrupted the preceding round; its sole remaining GOROOT timeout was fixed in the follow-up before this complete rerun.
  • issue79186.go performs 51.2 million RWMutex/map operations; prior passing JavaScript-host executions took 55.144 and 55.710 seconds before another run exceeded the default minute. Its narrowly scoped js/wasm allowance is now two minutes, and the final CI run passed in 56.740 seconds. A full-corpus timing audit also identified fixedbugs/issue5162.go: building its 768 generated array-comparison functions previously took 168.753 seconds against the default 180-second build limit. Its existing case-budget mechanism now allows four minutes; the final build passed in 165.231 seconds. The previously handled issue78081.go also passed, running in 146.921 seconds under its six-minute allowance.
  • Both newly adjusted cases remain mandatory passing tests. Regression assertions reject xfail, flaky, and not-applicable classifications on js/wasm, preserve issue79186.go's existing native 90-second allowances, and prevent overrides leaking to WASI. A compiler built from clean 10b96399b passed the unchanged issue79186.go on Node 24 locally in 22.802 seconds. All GOROOT runner unit tests pass; no compiler/runtime implementation, test contents, global limits, or memory guards changed.
  • An earlier round had four e2b-* runner-disconnection failures with no uploaded logs. Nine GOROOT shards reduced the next round's execution times to 32.47–43.47 minutes, down from about 51 minutes at seven shards. Both subsequent rounds completed all WASM jobs without runner loss, but that does not establish a permanent infrastructure fix. Missing results never count as passes; no unverified runner-label workaround was introduced.
  • The full-acceptance workflow now has 28 jobs: real Chrome, four profile sentinels, nine complete GOROOT shards, and fourteen repository-package shards. JavaScript-host paths use three package shards each; W32-WASI (wasm32 with WASI Preview 1) uses five. Actual runner inventory verifies all 2,316 cases across the nine shards, with no duplication or omission. Provider-independent GOROOT semantics run once, while every path executes its applicable repository packages.
  • Complete reports on 14a2f5247 account for 189 applicable packages per LLGo path, 756 package executions, 9,599 passed top-level tests, and 56 explicit host checks, without duplicated or omitted package execution. Package classifications and exclusion reasons are unchanged. The increase of eight top-level executions versus the previous round comes from main reflect: index named function conversions and pointer caches #2565's two named-function cache publication tests passing on all four paths. All nine GOROOT reports account for 2,316 distinct selected cases: 2,178 pass, 17 expected failures, 117 not applicable, three host/resource skips, and one previously registered flaky failure. The only classification transition since the preceding round is issue79186.go from unexpected timeout to pass. Non-passing classifications are reported separately, not counted as passes.
  • Fatal panic/repanic tests reuse the retained test/go artifact rather than requiring unsupported guest pipe/os.exec operations. Six repanic modes pass locally on all four LLGo paths and official Go js/wasm and wasip1/wasm references, with exit status, function identity, and exact source-line assertions.
  • Local go test -cover ./dev/wasmstdlib ./test/goroot ./test/internal/binaryfixture and go test ./test ./test/go pass. dev/wasmstdlib has 100.0% statement coverage and the binary-fixture package has 95.0%. The follow-up additionally passes every GOROOT runner unit test, actionlint, and git diff --check; the full corpus is delegated to CI.
  • Codecov on 14a2f5247 passed with 98.52% patch coverage against a 94.35% target. All prior review threads are resolved, and the incremental review of 14a2f5247 received LGTM with no new findings. CI, review, coverage, and artifact audits are all complete for this head.
  • The WebAssembly artifacts from benchmark run 34827869604 identify the tested head as 14a2f5247. All 52 module/glue size measurements exactly match both the preceding W3 round and the final W2-B artifacts at 748483792502: W3 adds no measured output-size overhead. This is not a claim of zero growth for the whole W1/W2 stack versus main; for example, cprintf grows by 21,658 bytes on J32-Emscripten (wasm32 with Emscripten), 66,566 bytes on J32-GoJS (wasm32 with the Go-compatible JavaScript host), and 4,821 bytes on J64-Emscripten (wasm64 with Emscripten Memory64). Those differences already exist below W3. Single-sample build/startup timings are not sufficient to establish a runtime performance regression or its absence.

Compilation/linking budgets remain bounded. Only test/std/net/rpc and test/std/net/rpc/jsonrpc receive the measured 10-minute W32-WASI (wasm32 with WASI Preview 1) allowance; their guest test-runtime budget stays unchanged. Missing tools and missing test results are errors.

@cpunion

cpunion commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review the intended W3 range 311a615707b9..04f0aac65bb8. Please focus on whether full package discovery can hide source exclusions or skips, whether GOROOT xfail/not-applicable classifications are narrow and auditable, whether fatal child and artifact checks reject false positives, whether all four profile contracts are actually executed without multiplying provider-independent GOROOT work, CI resource bounds, coverage of failure paths, and whether this test-only range can affect release size or runtime behavior.

@codecov

codecov Bot commented Sep 13, 2026 •

Copy link
Copy Markdown

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review summary

Reviewed the substantive non-test changes across the SSA reflect-bridge / storage / GC-root passes, the cl uintptr-escapes & locality passes, internal/build WASM passes, and the reflect / syscall-js / tinygogc runtime, plus the new CI workflows, dev scripts, and C/C++ wrap code. Also reviewed the changed markdown against the code it describes.

This is a large, carefully written PR. The tricky encodings (bijective base-61 bridge IDs, uint64Hex/itoa, GC head-cache complemented indices, wide-pointer storage/atomic round-trips) all trace correctly, and the reviewers rejected several plausible-looking false positives on close inspection.

No blocking correctness, security, or performance issues were found.

  • Security: New workflows (wasm-acceptance.yml, wasm-stdlib.yml) correctly use pull_request (not pull_request_target) with contents: read and no secrets. Downloads are pinned + SHA-256 verified. Shell/mjs scripts quote expansions and use argv-form exec.Command; JS↔WASM boundary copies are bounded and re-acquire memory views after growth. No injection or overread introduced.
  • Performance: Expensive compiler-pass work is memoized/bounded (sync.Once reachability, shape-keyed bridge cache, precomputed caller-tracking). No hot-path regressions.
  • Docs: Documented commands, flags, profile names, and build counts match the implementations. Removed targets (wasip2.json, wasm-unknown.json) confirmed gone and consistent with doc/wasm-proposal.md.

A few low-severity, advisory notes are inline below. None require changes to merge.

Additional findings

  • runtime/internal/lib/syscall/js/func.go:49: [P3] nextFuncID has no wraparound guard: nextFuncID is incremented and used as funcs[id] = fn with no wraparound check or existing-key probe; after 2^32 FuncOf registrations the counter wraps and could silently alias a still-live id later resolved in dispatchCallback. Practically unreachable and matches upstream Go's behavior, but a short comment (or guard) documenting the assumption would help.

Comment thread runtime/internal/lib/reflect/call_bridge_wasm.go
Comment thread ssa/reflect_bridge.go
@fennoai

fennoai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing W3 range 311a615707b9..04f0aac65bb8

  • Lock commits & prepare workspace (32 commits, 96 files, test/tooling only)
  • Review discovery/exclusion accounting, GOROOT xfail classification, fatal-child & artifact checks
  • Review four-profile execution, CI resource bounds, failure-path coverage
  • Confirm test-only range cannot affect release size / runtime
  • Submit PR review

View job run

@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown

LLGo baseline benchmarks

14a2f524749b | workflow run | long-term charts

Program measurements

Platform Workload File size vs base Text size vs base Build vs base Run vs base
Linux cprintf 19992 B +160 B / +0.8% (worse) 387 B 0 B / +0.0% 480.720 ms -36.52 ms / -7.1% (better) 1.243 ms -70.11 us / -5.3% (better)
Linux cprintf-lto 19744 B +160 B / +0.8% (worse) 368 B 0 B / +0.0% 530.285 ms +48.81 ms / +10.1% (worse) 1.261 ms +12.34 us / +1.0% (worse)
Linux fmtprintf 1629224 B +3344 B / +0.2% (worse) 498716 B +754 B / +0.2% (worse) 5.070 s +1.255 s / +32.9% (worse) 4.337 ms +1.367 ms / +46.0% (worse)
Linux fmtprintf-lto 1482200 B +2024 B / +0.1% (worse) 438154 B +333 B / +0.1% (worse) 12.271 s +583.6 ms / +5.0% (worse) 2.841 ms -220.9 us / -7.2% (better)
Linux println 62368 B +144 B / +0.2% (worse) 14880 B -21 B / -0.1% (better) 530.468 ms +45.84 ms / +9.5% (worse) 1.613 ms +116.2 us / +7.8% (worse)
Linux println-lto 54440 B +160 B / +0.3% (worse) 12335 B 0 B / +0.0% 716.653 ms +40.5 ms / +6.0% (worse) 1.647 ms +55.37 us / +3.5% (worse)
macOS cprintf 84480 B 0 B / +0.0% 17261 B +160 B / +0.9% (worse) 1.172 s +626.6 ms / +114.9% (worse) 8.403 ms +5.963 ms / +244.4% (worse)
macOS cprintf-lto 84288 B 0 B / +0.0% 13025 B +160 B / +1.2% (worse) 1.178 s +552.5 ms / +88.3% (worse) 4.294 ms +1.219 ms / +39.7% (worse)
macOS fmtprintf 1473584 B +416 B / +0.02824% (worse) 874528 B +2516 B / +0.3% (worse) 3.733 s +1.082 s / +40.8% (worse) 4.736 ms -141 us / -2.9% (better)
macOS fmtprintf-lto 1175824 B +16400 B / +1.4% (worse) 849772 B +2020 B / +0.2% (worse) 8.214 s +951 ms / +13.1% (worse) 5.940 ms +905.1 us / +18.0% (worse)
macOS println 114672 B 0 B / +0.0% 34978 B +166 B / +0.5% (worse) 1.086 s +247.8 ms / +29.5% (worse) 7.733 ms +3.445 ms / +80.3% (worse)
macOS println-lto 118720 B 0 B / +0.0% 32408 B +160 B / +0.5% (worse) 1.421 s +449.6 ms / +46.3% (worse) 8.986 ms +3.24 ms / +56.4% (worse)
Windows MinGW cprintf 19456 B 0 B / +0.0% 4550 B 0 B / +0.0% 1.103 s +25.41 ms / +2.4% (worse) 3.392 ms +28.1 us / +0.8% (worse)
Windows MinGW cprintf-lto 17920 B 0 B / +0.0% 4486 B 0 B / +0.0% 1.111 s -3.37 ms / -0.3% (better) 3.436 ms +35.8 us / +1.1% (worse)
Windows MinGW fmtprintf 1897984 B +2560 B / +0.1% (worse) 602102 B +992 B / +0.2% (worse) 4.060 s +55.13 ms / +1.4% (worse) 8.101 ms +411.6 us / +5.4% (worse)
Windows MinGW fmtprintf-lto 1939968 B +3072 B / +0.2% (worse) 551062 B +496 B / +0.1% (worse) 9.878 s +21.96 ms / +0.2% (worse) 8.110 ms +216.4 us / +2.7% (worse)
Windows MinGW println 71168 B 0 B / +0.0% 24022 B -32 B / -0.1% (better) 1.100 s +22.46 ms / +2.1% (worse) 6.512 ms +5.7 us / +0.1% (worse)
Windows MinGW println-lto 65536 B 0 B / +0.0% 20678 B 0 B / +0.0% 1.293 s +11.02 ms / +0.9% (worse) 6.427 ms +83.5 us / +1.3% (worse)
Windows MinGW 386 cprintf 42496 B 0 B / +0.0% 5326 B 0 B / +0.0% 1.098 s -4.756 ms / -0.4% (better) 5.045 ms +106.9 us / +2.2% (worse)
Windows MinGW 386 cprintf-lto 20992 B 0 B / +0.0% 5094 B 0 B / +0.0% 1.120 s -15.21 ms / -1.3% (better) 5.114 ms +112.3 us / +2.2% (worse)
Windows MinGW 386 fmtprintf 1863168 B +4608 B / +0.2% (worse) 473294 B +864 B / +0.2% (worse) 4.165 s +52.92 ms / +1.3% (worse) 10.760 ms -563.7 us / -5.0% (better)
Windows MinGW 386 fmtprintf-lto 2169344 B +3584 B / +0.2% (worse) 453178 B +656 B / +0.1% (worse) 9.794 s +91.59 ms / +0.9% (worse) 10.009 ms -175.7 us / -1.7% (better)
Windows MinGW 386 println 91136 B 0 B / +0.0% 20006 B -32 B / -0.2% (better) 1.097 s -3.178 ms / -0.3% (better) 8.677 ms -168.8 us / -1.9% (better)
Windows MinGW 386 println-lto 69632 B 0 B / +0.0% 17954 B 0 B / +0.0% 1.294 s -5.706 ms / -0.4% (better) 8.646 ms -393.2 us / -4.3% (better)
Windows MinGW ARM64 cprintf 18944 B 0 B / +0.0% 4408 B 0 B / +0.0% 1.540 s +9.804 ms / +0.6% (worse) 6.797 ms -917.2 us / -11.9% (better)
Windows MinGW ARM64 cprintf-lto 17920 B 0 B / +0.0% 4340 B 0 B / +0.0% 1.545 s +37.5 ms / +2.5% (worse) 7.362 ms +100 ns / +0.001358% (worse)
Windows MinGW ARM64 fmtprintf 1784320 B +3584 B / +0.2% (worse) 511704 B +1008 B / +0.2% (worse) 4.532 s +136.2 ms / +3.1% (worse) 13.686 ms +200 ns / +0.001461% (worse)
Windows MinGW ARM64 fmtprintf-lto 1862656 B +2560 B / +0.1% (worse) 479308 B +396 B / +0.1% (worse) 10.362 s -310.7 ms / -2.9% (better) 13.449 ms -879.3 us / -6.1% (better)
Windows MinGW ARM64 println 68608 B 0 B / +0.0% 22544 B 0 B / +0.0% 1.564 s +78.59 ms / +5.3% (worse) 12.918 ms +993.8 us / +8.3% (worse)
Windows MinGW ARM64 println-lto 64000 B 0 B / +0.0% 19604 B 0 B / +0.0% 1.688 s -8.768 ms / -0.5% (better) 11.540 ms -653.2 us / -5.4% (better)
Windows MSVC cprintf 120320 B 0 B / +0.0% 65782 B 0 B / +0.0% 729.229 ms +47.28 ms / +6.9% (worse) 2.257 ms +16 us / +0.7% (worse)
Windows MSVC cprintf-lto 119808 B 0 B / +0.0% 65718 B 0 B / +0.0% 803.401 ms +1.616 ms / +0.2% (worse) 2.251 ms -574.9 us / -20.3% (better)
Windows MSVC fmtprintf 1628672 B +2560 B / +0.2% (worse) 697622 B +992 B / +0.1% (worse) 2.778 s -365.8 ms / -11.6% (better) 6.063 ms -1.333 ms / -18.0% (better)
Windows MSVC fmtprintf-lto 1627136 B +2048 B / +0.1% (worse) 653398 B +512 B / +0.1% (worse) 7.047 s -264.1 ms / -3.6% (better) 5.692 ms -351.2 us / -5.8% (better)
Windows MSVC println 193024 B 0 B / +0.0% 119446 B -32 B / -0.02678% (better) 684.143 ms -18.84 ms / -2.7% (better) 4.214 ms -1.007 ms / -19.3% (better)
Windows MSVC println-lto 189952 B 0 B / +0.0% 116614 B 0 B / +0.0% 824.147 ms +11.73 ms / +1.4% (worse) 4.414 ms -650 us / -12.8% (better)
Windows MSVC 386 cprintf 9728 B 0 B / +0.0% 3931 B 0 B / +0.0% 1.054 s +30.03 ms / +2.9% (worse) 6.333 ms +271.2 us / +4.5% (worse)
Windows MSVC 386 cprintf-lto 9216 B 0 B / +0.0% 3853 B 0 B / +0.0% 1.060 s -99.04 ms / -8.5% (better) 5.800 ms -900 ns / -0.01552% (better)
Windows MSVC 386 fmtprintf 1193472 B +2560 B / +0.2% (worse) 456661 B +864 B / +0.2% (worse) 4.209 s +112.8 ms / +2.8% (worse) 13.273 ms +1.161 ms / +9.6% (worse)
Windows MSVC 386 fmtprintf-lto 1234432 B +2560 B / +0.2% (worse) 431993 B +576 B / +0.1% (worse) 9.562 s +111.2 ms / +1.2% (worse) 12.266 ms -3.209 ms / -20.7% (better)
Windows MSVC 386 println 34304 B 0 B / +0.0% 18849 B -16 B / -0.1% (better) 1.232 s +219.5 ms / +21.7% (worse) 14.789 ms +4.378 ms / +42.1% (worse)
Windows MSVC 386 println-lto 32768 B 0 B / +0.0% 17015 B 0 B / +0.0% 1.218 s +4.187 ms / +0.3% (worse) 10.347 ms +175.9 us / +1.7% (worse)
Windows MSVC ARM64 cprintf 11264 B 0 B / +0.0% 3976 B 0 B / +0.0% 2.132 s +45.04 ms / +2.2% (worse) 7.779 ms +1.223 ms / +18.7% (worse)
Windows MSVC ARM64 cprintf-lto 10752 B 0 B / +0.0% 3868 B 0 B / +0.0% 2.160 s +93.96 ms / +4.5% (worse) 7.268 ms +359.2 us / +5.2% (worse)
Windows MSVC ARM64 fmtprintf 1374720 B +3072 B / +0.2% (worse) 512532 B +1008 B / +0.2% (worse) 6.786 s +337.4 ms / +5.2% (worse) 14.661 ms +544.9 us / +3.9% (worse)
Windows MSVC ARM64 fmtprintf-lto 1397760 B +2048 B / +0.1% (worse) 482100 B +384 B / +0.1% (worse) 15.783 s -57.38 ms / -0.4% (better) 14.708 ms -622.7 us / -4.1% (better)
Windows MSVC ARM64 println 41472 B 0 B / +0.0% 21784 B 0 B / +0.0% 2.112 s +90.93 ms / +4.5% (worse) 12.822 ms +405.8 us / +3.3% (worse)
Windows MSVC ARM64 println-lto 39936 B 0 B / +0.0% 19532 B 0 B / +0.0% 2.405 s +72.34 ms / +3.1% (worse) 12.339 ms +185.5 us / +1.5% (worse)
Core language and compiler benchmarks
Platform Benchmark ns/op vs base
Linux BenchmarkLookupPCRandom 15.820 ns/op +1.27 ns/op / +8.7% (worse)
Linux BenchmarkMergeCompilerFlags 207.600 ns/op +0.1 ns/op / +0.04819% (worse)
Linux BenchmarkMergeLinkerFlags 129.600 ns/op -5 ns/op / -3.7% (better)
Linux BenchmarkChannelBuffered 56.420 ns/op +0.39 ns/op / +0.7% (worse)
Linux BenchmarkChannelHandoff 13940 ns/op -4450 ns/op / -24.2% (better)
Linux BenchmarkDefer 53.170 ns/op +1.93 ns/op / +3.8% (worse)
Linux BenchmarkDirectCall 1.167 ns/op -0.402 ns/op / -25.6% (better)
Linux BenchmarkGlobalRead 1.170 ns/op +0.006 ns/op / +0.5% (worse)
Linux BenchmarkGlobalWrite 7.787 ns/op +0.011 ns/op / +0.1% (worse)
Linux BenchmarkGoroutine 21232 ns/op +284 ns/op / +1.4% (worse)
Linux BenchmarkInterfaceCall 5.938 ns/op -0.362 ns/op / -5.7% (better)
Linux BenchmarkRuntimeGetG 2.414 ns/op -0.03 ns/op / -1.2% (better)
macOS BenchmarkLookupPCRandom 11.690 ns/op -0.38 ns/op / -3.1% (better)
macOS BenchmarkMergeCompilerFlags 96.060 ns/op -5.44 ns/op / -5.4% (better)
macOS BenchmarkMergeLinkerFlags 58.570 ns/op -7.92 ns/op / -11.9% (better)
macOS BenchmarkChannelBuffered 22.380 ns/op -11.5 ns/op / -33.9% (better)
macOS BenchmarkChannelHandoff 6489 ns/op -7217 ns/op / -52.7% (better)
macOS BenchmarkDefer 28.360 ns/op -17.31 ns/op / -37.9% (better)
macOS BenchmarkDirectCall 0.943 ns/op -0.2936 ns/op / -23.7% (better)
macOS BenchmarkGlobalRead 1.029 ns/op -0.331 ns/op / -24.3% (better)
macOS BenchmarkGlobalWrite 0.972 ns/op -0.9162 ns/op / -48.5% (better)
macOS BenchmarkGoroutine 27811 ns/op -3023 ns/op / -9.8% (better)
macOS BenchmarkInterfaceCall 3.690 ns/op -1.153 ns/op / -23.8% (better)
macOS BenchmarkRuntimeGetG 1.885 ns/op -0.717 ns/op / -27.6% (better)
Windows MinGW BenchmarkLookupPCRandom 13.170 ns/op +0.02 ns/op / +0.2% (worse)
Windows MinGW BenchmarkMergeCompilerFlags 604.400 ns/op -29.6 ns/op / -4.7% (better)
Windows MinGW BenchmarkMergeLinkerFlags 529.800 ns/op -37.7 ns/op / -6.6% (better)
Windows MinGW BenchmarkChannelBuffered 33.530 ns/op -1.46 ns/op / -4.2% (better)
Windows MinGW BenchmarkChannelHandoff 945.500 ns/op +27.5 ns/op / +3.0% (worse)
Windows MinGW BenchmarkDefer 54.250 ns/op -0.49 ns/op / -0.9% (better)
Windows MinGW BenchmarkDirectCall 1.546 ns/op -0.002 ns/op / -0.1% (better)
Windows MinGW BenchmarkGlobalRead 2.169 ns/op +0.622 ns/op / +40.2% (worse)
Windows MinGW BenchmarkGlobalWrite 2.454 ns/op -0.017 ns/op / -0.7% (better)
Windows MinGW BenchmarkGoroutine 85144 ns/op +2435 ns/op / +2.9% (worse)
Windows MinGW BenchmarkInterfaceCall 8.372 ns/op +0.017 ns/op / +0.2% (worse)
Windows MinGW BenchmarkRuntimeGetG 1.861 ns/op -0.306 ns/op / -14.1% (better)
Windows MinGW 386 BenchmarkLookupPCRandom 26.610 ns/op +0.08 ns/op / +0.3% (worse)
Windows MinGW 386 BenchmarkMergeCompilerFlags 762.700 ns/op +26.2 ns/op / +3.6% (worse)
Windows MinGW 386 BenchmarkMergeLinkerFlags 653.400 ns/op -0.3 ns/op / -0.04589% (better)
Windows MinGW 386 BenchmarkChannelBuffered 40.590 ns/op -1.22 ns/op / -2.9% (better)
Windows MinGW 386 BenchmarkChannelHandoff 1008 ns/op -28 ns/op / -2.7% (better)
Windows MinGW 386 BenchmarkDefer 42.160 ns/op -1.65 ns/op / -3.8% (better)
Windows MinGW 386 BenchmarkDirectCall 1.857 ns/op +0.306 ns/op / +19.7% (worse)
Windows MinGW 386 BenchmarkGlobalRead 1.864 ns/op +0.004 ns/op / +0.2% (worse)
Windows MinGW 386 BenchmarkGlobalWrite 7.782 ns/op +0.006 ns/op / +0.1% (worse)
Windows MinGW 386 BenchmarkGoroutine 85025 ns/op +864 ns/op / +1.0% (worse)
Windows MinGW 386 BenchmarkInterfaceCall 8.160 ns/op -0.256 ns/op / -3.0% (better)
Windows MinGW 386 BenchmarkRuntimeGetG 1.926 ns/op -0.245 ns/op / -11.3% (better)
Windows MinGW ARM64 BenchmarkLookupPCRandom 12.090 ns/op +0.06 ns/op / +0.5% (worse)
Windows MinGW ARM64 BenchmarkMergeCompilerFlags 566.900 ns/op +0.6 ns/op / +0.1% (worse)
Windows MinGW ARM64 BenchmarkMergeLinkerFlags 526.200 ns/op +7.2 ns/op / +1.4% (worse)
Windows MinGW ARM64 BenchmarkChannelBuffered 37.960 ns/op -1.74 ns/op / -4.4% (better)
Windows MinGW ARM64 BenchmarkChannelHandoff 1524 ns/op +20 ns/op / +1.3% (worse)
Windows MinGW ARM64 BenchmarkDefer 55.680 ns/op -2.19 ns/op / -3.8% (better)
Windows MinGW ARM64 BenchmarkDirectCall 0.589 ns/op -0.0002 ns/op / -0.03392% (better)
Windows MinGW ARM64 BenchmarkGlobalRead 0.884 ns/op +0.2209 ns/op / +33.3% (worse)
Windows MinGW ARM64 BenchmarkGlobalWrite 0.590 ns/op -0.2943 ns/op / -33.3% (better)
Windows MinGW ARM64 BenchmarkGoroutine 59264 ns/op -1116 ns/op / -1.8% (better)
Windows MinGW ARM64 BenchmarkInterfaceCall 4.154 ns/op -0.155 ns/op / -3.6% (better)
Windows MinGW ARM64 BenchmarkRuntimeGetG 1.769 ns/op -0.029 ns/op / -1.6% (better)
Windows MSVC BenchmarkLookupPCRandom 7.474 ns/op +0.189 ns/op / +2.6% (worse)
Windows MSVC BenchmarkMergeCompilerFlags 777.100 ns/op +81.8 ns/op / +11.8% (worse)
Windows MSVC BenchmarkMergeLinkerFlags 493.700 ns/op -139.2 ns/op / -22.0% (better)
Windows MSVC BenchmarkChannelBuffered 30.990 ns/op +0.37 ns/op / +1.2% (worse)
Windows MSVC BenchmarkChannelHandoff 747.600 ns/op -120.4 ns/op / -13.9% (better)
Windows MSVC BenchmarkDefer 32.870 ns/op +1.12 ns/op / +3.5% (worse)
Windows MSVC BenchmarkDirectCall 0.933 ns/op +0.0174 ns/op / +1.9% (worse)
Windows MSVC BenchmarkGlobalRead 0.948 ns/op -0.0004 ns/op / -0.04219% (better)
Windows MSVC BenchmarkGlobalWrite 4.688 ns/op +0.05 ns/op / +1.1% (worse)
Windows MSVC BenchmarkGoroutine 37355 ns/op -508 ns/op / -1.3% (better)
Windows MSVC BenchmarkInterfaceCall 5.130 ns/op +0.493 ns/op / +10.6% (worse)
Windows MSVC BenchmarkRuntimeGetG 0.971 ns/op +0.0243 ns/op / +2.6% (worse)
Windows MSVC 386 BenchmarkLookupPCRandom 26.660 ns/op +0.03 ns/op / +0.1% (worse)
Windows MSVC 386 BenchmarkMergeCompilerFlags 740.300 ns/op -57.4 ns/op / -7.2% (better)
Windows MSVC 386 BenchmarkMergeLinkerFlags 698.600 ns/op -14.6 ns/op / -2.0% (better)
Windows MSVC 386 BenchmarkChannelBuffered 41.140 ns/op -4.58 ns/op / -10.0% (better)
Windows MSVC 386 BenchmarkChannelHandoff 946.300 ns/op -17 ns/op / -1.8% (better)
Windows MSVC 386 BenchmarkDefer 46.350 ns/op -3.51 ns/op / -7.0% (better)
Windows MSVC 386 BenchmarkDirectCall 1.549 ns/op 0 ns/op / +0.0%
Windows MSVC 386 BenchmarkGlobalRead 1.858 ns/op +0.308 ns/op / +19.9% (worse)
Windows MSVC 386 BenchmarkGlobalWrite 7.772 ns/op -0.022 ns/op / -0.3% (better)
Windows MSVC 386 BenchmarkGoroutine 88036 ns/op -651 ns/op / -0.7% (better)
Windows MSVC 386 BenchmarkInterfaceCall 8.701 ns/op +0.305 ns/op / +3.6% (worse)
Windows MSVC 386 BenchmarkRuntimeGetG 1.929 ns/op +0.002 ns/op / +0.1% (worse)
Windows MSVC ARM64 BenchmarkLookupPCRandom 12.070 ns/op +0.03 ns/op / +0.2% (worse)
Windows MSVC ARM64 BenchmarkMergeCompilerFlags 558 ns/op -5 ns/op / -0.9% (better)
Windows MSVC ARM64 BenchmarkMergeLinkerFlags 533.500 ns/op +3.7 ns/op / +0.7% (worse)
Windows MSVC ARM64 BenchmarkChannelBuffered 39.220 ns/op +0.17 ns/op / +0.4% (worse)
Windows MSVC ARM64 BenchmarkChannelHandoff 2401 ns/op +290 ns/op / +13.7% (worse)
Windows MSVC ARM64 BenchmarkDefer 65.620 ns/op +0.89 ns/op / +1.4% (worse)
Windows MSVC ARM64 BenchmarkDirectCall 0.663 ns/op +0.0737 ns/op / +12.5% (worse)
Windows MSVC ARM64 BenchmarkGlobalRead 0.590 ns/op -0.076 ns/op / -11.4% (better)
Windows MSVC ARM64 BenchmarkGlobalWrite 3.758 ns/op +0.005 ns/op / +0.1% (worse)
Windows MSVC ARM64 BenchmarkGoroutine 54900 ns/op -1286 ns/op / -2.3% (better)
Windows MSVC ARM64 BenchmarkInterfaceCall 4.150 ns/op -0.037 ns/op / -0.9% (better)
Windows MSVC ARM64 BenchmarkRuntimeGetG 1.789 ns/op -0.491 ns/op / -21.5% (better)

Timer runtime benchmarks

Platform Operation and runtime ns/op vs base
Linux AfterFuncZeroDelivery/Go 914.800 ns/op +10.5 ns/op / +1.2% (worse)
Linux AfterFuncZeroDelivery/LLGo 33537 ns/op +540 ns/op / +1.6% (worse)
Linux CreateStop/Go 301.500 ns/op +11 ns/op / +3.8% (worse)
Linux CreateStop/LLGo 1628 ns/op -217 ns/op / -11.8% (better)
Linux RearmStopped/Go 116.700 ns/op +0.4 ns/op / +0.3% (worse)
Linux RearmStopped/LLGo 1118 ns/op -141 ns/op / -11.2% (better)
Linux ResetActive/Go 69 ns/op +0.2 ns/op / +0.3% (worse)
Linux ResetActive/LLGo 920.400 ns/op +208.7 ns/op / +29.3% (worse)
Linux ResetHeap1024/Go 68.130 ns/op +0.9 ns/op / +1.3% (worse)
Linux ResetHeap1024/LLGo 183.800 ns/op -1.4 ns/op / -0.8% (better)
macOS AfterFuncZeroDelivery/Go 377.700 ns/op -101.6 ns/op / -21.2% (better)
macOS AfterFuncZeroDelivery/LLGo 74070 ns/op +10113 ns/op / +15.8% (worse)
macOS CreateStop/Go 142.600 ns/op +7.6 ns/op / +5.6% (worse)
macOS CreateStop/LLGo 433.100 ns/op -19.7 ns/op / -4.4% (better)
macOS RearmStopped/Go 59.380 ns/op +2.36 ns/op / +4.1% (worse)
macOS RearmStopped/LLGo 313.500 ns/op -3.1 ns/op / -1.0% (better)
macOS ResetActive/Go 43.240 ns/op +0.56 ns/op / +1.3% (worse)
macOS ResetActive/LLGo 148.700 ns/op -8 ns/op / -5.1% (better)
macOS ResetHeap1024/Go 40.840 ns/op -1.72 ns/op / -4.0% (better)
macOS ResetHeap1024/LLGo 85.930 ns/op +3.12 ns/op / +3.8% (worse)
Windows MinGW AfterFuncZeroDelivery/Go 574.700 ns/op +9.9 ns/op / +1.8% (worse)
Windows MinGW AfterFuncZeroDelivery/LLGo 163608 ns/op -761 ns/op / -0.5% (better)
Windows MinGW CreateStop/Go 116.700 ns/op +0.7 ns/op / +0.6% (worse)
Windows MinGW CreateStop/LLGo 432.300 ns/op -29.7 ns/op / -6.4% (better)
Windows MinGW RearmStopped/Go 31.100 ns/op -0.28 ns/op / -0.9% (better)
Windows MinGW RearmStopped/LLGo 276.600 ns/op +9.8 ns/op / +3.7% (worse)
Windows MinGW ResetActive/Go 20 ns/op -0.06 ns/op / -0.3% (better)
Windows MinGW ResetActive/LLGo 161.900 ns/op +3.1 ns/op / +2.0% (worse)
Windows MinGW ResetHeap1024/Go 20.360 ns/op -0.05 ns/op / -0.2% (better)
Windows MinGW ResetHeap1024/LLGo 125.700 ns/op -1.7 ns/op / -1.3% (better)
Windows MinGW 386 AfterFuncZeroDelivery/Go 958.100 ns/op +8.2 ns/op / +0.9% (worse)
Windows MinGW 386 AfterFuncZeroDelivery/LLGo 182213 ns/op -2116 ns/op / -1.1% (better)
Windows MinGW 386 CreateStop/Go 190.600 ns/op -0.9 ns/op / -0.5% (better)
Windows MinGW 386 CreateStop/LLGo 1739 ns/op +37 ns/op / +2.2% (worse)
Windows MinGW 386 RearmStopped/Go 63.600 ns/op -0.54 ns/op / -0.8% (better)
Windows MinGW 386 RearmStopped/LLGo 339.600 ns/op -11.1 ns/op / -3.2% (better)
Windows MinGW 386 ResetActive/Go 39.310 ns/op +0.04 ns/op / +0.1% (worse)
Windows MinGW 386 ResetActive/LLGo 1047 ns/op +39 ns/op / +3.9% (worse)
Windows MinGW 386 ResetHeap1024/Go 39.420 ns/op -0.11 ns/op / -0.3% (better)
Windows MinGW 386 ResetHeap1024/LLGo 187.200 ns/op -0.8 ns/op / -0.4% (better)
Windows MinGW ARM64 AfterFuncZeroDelivery/Go 678 ns/op +15.1 ns/op / +2.3% (worse)
Windows MinGW ARM64 AfterFuncZeroDelivery/LLGo 138937 ns/op -6529 ns/op / -4.5% (better)
Windows MinGW ARM64 CreateStop/Go 198.100 ns/op +4.3 ns/op / +2.2% (worse)
Windows MinGW ARM64 CreateStop/LLGo 428 ns/op -0.9 ns/op / -0.2% (better)
Windows MinGW ARM64 RearmStopped/Go 70.560 ns/op 0 ns/op / +0.0%
Windows MinGW ARM64 RearmStopped/LLGo 258.600 ns/op -2.1 ns/op / -0.8% (better)
Windows MinGW ARM64 ResetActive/Go 31.160 ns/op +0.09 ns/op / +0.3% (worse)
Windows MinGW ARM64 ResetActive/LLGo 146.900 ns/op +5.6 ns/op / +4.0% (worse)
Windows MinGW ARM64 ResetHeap1024/Go 31.140 ns/op -0.01 ns/op / -0.0321% (better)
Windows MinGW ARM64 ResetHeap1024/LLGo 128.100 ns/op +0.7 ns/op / +0.5% (worse)
Windows MSVC AfterFuncZeroDelivery/Go 427.400 ns/op +3.5 ns/op / +0.8% (worse)
Windows MSVC AfterFuncZeroDelivery/LLGo 84107 ns/op +3612 ns/op / +4.5% (worse)
Windows MSVC CreateStop/Go 124 ns/op -2.2 ns/op / -1.7% (better)
Windows MSVC CreateStop/LLGo 321.100 ns/op +1.2 ns/op / +0.4% (worse)
Windows MSVC RearmStopped/Go 47.060 ns/op -0.8 ns/op / -1.7% (better)
Windows MSVC RearmStopped/LLGo 200 ns/op +7.5 ns/op / +3.9% (worse)
Windows MSVC ResetActive/Go 21.370 ns/op -0.2 ns/op / -0.9% (better)
Windows MSVC ResetActive/LLGo 386.800 ns/op -94 ns/op / -19.6% (better)
Windows MSVC ResetHeap1024/Go 20.800 ns/op -0.33 ns/op / -1.6% (better)
Windows MSVC ResetHeap1024/LLGo 93.950 ns/op +0.28 ns/op / +0.3% (worse)
Windows MSVC 386 AfterFuncZeroDelivery/Go 953.400 ns/op -14 ns/op / -1.4% (better)
Windows MSVC 386 AfterFuncZeroDelivery/LLGo 188482 ns/op -4240 ns/op / -2.2% (better)
Windows MSVC 386 CreateStop/Go 191.700 ns/op -2.2 ns/op / -1.1% (better)
Windows MSVC 386 CreateStop/LLGo 1956 ns/op +110 ns/op / +6.0% (worse)
Windows MSVC 386 RearmStopped/Go 63.640 ns/op -0.19 ns/op / -0.3% (better)
Windows MSVC 386 RearmStopped/LLGo 335.400 ns/op -4.9 ns/op / -1.4% (better)
Windows MSVC 386 ResetActive/Go 39.230 ns/op +0.09 ns/op / +0.2% (worse)
Windows MSVC 386 ResetActive/LLGo 969.900 ns/op +105.5 ns/op / +12.2% (worse)
Windows MSVC 386 ResetHeap1024/Go 39.480 ns/op +0.02 ns/op / +0.1% (worse)
Windows MSVC 386 ResetHeap1024/LLGo 177.400 ns/op -2.9 ns/op / -1.6% (better)
Windows MSVC ARM64 AfterFuncZeroDelivery/Go 666.600 ns/op +5.2 ns/op / +0.8% (worse)
Windows MSVC ARM64 AfterFuncZeroDelivery/LLGo 142231 ns/op +20400 ns/op / +16.7% (worse)
Windows MSVC ARM64 CreateStop/Go 196.800 ns/op -4.5 ns/op / -2.2% (better)
Windows MSVC ARM64 CreateStop/LLGo 403.500 ns/op +28.2 ns/op / +7.5% (worse)
Windows MSVC ARM64 RearmStopped/Go 70.550 ns/op -0.21 ns/op / -0.3% (better)
Windows MSVC ARM64 RearmStopped/LLGo 274.300 ns/op -1.7 ns/op / -0.6% (better)
Windows MSVC ARM64 ResetActive/Go 31.030 ns/op -0.17 ns/op / -0.5% (better)
Windows MSVC ARM64 ResetActive/LLGo 127.800 ns/op -7.1 ns/op / -5.3% (better)
Windows MSVC ARM64 ResetHeap1024/Go 31.080 ns/op +0.02 ns/op / +0.1% (worse)
Windows MSVC ARM64 ResetHeap1024/LLGo 139.200 ns/op +0.8 ns/op / +0.6% (worse)

Compared with 4564a01aa520 measured in the same runner job.

@github-actions

github-actions Bot commented Sep 13, 2026 •

Copy link
Copy Markdown

LLGo WebAssembly build benchmarks

14a2f524749b | workflow run | long-term charts

WebAssembly output sizes

Profile and compiler Wasm module vs base Generated JS glue vs base
cprintf/j32-emscripten/LLGo 135633 B +21658 B / +19.0% (worse) 70786 B +50 B / +0.1% (worse)
cprintf/j32-goos-js/LLGo 133904 B +66566 B / +98.9% (worse) 69150 B +639 B / +0.9% (worse)
cprintf/j64-emscripten-memory64/LLGo 124275 B +4821 B / +4.0% (worse) 73998 B -35 B / -0.04728% (better)
cprintf/w32-goos-wasip1/LLGo 138059 B +64084 B / +86.6% (worse) 0 B 0 B / 0.0%
cprintf/w32-wasi/LLGo 138268 B +20235 B / +17.1% (worse) 0 B 0 B / 0.0%
fmtprintf/j32-emscripten/LLGo 3195716 B +221541 B / +7.4% (worse) 114540 B +5834 B / +5.4% (worse)
fmtprintf/j32-goos-js/Go 2526852 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/j32-goos-js/LLGo 3188314 B +825227 B / +34.9% (worse) 98239 B -8402 B / -7.9% (better)
fmtprintf/j64-emscripten-memory64/LLGo 2927596 B -236126 B / -7.5% (better) 121334 B +663 B / +0.5% (worse)
fmtprintf/w32-goos-wasip1/Go 2500019 B 0 B / +0.0% 0 B 0 B / 0.0%
fmtprintf/w32-goos-wasip1/LLGo 2953757 B +802783 B / +37.3% (worse) 0 B 0 B / 0.0%
fmtprintf/w32-wasi/LLGo 2818531 B +73681 B / +2.7% (worse) 0 B 0 B / 0.0%
j32-emscripten/LLGo 134887 B +21644 B / +19.1% (worse) 70786 B +50 B / +0.1% (worse)
j32-goos-js/Go 1895533 B 0 B / +0.0% 0 B 0 B / 0.0%
j32-goos-js/LLGo 133372 B +66712 B / +100.1% (worse) 69150 B +639 B / +0.9% (worse)
j64-emscripten-memory64/LLGo 123605 B +4917 B / +4.1% (worse) 73998 B -35 B / -0.04728% (better)
reflectcall/j32-emscripten/LLGo 1580370 B +27808 B / +1.8% (worse) 88948 B +1375 B / +1.6% (worse)
reflectcall/j32-goos-js/Go 2191221 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/j32-goos-js/LLGo 1581809 B +321816 B / +25.5% (worse) 87312 B +2099 B / +2.5% (worse)
reflectcall/j64-emscripten-memory64/LLGo 1464062 B -185554 B / -11.2% (better) 94487 B -35 B / -0.03703% (better)
reflectcall/w32-goos-wasip1/Go 2205707 B 0 B / +0.0% 0 B 0 B / 0.0%
reflectcall/w32-goos-wasip1/LLGo 1635842 B +381005 B / +30.4% (worse) 0 B 0 B / 0.0%
reflectcall/w32-wasi/LLGo 1562853 B +43743 B / +2.9% (worse) 0 B 0 B / 0.0%
w32-goos-wasip1/Go 1909947 B 0 B / +0.0% 0 B 0 B / 0.0%
w32-goos-wasip1/LLGo 137288 B +64371 B / +88.3% (worse) 0 B 0 B / 0.0%
w32-wasi/LLGo 137593 B +20234 B / +17.2% (worse) 0 B 0 B / 0.0%

LLGo WebAssembly build measurements

Profile Build vs base
j32-emscripten 5.945 s +545.4 ms / +10.1% (worse)
j32-goos-js 6.771 s +2.215 s / +48.6% (worse)
j64-emscripten-memory64 5.121 s +161.6 ms / +3.3% (worse)
reflectcall/w32-wasi 29.261 s -9.793 s / -25.1% (better)
w32-goos-wasip1 5.058 s +2.018 s / +66.4% (worse)
w32-wasi 4.490 s +737.5 ms / +19.7% (worse)

Compared with 4564a01aa520 measured in the same runner job.

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 acceptance review — 311a615707b9..04f0aac65bb8

Reviewed the intended 32-commit W3 range (96 files, +4,041/-471). Ran all four review lenses (quality, performance, security, docs). This range is test/tooling/CI/doc only — no production runtime or compiler changes, so it cannot affect release size or runtime behavior. Answers to your specific concerns:

Can full package discovery hide source exclusions or skips? No, by construction. discover/discoverFull walk the source tree rather than trusting go list, so native build tags can't silently drop a package (dev/wasmstdlib/main.go, full.go). sourceSelection hard-errors on any package outside the expected prefix, and every non-run status (source-excluded, unresolved, not-run, other-shard, incomplete) counts as a shard failure rather than a pass (full.go ~L361). Backed by TestFullAuditDoesNotHideSourceSelectionErrors, TestFullAuditClassifiesUnknownSelectionAndWitnessFailures, TestFullDiscoveryIncludesRootAndExcludedSource.

Are GOROOT xfail / not-applicable classifications narrow and auditable? Mostly yes — entries are literal paths with specific, per-entry reasons, and TestRepositoryExpectationsAreSeparated enforces reason prefixes, global-scoping of not-applicable, and cross-file de-duplication. One hardening gap (below).

Do fatal-child and artifact checks reject false positives? Yes. The witness validators (validateFullPanic/FinalizerInvalid/GoexitLifecycle/BuiltinPrint in hostcheck.go) all require an *exec.ExitError with code 1–2 and a witness string, explicitly rejecting exit-0, wrong-line, and reversed-ordering cases (TestFullFatalValidatorsRejectFalsePositives). The shell harness expect_failure similarly requires exit code 2 plus a witness; run_emscripten/run_wasi require both wasm-tools validate and a grep witness.

Are all four profiles executed without multiplying provider-independent GOROOT work? Confirmed. The full recursive GOROOT corpus runs once in the goroot job pinned to PROFILE: J32-GoJS across 4 shards (coverage mode). The four-profile matrix (goroot-smoke) is bounded to two sentinels (^(helloworld\.go|bom\.go)$, ci mode), and packages is a bounded 4×2 matrix. No accidental full-corpus fan-out. TestFullChildCommandProfiles/TestFullProfileCommandsKeepLLGoAndReferenceDistinct assert each profile maps to a distinct, correctly-bounded command (WASI→wasmtime, JS→emscripten-runner).

CI resource bounds: All jobs carry explicit timeout-minutes plus inner -test.timeout/GNU timeout wrappers; matrix totals 17 jobs with no unbounded expansion; concurrency + cancel-in-progress prevents pileups. Reviewed exclusions and extended timeouts are closed, per-package switches guarded by tests (TestFullSourceExclusionsAreProfileSpecific, TestFullCommandTimeoutIsTargeted, TestFullLongTimeoutIsTargeted).

Failure-path coverage: Broad — preparation failures, artifact-write failures, log-write, incremental- and final-report write errors are all tested (TestFullAuditReportsPreparationCommandFailures, TestFullAuditReportsArtifactWriteFailures, TestRunFullHostCheckRecordsFailuresAndWriteErrors).

Security: No pull_request_target; workflows use least-privilege permissions: contents: read; matrix values pass via env: and are referenced as quoted shell vars (no ${{ github.event.* }} injection into run:); harnesses use set -euo pipefail, mktemp -d + trap cleanup, quoted expansions, no eval, 127.0.0.1-bound servers, and a path-traversal guard in test_wasm_browser.mjs. Generated binary fixtures are only parsed (debug/elf|macho|pe|dwarf), never executed.

Findings (all low / hardening — none blocking)

[Body — pre-existing code, not in this diff] matchEntry has no catch-all guard. In test/goroot/runner_test.go, matchEntry returns true when casePattern == "", and matches via path.Match (glob), swallowing pattern errors (return err == nil && ok). Today every xfail.yaml/notapplicable.yaml entry is a literal path, so this is latent — but since this PR is the auditability layer, consider extending TestRepositoryExpectationsAreSeparated to assert every expectation entry has a non-empty case (and directive), and that no case: contains glob metacharacters. That closes the one path by which a future malformed entry could silently reclassify an unbounded set of GOROOT cases.

[Docs, low] dev/wasmstdlib/README.md:42 ("W32-WASI's six Binaryen/Asyncify links") and :13 (reviewed-exclusions prose) hard-code facts tied to the current 6-package W2 slice / exclusion switch; the reference-only test/llgoext exclusion (full.go) isn't listed. Accurate today but will silently drift if the slice/switch changes — worth a note or a test-derived count.

Two additional low-severity inline notes below. Nice work — the accounting discipline here is unusually thorough.

Comment thread dev/wasmstdlib/main.go Outdated
Comment thread dev/wasmstdlib/full.go Outdated
@cpunion

cpunion commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please re-review the updated intended W3 range 311a615..ff6ae46. The two follow-up commits address the prior review findings and the first upstream run: explicit artifact validation, literal/non-empty expectation guards, precedence clarity, audited native-only weak stress classification, an explicit real-page Chrome result protocol with process-group cleanup, and measured adaptive 25-job sharding. Please focus on false-positive resistance, browser timeout/cleanup behavior, shard completeness and resource bounds, coverage of the new failure paths, and confirmation that the range remains test/tooling/CI/documentation only. The previously noted nextFuncID uint32 wrap is unchanged because it matches upstream Go behavior, is practically unreachable, and is outside the W3 test-only boundary.

@fennoai

fennoai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Re-reviewing W3 range 311a615707b9..ff6ae46a6

  • Lock updated commits & prepare workspace (2 follow-up commits, 8 files)
  • Verify prior findings addressed (artifact validation, expectation guards, precedence)
  • Review browser result protocol + process-group cleanup
  • Review adaptive 25-job sharding & resource bounds + new failure-path coverage
  • Submit re-review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 re-review — 311a615707b9..ff6ae46a6 (2 follow-up commits)

Re-reviewed the delta since the prior head (04f0aac..ff6ae46a, 8 files). All three prior findings are addressed with dedicated regression tests, and the new browser/sharding work holds up. This range remains test/tooling/CI/doc only — no runtime/compiler production changes; dev/wasmstdlib is a dev-only tool, not a shipped package — so it cannot affect release size or runtime behavior.

Prior findings — all resolved:

  • Precedence (main.go:200): explicit parentheses added exactly as suggested. ✅
  • Explicit artifact validation (full.go): new validateFullHostArtifact requires a non-empty regular file; the fatal host-checks now gate on hostArtifactReady, and a missing/empty artifact is errors.Join-ed into the package failure rather than silently skipping the child. Covered by TestFullAuditRejectsMissingHostArtifact and TestFullHostArtifactMustBeNonEmptyRegularFile. ✅
  • Literal/non-empty expectation guard (runner_unit_test.go): checkSelector now fails on an empty directive/case and on any glob metacharacter (*?[\) across xfail / flake / host-skip / timeout / not-applicable. This closes the exact catch-all/glob path I flagged as latent. ✅

Focus areas for this round:

  • False-positive resistance: Strengthened. Host-checks can no longer run against a phantom artifact, and the expectation guard prevents a malformed entry from silently reclassifying cases. The witness validators (exit 1–2 + witness string) are unchanged and still reject exit-0/wrong-line/reversed-order.

  • Browser timeout/cleanup: The --dump-dom/--virtual-time-budget scrape is replaced by an explicit /__result beacon that validates status ∈ {success,failure} server-side, raced against process close and a 60s hard timeout, with an in-page 25s fallback and the outer 90s shell run_with_timeout_limit. killBrowser sends SIGKILL to the detached process group (falls back to the direct child / child.kill on win32), and connections are torn down via closeAllConnections?.() before server.close. The dedicated --user-data-dir (.chrome-profile-<pid>) is created inside the mktemp -d work dir that test_wasm_single_worker.sh removes via trap ... EXIT, so no profile leak.

  • Shard completeness & resource bounds: Partition is i % shards == shard with a hard shards<1 || shard<0 || shard>=shards guard; other-shard/not-run/incomplete are never counted as passes. GOROOT goes 4→6 shards (J32-GoJS only — no cross-profile fan-out), and packages use 3 shards for JS providers / 5 for W32-WASI, with the WASI count expressed consistently in both the job name and the SHARDS env. RSS/memory guards (-max-rss-mib 4096 -rss-warn-mib 1024 -min-memory-free-percent 15) and per-job timeout-minutes are retained.

  • New failure-path coverage: The missing-artifact and non-regular/empty-file paths are both tested; the reused-build host-check tests were updated to actually materialize the artifact so they exercise the new gate.

  • Weak-stress classification: test/_stress/runtime/weak/weak_stress_test.go is genuinely //go:build go1.24 && !baremetal && !nogc && !wasm, so the new not-applicable exclusion is accurate, and TestFullSourceExclusionsAreProfileSpecific / TestFullAuditAcceptsReviewedSourceExclusions now assert it.

On the noted nextFuncID uint32 wrap: agreed and out of scope — it matches upstream Go, is practically unreachable, and lives outside this test-only boundary. Not something this PR should touch.

No new findings. The follow-up commits are a clean, well-tested response to the prior review. LGTM.

@cpunion

cpunion commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review the latest follow-up commit 8da9d1d (delta ff6ae46..8da9d1d). The previous upstream head passed 24/25 WebAssembly jobs; W32-WASI (wasm32 with WASI Preview 1) shard 3 showed one empty-output GNU timeout 124 for test/std/net/rpc/jsonrpc during linking. The change gives exactly test/std/net/rpc and test/std/net/rpc/jsonrpc the existing 10-minute W32 allowance, with negative profile/path tests. It also changes GOROOT from six to seven shards: all 2,316 recorded case durations reconstructed the measured six-shard maximum as 3,725 seconds and predict the seven-shard maximum as 2,758 seconds, while eight would add another job for only modest additional headroom. Please check timeout scope, matrix/name/argument consistency, and whether seven is the minimal defensible runner bound.

@fennoai

fennoai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing follow-up 8da9d1d51 (delta ff6ae46a6..8da9d1d51)

  • Lock commit & prepare workspace (1 commit, 3 files)
  • Verify rpc/jsonrpc 10-min timeout scope + negative tests
  • Verify 6→7 GOROOT shard matrix/name/arg consistency
  • Assess whether 7 is the minimal defensible bound; confirm test/CI-only
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 re-review — follow-up 8da9d1d51 (delta ff6ae46a6..8da9d1d51)

Reviewed the single follow-up commit (3 files: workflow + dev/wasmstdlib/full.go + its test). Confirms the fix for the one failing job (W32-WASI shard 3, test/std/net/rpc/jsonrpc empty-output timeout 124 during linking) and the 6→7 GOROOT reshard. Range stays test/tooling/CI only — no runtime/compiler production changes.

Timeout scope — correct and tightly bounded. fullCommandTimeout now grants the existing 10-minute allowance to exactly test/std/net/rpc and test/std/net/rpc/jsonrpc via an exact-string switch under p.Name == "W32-WASI". Good properties:

  • It targets the GNU timeout wrap (full.go:119), which bounds compilation/linking + children — precisely where the empty-output 124 occurred — while the inner -timeout=60s test-runtime budget (fullTestTimeout) is left unchanged, which is right since jsonrpc isn't slow at runtime, only at reflected-bridge link time.
  • Exact match means it can't leak to siblings like test/std/net/rpc/internal; the new negative cases assert rpc/internal→5m and both packages on the GoJS profile→5m. jsonrpc is a real discovered package (test/std/net/rpc/jsonrpc/jsonrpc_test.go).
  • The extension stays profile-scoped to W32-WASI only.

Matrix / name / argument consistency — clean. All three shard references agree at 7: job name .../7, matrix shard: [0,1,2,3,4,5,6] (7 entries), and -shard-total 7. No stale 6 remains (only the explanatory comment). timeout-minutes: 180, RSS/memory guards, and GOMAXPROCS are unchanged. The J32-GoJS-only full-corpus sharding is preserved (no cross-profile fan-out).

Is seven the minimal defensible bound? Reasonable, and data-backed rather than guessed: the six-shard upstream run showed a 62-min (~3,725s) worst-case step, and replaying all 2,316 recorded case durations predicts ~46min (2,758s) at seven, versus a full extra job at eight for only modest headroom. Since the hard timeout-minutes: 180 ceiling was never actually at risk, this is a wall-clock/runner-lease headroom optimization, not a correctness fix — and seven is a defensible minimum under that framing. (If future case-time drift is a concern, the reconstruction script/data behind the 2,758s prediction would be the thing to keep alongside the workflow, but that's not blocking.)

Boundary confirmed: workflow YAML + dev-only wasmstdlib acceptance tool + its unit test. No shipped code, so no release-size or runtime impact.

No findings. Clean, well-scoped, and tested. LGTM.

@cpunion
cpunion force-pushed the codex/wasm-w3-acceptance-20260913 branch from bb2cbfd to 7a4f5b2 Compare September 14, 2026 00:33
@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please re-review W3 at 748483792502..7a4f5b22e762. The rebase preserves 34/35 original commits exactly; the first portable-host commit only drops a native subprocess wrapper now supplied by W2-B. The final commit fixes the remaining stacked-acceptance failure without adding a skip: WASM guests correctly return ENOSYS for pipe, so six fatal repanic variants are now launched from the host against the retained test/go artifact and validated for exit status, function identity, and exact source line across J32-GoJS (wasm32 with the Go-compatible JavaScript host), J32-Emscripten (wasm32 with Emscripten/JavaScript), J64-Emscripten Memory64 (wasm64 with Emscripten/JavaScript), W32-WASI (wasm32 with WASI Preview 1), official Go js/wasm, and official Go wasip1/wasm. The host tool remains at 100% statement coverage and no production code changes.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Re-reviewing rebased W3 range 748483792502..7a4f5b22e762

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 rebase re-review — 748483792502..7a4f5b22e762

git range-diff against the prior reviewed range confirms the described shape: commits #2–35 are exact matches (=), #1 changed, and #36 is new.

Commit #1 (validate portable host contracts) — verified benign. The only delta is dropping the native subprocess wrapper test/go/caller_panic_native_test.go from this commit (plus adding GOTRACEBACK=single to the child env). Confirmed that file already exists at the W3 range base (git cat-file -e 748483792502:test/go/caller_panic_native_test.go succeeds), i.e. it is now supplied by the stacked-below W2-B range — no loss of coverage, no duplicate definition.

Commit #36 (run repanic tracebacks from the host) — solid and false-positive-resistant. It launches six repanic variants (same, wrapper, indirect-wrapper, slice, different, later) from the acceptance host against the retained test/go artifact via the -llgo.caller-repanic-child=<mode> argv selector, for each profile. validateFullRepanic enforces three independent gates:

  1. Exit status — requires an *exec.ExitError with code 1–2; explicitly rejects success, timeout, and launch failure.
  2. Exact source line — parses the marker (REPANIC_ORIGIN_MARK / SLICE_REPANIC_ORIGIN_MARK / REPLACEMENT_PANIC_MARK / LATER_SAME_VALUE_PANIC_MARK) out of caller_runtime_test.go and requires caller_runtime_test.go:<line> in the traceback, anchored with (?:\D|$) so :102 can't be satisfied by :1020.
  3. Function identity (and panic message for different → panic: replacement panic).

Verified all four markers exist at unique panic-origin lines (102/109/121/153) and all six driver functions (callerRepanicOrigin, callerReplacementPanic, callerLaterSameValuePanic, callerWrappedRepanic, callerSliceRepanic, callerNestedRepanic) are present. This is a real host-executed contract, not a skip — consistent with WASM guests returning ENOSYS for pipe so the guest can't self-spawn.

Failure-path coverage is complete: TestFullFatalValidatorsRejectFalsePositives now exercises every repanic case for the positive path plus four negatives (successful child, wrong source line, missing traceback identity, missing source file/marker), and TestFullChildCommandProfiles asserts the repanic selector on every profile. Supports the 100%-statement-coverage claim.

Prior findings all still resolved at head: precedence parens, validateFullHostArtifact/hostArtifactReady, literal/non-empty expectation guard, weak-stress exclusion, net/rpc+jsonrpc 10-min WASI allowance, 7-shard GOROOT. ✅

Boundary: the W3 range (97 files) contains no production files — entirely test / dev/wasmstdlib tooling / CI / doc. No release-size or runtime impact.

Rebase verified, no new findings. LGTM.

@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review the incremental CI-only fix 7a4f5b22e762..d626eadedbc6. The first rebased run failed before executing the browser test because the Qiniu runner had no preinstalled google-chrome; this reuses the existing repository pattern based on browser-actions/setup-chrome@v2, verifies the returned executable, and passes that exact path to the real-browser acceptance script. Please check runner independence, missing-browser failure semantics, and whether any redundant browser setup remains.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing CI-only fix 7a4f5b22e762..d626eaded

  • Lock commit & prepare workspace (1 CI commit, 1 file)
  • Verify setup-chrome pattern matches existing repo usage & executable check
  • Verify missing-browser is an error (not skip); no redundant setup remains
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 CI-only fix review — 7a4f5b22e762..d626eaded

One commit, one file (.github/workflows/wasm-acceptance.yml, +10/-3). Provisions Chrome for the browser-acceptance job instead of assuming a preinstalled google-chrome. Confirms the fix for the Qiniu-runner failure. All three focus points check out:

Runner independence — yes. browser-actions/setup-chrome@v2 (with install-dependencies: true) installs Chrome regardless of what the hosted runner preloads, and its resolved steps.setup-chrome.outputs.chrome-path is threaded via BROWSER_BIN into both the verify step and dev/test_wasm_browser.sh. Nothing now depends on google-chrome being on PATH. Passing the explicit path also means the script uses that exact binary rather than its own PATH-candidate search.

Existing-pattern reuse — confirmed. This mirrors the repo's established usage in .github/workflows/llgo.yml:684 (same action, same id: setup-chrome, same install-dependencies: true, same chrome-path output). No new/novel mechanism introduced.

Missing-browser failure semantics — error, not skip. The Require the hosted browser step runs test -x "$BROWSER_BIN" then "$BROWSER_BIN" --version under the job's default set -e; an empty/invalid path fails test -x "" and stops the job. test_wasm_browser.sh independently runs set -euo pipefail and exit 1 when no browser resolves. So an absent browser remains a hard failure.

No redundant setup remains. Single Set up Chrome step; the previous command -v google-chrome check and the literal BROWSER_BIN: google-chrome are both removed. No leftover apt/manual Chrome install.

Minor (non-blocking, optional): browser-actions/setup-chrome@v2 is tag-pinned rather than SHA-pinned — consistent with the repo's existing convention (the llgo.yml reference is pinned the same way), so not a regression; SHA-pinning third-party actions is a general hardening option if the project ever wants it.

CI-only, no production/test-logic changes. LGTM.

@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review the documentation-only delta d626eadedbc6..cb588686a49b0. The bilingual proposal now presents the Go source layer, Memory ABI, Host ABI, and provider as a list and complete provider tree. It explicitly includes J64 (wasm64 with JavaScript) in the common Go data model and explains where Go wasm assembly/runtime code requires LLGo adaptation. Please check English/Chinese consistency and that the source-reuse wording does not imply gc compiler object or cross-target artifact compatibility. The proposal issue #2152 has been synchronized with the document; production and test code are unchanged in this delta.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing doc-only delta d626eaded..cb588686

  • Lock commits & prepare workspace (2 doc commits, doc/wasm-proposal.md)
  • Check EN/ZH consistency; provider tree/list incl. J64 in common data model
  • Verify source-reuse wording doesn't imply gc object / cross-target artifact compatibility
  • Confirm doc-only
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 doc-only review — d626eaded..cb588686

Two commits, both touching only doc/wasm-proposal.md (+76/-8). Adds a "Design overview" section (Go source layer, Memory ABI, Host ABI, Provider) plus a provider tree, and rewords the compatibility contract. Confirmed doc-only — no production or test changes in this delta.

English/Chinese consistency — good. The new Design overview / 设计总览 lists, the ASCII provider tree, and the assembly/runtime boundary paragraph all appear in both languages with matching technical content:

  • Go source layer / Go 源码层: 64-bit word model, low-32-bit Memory32 addresses, prefer shared GOROOT sources.
  • Memory ABI: J32/W32 → Memory32/i32/ILP32; J64 → Memory64/i64/LP64.
  • Host ABI: JavaScript vs WASI, with js && wasm / wasip1 && wasm host files remaining distinct.
  • Provider: GoJS vs Emscripten share Go API semantics; "provider selection does not define another Go ABI" / "provider 选择不定义另一套 Go ABI".
  • The provider tree is identical between the two renderings (Memory32 → GoJS / Emscripten / WASI Preview 1 providers; Memory64 → Emscripten provider).

J64 in the common Go data model — explicitly included in both. Line 14 (EN) / 129 (ZH): J64 is "extending the same Go data model to a wider address space" / "将同一 Go 数据模型扩展到更大的地址空间", and the compatibility contract's first bullet now reads "All supported profiles, including J64 …" / "包括 J64 … 在内的所有受支持 profile". The tree correctly shows J64/Emscripten as the sole Memory64 leaf, consistent with "J64 initially uses Emscripten" elsewhere in the doc.

Source-reuse wording does not imply gc-object or cross-target artifact compatibility — verified. The disclaimer is explicit and mirrored (line 41 EN / 156 ZH): "Source/API compatibility does not require identical generated function signatures or binary compatibility with gc compiler objects or artifacts for other targets." This is actually stronger than the text it replaces (the old "Binary compatibility with Go compiler object files is not required" bullet), since it now also excludes other-target artifacts and function-signature identity. The syscall/js bullet likewise keeps "source/API compatibility, not stock wasm_exec.js binary compatibility." No wording overstates reuse.

Doc reads cleanly and stays consistent with the profile/provider terminology used across the workflows and tooling. No findings. LGTM.

@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review only the packaging follow-up cb588686a49b..62d85a81184dd (+3/-1 in one PowerShell script), independently proposed in #2588.

The previous CI round is now completely finished: 91 checks passed, with only the Windows MSVC ARM64 release staging failure and three skipped downstream release tasks. All 26 WASM acceptance jobs, native tests, benchmarks, and Codecov passed. No push interrupted that round. The updated body includes the complete package/GOROOT accounting, current coverage, and size comparisons against both W2-B and main.

The fix runs the existing ESP validation from the final staged path after moving the payload and cleaning up its extraction directory. Please check that all validation remains mandatory, failures still prevent archive creation, and no executable is moved/deleted by the temporary staging block after it has been run. There are no compiler/runtime changes or new skips. Windows CI on the new head must confirm the file-lock fix.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing packaging fix cb588686..62d85a81

  • Lock commit & prepare workspace (1 commit, build-release.ps1, +3/-1)
  • Verify ESP validation stays mandatory & throws on failure
  • Verify archive creation happens after validation; no exe moved/deleted post-run
  • Confirm no compiler/runtime changes or new skips
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Packaging follow-up review — cb588686..62d85a81

One commit, +3/-1 in .github/windows/build-release.ps1 (also independently proposed as #2588). It moves the Assert-ReleaseESPPayload call from before the Move-Item + temp-dir cleanup to after it, validating the final crosscompile/clang location. All four requested properties hold:

Validation remains mandatory and fatal. Assert-ReleaseESPPayload (.github/windows/release-lib.ps1:157) throws on every failure path — manifest arch/version mismatch, unexpected PE machine, a missing imported DLL, zero PE binaries — and executes all six tools (clang, clang++, ld.lld, llc, opt, llvm-config) via Invoke-ReleaseCapture, which itself throws on any non-zero exit. Nothing was downgraded to a warning or skipped; the check still runs unconditionally on every build.

Failures still prevent archive creation. The relocated call sits at top level after the try/finally but before release.json is written and before release_zip.py create. A throw aborts the script non-zero, so no .zip (and no .sha256) is produced when validation fails.

No executable is moved/deleted after being run — this is precisely the fix. Previously the tools were executed while still under the temporary $espParent, and the subsequent Move-Item relocated that just-executed directory, so the residual Windows execution file-lock produced the sharing-violation staging failure. Now Move-Item runs first, the (emptied) $espParent is removed in finally, and validation runs against the permanent staged path with only a LICENSE copy-in / metadata write / zip afterward — none of which move or delete the validated binaries.

No compiler/runtime changes or new skips. The delta touches only this one PowerShell script.

Scope note: $crosscompile is assigned inside the try block, but PowerShell function-scope (not block-scope) keeps it visible at the post-finally Assert line; if extraction throws earlier, the exception propagates before that line executes, so there's no undefined-root case.

One thing I can't verify from here: the actual Windows CI run confirming the file-lock is resolved — I can't read CI logs, so that remains the final gate, as you noted. The change is logically correct and correctly ordered. LGTM.

Keep winbatch.go and issue78081.go runnable, with js/wasm-only budgets grounded in observed passing and timed-out runs. Cover the timeout scope and absence of xfail classifications.

Partition the unchanged full corpus into nine shards. Replaying 2,316 measured case timings lowers the estimated longest execution from 51 to 41 minutes without relaxing resource guards. This mitigates long-job exposure, but does not claim to repair runner disconnections.
@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please review only 62d85a81184dd..10b96399ba093: three acceptance/CI files, +20/-12, with no compiler/runtime changes.

The preceding round is fully finished: 91 checks passed, six failed, and the actual release-publication job was normally skipped. All four Windows MSVC/MinGW × amd64/arm64 builds and their artifact tests passed, confirming the carried #2588 staging fix. No push interrupted the round.

The two GOROOT case failures were execution timeouts: winbatch.go had previously passed in 114.576s against a 120s allowance; fixedbugs/issue78081.go had passed in 147.025s but exceeded 180s on another runner. Their js/wasm allowances become 4m and 6m. Neither case becomes xfail or not-applicable. Both passed an exact-head local driver run; the same artifacts also passed explicitly on Node 24 in 39.57s and 77.58s. Regression tests require runnable classifications and no timeout leakage to native/WASI platforms.

Four other failures were lost e2b-* runner communication, without uploaded logs: three GOROOT shards at 65–69m and one W32-WASI (wasm32 with WASI Preview 1) package shard at 42m. Nine GOROOT shards lower the estimated longest case-execution sum from 51m to 41m; replaying all 2,316 timings and the actual runner inventory confirms no duplicated or omitted cases. This is headroom mitigation, not a claim that infrastructure disconnections are repaired. The existing qiniu label also resolves to e2b-*, so I did not substitute labels without evidence or suppress lost-runner failures.

Please check the narrow timeout scope, retained runnable classifications/resource guards, consistent nine-shard matrix/name/command, and whether the diff contains anything unnecessary. All runner unit tests, actionlint, and diff checks pass locally. The preceding head's Codecov patch coverage is 98.52% (target 94.35%); all 52 WASM module/glue size measurements still exactly match final W2-B. The new head must pass CI and coverage; please do not treat the previous incomplete acceptance result as green.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing 62d85a81..10b96399

  • Lock commit & prepare workspace (3 acceptance/CI files, +20/-12)
  • Verify timeout scope (js/wasm only, no native/WASI leakage) + runnable classifications retained
  • Verify 9-shard matrix/name/command consistency + resource guards intact
  • Confirm nothing unnecessary; no compiler/runtime changes
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 review — 62d85a81..10b96399

One commit, three files (wasm-acceptance.yml, runner_unit_test.go, xfail.yaml), +20/-12. Raises two GOROOT js/wasm timeout allowances and reshards GOROOT 7→9. Confirmed no compiler/runtime changes and no new skips. All requested points check out:

Timeout scope is narrow and does not leak. Both bumped entries in xfail.yaml (winbatch.go 2m→4m, fixedbugs/issue78081.go 3m→6m) carry platform: js/wasm + directive: run, and MatchTimeout (runner_test.go:2260) only returns an override when entry.matches(goVersion, platform, tc). The new regression loop in TestWasmObservedResourceExceptions explicitly asserts the allowance does not match on linux/amd64, darwin/arm64, windows-msvc/arm64, or wasip1/wasm — so no leakage to native/WASI. The reasons are now specific and auditable (115s/147s measured passing runs vs. the former 120s/180s limits).

Runnable classifications retained. Both cases are added to TestObservedPassesDoNotHaveXFailClassifications, which asserts they are NOT xfail/not-applicable, and neither appears in any xfail/not_applicable section — they live only under timeouts. So they remain mandatory passing cases with a wider allowance, not suppressed. Resource guards (-max-rss-mib 4096 -rss-warn-mib 1024 -min-memory-free-percent 15 -min-swap-free-mib 512) are unchanged.

Nine-shard matrix/name/command are consistent. Job name .../9, matrix shard: [0,1,2,3,4,5,6,7,8], and -shard-total 9 all agree; no stale 7 remains. timeout-minutes: 180 and GOMAXPROCS unchanged; still J32-GoJS-only (no cross-profile fan-out). The comment correctly frames this as measured headroom mitigation (51m→~41m est.), not a repair of the lost-runner disconnections.

Nothing unnecessary. The diff is exactly: the shard bump, the two timeout values (yaml + unit test), the two reason strings, two runnable assertions, and the anti-leak loop. No unrelated edits, no label substitution — consistent with your note that qiniu→e2b-* was left as-is.

The scoping/classification logic is correct. As you flagged, the previous acceptance round was incomplete, so CI + coverage on this new head remain the gating signals — I can't read CI logs from here, so I'm reviewing the change itself, which is sound. LGTM.

@cpunion

cpunion commented Sep 14, 2026

Copy link
Copy Markdown
Collaborator Author

@fennoai Please incrementally review 10b96399b..14a2f5247 (one commit, two GOROOT config/unit-test files, +32/-6).

The complete preceding CI round finished before this push: 98 passing checks, one expected release skip, one failure. All 28 WASM jobs finished without runner loss; only GOROOT shard 5/9 failed, because fixedbugs/issue79186.go exceeded the default 60-second runtime. Prior passing runs were 55.144/55.710 seconds for its 51.2 million RWMutex/map operations. A clean-head compiler passed the unchanged case on Node 24 locally in 22.802 seconds. This commit gives only its js/wasm run a two-minute allowance.

A systematic near-budget audit of the full corpus also found issue5162.go: building its 768 generated array-comparison functions took 168.753 seconds under the default 180-second cap. Its js/wasm runoutput case now has a four-minute allowance using the existing mechanism (which also raises the effective build ceiling). This is a measured build-budget adjustment, not a claim that a particular optimizer pass has been proven responsible. No other near-limit cases were found beyond these and the already handled winbatch/issue78081 cases; issue78081 passed this CI round at 199.691 seconds under its six-minute budget.

Please check that both cases remain runnable, the guards reject js/wasm xfail/flaky/not-applicable classifications, existing native issue79186 90-second allowances are preserved, and WASI remains unaffected. No skip/flake or new timeout framework, compiler/runtime changes, reduced test contents, or global resource-limit changes were introduced. All GOROOT runner unit tests and diff checks pass. Previous-head coverage is 98.52% against 94.35%; all 52 WASM module/glue sizes are unchanged versus W2-B. New-head CI/coverage are still required.

@fennoai

fennoai Bot commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Reviewing 10b96399b..14a2f5247

  • Lock commit & prepare workspace (2 GOROOT files, +32/-6)
  • Verify both cases runnable; guards reject js/wasm xfail/flaky/not-applicable
  • Verify native issue79186 90s allowances preserved; WASI unaffected
  • Confirm no new skip/flake/framework/compiler-runtime changes
  • Submit review

View job run

@fennoai fennoai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

W3 review — 10b96399b..14a2f5247

One commit, two GOROOT files (xfail.yaml, runner_unit_test.go), +32/-6. Adds js/wasm timeout allowances for two more measured near-budget cases. No compiler/runtime changes, no new skip/flake, no new framework. All requested properties verified:

Both cases remain runnable. fixedbugs/issue79186.go (run, 2m) and fixedbugs/issue5162.go (runoutput, 4m) are added to TestObservedPassesDoNotHaveXFailClassifications, and neither appears in any xfail/not_applicable section — they exist only under timeouts. issue5162.go is absent from notapplicable.yaml entirely. So they stay mandatory passing cases with a wider allowance.

Guards reject js/wasm xfail/flaky/not-applicable. TestWasmObservedResourceExceptions now additionally asserts, for all four resource cases, that MatchFlaky and notApplicable.Match return no match on js/wasm. Note issue79186.go does appear in the flakes: section — but only for native darwin/arm64 and linux/amd64, correctly not js/wasm, so there's no classification conflict.

Native issue79186 90s allowances preserved. The darwin/arm64, linux/amd64, windows/amd64, and windows/arm64 90s entries are all retained, and the test now asserts nativeTimeout = 90s on those platforms. I confirmed matchPlatform maps windows-msvc/arm64 → the windows/arm64 entry (prefix rule), so the test's native assertion is a real match, not an accidental pass. The new js/wasm 2m allowance is a separate entry and does not disturb them.

WASI unaffected. The test pins want = 0 for wasip1/wasm and asserts no timeout override matches there — so none of the four GoJS allowances leak to WASI (or to native for the WASI-only-0 cases).

Nothing unnecessary / no global changes. The diff is exactly: two timeouts: entries with specific measured reasons, two runnable assertions, and the expanded per-platform/flaky/not-applicable guard matrix. No new skip/flake mechanism, no reduced test content, no -max-rss/-min-memory or other global resource-limit edits.

Scoping and classification logic are correct. As you noted, this new head still needs its own green CI + coverage — I can't read CI logs from here, so I'm reviewing the change itself, and it's sound. LGTM.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant