diff --git a/references/changelog.md b/references/changelog.md index 9d9b524..08aebba 100644 --- a/references/changelog.md +++ b/references/changelog.md @@ -2,6 +2,25 @@ Record each change to the skill together with the evidence that motivated it. +## 2026-10-01: the stopgap no longer forces CARGO_TARGET_DIR + +In idunn-watchdog's Idunn incident cut, Soul pass s3 ran cargo-mutants twice +on the same two mutants with `--jobs 3`, and the two runs gave opposite +verdicts. The cause: `ygg-verify.sh` passed `-e CARGO_TARGET_DIR=/src/target` +to every container. cargo-mutants gives each worker its own copy of the tree, +but the forced variable points them all at one target directory, so a worker +can test another worker's binary. With the variable unset, `true` was reported +missed and `false` caught, which is the right answer. + +Every `--jobs` greater than 1 mutation count reported through the stopgap +before this change is unreliable. That covers both sessions' campaigns. A +survivor may have been reported caught, or a kill reported missed. Treat those +counts as unproven, and rerun a cut's mutation evidence when its rule matters. + +What changed: the variable is gone. Cargo's default, `/target`, is +already inside `/src`. The scar about not sharing build output between +checkouts still stands, and cargo's default honours it. + ## 2026-09-30: Soul pays for each rerun once The sccache measurement below showed that verify-slot queueing dominates a diff --git a/tools/stopgap/ygg-verify.sh b/tools/stopgap/ygg-verify.sh index d81d99c..8e35fb3 100644 --- a/tools/stopgap/ygg-verify.sh +++ b/tools/stopgap/ygg-verify.sh @@ -22,6 +22,10 @@ # 3. Runs in under a CPU and memory cap, niced. Each # toolchain gets one shared registry cache. The build output directory # stays inside the work directory and is never shared between checkouts. +# CARGO_TARGET_DIR is deliberately NOT set: cargo's default (/ +# target) is already inside /src, and forcing it made cargo-mutants' --jobs +# workers share one target dir and test each other's binaries, so parallel +# kill counts were noise (Soul, idunn-watchdog, 2026-10-01). # 4. Removes the work directory unless KEEP=1, and exits with the job's status. # # At most $SLOTS jobs run at once on Yggdrasil. The operator raised this to 3 on @@ -190,7 +194,7 @@ sudo nice -n 10 docker run --rm --name "$cname" --cpus="$cpus" --memory="$mem" \ -v "$work:/src" -v /etc/machine-id:/etc/machine-id:ro \ -v eureka-cargo-registry:/usr/local/cargo/registry -v eureka-nuget:/root/.nuget/packages \ -v eureka-sccache:/sccache \ - -e CARGO_TARGET_DIR=/src/target -e BASH_ENV=/tmp/.ygg-bash-env \ + -e BASH_ENV=/tmp/.ygg-bash-env \ -e GIT_CONFIG_COUNT=1 -e GIT_CONFIG_KEY_0=safe.directory -e GIT_CONFIG_VALUE_0='*' \ $docker_args \ -w /src "$image" bash -o pipefail -c "printf 'set -o pipefail\n' >/tmp/.ygg-bash-env; $cmd"