The WebUI's new SMB page signs in to one server (guest or a user and
password), lists its shares, checks a share and folder and saves them in
config/smb.cfg on the console; the password is never answered back.
RetroArch's file browser shows the share as SMB, after INTERNAL and
EXTERNAL. smb:// paths go through RetroArch's VFS to src/ps5_smb_vfs.c
(patches/series 0136), read-only and only on the saved server: a core that
reads through the VFS streams the file, one that opens paths itself gets a
copy in /app0/smb-cache, removed when the content closes.
libsmb2 is pinned at the master revision itsPLK/ps5-pkg-manager runs on the
PS5 (LGPL-2.1-or-later), built by tools/build-libsmb2.sh for the PS5 and the
host and listed in tooling/notices/components.json: RetroArch 1.22.2 has no
SMB client. In a title, getaddrinfo is bound to the platform layer's, which
resolves nothing, so libsmb2's resolver calls go to RetroArch's own
(src/platform_wraps.c); readv, writev, getlogin_r and getprotobyname are
wrapped, so libsmb2 adds no import. SMB sockets set SO_NOSIGPIPE.
Evidence: evidence/smb-load-content (python3 tools/evidence.py compare
evidence/): on the Base PS5 the console's WebUI listed the PC's guest share
and saved share/smb-test; Load Content > SMB listed it and a homebrew NES
ROM on it ran under FCEUmm, read through the VFS (build a2c7800a,
retroarch.log read back over FTP).
Gates: tools/verify.sh (format, unit 214, build, integration, evidence 140)
with PS5_REUSE_STAGED_CORES=ps5sx2: in this worktree the SDK's prospero-lld
wrapper adds -pie to ps5sx2's link (clang passes its long object list in a
response file the wrapper cannot read), so ps5sx2 is the main checkout's
build of the same pinned revision. Host tests run a Samba server of their
own (tests/smb_server.py, no root).
Co-Authored-By: Claude <noreply@anthropic.com>
A home screen tile is a title of its own (PPSA99170 to PPSA99269) that starts one
game in RetroArch. Titles cannot launch titles (sceSystemServiceLaunchApp returns
0x8094000F from one, sceLncUtilLaunchApp is a null import), so the tile hands a
payload to the console's ELF loader on 127.0.0.1:9021 and exits:
- forwarder/tile.c: the tile's eboot.bin. Reads its title id from
/app0/sce_sys/param.json, stamps it into /app0/launch.elf's slot, sends it to
the loader, logs /app0/tile.log, and leaves through LoadExec("exit") (a return
from main ends in a SIGSYS error notice).
- forwarder/launch.c: the payload. Reads /data/homebrew/<tile>/forward.txt (one
argument a line: --rom, --core, --exit-after-game, src/frontend_mode_ps5.cpp),
waits for the tile to leave, and starts PPSA99169 with those arguments through
sceLncUtilLaunchApp (sceSystemServiceLaunchApp as the fallback).
- tools/build-forwarder.sh builds both; tools/build-title.sh puts them in
dist/PPSA99169/forwarder/ and counts them in the title's identity; the notices
cover both files.
Evidence:
- host: python3 -m unittest tests.test_forwarder (the tile stamps and sends the
payload byte for byte, refuses a lowercase id, a missing or a doubled slot; the
payload passes the five arguments, falls back to SystemService, and an
unstamped payload starts nothing) - OK.
- console (base PS5, 13.40, ShadowMountPlus 1.7-beta5fix1), the test tile
PPSA99170 registered through ShadowMountPlus's manual list:
tile.log "tile PPSA99170: launch payload 110832 bytes, 110832 sent to
127.0.0.1:9021 (errno 0)"; launch.log five arguments, sceLncUtilLaunchApp
00002018; RetroArch's trace "forwarder: /app0/content/nes/<game> with
/app0/cores/fceumm_libretro.so, closing after it"; the tile exited cleanly
(no error notice), back to the home screen after the game.
- gates: format, unit (206 tests), build (tile 11,123 B, payload 110,832 B),
integration (206 tests; a first run timed out starting two scraper test
servers under load, both passed alone and on the rerun), evidence - PASS.
From mihawk-99/PS5_RetroArch#53 and #52 (Jorge Feitosa), renumbered
(0131 to 0133 were taken), taken together: #52 fixes the read loop #53
turns on.
- src/microphone_ps5.cpp (0134): a native AudioIn microphone driver,
the default one, for the first controller's user. It captures only
while a core has its microphone on, sends silence under the DualSense
mute, and keeps PCM only in a bounded queue in memory. RetroArch is
configured with the microphone; the title links a host stub for
libSceAudioIn's imports.
- 0135: a microphone read that gets no frames returns silence instead of
looping forever (a paused core, an empty nonblocking device, a failed
capture).
- tools/build-melondsds.sh: melonDS DS at pinned revisions (git objects
by SHA), software renderer and a native-memory JIT, staged only with
PS5_WITH_MELONDSDS=1; DeSmuME stays the DS default. The DualSense
touchpad drives its stylus as it drives DeSmuME's.
Changed from the pull requests: the README and the 0134 entry describe
what happens, not an opt-in the code never had. RetroArch's microphone is
on by default, as upstream; melonDS DS listens only while its microphone
button is held (its default), and Settings > Audio > Microphone turns it
off for every core. tests/test_microphone_read.py applies the port's
edits to vendor/retroarch itself rather than reading build/ra-conf, which
a tree configured before 0135 would fail. The SwanStation and melonDS DS
title changes are merged into one licence-file rule.
Evidence: tests/test_microphone_ps5.py (the driver against a simulated
AudioIn: lifecycle, mute, input failure); tests/test_microphone_read.py
(it times out with upstream's loop); tests/test_touchpad_stylus.py
(melonDS DS's relative stylus); tools/build-melondsds.sh, core ABI PASS
(25 exports, kernel_web, sha256 b03d4c93...). A title built with both
optional cores: 61 notice parts, check-notices covers every shipped
executable, check-manifest PASS, 78 melonDS DS options in the catalog.
Gates (default build): format, unit (204), build (staged cores reused),
integration, evidence PASS. Console: with this series' deploy.
From mihawk-99/PS5_RetroArch#54 (Jorge Feitosa). tools/build-swanstation.sh
builds libretro/swanstation at a pinned revision (archive SHA-256 checked)
as a native shared core: Vulkan, the x64 recompiler on title executable
memory (ps5_exec_allocate) with LUT fastmem instead of the mmap path.
The platform changes are adapted from AngelXex's SwanStationPS5 1.3.4,
credited in the patch, the README and the notices. A title build stages it
only with PS5_WITH_SWANSTATION=1, with its licence file beside the info
file; Beetle PSX HW stays the PlayStation default, and the WebUI catalog
lists its options when it is staged.
Changed from the pull request: tooling/swanstation/README.md no longer
names the game it was tested with.
Evidence: tools/build-swanstation.sh, core ABI PASS (25 exports,
kernel_web, sha256 dfb1521f...); tests/test_optional_core_metadata.py
(catalog with and without the core). A title built with
PS5_WITH_SWANSTATION=1: 60 notice parts, check-notices covers every
shipped executable, check-manifest PASS, 113 SwanStation options in the
catalog. Gates (default build): format, unit (201), build (staged cores
reused), integration, evidence PASS. Console: with this series' deploy.
The generator (framegen/src, framegen/include) and its trained network now
come from PS5_MihawkGen (github.com/mihawk-99/PS5_MihawkGen, public),
pinned at c57232a; a release build refuses any other revision. Its sources
and the d5 network are byte-identical to what the title built before (the
network sha256 31ecc7d6..., the four generator sources and the compiled
shaders; framegen.h and nn_final.comp differ only in a comment). The
RetroArch driver shim (vulkan_framegen.cpp/.h, from PS5_FrameGen 9490b0d)
moves to tooling/framegen, so all of the frame generation code in
eboot.bin is published. tooling/notices: a mihawkgen component with its
source address.
format PASS; unit (196 tests) OK.
The PS2 core is now PS5SX2 (Swordpdf's PCSX2 for the PS5) from the fork
../Libretro_PS5SX2, branch libretro, pinned at 308e8dc. build-ps5sx2.sh
fetches and pins its dependencies (rapidyaml 0cd25a1, glslang 275822a built
for the console, shaderc v2026.2 headers), builds the core with the fork's
ps5/libretro/Makefile.libretro, ABI-checks it and stages PCSX2's game
database in system/ps5sx2/resources. PS5SX2_DEV=1 builds the fork as it
stands. BIOS and memory cards stay in system/pcsx2/ (shared).
LRPS2 is gone: build-lrps2.sh and tooling/lrps2, its notices component,
WebUI catalog and settings-guide entries, and the title's core list.
build-title.sh empties dist/{cores,info} before staging, so a core taken
out of the list does not linger. The balanced 4K default (0102) now sets
ps5sx2_upscale to 4x; the core offers up to 8x (6x is 4K).
Also: patch 0118's tests (the block count, the XMB icon names test).
Console evidence (192.168.50.237, RADV; tools/run-title.sh --game=ps5sx2):
- Shadow of the Colossus (USA) boots and plays (klog/game-122302.png).
- tests/pad/ps5sx2-states-4k.txt: frames of 3072x2688 at 6x; a 46,562,360
byte state saved and loaded from the Quick Menu (klog/retroarch-124621.log).
- RetroAchievements: SET_SUPPORT_ACHIEVEMENTS, account logged in, disc
hashed, the core's memory map published (klog/retroarch-125231.log).
- pcsx2_libretro.{so,info} deleted from the console's cores/ and info/.
Gates: format PASS; unit and integration fail only in
test_input_ps5.test_joypad_bindings and test_webui_qr (the uncommitted
frame-generation and input work in src/, not part of this commit); notices
PASS (33 cores); manifest PASS; evidence 127 replayed, 0 failed. The title
was built with the other cores reused (PS5_REUSE_STAGED_CORES).
tools/xmb-system-icons.py makes, at build time, one tab icon per RetroArch database the
title knows (src/ps5_library.c's platform table: 48), from the WebUI's system artwork
(webui/assets/systems, Linear ES-DE, MIT): each picture cropped to its hardware (the logo
and year under it removed; XMB prints the name), centred, 256 x 256 PNG, named
<database>.png in assets/xmb/monochrome/png, where XMB looks for a playlist's icon.
Game rows keep XMB's own content icon (no <database>-content.png). A playlist with
another name keeps the default icon.
Notices: the generated icons are their own part (MIT); retroarch-assets now names its
files exactly, so neither claims the other's (fnmatch's * crosses "/").
Evidence: python3 -m unittest tests.test_xmb_assets (one icon per database, 256 x 256
RGBA, the caption cropped off, no -content icons, each icon owned by one licence); the
build printed "[xmb] 48 system icons" and tools/check-notices.py passed. Contact sheet
checked by eye. Console screenshot not taken: the title refused to start on this
console ("startup refused: elevation or installation could not be verified").
Gates: bash tools/verify.sh -> verify: PASS (format unit build integration evidence)
Package the qualified title-specific resident service and start it through
local elfldr before workers when no service is ready. Wait for preflight,
verify SDK elevation and UID 0, and reuse the service on subsequent launches.
Keep installed paths and offline fallback; no Payload Manager boot hook.
Console evidence: evidence/lapy-autostart/capture.json and expectation.json.
Reproduce with evidence/lapy-autostart/README.txt, then
python3 tools/evidence.py compare evidence/.
Verified on the base PS5: cold service startup, two authenticated achievement
sessions, reuse of one service across three requests, and NetPlay relay join
with 3837/3361 input packets and 52 matching state checks. Normal title exits;
root counts 73/72 before each request. Resident service remains running.
Installed binary hashes and unchanged Payload Manager configuration verified.
Validation: 194 unit and 194 integration tests; format; all-target build with
PS5_FRONTENDS='es-de picker' and the existing pinned build/picker-template;
manifest/notices/source bundle checks; 127 evidence captures replayed.
No secrets, saves or raw console captures included. No push.
EmulationStation now ships, beside Alekfull NX (still the default) and Linear:
Colorful (Simplified), Colorful (Revisited), PlayStation-X, Art Book Next, Retrofix
(Revisited) and Artflix (Revisited), all from ES-DE's own theme list. Each is pinned
by commit in frontends/es-de/themes.list, fetched by tools/build-esde.sh, copied by
frontends/es-de/stage.sh without artwork sources, and credited in the notices
(CC BY-NC-SA 2.0 or 4.0, non-commercial; Artflix states no licence of its own and
follows its origin, Alekfull's ARTFLIX). A user picks one in ES-DE's UI Settings.
Not included: Next-pixel and Not-so-epic exist only as legacy Recalbox/Batocera themes,
a format ES-DE 3 no longer loads; no ES-DE version of either was found (ES-DE's list,
GitHub, GitLab).
The title folder's es-de/themes is 847 MB; the release ZIP grows to 1.53 GB.
Evidence: python3 -m unittest tests.test_esde_themes (pins, notices, fetched commits);
the build printed "es-de: resources 17M, 8 themes in 847M" and the ZIP lists the eight
theme.xml files.
Gates: bash tools/verify.sh -> verify: PASS (format unit build integration evidence)
Add a Media Inspector-based workflow for new backups, editable metadata,
LaunchBox lookup and manual/automatic media. Keep users in a live job view
until completion, then open freshly loaded artwork. Preserve prior metadata
edits and rank literal database titles above enhanced editions and variants.
Use the approved color icons, real region flags and hardware artwork for all
50 recognized systems. Restore RetroArch branding and bundle attribution.
Preview native savestate screenshots and invalidate them on replacement.
Validation: PS5_FRONTENDS='es-de picker' PS5_VULKAN_TEMPLATE="$PWD/build/picker-template"
bash tools/verify.sh format unit build integration evidence
185 unit and 185 integration tests; all shipped targets and evidence pass.
Base PS5: seven disposable-file/API checks, asset byte comparisons and
configuration preservation pass; test files removed, Picker restored.
Evidence: evidence/webui-add-game/capture.json
Replay: python3 tools/evidence.py compare evidence
Adapt Proton contact tracking for relative hover and physical press/drag/release.
Keep touchpad Select in menus and other cores. Add resolution-scaled mouse
motion and clipped stylus cursors to DeSmuME and Azahar (Vulkan/software),
with reproducible core patches, build provenance and licence attribution.
Verified: format; 182 host/integration tests; all shipped native targets;
core ABI, manifest and licence checks; 103 evidence captures replayed.
Deployed build 6da657c4 to the base PS5; stored SHA-256 of eboot.bin and both
cores matches the stage. Physical controller/TV acceptance remains pending.
Reproduce:
PS5_FRONTENDS='es-de picker' PS5_VULKAN_TEMPLATE="$PWD/build/picker-template" tools/verify.sh
python3 -m unittest tests.test_input_ps5 tests.test_touchpad_stylus
Evidence: evidence/touchpad-stylus/capture.json and expectation.json.
Raw logs: klog/touchpad-stylus/ (ignored).
Picker Triangle toggles and Circle dismisses; XMB gets a WebUI tab left of
Settings; RGUI shows WebUI first; ES-DE replaces Scraper with WebUI.
Share runtime IPv4 discovery and an unchanged MIT Nayuki QR encoder.
Verify: PS5_FRONTENDS='es-de picker' PS5_VULKAN_TEMPLATE="$PWD/build/picker-template" tools/verify.sh
All five gates pass; 176 tests in each pass. Independent QR decoding,
address changes/offline recovery, picker input and menu routing tested.
Evidence: evidence/webui-qr/capture.json and expectation.json; replay with
python3 tools/evidence.py compare evidence/
Deployed build 700259e0: 9 changed files verified, 13614 retained. Exact
stored-byte digests match all three frontend binaries. On-console scans
and controller checks remain pending; no title launch performed.
Each from my local fork with a PS5 platform commit, through
tools/core-fork.sh:
- Opera (PS5_Opera, 3DO): FreeDO's modified LGPL forbids commercial use,
so it joins the non-commercial parts (text from its sources' headers,
tooling/notices/texts/opera-freedo.txt).
- PUAE (PS5_PUAE, Amiga): GPL-2.0-or-later; it boots Kickstart 1.3 from
system/kick34005.A500, AROS without one.
- NeoCD (PS5_NeoCD, Neo Geo CD): LGPL-3.0-or-later; BIOS in system/neocd/.
- ScummVM (PS5_ScummVM: scummvm/scummvm v2026.3.0, every engine, no
OpenGL): GPL-3.0-or-later. Its Makefile empties LDFLAGS, so the title's
link flags go in as PS5_LDFLAGS (without them the wrapper linked
libSceNet, which the core loader refuses); AR carries its flags (ar cru);
its pinned libretro deps are kept across clean checkouts.
build-title.sh stages the four; notices list them; README: systems, forks,
credits, licences (thirty-three cores).
Verified on the base PS5 (13.40), runs 224859-230600: BattleSport (from
its .iso: the archive's .cue names a file it does not hold), 3D Pool,
Metal Slug and Day of the Tentacle load, run and exit with 0
(evidence/four-cores-2026-10-06). Disc images inside archives do not load:
RetroArch extracts only the .cue; unpacked into folders on the console
they do. tools/verify.sh format, unit and evidence PASS (91 captures).
Before a release: publish the four forks.
Each from my fork beside this repository (all local, not yet on GitHub),
upstream plus a PS5 platform commit (no --no-undefined, no LTO, zstd without
trace hooks), built through tools/core-fork.sh:
- PicoDrive (PS5_PicoDrive): the 32X SH-2s on the interpreter (the
recompiler's static read-write-execute buffer faults on the PS5); frames
go out as XRGB8888. Non-commercial licence, like Snes9x and FBNeo.
- Beetle PCE (mednafen_pce, with SuperGrafx and CD), Beetle PC-FX, Beetle
VB, Beetle NeoPop, Beetle Cygne: GPL-2.0-or-later.
- PokeMini (GPL-3.0-or-later), Handy (zlib; its text is in the source
headers, tooling/notices/texts/handy-zlib.txt), Virtual Jaguar
(GPL-3.0-or-later), Stella 7.0c, a5200 (built-in Altirra BIOS; its
Makefile empties LDFLAGS, so the link flags go in as PS5_LDFLAGS),
ProSystem: GPL-2.0-or-later unless noted.
- DOSBox Pure 1.0-preview7 (now on Codeberg): the dynamic x86 core's code
cache is ps5_exec_allocate memory, and stdio replaces the VFS wrapper,
whose funopen the console lacks.
build-title.sh stages all thirteen; the notices list each; README: the
systems, forks, credits and licences (twenty-nine cores). On the console the
owner's BIOS files were moved where the cores look: system/pcfx.rom,
system/lynxboot.img, system/bios.min.
Verified on the base PS5 (13.40), one game per core with
tests/pad/boot-and-start.txt (runs 212433-220552): every core loads, runs at
its system's rate (Virtual Boy 50.3, Pokemon Mini 72, the rest 60 frames a
second) and exits with 0; pictures inspected
(evidence/new-cores-2026-10-06). tools/verify.sh format, unit and evidence
PASS (90 captures, 0 failed); build and integration not rerun this step.
Before a release: publish the thirteen forks the notices and README name.
tools/build-flycast.sh builds Flycast's libretro core from my fork
../PS5_Flycast (b95c532f: upstream flyinghead/flycast 59ed35a7e plus five
commits) through tools/core-fork.sh, like the other forked cores:
- the PS5 libretro build: no --no-undefined, 16 KiB pages;
- the SH-4, ARM7 and AICA DSP recompilers' code in the console's executable
memory (ps5_exec_allocate, near the core's code);
- anisotropic filtering takes the level chosen, not its index (upstream
bug: "16" gave 4x, the default "4" gave 2x);
- PS5 defaults: 2880x2160, per-pixel transparency, 16x filtering; the
widescreen hack stays off;
- no locale switching and no serial pseudo-terminal: the console exports
neither uselocale/newlocale nor grantpt/unlockpt/ptsname, which the
title's link refused.
The port began as rpf16rj's (pull request 3), credited in the fork's
commits; its networking (DCNet DNS and socket changes) and the
ps5_dc_rumble hook, which the title does not export, are left out.
tooling/flycast/ps5-toolchain.cmake is the cores' link contract with
libzip's Annex K and Windows probes answered no. The notices list Flycast
as GPL-2.0-or-later: its LICENSE is the GPLv2 text, and its file headers
say "version 2 or any later version", none "only". README: the system, its
resolution, the fork and the credit.
Verified on the base PS5 (13.40): runs 210509, 210719, 211230. The core
loads (core loader, Vulkan OIT renderer on RADV), Sonic Adventure (USA, Rev
A) boots through the HLE BIOS, plays its film, title screen and attract
demo at 2880x2160 with sound, and START reaches "Select a memory card";
RetroArch exits with 0 (evidence/flycast-sonic-adventure, pictures
klog/pad-210719 and klog/pad-211230). About 60 frames a second in the demo,
30 in the film (its own rate), early stalls of 0.5-1.4 s.
Gates: tools/verify.sh format, unit and evidence PASS (89 captures, 0
failed); build and integration wait for MAME's rebuild. Before a release:
publish github.com/mihawk-99/PS5_Flycast, which the notices and README name.
The SDK's LLVM entry pointed to an RPCS3 entry no release carries, and the
core-info entry named rpcs3_libretro.info and tooling/rpcs3, neither of which
is in the repository or the package any more.
Verified: TMPDIR=$PWD/build/tmp bash tools/verify.sh -> verify: PASS
(format unit build integration evidence).
A release build (PS5_RELEASE_TAG set) now builds the picker and ES-DE
unless PS5_FRONTENDS says otherwise (tools/build-title.sh). A
development build still carries them only when asked.
tooling/notices/components.json lists what the frontends ship:
- ES-DE 3.5.0 (MIT) with its own licenses folder;
- the Alekfull NX theme (CC BY-NC-SA 2.0, marked non-commercial; the
picker's EmulationStation picture shows it);
- SDL2 (Zlib, the ps5-payload-dev fork);
- PS5_OpenGL (GPL-3.0-or-later, Mesa and its other parts in LICENSES/);
- FFmpeg (LGPL-2.1-or-later: no GPL parts configured), curl, Mbed TLS,
FreeType, HarfBuzz, ICU, pugixml, libwebp and stb;
- the picker, with the notices the template staged for it.
The port, the payload SDK and the LLVM runtime list the frontends'
executables beside eboot.bin.
tools/stage-notices.py and tools/check-notices.py treat es-de/es-de.bin
and picker/picker.bin as executables: each must belong to a part, with
its digest recorded. tools/source-bundle.py archives a part's extra
sources (a library's tarball, a git tree at a pinned or fixed revision)
even when the part has no archive of its own. The bundle then holds
ES-DE's commit, the libraries' tarballs, the SDL fork, PS5_OpenGL, the
template, the UI kit and the template's SDK pin.
Checked: tests/test_notices.py PASS (a frontend executable must belong
to a part); a build with both frontends staged 46 parts, and
check-notices "covers every shipped executable"; source-bundle --list
names every frontend source. The release-tagged build and its
--release check follow this commit.
Gates: tools/verify.sh PASS (format unit build integration evidence).
Download and verify published packages on-console, stage changed managed files, preserve user data, and install after frontend shutdown. Set eboot execute permission explicitly so native installations relaunch.
Validation: tools/verify.sh (118 tests, native build and all gates); browser state checks; actual Alpha 6 download/install/relaunch and unchanged config. Evidence: evidence/webui-update/.
Create content/Saturn and system/Saturn at startup. Route the default core
system directory and menu BIOS preflight consistently, retaining custom paths.
Patch Saturn's x86 code pools to use the SDK executable allocator and release.
Keep cropped frames in core-owned storage to avoid resized lent texture reuse.
Include the patch in core stamps, provenance and shipped notices.
Two deliberate frontend patch blocks increase the expected count 232 to 234.
Verification: bash tools/verify.sh, all five gates PASS, 96 tests.
Evidence: evidence/saturn-runtime; replay with python3 tools/evidence.py compare evidence/.
Console: 100s controlled gameplay with clean captures; final frontend repeats
100s boot/demo and exits0; explicit BIOS preflight passes. Settings restored.
Serve the approved purple layout with local assets, streamed content transfers, release notes and next-launch settings. Keep the service within the title lifetime and preserve explicit launch overrides.
Verify: CCACHE_DIR=build/verification/ccache BUILD_JOBS=8 bash tools/verify.sh (all five gates; 92 tests), real browser integration including throttled keyboard cancellation, and two native console launches. Evidence: evidence/webui/{capture,expectation}.json; replay with python3 tools/evidence.py compare evidence/.
Design review and normal Impeccable completion passed in a hash-verified identical-source snapshot because the original-root fingerprint scanner failed; records remain in build/verification. No game performance soak claimed.
The v0.5.6-alpha.5 gradient replaced a picture whose origin was not
recorded. The script now draws that look itself: a perspective grid fitted
to the old one's line positions (vertical lines within 2.4 px rms, the rows
within 3.8 px), its tile and line colours fading with depth as measured,
and about 2,500 stars placed by a fixed random seed with the old one's
count, sizes and brightness. The whole picture's mean colour is within one
level of the old one's.
The BC7 blocks now come from a mode 6 encoder in the script (49 dB against
the drawing, checked with Pillow's decoder), and the DDS header is
byte for byte the one the console has shown (4f633ad): the gradient's had
left out the mip count and straight alpha.
pic0.dds and pic1.dds had been converted from a background image whose
origin was not recorded. They are now a gradient drawn from arithmetic alone
by tools/make-title-art.py (BC7 mode 6 blocks, each one colour, so no texture
compressor is needed and the files are the same on every machine), and the
notices name that script as their origin.
A licence audit found that no published ZIP carries the licence texts its parts
require, and that three release tags name commits older than the ones built.
- tooling/notices/components.json lists every part of the title, its licence,
its licence texts and where its source is.
- tools/stage-notices.py (run by tools/build-title.sh before the manifest)
writes licenses/ into the title folder, tying every executable to its
source revision; tools/check-notices.py checks it in the integration gate.
- tools/source-bundle.py archives each part's source at that revision.
- LICENSE (GPLv3), docs/RELEASING.md, docs/releases/SOURCE_CORRESPONDENCE.md,
README licence and trademark sections, docs/RPCS3_PORT.md licence facts,
runtime/README.md (what libc.prx contains, as verified).
Evidence: stage-notices on a copy of the current 16-core build staged 28 parts,
every core equal to its build report; check-notices passes, --release fails on
uncommitted source; source-bundle built 10 archives whose sums verify;
make test-unit 83 OK; lint-shell PASS; libc.prx rebuilt from committed files is
byte-identical to every release's (e6ff45d1...).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>