One cross on the port's launcher starts the shareware episode, whose
attract loop then plays the WAD's recorded demos: the same gameplay on
every run, without a wall-time input timeline.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A title's pad entry in titles.json holds a pad_timeline.py timeline;
each run points APS5_PAD_INPUT_FILE at the work directory and queues it
after_s seconds after start, so titles that wait on their start screen
reach gameplay. Celeste Classic (PPSA59322) starts a game and moves.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Apply review request from 2026-11-01: catch (NotImplementedError, OSError) around only the two symlink_to calls and report an unavailable capability through skipTest, so the test no longer raises PermissionError before the subprocess starts on hosts without symlink privilege. The subprocess and the exit-code, message and no-traceback assertions stay outside the catch; the production change is untouched.
Co-authored-by: rooklz <[email protected]>
The release archives carry mimalloc's binaries on Linux and Windows, so
they now also carry its MIT licence as libs/licenses/mimalloc.txt, and
packaging fails without it. USAGE.md and ENVIRONMENT.md say that
APS5_MIMALLOC and LD_PRELOAD stay set after the restart and state the
memory cost measured with it, and the restart's debt entry says that
only the log-file copy is handed back before execv.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015W3M6NbYpmwWkzkL8YNLaF
With APS5_MIMALLOC set, libkernel restarts the title with
libmimalloc.so from libs/ first in LD_PRELOAD, as it does on macOS
with DYLD_INSERT_LIBRARIES. The macOS restart becomes one
implementation with platform pieces (MimallocRestart.cpp): on Linux
the executable is the target of /proc/self/exe and the arguments
those of /proc/self/cmdline. The restart is a priority 101
constructor, so it runs before libkernel's other initializers. It
gives the standard streams back from an ANYPS5_LOG_FILE copy before
execv, which also fixes the macOS restart under that variable, and
refuses a path the preload list cannot hold.
The build copies libmimalloc.so beside the libraries except in ASan
and TSan builds, the Linux release archives ship it, and the restart
tests run on Linux too, with a new case for ANYPS5_LOG_FILE.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_015W3M6NbYpmwWkzkL8YNLaF
#9332 made 0x400000 the default base of Windows executables, as #8973
did on Linux, so the three titles that read their GOT at that base no
longer need fixed_base in titles.json: with a plain relink their guest
image starts at 0x400000 and all three render.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
titles.json no longer takes a name: a run is labelled with the package's
own param.json title name. discover() checks the param.json titleId with
the same pattern as the catalog keys, since it names the work directory
that prepare() empties.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The report took the commit of the checkout holding title_run.py, which
is wrong when --build points at another checkout. The source directory
now comes from the build's CMakeCache.txt.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
A non-string env value or relink flag passed validation and stopped the
batch when the title started. List and env items must now be strings, a
param.json without titleId names its file, and the input field, which
nothing ran, is no longer accepted.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
On macOS, killpg on a group whose processes are all exiting fails with
EPERM instead of ESRCH, which made alive(), close() and kill() raise and
end the batch. The SessionTests failure showed up on macOS runners.
Co-Authored-By: Claude Opus 5.5 <[email protected]>