core_probe options --emulator, --subject and --supersedes, the record split into line and sidecar, sync_measurements.py and what the site build compiles from the pin.
Each emulator with records gets a Tested block: claim, result, method, computer, core build and the permalink of its record at the pin. A Measurements page filters every test in the browser from the compact index, and the Data page lists measurements.sqlite with its tables. One SQLite file per emulator is linked from its page. wiki/measurements.md says how a test runs, held to the Start here budgets.
Both workflows fetch the pinned commit alone with git before the build, and the deploy fails without it.
The probe skipped run_cli, accepted option prefixes in its shared options, left three options undocumented and was missing from the published schemas. The worker runs under -I, so the script directory is put back on sys.path before importing common.
installer.md: one card reading, AmberELEC and EmuELEC cards, device names in the setup list and the line menu, the copy browser on the first mounted card, offline endings, the refused --dest in the exit table. first-install.md: a handheld found by its name, Finished with files missing.
A check is inconclusive when the compared observable differs between repetitions, a run fails to load or a file changes during it. A disagreement on another observable stays flagged without voiding the comparison. Core log lines name the staged directories instead of the host paths.
core_probe.py loads a libretro core with no window, runs it for a
number of frames and reports the files it opened (strace), its log
lines, frame, audio and save-state hashes and its speed. bench repeats
a run after warm-up and gives median, mean, deviation and range; check
swaps one system file between runs and compares one observable.
--record writes a JSON record with the core build, frontend commit,
host and every input by hash, validated against
core-probe-record.schema.json. A busy host is refused, and a
repetition that disagrees with the first is flagged.
A project that tags without releases (eightyone, higan) was never compared,
and a core_version naming no tag (parallel-launcher 9.0.5 beside v9.0-6)
silenced the passed-release warning. The newest tag stands in when it is a
version number, and an untagged core_version is compared by number within
one scheme. --emulator is repeatable: a stored value kept only the last.
The installer page says what a card system named on a computer does
(Where is the SD card?, Look again, the Card root prompt), that Enter on
None unticks every system and Back keeps the ticks, and that Space
continues outside a list of ticks. KNULLI and ROCKNIX no longer have a
computer default. The first-install page names the card screen.
A long systems list opens on None. A there unticks every system and
moves to the first one, and A on a system with nothing ticked installs
that one alone, so Enter still continues. Inside muxterm, which keeps
PgUp and PgDn for its scrollback, Left and Right on the D-pad page.
One system of 66 at 40x15 took 17 presses with a pad, 57 in muxterm;
it now takes 12 on both. The pyyaml check of the device lists skips
where pyyaml is not installed.
A system that runs from its SD card (Onion, spruceOS, muOS, KNULLI,
MinUI...) named with --platform on a computer no longer takes that
computer's RetroArch folder: one mounted card of that system is used,
at a terminal the card root is asked, without questions the run stops
on the --dest example. The interface opens the card screen with the
mounted cards first.
The result pager scrolls and counts lines, so its last line is
reachable at every size. The setup filter knows the devices each
setup runs on, from the guides and the firmware pages. A new event
kind, data, gives the bytes of the data trees, and the plan shows
them.
The README, the installer steps, the choice of what to install and platform detection still described the line prompts as what a terminal shows. They now name the full-screen interface first, with --plain for the questions, and say that no default folder is taken where detection was refused.
A platform list that declares one path for two files fails one of the
two checks on every install. The export report lists each declaration
with its hash and the emulators whose profile reads that file.
One closed folder under HOME (~/.config/EmuDeck at 000) made the whole
detection return nothing: a RetroArch whose retroarch.cfg was readable
was lost and the run fell back to a folder it does not read. Every
detection probe now goes through _exists, _is_dir or _is_file, which
count a refused place as absent, name the closed folder once, and let
the other probes go on. The decorator stays as the last net.
The refusal is an unsearched event before detect. The interface keeps
the line above the list of setups. At HOME or a drive root A goes into
a visible subfolder, never a card or drive row nor .cache, and with
none it stays on Use this folder and says where it is. A default folder
taken because the platform was not found is no longer called detected.
HOME kept across su without - made every detection probe raise PermissionError, and the run and the interface ended on a traceback. Detection now finds nothing there, says which folder this user cannot open and how to go on, on the first screen too.
A system_directory read from retroarch.cfg under a folder this user cannot open ended the run, and the interface before its first screen, on a traceback. It now gets the refusal --dest gets. On a handheld, an idle close on an error screen shows that error for a few seconds instead of waiting for a button that cannot come.
An idle close exited 0 on every screen, an error one too. It now exits with the error's or the result's code and prints that screen's words after the idle line.
Path.exists() raised PermissionError from _missing_dest in line mode and from _choose in the interface. The run now names the folder and exits 1 (error event stage dest), and the interface asks for another folder.