Bash process substitution fails inside job sandboxes because /dev/fd does not exist.
Observed in zut CI run 65 (test (ubuntu-latest), step 'release-version policy'):
next-release-tag.sh: line 42: /dev/fd/63: No such file or directory
The script uses done < <(git rev-list "$range"). The same script passes on GitHub-hosted runners.
Cause: internal/guest/vmsetup.go mounts devtmpfs, devpts and /dev/shm, but never creates the standard /dev symlinks. On GitHub's image systemd/udev creates them; devtmpfs alone does not.
Fix: after the /dev mounts in the guest init, create (ignore EEXIST):
- /dev/fd -> /proc/self/fd
- /dev/stdin -> /proc/self/fd/0
- /dev/stdout -> /proc/self/fd/1
- /dev/stderr -> /proc/self/fd/2
- /dev/core -> /proc/kcore (optional, systemd does it)
Acceptance: a job step running bash -c 'cat <(echo ok)' and echo ok > /dev/stderr succeeds. Add a conformance case if ermite-conformance covers the job environment.