Workflow run
https://github.com/OpenStaticFish/ZigCraft/actions/runs/29395853245
Scheduled visual-test run #21 on commit d0e348c (dev).
Failure evidence
build-output.log is absent from the workspace. This is not an engine logging failure: current check-step metadata shows that the game command was never started.
| Step |
Result |
| Ensure visual-test label exists |
failure (07:02:39-07:02:40 UTC) |
| Setup Lavapipe Vulkan |
skipped |
| Run menu screenshot capture |
skipped |
| Check screenshot exists |
success, screenshot_exists=false |
| Check build log exists |
success, exists=false |
| Upload build log artifact |
skipped |
The relevant duplicate-label failure from this unchanged command path is:
label with name "run-visual-test" already exists; use `--force` to update its color and description
##[error]Process completed with exit code 1.
The current action log could not be downloaded through REST because the workflow token is rate-limited, but GraphQL check-step metadata confirms the same step boundary, and the repository state still reproduces the exact guard condition: gh label list defaults to 30 labels, the repository has 41, visual-test is position 21, and run-visual-test is position 41. The identical error above was captured from the same step and command in #916.
The only local runtime log is weston.log, showing that Weston initialized successfully and was terminated immediately after the preflight failed:
[07:02:38.815] Command line: weston --socket=headless --backend=headless-backend.so --width=1280 --height=720
[07:02:38.820] Output 'headless' enabled with head(s) headless
[07:02:40.312] caught signal 15
There are therefore no Vulkan instance/device errors, swapchain errors, shader failures, screenshot staging/fence/write errors, panics, or segfaults in this run: none of those paths executed.
Root cause
The Ensure visual-test label exists shell step in .github/workflows/visual-test.yml:55-69 checks label existence with:
gh label list --json name --jq '.[].name'
gh label list has a default --limit 30. The repository currently has 41 labels and run-visual-test is item 41 in the returned ordering. The guard at .github/workflows/visual-test.yml:62 therefore incorrectly treats the existing label as missing and invokes gh label create "run-visual-test" at line 63. gh label create returns non-zero because that label already exists, aborting the step and skipping all subsequent non-always() steps.
Because .github/actions/run-with-log/action.yml:33-34 is only entered by the skipped screenshot step, its initial tee never creates build-output.log.
This is a recurrence of #916, #931, and #935; the recommended pagination/idempotency fix has still not landed.
Source trace
The failure originates in the workflow shell guard, not a Zig function:
.github/workflows/visual-test.yml:55-69 — failing Ensure visual-test label exists step.
.github/workflows/visual-test.yml:62-65 — false negative followed by duplicate gh label create.
.github/actions/run-with-log/action.yml:33-34 — would create build-output.log, but was skipped.
The requested engine paths were inspected and are downstream of the skipped command:
src/game/app.zig:243-251 loads the menu in screenshot mode; App.runSingleFrame requests capture at src/game/app.zig:467-520.
modules/game-ui/src/screens/home.zig:33-41 initializes HomeScreen and its preview.
modules/engine-graphics/src/vulkan_swapchain.zig:120-167 creates the offscreen transfer-source image.
modules/engine-graphics/src/rhi_vulkan.zig:409-413 forwards capture to screenshot.requestCapture.
modules/engine-graphics/src/vulkan/screenshot.zig:23-75 allocates the staging capture and :188-206 waits for completion and writes the image.
modules/engine-graphics/src/vulkan/rhi_init_deinit.zig:26-43 initializes the Vulkan device, frame manager, swapchain, and pipelines.
None of these functions ran in workflow run #21.
Suggested fix
Minimal fix: fetch enough labels in both guards. gh label list supports --limit, not --paginate:
- name: Ensure visual-test label exists
run: |
if ! gh label list --limit 100 --json name --jq '.[].name' | grep -q "^visual-test$"; then
gh label create "visual-test" \
--description "Issues from automated visual regression tests" \
--color "E06C75"
fi
if ! gh label list --limit 100 --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
More robustly, make label maintenance idempotent and non-blocking so API quota or label metadata cannot disable visual testing:
- name: Ensure visual-test labels exist
continue-on-error: true
run: |
gh label create visual-test --description "Issues from automated visual regression tests" --color E06C75 --force
gh label create run-visual-test --description "Run deterministic visual regression workflow on a PR" --color E06C75 --force
The label setup could also be removed from this workflow entirely because both labels already exist. After fixing the preflight, rerun the workflow to obtain the first meaningful Vulkan/screenshot result.
Workflow run
https://github.com/OpenStaticFish/ZigCraft/actions/runs/29395853245
Scheduled visual-test run #21 on commit
d0e348c(dev).Failure evidence
build-output.logis absent from the workspace. This is not an engine logging failure: current check-step metadata shows that the game command was never started.screenshot_exists=falseexists=falseThe relevant duplicate-label failure from this unchanged command path is:
The current action log could not be downloaded through REST because the workflow token is rate-limited, but GraphQL check-step metadata confirms the same step boundary, and the repository state still reproduces the exact guard condition:
gh label listdefaults to 30 labels, the repository has 41,visual-testis position 21, andrun-visual-testis position 41. The identical error above was captured from the same step and command in #916.The only local runtime log is
weston.log, showing that Weston initialized successfully and was terminated immediately after the preflight failed:There are therefore no Vulkan instance/device errors, swapchain errors, shader failures, screenshot staging/fence/write errors, panics, or segfaults in this run: none of those paths executed.
Root cause
The
Ensure visual-test label existsshell step in.github/workflows/visual-test.yml:55-69checks label existence with:gh label list --json name --jq '.[].name'gh label listhas a default--limit 30. The repository currently has 41 labels andrun-visual-testis item 41 in the returned ordering. The guard at.github/workflows/visual-test.yml:62therefore incorrectly treats the existing label as missing and invokesgh label create "run-visual-test"at line 63.gh label createreturns non-zero because that label already exists, aborting the step and skipping all subsequent non-always()steps.Because
.github/actions/run-with-log/action.yml:33-34is only entered by the skipped screenshot step, its initialteenever createsbuild-output.log.This is a recurrence of #916, #931, and #935; the recommended pagination/idempotency fix has still not landed.
Source trace
The failure originates in the workflow shell guard, not a Zig function:
.github/workflows/visual-test.yml:55-69— failingEnsure visual-test label existsstep..github/workflows/visual-test.yml:62-65— false negative followed by duplicategh label create..github/actions/run-with-log/action.yml:33-34— would createbuild-output.log, but was skipped.The requested engine paths were inspected and are downstream of the skipped command:
src/game/app.zig:243-251loads the menu in screenshot mode;App.runSingleFramerequests capture atsrc/game/app.zig:467-520.modules/game-ui/src/screens/home.zig:33-41initializesHomeScreenand its preview.modules/engine-graphics/src/vulkan_swapchain.zig:120-167creates the offscreen transfer-source image.modules/engine-graphics/src/rhi_vulkan.zig:409-413forwards capture toscreenshot.requestCapture.modules/engine-graphics/src/vulkan/screenshot.zig:23-75allocates the staging capture and:188-206waits for completion and writes the image.modules/engine-graphics/src/vulkan/rhi_init_deinit.zig:26-43initializes the Vulkan device, frame manager, swapchain, and pipelines.None of these functions ran in workflow run #21.
Suggested fix
Minimal fix: fetch enough labels in both guards.
gh label listsupports--limit, not--paginate:More robustly, make label maintenance idempotent and non-blocking so API quota or label metadata cannot disable visual testing:
The label setup could also be removed from this workflow entirely because both labels already exist. After fixing the preflight, rerun the workflow to obtain the first meaningful Vulkan/screenshot result.