Linux and macOS: a program asked is now waited for with waitid and
WNOWAIT, which leaves it unreaped. Once it has exited, its process
group gets SIGKILL, and only then is it reaped. While the leader is an
unreaped zombie, its group's number cannot be given to another group.
So this ends what the program left running behind it, whether or not
it answered, and nothing else. A program that does not answer in time
is stopped with its group before it is reaped, as before. Other Unix
systems keep the polling wait. On Windows the job's kill-on-close does
the same, and the new test runs there too.
A program file that is open for writing somewhere cannot be run for a
moment (ETXTBSY), for example one just written while another thread of
this process starts a program. A spawn refused so is now tried again
for up to 200 ms. This was a real flake in the tests that write
stand-in programs, and wai doctor itself asks several programs at once.
CI: wai/quickstart/test/archive_doctor.py runs bin/wai doctor --json
from an unpacked archive, with the archive's bin first on PATH. It
fails unless every install and stack check passes and each piece those
checks found is inside the archive. Without that, a relay elsewhere on
PATH or Studio's files from WAI_STUDIO would hide a piece the archive
lacks. Ports, browsers and the keystore are printed, not required.
stack.web and stack.studio now name their path in facts.
The release runs it on every leg that builds an archive: macOS where
the triple is the host's, Linux x86_64 and arm64, and Windows on the
staged directory. At PR time it runs on the macOS archive wai-examples
builds, the only archive built then. archive_doctor_test.py runs it
against stand-ins in wai-examples' portable job.
Real browsers on Linux: wai-studio's webkit job runs in the browser
image and builds wai. It now requires browser.conformance to pass with
that wai.
Co-Authored-By: Claude Opus 5.5 <[email protected]>