Publish Chimera GFX source
phase0-ci / build-and-audit (push) Successful in 2m14s

This commit is contained in:
Chimera GFX release export
2026-09-03 03:27:14 +02:00
commit a6037502d7
828 changed files with 100454 additions and 0 deletions
+169
View File
@@ -0,0 +1,169 @@
# Phase 1.0A build and artifact results
## Result
`RETROARCH_PS5_SOFTWARE_PORT_BUILT`
Both outputs are real RetroArch v1.22.2 frontends built from fork commit
`ca1b45680577befc743e1c92fa40687e1b1745e7`. They link the upstream
frontend/runloop and the static `chimera_smokecore`; the software target also
links RGUI and the reviewed PS5 SDL2 software backends. They were not run.
| Profile | Local output | Size | SHA-256 | Map SHA-256 |
| --- | --- | ---: | --- | --- |
| headless | `build/phase10a/final/retroarch_ps5_headless.elf` | 722392 | `fd595a826f64d18598be0b55e539bb524b33bd469b98f62c958ee50acb544628` | `fb935f7a768c91408a87290f03bad8ed59f5061de75232d5660957eff8ec017f` |
| software/RGUI | `build/phase10a/final/retroarch_ps5_software.elf` | 3318432 | `7beb09592404b5c1fb4161c632171d2901f3715db26e59458998690e8c49f3fc` | `1573a9951fa53bfa1bf304e0038e6f049f859fbfbe92f6a895196dc283c27597` |
The paths are relative to the separate `chimera-retroarch` repository. The
ELFs and maps are ignored local build outputs, not files in `chimera-gfx` and
not transfer, execution or installation packages.
## Builds and reproducibility
Every target comparison used fork commit
`ca1b45680577befc743e1c92fa40687e1b1745e7`, SDK commit
`d2e2e585740362976a39fdd5ccf390f199a7bc37`,
`SOURCE_DATE_EPOCH=1763597828`, `TZ=UTC` and `LC_ALL=C`.
Each repetition invoked `make ... clean` to completion before a separate
`make ... -j4 all`. An earlier concurrent `make clean all` experiment was
rejected as a race and is not evidence.
| Comparison | ELF | Linker map |
| --- | --- | --- |
| headless A versus B | byte-identical | byte-identical |
| software A versus B | byte-identical | byte-identical |
Compiler flags include warnings-as-errors, `-O2`, no debug data, source-prefix
maps, section garbage collection, `--as-needed` and `--build-id=none`. The
cross compiler reports Clang 18.1.8 for `x86_64-sie-ps5`; GNU Make 4.4.1 was
used under WSL2.
The static SDL2 archive is 3120572 bytes with SHA-256
`353065505f54e71fa8f7fff41e090dce52f39fe2aaafab85c4653648fc5f1b56`.
It was built from commit `0baf4ac49382b537ba449901b5b6d0d189bb1fbb`
plus the 5195-byte reviewed overlay whose SHA-256 is
`b547260d8af40ce2360575ab7831c009036c1f35f8b525cad6fd376dc5ca9d6b`.
## Host integration result
The host harness compiled with GCC 15.2.0, `-Werror`, AddressSanitizer and
UndefinedBehaviorSanitizer, with leak detection enabled. It completed:
- 600 frames;
- video FNV-1a-64 `43f920496eb5f435`;
- audio FNV-1a-64 `a48f47dc08c56625`;
- digital and analog input mapping: pass;
- Start-driven libretro shutdown callback: pass;
- init/deinit and ASan/UBSan/leak checks: pass;
- PS5 port structural validator: pass.
This is host evidence for the core and source contracts, not PS5 runtime
evidence.
## ELF audit
Both files are ELF64 little-endian x86-64 System V PIE/DYN binaries, dynamically
linked and not stripped. Neither has an interpreter, build ID, GNU-stack
program header, ELF TLS segment, `.tdata` or `.tbss`. Both have 20 section
headers; `.init_array` and `.fini_array` exist with zero size. The full section
set is `.text`, unwind tables, dynamic symbol/hash/string/relocation tables,
`.data.rel.ro`, `.got`, `.rodata`, empty init/fini arrays, `.dynamic`, `.data`,
`.bss`, `.comment` and static symbol/string tables.
| Field | Headless | Software/RGUI |
| --- | ---: | ---: |
| Entry point | `0x47d10` | `0x1c29c0` |
| Program headers | 4 | 4 |
| First LOAD | offset `0x4000`, size `0x4e570`, RWE | offset `0x4000`, size `0x1c93e0`, RWE |
| Other LOADs | two RW | two RW |
| `.rela.dyn` entries | 610 | 3373 |
| Dynamic symbols | 79 | 220 |
| Full symbols | 1387 | 7256 |
| Defined global symbols | 719 | 2403 |
| Undefined symbols/imports | 73 | 210 |
The executable first LOAD segment is also writable because the pinned SDK
linker script co-locates text that way. This is a material W^X weakness and a
future execution risk; offline build success does not waive it.
The linker maps prove inclusion of `frontend/drivers/platform_ps5.o` and
`cores/chimera_smokecore/chimera_smokecore.o` in both targets. The software
map additionally proves inclusion of `SDL_ps5video.c.o`, `SDL_ps5audio.c.o`
and `SDL_ps5joystick.c.o`, while PS5 keyboard and IME objects are absent from
the final link.
## Dynamic dependencies and imports
Headless `DT_NEEDED`:
- `libkernel_web.sprx`;
- `libSceLibcInternal.sprx`.
Software/RGUI additionally needs:
- `libSceVideoOut.sprx`;
- `libScePad.sprx`;
- `libSceUserService.sprx`;
- `libSceSystemService.sprx`;
- `libSceAudioOut.sprx`.
`--as-needed` removes the SDK's otherwise unconditional SceNet dependency.
There are no undefined socket/network, `dlopen`/`dlsym`, module-loader, GNM,
mount, reboot or console-shutdown symbols. The software target's complete Sce
API import set is AudioOut init/open/output/close; direct-memory and equeue
allocation/wait/release; Pad init/open/read/close plus linked-but-not-required
lightbar/vibration calls; UserService initialization/user queries;
`sceSystemServiceHideSplashScreen`; and VideoOut open/register/flip/event/
close operations. Full ordered import lists are in
`manifests/retroarch/phase-1.0a-artifacts.json`.
Generic RetroArch code keeps write-capable libc imports. Headless includes
`fopen`, `ftruncate`, `fwrite`, `mkdir`, `open`, `remove`, `rename` and
`write`; software also includes `setenv`. The fixed PS5 startup path blocks
configuration reads, supplies no content/config/SRAM/state/core/data path and
compiles the normal shutdown-save paths out. The claim is therefore
control-flow-specific, not global absence of write-capable code.
## Entry, shutdown and static reachability
Source and disassembly agree on this entry sequence:
`_start` clears BSS, performs the inlined SDK `payload_init` sequence
(`__crt_syscall_init`, `__kernel_init`, `__klog_init`, `__isthreaded`,
`__patch_init`, `__rtld_init`), constructs the SDK payload runtime, calls
`main`, which tail-jumps to `rarch_main`, then runs SDK fini/close/destroy and
termination handling. RetroArch selects `frontend_ctx_ps5`, performs a
contentless static-core launch, enters `runloop_iterate`, and reaches the
linked `retro_run`. Start requests the normal RetroArch/core shutdown path;
`retro_deinit` and the PS5 frontend deinit/shutdown callbacks are linked.
The SDK source and linked disassembly also prove that startup is not
kernelwrite-free: `__patch_init` reaches credential-capability/attribute
changes and syscall-bound writes through `kernel_copyin/out`. Those effects
are accepted for this authorized offline link milestone under the existing
ADR boundary, but remain unexecuted and hardware-unproven.
## String and policy audit
No personal absolute host path, credential, PS5/device address, install route,
Payload Manager modification, elfldr modification, lifecycle probe, deploy
client or execution helper was found. The generic RetroArch string pool keeps
`udp://127.0.0.1:`, an RTMP template, overlay “autoload” labels and downloader
localization even though networking, updater, dynamic cores and autoload
routes are compiled out. The software pool also yields byte-pattern false
positives `0.1.2.3` and `4.5.6.7`. SDK RTLD name tables contain module/dlsym
strings, but none is an undefined application import.
Full local audit output for each target contains the file classification,
ELF/readobj dump, complete symbols and undefined symbols, relocations,
disassembly, startup/shutdown slices and strings under
`build/phase10a/audit/{headless,software}` in `chimera-retroarch`.
The Chimera GFX secretscan passed across 658 text files and a clean archive of
all 21 fork-delta files passed separately. A whole-upstream RetroArch scan
also identified the pre-existing BearSSL sample private-key fixtures and
mbedTLS parser/writer source literals; these are official baseline dependency
test/source material, not additions or credentials introduced by this port.
No PS5 connection, request, transfer, execution, installation, autoload or
device write occurred.
@@ -0,0 +1,55 @@
# Phase 1.0A driver status
| Component | Headless | Software/RGUI | Runtime classification |
| --- | --- | --- | --- |
| RetroArch frontend/runloop | Real linked code | Real linked code | Built offline |
| Platform frontend | `frontend_ctx_ps5` | `frontend_ctx_ps5` | Startup/return on device unproven |
| Video | `video_null` | RetroArch `sdl2` + SDL software + PS5 VideoOut | Linked, firmware runtime unproven |
| Menu | none | RGUI | Linked, display unproven |
| Input | `input_null` | RetroArch SDL + SDL PS5 Pad | Linked, one-controller runtime unproven |
| Joypad | null | SDL joypad over PS5 Pad | Buttons/axes source present; runtime unproven |
| Audio | `audio_null` | RetroArch SDL + PS5 AudioOut | 48 kHz stereo source present; runtime unproven |
| Core | static `chimera_smokecore` | static `chimera_smokecore` | Host-verified |
| Dynamic core | disabled | disabled | Not implemented |
| Config/VFS persistence | disabled default path | disabled default path | Generic write-capable code remains |
| Networking/updater | disabled | disabled | No network API imports expected |
| GNM/hardware context | absent | absent | Out of scope |
## Platform services
- lifecycle, contentless arguments and blocked config reads:
`frontend_ctx_ps5`;
- monotonic time and bounded sleeps: RetroArch/libretro-common POSIX paths
backed by the pinned SDK libc; no invented PS5 ABI;
- RetroArch worker threads: compiled out; the software profile may use SDL's
public pthread-backed audio primitives;
- logging: existing RetroArch stderr/stdout path only, with file logging off;
- VFS: generic code is linkable but the fixed PS5 wrapper supplies no content,
config, SRAM, state, core or data path;
- dynamic core loading and executable-memory policy: explicitly unsupported.
## Smoke core contract
- no content;
- 320x240 XRGB8888 at 60 Hz;
- 48 kHz deterministic stereo, 800 sample frames per video frame;
- D-pad and left analog stick offset the pattern;
- A toggles the background;
- Start requests clean libretro shutdown;
- no input means unbounded deterministic operation;
- no filesystem, networking, threads, JIT or frame-hot-path allocation.
Host result for 600 no-input frames:
- video FNV-1a-64: `43f920496eb5f435`;
- audio FNV-1a-64: `a48f47dc08c56625`;
- ASan/UBSan: pass;
- digital- and analog-input-dependent video change: pass;
- Start shutdown callback: pass.
## Explicitly unsupported
Persistent configuration, history, playlists, screenshots, saves, states,
content loading, dynamic cores, multiple controllers, haptics, touchpad,
gyro, lightbar, overlays, shaders and hardware-rendered cores are not silently
reported as working.
@@ -0,0 +1,65 @@
# Proposed first PS5 smoke test (not authorized)
This is a review package only. It is not a sender, execution package or device
instruction and it grants no authority.
## Candidate
The first useful device test would use the exact audited
`retroarch_ps5_software.elf`, not the headless ELF. The headless static core
has no observable result channel and intentionally runs indefinitely with null
input. The software candidate can provide visible, audible and controller
evidence and can request a clean shutdown.
Before any action, a later task must bind:
- source commit `ca1b45680577befc743e1c92fa40687e1b1745e7`;
- the 3318432-byte ELF with SHA-256
`7beb09592404b5c1fb4161c632171d2901f3715db26e59458998690e8c49f3fc`;
- firmware text `9.60`;
- a manual, non-autoload, non-installing one-shot loader route;
- an independently reviewed recovery path;
- a 100 ms flip timeout in the linked SDL object;
- no automatic retry;
- one explicit artifact-specific transfer authorization and one explicit
execution authorization.
## Exact proposed one-shot scope
1. Verify the local ELF hash against the reviewed manifest.
2. Verify autoload remains off and no live component will be replaced.
3. Transfer only that one ELF to a non-persistent one-shot loader path.
4. Execute once with no content and no arguments.
5. Observe whether a 320x240 moving pattern is presented through RGUI/SDL.
6. Observe bounded 48 kHz stereo test audio.
7. Check one controller: D-pad and left stick change pattern position and A
changes its background.
8. Press Start once and observe whether RetroArch returns cleanly.
9. Do not retry automatically. On crash, hang, missing output, timeout or
unexpected filesystem/service behaviour, stop and use the separately
reviewed recovery action.
10. Hash and preserve host-side logs/transcript; do not infer success for
unobserved subsystems.
## Explicit technical effects to accept later
The SDK CRT performs its previously documented bounded runtime initialization.
The software profile opens user/system service, VideoOut, Pad and AudioOut,
allocates heap/direct-memory buffers, creates SDL audio/thread primitives,
submits VideoOut flips, waits on an equeue with a 100 ms timeout, polls input
and writes audio. Logs, scheduler activity, process accounting and caches may
change. These are functional runtime effects, not a side-effect-free probe.
## Remaining risks
- loader entry/return and firmware-9.60 lifecycle remain hardware-unproven;
- VideoOut ownership or direct-memory assumptions may fail;
- the public SDL backend's partial-init cleanup has not been observed;
- a timeout may return an error but higher-level shutdown still needs proof;
- audio output is blocking and underrun/overrun statistics are absent;
- controller mappings/deadzone need device validation;
- generic RetroArch write-capable code remains in the ELF even though the
fixed first-run path blocks persistent writes;
- a crash or hang may require a reboot/new jailbreak session.
No transfer or execution may occur on the basis of this document alone.
@@ -0,0 +1,56 @@
# Phase 1.0A PacBrew and PS5 SDL analysis
## Identities
| Source | Identity |
| --- | --- |
| PacBrew repository | `c2abcfcb60f569128abd0e8e70ad03a67bee5ea7` |
| PS5 SDL fork | `0baf4ac49382b537ba449901b5b6d0d189bb1fbb` |
| SDL reported revision | `SDL-2.30.12-g0baf4ac4` |
| SDL license | Zlib |
The PacBrew SDL2 recipe builds the PS5 fork and enables OpenGL and LOADSO.
Those two options are intentionally disabled here. PacBrew recipes were also
reviewed for SDL2_image, SDL2_mixer, SDL2_ttf, freetype, zlib, libpng, OpenAL,
elfldr and representative emulator ports. None is needed by the two Phase
1.0A binaries beyond SDL2 itself.
## Native backend inventory
| Area | PS5 SDL implementation | APIs/dependencies | Phase 1.0A use |
| --- | --- | --- | --- |
| Video | Software surface, tiled direct-memory buffers, double buffer, VideoOut flip/equeue | `SceVideoOut`, kernel equeue/direct memory, user/system service | Enabled |
| Render | SDL software renderer targeting the window framebuffer | SDL core software renderer | Enabled |
| Input | Up to four PS5 Pad users, buttons, axes, connect/disconnect polling | `ScePad`, `SceUserService` | Enabled for one controller |
| Audio | 48 kHz, mono/stereo, S16 or F32, bounded 256-2048 sample buffers | `SceAudioOut` | Enabled, RetroArch requests stereo |
| Keyboard/IME | PS5 keyboard and IME dialog | `SceKeyboard`, `SceImeDialog` | Removed by reviewed overlay |
| Filesystem | PS5 implementation exists | user service/filesystem | Disabled |
| OpenGL/OSMesa | Optional source exists | Mesa/OSMesa | Disabled |
| LoadSO | Optional | dynamic loader | Disabled |
## Reviewed overlay
The fork carries only a patch, not SDL source. The patch:
- removes keyboard/IME initialization and event pumping;
- replaces twelve freshly created worker threads per frame with a checked
single-thread tile copy;
- rejects non-positive or non-tile-aligned framebuffer dimensions;
- passes a 100,000 microsecond timeout to `sceKernelWaitEqueue`;
- propagates copy and timeout errors to SDL.
SDL is configured with video, render, events, joystick, threads, timers and
audio on; filesystem, file, loadso, OpenGL, Vulkan, haptic, sensor, locale,
misc, libsamplerate, disk audio and dummy audio are off.
## Classification
`PS5_SDL_PARTIAL_CANDIDATE`
The source contains real PS5 video, controller and audio backends and the
software RetroArch profile links them. It is not `FULL` because firmware-9.60
runtime behaviour, VideoOut ownership, error cleanup, disconnect recovery,
audio underrun/overrun reporting, exact flip timeout semantics and shutdown
after partial initialization have not been verified on hardware.
Static build and host audits are not runtime evidence.
+70
View File
@@ -0,0 +1,70 @@
# Phase 1.0A native RetroArch PS5 port plan
Date: 2026-07-19
## Outcome and boundary
Phase 1.0A creates a real native RetroArch target in the separate
`chimera-retroarch` repository. It does not add RetroArch source to
`chimera-gfx`. The implementation has three profiles:
| Profile | Purpose | Target result |
| --- | --- | --- |
| `ps5-headless-smokecore` | Real RetroArch frontend/runloop with null drivers | `retroarch_ps5_headless.elf` |
| `ps5-software-rgui-smokecore` | RGUI and SDL2 software video, Pad input and 48 kHz AudioOut | `retroarch_ps5_software.elf` |
| `host-smokecore-integration` | 600 deterministic libretro frames under ASan/UBSan | Host executable, removed after test |
The target outputs are offline research artifacts. They are not installation
or execution packages and carry no device authority.
## Layering
1. Upstream RetroArch remains the generic frontend, runloop, menu and driver
registry.
2. The PS5 layer adds the platform frontend, compile-time profiles and static
smoke core. The software profile selects existing RetroArch SDL2 drivers.
3. Chimera owns dependency locks, reproducible builds, artifact audits,
manifests, guardrails and a later human-reviewed smoke-test proposal.
## Work sequence
1. Pin the official stable RetroArch release and source archive.
2. Add the PS5 frontend and a warnings-as-errors headless build.
3. Add and host-test a deterministic, contentless static libretro core.
4. Cross-link the real headless RetroArch ELF.
5. Build the pinned PS5 SDL fork with a reviewed overlay.
6. Cross-link RGUI plus software video, input and audio.
7. Perform two clean builds of every successful profile and compare bytes.
8. Audit ELF headers, dynamic dependencies, symbols, relocations, executable
segments, map files, startup/shutdown disassembly, strings and policy
markers.
9. Commit the port to its separate private branch and record only identities,
results and safety evidence here.
## Compile-time safety policy
- networking, achievements, updater, core download and dynamic cores are off;
- no GNM, OpenGL, Vulkan, shaders or hardware libretro context is present;
- configuration reads are blocked by the PS5 frontend;
- no content, core, SRAM, state, config or data path is supplied;
- Salamander config and the normal shutdown save event are compiled out;
- the static smoke core has no filesystem, network, JIT, thread or hot-path
allocation code;
- build rules contain no sender, deploy, install or run action.
Generic RetroArch filesystem functions remain linkable and some libc write
imports remain in the ELFs. The safety claim is limited to the fixed default
launch control flow, not global absence of all write-capable library code.
Hardware behaviour on firmware 9.60 remains unproven.
## Non-goals
Dynamic libretro cores, persistent VFS paths, savestates, SRAM, playlists,
history, screenshots, multiple controllers, rumble, touchpad, gyro, shaders,
GNM acceleration, OpenGL/Vulkan contexts, packaging, installation and device
execution are outside Phase 1.0A.
The five explicit offline source/build/audit/private-push authorizations are
recorded as true for this phase. PS5 connection, device transfer, device
execution, installation, lifecycle, autoload and device writes remain false;
`automatic_retry=false`.
@@ -0,0 +1,29 @@
# Phase 1.0A PS4 reference delta
The official RetroArch Orbis port is a structural reference only.
| Orbis concept | PS5 Phase 1.0A decision | Evidence/status |
| --- | --- | --- |
| `Makefile.orbis` platform build | New `Makefile.ps5` using the open PS5 Payload SDK | Implemented |
| Orbis frontend registry | New `frontend_ctx_ps5`, first for `__PS5__` | Implemented |
| Orbis platform paths | No device paths at all | Safer default; future VFS work |
| PS4 native input | RetroArch SDL2 input over the PS5 SDL Pad backend | Linked; runtime unproven |
| PS4 native audio | RetroArch SDL audio over PS5 SDL AudioOut | Linked; runtime unproven |
| PS4 video/context | PS5 SDL software framebuffer and VideoOut only | Linked; no GNM/context |
| Static core support | Global libretro symbols provided by `chimera_smokecore` | Implemented and audited |
| Console definitions | `__PS5__`, `__PROSPERO__`, `PS5`, `RARCH_CONSOLE` | Compile-time only |
| Packaging/SELF | No conversion or packaging | Explicitly excluded |
Not reused from PS4:
- ABI declarations or structure layouts;
- Orbis library or stub names;
- PS4 paths, title identifiers or package logic;
- PS4 controller/audio/video calls;
- Auth info, SELF generation or installation;
- PS4 runtime or cleanup assumptions.
The PS5 ELF uses the public SDK v0.41 CRT and linker contract already audited
by Chimera. That startup has documented userland/kernel runtime effects and
adds SDK dynamic dependencies; it is not a PS4 ABI and is not claimed to be
side-effect free. Offline linking is authorized, device execution is not.
@@ -0,0 +1,67 @@
# Phase 1.0A upstream analysis
## Selected RetroArch base
| Field | Value |
| --- | --- |
| Official repository | `https://github.com/libretro/RetroArch` |
| Stable tag | `v1.22.2` |
| Commit | `69a4f0ea1e8aaf442ae4858f2e7f2b31a1776576` |
| Tree | `33babf9eb7699b5d571a3063ea21c3e488c159fe` |
| Commit date | `2025-11-20T00:17:08Z` |
| Source archive | official GitHub tag archive |
| Archive size | `71629881` bytes |
| Archive SHA-256 | `245ef18c8fa8fbd9fbb5eb25cf43e17c6aace2f95c1ed99873cbd794012bb232` |
| License | GPL-3.0-or-later (`COPYING` and source notices) |
| Acquisition date | `2026-07-19` |
The local fork starts at that exact commit. Its `upstream` fetch remote names
the official repository and its push URL is disabled. Project pushes are
restricted to the private Gitea `origin`.
## Areas inspected
The analysis covered `Makefile.common`, `Makefile.griffin`,
`Makefile.orbis`, frontend and driver registries, null/dummy drivers, RGUI,
static core glue, config/path startup, task queues, time/sleep, threads,
dynamic loading, VFS and logging. Reference platform implementations included
Orbis, Vita, Switch, PSP and null.
Relevant upstream mechanisms:
- `frontend_ctx_drivers[]` selects the first compiled platform frontend;
- video, audio and input arrays fall back to their null drivers;
- `Makefile.common` conditionally adds SDL2 video, input/joypad and audio;
- a static build resolves the global libretro API symbols at link time;
- configuration defaults derive driver names from compiled feature macros;
- RGUI is the smallest software-oriented menu driver;
- generic file/VFS/task code is widely shared even when persistent features
are disabled.
## Fork delta
The port adds:
- `Makefile.ps5` with explicit headless and software profiles;
- `frontend/drivers/platform_ps5.c`;
- `cores/chimera_smokecore/`;
- host tests and PS5 build validation;
- `pkg/ps5/` for the pinned SDL build and reviewed overlay;
- PS5 port documentation.
Small generic-source changes register the platform, block static Salamander
config I/O and normal shutdown saves for this profile, and add headers or
fallback locals required by the unusually small feature matrix. No proprietary
header, NID, syscall, firmware offset or device path is introduced.
## Static and dynamic core decisions
The static smoke core is linked into both ELFs and exports the real libretro
entrypoints consumed by RetroArch. Dynamic loading is deliberately disabled:
there is no proven native PS5 shared-core file/relocation/unload contract yet.
A later milestone must separately specify format, symbol binding, executable
memory, directory/VFS policy, ABI compatibility, error cleanup and unload.
No additional `libretro-samples` acquisition was needed because the required
deterministic input, video, audio and no-content behaviour was implemented in
the small GPL-compatible Chimera core and verified by a host harness.
@@ -0,0 +1,70 @@
# Phase 1.0AA: offline fake-adapter integration
Status: `OFFLINE_FAKE_BATCH_INTEGRATION_COMPLETE_LIVE_ADAPTER_BLOCKED`
Date: 2026-07-22
Phase 1.0AA connects the Phase-1.0Z passive batch contract to the Phase-1.0X
exclusive evidence model using only an exact built-in fake adapter and exact
synthetic clock. It creates no live adapter, socket, address, CLI, target code
or target artifact. No PS5 action occurred.
## Closed fake boundary
`run_offline_fake_batch` rejects subclasses and arbitrary adapter objects. The
only accepted components are:
- `OfflineFakeClock`, whose value changes only through explicit fake events;
- `OfflineFakeBatchAdapter`, which allows one fake open, one complete Z batch,
a bounded scripted event sequence and one fake close;
- `OfflineFakeEvidenceStore`, which exclusively creates local test evidence.
There is deliberately no adapter protocol that a network implementation could
quietly satisfy. The fake adapter records only the SHA-256 of sent bytes, not a
target. Scripted event buffers are logically discarded during close; physical
memory erasure remains unproven because caller-owned immutable bytes may still
exist.
## State and ordering
```text
validate W plan -> build and revalidate Z batch
-> exclusive consumed receipt
-> fake open exactly once
-> fake send exactly one complete batch
-> zero or more bounded DATA events before deadline
-> HARD_DEADLINE at or after the synthetic deadline
-> Z completeness validation and sanitization
-> fake close exactly once
-> exclusive receipt-bound sanitized output
```
The consumed receipt includes run ID, window, batch size, batch SHA-256,
deadline and the exact Z contract hash. It does not include a target or raw
transcript. A failure after receipt creation leaves the receipt intact and
creates no sanitized output; no cleanup deletes it.
Remote EOF, a blocked receive event, missing deadline, early deadline, data at
or after the deadline, IAC, partial output, a second fake send, a second fake
close and evidence collisions all fail closed. Prompt bytes remain ordinary
data and cannot seal a result.
## What the tests prove
The host tests prove internal ordering and rejection behavior of this exact
Python model. They do not prove:
- a live listener or exact deployed shsrv binary;
- OS socket timeouts or preemption of a blocking call;
- live fragmentation, short sends/writes, disconnect or cleanup;
- firmware-9.60 behavior;
- absence of atime, cache, accounting, scheduler or shell-process effects;
- physical erasure or containing-directory durability.
## Decision
The fake integration is complete and remains host-only. A live adapter is
blocked and unauthorized. The next permitted step is an offline feasibility
review for a future bounded live adapter: OS timeout/preemption semantics,
short-send handling, exclusive evidence ordering and failure cleanup must be
specified without adding a socket, address or device action.
@@ -0,0 +1,79 @@
# Phase 1.0AB: offline live-adapter feasibility
Status: `PARTIAL_FEASIBILITY_LIVE_IMPLEMENTATION_BLOCKED`
Date: 2026-07-22
This phase audits the local Windows host runtime and models lifecycle ordering
with synthetic traces only. It adds no socket import, address, DNS, live
adapter, CLI or device action.
## Bound local runtime
| Object | Identity |
|---|---|
| Python | 3.13.2, MSC v.1942, 64-bit AMD64 |
| `socket.py` | 38,741 bytes; SHA-256 `523695ac3383799547b421b4fe18004de1e80181e97181b6d7a10533b47f4c49` |
| `selectors.py` | 20,060 bytes; SHA-256 `b3d6cebd4a3a03b4a614f12f171622ce4e4ba3295b9e8b89e2bde051003106eb` |
| `_socket.pyd` | 84,984 bytes; SHA-256 `8daefaff53e6956f5aea5279a7c71f17d8c63e2b0d54031c3b9e82fcb0fb84db` |
| `select.pyd` | 32,248 bytes; SHA-256 `baee284995b22d495fd12fa8378077e470978db1522c61bfb9af37fb827f33d1` |
| monotonic clock | `QueryPerformanceCounter()`, monotonic, non-adjustable, reported resolution `1e-07` seconds |
| default selector | `SelectSelector` on this runtime |
These identities are local host evidence only. They are not portable to a
different Python build and say nothing about the PS5.
## Source-bound findings
The local `_socket` interface states that:
- `setblocking(False)` is equivalent to timeout `0.0`;
- `connect_ex` returns an error number instead of raising for connection
results;
- `send` returns a byte count that may be smaller than the supplied buffer;
- `recv` returns at most the requested bytes and returns empty bytes after
remote close and drained data;
- `close` makes the local socket object unusable.
The local `selectors.py` documents a maximum wait parameter. On Windows its
`SelectSelector` passes readers, writers and exceptional writers to
`select.select`, merges exceptional sockets into writable results, and returns
an empty readiness set after `InterruptedError`. Therefore a pending connect
must inspect `SO_ERROR` after writability, and every empty/interrupted return
must recompute the remaining monotonic budget.
## Feasibility matrix
| Part | Classification | Reason |
|---|---|---|
| receipt before socket creation | `FEASIBLE_FROM_EXISTING_HOST_MODEL` | X/AA exclusive evidence already models this order |
| numeric-address-only input | `DESIGN_REQUIRED` | DNS must be excluded; no address parser is added here |
| nonblocking mode before connect | `FEASIBLE_FROM_LOCAL_RUNTIME` | exact local `_socket` contract exists |
| pending connect completion | `PARTIAL` | readiness plus `SO_ERROR` is source-bound; exact accepted Windows error set still needs implementation review |
| complete batch send | `FEASIBLE_FROM_LOCAL_RUNTIME` | repeated readiness and explicit partial-send loop are available |
| bounded receive memory | `FEASIBLE_FROM_EXISTING_MODEL` | 65,536-byte collector bound already exists |
| hard wall-clock deadline | `PARTIAL` | monotonic remaining budgets are feasible; selector/scheduler overshoot cannot be proven impossible |
| prompt-independent completion | `FEASIBLE_FROM_Z` | only deadline sealing is accepted |
| EOF behavior | `FEASIBLE_FAIL_CLOSED` | empty receive must be failure, never completion |
| local descriptor cleanup | `FEASIBLE_BY_DESIGN` | unregister/selector close/socket close can run in `finally` |
| remote shell cleanup | `UNPROVEN` | local close does not attest remote exit or firmware behavior |
| retry/reconnect/resume | `EXCLUDED` | forbidden by contract |
Overall classification: `PARTIAL_FEASIBILITY_LIVE_IMPLEMENTATION_BLOCKED`.
## Existing-client comparison
Earlier one-shot ELF runners used blocking `sendall`, write-half-close and
bounded receive for a different raw-ELF protocol. Their result manifests prove
those consumed runs only. They are not reusable for shsrv: Z sends a tiny shell
batch, must keep the write direction open while receiving, ignores prompts and
seals only at deadline. `sendall` also hides individual partial-send progress;
the future contract requires an explicit nonblocking send loop.
## Decision
The required sequence is implementable in principle on the exact local host,
but a hard scheduling bound and remote cleanup cannot be proven offline. A live
adapter remains blocked. The next permitted phase may build only a dormant,
target-free adapter around an injected syscall facade and fake OS results. It
must not import or instantiate a real socket until a later dedicated review.
@@ -0,0 +1,50 @@
# Phase 1.0AB timeout and cleanup contract
This is a design contract, not live network code.
## Future required algorithm
1. Rehash policy, Z batch and approval before any capability creation.
2. Exclusively create, flush, close and reopen the consumed receipt.
3. Acquire one absolute monotonic deadline.
4. Create at most one stream socket and immediately set it nonblocking.
5. Start one numeric-address connect; never perform DNS.
6. For pending connect, wait for write/exception readiness using only the
recomputed remaining budget, then require `SO_ERROR == 0`.
7. Send the exact batch with an offset loop. Each call requires prior write
readiness; zero progress, excess count or error fails the attempt.
8. Switch to read readiness. Each read is bounded by both remaining collector
capacity and a small fixed chunk size.
9. Treat empty receive as remote EOF and fail immediately.
10. After every wait or operation, read monotonic time again. At or beyond the
deadline perform no further send or receive.
11. Ask Z to seal only because the hard deadline was reached. Partial or
malformed data remains invalid.
12. In `finally`, unregister if registered, close the selector and close the
local socket exactly once. Never retry, reconnect, resume or delete the
consumed receipt.
13. Create sanitized output only after successful Z sealing and local cleanup.
## Conservative race rule
When readiness and deadline coincide, the deadline wins. No additional bytes
are read or sent at `now >= deadline`. This can reject data already queued by
the OS, but it cannot silently extend the approved window.
## Failure classifications
| Event | Required result |
|---|---|
| connect error or nonzero `SO_ERROR` | fail, local cleanup |
| selector interruption | recompute remaining budget; no retry counter |
| selector timeout before absolute deadline | recompute; never seal early |
| partial send | advance offset only by reported positive count |
| zero send | fail |
| receive over 65,536 bytes | fail |
| remote EOF | fail |
| deadline without complete Z result | fail |
| cleanup exception | fail and retain receipt |
| output collision or short host write | fail and retain existing evidence |
`close()` proves only local object closure. It does not prove TCP packet
delivery, remote shsrv exit, process cleanup or reboot recovery.
@@ -0,0 +1,24 @@
# Phase 1.0AC fake-syscall contract
This contract is executable only against the exact built-in fake facade.
| Synthetic operation | Accepted result | Rule |
|---|---|---|
| `CREATE_STREAM` | `OK`, `ERROR` | exactly once after a precommitted receipt |
| `SET_NONBLOCKING` | `OK`, `ERROR` | immediately after create |
| `START_CONNECT` | `IMMEDIATE`, `PENDING`, `ERROR` | contains no target or address |
| `WAIT_WRITE` | `READY`, `INTERRUPTED`, `TIMEOUT`, `ERROR` | remaining fake budget is rechecked |
| `GET_SO_ERROR` | `ZERO`, `NONZERO`, `ERROR` | mandatory after pending readiness |
| `WRITE_BYTES` | `PROGRESS`, `ZERO`, `ERROR` | positive progress cannot exceed remainder |
| `WAIT_READ` | `READY`, `INTERRUPTED`, `TIMEOUT`, `ERROR` | deadline wins a simultaneous readiness event |
| `READ_BYTES` | `PROGRESS`, `EOF`, `ERROR` | EOF is failure; total input is bounded |
| local close | `OK`, `ERROR` | one call after ownership; none if create failed |
The facade accepts at most 1,024 scripted steps. One step may advance the fake
clock by at most 60 seconds. These are model bounds, not proposed live values.
Unused synthetic steps are logically discarded at close; physical memory
erasure is not proven.
There is deliberately no adapter protocol, inheritance hook, address field,
network import or live factory. A later phase cannot reinterpret this fake as
device authorization.
@@ -0,0 +1,55 @@
# Phase 1.0AC: offline dormant adapter
Status: `OFFLINE_DORMANT_FAKE_SYSCALL_ADAPTER_COMPLETE_LIVE_ADAPTER_BLOCKED`
Date: 2026-07-22
Chimera GFX is a graphics/homebrew project. This phase adds host-side test
infrastructure for a possible future one-shot launcher observation; it is not
a security feature and it changes no RetroArch, SDL, VideoOut or target code.
## Closed capability boundary
`phase10ac_dormant_adapter.py` composes the Phase-1.0Z passive batch parser
with an exact built-in fake syscall facade. The facade consumes caller-created
synthetic outcomes. It cannot accept a live implementation and stores no
target. The module imports no socket, selector, DNS, real clock or filesystem
output interface and exposes no CLI.
The adapter requires a precommitted-receipt marker before the first synthetic
create step. It then models:
1. one create and immediate nonblocking setup;
2. immediate or pending connect completion;
3. readiness plus `SO_ERROR == 0` for a pending result;
4. an explicit partial-write loop for exactly one Phase-1.0Z batch;
5. bounded read readiness and at most 65,536 supplied bytes;
6. deadline-only result sealing;
7. one local close on success or any failure after successful create.
Timeout and interrupted-wait events stay inside the same synthetic attempt.
They never create a retry, reconnect or resume. When readiness coincides with
the deadline, the deadline wins and no subsequent fake read or write occurs.
EOF, zero progress, excess progress, malformed data and cleanup failure all
invalidate the run.
## Evidence boundary
The 32 host tests cover immediate and pending connect paths, partial writes,
interrupted and timeout waits, exact deadline races, EOF, receive limits,
malformed results, cleanup and closed fake types. They prove only the Python
model's behavior. They do not prove:
- a deployed shsrv identity or port-2323 behavior;
- Windows scheduler or real socket timing;
- a live connect, send, receive or remote-process cleanup;
- firmware-9.60 behavior;
- RetroArch launch context, SDL, VideoOut or rendering.
## Decision
The dormant fake-syscall adapter is complete. A live adapter remains blocked
and absent. The next permissible step is an offline-only Phase 1.0AD design
for numeric target validation and an inactive activation record. That phase
must still contain no socket creation, connection, device request or enabled
authorization.
@@ -0,0 +1,24 @@
# Phase 1.0AD: inactive activation contract
Status: `INACTIVE_NUMERIC_TARGET_CONTRACT_COMPLETE_NO_LIVE_CAPABILITY`
Date: 2026-07-29
This phase closes the data boundary left by Phase 1.0AC. It does not add a
network adapter, target source, launcher, socket, DNS lookup, clock, CLI or
device action.
The tracked activation is entirely inactive and target-free. The host-only
contract can validate hypothetical future records, but validation neither
activates nor persists them. A candidate must use canonical private IPv4 text,
source-bound port 2323, a unique run ID, a window of at most five minutes and
separate SHA-256 identities for launcher, payload and untracked approval.
Retry, reconnect, resume, device writes, app termination and system remounts
are rejected. The contract deliberately cannot express authorization for
those effects.
The next useful phase is a separate offline architecture review of a minimal
BigApp launcher derived from official GPLv3 shsrv source. That review must
remove the general shell, persistent fake-app creation, remount behavior,
unbounded waits and arbitrary payload selection before target code is allowed.
@@ -0,0 +1,79 @@
# Phase 1.0AE: minimal BigApp launcher architecture
Status: `V07_NONPERSISTENT_LINEAGE_SELECTED_TARGET_IMPLEMENTATION_BLOCKED`
Date: 2026-07-29
## Objective
Identify the shortest public-source route from the proven raw-ELF VideoOut
failure to one bounded launch-context experiment. This is an offline source
review. It adds no target source, artifact, socket, transfer or execution.
## Source decision
Official shsrv v0.19 is not an acceptable base. Its hbldr path can remount
`/system_ex`, persistently create `FAKE00000`, copy an executable, kill the
running BigApp and enter unbounded ptrace/wait loops.
Official shsrv v0.7 is the selected reference lineage because it launches the
existing VideoPlayer WebApp title `PPSA01659` and contains no fake-app creation
or system-ex remount in its hbldr bundle. Selection is not authorization and
does not prove that the title exists, launches, owns VideoOut or behaves the
same way on firmware 9.60.
## Required minimal callgraph
The future design may model only this sequence:
1. validate one exact payload hash and fixed argument vector;
2. query the foreground user;
3. require that no BigApp is currently running;
4. attach to the source-proven SystemService parent;
5. arm bounded fork and exec observation before launch;
6. request launch of the fixed existing `PPSA01659` title;
7. detach the parent on every path;
8. replace only the newly observed child with the exact payload;
9. restore every temporary instruction and credential mutation;
10. detach the child or terminate only that newly created child on failure;
11. emit a bounded inherited result and stop.
The architecture must fail closed when a BigApp already exists. It must never
call `sceSystemServiceKillApp` as part of the experiment.
## Removed upstream behavior
- general Telnet shell and arbitrary command parsing;
- PATH search, arbitrary filesystem path and target-side ELF read;
- `FAKE00000`, `fakeapp_create_if_missing` and `remount_system_ex`;
- package installation, autoload and persistent writes;
- `hbdbg`, GDB wait and free-form arguments;
- arbitrary root/jail broadening unless separately proven indispensable and
exactly restored;
- unbounded `waitpid`, `pt_await_child`, `pt_await_exec`, `pt_call` and
`pt_syscall` loops;
- killing or replacing any pre-existing process;
- retry, reconnect and fallback title selection.
## Unclosed contracts
Target implementation remains blocked until an offline design proves:
- a deadline-capable wait primitive for every wait/step boundary;
- unique child correlation without acting on an unrelated process;
- complete parent detach and child cleanup for every failure edge;
- exact restoration of breakpoint bytes, page protections, credentials,
environment, root and jail changes;
- bounded ELF size, headers, segments, relocations and allocation;
- exact firmware-9.60 availability and role of `PPSA01659`, or a fail-closed
observation that does not install or mutate it;
- accepted public evidence for every SystemService/UserService declaration;
- an explicit policy for the unavoidable kernel/ptrace effects.
## Decision
The persistent v0.19 route is rejected. v0.7 is the preferred public-source
reference for a nonpersistent BigApp experiment, but copying or compiling it
is still blocked. The next phase may implement only a host lifecycle model
with injected fake operations and exhaustive failure cleanup. It may not add
PS5 headers, target source, syscall numbers, a target build or device action.
@@ -0,0 +1,25 @@
# Phase 1.0AF: offline BigApp lifecycle model
Status: `HOST_LIFECYCLE_MODEL_COMPLETE_TARGET_IMPLEMENTATION_BLOCKED`
Date: 2026-07-29
The host-only state machine implements the lifecycle selected in Phase 1.0AE
using exact built-in fake events. It contains no PS5 headers, process calls,
syscalls, socket, real clock, CLI or filesystem output.
The model refuses launch when a BigApp already exists. A successful synthetic
attempt must attach and arm the parent, request only fixed title `PPSA01659`,
observe one positive unique child identity, detach the parent, observe child
exec, replace one exact payload, restore temporary mutations, detach the child
and emit one result within 64 supplied ticks.
Failure injection proves the modeled unwind order. An acquired parent is
detached. A newly observed child is the only process eligible for termination.
If replacement began, restoration precedes termination. Cleanup failure is a
hard error rather than a clean result. These are properties of the model, not
firmware or runtime evidence.
Target implementation remains blocked. The next permitted work is a host-only
bounded ELF contract and validator so malformed or oversized payloads can be
rejected before any future launcher boundary.
@@ -0,0 +1,26 @@
# Phase 1.0AG: bounded ELF admission
Status: `BOUNDED_ELF_ADMISSION_IMPLEMENTED_HISTORICAL_ARTIFACT_BYTES_MISSING`
Date: 2026-07-29
The bytes-only validator admits only an exact SHA-256-bound, little-endian
x86-64 `ET_DYN` payload of at most 2 MiB. All ELF, program-header, optional
section-header and load-segment ranges must be contained in the supplied
immutable byte string.
At most 32 program headers, 256 section headers and eight load segments are
accepted. Load memory is limited to 64 MiB across a 128 MiB virtual span.
Segments must have power-of-two alignment no greater than 2 MiB, must not
overlap, and may never be both writable and executable. `PT_INTERP` is
forbidden and the entry must fall inside an executable load segment.
The parser has no path or file interface and performs no mapping, relocation
or execution. Synthetic tests cover identity, hash, type, machine, bounds,
alignment, overlap, permissions, interpreter, entry and header-count failures.
The consumed Phase-1.0M artifact is a size/hash reference only. Its exact bytes
are absent from the scanned workspace, so Phase 1.0AG does not claim to have
admitted it. A future canary must be rebuilt and validated from its exact bytes.
Before target mapping can be designed, the supported dynamic table and
relocation subset must be specified with the same bounds.
@@ -0,0 +1,28 @@
# Phase 1.0AH: dynamic and relocation contract
Status: `LOADER_CRT_RELOCATION_SPLIT_BOUNDED_TARGET_MAPPING_BLOCKED`
Date: 2026-07-29
This bytes-only phase extends Phase 1.0AG with one bounded dynamic table and
up to four `SHT_RELA` sections containing at most 4,096 entries. It has no
file, mapping, module-loading or execution interface.
The future launcher subset applies only `R_X86_64_RELATIVE`. Each target must
be eight-byte aligned and wholly inside an admitted RW load segment; the symbol
index must be zero and the addend must identify admitted image memory.
`R_X86_64_GLOB_DAT` is admitted only as SDK-CRT work, with a nonzero symbol
index, zero addend and an RW target. Every other relocation type fails closed.
The exact ordered `DT_NEEDED` inventory must be supplied per artifact and may
contain only the seven modules already evidenced for Phase 1.0M.
This distinction matters: official shsrv v0.7 applies RELATIVE relocations
while the pinned SDK v0.41 CRT loads `DT_NEEDED` modules and resolves dynamic
symbols. The latter is side-effecting runtime behavior, not a property proven
safe by this parser.
The historical M counts (913 RELATIVE, 142 GLOB_DAT, seven modules) remain
reference metadata because the bytes are absent. Target mapping remains
blocked until allocation, copy, BSS zeroing, final page permissions and full
failure restoration are modeled with bounded fake operations.
@@ -0,0 +1,25 @@
# Phase 1.0AI: offline mapping transaction
Status: `HOST_MAPPING_ROLLBACK_MODEL_COMPLETE_TARGET_MAPPING_BLOCKED`
Date: 2026-07-29
The host-only model consumes already admitted load metadata. It models one
new child region and one host mirror, exact file-byte copy and BSS zeroing per
segment, the admitted RELATIVE count, one mirror-to-child copy, final segment
protections, image sync and mirror release.
Success retains the new synthetic child region only after every protection,
sync and mirror-release step succeeds. Failure releases an acquired mirror and
unmaps the complete newly reserved child region. A partial image is never a
valid outcome. Cleanup failure is a hard error.
The supplied tick deadline is atomic: an operation that would cross the bound
is classified as not executed. This prevents ambiguous ownership when a
resource-creating operation meets the deadline.
The model rejects W+X segments and overlapping page-rounded protection ranges.
It contains no allocator, memory mapping, process, ptrace or target interface.
The next phase must bind every required primitive to official source and prove
how new mappings and any temporary protection changes are undone on every
failure path before target code is considered.
@@ -0,0 +1,30 @@
# Phase 1.0AJ: offline primitive source audit
Status: `HYBRID_PRIMITIVE_REUSE_CANDIDATE_GAPS_REMAIN_TARGET_CODE_BLOCKED`
Date: 2026-07-29
Official shsrv v0.7 remains useful only for the BigApp creation and replacement
lineage. Its loader implementation is not reusable: remote calls are unbounded,
and several alias-unmap, descriptor-close, host-unmap and rollback results are
discarded.
The hash-bound hardened `chimera-elfldr` fork supplies better candidates for
remote execution and cleanup. Its ptrace calls have monotonic deadlines and a
step ceiling, registers are restored, credential restoration attempts every
field, and acquired breakpoints, descriptors, mappings and children are handled
by centralized cleanup with reported failure bits.
This is not yet a complete BigApp loader. The hardened cleanup state does not
model every temporary JIT descriptor, alias and host mirror needed by the v0.7
mapping lineage. It also clears ownership bits after failed cleanup, so a
composition must make child termination the fail-closed terminal owner rather
than treating failed release as successful release. BigApp identity/correlation,
partial remote copy, final protection, sync and full rollback remain unbound as
one transaction.
The decision is therefore hybrid reuse by composition, not source copying:
retain v0.7 as provenance for BigApp creation, reuse only reviewed hardened
primitives, and first extend the Phase-1.0AI host model with every temporary
resource and cleanup failure. No target source, build or device action is
allowed by this audit.
@@ -0,0 +1,23 @@
# Phase 1.0AK: offline hybrid primitive composition
Status: `HOST_HYBRID_RESOURCE_OWNERSHIP_MODEL_COMPLETE_TARGET_CODE_BLOCKED`
Date: 2026-07-29
This host-only model composes the lifecycle and mapping ownership needed by a
future BigApp route. It explicitly tracks the child, whole image region, host
mirror and every per-executable-segment JIT master descriptor, alias descriptor,
host alias and remote alias.
Every forward operation is failure-injected. Acquired temporary resources are
released in reverse groups. A failed release is never treated as successful
release: once a child exists, bounded kill-and-reap is the terminal owner and
models operating-system reclamation. Failure of that terminal operation is a
hard error. A successful outcome retains only the child and committed image;
all temporary resources are closed.
The model contains no process, mapping, target, clock, socket or device
interface. It does not prove that the source primitives compose on firmware
9.60. In particular, partial progress and credential restoration for the SDK
`mdbg_copyin` path still require a source-bound audit before target code can be
considered.
@@ -0,0 +1,24 @@
# Phase 1.0AL: offline mdbg copy and restoration audit
Status: `SDK_MDBG_COPY_NOT_FAIL_CLOSED_DIRECT_REUSE_BLOCKED`
Date: 2026-07-29
The exact pinned SDK v0.41 `mdbg_copyin` implementation is unsuitable for
direct reuse in the hybrid loader. It changes the service process auth ID
before changing capabilities, but a capability-set failure returns without
restoring that auth ID. Its normal restoration also returns immediately after
an auth-ID restore failure, so capability restoration is not attempted.
The copy loop neither bounds iterations nor uses a monotonic deadline. It does
not reject a reported length larger than the remaining length, check pointer
arithmetic, or expose partial progress. A nonzero remote status with zero
progress can leave the syscall return value as zero, so return value zero does
not prove that the requested copy completed. Any earlier iterations may already
have mutated target memory.
A replacement contract must report exact progress and restoration failures,
attempt every required restoration on every exit, and terminate/reap the child
after any partial copy or restoration failure. This audit authorizes only a
capability-free host model of that contract; it does not authorize target code,
a build, connection, transfer or execution.
@@ -0,0 +1,22 @@
# Phase 1.0AM: offline bounded copy and restore model
Status: `HOST_EXACT_PROGRESS_AND_RESTORE_MODEL_COMPLETE_TARGET_CODE_BLOCKED`
Date: 2026-07-29
The capability-free model replaces the unsafe semantics identified in Phase
1.0AL. It validates 64-bit source and destination ranges, bounds total size,
chunk count and synthetic ticks, rejects zero or oversized progress, and
accepts completion only at the exact requested byte count.
Auth ID and capabilities are both backed up before modification. Every field
that changed is independently restored on every exit, with separate failure
bits. A partial copy requires child termination and reap. Any credential
restore failure additionally requires termination of the now-untrusted service;
failure of either terminal cleanup operation is a hard error.
Successful exact copy keeps the child alive for subsequent loader stages. This
is only host-model behavior. The model imports no credential, process, memory,
clock, network or target interface and does not establish the undocumented
remote status semantics or firmware-9.60 behavior. Target implementation stays
blocked pending service-lifecycle ownership and source review.
@@ -0,0 +1,25 @@
# Phase 1.0AN: offline service lifecycle and copy audit
Status: `FAIL_STOP_PRESENT_RESTART_AND_BOUNDED_COPY_UNPROVEN_TARGET_CODE_BLOCKED`
Date: 2026-07-29
The hardened elfldr fork has a real fail-stop for its ptrace credential scope.
If restoration of the temporary auth ID fails, a process-global latch rejects
all later ptrace calls. After the current request and its cleanup attempt, the
socket service calls `_exit(125)`.
That proves process termination, not safe recovery. No reviewed source owns a
bounded restart, verifies the identity of a replacement service, or proves
cleanup when startup-level credential restoration fails. Automatic restart is
therefore forbidden.
The alternative `pt_copyin` route is also insufficient. It issues one blocking
`PT_IO` request and does not validate returned descriptor progress. The source
has neither a hard deadline/preemption mechanism for that call nor proof that a
successful return means the exact requested byte count. It cannot replace the
unsafe SDK `mdbg_copyin` merely because it changes fewer credentials.
The next work may only design a host-only preemption and service-owner
architecture. No target source, build, connection, transfer, restart or device
execution is authorized.
@@ -0,0 +1,22 @@
# Phase 1.0AO: offline worker supervisor model
Status: `HOST_PREEMPTION_OWNERSHIP_MODEL_COMPLETE_TARGET_FEASIBILITY_UNPROVEN`
Date: 2026-07-29
The capability-free architecture isolates the potentially blocking copy and
temporary credentials in a one-shot worker. The persistent supervisor changes
no credentials. It accepts only a result bound to the exact worker identity,
exact requested byte count and zero restoration-failure bits.
A deadline terminates and reaps the worker. Once copy start is attempted, every
deadline, malformed/wrong-identity result, partial copy, restoration failure or
ambiguous start additionally terminates and reaps the child. Any terminal
cleanup failure is a hard error. The supervisor performs no retry and never
automatically restarts a worker or service.
This model does not prove that PS5 userland can create and uniquely identify
such a worker, preempt one blocked inside the relevant syscall, or return a
bounded authenticated result. It contains no process, signal, clock, IPC,
network or target interface. A source-feasibility audit is required before
target code can be considered.
@@ -0,0 +1,26 @@
# Phase 1.0AP: current-upstream worker feasibility audit
Status: `WORKER_CREATION_SOURCE_CANDIDATE_PREEMPTION_AND_RESULT_CHANNEL_BLOCKED`
Date: 2026-07-29
The current official SDK and shsrv heads were fetched as Git objects without
changing either pinned worktree. The SDK declares `rfork_thread`, and current
shsrv uses it both for forked shell builtins and its raw ELF process path. A
returned PID makes worker creation a strong public-source candidate.
That PID is not a generation-safe identity. There is no bounded worker-start
handshake or birth token. Official source uses `SIGKILL` and `waitpid`, but the
relevant waits are blocking and do not prove that a worker stuck in `mdbg` or
`PT_IO` can be terminated and reaped within a deadline on firmware 9.60. The
state of a separately mutated child after worker termination is also unknown.
Shell pipes are generic byte streams, not the fixed, identity-bound result
record required by Phase 1.0AO. They provide no exact progress/restoration
fields, bounded receive or deadline sealing. Current shsrv code must not be
copied: its broader persistence and lifecycle effects remain rejected by prior
phases.
The next allowed step is a capability-free fixed-result and PID-generation
contract. No target source, build, connection, transfer or execution is
authorized.
@@ -0,0 +1,23 @@
# Phase 1.0AQ: offline fixed worker result record
Status: `FIXED_RESULT_AND_GENERATION_IDENTITY_COMPLETE_TRANSPORT_BLOCKED`
Date: 2026-07-29
The bytes-only protocol is one exact 128-byte little-endian record. It binds an
attempt ID, worker nonce, worker and child PID, monotonic generation, requested
and copied byte counts, status and credential-restoration failure bits. The
first 96 bytes are protected by a trailing SHA-256 digest. Reserved and flag
fields must be zero.
PID alone is explicitly insufficient. A result is accepted only when every
identity field equals a precommit. Success additionally requires the exact
requested byte count and zero restoration failures. Failure records preserve
partial progress. Tests mutate every byte position and also reject rehashed
records with semantically invalid fields.
SHA-256 provides integrity here, not authentication; identity comes from the
precommitted attempt and nonce. The model has no random source, pipe, socket,
process, clock or target capability. Exclusive writer ownership, partial reads,
EOF/deadline behavior and PS5 pipe atomicity remain unproven, so no transport or
target implementation is allowed.
@@ -0,0 +1,21 @@
# Phase 1.0AR: offline exclusive result channel model
Status: `HOST_PARTIAL_READ_AND_DEADLINE_MODEL_COMPLETE_LIVE_CHANNEL_BLOCKED`
Date: 2026-07-29
The transport-free model consumes synthetic chunks from exactly one
precommitted writer. It supports every two-part split and byte-at-a-time
delivery of the 128-byte Phase-1.0AQ record. Completion of the exact record, not
EOF, is the only success boundary.
EOF or deadline before completion, silent incompleteness, overflow, digest or
identity mismatch, and any event after the exact record all fail closed. A read
that would cross the synthetic deadline is classified as not executed. Every
failed outcome requires the supervisor to contain worker and child.
The model does not rely on a 128-byte atomic write: partial reads are expected.
It contains no pipe, descriptor, real clock, process or target interface. Live
descriptor inheritance, close ordering, nonblocking reads and a hard deadline
must be bound to reviewed public source before a channel implementation can be
considered.
@@ -0,0 +1,21 @@
# Phase 1.0AS: offline channel primitive and FD ownership audit
Status: `PIPE_POLL_CANDIDATES_PRESENT_FD_INHERITANCE_AND_HARD_DEADLINE_BLOCKED`
Date: 2026-07-29
Current official SDK declarations and shsrv call sites make `pipe` and `poll`
public-source candidates. The shsrv telnet loop uses a short relative poll, but
does not compose it with an absolute monotonic deadline, EINTR budget
recalculation or bounded worker reap.
The decisive ownership mismatch is in worker creation. The official header
defines `RFFDG` as copying the descriptor table and `RFCFDG` as closing every
descriptor. Current shsrv workers use `RFCFDG`; a pre-created result pipe would
therefore not be inherited. No reviewed worker path uses `RFFDG` with exclusive
parent/child pipe-end closure or close-on-exec handling.
Headers alone do not prove that a new composition is safe on firmware 9.60.
The next phase may model FD acquisition, inheritance, close ordering, EINTR and
an absolute deadline using fake operations only. No live channel, target source,
build or device action is authorized.
@@ -0,0 +1,20 @@
# Phase 1.0AT: offline RFFDG FD/deadline model
Status: `OFFLINE_OWNERSHIP_MODEL_COMPLETE_LIVE_COMPOSITION_BLOCKED`
Date: 2026-07-29
This phase composes the Phase-1.0AS source candidates in a fake-only ownership
transaction. A pipe exists before the modeled `RFFDG` worker copy. The parent
closes its write end, the worker closes its read end, and the parent assembles
one exact Phase-1.0AQ record through a nonblocking partial-read model.
One 256-tick absolute budget covers setup, EINTR, would-block and data events.
Deadline, early EOF, overflow, a damaged record or any trailing read event
contains the worker. Every acquired pipe end is closed and every started worker
is terminated and reaped; a cleanup failure is itself a hard model error.
The facade is scripted and imports no OS, process, clock, network or filesystem
capability. It does not establish a real `RFFDG` composition, hard wall-clock
preemption, bounded real reap or firmware-9.60 behavior. No target source,
cross-build, connection, transfer or execution is authorized.
@@ -0,0 +1,21 @@
# Phase 1.0AU: offline live result-channel feasibility reassessment
Status: `PRIMITIVE_SIGNATURES_COMPLETE_COMPOSITION_AND_RUNTIME_BLOCKED`
Date: 2026-07-29
The current official SDK headers expose the complete source-level vocabulary
needed by the Phase-1.0AT model: `pipe`, `RFFDG`, `fcntl` with `O_NONBLOCK`,
`poll`, `CLOCK_MONOTONIC`, `kill`, and `waitpid` with `WNOHANG`.
No audited official callsite composes that vocabulary into the required
channel. Current shsrv builtin workers use `RFCFDG`, which closes pre-created
descriptors. Its waits are not bounded by one absolute monotonic deadline and
the service has an automatic restart loop. Direct code reuse would violate the
one-shot, no-retry and explicit-supervisor boundaries.
Headers are declarations, not firmware-9.60 runtime evidence. The AT fake
model is not proof of hard preemption, real descriptor cleanup, launch context,
VideoOut ownership or a visible flip. A live or target implementation remains
blocked. The next permitted step is only an offline, target-free canary
contract with a distinct post-result terminal state.
@@ -0,0 +1,28 @@
# Phase 1.0AV: target-free launch-context canary contract
Status: `OFFLINE_CAUSAL_PAIR_CONTRACT_COMPLETE_NO_ARTIFACT_OR_AUTHORITY`
Date: 2026-07-29
AV defines the minimum causal comparison for the launch-context hypothesis.
Both arms must use the same exact future payload and `CHD10AV1` protocol. One
arm uses raw elfldr and the other a separately identified BigApp candidate.
Launcher hashes, run IDs and approval hashes must differ; neither approval can
carry to the other arm. Retry, reconnect, resume, installation and autoload are
forbidden.
Each supplied result must prove submit, then D04, then a distinct later cleanup
terminal. Missing or early terminal state makes the pair incomparable. Identity
drift, a retry, a persistent-write count or an unscoped visible-output claim is
a hard contract failure. Graphics operations have a separate closed approval
gate and are not conflated with persistent writes.
A changed submit return is classified only as a launch-context candidate. A
zero return is not interpreted as a visible flip, correct VideoOut semantics or
root cause. This module processes synthetic immutable values only. There is no
target source, artifact, address, transport, activation or device authority.
Before any implementation can be considered, a separate offline audit must
bind the exact source delta, post-D04 terminal, launcher effects and result-path
feasibility. BigApp termination requires its own explicit artifact-specific
approval and is currently false.
@@ -0,0 +1,28 @@
# Phase 1.0AW: offline canary source-delta and effect audit
Status: `SOURCE_DELTA_BOUNDED_RESULT_PATH_CANDIDATE_EFFECTS_BLOCK_ARTIFACT`
Date: 2026-07-29
The historical Phase-1.0M bytes are absent and implement `CHD10J01`, where
D12 is terminal and D04 can follow it. They cannot satisfy AV and cannot be
reused. A new profile must build one ELF for both launch arms; launcher identity
must never become a compile define or payload-byte difference.
The smallest source design adds `CHD10AV1` and D14. Submit-before-D04 ordering
is retained. D12 becomes shutdown-request evidence only. D14 may be emitted
once, through inherited stdout, only after `rarch_main` returns, S15 is set,
the initialized mask is empty, cleanup ordering has no errors and a new cleanup
failure counter is zero. The counter is necessary because the current
first-error field can retain E106 and mask a later E122 cleanup failure.
Official shsrv v0.7 supplies a source candidate for the other arm: hbldr passes
stdout to `elfldr_exec`, which duplicates it into the replaced BigApp process,
and the v0.7 shell framing is raw. This does not prove a live binary channel.
The deployed identity is unknown and host completion remains unimplemented.
The same v0.7 route reads a device-resident ELF, kills the running BigApp,
launches PPSA01659, waits indefinitely for child discovery, mutates kernel and
ptrace state, and changes root/jail state. Direct reuse is rejected. No source
was changed, no artifact was built, and no device action is authorized. Only a
host-tested, non-target source design may follow.
@@ -0,0 +1,24 @@
# Phase 1.0AX: host-only AV protocol and cleanup model
Status: `HOST_REFERENCE_MODEL_COMPLETE_TARGET_SOURCE_AND_ARTIFACT_BLOCKED`
Date: 2026-07-29
AX turns AW's source requirements into an exact bytes-only reference model.
Frames remain 64-byte, big-endian and CRC-bound over the first 60 bytes, but
use `CHD10AV1`. Historical wire values are preserved and D14 is appended at
stage value 30. D12 cannot carry the terminal flag; only a final D14 can.
D14 records the current initialized mask, cleaned mask, `rarch_main` result,
cleanup-order errors and the independent cleanup-failure count. It is generated
only when `rarch_main` returned, D04 was emitted, phase S15 was reached, no
subsystem remains initialized and both cleanup error counts are zero.
The trace layer requires exactly one D07, D04 and final D14 in that order,
strictly increasing sequence values, at most one D12 and no post-terminal data.
All 64 single-byte mutations fail CRC or canonical parsing. Correctly
rechecksummed but false cleanup claims also fail.
This is Python byte processing only. It creates no target profile, source,
artifact, socket, process, output file, address or authorization. Passing it
proves neither target equivalence nor firmware behavior.
@@ -0,0 +1,20 @@
# Phase 1.0AY: offline RetroArch target-source base reassessment
Status: `EXACT_PHASE10N_BASE_SELECTED_HOST_SOURCE_PATCH_ONLY`
Date: 2026-07-29
The local primary RetroArch checkout remains on the historical loader-diagnosis
branch. It is not switched or rewritten. The exact source base selected for the
next isolated worktree is private commit `606909706f91d7213751c245081333f56c2cce89`,
the inactive Phase-1.0N runner tip.
That commit descends from Phase-1.0M, contains its artifact audit and preserves
all target-source blobs relevant to AX byte-for-byte. Its Makefile difference
adds only inactive N runner validation. This makes it the least-lossy base and
avoids replaying the completed M/N history onto the older checkout.
The next patch is limited to host-tested source structure: cleanup-failure
accounting, `CHD10AV1`, D14 and its cleanup predicate. It may not add a target
profile, cross-build, artifact, launcher-specific define or runner activation.
Every hardware and build authorization remains false.
@@ -0,0 +1,30 @@
# Phase 1.0AZ: host-tested AV source structure
Status: `REMOTE_BOUND_HOST_TESTED_SOURCE_TARGET_REASSESSMENT_ONLY`
Date: 2026-07-29
An isolated RetroArch worktree was created from the exact Phase-1.0N tip and
committed locally as `a3887edd90780426b3762d42b8e3b96f8ca6813d`. The change
implements the source structure selected by AY without creating a PS5 build
profile or artifact.
The distinct stream magic is `CHD10AV1`; D14 is appended as stage 30 without
renumbering historical stages. Under the AV host define, D11 and D12 are
nonterminal. D14 is the sole terminal and is attempted at most once only after
a successfully written D04, reported `rarch_main` return, S15, an empty
initialized mask, zero cleanup-order errors and zero cleanup failures.
Duplicate or failed cleanup is counted independently from the sticky first
error, so an earlier runtime error cannot mask cleanup failure.
The new ASan/UBSan host test passed, as did every C host test and the existing
Windows-side Phase-1.0I/J/K/M/N and structural validators. The combined WSL
target stopped only when an older validator invoked `git ls-files`: a linked
Windows worktree stores a Windows-absolute gitdir that WSL Git cannot resolve.
The inherited HTTPS remote first failed authentication. The repository was then
pushed through the same private Gitea SSH route already configured for Chimera
GFX, and `origin/codex/ps5-phase10az-host-av-source` was fetched back as the
exact commit above. Remote source binding is therefore complete. Only an
offline target-profile reassessment may follow; no target build, ELF,
connection, transfer, execution or device action is authorized.
@@ -0,0 +1,49 @@
# Phase 1.0B device risk assessment
Overall classification:
`RETROARCH_PS5_DEVICE_SMOKE_CANDIDATE_BUILT_WITH_DECLARED_RISKS`.
## Hard boundaries satisfied offline
- no PS5 connection, request, transfer or execution occurred;
- no installation, autoload, live replacement, sender or retry exists;
- no content/config file is required;
- persistent write attempts fail closed;
- the run requests shutdown at 60 seconds or 3,600 frames;
- Options held for two seconds provides an additional shutdown;
- the final ELF contains no SceNet, GNM, module-loader, installer, mount,
reboot, console-shutdown or other-payload launch import;
- SDL's dynamic API and runtime assertion-exit path are disabled, leaving one
smoke-owned post-teardown `_Exit` callsite;
- the primary ELF contains no permanent W+X load segment.
The strings audit still sees shared RetroArch localization text for disabled
network, autoload and reboot menu entries, plus the generic
`udp://127.0.0.1:` template. These are inert data findings, not hidden
functionality: the complete undefined-symbol inventory has no networking
primitive, and no RetroArch network callgraph is linked. SDK runtime-loader
symbol-name strings remain separately because the pinned CRT resolves its
own loader at runtime.
## Declared device-test risks
| Risk | Class | Bounded mitigation | Residual |
|---|---|---|---|
| SDK CRT temporary kernel/process patches before `main` | session/integrity | exact SDK v0.41 source and controlled runtime identity | firmware-9.60 effect unobserved |
| SDK CRT runtime loader | session/initialization | exact source and DT_NEEDED inventory; no RetroArch dynamic-core path | CRT resolves `sceKernelLoadStartModule` at runtime and can conditionally load `libSceSysmodule`; this is not visible as an ELF import |
| `sceAudioOutOutput` is blocking | session hang | SDL worker, error counters, outer 60 s policy | no public timeout ABI; thread/join can still block |
| VideoOut/Pad/AudioOut open calls lack an evidenced timeout variant | session hang | single attempt, no retry, partial cleanup | underlying call can outlive outer policy |
| direct-memory mapping has no separately evidenced unmap in pinned SDL headers | cleanup | release direct memory and process exit | mapping cleanup before exit is incomplete/unproven |
| new RX/R/RW layout | child/session crash | source-bound loader flag handling and relocation audit | device behavior unobserved |
| `_Exit` in injected child | session termination | one smoke-owned call after teardown; SDL secondary exit paths compiled out | exact firmware behavior unobserved; SDK init-failure fallback still owns its separate `exit` path |
| write firewall relies partly on link wrapping | integrity | VFS guard plus import/disassembly/callgraph audit | libc-internal behavior is not intercepted |
| controller mapping differs from label conventions | operability | source-bound Options-to-SDL-Back-to-RetroArch-Select chain | on-device button observation absent |
These are not brick-safety guarantees. A later operator must explicitly
accept possible black screen, missing audio/input, process crash, lost
jailbreak/host session, forced manual reboot after a hang, and no diagnostic
after video teardown.
The missing byte-exact Payload Manager backup remains a separate installation
blocker. This candidate does not alter that gate because it is not an
installation proposal.
@@ -0,0 +1,62 @@
# Phase 1.0B linker and W^X analysis
## SDK baseline
PS5 Payload SDK v0.41 `ldscripts/elf_x86_64.x:20-25` emits three load
segments but deliberately marks text `0x7` (RWE), rodata `0x6` (RW) and data
`0x6` (RW). The Phase-1.0A software ELF consequently has a permanent RWE
text segment.
## Loader evidence
Both public elfldr `699e8bcff03e91e8d6ca6eba281af25c5a58d8c2`
and hardened elfldr `197623058f509eddde18868dafcb92fdcac66464`:
- enumerate every `PT_LOAD`;
- initially reserve one RW image mapping;
- copy all segments and apply `R_X86_64_RELATIVE` relocations in the host
mirror;
- copy the completed image to the child;
- translate every `p_flags` bit through `PFLAGS`;
- use `kernel_mprotect` for executable segments and `pt_mprotect` otherwise.
Relevant hardened source is `elfldr.c:54-56,144-263`. This supports multiple
load segments and a temporary relocation-write phase followed by final
per-segment protection.
## Smoke layout
The smoke-only `pkg/ps5/elf_x86_64_smoke_wx.x` preserves the SDK symbols and
0x4000 page alignment while arranging:
- `.text` and `.plt`: RX;
- unwind tables and constant `.rodata`: R;
- dynamic symbol/hash/string/relocation tables, `.data.rel.ro`, GOT,
init/fini arrays, `.dynamic`, `.data` and `.bss`: RW.
Runtime-relocated GOT and related metadata deliberately remain writable.
The final program-header audit must show no segment with both W and E. All
`R_X86_64_RELATIVE` destinations must lie in RW load ranges. The primary
candidate is accepted only if both checks pass twice byte-identically.
## RELRO and self-modification
The pinned SDK/loader contract does not implement a post-CRT RELRO transition.
Marking the GOT read-only before SDK runtime linking would be unsafe, so no
RELRO claim is made. No self-modifying RetroArch/smokecore code, JIT or
dynamic core loader is enabled or reachable. No production elfldr code was
changed.
## Residual risk
W^X is statically established, but the exact protected layout has not run on
firmware 9.60. Loader protection errors, an SDK runtime write to an
unexpected R-only section, or firmware-specific mapping behavior could end
the child/session. No persistent installation effect follows from the
artifact design, but that claim also remains unobserved.
The SDK CRT's statically linked runtime loader is present independently of
RetroArch's feature set and may conditionally load `libSceSysmodule`.
The final import list has no module-loader symbol, but absent imports alone
are not used as proof that startup has no module effects; the CRT source and
startup disassembly are the controlling evidence.
@@ -0,0 +1,47 @@
# Phase 1.0B persistent-write audit
Conclusion: persistent device writes are fail-closed in the selected smoke
paths; device execution remains unauthorized.
## Layers
1. The PS5 frontend blocks config reads, supplies no content/config/SRAM/state
path and selects a static no-content core.
2. RetroArch VFS accepts only `RETRO_VFS_FILE_ACCESS_READ`. Write, truncate,
remove, rename and mkdir return failure and trip `E118`.
3. Link-time wrappers reject write-capable `open/openat`, non-read-only
`fopen`, non-stdio `write/fwrite`, and all create, temp, rename, unlink,
remove, mkdir, rmdir, chmod, chown and truncate calls.
4. A rejected operation returns `EROFS`, stores the first operation in memory,
requests shutdown once and never retries.
`stdout` and `stderr` writes remain allowed because the SDK CRT/RetroArch can
already use those process streams. They are not file-output authorization.
The ELF imports read-only filesystem primitives (`open`, `fopen`, `read`,
`fread`, `stat`, directory iteration); the frontend has no content/config
path, but normal runtime/module implementation can still use read primitives.
## Static reachability result
Final link garbage collection removes wrapper bodies for operations with no
remaining caller. Reachable application calls to `open`, `fopen` and `fwrite`
resolve to `__wrap_open`, `__wrap_fopen` and `__wrap_fwrite`; their only
forward edges are read-only opens or stdout/stderr. The underlying libc
imports remain because accepted paths forward to them.
No final import is present for `rename`, `unlink`, `remove`, `mkdir`, `chmod`,
`chown`, `ftruncate`, `mkstemp`, `tmpfile` or `freopen`. Static absence alone
is not the safety claim: the VFS guards, wrappers, linker map and disassembly
together provide the offline evidence.
## Explicit exclusions
The profile disables or provides no route for config save, playlist/history,
SRAM, savestate, screenshot, recording, shader cache, autoconfig, remap,
database, temporary file, installation and autoload. It contains no device
path, IP address, sender, transfer or installation package.
Limit: libc internals invoked inside an imported function are not intercepted
by linker wrapping. No application path can supply a writable file stream
because writable open modes are blocked, but this remains static reasoning,
not observed firmware behavior.
@@ -0,0 +1,49 @@
# Proposed Phase 1.0B one-shot test
Status: proposal only. Transfer and execution are not authorized.
## Preconditions for a later review
- bind approval to the complete ELF SHA-256, size, source commit and manifest
SHA-256;
- operator independently confirms firmware 9.60 in the PS5 UI;
- autoload remains disabled and no live path is selected or replaced;
- exactly one transfer and one execution are separately authorized;
- no retry, reinstall, backup, recovery, configuration or second payload is
combined with the window;
- operator accepts all risks in the device-risk assessment.
## Expected visible sequence
1. A software framebuffer appears with `CHIMERA RETROARCH PS5 SMOKE TEST`.
2. Initialization can pass rapidly through `S01`-`S06`; these phases are not
guaranteed to receive their own visible frame.
3. `S07` shows increasing monotonic time/frame count, VideoOut/flip index,
320 x 240 source with destination pitch/dimensions, XRGB8888 format code,
controller buttons/sticks, AudioOut counters, core state and `E000`.
4. Holding Options for two seconds shows hold progress and requests `S08`.
Without input, 60,000 ms or 3,600 frames requests the same bounded path.
5. The final visible frame can show `S08` and its shutdown reason.
6. `S09`-`S15` run after the last present; `_Exit` ends the child. No visible
completion frame is promised.
## Operator stop criteria
Do not retry. Stop the window and record the last visible phase/error when:
- no image appears;
- framebuffer bounds are `FAIL`;
- any error other than `E000` appears;
- flip count stops advancing;
- input state is implausible or Options does not progress;
- AudioOut submit time grows unexpectedly or frames stop;
- the screen freezes beyond 60 seconds;
- RetroArch exits before the expected phase;
- the jailbreak/host session disappears;
- any write-firewall trip is shown;
- any unexpected notification, install, autoload, network or filesystem
behavior is observed.
If the child does not exit, the proposal permits no automated kill, retry or
reboot command. The operator may later decide manually whether a console
reboot is necessary, outside the authorization window.
@@ -0,0 +1,65 @@
# Phase 1.0B runtime and exit contract
Status: source-bound offline contract; firmware-9.60 behavior remains
unproven until a separately authorized one-shot run.
## Stateful lifecycle
The status record tracks platform, frontend, SDL, video, input, audio, core,
threads, buffers, direct memory and device handles. Initialization records
each subsystem once in a bounded stack. Cleanup may touch only an initialized
bit, runs once, and verifies reverse order. An order violation is sticky
`E120`, duplicate init is `E119`, duplicate cleanup is `E121`, and a cleanup
failure is `E122`. Host fault injection covers every partial-init boundary,
every per-subsystem cleanup failure and an out-of-order cleanup.
Video cleanup stops future flips, destroys the software surface and event
queue, closes VideoOut, releases direct memory, then clears handles. Input
cleanup closes Pad before its state is cleared. Audio cleanup stops the SDL
worker before AudioOut close and records the elapsed cleanup time. The pinned
public SDL source exposes release of direct memory but no separately evidenced
direct-memory unmap primitive; this remains a declared cleanup uncertainty.
## Exit alternatives
| Option | Exact evidence | Destructors/cleanup | Continuation | Decision |
|---|---|---|---|---|
| return from `main` | SDK `crt/crt.c:133-146,153-170,196-220` | SDK `.fini` runs | a hijacked process returns through the synthetic address placed by elfldr | rejected |
| `payload_exit` | SDK `crt/crt.c:174-180`, `payload.h:45-51` | long-jumps into CRT | still reaches `payload_terminate`; hijacked route returns | rejected |
| libc `exit` | imported and used by SDK `payload_terminate` only for a non-hijacked process | libc exit semantics; would bypass the remaining SDK payload path when called directly | process termination expected | not selected |
| libc `_Exit` | public libc import in the final ELF; direct call from smoke `main` | all RetroArch/SDL cleanup runs first; no process destructors after call | no synthetic return | selected |
The selected method is compile-time
`CHIMERA_PS5_EXIT_PROCESS_EXIT=1`. After `rarch_main` completes,
`main` sets `S15` and reaches one smoke-owned `_Exit(result)` call.
The smoke SDL overlay disables the dynamic API and sets
`SDL_ASSERT_LEVEL=0`, removing SDL's secondary `SDL_ExitProcess` callsites.
Disassembly and the undefined-symbol inventory bind this decision. It does
not reboot, launch another process, retry or write a device file. The SDK CRT
still imports `exit` for its own pre-`main` initialization-failure
termination; that separate startup path is not represented as the selected
smoke exit.
## Loader relationship
Hardened elfldr commit `197623058f509eddde18868dafcb92fdcac66464`
spawns a separate child, writes the pre-injection RIP to `rsp-8`, enters the
payload at `_start`, and on the controlled route waits under a bounded
watchdog (`elfldr.c:381-410,643-768`;
`socksrv.c:128-157`; `ps5_controlled.c:186-215`). `_Exit` terminates that
child instead of resuming the synthetic continuation.
This is stronger source evidence than returning, but it is not device
evidence. Remaining exit risks are:
- SDK CRT initialization and temporary runtime patches occur before `main`;
- SDK CRT startup resolves runtime-loader functions and may conditionally
load `libSceSysmodule` before entering RetroArch;
- firmware-9.60 libc `_Exit` behavior in this exact injected child is
unobserved;
- a blocked AudioOut call or SDL join can prevent reaching `_Exit`;
- the controlled loader route itself is not authorized or exercised here;
- ending the child can end the current host/jailbreak session, which is a
session risk rather than an installation guarantee.
No execution-review bundle has been produced.
@@ -0,0 +1,81 @@
# Phase 1.0B bounded RetroArch smoke candidate
Status: `BUILT_WITH_DECLARED_RISKS`; offline evidence only. Transfer,
installation and execution are not authorized.
## Scope
The candidate is the real RetroArch v1.22.2 frontend and runloop from the
separate `chimera-retroarch` fork. It statically binds `chimera_smokecore`,
uses the pinned PS5 SDL2 software framebuffer, and initializes VideoOut, one
Pad device and stereo AudioOut. It requires neither content nor a
configuration file. It is not a mini-frontend and contains no dynamic core.
The permitted existing smokecore software image is selected, so RGUI/menu
and their content browser are compiled out of this bounded variant.
The logical profile is `ps5-software-rgui-smoke-bounded`; the make selector is
`PS5_PROFILE=software-smoke`, and the output label is
`retroarch_ps5_software_smoke.elf`.
## Compile-time closure
Enabled:
- real RetroArch frontend and runloop;
- static Chimera smokecore, 320 x 240 XRGB8888 at 60 fps;
- SDL2 software video with double-buffered PS5 VideoOut;
- one SDL2 PS5 Pad and 15% deadzone;
- SDL2 PS5 48 kHz stereo AudioOut;
- on-screen bounded status record;
- 60,000 ms and 3,600-frame shutdown gates;
- post-teardown process `_Exit`;
- VFS and link-time libc write firewalls.
Disabled or garbage-collected from the final ELF:
- dynamic cores, content browser data, playlists/history, databases;
- networking, updater, achievements and command interfaces;
- screenshots, recording, shaders, filters and compressed content;
- SRAM, savestates, remap/autoconfig/config persistence;
- keyboard, IME, mouse, sensor, haptic, rumble and lightbar paths;
- GNM, OpenGL, Vulkan, RetroArch dynamic-core/module loading, installation,
autoload and retry.
SDL's dynamic API and runtime assertions are disabled in its smoke-specific
static build. The pinned SDK CRT remains a necessary startup component: it
resolves its own runtime loader primitives and may conditionally load
`libSceSysmodule`. This source-bound startup behavior is declared separately
and is not confused with a RetroArch dynamic-core path.
`HAVE_CONFIGFILE=0`, `HAVE_MENU=0` and `HAVE_RGUI=0` remove their read,
browser and save paths. Independently, the PS5 frontend sets
`RARCH_CTL_SET_BLOCK_CONFIG_READ`, provides no config path, and the smoke
firewall rejects every attempted write.
## Visible record
The static core draws `CHIMERA RETROARCH PS5 SMOKE TEST`, a build/manifest
label, phase, monotonic elapsed time, frame count, VideoOut and framebuffer
details, raw button/stick state, AudioOut counters, core state, shutdown
reason, first sticky error, write-firewall state and both hard limits.
Phases are stable `S00` through `S15`; errors are stable `E000` and
`E101` through `E123`. `S07 RUNNING` and a final rendered
`S08 SHUTDOWN_REQUESTED` are expected on screen. `S09` through `S15` occur
during teardown after the final present and therefore remain in the
in-memory record rather than being promised as visible frames.
## Bounded control
The first condition wins:
1. Options held for 2,000 ms;
2. 60,000 monotonic milliseconds;
3. 3,600 core frames;
4. a sticky runtime/write-firewall failure.
The pinned SDL mapping maps the PS5 Options bit to SDL Back, which RetroArch
exposes to the core as `RETRO_DEVICE_ID_JOYPAD_SELECT`. Shutdown is requested
once. There is no retry, second run or automatic extension.
No host test or static audit in this phase is hardware evidence.
@@ -0,0 +1,24 @@
# Phase 1.0BA: offline AV target-profile and callsite audit
Status: `EXACT_CALLSITE_AND_PROFILE_DELTA_SOURCE_PATCH_ALLOWED_NO_BUILD`
Date: 2026-07-29
The remote-bound AZ commit leaves one exact integration point in `main`: after
`rarch_main` returns and S15 is set, but before `_Exit`. On the normal PS5 loop
return, `rarch_main` has already called `main_exit`; the PS5 frontend deinit
then removes its SDL, frontend and platform initialization markers. Early
initialization returns that bypass `main_exit` retain initialized bits and the
AZ predicate therefore rejects D14.
The smallest profile is a derivative of `write-diag`: it retains the
contentless `-v` startup correction, write firewall, D13 operation evidence,
bounded runtime, inherited stdout, SDL diagnostic overlay and frame-zero
source. The only new target define is `CHIMERA_PS5_AV_DIAG`; its stream magic
takes precedence over the inherited J selection. Launcher identity remains
outside the payload so both future launch arms use one byte-exact ELF.
The next source commit may add the call and a distinct `launch-canary` profile,
plus host/static tests. This audit does not permit a cross-build, ELF, runner
activation, connection, transfer, execution or PS5 action. A subsequent exact
source audit must authorize any artifact build separately.
@@ -0,0 +1,21 @@
# Phase 1.0BB: source-only launch-canary profile
Status: `REMOTE_BOUND_SOURCE_PROFILE_COMPLETE_BUILD_PREREQUISITE_AUDIT_ONLY`
Date: 2026-07-29
RetroArch commit `b0f5178e5acb59172fb352098d2ba32e5c42831b` adds the
BA-authorized post-S15/pre-`_Exit` terminal call and a distinct
`launch-canary` profile. The profile inherits write-diag startup, SDL overlay,
write firewall, inherited stdout and bounded runtime behavior. No launcher
identity enters the payload bytes.
All host C/sanitizer tests, existing parser/runner tests, historical source
validators, the BB mutation tests and PS5 structural validation passed. No
launch-canary ELF or map was produced. The source commit was pushed to and
read from the private Gitea origin.
Only an offline prerequisite audit may now determine whether the exact pinned
SDK, SDL archive, linker script, write wrappers and expected object graph are
present and hashable. This phase does not authorize a cross-build, artifact,
runner activation or device action.
@@ -0,0 +1,22 @@
# Phase 1.0BC: offline launch-canary cross-build prerequisite audit
Status: `PREREQUISITES_PARTIAL_EXACT_SDL_MATERIALIZATION_REQUIRED`
Date: 2026-07-29
The installed public SDK v0.41, clean public SDL commit, reviewed diagnostic
patch and W^X linker script are present and hashable. The SDK release remains
bound to the upstream lock and the local wrapper resolves to Ubuntu Clang
18.1.8.
The isolated RetroArch worktree has no `build/ps5-sdl2-write-diag/libSDL2.a`.
No matching archive exists elsewhere in the declared Chimera project scope.
WSL also has no CMake or Ninja command at this observation. Reusing an unknown
archive or silently selecting the unpatched SDL tree is forbidden.
The next phase may add and host-test a target-free materializer that accepts
only SDL commit `0baf4ac49382b537ba449901b5b6d0d189bb1fbb`, patch SHA-256
`aa1d3ebc...70c193` and the locked SDK. It must create outputs only in ignored
build storage and must stop before compiling RetroArch. This phase authorizes
neither SDL compilation nor a launch-canary cross-build, artifact or device
action.
@@ -0,0 +1,19 @@
# Phase 1.0BD: dormant exact SDL materializer policy
Status: `REMOTE_BOUND_POLICY_COMPLETE_ADAPTER_SOURCE_ONLY`
Date: 2026-07-29
RetroArch commit `c003c503ff0b747bd161c75ad7329a62d3880da0` adds a pure
policy for the missing SDL archive. It accepts only the BC-bound SDL commit,
diagnostic patch and SDK file hashes, requires clean and absent output state,
and returns one immutable Ninja/Release/SDL2-static plan affecting exactly the
three reviewed PS5 SDL files.
The module has no process, network, clock, filesystem adapter or CLI. It cannot
materialize or compile anything, and its plan excludes both RetroArch building
and device actions. Static validation, identity mutations, prerequisite
mutations and the complete existing host matrix pass.
The next phase may implement an injected host adapter and fake-adapter tests.
It may not yet invoke CMake/Ninja, build SDL or RetroArch, or act on a PS5.
@@ -0,0 +1,15 @@
# Phase 1.0BE: fake-only SDL materializer adapter
Status: `REMOTE_BOUND_FAKE_ADAPTER_COMPLETE_LIVE_ADAPTER_REASSESSMENT_ONLY`
Date: 2026-07-29
RetroArch commit `1c874e725d3c4a51ffbc7b21e18b7548ffcf1b97` composes
the BD plan with an exact-type-checked built-in fake adapter. It proves the
identity, absence, detached-stage, patch-check, patch, changed-file, configure,
SDL-only build and archive-verification order. Every synthetic failure stops
before later operations; subclasses and changed-file drift are rejected.
There is no subprocess, filesystem, network or device capability. Fake success
is not materialization or build evidence. Only an offline live-adapter source
reassessment may follow; SDL/RetroArch builds and device actions remain false.
@@ -0,0 +1,22 @@
# Phase 1.0BF: offline live SDL adapter boundary audit
Status: `LIVE_ADAPTER_CONTRACT_BOUND_SOURCE_ONLY_NO_INSTALL_OR_BUILD`
Date: 2026-07-29
The BE operation order can be implemented by a dormant local adapter only if
all paths resolve beneath the declared RetroArch build root, every argv is a
fixed sequence passed without a shell, identity output is bounded, each process
has a hard timeout, and fresh stage/build/archive paths are required. One
failure consumes the attempt; there is no retry, fallback, resume or automatic
cleanup.
The adapter may know only Git, CMake and Ninja operations needed for the exact
SDL archive. It may not contain apt/package installation, network, RetroArch
compilation, target address, device command or launch behavior. Patch checking
must precede patching, and the changed-file set must equal the three BD paths.
Local Ubuntu metadata identifies official repository candidates CMake
`4.2.3-2ubuntu2` and ninja-build `1.13.2-1`; neither is installed. This audit
does not authorize installation. It authorizes dormant adapter source with
fake-process tests only and no invocation against the real workspace.
@@ -0,0 +1,15 @@
# Phase 1.0BG: dormant SDL materializer request compiler
Status: `REMOTE_BOUND_REQUEST_GRAPH_COMPLETE_EXECUTOR_SOURCE_ONLY`
Date: 2026-07-29
RetroArch commit `de23ac2e1debe8c538b2eb1ff973849ad6892946` converts the
reviewed plan into eight fixed Git/CMake argv tuples. Output paths are confined
below the RetroArch build root; identity output is capped and every request has
a timeout. The graph contains no shell, package manager, RetroArch build,
network, launcher or device operation.
The component has no process or filesystem executor, so no command ran and no
archive exists. Only bounded executor source with injected fake facades may
follow. Tool installation, materialization and cross-building remain false.
@@ -0,0 +1,16 @@
# Phase 1.0BH: bounded one-shot SDL executor
Status: `REMOTE_BOUND_FAKE_FACADE_EXECUTOR_COMPLETE_REAL_FACADE_REASSESSMENT_ONLY`
Date: 2026-07-29
RetroArch commit `aa5002e0794834f737f7a3a55571a29465d877df` adds a
one-shot executor over exact fake process/filesystem facades. Consumption
precedes preflight. Request order, exit status, UTF-8, output limits, source
commit, clean state, changed-file set and final archive presence are enforced.
Every tested success or failure prevents reuse.
No real subprocess/filesystem implementation or CLI exists and no command was
run. Only a real-facade and official-tool-installation reassessment may follow;
installation, SDL materialization, RetroArch cross-build and device action
remain unauthorized.
@@ -0,0 +1,21 @@
# Phase 1.0BI: real facade and exact host-tool installation audit
Status: `REAL_FACADE_SOURCE_AND_EXACT_TOOL_INSTALL_ALLOWED_NO_BUILD`
Date: 2026-07-29
The bounded facade may use Linux `Popen` only with `shell=False`, a new process
session, nonblocking merged output, selectors, monotonic time, a per-request
byte cap and process-group termination on timeout/overflow. It may expose only
the eight BG requests and read-only output-existence checks. There is no CLI,
retry, cleanup, package manager, RetroArch operation, network or device path.
The WSL environment is x86_64 with Python 3.14.4 and noninteractive sudo.
Official Ubuntu resolute metadata binds CMake `4.2.3-2ubuntu2` package SHA-256
`87c496...becc61` and ninja-build `1.13.2-1` package SHA-256
`533239...8f156`. Installation of only those exact versions is allowed and
must be verified from dpkg and executable hashes afterward.
This phase authorizes dormant real-facade source and the exact two-package host
installation. It does not authorize invoking the materializer, compiling SDL
or RetroArch, producing an artifact or acting on a PS5.
@@ -0,0 +1,18 @@
# Phase 1.0BJ: exact host-tool installation result
Status: `EXACT_HOST_TOOLS_INSTALLED_REAL_FACADE_DORMANT_NO_BUILD`
Date: 2026-07-29
The single Phase-1.0BI package installation attempt completed successfully in
WSL. `dpkg-query` reports CMake and cmake-data `4.2.3-2ubuntu2` and
ninja-build `1.13.2-1`. The installed executable hashes are recorded in the BJ
manifest so later host work can fail closed if the tools change.
This is host provenance only. It does not activate the real facade or the
materializer, compile SDL or RetroArch, produce a target artifact, or authorize
any PS5 connection, transfer, installation or execution.
The same gate produced a dormant real facade at RetroArch commit
`c7511c4f2187794b6dbf56fb2c68b57137424f3b`. Its validation is source-only:
the process and filesystem implementations were not invoked.
@@ -0,0 +1,17 @@
# Phase 1.0BK: bounded real-facade host-fixture gate
Status: `EXACT_HOST_FIXTURES_AUTHORIZED_NO_MATERIALIZER`
Date: 2026-07-29
Phase 1.0BJ installed and bound the exact host tools and added a dormant real
process/filesystem facade. This gate permits one local WSL test suite against
four exact Python fixtures: success, nonzero exit, output overflow and timeout.
Each fixture may be started once. They have no filesystem, network, SDL,
RetroArch or device operation. The timeout fixture exists solely to prove the
process-group termination path.
This permission does not accept arbitrary commands and does not activate the
eight materializer requests. It does not authorize an SDL build, a RetroArch
target build, an artifact, a PS5 connection, transfer or execution. The suite
result must be recorded separately before any materializer gate is considered.
@@ -0,0 +1,16 @@
# Phase 1.0BL: fixture import failure and new one-shot gate
Status: `BK_CONSUMED_BEFORE_FIXTURES_CORRECTED_RUNNER_AUTHORIZED_ONCE`
Date: 2026-07-29
The single BK suite attempt exited with code 1 while importing the first local
`tools` module. Python reported `ModuleNotFoundError: No module named 'tools'`.
The failure occurred before `main`, before construction of the facade and
before any of the four fixture processes. BK is consumed and is not retried.
The runner now inserts its repository root in `sys.path`; its exact corrected
source and commit are bound below. BL grants one new suite attempt against the
same four BK fixtures. This is a new reviewed host-only permission, not an
automatic retry. No materializer request, SDL/RetroArch build, artifact or PS5
action is authorized.
@@ -0,0 +1,16 @@
# Phase 1.0BM: real-facade fixture result
Status: `REAL_FACADE_BOUNDARIES_PROVEN_ON_HOST_DORMANT_COMPOSITION_ALLOWED`
Date: 2026-07-29
The single BL suite attempt completed successfully. Four exact processes were
started once: success returned `0`/`OK\n`, nonzero returned `7`/`E7\n`, the
65-byte output fixture was rejected at the 64-byte cap, and the sleeping
fixture was terminated at its one-second deadline. No materializer request,
SDL or RetroArch build, network operation or device action occurred.
This host evidence permits source-only implementation of a new exact
one-shot composition between the reviewed request graph and the proven real
facades. The composition must remain dormant. Invocation of any materializer
request and every build or PS5 operation remain unauthorized.
@@ -0,0 +1,20 @@
# Phase 1.0BN: materializer preflight patch-chain audit
Status: `MATERIALIZER_BLOCKED_PATCH_CHAIN_INCOMPLETE_OFFLINE_REBASE_ALLOWED`
Date: 2026-07-29
The exact SDL commit is clean, the corrected output paths are absent, CMake,
Ninja, GNU patch, the SDK inputs and both patch files are present and hash
bound. The final preflight nevertheless rejects the current request graph:
`sdl2-ps5-early-diag.patch` does not apply directly to the clean SDL commit.
Its contexts assume the smoke-hardening overlay, while BG supplies only the
early-diag patch. The expected changed-file set also omits
`src/dynapi/SDL_dynapi.h`, and the CMake flags are narrower than the historical
reviewed early-diag build.
No materializer request was invoked and no output path was created. This phase
permits only an offline temporary-worktree rebase of the two existing reviewed
overlays into one exact combined patch, plus source-only correction of the
policy/request/composition contracts. It does not authorize CMake, compilation,
the final materializer, RetroArch, an artifact or a PS5 action.
@@ -0,0 +1,18 @@
# Phase 1.0BO: patch-chain remediation result
Status: `COMPLETE_PATCH_CHAIN_BOUND_RUNNER_SOURCE_ALLOWED_NO_BUILD`
Date: 2026-07-29
The first temporary checkout exposed CRLF and the second was incomplete; both
stopped before a valid overlay result. A third, quiet WSL checkout completed
with LF files. GNU patch `2.8` then passed dry-run and application for the
smoke-hardening overlay followed by the early-diag overlay. The final diff is
clean and changes exactly audio, dynapi, joystick and video.
The corrected policy now binds both patch hashes and the patch executable. The
request graph performs both dry-run/apply pairs, uses the complete historical
early-diag CMake flags and `--clean-first`, and derives all output paths from
the policy. This phase permits a dormant exact one-shot runner source only. It
does not authorize invoking the materializer, CMake, compilation, RetroArch or
any PS5 operation.
@@ -0,0 +1,17 @@
# Phase 1.0BP: one-shot SDL materialization gate
Status: `EXACT_SDL_ONLY_MATERIALIZATION_AUTHORIZED_ONCE`
Date: 2026-07-29
The BO runner, validator and source-only tests are hash bound. The pinned SDL
source is clean and the exact stage, build and archive paths are absent. BP
authorizes one invocation of the exact Python expression below. It may execute
only the ten reviewed requests and produce the detached SDL source, SDL build
tree and `libSDL2.a`.
The attempt is consumed before hashing or process creation. Any mismatch,
timeout, overflow, nonzero result or missing archive stops the attempt. There
is no retry, resume or cleanup. The outputs are retained for audit. This gate
does not authorize building RetroArch, producing an ELF/map, connecting to a
PS5, transferring, installing or executing anything on a device.
@@ -0,0 +1,16 @@
# Phase 1.0BQ: inline invocation failure
Status: `BP_CONSUMED_BEFORE_PYTHON_ENTRYPOINT_SOURCE_ALLOWED`
Date: 2026-07-29
The single BP invocation exited in Bash parsing with an unexpected-token error
around the inline Python `join` expression. Python did not start, the runner was
not imported and all ten materializer requests remained uncalled. The exact
stage, build and archive paths are still absent. BP is consumed; it is not
retried.
BQ permits only a tiny exact Python entrypoint source that imports `run_once`,
calls it once and prints its completed operation list. The source must contain
no arguments, shell, subprocess, filesystem, network, RetroArch or device
logic. No invocation or build is authorized by this phase.
@@ -0,0 +1,15 @@
# Phase 1.0BR: script-entrypoint one-shot gate
Status: `EXACT_SCRIPT_ENTRYPOINT_AUTHORIZED_ONCE_SDL_ONLY`
Date: 2026-07-29
The exact argument-free BQ entrypoint is source-audited and hash bound. It adds
only the repository import root, calls the already bound `run_once` exactly
once and prints JSON. The production output paths remain absent.
BR grants one new materialization attempt through the script path, without an
inline shell expression. This is a separately reviewed permission, not a retry.
Any failure consumes it. No cleanup, resume or automatic retry is permitted.
The scope ends at the retained SDL archive; RetroArch and every PS5 action stay
unauthorized.
@@ -0,0 +1,14 @@
# Phase 1.0BS: read-only status timeout
Status: `BR_CONSUMED_AT_STATUS_TIMEOUT_TIMEOUT_SOURCE_CORRECTION_ALLOWED`
Date: 2026-07-29
BR entered the exact runner. `verify_sdl_commit` completed, then the bounded
real facade terminated `verify_sdl_clean` when WSL Git exceeded its ten-second
DrvFS deadline. No detached stage, CMake configure or build started and all
three output paths remain absent. BR is consumed and is not retried.
BS permits only increasing the read-only status request deadline to 120
seconds and adjusting its source tests. No other argv, output cap, request,
build or device authority changes. Invocation remains unauthorized.
@@ -0,0 +1,13 @@
# Phase 1.0BT: corrected-timeout one-shot gate
Status: `EXACT_120_SECOND_STATUS_MATERIALIZATION_AUTHORIZED_ONCE`
Date: 2026-07-29
The request graph differs from BR only in the read-only `verify_sdl_clean`
deadline, now 120 seconds with unchanged argv and 4,096-byte output cap. The
entrypoint and runner are unchanged and the exact outputs remain absent.
BT grants one new, nonautomatic script attempt. It has no retry, resume or
cleanup. Authority ends at `libSDL2.a`; RetroArch artifacts and all PS5 actions
remain forbidden.
@@ -0,0 +1,15 @@
# Phase 1.0BU: WSL Git status timeout and Windows Git fixture gate
Status: `BT_CONSUMED_WSL_STATUS_UNSUITABLE_WINDOWS_GIT_READ_ONLY_FIXTURE_ALLOWED`
Date: 2026-07-29
BT again completed the commit check and timed out in the unchanged read-only
status request, now after 120 seconds. The process group was terminated before
stage creation and all output paths remain absent. Repeated deadline increases
are not justified.
The locally installed Windows Git `2.54.0.windows.1` is exact-hash bound and
has already returned the same checkout clean through PowerShell. BU permits one
WSL-to-Windows read-only fixture containing only `rev-parse HEAD` and `status
--porcelain`. It does not permit worktree creation, patches, CMake or a build.
@@ -0,0 +1,16 @@
# Phase 1.0BV: Windows Git fixture result and request correction gate
Status: `WINDOWS_GIT_READ_ONLY_FIXTURE_PASSED_REQUEST_SOURCE_CORRECTION_ALLOWED`
Date: 2026-07-30
The single BU fixture completed both exact read-only commands. Windows Git,
invoked from WSL, returned the pinned SDL commit and an empty porcelain status
within the 30-second per-command bound. No worktree, patch, CMake, build or
device action was invoked.
BV permits only an offline source correction. The first two materializer
requests may use the exact-hash-bound Windows Git executable and Windows SDL
source path. The detached LF worktree request may become quiet and use a
900-second bound, based on the previously observed roughly six-minute silent
checkout. The corrected materializer must not be invoked under this phase.
@@ -0,0 +1,15 @@
# Phase 1.0BW: corrected SDL materializer one-shot gate
Status: `CORRECTED_REQUEST_GRAPH_BOUND_ONE_OFFLINE_SDL_MATERIALIZATION_ALLOWED`
Date: 2026-07-30
The BV-authorized request correction is committed, pushed and bound below by
exact RetroArch commit and source hashes. Host tests and static validators pass.
The exact stage, build and archive outputs were rechecked absent.
BW permits one invocation of the exact script entrypoint. Its scope ends after
materializing the patched SDL source and building `libSDL2.a`; it excludes the
RetroArch target, network access and every PS5 action. The attempt is consumed
when the entrypoint starts. Failure must stop without retry, cleanup or path
reuse until a later reviewed result gate.
@@ -0,0 +1,15 @@
# Phase 1.0BX: changed-files timeout and read-only fixture gate
Status: `BW_CONSUMED_CHANGED_FILES_TIMEOUT_WINDOWS_GIT_STAGE_FIXTURE_ALLOWED`
Date: 2026-07-30
The single BW attempt completed both source checks, detached stage creation and
both patch check/apply pairs. It then timed out in WSL Git
`verify_changed_files` after ten seconds. The process group was terminated.
The stage exists; the build directory and archive do not. CMake and the SDL
build were not invoked.
BX permits one exact read-only Windows Git `diff --name-only` fixture against
the existing stage. It permits no cleanup, output reuse, patching, CMake,
build, retry or device action.
@@ -0,0 +1,13 @@
# Phase 1.0BY: Windows Git stage fixture failure and file-hash gate
Status: `BX_CONSUMED_CROSS_PLATFORM_WORKTREE_UNREADABLE_EXACT_FILE_HASH_FIXTURE_ALLOWED`
Date: 2026-07-30
The single BX fixture failed with exit code 1 and
`fatal: not a git repository: (NULL)`. Windows Git therefore cannot audit the
WSL-created worktree through this route. No build or cleanup followed.
BY permits one PowerShell read-only fixture: read the stage `.git` indirection
and calculate SHA-256 for the four exact patch target files. No directory
enumeration, Git invocation, cleanup, output reuse, CMake or build is allowed.
@@ -0,0 +1,15 @@
# Phase 1.0BZ: exact SDL stage cleanup gate
Status: `PATCH_TARGET_HASHES_BOUND_EXACT_FAILED_STAGE_CLEANUP_ALLOWED_ONCE`
Date: 2026-07-30
The BY fixture read the WSL `.git` indirection and hashed all four expected
patch targets. Their exact hashes are recorded in the manifest. The indirection
explains why Windows Git could not open this WSL-created worktree.
BZ permits one forced WSL Git worktree removal for only the exact failed
`build/phase10bd/sdl-source` stage. This destructive cleanup is bounded to the
hash-recorded, dirty derived checkout; it does not include other temporary
worktrees, the clean SDL source, build outputs or any device. No retry or source
change is authorized.
@@ -0,0 +1,153 @@
# Phase 1.0C PS5 device smoke result
Date: 2026-07-19
Local window: 16:1916:31 CEST
Classification: `DEVICE_SMOKE_PARTIAL`
## Result
The exact Phase-1.0B candidate was rebuilt, reopened, and verified before
device contact:
- artifact: `retroarch_ps5_software_smoke.elf`;
- size: 1,826,216 bytes;
- SHA-256:
`16c04afe26c490b5071388dc9a32524d09d50d181b1baffbbc54bd96f0c2c688`;
- linker-map SHA-256:
`21dfdaa44261f8d546fa9ea71102162dc880a8ca8037526019a04fece5b21313`;
- Phase-1.0B build-manifest SHA-256:
`8ee4305bc2d7e5d75d3f7a4b0b335de39c68932ca49c199310cda9f2279dd69f`.
The complete offline preflight passed: both repositories and pinned upstreams
were clean and exact, the clean target rebuild reproduced the authorized
identity, the artifact remained stable across reopen and rehash, all 30
Chimera GFX CTest cases passed, all 26 Phase-1.0B Python guardrails passed,
and the RetroArch host smoke, fault, sanitizer, import, relocation, segment,
exit-path, and persistent-write checks passed.
No Phase-1.0C target, sender, installation, autoload, or device-management
code was created.
## Authorization and attempts
The operator confirmed all twelve device-preflight statements immediately
before the first connection. The first artifact-specific authorization
permitted one connection, transfer, execution attempt, and 75-second
observation. That transfer completed locally, but the operator's display was
off, so no screen evidence was obtained. The operator reported that the
console had not hung and still functioned normally.
The operator then explicitly overrode the no-later-action boundary and issued
a new manual authorization for one additional run of the same hash-bound
artifact to the same session address. This was a separately initiated manual
action, not an automatic retry. The artifact and sender were reopened and
rehashed before the second connection. The second transfer also completed
locally. During the second 75-second window the operator observed no visible
change and reported that the console continued to respond normally.
| Counter | Result |
|---|---:|
| TCP connections opened by the selected sender | 2 |
| complete local `sendall` operations | 2 |
| bytes offered per operation | 1,826,216 |
| loader execution attempts requested | 2 |
| executions independently observed | 0 |
| automatic retries | 0 |
| further attempts | 0 |
The second action is recorded because it occurred, but it does not retroactively
change the scope of the first authorization. No third attempt is authorized or
performed.
## Transport evidence
The selected client was the existing official Y2JB source-controlled sender:
- source:
`Gezine/Y2JB@0dbbf4e7e0203af7e5d101a3256c634edf4e3ba2:payload_sender.py`;
- sender SHA-256:
`8c87920c41dbdbd66b9f36ca9509f0d6bef9170f351dd97ff831cfb98e642ec6`;
- transport: one IPv4 TCP connection per invocation, explicit port 9021;
- local input: binary read of the selected ELF;
- send behavior: CPython `sendall`, which completes all local sends or raises;
- retry/resume: absent;
- response/acknowledgement: absent;
- close: after successful `sendall`.
The audited hardened elfldr source at
`197623058f509eddde18868dafcb92fdcac66464` recognizes raw ELF magic, receives
the complete ELF extent into memory, and makes one spawn attempt without
filesystem staging, installation, rename, deletion, or live-file replacement.
That local source identity is transport evidence, not byte-exact proof of the
currently running device listener.
Both sender invocations exited successfully and reported 1,826,216 locally
sent bytes. Because the raw route has no peer acknowledgement, remote receipt,
parse completion, child creation, entry, and exit are not independently proven.
## Device observations
| Observation | Result |
|---|---|
| anonymized device ID | `PS5-FW960-SESSION-A` |
| firmware source | operator confirmation from PS5 UI |
| raw firmware value | `9.60` |
| first visible phase | `UNOBSERVED` |
| last visible phase | `UNOBSERVED` |
| first error code | `UNOBSERVED` |
| write-firewall status | `UNOBSERVED` |
| video/title/frame/flip | no visible change observed |
| controller/digital/sticks | not observed |
| audio/submits | not observed |
| Options shutdown | not observed |
| automatic deadline | not observed |
| process exit | not observed |
| host observation windows | 75,235 ms and 75,405 ms |
| console response after attempts | normal according to operator |
| jailbreak/elfldr session | not independently tested after the attempts |
| reboot needed | no |
| unexpected persistent effect | none reported; not independently inspected |
| photo/video evidence | none |
The first window supplied no visual evidence because the display was off. The
second window supplied a direct negative observation: no visible change
occurred while the console remained responsive.
## Classification and remaining risk
This result is `DEVICE_SMOKE_PARTIAL`, specifically:
`NO_VISIBLE_OUTPUT; REMOTE_EXECUTION_AND_ENTRY_UNCONFIRMED; CONSOLE_RESPONSIVE`
It is not a pass. The evidence does not prove `S00`, `S07`, any error code,
VideoOut, Pad, AudioOut, the runtime deadline, teardown, or `_Exit`. It is not
a session-recoverable failure because no crash, hang, lost session, or reboot
need was observed. It is not a transfer failure because both host-side
`sendall` operations completed, although the protocol cannot attest peer
receipt or execution.
The remaining focused questions are:
1. whether the deployed port-9021 listener is byte-equivalent to the audited
hardened source;
2. whether it accepted and parsed the complete ELF;
3. whether child creation or `_start` failed before the first visible frame;
4. whether VideoOut initialization failed without a visible reporting path;
5. whether the process ran and exited before the display showed a frame.
No installation, autoload change, persistent staging, Payload Manager request,
live-file replacement, delete, cleanup write, automatic retry, or reboot
command was performed.
## Next phase
The exact proposed next implementation phase is:
`PHASE 1.0D — OFFLINE LOADER-TO-ENTRY AND EARLIEST-VISIBLE-ERROR DIAGNOSIS`
It must remain host/offline work until separately reviewed. It should focus
only on distinguishing loader receipt, child entry, and pre-first-frame
VideoOut failure using already public, bounded userland contracts. It must not
introduce installation, autoload, dynamic cores, GNM, or another device run.
@@ -0,0 +1,15 @@
# Phase 1.0CA: cleanup result and hash-verifier correction gate
Status: `EXACT_STAGE_CLEANUP_PASSED_HASH_VERIFIER_SOURCE_CORRECTION_ALLOWED`
Date: 2026-07-30
The single BZ cleanup completed successfully. The exact stage and its worktree
metadata are absent, while the source checkout remains clean at the pinned SDL
commit. No other temporary worktree was removed.
CA permits only an offline request-graph correction: replace the failing
worktree Git diff with exact SHA-256 verification of the four patch targets
using the hash-bound `/usr/bin/sha256sum`. The resulting hashes must equal the
BY fixture values in exact path order. Materializer invocation, output reuse,
CMake, build and device actions remain unauthorized.
@@ -0,0 +1,14 @@
# Phase 1.0CB: hash-verified SDL materializer one-shot gate
Status: `HASH_VERIFIER_BOUND_ONE_OFFLINE_SDL_MATERIALIZATION_ALLOWED`
Date: 2026-07-30
The CA-authorized hash verifier is committed, pushed and bound by exact commit
and source hashes. Its host tests and validators pass. The exact stage, build
and archive outputs are absent after the separately authorized cleanup.
CB permits one new invocation of the exact script entrypoint. The request graph
must verify all four patched files by SHA-256 before CMake. Scope ends at
`libSDL2.a`; RetroArch target build, network and device actions remain excluded.
The attempt is consumed at entry and may not retry or clean up on failure.
@@ -0,0 +1,16 @@
# Phase 1.0CC: CMake timeout and exact output cleanup gate
Status: `CB_CONSUMED_CONFIGURE_TIMEOUT_EXACT_DERIVED_OUTPUT_CLEANUP_ALLOWED`
Date: 2026-07-30
CB passed the commit, clean-source, worktree, both patch chains and all four
patch-target hashes. CMake compiler identification then succeeded for C and
C++, but configure exceeded 120 seconds before producing `CMakeCache.txt`.
The archive is absent.
CC permits one cleanup transaction over only the exact derived stage and
partial build directory. The stage must be removed through its originating WSL
Git worktree administration; the build directory may be recursively removed
only after its absolute path is verified beneath the exact Phase-1.0BD root.
No retry, source change, build or device action is authorized.
@@ -0,0 +1,15 @@
# Phase 1.0CD: cleanup result and configure-timeout correction gate
Status: `EXACT_OUTPUT_CLEANUP_PASSED_CONFIGURE_TIMEOUT_CORRECTION_ALLOWED`
Date: 2026-07-30
The one CC cleanup transaction removed only the registered failed stage and
partial build directory. Their worktree metadata is absent and the pinned SDL
source remains clean.
CD permits one source-only change: increase
`cmake_configure_sdl_only.timeout_seconds` from 120 to 600. The prior configure
had already completed C and C++ compiler identification before its deadline.
All argv, output limits, later build timeout and safety exclusions remain
unchanged. Invocation and output reuse remain unauthorized.
@@ -0,0 +1,11 @@
# Phase 1.0CE: extended-configure SDL materializer one-shot gate
Status: `EXTENDED_CONFIGURE_REQUEST_BOUND_ONE_OFFLINE_MATERIALIZATION_ALLOWED`
Date: 2026-07-30
The CD-authorized timeout-only correction is committed, pushed and hash-bound.
Host tests and validators pass, and the exact stage and build outputs are
absent. CE permits one exact offline entrypoint invocation with a 600-second
CMake configure bound. Scope still ends at `libSDL2.a`; no RetroArch target,
network or PS5 action is authorized, and failure consumes the attempt.
@@ -0,0 +1,14 @@
# Phase 1.0CF: repeated configure timeout and cleanup gate
Status: `CE_CONSUMED_MOUNTED_BUILDROOT_UNSUITABLE_EXACT_CLEANUP_ALLOWED`
Date: 2026-07-30
CE again passed all pre-CMake operations. CMake made successful compiler and
try-compile progress but timed out after 600 seconds without a cache or archive.
Further timeout increases on the mounted buildroot are rejected.
CF permits one cleanup of only the exact derived stage and partial build, using
the same bounded methods as CC. It does not authorize another materializer
attempt. The next source phase may design and host-test a WSL-native stage/build
with exact archive export, but may not invoke it under CF.
@@ -0,0 +1,15 @@
# Phase 1.0CG: native WSL SDL materializer design gate
Status: `MOUNTED_OUTPUTS_CLEAN_NATIVE_WSL_SOURCE_DESIGN_ALLOWED`
Date: 2026-07-30
The CF cleanup removed the failed mounted stage and build. `/tmp` is a WSL
`tmpfs` with 8,226,119,680 available bytes, and the exact proposed root
`/tmp/chimera-gfx-phase10ch` is absent.
CG permits source implementation and fake-host testing only. The materializer
may redirect its stage, build and intermediate archive to the exact native root
while retaining the pinned mounted source, SDK and patch inputs. No native root
may be created, no CMake/build may run, and no archive export, RetroArch target
or device action is authorized under CG.
@@ -0,0 +1,11 @@
# Phase 1.0CH: native WSL SDL materializer one-shot gate
Status: `NATIVE_WSL_REQUEST_GRAPH_BOUND_ONE_MATERIALIZATION_ALLOWED`
Date: 2026-07-30
The CG-authorized native request graph is committed, pushed and hash-bound.
Host tests, validators and WSL import checks pass; the exact native root is
absent. CH permits one offline invocation that may create only that native root,
materialize the patched SDL worktree and build `libSDL2.a` there. Archive export,
RetroArch target build, network and PS5 actions remain unauthorized.
@@ -0,0 +1,16 @@
# Phase 1.0CI: native SDK bottleneck and cleanup gate
Status: `CH_CONSUMED_MOUNTED_SDK_PROBE_BOTTLENECK_EXACT_NATIVE_CLEANUP_ALLOWED`
Date: 2026-07-30
CH passed every preconfigure operation on the native WSL root. Configure then
progressed through successful symbol try-compiles but timed out after 600
seconds. The scratch tree was native; compiler and sysroot remained mounted.
The pinned SDK is only 29,406,271 bytes, so native SDK staging is the next
bounded remediation candidate rather than another timeout increase.
CI permits one cleanup of only `/tmp/chimera-gfx-phase10ch`, with its SDL
worktree removed through the originating Git administration before the exact
root is recursively removed. No retry, SDK copy, build or device action is
authorized in CI.
@@ -0,0 +1,14 @@
# Phase 1.0CJ: native SDK stage design gate
Status: `NATIVE_ROOT_CLEAN_FULL_SDK_TREE_BOUND_STAGE_DESIGN_ALLOWED`
Date: 2026-07-30
The CI cleanup left the exact native root absent. The pinned SDK contains 2,923
regular files, no symbolic links and 29,406,271 bytes. A normalized read-only
tar stream binds the entire tree, not merely selected files.
CJ permits source implementation and fake tests for one exclusive native SDK
copy followed by normalized tree verification. The build must reference only
the verified native copy. No copy, CMake invocation, build, export, target or
device action is authorized under CJ.
@@ -0,0 +1,11 @@
# Phase 1.0CK: native-SDK SDL materializer one-shot gate
Status: `FULL_SDK_TREE_STAGE_BOUND_ONE_NATIVE_MATERIALIZATION_ALLOWED`
Date: 2026-07-30
The CJ-authorized implementation is committed, pushed and hash-bound. The exact
native root is absent. CK permits one offline invocation: create and verify the
normalized SDK archive, extract it natively, materialize patched SDL and build
the native `libSDL2.a`. Export, RetroArch target build, network and PS5 actions
remain unauthorized. Failure consumes the attempt without retry or cleanup.
@@ -0,0 +1,15 @@
# Phase 1.0CL: native-SDK configure progress and cleanup gate
Status: `CK_CONSUMED_96_SUCCESSFUL_CHECKS_EXACT_NATIVE_CLEANUP_ALLOWED`
Date: 2026-07-30
CK completed SDK staging, full-tree verification, extraction, SDL worktree and
patch verification. Native CMake then completed 96 checks and reached the
`strcasestr` probe before its 600-second deadline. Compiler and sysroot paths
were both native and successful; this is bounded progress, not a toolchain
failure.
CL permits one cleanup of only the exact native root, removing its registered
SDL worktree first. No retry, timeout change, build, export or device action is
authorized under CL.
@@ -0,0 +1,11 @@
# Phase 1.0CM: measured configure-timeout correction gate
Status: `NATIVE_ROOT_CLEAN_MEASURED_1800_SECOND_SOURCE_CORRECTION_ALLOWED`
Date: 2026-07-30
CL cleanup succeeded. CK completed 96 native compiler checks in 600 seconds;
SDL's remaining libc, math and platform checks make 1,800 seconds a measured
upper bound with margin. CM permits only changing
`cmake_configure_sdl_only.timeout_seconds` from 600 to 1,800. All commands,
other bounds and scopes remain unchanged. No invocation is authorized.
@@ -0,0 +1,10 @@
# Phase 1.0CN: measured native SDL materializer one-shot gate
Status: `MEASURED_1800_SECOND_NATIVE_REQUEST_BOUND_ONE_BUILD_ALLOWED`
Date: 2026-07-30
The CM timeout-only correction is committed, tested, pushed and hash-bound; the
native root is absent. CN permits one offline native-SDK materializer invocation
with 1,800 seconds for configure and 600 seconds for `SDL2-static`. Archive
export, RetroArch target build, network and every PS5 action remain excluded.
@@ -0,0 +1,12 @@
# Phase 1.0CO: configure success, build output-limit cleanup gate
Status: `CN_CONFIGURE_PASSED_BUILD_OUTPUT_LIMIT_STOP_EXACT_CLEANUP_ALLOWED`
Date: 2026-07-30
CN completed native SDK staging, SDL patching and full CMake configure. The
build then produced 46 object files before its merged output exceeded 65,536
bytes and the process group was terminated. No archive exists.
CO permits one cleanup of only the exact native root after registered worktree
removal. It authorizes no retry or source change.
@@ -0,0 +1,9 @@
# Phase 1.0CP: build output-limit correction gate
Status: `NATIVE_ROOT_CLEAN_BUILD_OUTPUT_LIMIT_SOURCE_CORRECTION_ALLOWED`
Date: 2026-07-30
CO cleanup succeeded. CP permits only changing the SDL build merged-output
limit from 65,536 to 1,048,576 bytes. The configure and build timeouts, argv,
target and all scopes remain unchanged. No invocation is authorized.
@@ -0,0 +1,10 @@
# Phase 1.0CQ: full-output native SDL one-shot gate
Status: `CONFIGURE_PROVEN_FULL_BUILD_OUTPUT_BOUND_ONE_BUILD_ALLOWED`
Date: 2026-07-30
The CP correction is committed and tested; the native root is absent. CQ
permits one native-SDK materializer invocation with the proven 1,800-second
configure bound and a 1,048,576-byte SDL-build output cap. Scope ends at the
native static archive; export, RetroArch target and PS5 actions remain excluded.
@@ -0,0 +1,17 @@
# Phase 1.0CR: audited SDL archive export gate
Status: `NATIVE_SDL_ARCHIVE_AUDITED_ONE_EXCLUSIVE_EXPORT_ALLOWED`
Date: 2026-07-30
The CQ one-shot completed all fifteen operations and produced a 2,412,290-byte
current `ar` archive with SHA-256
`4ced0a042c0b8a70424e42a14cfe9b2c4d30a4cd73b661dc1fcf8ad967a7f7e1`.
Offline inspection found 143 members, all five expected PS5 backend objects,
all 26 expected undefined Chimera hooks and the expected public SDL entry
points. No RetroArch ELF or map exists.
CR permits exactly one host-only export to the absent mounted destination.
The bound exporter verifies the source, uses exclusive leaf creation, flushes,
reopens and rehashes the destination. It may not remove the native source.
RetroArch target building, networking and every PS5 action remain excluded.
@@ -0,0 +1,13 @@
# Phase 1.0CS: export-parent correction gate
Status: `CR_REJECTED_PRE_MUTATION_EXACT_PARENT_AND_ONE_EXPORT_ALLOWED`
Date: 2026-07-30
The CR attempt was consumed when the exporter found that the exact destination
parent was absent. It stopped before creating a destination leaf and no retry
occurred. CS binds the corrected exporter and permits creation of only
`build/phase10bd/sdl-build`, below the already existing `build/phase10bd`,
followed by one exclusive export of the same audited archive.
No cleanup, RetroArch target build, network operation or PS5 action is allowed.
@@ -0,0 +1,14 @@
# Phase 1.0CT: SDL archive export result
Status: `EXACT_ARCHIVE_EXPORTED_TARGET_BUILD_BLOCKED_MISSING_HEADERS`
Date: 2026-07-30
The CS one-shot exported the audited archive exclusively. The destination is
2,412,290 bytes and rehashes to the expected SHA-256
`4ced0a042c0b8a70424e42a14cfe9b2c4d30a4cd73b661dc1fcf8ad967a7f7e1`.
The subsequent Makefile audit found that a target build also consumes the
generated and public SDL include roots. Neither has been exported. A RetroArch
target build therefore remains blocked until both exact trees are enumerated,
hash-bound and copied under a new offline gate.
@@ -0,0 +1,14 @@
# Phase 1.0CU: exact SDL header export gate
Status: `HEADER_TREES_BOUND_ONE_HOST_EXPORT_ALLOWED`
Date: 2026-07-30
CU binds both header roots consumed by `Makefile.ps5`. The public tree contains
78 regular files (2,400,049 bytes); the generated release configuration tree
contains one regular file (16,566 bytes). Their identities cover every sorted
UTF-8 relative path, byte length and file SHA-256.
One host-only staged export is permitted. Existing destinations, symlinks,
identity drift and partial reuse are rejected. Cleanup, target building,
networking and every PS5 operation remain unauthorized.
@@ -0,0 +1,15 @@
# Phase 1.0CV: launch-canary offline build gate
Status: `COMPLETE_SDL_INPUT_BOUND_ONE_OFFLINE_TARGET_BUILD_ALLOWED`
Date: 2026-07-30
The CU export completed and both destination header identities match. The
archive, headers, RetroArch commit, Makefile, linker script and normalized
native SDK are bound. No target ELF, map, object or dependency file exists.
A parse-only Make run produced the complete 121-command build plan.
CV permits one offline `launch-canary` build with the exact recorded argv.
It does not permit `clean`, retry, network access, transfer, installation or
execution. Any resulting artifact remains ineligible until a later static
ELF/map/callgraph audit records its exact identity and safety properties.
@@ -0,0 +1,21 @@
# Phase 1.0CW: launch-canary artifact audit
Status: `OFFLINE_ARTIFACT_BUILT_STATIC_AUDIT_PASS_REPRODUCIBILITY_UNPROVEN`
Date: 2026-07-30
The one CV build completed and produced an ELF of 1,845,240 bytes with SHA-256
`8dadce9d9faaef21ea129a3d216c768eea9a3ca9bf8ecb8d852e376b58a9bf95`.
Its map is 630,127 bytes with SHA-256
`1cabe4d61b2eb2c1844a58883db6b8644c980759690242bef17f92e9c260b3cd`.
The ELF is an x86-64 PIE with three load segments and no writable/executable
segment. It has the exact seven expected PS5 libraries, zero-sized init/fini
arrays, `CHD10AV1`, the D14 cleanup emitter and inherited diagnostic stream.
Only the live `open`, `fopen` and `fwrite` firewall wrappers survived section
garbage collection. There are no socket-construction or receive imports; the
single `send` import is the bounded inherited-descriptor result channel.
This is one build, not reproducibility proof or firmware evidence. The artifact
remains transfer-, installation- and execution-ineligible. The next phase must
build independently in a fresh native tree and compare ELF and map bytes.
@@ -0,0 +1,15 @@
# Phase 1.0CX: isolated reproducibility build gate
Status: `FIRST_ARTIFACT_AUDITED_ONE_ISOLATED_REBUILD_ALLOWED`
Date: 2026-07-30
CX permits one independent build in the absent native root
`/tmp/chimera-gfx-phase10cx`. The bound builder exports only tracked bytes from
the exact target-source commit, recopies and rehashes the audited SDL package,
and performs a full object-free build. It succeeds only when both ELF and map
match the first build byte-for-byte.
The source archive and native root are consumed evidence and may not be cleaned
or reused. No retry, networking, transfer, installation or PS5 execution is
authorized, and even a match does not itself make the artifact eligible.
@@ -0,0 +1,15 @@
# Phase 1.0CY: launch-canary reproducibility result
Status: `BYTE_EXACT_ELF_AND_MAP_REPRODUCIBILITY_PROVEN_OFFLINE`
Date: 2026-07-30
The isolated CX build completed from a tracked-only source archive in a fresh
native root. It reused no object files and invoked neither network nor device
actions. Its 1,845,240-byte ELF and 630,127-byte map match the first build
byte-for-byte.
This proves offline build reproducibility, not firmware behavior. The artifact
remains ineligible. Before any hardware approval can be considered, the host
runner must gain inactive, manifest-only `CHD10AV1` parsing with D14 as its sole
terminal and retain the existing consumed-before-connect one-shot rules.
@@ -0,0 +1,23 @@
# Phase 1.0CZ: inactive launch-canary one-shot runner
Status: `INACTIVE_ARTIFACT_SPECIFIC_HARDWARE_GATE`
Date: 2026-07-30
CZ binds the reproducible 1,845,240-byte launch-canary ELF and adds no free
protocol selector. Only an exact active CZ manifest can select `CHD10AV1`; D14
is the sole accepted terminal. The runner also requires exactly one ordered
D07, D04 and D14, exact RAW semantics for D07/D04, zero cleanup-error fields
in D14, at most one D12 and no bytes after terminal. The inherited raw-ELF route remains one connect,
one send, one write-half-close, bounded receive, consumed receipt before the
socket and exclusive trace creation.
The tracked manifest and approval template are inactive. They contain no
target, port or run ID, all hardware authorizations are false, and artifact
eligibility is false. Editing the tracked template is not an approval. A real
attempt requires a new active-task statement from Jens naming this exact
artifact and scope, plus a separately matching untracked approval.
This gate covers only the raw-elfldr baseline arm. It does not use shsrv/hbldr
and cannot prove the BigApp launch-context hypothesis. Work on a bounded
nonpersistent BigApp launcher remains a separate offline track.
@@ -0,0 +1,38 @@
# Phase 1.0D CRT entry canary
`chimera_ps5_crt_entry_canary.elf` is a non-RetroArch diagnostic artifact. It
uses the pinned normal SDK CRT, the same ET_DYN/W^X loader class, and the same
`_Exit` selection as the software-smoke profile.
Its fixed behavior is:
1. enter `main`;
2. attempt exactly one notification containing
`CHIMERA C1 — CRT MAIN REACHED`;
3. perform one relative `nanosleep` of two seconds, with no interrupted-sleep
retry;
4. call `_Exit(0)`.
It contains no SDL, VideoOut, Pad, AudioOut, filesystem, networking, thread
creation, listener, retry, configuration, autoload, payload launch, or
installation implementation. Its complete undefined-symbol set is `_Exit`,
`memset`, `nanosleep`, and `sceKernelSendNotificationRequest`; DT_NEEDED is
only `libSceLibcInternal.sprx` and `libkernel_web.sprx`.
The notification ABI is copied from the local lifecycle source at commit
`fe08300339a13f899fb78ea404ada381a5cba87c`, Git blob
`654e6659c9e6f2569ddccf1c9e46ea1c62c066f3`: 45 reserved bytes followed by
3,075 message bytes, passed as
`sceKernelSendNotificationRequest(0, &request, sizeof(request), 0)`. No
notification ABI was inferred from a symbol name.
Static disassembly binds `main` at `0x0`, the notification indirect call at
`0x24b`, `_Exit` at `0x23`, and SDK `_start` at `0x290`. The ELF has three
LOAD segments (RX, R, RW), zero RWX segments, an empty init/fini array, no TLS,
144 relocations, and 2,512 BSS bytes.
Two clean builds produced the same 106,344-byte SHA-256
`c84c0fb43392ce17abc1e7e6be38b522f1b32a681fd516d684c3dbbf7b34b743`;
both maps produced
`96132ef015d1743606a86906c810b9e9b2832889a6d49863653b03dddb75cf07`.
The ELF is `execution_eligible=false`.
@@ -0,0 +1,52 @@
# Phase 1.0D early RetroArch diagnostic
`retroarch_ps5_early_diag.elf` is compile-time profile
`PS5_PROFILE=early-diag` with `CHIMERA_PS5_EARLY_DIAG=1`. It retains the real
RetroArch frontend, static chimera_smokecore, write firewall, bounded runtime,
W^X layout, reverse cleanup, no network, no content/configuration, no dynamic
core, no retry, no autoload, and `_Exit`.
## Diagnostic ladder
The fixed D00-D12 ladder covers RetroArch main, platform begin/result, SDL
begin/result, VideoOut open, buffers, first flip, Pad, AudioOut, core init,
runloop, and shutdown. Each stage owns one bit in an in-memory attempted mask,
so a notification is attempted at most once. Notification failure is recorded
as a raw error and never blocks the primary path. Text is built in a fixed
192-byte buffer; truncation is counted and no dynamic formatting allocation is
used. Login users are represented only by count and numeric IDs.
`sceVideoOutSetBufferAttribute2` is `void` in the pinned SDL source. The
diagnostic stores `CHIMERA_PS5_DIAG_NO_RETURN_VALUE`; it does not fabricate a
success return. Consequently that exact boundary cannot receive a return-code
failure injection. Every representable boundary is injected by the host test.
## Earliest frame
After VideoOut open, direct-memory allocation/mapping, equeue/event setup, and
buffer registration—but before input, audio, core, and runloop—the SDL overlay
writes a full magenta frame, a fixed white rectangle, and an embedded black
pattern. It submits frame ID 0 once and waits once for at most 100,000
microseconds. A failed first flip records D07 and enters bounded teardown; it
does not retry or initialize another buffer chain.
Source callsites are `retroarch.c:6201` for D00 and the
`PS5_PresentEarlyDiagnosticFrame` hunk in
`pkg/ps5/sdl2-ps5-early-diag.patch` for the magenta frame. Disassembly binds
D00 at `main+0xd` (`0x3ccd`), the diagnostic frame helper at `0xfdf90`, its
first-flip call at `0xfe1ec`, the common notification call at `0x4776b`, and
`_Exit` at `0x3cef`.
## Host fault model
ASan/UBSan host tests cover notification failure, truncation and duplicate
suppression; user-service failure and no-login-user; VideoOut open; direct
allocation/map; registration; equeue/event; first flip; Pad; AudioOut; core;
deadline; every cleanup boundary; the write firewall; stable D-code; and
exactly one selected `_Exit` path. No test result is hardware evidence.
Two clean target builds are byte-identical at 1,844,664 bytes and SHA-256
`092bcabc0f8717a648030c592aa0dc900f878952fb14ee453851a29f298ea7ee`.
Their map hash is
`0d4d4614826fa4cbbf11e7374a2d2ecb574a00b55ad9deac17272f9504b254a0`.
The artifact is `execution_eligible=false`.
@@ -0,0 +1,35 @@
# Phase 1.0D hardened-elfldr static model
The host-only model is in the separate chimera-retroarch fork at
`tools/ps5_elfldr_model.py`. Its authority is `elfldr.c` at commit
`197623058f509eddde18868dafcb92fdcac66464`, file SHA-256
`9949f8e4037984d10f1f5aa498e4665593d1fac8a33614d7f2141349839bb803`.
It reproduces source checks and data operations for the initial size/magic and
program-file bounds, ET_DYN/ET_EXEC, mapping range, PT_LOAD copies, relative
relocations, protection layout, entry mapping, synthetic saved RIP, RSP, RDI,
and 16 KiB argument-resource mapping. It inventories DT_NEEDED and undefined
symbols but correctly records that SDK startup—not `elfldr_load`—resolves
them.
The source does not validate several expected ELF properties: class, data
encoding, machine, header entry sizes, segment overlap/alignment, and mapped
entrypoint are not loader rejection conditions. The model reports these as
source-validation gaps. It never invents stricter acceptance rules.
| Input | SHA-256 | Result |
|---|---|---|
| Phase-1.0B smoke | `16c04afe26c490b5071388dc9a32524d09d50d181b1baffbbc54bd96f0c2c688` | ACCEPTED_BY_STATIC_MODEL |
| CRT canary | `c84c0fb43392ce17abc1e7e6be38b522f1b32a681fd516d684c3dbbf7b34b743` | ACCEPTED_BY_STATIC_MODEL |
| early diagnostic | `092bcabc0f8717a648030c592aa0dc900f878952fb14ee453851a29f298ea7ee` | ACCEPTED_BY_STATIC_MODEL |
| lifecycle reference | `bfb4a5cc768e162fe4c2fddf41c3978e152722918a39085277fd172cb95a7182` | ACCEPTED_BY_STATIC_MODEL |
Negative host copies prove deterministic rejection for bad magic, unsupported
type, and out-of-file segment ranges. An unmapped entry yields
`MODEL_INCOMPLETE`, while a wrong machine remains accepted with an explicit
source-validation gap because the actual loader does not check it.
`ACCEPTED_BY_STATIC_MODEL` means only “no deterministic rejection in the
modeled source path.” It is not proof of runtime allocation, kernel calls,
imports, firmware behavior, receipt, entry, execution, notification, cleanup,
or return.
@@ -0,0 +1,55 @@
# Phase 1.0D loader-to-entry analysis
Status: `RETROARCH_PS5_ENTRY_DIAGNOSTIC_LADDER_BUILT_OFFLINE`.
Nothing in this phase authorizes a PS5 connection, transfer, or execution.
## Source-bound path
The analysis binds hardened elfldr commit
`197623058f509eddde18868dafcb92fdcac66464`, SDK v0.41 commit
`d2e2e585740362976a39fdd5ccf390f199a7bc37`, and chimera-retroarch
commit `69b65858ffaee826d70f5c0df61013cd1b0e2048`.
| Order | Source operation | Observable marker | Failure status |
|---:|---|---|---|
| 1 | elfldr sanity checks the received buffer | none | host receipt and this check remain unobservable |
| 2 | elfldr reserves/copies segments, applies relative relocations and protections | none | allocation, mapping, copy, protection, or sync can fail |
| 3 | elfldr creates `payload_args_t`, saves a synthetic return at `RSP-8`, sets entry RIP and passes args in RDI | none | resource setup and register writes can fail |
| 4 | SDK `_start` clears BSS | none | loader/stack/entry correctness is still required |
| 5 | `payload_init` calls `__crt_syscall_init`, `__kernel_init`, `__klog_init`, resolves and sets `__isthreaded` | none | any failed setup returns before `main` |
| 6 | `__patch_init` changes current-process credentials/capability attributes and the permitted syscall-address range | none | exact runtime success and firmware-9.60 behavior are unproven |
| 7 | `__rtld_init`, dependency opening, relocation and init-array handling | none | a missing module/import or relocation failure can stop before `main` |
| 8 | canary `main` or RetroArch `main` | C1 or D00 | first Phase-1.0D visible boundary |
| 9 | profile body and bounded teardown | D01-D12 for early diagnostic | raw boundary result is retained in memory |
| 10 | `_Exit` selected by the profile | D12 precedes it in the early profile | device exit behavior remains unproven |
The earliest possible failure is therefore before `_start`: elfldr receipt,
validation, mapping, argument-resource construction, or register transfer.
After entry, the earliest application-independent failure is BSS/SDK CRT
initialization. Neither C1 nor D00 can distinguish those earlier steps.
## Loader and artifact effects
The existing loader itself performs process mapping, protection, ptrace-style
register operations, socket-overlap setup for the SDK argument resources, and
kernel/process changes in its broader execution path. The normal SDK CRT also
performs the bounded source-visible writes described above. Phase 1.0D does
not call any of this: it only builds and audits files offline. These effects
must not be described as harmless or absent in any later run authorization.
No SDK CRT or hardened elfldr source was modified. No freestanding startup was
introduced. Static model acceptance is not proof of transport, receipt,
execution, firmware compatibility, visible notification, or safe exit.
## Complexity comparison
| Artifact | Bytes | Entry | PHDRs / LOADs | Relocations | Imports | DT_NEEDED | BSS bytes | Largest LOAD memory |
|---|---:|---:|---:|---:|---:|---:|---:|---:|
| Phase-1.0B smoke | 1,826,216 | `0xfdd70` | 4 / 3 | 1,053 | 140 | 7 | 697,232 | 903,360 |
| CRT canary | 106,344 | `0x290` | 4 / 3 | 144 | 4 | 2 | 2,512 | 35,312 |
| early diagnostic | 1,844,664 | `0xfec40` | 4 / 3 | 1,054 | 141 | 7 | 697,616 | 903,744 |
| lifecycle reference | 112,680 | `0x90` | 4 / 3 | 142 | 2 | 2 | not used as a Phase-1.0D claim | not used as a Phase-1.0D claim |
The canary materially reduces size, imports, modules, and relocation volume.
The comparison can isolate classes of failure in a future authorized ladder;
it does not establish which class caused Phase 1.0C.
@@ -0,0 +1,44 @@
# Phase 1.0D future device-test ladder
Current state:
```text
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
```
There is no transfer or execution package. The following is only a contract
for a later task.
## RUN A
A later authorization must name exactly
`chimera_ps5_crt_entry_canary.elf`, size 106,344 bytes, SHA-256
`c84c0fb43392ce17abc1e7e6be38b522f1b32a681fd516d684c3dbbf7b34b743`,
the destination address supplied in that later task, one connection, one
direct in-memory transfer, one execution, and a bounded observation window.
It must continue to forbid install, autoload, staging, device files, live
replacement, cleanup, retry, reconnect, reboot, and any other payload.
Visible `CHIMERA C1 — CRT MAIN REACHED` is the only RUN-A success marker. A
completed host send is not success. RUN A is never automatically repeated.
## RUN B
RUN B cannot be authorized merely because Phase 1.0D passed offline. It
requires visible RUN-A success, a separately recorded result, and a new
artifact-specific authorization naming
`retroarch_ps5_early_diag.elf`, size 1,844,664 bytes, SHA-256
`092bcabc0f8717a648030c592aa0dc900f878952fb14ee453851a29f298ea7ee`.
It permits at most one connection, transfer, execution, and bounded
observation. The operator records the last visible D-code or the magenta-frame
state.
RUN B has no retry, reconnect, second execution, third artifact, autoload,
installation, persistent staging, device write, or Phase-1.0B smoke rerun.
RUN A authority does not carry to RUN B.
@@ -0,0 +1,66 @@
# Phase 1.0D startup and import closure
## Pre-main closure
The SDK `_start` order is BSS clear; syscall bridge; kernel argument bridge;
klog; `__isthreaded`; `__patch_init`; runtime linker; dependent library
opening/relocation; init array; then `main`. Both Phase-1.0D artifacts have
zero-byte init and fini arrays and no TLS sections or PT_TLS. Heap, signal, and
pthread behavior is not an application constructor here, but the runtime and
linked libraries remain able to resolve their normal facilities.
`__patch_init` is not side-effect-free: it reads then changes current-process
capability/attribute bytes (including source comments for JIT shared memory
and ptrace) and writes lower/upper syscall-address bounds through kernel
copyin. The loader also prepares mappings and SDK resources before entry.
These are pre-main failure points with no C1/D00 marker.
The SDK runtime linker can resolve and conditionally load
`/system/common/lib/libSceSysmodule.sprx`; exact runtime module availability
and whether that conditional path executes on firmware 9.60 are unproven.
Hardened elfldr does not resolve the artifact's dynamic symbols; the SDK
runtime path does.
## Canary imports
| Import | Class | Rationale |
|---|---|---|
| `memset` | CRT_PRE_MAIN / helper | request clearing may be compiler-lowered; SDK startup precedes it |
| `sceKernelSendNotificationRequest` | CANARY_MAIN | only C1 output |
| `nanosleep` | CANARY_MAIN | one two-second relative wait |
| `_Exit` | SHUTDOWN | selected terminal call |
Required modules are `libkernel_web.sprx` and `libSceLibcInternal.sprx`.
## Early-diagnostic groups
The complete 141-symbol set is machine-readable in
`manifests/retroarch/phase-1.0d-early-diag-artifact.json`. Its meaningful
boundary grouping is:
- CRT_PRE_MAIN: SDK-owned syscall/kernel/klog/patch/runtime-linker operations
are statically linked and may resolve libc/kernel facilities before D00.
No target marker precedes them.
- RETROARCH_PRE_VIDEO: libc/POSIX support, user service, system-service splash,
notification, clock and bounded platform status.
- VIDEO: direct memory, equeue, and every `sceVideoOut*` import.
- INPUT: `scePadInit`, `scePadOpen`, `scePadReadState`, `scePadClose`.
- AUDIO: `sceAudioOutInit`, `sceAudioOutOpen`, `sceAudioOutOutput`,
`sceAudioOutClose`.
- SHUTDOWN: `_Exit`, close/release/delete operations and bounded teardown.
- UNREACHABLE_IN_PROFILE: generic RetroArch file-write strings and code may
remain linked, but the profile routes mutating entrypoints through the
write firewall and disables content/configuration; no socket/SceNet import
is present.
The import list alone cannot prove reachability. Conversely, absent imports do
not disprove statically linked behavior. The source profile, linker map,
disassembly, undefined-symbol inventory, and host fault model are considered
together. Generic localization strings such as netplay text and
`udp://127.0.0.1:` remain in the binary; there is no target network callgraph
or network import. SDK patch symbols also remain because normal CRT startup
was an explicit requirement.
The earliest new marker that does not modify SDK CRT or loader architecture is
therefore C1/D00 at application `main`. A notification earlier than that would
require a separately reviewed CRT/loader change and is out of scope.

Some files were not shown because too many files have changed in this diff Show More