You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Head SHA: 8d205ff0b27a951ac7136cb72796ecd8e2e91ed4 (the only commit on dev: the nix flake → devenv migration, PR #951)
Exact failure
The failure is not in Vulkan, the headless swapchain, or screenshot readback. The game command never ran, so build-output.log was never created. The diagnose agent found the workspace contained only weston.log (weston startup, then caught signal 15 from the Stop headless Wayland compositor step), no screenshot.png, and no captured game log.
The failing step is Ensure visual-test label exists at .github/workflows/visual-test.yml:55-66. It runs:
if! gh label list --json name --jq '.[].name'| grep -q '^visual-test$';then
gh label create "visual-test" \
--description "Issues from automated visual regression tests" \
--color "E06C75"fiif! gh label list --json name --jq '.[].name'| grep -q '^run-visual-test$';then
gh label create "run-visual-test" \
--description "Run deterministic visual regression workflow on a PR" \
--color "E06C75"fi
gh label list returns the GitHub default 30 labels per page. This repository currently has 41 labels (verified locally with gh label list --repo OpenStaticFish/ZigCraft --limit 100 --json name). visual-test is at index 22 of 41 (visible on page 1), but run-visual-test is at index 31 of 41 (only on page 2). The precheck at visual-test.yml:62 therefore reports run-visual-test as missing even though it exists. The subsequent gh label create then fails with:
label with name "run-visual-test" already exists; use `--force` to update its color and description
Because the step uses set -euo pipefail (the gh CLI exits non-zero on a duplicate create), the step exits 1. Subsequent steps (Setup Lavapipe Vulkan, Run menu screenshot capture, the screenshot existence check, the golden-image diff, and the artifact uploads) are skipped. Only the Stop headless Wayland compositor step runs (it has if: always()), and it kills the weston process with SIGTERM — which is the signal recorded in weston.log:62.
Why there is no Vulkan, swapchain, or screenshot error
VulkanSwapchain.createSwapchain at modules/engine-graphics/src/vulkan_swapchain.zig:127, the headless color-attachment image setup at the same file lines 128-174, screenshot-mode init at src/game/app.zig:268-276, HomeScreen.init at modules/game-ui/src/screens/home.zig:33-40, and screenshot.requestCapture at modules/engine-graphics/src/vulkan/screenshot.zig:24-44 were never executed. The Zig binary was never launched; only the YAML pipeline ran.
Step state from the run
Pulled from the GitHub Actions jobs API for run 30984849473:
#
Step
Status
Conclusion
1-7
Set up job → Load visual diagnosis prompt
completed
success
8
Ensure visual-test label exists
completed
failure
9
Setup Lavapipe Vulkan
completed
skipped
10
Run menu screenshot capture
completed
skipped
11
Check screenshot exists
completed
success (screenshot_exists=false)
12
Compare against golden image
completed
skipped
13
Upload screenshot artifact
completed
skipped
14
Check build log exists
completed
success (file absent)
15
Upload build log artifact
completed
skipped
16
Stop headless Wayland compositor
completed
success
17
Run opencode visual verification
completed
skipped
18
Run opencode failure diagnosis
in_progress
—
Root cause file/function
File: .github/workflows/visual-test.yml
Function/step: Ensure visual-test label exists at lines 55-66
The precheck at line 62 (gh label list --json name --jq '.[].name' | grep -q '^run-visual-test$') silently truncates to 30 labels and treats the existing run-visual-test label as absent.
The unconditional-on-miss create at lines 63-65 then fails with a non-zero exit.
The diagnosis prompt is also stale (out of scope for this fix, but worth a follow-up): .github/prompts/visual-test-diagnose.md:7 still says screenshot.ppm, while the actual command at .github/workflows/visual-test.yml:81 uses the supported screenshot.png. The current encoder would still reject .ppm at modules/engine-graphics/src/vulkan/screenshot.zig:39 (detectScreenshotFormat only accepts .png, .jpg, .jpeg, .gif, .webp) if a future run ever reverted to .ppm. The prompt also references src/game/screens/home.zig, but the HomeScreen now lives at modules/game-ui/src/screens/home.zig.
Suggested fix
Make the bootstrap idempotent without relying on paginated list output. Apply in .github/workflows/visual-test.yml at lines 55-68:
--force makes gh label create succeed on existing labels (updating color/description in place) and eliminates the paginated precheck entirely.
Alternatives if a precheck is preferred: query each exact label through gh api repos/$GITHUB_REPOSITORY/labels/<name> (single-resource GET, no pagination), or pass --limit 100 to the existing gh label list call. --limit masks the immediate bug but reintroduces a hidden threshold as the label catalog grows, so --force is the more robust fix.
Workflow run
https://github.com/OpenStaticFish/ZigCraft/actions/runs/30984849473
Head SHA:
8d205ff0b27a951ac7136cb72796ecd8e2e91ed4(the only commit ondev: the nix flake → devenv migration, PR #951)Exact failure
The failure is not in Vulkan, the headless swapchain, or screenshot readback. The game command never ran, so
build-output.logwas never created. The diagnose agent found the workspace contained onlyweston.log(weston startup, thencaught signal 15from theStop headless Wayland compositorstep), noscreenshot.png, and no captured game log.The failing step is
Ensure visual-test label existsat.github/workflows/visual-test.yml:55-66. It runs:gh label listreturns the GitHub default 30 labels per page. This repository currently has 41 labels (verified locally withgh label list --repo OpenStaticFish/ZigCraft --limit 100 --json name).visual-testis at index 22 of 41 (visible on page 1), butrun-visual-testis at index 31 of 41 (only on page 2). The precheck atvisual-test.yml:62therefore reportsrun-visual-testas missing even though it exists. The subsequentgh label createthen fails with:Because the step uses
set -euo pipefail(theghCLI exits non-zero on a duplicate create), the step exits 1. Subsequent steps (Setup Lavapipe Vulkan,Run menu screenshot capture, the screenshot existence check, the golden-image diff, and the artifact uploads) are skipped. Only theStop headless Wayland compositorstep runs (it hasif: always()), and it kills the weston process with SIGTERM — which is the signal recorded inweston.log:62.Why there is no Vulkan, swapchain, or screenshot error
VulkanSwapchain.createSwapchainatmodules/engine-graphics/src/vulkan_swapchain.zig:127, the headless color-attachment image setup at the same file lines 128-174, screenshot-mode init atsrc/game/app.zig:268-276,HomeScreen.initatmodules/game-ui/src/screens/home.zig:33-40, andscreenshot.requestCaptureatmodules/engine-graphics/src/vulkan/screenshot.zig:24-44were never executed. The Zig binary was never launched; only the YAML pipeline ran.Step state from the run
Pulled from the GitHub Actions jobs API for run
30984849473:screenshot_exists=false)Root cause file/function
.github/workflows/visual-test.ymlEnsure visual-test label existsat lines 55-66gh label list --json name --jq '.[].name' | grep -q '^run-visual-test$') silently truncates to 30 labels and treats the existingrun-visual-testlabel as absent.Additional observations
Ensure visual-test label existsstep invisual-test.ymlhas not been modified since the devenv migration commit8d205ff(the only commit ondev), so the regression has re-fired on every nightly schedule run since..github/prompts/visual-test-diagnose.md:7still saysscreenshot.ppm, while the actual command at.github/workflows/visual-test.yml:81uses the supportedscreenshot.png. The current encoder would still reject.ppmatmodules/engine-graphics/src/vulkan/screenshot.zig:39(detectScreenshotFormatonly accepts.png,.jpg,.jpeg,.gif,.webp) if a future run ever reverted to.ppm. The prompt also referencessrc/game/screens/home.zig, but the HomeScreen now lives atmodules/game-ui/src/screens/home.zig.Suggested fix
Make the bootstrap idempotent without relying on paginated list output. Apply in
.github/workflows/visual-test.ymlat lines 55-68:--forcemakesgh label createsucceed on existing labels (updating color/description in place) and eliminates the paginated precheck entirely.Alternatives if a precheck is preferred: query each exact label through
gh api repos/$GITHUB_REPOSITORY/labels/<name>(single-resource GET, no pagination), or pass--limit 100to the existinggh label listcall.--limitmasks the immediate bug but reintroduces a hidden threshold as the label catalog grows, so--forceis the more robust fix.