Research: CI Warning Omnibus (2026-05-19)¶
Context: CI run 26111553607 (workflow_dispatch on master) surfaced five warnings / notices that require pre-emptive fixes before the 2026-06-02 / 2026-06-15 hard-failure dates. Companion to ADR-0635.
Warning 1 — Node.js 20 deprecation on ilammy/msvc-dev-cmd¶
Investigation¶
ilammy/msvc-dev-cmd is the community-standard action for activating the MSVC developer command prompt on Windows GitHub Actions runners. The pinned SHA 0b201ec74fa43914dc39ae48a89fd1d8cb592756 is v1.13.0, the latest published release as of 2026-05-19. Verified via:
gh api repos/ilammy/msvc-dev-cmd/releases --jq '.[].tag_name'
# → v1.13.0 (only release)
gh api repos/ilammy/msvc-dev-cmd/commits/HEAD --jq '.sha'
# → 460a772e4cf7358f9f2f23773240813e40e7a894 (no new release past v1.13.0)
The action's package.json pins @actions/core to a version compiled for Node.js 20. The action author has not published a v2 or a Node.js 24 build.
Candidate replacements¶
| Action | Node version | Notes |
|---|---|---|
TheMrMilchmann/setup-msvc-dev@v4.0.0 | node24 | Functionally identical to ilammy; released 2025-09-01; inputs: arch (default amd64), vs-path, sdk, toolset |
microsoft/setup-msbuild@v2 | node20 | Exposes MSBuild entry point only — cl.exe not on PATH |
microsoft/setup-msbuild@v3 (hypothetical) | — | Does not exist as of 2026-05-19 |
Force FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true | — | Treats symptom; action untested under forced Node.js 24 |
Selected: TheMrMilchmann/setup-msvc-dev@v4.0.0.
Action YAML verified:
No required inputs; arch defaults to amd64 — matching the current ilammy invocation (no inputs specified). SHA: 79dac248aac9d0059f86eae9d8b5bfab4e95e97c.
Warning 2 — windows-latest runner redirect¶
Investigation¶
GitHub announced that windows-latest will redirect to windows-2025-vs2026 on 2026-06-15. The fork's Windows jobs (windows, windows-gpu-build) both use runs-on: windows-latest.
Runner image matrix (from actions/runner-images README, live 2026-05-19):
| Label | Image |
|---|---|
windows-latest or windows-2025 | Windows Server 2025 |
windows-2025-vs2026 | Windows Server 2025 + VS2026 |
The redirect target is windows-2025-vs2026 (VS2026), not windows-2025. However, the fork's MSVC builds use cl.exe from the toolset, not the VS IDE. windows-2025 is the minimal stable label that is equivalent to the current windows-latest and will not pick up the VS2026 toolset delta.
Selected: windows-2025.
Strawberry ccache availability (C:\Strawberry\c\bin\ccache.exe) confirmed present on windows-2025 — same base image as current windows-latest.
Warning 3 — MoltenVK vulkaninfo warning annotation¶
Investigation¶
The Install MoltenVK + Vulkan loader/headers (macOS) step runs:
vulkaninfo --summary 2>&1 | tee /tmp/vulkaninfo.txt || true
if ! grep -qi 'MoltenVK\|Apple' /tmp/vulkaninfo.txt; then
echo "::warning::vulkaninfo did not report MoltenVK/Apple GPU — see /tmp/vulkaninfo.txt"
fi
On hosted macos-latest runners (Apple M-series virtualized), vulkaninfo writes GPU-capability warnings to stderr (e.g. "No display server running — GPU enumeration incomplete") that are captured by 2>&1 and surfaced as CI annotations regardless of whether the MoltenVK ICD loads. The grep on stdout is the correctness gate; the ::warning:: fires when stdout does not contain "MoltenVK" or "Apple", which happens when stderr dominates the tee output.
Confirmed: the MoltenVK lane is continue-on-error: true (ADR-0338), so the warning does not block CI. But it produces a persistent annotation on every master push, habituating maintainers to ignore the annotation panel.
Fix: redirect stderr to /dev/null so only stdout is teed; demote the fallback message from ::warning:: to ::debug:: with an explanatory note.
Warning 4 — Cache entry deserialization failed¶
Investigation¶
The macOS Vulkan lane's ccache restore step logs:
The ccache key is ccache-${{ matrix.os }}-${{ matrix.CC }}-${{ matrix.meson_extra }}-${{ github.sha }}. actions/cache was upgraded from v4 to v5 (SHA 27d5ce7f107fe9357f9df03efb73ab90386fccae) in a prior PR. The v5 action changed the on-disk cache entry format; entries saved by v4 cannot be deserialized by v5. Old entries expire after 7 days but produce the deserialization warning on every run until expiry.
Fix: bump the key prefix from ccache- to ccache-v2-, forcing all consumers to start a fresh cache. One-time ~3–5 min wall-clock hit per cell; no correctness impact (ccache is a build accelerator, not a correctness gate).
No other cache steps use a ccache- prefix — the Vulkan subproject packagecache (meson-packagecache-vulkan-...) and fixture cache (vmaf-fixtures-resource-v1-...) are not affected by the v4→v5 format change (they store plain file archives, not build-object caches with v4/v5-specific metadata).
Warning 5 — docs/mcp/tools.md#run_benchmark anchor failure¶
Investigation¶
mkdocs build --strict fails with a broken anchor warning when docs/mcp/index.md links to tools.md#run_benchmark and the heading in tools.md is ## \run_benchmark``.
Root cause: mkdocs-material's link validator resolves anchors from heading-generated slugs. The slug generation for ## \run_benchmark`is implementation-defined — some versions strip backticks and producerun_benchmark; others encode them asrun_benchmark_1` or similar. The strict validator rejects any slug it cannot confirm.
PR #1431 added <a id="run_benchmark"></a> as a workaround, but mkdocs-material does not index raw HTML <a id> tags for link validation — only Markdown headings contribute to the slug map. The HTML anchor is visible to browsers but invisible to the strict checker.
Other headings in tools.md with the same backtick pattern (## \vmaf_score`,## `list_models`, etc.) are not cross-linked fromindex.md` or use fragment-free links, so they are not caught by the strict validator.
Fix: rename the heading to ## run_benchmark (no backticks) and drop the <a id> tag and its markdownlint-disable-next-line MD033 comment. The slug run_benchmark is stable and matches the existing cross-link in index.md without any further changes.