RETROBIOS_IDLE_EXIT only counted while the first screen was up. Given
--platform, the check runs and the plan follows without a key, so the
close never came. It now counts from the end of the last run, as long as
no key has been pressed.
A --from folder holding the BIOS folder kept the list's own archive open
after listing its members, and Windows then refused to move it aside or
replace it. The index now notes the places a run writes, closes the
archives among them and opens them only for the read at hand.
Path.exists() lets PermissionError through, so a BIOS subfolder without
search permission stopped --check and installs before any file. The file
is now reported unreadable and the run goes on with the others.
gptokeyb2 owns the pad in muxterm on muOS with PortMaster, and muxterm keeps PgUp and PgDn for its scrollback. The launcher now says so with RETROBIOS_PAD=gptokeyb_muxterm, and the hints name the gptokeyb buttons with no paging key.
muxterm was allowed vendor and product 0001:0001, the id gpio-keys
gives the H700 pad on muOS before 2026-08-28: muxterm and gptokeyb2
both read it and every button acted twice. The allow-list is now
0000:0001, which SDL never reads back for a device (a vendor of 0 makes
a name GUID, read back as 0:0), so a pad plugged in later stays hidden.
- muxterm keeps PgUp and PgDn for its scrollback: in muxterm L1 and R1
send nothing, and the README and wiki stop promising paging there.
- The offline detection runs with RETROBIOS_INSTALL_OFFLINE=1 instead
of a closed loopback URL.
- Every launcher sets RETROBIOS_IDLE_EXIT=300 for the interface.
- ROCKNIX: control.ini's -sudokill goes through a sudo stub that runs
nothing, so the mapper starts with -1.
- The sentinel ends with its launcher, a closed terminal app writes its
status, a mapper lost mid-run is said and named (gptokeyb2 included),
and the unwritable-card message stays in view.
- Tests: an SDL GUID model, a gptokeyb2 that outlives its kill, an
interface that ignores SIGTERM, a zombie, a SIGHUP to the inner run,
arrow bytes at the question, ROCKNIX's sudo.
A server that took the connection and never answered held line mode
93 s, three waits of 30 s for a first byte. A file list now waits 15 s
per answer and asks a silent server twice. Downloads keep their own
timeout between chunks.
With --offline and no list, the full screen said No connection and
offered a Try again that could never work. It now names offline mode
and the two ways a run gets its list without the network. With a list,
the plan counted downloads the run forbids: it says what this machine
can supply and what needs the internet, and the printed command keeps
--offline.
The size column took half the line and cut every name to eleven
letters: Game Boy, Game Boy Advance and Game Boy Color read alike. A
system row now carries shorter size forms, and the longest one that
leaves the name whole is shown, none when that is what keeps it.
RETROBIOS_IDLE_EXIT=SECONDS: with no key on the first screen for that
long, before any choice, the interface exits 0 with one line. A mapper
that never opens the pad no longer freezes a handheld there.
A damaged member of a data tree's archive (zlib.error, EOFError) ended
the run on a traceback, and a failed write left its .part. --offline
refusing a data tree, or the download after a --from copy failed, lost
its kind, so the advice named the network instead of --offline.
A run given --dest detected nothing, so retroarch.cfg was never read:
the full screen, which names every folder, sent Azahar's keys.txt to a
guessed RetroArch/saves or dropped it without a word, where line mode
wrote it to savefile_directory. The configs are now read once when a
save directory is asked for, and the plan and the result say what was
left out.
--dest NOTMUOS/bios ended with MUOS/bios as text and passed as a muOS
card's folder. A card two systems claim now says so in one line, and
the system named among them decides the folder.
The line output printed the --from folder, the files found there and
the BIOS folder paths as they are: a name holding ESC drove the
terminal. screen_text moves out of the interface section and cleans
every line of the check, the copy plan and the unreadable list.
Each ZIP member read reopened its archive and parsed its directory
again: 4000 members of one size made 4000 parses. A folder index keeps
the archives it reads open, 16 at most, read under a lock from the copy
threads, and every index is closed at the end of the run. Archives the
list installs are still opened and closed at once.
A folder or a file the user cannot read at a destination ended --check
and the install on a traceback from the hashing pool. --check now gives
the reason per file, and the install fails that file alone, before any
download for a folder.
--declared-only settled each slot on its first declaration before the
cores narrowed the list, and the declared event judged the core copy
served in its place. Both now read the declaration whose systems
remain, as the platform checks it.
An owner file holding a number past a pid raised OverflowError before
the screen opened, and a full temp disk stopped the run on the owner
write. 0 and negative numbers are unknown owners, not process groups.
A closed window under a changing screen failed the draw (EIO, or a
termios.error from the SIGCONT that comes with SIGHUP) before the
signal was read, and the run ended on 1 with a crash log kept.
The hint bar, the help and the install's stop line read RETROBIOS_PAD:
gptokeyb, evmapy, muxterm and miyoo each name their own buttons and
none they lack. A desktop names keys only, SteamOS game mode and any
unknown run keep both names. On a Miyoo, A (Space) chooses, L1 and R1
page, and R2 goes back: B is Left Ctrl, which sends no byte alone.
SIGTERM and SIGHUP are handled from the start of the run, so a stop
during detection ends on the farewell. A closed window now ends with
129: once the last write fails, stdout and stderr point at /dev/null
and the flush at exit no longer turns the code into 120.
--offline (or RETROBIOS_INSTALL_OFFLINE=1, which the runs the
full-screen interface starts inherit) makes no network request. The
file list stops the run at once with an error event of reason
offline unless --manifest or --from-pack gives it, a file the run
would download fails at once with its own advice, and board detection
is skipped. --target and --list-targets refuse it. RETROBIOS_OFFLINE
is not reused: CI and the test suite set it for every process, and the
installer tests serve their files over loopback.
A connection now has 4 s to open, then the read keeps its 30 or 60 s
timeout: three tries that never connect end in about 15 s instead of
93, and a slow but open transfer is not cut.
A --dry-run prints its totals first. A plan taller than the screen
names the ten largest systems, and --verbose lists every system and
file. Events are unchanged.
validate_schemas.py read install-events.schema.json from the real tree while a test pointed ROOT at a scratch one, and test_schema_semantic_gate.py called unittest.main() before its last class.
The render step's npm build wrote Node's compile cache to /tmp, a 4 GB
tmpfs on this host, and a day of pipeline runs filled it to 3.4 GB.
Every child the pipeline starts now carries NODE_DISABLE_COMPILE_CACHE=1.
select_views stopped on the first repository that answered as gone, so
yuzu's source_mirror was never read and the profile stayed unchecked. A
gone repository is now passed over, and a profile declared gone that
answers only through its mirror is not reported as a contradiction.
--declared-only keeps the entries the platform's own list declares
(cores: null), each slot settled to the platform's copy with no core
alternative left behind. Install, --check, --dry-run, --events,
--list-systems, --system, --region, --emulator, --target,
--installed-cores, --manifest and --from-pack apply it. --core,
--list-cores, --list-emulators, --list-platforms, --list-targets,
--standalone-copies, --restore and --tui refuse it, and the interface
does not open by itself with it. On Batocera it gives 353 files of
14531, the list batocera-systems checks.
Event decision: no schema bump. A `declared` key on `file` would add a
key to an existing kind, which schema 1 forbids. A new kind, `declared`,
follows `check` with the same counts over the platform's own files and
their dests in file-event order. Readers already skip a kind they do
not know (rbevents.py and the interface reader were checked), so
EVENT_SCHEMA stays 1.
An unknown --system is answered with the systems the list files its
key file under: --platform retroarch --system snk-neogeo now suggests
arcade, which holds neogeo.zip, instead of snk-neogeo-cd. neogeo, mvs
and aes follow the same route. Never taken, only suggested. A system
title the manifest carries (SNK Neo Geo CD) is taken for its id when
no other system shares it and no platform name reads the same.
schemas/install-events.schema.json is written from EVENT_KEYS by
scripts/generate_event_schema.py. validate_schemas.py reports a stale
file, and tests compare it with EVENT_KEYS and validate a real run.
Bootstrap pins recomputed.
Inline code of 30 characters or fewer is marked rb-short at build time and the options table rb-options. The search UI loads on first use. Title, crumbs and footer leave the search index, and consoles and terms weigh as a title.
The lookup reads every hash of a matched file, so its MD5, SHA1, CRC32 and SHA256 give one answer. The OS tabs open on the visitor's system unless a choice is saved, and the sidebar shows the current page.
Every launcher exports RETROBIOS_PAD: gptokeyb, muxterm, evmapy or
miyoo, so the interface can name the buttons that reach it. The wiki
lists the values, and the tests check each launcher's.