Offer the container line to both shells, and name the short-path requirement

The container recipe carried a PowerShell backtick continuation in a snippet
whose next paragraph invites a POSIX shell to run it, where a backtick is not a
continuation. A continuation has to pick a shell, so the line does not have one.
The Dockerfile's own copy of the recipe still mounted one machine's checkout by
absolute path; it mounts whatever checkout is running it, like the other two.

And the requirement a newcomer meets by tripping over it: on win32-x64 the
harness needs the checkout somewhere short. MSBuild's file tracker gives out on
long paths, so a run from a deep temporary directory fails the build for every
mutant, the no-op control included. That is loud — the harness stops on a red
control and prints what the child said — but what the child says is MSBuild, not
the path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-17 02:44:47 +02:00
commit c177533b4f
3 changed files with 22 additions and 8 deletions

View file

@ -110,11 +110,12 @@ mutation harness that drives the runtime-lifetime scenarios is a Node script and
a container that cannot run it cannot check the bridge it just built:
docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts
docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src `
cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native"
docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native"
Both lines are run from the repository root, and the mount is that root wherever
it is: `${PWD}` in PowerShell, `$(pwd)` in a POSIX shell.
it is: `${PWD}` in PowerShell, `$(pwd)` in a POSIX shell. The second is one line
because the shell it is offered to is not decided here; a continuation would have
to pick one, and a backtick pasted into a POSIX shell is not a continuation.
`--security-opt seccomp=unconfined` is load-bearing, not caution. The
ThreadSanitizer configuration needs the process's address space where it expects
@ -125,6 +126,13 @@ with "unexpected memory mapping" — a configuration that never starts, which a
mutation harness would otherwise read as every mutant being killed. The harness
stops with that diagnosis rather than reporting kills it did not earn.
The win32-x64 half of the harness needs the checkout somewhere short — near a
drive root rather than under a deep temporary directory. MSVC builds the bridge
and its scenario runner through MSBuild, whose file tracker gives out on long
paths, and the build then fails for every mutant including the no-op control.
The harness stops on a red control rather than reporting a table of kills, so
the failure is loud, but it names MSBuild and not the path.
Where an artifact was built is part of what it is. The Linux binary is linked
against Debian 13's glibc, so a build from anywhere else is a different artifact
whatever the file name says.

View file

@ -47,11 +47,15 @@
// dependencies:
//
// docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts
// docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src `
// cultlib-quic-native-dev bash -lc "node scripts/mutate-cultmesh.mjs native"
// docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src cultlib-quic-native-dev bash -lc "node scripts/mutate-cultmesh.mjs native"
//
// Both from the repository root; the mount is that root wherever it is, as
// `${PWD}` in PowerShell or `$(pwd)` in a POSIX shell.
// `${PWD}` in PowerShell or `$(pwd)` in a POSIX shell. The second is one line
// because a continuation would have to pick one of those shells.
//
// The win32-x64 half wants the checkout somewhere short, near a drive root. MSVC
// builds the bridge through MSBuild, whose file tracker gives out on long paths,
// and a run from a deep temporary directory fails its own no-op control.
//
// The seccomp flag is required, not cautious: the ThreadSanitizer configuration
// is re-executed under `setarch -R`, and Docker's default profile denies the

View file

@ -9,8 +9,10 @@
# runner that mutates it at all.
#
# docker build -t cultlib-quic-native-dev -f scripts/quic-native-linux-dev.Dockerfile scripts
# docker run --rm --security-opt seccomp=unconfined -v F:\Projects\CultLib:/src -w /src \
# cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native"
# docker run --rm --security-opt seccomp=unconfined -v "${PWD}:/src" -w /src cultlib-quic-native-dev bash -lc "scripts/build-quic-native.sh && node scripts/mutate-cultmesh.mjs native"
#
# Both from the repository root, and the mount is that root wherever it is:
# `${PWD}` in PowerShell, `$(pwd)` in a POSIX shell.
#
# `--security-opt seccomp=unconfined` is not optional and not caution. The
# ThreadSanitizer configuration needs the process's address space where it