A failed inspect or conversion hid the progress panel that held the
conversion log, cleared the selected archives and showed a single line,
so the only evidence of the failure was gone and a multi-GB input had to
be picked again. Compose the message with the phase, the current input,
the target, the libraries tag and the last 150 log lines, and show it in
the error box under "Failure details" so it can be copied into a report.
The report is a pure function in failure-report.mjs and is covered by
node tests.
The workflow and BUILD.md said ASAN_OPTIONS must end with ':' because tests append their own options with string_append. That is wrong: add_asan_test_options appends ':<options>', so ASAN_OPTIONS=detect_leaks=0 already gives detect_leaks=0:detect_stack_use_after_return=0 for the fiber test. Use detect_leaks=0 and remove the claim.
Point the known failures of agc_driver_pm4, agc_driver_graphics, agc_driver_graphics_maps_fallback and guest_convert_keycode at the pull requests that fix them, #10973 and #10968. With the misaligned loads fixed, agc_driver_graphics and agc_driver_graphics_maps_fallback stop on a second report, a TextureDetiler reference bound to a null pointer in Graphics/src/DepthSurface.cpp:730, so their reason names both.
Check that an empty testsuite and an empty testsuites file both exit with 2, print nothing and leave the --summary file untouched. The test fails with the previous behavior, which reported 0 tests and exit code 0.
A JUnit file without testcases, as ctest writes when it finds no tests in a build directory, gave '0 tests' and exit code 0, so a run that built nothing passed. Treat it as an unreadable report, with exit code 2.
When configuration failed, the test and summary steps still ran on the half-configured build directory, found no tests and reported success, so the failed run looked partly green. Gate the build, test and summary steps on the configure step; the job then fails at configuration alone. The build steps keep continue-on-error, so a target that fails to build still shows up as not-run tests.
The bundled SDL configuration stops without XRandR ('SDL has no XRandR support, so X11 display refresh rates cannot be queried'), as docs/dev/BUILD.md notes, and ubuntu-latest does not ship libxrandr-dev. Found by a run of the workflow on ubuntu-latest.
Document in BUILD.md, next to -DANYPS5_ENABLE_ASAN, what the Sanitizers workflow builds and runs, where the known failures are listed and what the job summary reports, and how to repeat a run locally: end ASAN_OPTIONS with ':' because tests append their own options, and set UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1 so undefined behavior fails the test.
Add the Sanitizers workflow. Every night at 03:41 UTC, and on workflow_dispatch, it builds the full runtime on ubuntu-latest with -DANYPS5_ENABLE_ASAN=ON and -fsanitize=undefined -fno-sanitize=vptr, building only the F16ToF32Unpack, F64FmaSubnormals and RegistrationPrepareShutdown AGC execution tests like the Windows MSYS2 workflow, and runs every registered test with ASAN_OPTIONS=detect_leaks=0: and UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1. ASAN_OPTIONS ends with ':' because tests append their own options with string_append. The build keeps going after a failing target, so its tests report as not run instead of hiding the rest. tools/sanitizer_report.py then writes the job summary from ctest's JUnit file and fails the job only for failures missing from .github/sanitizer-known-failures.txt. It reuses the submodule, ccache and FFmpeg caching of the Windows MSYS2 workflow, frees preinstalled toolchains the build does not use to make room for the instrumented objects, and uploads ctest.log and ctest.xml.
Parse .github/sanitizer-known-failures.txt for every sanitizer and check that its entries stay sorted by test name, so a malformed or misplaced entry fails the sanitizer_report test in the regular build of the pull request that adds it, instead of the next nightly run. Names that no longer match a test are reported by the nightly summary, since many test names are generated in CMake loops.
Add .github/sanitizer-known-failures.txt, one test per line with the sanitizers it fails under and the reason, for the tests that fail in an ASan and UBSan build of main: stack switches that ASan is not told about (fiber, guest_user_context), tests whose setup conflicts with ASan (guest_getrlimit, guest_pthread_stack, guest_backtrace), undefined behavior in third-party code (LibAtrac9, libvorbis), and bugs whose fixes are open pull requests (#9548, #9710, #9711, #10829, #10921) or still to be sent. Each reason quotes what the sanitizer or the test reports on a local run.