Repository navigation
feat(tools): run titles repeatably and report their outcome - #7264
Open
LeandroLP23 wants to merge 26 commits into
Open
LeandroLP23 wants to merge 26 commits into
LeandroLP23 wants to merge 26 commits into
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…two runs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the job cannot hold the title Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…of failing Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d summary.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…as an error Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ompare is wrong Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Report the last process's exit code after LoadExec on Windows, keep the batch when one package cannot be prepared, write summary.json after each title, default --out to build/title-runs, skip non-object summary lines, drop inherited shader cache variables. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Some comparisons could not be completed because a pull request conflicts with the base branch. Review these shared files manually before concluding that there is no overlap.
|
…ch title at one path A crashing title brings Windows Error Reporting into the job, and its exit code of 0 hid the crash: the exit code now comes only from processes whose image is inside the title's folder. Relinker FAIL lines count as errors, and the catalog titles that need --trap-sdk-syscall-stubs have it in titles.json. Each title is prepared in <out>/work/<ID>, the same path on every run, so a firewall prompt appears once per title; its relink.log is copied into the run's folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LeandroLP23
marked this pull request as ready for review
October 17, 2026 21:50
A WinEvent hook on the title's process moves each new top-level window past the right edge of the virtual desktop when it is created or moved, so it no longer flashes at the centre of the screen until the next poll. The move is asynchronous, so a title that stops pumping messages cannot stall the run past its time limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…by default Without a console, Windows adds conhost.exe to the job, and its exit code 0 replaced the title's when no folder was given. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Windows placed past the desktop edge could not be looked at. They now keep their position and go to the bottom of the z-order without focus when created or shown, so the run stays out of the way and the window can be brought forward from the taskbar. A window is sent back once, so it stays in front after the user raises it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ScreenTester5 presented twice in 60 s, just before the run ended, and was reported as rendering with no frame kept. A run that never presents enough for a frame to be dumped is now stalled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
11 tasks done
Running a few titles against a full earlier summary listed every other title as missing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When no title wrote a trace summary, the header read ". , , driver , CPU". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 18, 2026
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 <noreply@anthropic.com>
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 <noreply@anthropic.com>
Contributor
Author
|
Two questions before this gets reviewed, so I can adjust it first:
AI-assisted |
This was referenced Oct 18, 2026
… as stalled Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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 <noreply@anthropic.com>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A tool for running titles you already have the same way every time, so a run can be attached to a PR or an issue and compared with an earlier one.
python tools/title_run.py --games <directory> [ID ...]finds extracted packages (eboot.binandsce_sys/param.json) under--games, unwraps the SELFs withtools/unwrap_self.py, relinks with the title's flags and lays the title out asdocs/user/USAGE.mddescribes. It then runs each title--runstimes (default 2: a cold run with empty AnyPS5 shader cache and pipeline journal, then warm runs) and decides each run's outcome by itself:relink-failedcrashedexitedstalledaps5-summary.jsonlline in the last 20 s (no presents), or too few presents for a frame to be dumpedblankrenderingIt writes
summary.jsonand asummary.mdtable with fixed columns (title, ID, version, cold, warm, FPS, first error) underbuild/title-runs/<commit>-<time>/, keeping the first, middle and last dumped frames of each run.--compare <summary.json>adds a Before column and lists regressions, improvements and titles missing from the new run; when IDs are given, only those are compared.tools/titles.json: extra relink flags,fixed_base(mapped to--windows-fixed-base/--linux-fixed-base),executablesforLoadExectargets, run length and environment. It holds the flags the catalog titles need today (VLC, Ruffle Flash and XPSemu at 0x400000, RetroArch'spicker/picker.bin, the--trap-sdk-syscall-stubstitles)..gitignoregets!tools/titles.json, next to the existing!demo/web/i18n/*.json.sceSystemServiceLoadExechand-overs included), and the run's exit code is that of the newest process whose image is inside the title's folder. On Linux it is a process group. A title is always ended at the deadline (close, 15 s grace, then terminate), and nothing is left running.SDL_AUDIODRIVER=dummy). On Windows there is no console window, the title's windows never get focus and go behind every other window as soon as they are created (a WinEvent hook, so they do not flash in front first). They keep their position and can be brought forward from the taskbar. They are not minimized, because presents stop while a window is minimized.VkCachecannot be redirected and is left alone;summary.jsonrecords it as not isolated.Unit tests:
tools/tests/test_title_run.py, registered astitle_run. They cover outcome classification from synthetic logs, summaries and BMPs (including truncated ones), relink arguments, the report and comparison, package discovery, and the process session with real child processes. Docs: a section indocs/dev/TRACING.md.Tested
Windows 11 (26300), Radeon 860M (RDNA 3.5, driver 32.0.13058.8001), Ryzen AI 7 350, WinLibs GCC 15.2.0, Release.
tools/tests/test_title_run.pyon Linux and macOS (GitHububuntu-latestandmacos-latest, Python 3.12, on a throwaway fork branch, because this pull request's CI skips the build jobs): 10 runs of 10 on each. The first try failed on macOS, wherekillpgon a group whose processes are all exiting fails withEPERM;alive(),close()andkill()now treat that as still exiting.python tools/tests/test_title_run.py: 24 OK.ctest -R '^(title_run|test_registration|conventions_doc_links)$': 3/3.tools/check_conventions.py --base origin/mainpasses.The local homebrew catalog, 66 titles,
main5859889b2with this branch, one 60 s run each, then the 22 titles that did not reachrenderingagain with--runs 2 --compare <first summary.json>. Nothing was left running after either batch. Windows Firewall asked about titles that open a port (answering Cancel does not affect the run); titles are now prepared at a fixed path so it asks once per title.The 22 titles again on
main1c523bdb4,--runs 2 --compareagainst the table below: RommPS now renders cold, Mortalfin's cold run hit the 10 s GPU watchdog (has not reached submission 10) like ProsperoAI and RetroArch do, everything else matched. ProsperoPuzzles renders with fix(agc): run the unwatch hook when a watched import leaves the write watch #6308 on top (29.2 FPS, cold and warm). ScreenTester5 had shownrenderingfrom two presents just before the deadline, which led to the frame rule forstalled.rendering: 48. 40 on the first pass. SuperTuxKart (PPSA69421) and ProsperoEden (PPSA99008) needed--trap-sdk-syscall-stubs, now intitles.json. Mortalfin (PPSA99141) and Nuvio (PPSA99997) render on both runs of the second pass. ProsperoAI (PPSA99004), RetroArch (PPSA99169), RommPS (PPSA76677) and PS5 OpenGL Showcase (PPSA99005) render only warm: cold, they stop on the PS5 RADV port's 10 s submission wait while their first pipelines build, which the Cold and Warm columns now show directly.exitedfor the crashing titles was a bug found by that pass: a crash brings Windows Error Reporting into the job, and its exit code 0 was taken for the title's. The exit code now comes only from processes inside the title's folder, so these show ascrashed(for example ProsperoPuzzles with 0xC0000409, the abort of AGC: since #6060, ProsperoPuzzles (PPSA99006) stops at 5 s with the storage-image write-back throw on Windows #6301).valvefolder, a GZLE01 disc image,.pk3files); PICO-8 needs elfldr; FSR4 Showcase gives up on the build time of its FSR4 pipelines in a first run (AGC: PS5 FSR4 Showcase (PPSA99011) gives up in its first FSR4 pass while the queue worker builds 130k-800k-word compute pipelines (up to 66 s each on AMD) #6118). OpenNOW reached its sign-in screen at 25.8 FPS ond8888df9b(catalog) and stops after a few presents here: its sign-in screen redraws only when its view changes and still answers input, sostalledis expected there (OpenNOW PS5 (PPSA99082) presents only on view changes; older builds' continuous presents were likely padding residue #7501).eboot.binis neither an ELF nor a SELF givesrelink-failedwithRefused: file is smaller than the SELF header area; the batch carries on and writessummary.json.Not tested: real titles on Linux and macOS, NVIDIA, Intel. Known limits: a
LoadExecchild that starts and exits within one poll (0.1-0.5 s) is not seen, and the parent's exit code is used;app0is hard-linked to the user's package when the file system allows it; two invocations sharing one--outsharework/<ID>.Checklist
main; no other open PR implements the same functionsNotImplemented_nid_no_patch); silent stubs are listed under Silent stubs in their library's technical debt file.mdfiles or images added to the repository (attach them to this PR)