Summary
Regression from the #343 fix ("workflow-src checkout pollutes the
caller's tree during mutation runs", merged 2026-07-18): the new
"Relocate workflow source" step moves the checked-out workflow source
tree out of the caller's workspace (into $RUNNER_TEMP/workflow-src)
after the setup-rust composite action has already been invoked
from the local workflow-src/.github/actions/setup-rust path. When
that composite action's own post/cleanup step runs later in the job,
it can no longer find its action.yml at the original path, and the
job fails even though the actual mutation-testing step succeeded.
Observed
leynos/weaver run 29675944487 (2026-07-19, schedule, mutants job for
crates/weaverd/src/dispatch/handler/tests.rs +
tests_helpers.rs) failed the job despite "Run mutation testing"
completing successfully with mutation_cargo_exit_code=0 /
mutation_cargo_outcome=all mutants caught (0 mutants matched the
path filter, so [33m WARN[0m No mutants found under the active filters / "Found 0 mutants to test").
The job step sequence was:
5 Setup Rust success
6 Install cargo-mutants success
7 Run setup commands skipped
...
10 Relocate workflow source success (moves workflow-src out of the caller tree)
11 Run mutation testing success (0 mutants; exits 0)
12 Upload mutation report success
21 Post Setup uv success
22 Post Setup Rust FAILURE
23 Post Checkout workflow repository success
...
The failing "Post Setup Rust" step logged:
##[error]Can't find 'action.yml', 'action.yaml' or 'Dockerfile' under
'/home/runner/work/weaver/weaver/workflow-src/.github/actions/setup-rust'.
Did you forget to run actions/checkout before running your local
action?
i.e. the composite action's cleanup phase re-resolves its own path
under .../weaver/workflow-src/..., but step 10 ("Relocate workflow
source") has already mv'd that directory to
$RUNNER_TEMP/workflow-src earlier in the same job, per the #343 fix.
Because the job's overall conclusion is derived from all steps, the
run is reported as a failure even though mutation testing itself
passed with 0 survivors — a false-negative failure that will fire on
every mutants-job run downstream of the #343 fix landing (2026-07-18),
not just this one shard.
This run is unrelated to #183 (fixed by #184, merged 2026-07-18) and
unrelated to the separate sempai tracing-test baseline failure
(reported in leynos/weaver#209) — the mutation run itself is clean
here; only the post-job cleanup of the local setup-rust composite
action is broken.
Suggested fix
Composite/local actions resolve relative to the checkout that
referenced them at the point they were uses:-invoked; their post:
cleanup re-resolves the same relative path at the end of the job. Once
workflow-src is relocated out of the caller's tree (to satisfy
#343), any composite action invoked via a uses: ./workflow-src/...
reference stops working for its post: phase. Options:
- Invoke
setup-rust (and any other local composite actions with
post: cleanup hooks) from the relocated $RUNNER_TEMP/workflow-src
path from the start, so the reference stays valid for the whole job
lifetime, and only relocate files that are not referenced as
uses: ./... action paths after this point.
- Or: don't relocate at all — check out the workflow source into a
sibling directory outside the caller's tree in the first place
($RUNNER_TEMP/workflow-src), and have mutation_detect_changes/
hygiene-sensitive tooling reference that absolute path instead of
moving it out from under an already-registered composite action
mid-job.
- At minimum, mark the "Relocate workflow source" step to run only
after all uses: ./workflow-src/... composite actions for the job
have completed both their main and post phases, or split relocation
per-job so it happens after the last local-action reference.
References
Summary
Regression from the #343 fix ("workflow-src checkout pollutes the
caller's tree during mutation runs", merged 2026-07-18): the new
"Relocate workflow source" step moves the checked-out workflow source
tree out of the caller's workspace (into
$RUNNER_TEMP/workflow-src)after the
setup-rustcomposite action has already been invokedfrom the local
workflow-src/.github/actions/setup-rustpath. Whenthat composite action's own post/cleanup step runs later in the job,
it can no longer find its
action.ymlat the original path, and thejob fails even though the actual mutation-testing step succeeded.
Observed
leynos/weaver run 29675944487 (2026-07-19, schedule, mutants job for
crates/weaverd/src/dispatch/handler/tests.rs+tests_helpers.rs) failed the job despite "Run mutation testing"completing successfully with
mutation_cargo_exit_code=0/mutation_cargo_outcome=all mutants caught(0 mutants matched thepath filter, so
[33m WARN[0m No mutants found under the active filters/ "Found 0 mutants to test").The job step sequence was:
The failing "Post Setup Rust" step logged:
i.e. the composite action's cleanup phase re-resolves its own path
under
.../weaver/workflow-src/..., but step 10 ("Relocate workflowsource") has already
mv'd that directory to$RUNNER_TEMP/workflow-srcearlier in the same job, per the #343 fix.Because the job's overall conclusion is derived from all steps, the
run is reported as a failure even though mutation testing itself
passed with 0 survivors — a false-negative failure that will fire on
every mutants-job run downstream of the #343 fix landing (2026-07-18),
not just this one shard.
This run is unrelated to #183 (fixed by #184, merged 2026-07-18) and
unrelated to the separate
sempaitracing-test baseline failure(reported in leynos/weaver#209) — the mutation run itself is clean
here; only the post-job cleanup of the local
setup-rustcompositeaction is broken.
Suggested fix
Composite/local actions resolve relative to the checkout that
referenced them at the point they were
uses:-invoked; theirpost:cleanup re-resolves the same relative path at the end of the job. Once
workflow-srcis relocated out of the caller's tree (to satisfy#343), any composite action invoked via a
uses: ./workflow-src/...reference stops working for its
post:phase. Options:setup-rust(and any other local composite actions withpost:cleanup hooks) from the relocated$RUNNER_TEMP/workflow-srcpath from the start, so the reference stays valid for the whole job
lifetime, and only relocate files that are not referenced as
uses: ./...action paths after this point.sibling directory outside the caller's tree in the first place
(
$RUNNER_TEMP/workflow-src), and havemutation_detect_changes/hygiene-sensitive tooling reference that absolute path instead of
moving it out from under an already-registered composite action
mid-job.
after all
uses: ./workflow-src/...composite actions for the jobhave completed both their main and post phases, or split relocation
per-job so it happens after the last local-action reference.
References