From 5896a597e94b77c0266512de1dffe8dcd0569e66 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 07:21:05 -0500 Subject: [PATCH 1/2] wai-neural-gates: the jpegai-decode-path job installs the repository's Rust pin The job's install step named Rust 1.98.0, two releases behind the pin in rust-toolchain.toml (1.99.1 since #606). It now bootstraps rustup with no default toolchain and runs `rustup toolchain install` with no name, which installs the toolchain rust-toolchain.toml names, as the wai-quantum member jobs do. A later change of the pin needs no edit to this job. The step then logs the active toolchain. What the job tests is unchanged. Main's run 19418 (job 81788) shows the old step installed 1.98.0 and set it as the default, and cargo then auto-installed 1.99.1 from the toolchain file's override and compiled the test with it. The 1.98.0 download was wasted and the step's name was wrong. The new step installs the same six components up front. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-neural-gates.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/.github/workflows/wai-neural-gates.yml b/.github/workflows/wai-neural-gates.yml index 28be8f8e6..191e36ffb 100644 --- a/.github/workflows/wai-neural-gates.yml +++ b/.github/workflows/wai-neural-gates.yml @@ -284,15 +284,18 @@ jobs: WAI_REQUIRE_SOTA_VECTORS: '1' steps: - uses: actions/checkout@v5 - # Bootstrap rustup: the docker runner image ships no Rust. - - name: Install Rust 1.98.0 + # Bootstrap rustup: the docker runner image ships no Rust. The toolchain is the + # repository's pin: `rustup toolchain install` with no name installs the one + # rust-toolchain.toml names, as the wai-quantum member jobs do, so a change of the + # pin needs no edit here. The last line logs the toolchain cargo will use. + - name: Install Rust (the pin in rust-toolchain.toml) run: | export PATH="$HOME/.cargo/bin:$PATH" command -v rustup >/dev/null 2>&1 || \ - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain 1.98.0 - rustup toolchain install 1.98.0 --profile minimal - rustup default 1.98.0 + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain none + rustup toolchain install echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" + rustup show active-toolchain - name: Fetch the JPEG-AI inputs and check each against the pinned manifest working-directory: wai shell: bash -- 2.54.0 (Apple Git-157) From 5f1158154d09026aa72762b3b6a2c9e82bf7cbf1 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Thu, 5 Nov 2026 07:21:05 -0500 Subject: [PATCH 2/2] wai-byte-equality: restore the windows-x86_64 leg, with pwsh forms of the disk steps The leg was removed on 2026-09-30 while the Windows runner was offline. The runner is back: a `windows` job passed in run 19310 (job 81346), and the Studio's Windows desktop job passed in runs 19610 and 19807. - The matrix gets `- { os: windows, label: windows-x86_64 }` again, and the comment says x86_64 is held by linux-x86_64 and windows-x86_64. - The two disk steps run in bash, which on this host is the WSL stub. They stay unix-only. Each gets a pwsh form for Windows with the same directories, floor, write probe and messages: - the workspace, the runner's temporary directory, TEMP and the profile directory; - the free space the volume leaves the runner's user; - a 32 MiB write-through probe once per volume; - full-disk, write-protect, I/O device and quota errors named as infrastructure, by their Win32 codes. The after-failure form keys on the new step's id, disk_windows. - Both pwsh steps set the process execution policy to Bypass, as the Studio's Windows job does. The install and decode steps are unchanged. The Windows install step was already pwsh, and the bare `cargo test` step takes the host's pwsh default. No step bundles anything, so CI is not cleared. The Windows leg follows the repository's practice for a Windows job. It is not a required status, like wai-quantum-webgpu.yml's member-windows. Like the other legs, it runs only when the workflow's `relevant` gate answers true. If the runner goes offline again, the leg comes out of the matrix until the runner is back, as on 2026-09-30. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/wai-byte-equality.yml | 131 ++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 11 deletions(-) diff --git a/.github/workflows/wai-byte-equality.yml b/.github/workflows/wai-byte-equality.yml index 53036065e..bae9986b3 100644 --- a/.github/workflows/wai-byte-equality.yml +++ b/.github/workflows/wai-byte-equality.yml @@ -159,26 +159,31 @@ jobs: # Self-hosted fleet labels, not hosted images. macos-x86_64 is # dropped: no Intel-Mac runner exists in the fleet, and by the same # argument the cargo-classes matrix already makes, it adds no arch - # coverage — x86_64 is held by linux-x86_64, arm64 by linux-aarch64 - # and the macos-arm64 reference. - # Windows x86_64 leg removed 2026-09-30: runner offline. Restore by - # re-adding `- { os: windows, label: windows-x86_64 }` here once the - # runner is back online. - # The two disk steps below are bash, and skip on Windows. + # coverage — x86_64 is held by linux-x86_64 and windows-x86_64, arm64 + # by linux-aarch64 and the macos-arm64 reference. + # windows-x86_64 was removed on 2026-09-30 while its runner was offline, and + # is back now that the runner is (a `windows` job passed in run 19310). Not a + # required status, as wai-quantum-webgpu.yml's member-windows is not: like every + # leg here it runs only when the `relevant` gate above answers true. A job on an + # offline runner stays pending and never settles, so if the runner goes offline + # again the leg comes out of this list until it is back. + # The two disk steps below come in a bash form for the unix legs and a pwsh form + # for Windows, whose `bash` is the WSL stub. include: - { os: linux, label: linux-x86_64 } - { os: linux-arm64, label: linux-aarch64 } - { os: macos, label: macos-arm64 (reference) } + - { os: windows, label: windows-x86_64 } env: # The floor of the disk check below, in GiB. The leg writes under 1 GiB (a # shallow checkout of about 0.3 GiB plus its pack, and a release target under # 0.1 GiB, measured 2026-11-03), and a cold toolchain install about 1 GiB more # under HOME; the rest is room for the jobs that share the disk. Measured with the - # step's own loop on 2026-11-04, every label had 50 GiB or more free under all - # four directories, so the floor fails a leg only on a host within a few GiB of - # full. The macOS runner's HOME and TMPDIR sit on its internal disk, which has - # gone from 7 GiB free to 118 MiB within hours, and at that level its jobs failed - # writing under HOME. + # step's own loop on 2026-11-04, every unix label had 50 GiB or more free under all + # four directories (the Windows host was not measured), so the floor fails a leg + # only on a host within a few GiB of full. The macOS runner's HOME and TMPDIR sit + # on its internal disk, which has gone from 7 GiB free to 118 MiB within hours, and + # at that level its jobs failed writing under HOME. DISK_FLOOR_GIB: '4' steps: # Infrastructure first, before the checkout writes anything. Main's run 17676 @@ -231,6 +236,61 @@ jobs: rm -f "$f" done exit $short + # The same check on the Windows leg, in pwsh: its `bash` is the WSL stub, which + # would measure another system's disk. The directories are the workspace, the + # runner's temporary directory, TEMP, and the profile directory, where rustup keeps + # the toolchain. The free space is what each one's volume leaves the runner's user, + # quotas included, and the probe writes 32 MiB through to each volume once. The + # write errors named infrastructure are the Win32 codes for a full disk (39, 112), + # a write-protected one (19), an I/O device error (1117) and a quota (1295). + - name: "infrastructure: this runner's disk has room for the leg (Windows)" + id: disk_windows + if: matrix.os == 'windows' + shell: pwsh + run: | + Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force + $floor = [int64]$env:DISK_FLOOR_GIB * 1GB + $short = 0; $seen = @() + $tmp = [System.IO.Path]::GetTempPath() + $dirs = @( + $(if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { $PWD.Path }), + $(if ($env:RUNNER_TEMP) { $env:RUNNER_TEMP } else { $tmp }), + $(if ($env:TEMP) { $env:TEMP } else { $tmp }), + $HOME + ) + foreach ($d in $dirs) { + $p = [System.IO.Path]::GetFullPath($d) + while (-not (Test-Path -LiteralPath $p)) { $p = Split-Path -Parent $p } + $vol = [System.IO.Path]::GetPathRoot($p) + $free = [System.IO.DriveInfo]::new($vol).AvailableFreeSpace + Write-Output "${d}: $([math]::Floor($free / 1GB)) GiB free on $vol" + if ($free -lt $floor) { + Write-Output "::error::infrastructure: ${{ matrix.label }}: $d is on $vol, which has $([math]::Floor($free / 1MB)) MiB free, below the floor of $env:DISK_FLOOR_GIB GiB. The runner host's disk is full: no fixture was decoded, so this is not a byte-equality failure." + $short = 1; continue + } + if ($seen -contains $vol) { continue } + $seen += $vol; $f = Join-Path $p ".wai-disk-probe.$PID" + try { + $s = [System.IO.FileStream]::new($f, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write, [System.IO.FileShare]::None, 1048576, [System.IO.FileOptions]::WriteThrough) + try { + $buf = [byte[]]::new(1048576) + for ($i = 0; $i -lt 32; $i++) { $s.Write($buf, 0, $buf.Length) } + $s.Flush($true) + } finally { $s.Dispose() } + } catch { + $e = $_.Exception; while ($e.InnerException) { $e = $e.InnerException } + $msg = (($e.Message -split "`r?`n")[0]).TrimEnd('.', ' ') + if (($e.HResult -band 0xFFFF) -in 19, 39, 112, 1117, 1295) { + Write-Output "::error::infrastructure: ${{ matrix.label }}: a 32 MiB write under $p, on $vol, failed: $msg. The runner host's disk cannot take the leg's writes: no fixture was decoded, so this is not a byte-equality failure." + $short = 1 + } else { + Write-Output "::warning::a 32 MiB write under $p failed for another reason: $msg" + } + } finally { + Remove-Item -LiteralPath $f -Force -ErrorAction SilentlyContinue + } + } + exit $short - name: Checkout uses: actions/checkout@v4 @@ -292,3 +352,52 @@ jobs: done [ "$short" = 1 ] || echo "Every disk this leg writes to has room: the failure above is not the disk." exit $short + # The same measurement and write on the Windows leg, in pwsh, as its first check. + - name: "infrastructure: was the disk full when the leg failed? (Windows)" + if: failure() && matrix.os == 'windows' && steps.disk_windows.outcome == 'success' + shell: pwsh + run: | + Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force + $floor = [int64]$env:DISK_FLOOR_GIB * 1GB + $short = 0; $seen = @() + $tmp = [System.IO.Path]::GetTempPath() + $dirs = @( + $(if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { $PWD.Path }), + $(if ($env:RUNNER_TEMP) { $env:RUNNER_TEMP } else { $tmp }), + $(if ($env:TEMP) { $env:TEMP } else { $tmp }), + $HOME + ) + foreach ($d in $dirs) { + $p = [System.IO.Path]::GetFullPath($d) + while (-not (Test-Path -LiteralPath $p)) { $p = Split-Path -Parent $p } + $vol = [System.IO.Path]::GetPathRoot($p) + $free = [System.IO.DriveInfo]::new($vol).AvailableFreeSpace + Write-Output "${d}: $([math]::Floor($free / 1GB)) GiB free on $vol" + if ($free -lt $floor) { + Write-Output "::error::infrastructure: ${{ matrix.label }}: $d is on $vol, which has $([math]::Floor($free / 1MB)) MiB free, below the floor of $env:DISK_FLOOR_GIB GiB. The disk filled while the leg ran: read the failure above as the runner host's disk, not as a byte-equality failure." + $short = 1; continue + } + if ($seen -contains $vol) { continue } + $seen += $vol; $f = Join-Path $p ".wai-disk-probe.$PID" + try { + $s = [System.IO.FileStream]::new($f, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write, [System.IO.FileShare]::None, 1048576, [System.IO.FileOptions]::WriteThrough) + try { + $buf = [byte[]]::new(1048576) + for ($i = 0; $i -lt 32; $i++) { $s.Write($buf, 0, $buf.Length) } + $s.Flush($true) + } finally { $s.Dispose() } + } catch { + $e = $_.Exception; while ($e.InnerException) { $e = $e.InnerException } + $msg = (($e.Message -split "`r?`n")[0]).TrimEnd('.', ' ') + if (($e.HResult -band 0xFFFF) -in 19, 39, 112, 1117, 1295) { + Write-Output "::error::infrastructure: ${{ matrix.label }}: a 32 MiB write under $p, on $vol, failed: $msg. The disk filled while the leg ran: read the failure above as the runner host's disk, not as a byte-equality failure." + $short = 1 + } else { + Write-Output "::warning::a 32 MiB write under $p failed for another reason: $msg" + } + } finally { + Remove-Item -LiteralPath $f -Force -ErrorAction SilentlyContinue + } + } + if ($short -eq 0) { Write-Output "Every disk this leg writes to has room: the failure above is not the disk." } + exit $short -- 2.54.0 (Apple Git-157)