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
+16
View File
@@ -0,0 +1,16 @@
# Decision log
| Date | Decision | ADR | Status |
|---|---|---|---|
| 2026-07-16 | Create an independent `chimera-gfx` repository | ADR-0001 | accepted |
| 2026-07-16 | Treat GNM export names as discovery evidence only | ADR-0002 | accepted |
| 2026-07-16 | Keep the Phase-0 probe non-rendering and fail-closed | ADR-0003 | accepted |
| 2026-07-16 | Use GPL-3.0-or-later for project code | ADR-0004 | accepted |
| 2026-07-17 | Define the resource lifecycle through a non-rendering mock model | ADR-0005 | accepted |
| 2026-07-17 | Keep the first VideoOut experiment behind pinned SDL2 | ADR-0006 | accepted |
| 2026-07-17 | Bind every candidate to a machine-readable artifact manifest | ADR-0007 | accepted |
| 2026-07-17 | Allowlist 9.60 for probe builds while blocking SDK-CRT execution | ADR-0008 | accepted |
| 2026-07-17 | Block unproven minimal startup and permanently deny the legacy ELF | ADR-0009 | accepted |
New decisions that change safety, ABI, firmware, licensing, or adapter
boundaries require a numbered ADR and an update here.
+40
View File
@@ -0,0 +1,40 @@
# Publication readiness
The current source tip is prepared for public review. The repository remains
private until the history and security-contact decisions below are confirmed.
## Completed
- GPL-3.0-or-later license, contribution guidance, security policy, third-party
notices, and a user-oriented README are present.
- Development branches are consolidated into one reviewed candidate branch.
- No generated ELF, SDK archive, crash dump, device capture, or other binary
release artifact is tracked.
- Current source paths and manifests contain no private LAN repository URL or
operator-specific filesystem path.
- Host builds, policy tests, JSON validation, large-object review, and current
plus all-ref secret scans are part of the publication review.
- CI actions, container images, SDK downloads, and source revisions are pinned;
downloaded SDK bytes are verified before use. Distribution packages follow
the security-updated repository attached to the pinned base image rather than
stale exact package revisions.
- `SECURITY.md` publishes a fixed private reporting address.
- Pull requests from public forks cannot run on the self-hosted CI runner.
- `tools/export-public-source.sh` creates a parentless source candidate, strips
machine-local agent instructions, and rejects private deployment markers,
forbidden secret files, generated binaries, and oversized files.
## Decisions required before changing visibility
1. **Release policy.** Recommended: publish reviewed source only. Do not attach
runnable PS5 ELF artifacts; if that policy changes later, require reproducible
builds, checksums, corresponding source, and a separate safety review.
Historical commits contain an old private LAN URL, operator-specific paths, and
author email metadata. Keep that canonical history private and publish only the
parentless export from a reviewed commit. Deleting branches is not a substitute
for this export.
Generated payloads, crash dumps, SDK archives, local hardware captures, and
unredacted operator records are not public source artifacts and must remain
outside Git.
+15
View File
@@ -0,0 +1,15 @@
# ADR-0001: Standalone repository
- Status: accepted
- Date: 2026-07-16
## Decision
`chimera-gfx` is a new repository and workspace, not a subdirectory, worktree,
submodule, or branch of the existing Chimera project.
## Consequences
It has an independent Git history, private Gitea origin, license, CI, release
policy, dependencies, and risk boundary. No path or build step refers to the
existing Chimera repository.
+21
View File
@@ -0,0 +1,21 @@
# ADR-0002: Export names are not ABI definitions
- Status: accepted
- Date: 2026-07-16
## Context
The public PS5 Payload SDK v0.41 contains GNM export stubs but no GNM headers,
structure definitions, or GPU samples.
## Decision
An export name proves only that the pinned stub set exposes that name. No C
prototype, calling convention detail, structure layout, ownership rule, or
semantic behavior is inferred from it. Phase 0 may resolve a name and record a
boolean, but may not call the result.
## Consequences
Even `sceGnmAreSubmitsAllowed` is not called. Each future ABI must be accepted
through a new evidence record before use.
+20
View File
@@ -0,0 +1,20 @@
# ADR-0003: Fail-closed capability probe
- Status: accepted
- Date: 2026-07-16
## Decision
The PS5 probe is disabled in ordinary builds. A probe build embeds exactly one
approved firmware identifier, defaulting to `NONE`. Runtime requires an exact
firmware match and the literal `--acknowledge-read-only-probe` argument before
module loading. The checked-in firmware matrix is empty.
The platform shim may call only `dlopen`, `dlsym`, and `dlclose`. Logs contain
symbol names and booleans, never addresses. There is no deploy target.
## Consequences
Default artifacts cannot discover symbols on hardware. A deliberately gated
artifact still requires separate human authorization before transfer or
execution. Loader-internal side effects remain an explicitly recorded unknown.
+15
View File
@@ -0,0 +1,15 @@
# ADR-0004: GPL-3.0-or-later
- Status: accepted
- Date: 2026-07-16
## Decision
Project-owned code is licensed GPL-3.0-or-later.
## Rationale
The planned RetroArch adapter targets a GPLv3 project and the PS5 Payload SDK is
generally GPLv3-or-later. A common GPL-compatible project license keeps the
combined distribution boundary understandable. Third-party code is not
vendored and retains its own notices.
@@ -0,0 +1,24 @@
# ADR-0005: Versioned resource lifecycle and host present model
- Status: accepted
- Date: 2026-07-17
## Decision
API version 2 includes opaque contexts, surfaces, and textures, plus sized
descriptors for texture upload and present. Context destruction returns
`RESOURCE_BUSY` while child handles exist. The version-1 `chimera_gfx_destroy`
symbol remains as a void compatibility wrapper for childless contexts. The
mock backend implements the complete ownership model in host memory and records
deterministic present serials and content hashes.
The mock present is a state transition, not a graphical operation. It creates
no window, accesses no display, and advertises both `NON_RENDERING` and
`HOST_TEST_ONLY`. The PS5 backend is a separate compiled unit that refuses
context creation with `SAFETY_POLICY`.
## Consequences
Adapter work can compile and test lifecycle assumptions before a hardware ABI
exists. Future backends must preserve validation and cleanup semantics, but
must not inherit mock capabilities without evidence.
@@ -0,0 +1,29 @@
# ADR-0006: Phase-1 VideoOut experiment stays behind SDL2
- Status: accepted
- Date: 2026-07-17
## Context
The public SDK v0.41 exports VideoOut stubs but supplies no official VideoOut
headers. The pinned PS5 SDL2 fork contains a working framebuffer route, but its
backend declares opaque layouts with fields named `junk`. Those declarations
are public source evidence of the upstream implementation, not a sufficiently
proven ABI for duplication in `chimera-gfx`.
## Decision
The first presentation candidate calls only public SDL2 APIs. A reviewed
Zlib-licensed build overlay removes SDL's unrelated keyboard/IME initialization
from this candidate. Project code does not copy a VideoOut prototype or data
layout. The target is disabled by default, requires the PS5 toolchain and an
explicit SDL build path, and embeds the same `NONE` firmware gate as the probe.
The candidate does not link SDL2main because that wrapper hides the splash
screen before application-level firmware validation.
## Consequences
The upstream SDL backend remains the owner of VideoOut, direct memory, tiling,
flip, and cleanup. Its unbounded flip wait is a known hardware-test blocker;
successful offline compilation is not runtime approval or ABI proof.
+15
View File
@@ -0,0 +1,15 @@
# ADR-0007: Artifact provenance is machine-readable and fail-closed
- Status: accepted
- Date: 2026-07-17
## Decision
Every review or hardware candidate uses artifact-manifest schema version 1.
The manifest binds filename, size, SHA-256, target, clean source commit,
toolchain pins, optional SDL commit, firmware gate, and explicit non-execution
state. Generation and verification are separate tested tools.
An artifact with firmware identifier `NONE` is never allowlisted. Any rebuild,
including a firmware-specific rebuild, creates a new digest and therefore
requires a new artifact-specific approval.
@@ -0,0 +1,39 @@
# ADR-0008: Firmware 9.60 is build-allowlisted; SDK-CRT execution is blocked
- Status: accepted
- Date: 2026-07-17
## Context
Jens reported exact PS5 firmware `9.60` and authorized an offline-only,
non-rendering capability-probe build and audit. Transfer, connection, execution,
VideoOut, framebuffer/GPU/GNM mutation, draw, dispatch, submit, flip, MMIO,
register writes, and kernel/firmware changes remain prohibited.
The pinned public SDK v0.41 source was audited beyond project `main`. Its
payload startup calls `__patch_init` before `main`. That function changes the
current process's kernel credential fields and syscall-address bounds using the
SDK kernel read/write path. The SDK rtld also ensures `libSceSysmodule.sprx` is
available during startup. A later project `dlopen` can load/start
`libSceGnmDriver.sprx`; `dlclose` can stop/unload it.
## Decision
The discovery manifest and probe configure gate accept exactly `9.60`; the
default remains `NONE`. This allowlist entry authorizes only a reproducible
offline build. Phase-1 VideoOut rejects every non-`NONE` firmware gate.
The resulting 9.60 ELF is named `offline-audit-only`, records zero transfer and
execution, and is not execution-eligible. No literal execution approval is
offered while the linked SDK CRT performs kernel writes before the project gate.
## Consequences
- Project code still invokes no resolved GNM pointer and contains no rendering,
submit, draw, dispatch, flip, or GPU-memory operation.
- The artifact is useful for deterministic compilation, import/disassembly
review, hashing, and future startup research only.
- A new ADR and a new hash-bound build are required after a public,
kernelwrite-free startup/loader route is proven.
- Transfer or execution of this artifact would violate the current safety
policy even if Jens later supplied a generic execution approval.
@@ -0,0 +1,43 @@
# ADR-0009: Block unproven minimal startup and permanently deny legacy ELF
Status: accepted
Date: 2026-07-17
## Context
SDK v0.41's stock `crt1.o` performs prohibited kernel credential and
syscall-bound writes before project `main`. Phase 0.5 tested whether omitting
the CRT could support a deterministic freestanding entry. Compiler and linker
evidence proves omission is mechanically possible, but no exact pinned loader
caller is locally available to prove stack, argument ownership, safe return,
post-return cleanup, crash handling, or pre-entry process changes.
The already-built firmware-9.60 capability probe has SHA-256
`4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63`
and must remain permanently blocked.
## Decision
Do not create a minimal-startup source or PS5 ELF while the caller contract is
unproven. Keep `CHIMERA_GFX_BUILD_PS5_MINIMAL_STARTUP` as an unconditional
configure-time failure with the evidence blocker stated in its message.
Require every artifact manifest to state `execution_eligible` explicitly. New
manifests default to false. Maintain a permanent SHA-256 denylist and a
fail-closed policy tool that refuses false eligibility, malformed records,
changed bytes, or a denylist match. Passing this static layer does not grant
execution authority.
## Consequences
- no Phase-0.5 PS5 ELF, linker map, artifact disassembly, or artifact hash
exists;
- stock CRT evidence remains available for review without making a safe-runtime
claim;
- the legacy firmware-9.60 ELF cannot become eligible through a later manifest
edit or approval record;
- a Payload Manager can consume the JSON policy tool, but the manager's own
implementation remains outside this repository and cannot be claimed
reviewed here;
- work may continue through mock/software backends or a separately scoped
Linux-on-PS5 backend.
@@ -0,0 +1,45 @@
# ADR-0010: Controlled runtime effects and Phase-0.6 gate
Status: accepted on 2026-07-17.
## Context
ADR-0009 asked whether a fully kernelwrite-free startup could be proven while
the exact loader was absent. The current task corrects the safety model:
documented, bounded, volatile runtime changes may be acceptable. Persistent
writes and unbounded or unknown effects remain hard blockers.
The installed Payload Manager and elfldr were subsequently identified exactly.
Their public source exposes both acceptable volatile effects and unresolved
unbounded paths.
## Decision
Classify each lifecycle effect as exactly one of:
- `EXPECTED_VOLATILE_RUNTIME_EFFECT`;
- `RESTORED_BY_LOADER`;
- `PAYLOAD_PROCESS_LOCAL`;
- `PERSISTENT_WRITE`;
- `UNBOUNDED_OR_UNKNOWN`.
Only the final two are categorical blockers. `__patch_init` is classified as
payload-process-local and is no longer an automatic blocker.
Every potentially eligible artifact must also have a profile named exactly
`controlled-ps5-runtime`, with exact firmware/loader/SDK/artifact identity,
an explicit list of expected volatile effects, zero persistent and filesystem
writes, no payload network, a maximum 2000 ms runtime, no retry, no hard
effects, and no hard blockers. Both the profile and static gate explicitly set
`execution_authorized=false`; static eligibility never grants execution
authority.
## Consequences
Phase 0.6 remains blocked because the exact chain has unbounded ptrace loops,
no payload watchdog, unresolved termination/cleanup, incomplete credential
restoration, no launch-time hash enforcement, and a persistent manager upload
path. No lifecycle source or ELF is built.
ADR-0009 and its Phase-0.5 evidence remain historical records. The permanent
artifact denylist is unchanged.
@@ -0,0 +1,49 @@
# ADR-0011: Phase-0.7 hardened controlled runtime
- Status: accepted for offline deployment preparation
- Date: 2026-07-17
- Decision: `READY_FOR_HARDENED_RUNTIME_DEPLOYMENT`
## Context
Phase 0.6 identified exact upstream loader and Payload Manager versions but
found unbounded ptrace completion, incomplete credential restoration, missing
reaping/watchdog behavior, and a path-based unhashed launch route. Those
findings were implementation inputs, not permanent platform blockers.
Jens explicitly confirmed exact firmware 9.60. Independent device attestation
is therefore not a Phase-0.7 blocker. The controlled upload below
`/data/pldmgr/payloads/chimera-controlled` is an allowed, removable
application write and is not a firmware write.
## Decision
Use private GPL-3.0 hardening forks based on:
- elfldr `699e8bcff03e91e8d6ca6eba281af25c5a58d8c2`;
- Payload Manager `cfbc70f30f419b09bf2b52283f7409e2d3117ee1`;
- PS5 Payload SDK `d2e2e585740362976a39fdd5ccf390f199a7bc37`.
The controlled route is a versioned loopback-only protocol with exact
firmware, artifact ID, size, SHA-256, timeout, and no-retry metadata. elfldr
rehashes received bytes, enforces the permanent denylist, applies bounded
ptrace steps and cleanup, and reaps the child through a two-second watchdog.
The controlled manager is compiled for one exact lifecycle artifact and opens,
hashes, rewinds, and streams one no-follow file descriptor.
The lifecycle probe uses normal SDK v0.41 startup, performs one
`sceKernelSendNotificationRequest`, and calls `_exit`; it does not return
through `payload_terminate`.
## Consequences
The three ELFs are eligible for a later, separately authorized hardened
runtime installation. This decision does not authorize installation,
transfer, or execution. The previously blocked SHA-256
`4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63`
remains permanently denied.
Normal SDK startup still reaches documented process-local patch and runtime
initialization. The existing elfldr bootstrap still enables volatile QA flags.
Both facts are explicit expected runtime effects; neither is silently claimed
kernelwrite-free.
@@ -0,0 +1,38 @@
# ADR-0012: Phase-1.0J first-frame identity
- Status: accepted for offline diagnostic construction
- Date: 2026-07-22
- Decision: `FIRST_FRAME_INDEX_ZERO_SOURCE_CONSISTENCY_ONLY`
## Context
The consumed Phase-1.0H run submitted the diagnostic buffer with
`sceVideoOutSubmitFlip(handle, 0, 1, 0)` and received `-1`. The diagnostic
helper used buffer zero, while the patched normal SDL update path started its
frame counter at one. The public PS5 SDL source at commit
`0baf4ac49382b537ba449901b5b6d0d189bb1fbb` starts that normal counter at
zero. Phase 1.0I classified the mismatch as a strong source candidate, not a
proven firmware root cause.
## Decision
The Phase-1.0J SDL overlay defines one compile-time source of truth,
`CHIMERA_PS5_FIRST_FRAME_INDEX`, with value zero. The early diagnostic copy,
the early diagnostic submit and the normal update counter all derive their
initial index from that macro.
Zero is selected because it preserves the already-audited diagnostic tuple
and agrees with the public SDL source. It is not selected on the basis of an
unpublished ABI or an inferred firmware requirement.
## Consequences
The internal zero-versus-one inconsistency is removed and can be checked in
source, linker-map and disassembly evidence. This decision does not prove that
buffer zero is accepted on firmware 9.60, that the fourth flip argument has
the required semantics, or that the old mismatch caused the Phase-1.0H
failure.
Phase 1.0J remains an offline artifact phase. A separately reviewed exact
artifact and new explicit permission would be required before any connection,
transfer, result reception or execution.
@@ -0,0 +1,131 @@
# Phase 0.8 future bounded-observation permission template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This file is not permission. Empty, `null`, zero, missing, ambiguous, expired,
or inconsistent input means `STOP`. Copying, editing, signing, or committing
the template does not itself authorize a connection, transfer, or execution.
Authorization can exist only through a new exact statement from Jens in the
active task after the proposed method and its complete effect contract have
been reviewed.
The template may describe only a separately named bounded-observation phase.
It cannot authorize installation, rollback creation, lifecycle execution,
autoload, retry, graphics work, or RetroArch work.
## Machine-readable default state
The validator requires every authority value below to remain `false` in the
repository template and every request-specific field to remain unfilled.
<!-- BEGIN PHASE08_BOUNDED_OBSERVATION_TEMPLATE -->
```json
{
"template_only": true,
"authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"installation_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"authorization_date": null,
"expiration_time": null,
"device_identity": null,
"exact_purpose": null,
"exact_observations": null,
"method_or_collector_id": null,
"source_commit": null,
"collector_file_size": null,
"collector_sha256": null,
"firmware_gate": null,
"maximum_runtime_ms": null,
"maximum_execution_count": null,
"maximum_transfer_count": null,
"network_behavior": null,
"output_channel": null,
"allowed_volatile_effects": null,
"prohibited_persistent_effects": null,
"stop_criteria": null,
"cleanup_requirements": null,
"reporting_requirements": null,
"explicit_installation_exclusion": null,
"explicit_lifecycle_probe_exclusion": null,
"explicit_autoload_and_retry_exclusion": null,
"explicit_graphics_and_retroarch_exclusion": null,
"revocation_method": null,
"manual_confirmation_template_does_not_authorize": null
},
"fixed_exclusions": {
"installation": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"gnm": true,
"videoout": true,
"sdl": true,
"retroarch": true
}
}
```
<!-- END PHASE08_BOUNDED_OBSERVATION_TEMPLATE -->
## Required human review fields
Every field below must be supplied in a later review package. Do not fill it
in this repository template.
- Exact user statement:
- Authorization date and timezone:
- Expiration time and timezone:
- Device identity:
- Exact purpose:
- Exact observations:
- Method or collector ID:
- Source repository and commit:
- Collector filename:
- Collector byte size:
- Collector SHA-256:
- Exact firmware gate:
- Maximum runtime:
- Maximum execution count:
- Maximum transfer count:
- Network behavior, addresses, ports, direction, and connection count:
- Output channel and maximum output:
- Exhaustive allowed volatile effects:
- Exhaustive forbidden persistent and functional effects:
- STOP criteria:
- Cleanup requirements:
- Reporting and raw-evidence requirements:
- Explicit installation exclusion:
- Explicit lifecycle-probe exclusion:
- Explicit autoload and retry exclusion:
- Explicit GNM, VideoOut, SDL, and RetroArch exclusion:
- Revocation method and immediate-stop behavior:
- Manual confirmation that this template is not authorization:
No artifact ID, filename, size, SHA-256, path, ABI, syscall, loader contract,
transport, or execution mechanism is implied by these empty fields.
## Mandatory future effect boundary
A future request must enumerate every allowed category-C volatile effect
before authorization. All category-A persistent mutations and category-B
functional mutations remain prohibited unless a different, explicitly
mutating phase is designed and separately authorized.
Unknown behavior, an unspecified effect, an identity mismatch, a partial
dataset, a timeout, an expired authorization, a count overrun, an unexpected
log, or cleanup uncertainty means immediate `STOP` with no automatic retry.
The approved observation count, transfer count, and execution count—if any—
must be literal bounded integers. No value carries into rollback preparation,
installation, lifecycle testing, graphics, or RetroArch.
## Revocation
Jens may revoke a later authorization at any time before or during the
authorized window. Revocation, ambiguity, interruption, or conflicting
instructions causes fail-closed stop. Revocation never triggers cleanup that
was not already explicitly reviewed and authorized.
@@ -0,0 +1,69 @@
# Phase 0.9 future backup-creation approval template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This template is for one possible future backup-creation change window for one
component. It cannot authorize observation collection, staging, switch,
installation, execution, lifecycle, autoload, retry or a second component.
<!-- BEGIN PHASE09_BACKUP_CREATION_TEMPLATE -->
```json
{
"template_only": true,
"template_action": "backup_creation",
"authorized": false,
"installation_authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"component": null,
"exact_action": null,
"maximum_action_count": null,
"maximum_runtime_ms": null,
"live_path": null,
"live_mount_id": null,
"live_object_id": null,
"live_type": null,
"live_size": null,
"live_sha256": null,
"backup_path": null,
"backup_mount_id": null,
"minimum_free_bytes_and_metadata_reserve": null,
"reopen_and_rehash_contract": null,
"target_mapping": null,
"independent_recovery_executor": null,
"second_independent_recovery_path": null,
"allowed_persistent_effects": null,
"forbidden_effects": null,
"cleanup_contract": null,
"stop_conditions": null,
"revocation_method": null,
"reviewer": null
},
"fixed_exclusions": {
"staging": true,
"switch": true,
"installation": true,
"execution": true,
"second_component": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"graphics": true,
"retroarch": true
}
}
```
<!-- END PHASE09_BACKUP_CREATION_TEMPLATE -->
The exact current live identity and separate backup destination must be filled
from later admissible evidence. A stock reference hash does not fill this
template. The Payload Manager backup hard gate remains open.
@@ -0,0 +1,64 @@
# Phase 0.9 future observation approval template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This template never grants permission. It is bound only to a possible future
observation action and cannot authorize backup creation, staging, switch,
installation, lifecycle, execution, autoload, retry, graphics or RetroArch.
Every request-specific value is deliberately empty.
<!-- BEGIN PHASE09_OBSERVATION_TEMPLATE -->
```json
{
"template_only": true,
"template_action": "observation",
"authorized": false,
"installation_authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"firmware_source_one": null,
"firmware_source_two": null,
"component": null,
"exact_action": null,
"maximum_action_count": null,
"maximum_runtime_ms": null,
"collector_or_artifact_id": null,
"collector_or_artifact_size": null,
"collector_or_artifact_sha256": null,
"source_commit": null,
"allowed_observations": null,
"allowed_volatile_effects": null,
"forbidden_effects": null,
"output_contract": null,
"cleanup_contract": null,
"stop_conditions": null,
"revocation_method": null,
"reviewer": null
},
"fixed_exclusions": {
"backup_creation": true,
"staging": true,
"switch": true,
"installation": true,
"execution": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"graphics": true,
"retroarch": true
}
}
```
<!-- END PHASE09_OBSERVATION_TEMPLATE -->
Empty, ambiguous, expired, mismatched or unreviewed data means `STOP`. A copy,
signature, edit or commit of this file is not approval.
@@ -0,0 +1,64 @@
# Phase 0.9 future one-shot execution approval template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This template can be considered only after a separately approved switch,
durable post-switch identity verification and human review. It is bound to one
component and one manual execution. It does not authorize transfer,
installation, lifecycle-probe execution, autoload, retry or another component.
<!-- BEGIN PHASE09_ONE_SHOT_EXECUTION_TEMPLATE -->
```json
{
"template_only": true,
"template_action": "one_shot_execution",
"authorized": false,
"installation_authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"component": null,
"exact_action": null,
"maximum_execution_count": null,
"maximum_runtime_ms": null,
"live_artifact_id": null,
"live_source_commit": null,
"live_size": null,
"live_sha256": null,
"live_mount_id": null,
"live_object_id": null,
"post_switch_verification_evidence": null,
"verified_backup_identity": null,
"independent_recovery_executor": null,
"success_criteria": null,
"stop_conditions": null,
"cleanup_contract": null,
"reporting_contract": null,
"revocation_method": null,
"reviewer": null
},
"fixed_exclusions": {
"transfer": true,
"installation": true,
"second_execution": true,
"second_component": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"graphics": true,
"retroarch": true
}
}
```
<!-- END PHASE09_ONE_SHOT_EXECUTION_TEMPLATE -->
The template itself is not a request and is not permission. Phase 0.9A does
not ask for execution approval.
@@ -0,0 +1,63 @@
# Phase 0.9 future staging approval template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This template could bind one future inactive candidate-staging action. It
cannot authorize a live switch, installation, execution, lifecycle, autoload,
retry or a second component.
<!-- BEGIN PHASE09_STAGING_TEMPLATE -->
```json
{
"template_only": true,
"template_action": "staging",
"authorized": false,
"installation_authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"component": null,
"exact_action": null,
"maximum_action_count": null,
"maximum_runtime_ms": null,
"candidate_artifact_id": null,
"candidate_source_commit": null,
"candidate_size": null,
"candidate_sha256": null,
"staging_path": null,
"staging_mount_id": null,
"staging_inactive_proof": null,
"verified_backup_identity": null,
"verified_backup_sha256": null,
"candidate_reopen_and_rehash_contract": null,
"allowed_persistent_effects": null,
"forbidden_effects": null,
"cleanup_contract": null,
"stop_conditions": null,
"revocation_method": null,
"reviewer": null
},
"fixed_exclusions": {
"live_switch": true,
"installation": true,
"execution": true,
"second_component": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"graphics": true,
"retroarch": true
}
}
```
<!-- END PHASE09_STAGING_TEMPLATE -->
A candidate hash or offline build record alone never authorizes staging.
@@ -0,0 +1,67 @@
# Phase 0.9 future live-switch approval template
Status: **TEMPLATE ONLY — NOT AUTHORIZED**.
This template is limited to one future switch of one separately staged
component. It cannot authorize staging, execution, lifecycle, rollback,
autoload, retry or a second component.
<!-- BEGIN PHASE09_SWITCH_TEMPLATE -->
```json
{
"template_only": true,
"template_action": "live_switch",
"authorized": false,
"installation_authorized": false,
"execution_authorized": false,
"transfer_authorized": false,
"lifecycle_authorized": false,
"automatic_retry": false,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"component": null,
"exact_action": null,
"maximum_action_count": null,
"maximum_runtime_ms": null,
"live_path_mount_object_size_sha256": null,
"backup_path_mount_object_size_sha256": null,
"candidate_path_mount_object_size_sha256": null,
"target_quiescence_evidence": null,
"autoload_and_retry_disabled_evidence": null,
"atomic_switch_primitive_identity": null,
"atomicity_evidence": null,
"file_durability_evidence": null,
"directory_durability_evidence": null,
"power_loss_evidence": null,
"post_switch_verification_contract": null,
"independent_recovery_executor": null,
"rollback_target_mapping": null,
"allowed_persistent_effects": null,
"forbidden_effects": null,
"stop_conditions": null,
"revocation_method": null,
"reviewer": null
},
"fixed_exclusions": {
"staging": true,
"execution": true,
"second_component": true,
"lifecycle_probe": true,
"autoload": true,
"automatic_retry": true,
"in_place_overwrite": true,
"two_step_rename_gap": true,
"graphics": true,
"retroarch": true
}
}
```
<!-- END PHASE09_SWITCH_TEMPLATE -->
While atomicity or durability is `UNPROVEN`, this template must remain empty
and no switch request may be made.
@@ -0,0 +1,76 @@
# Phase 0.9B future observer execution template
Status: **TEMPLATE ONLY — NOT AUTHORIZED — BLOCKED**.
This file cannot authorize an action. There is no observer artifact to bind,
and the startup/exit and output-channel gates are blocked. Every
request-specific value is deliberately empty. Editing, signing, copying,
committing or pushing this template does not grant permission.
<!-- BEGIN PHASE09B_OBSERVER_EXECUTION_TEMPLATE -->
```json
{
"template_only": true,
"phase": "0.9B",
"action": "one_shot_observer_execution",
"status": "BLOCKED",
"authorized": false,
"transfer_authorized": false,
"execution_authorized": false,
"installation_authorized": false,
"lifecycle_authorized": false,
"autoload_authorized": false,
"backup_creation_authorized": false,
"automatic_retry": false,
"observer_only": true,
"required_fields": {
"exact_user_statement": null,
"active_task_id": null,
"authorization_issued_at": null,
"authorization_expires_at": null,
"device_identity": null,
"firmware_exact": null,
"firmware_source_one": null,
"firmware_source_two": null,
"observer_build_id": null,
"observer_source_commit": null,
"observer_size": null,
"observer_sha256": null,
"toolchain_identity": null,
"runtime_path": null,
"allowed_observations": null,
"allowed_read_paths": null,
"output_channel": null,
"maximum_runtime_ms": null,
"maximum_execution_count": null,
"stop_criteria": null,
"reviewer": null
},
"fixed_exclusions": {
"device_address": true,
"installation": true,
"lifecycle": true,
"autoload": true,
"automatic_retry": true,
"backup_creation": true,
"file_mutation": true,
"process_or_service_mutation": true,
"listener_creation": true,
"kernelwrite": true,
"graphics": true,
"sdl": true,
"retroarch": true
},
"blocking_facts": [
"OBSERVER_STARTUP_OR_EXIT_ABI_UNPROVEN",
"NO_PROVEN_NON_PERSISTENT_OUTPUT_CHANNEL",
"OBSERVER_ARTIFACT_ABSENT"
]
}
```
<!-- END PHASE09B_OBSERVER_EXECUTION_TEMPLATE -->
A future request would need a new active-task authorization bound to one exact
artifact, device, firmware, output channel, observation plan, runtime,
one execution and expiration. That later request still could not authorize
installation, lifecycle, backup creation, autoload or retry.
@@ -0,0 +1,57 @@
# Phase 0.9E-R Y2JB deployed-use operator attestation
Status: `UNATTESTED_TEMPLATE`
This template records a future operator statement. It is not device evidence,
runtime verification, permission, or approval. Do not add secrets, PS5
addresses, account identifiers, signed download URLs, or credentials.
```yaml
schema_version: 1
phase: PHASE_0_9E_R_Y2JB_DEPLOYED_USE_ATTESTATION
attested: false
attestation_date: null
operator: null
outer_zip:
file_name: null
sha256: null
size: null
obtained_from: null
installation_date_exact_or_estimated: null
installation_date_is_estimate: null
restore_or_install_method: null
firmware_at_restore_or_install: null
subsequent_changes:
another_y2jb_backup_applied: null
download0_dat_replaced_separately: null
youtube_or_appdata_changed: null
external_autoloader_used: null
external_autoloader_identity: null
host_sender:
tool_name: null
path_or_source: null
version_or_commit: null
sha256: null
default_port: null
ports_actually_selected: []
classification_when_completed: OPERATOR_ATTESTED_DEPLOYED_USE
runtime_verified: false
device_action_authorized: false
target_build_authorized: false
execution_authorized: false
installation_authorized: false
transfer_authorized: false
lifecycle_authorized: false
autoload_authorized: false
device_write_authorized: false
automatic_retry: false
```
An incomplete or completed statement never changes `runtime_verified` and
never authorizes a device action. Any later use requires a separate review and
artifact-specific authorization.
@@ -0,0 +1,25 @@
# Phase 1.0AA offline fake-adapter approval record
This tracked record is deliberately inactive and authorizes no live action.
- `active=false`
- `attested=false`
- `run_id=null`
- `target_address=null`
- `target_port=null`
- `window=null`
- `ps5_connection_authorized=false`
- `device_request_authorized=false`
- `result_receive_authorized=false`
- `target_build_authorized=false`
- `device_transfer_authorized=false`
- `device_execution_authorized=false`
- `installation_authorized=false`
- `autoload_authorized=false`
- `device_write_authorized=false`
- `automatic_retry=false`
- `reconnect_authorized=false`
- `resume_authorized=false`
The fake integration cannot consume a live approval and exposes no live
adapter. A later phase and new exact permission would be required first.
@@ -0,0 +1,23 @@
# Phase 1.0AB live-adapter feasibility approval record
This tracked record is inactive and grants no network or device authority.
- `active=false`
- `attested=false`
- `target_address=null`
- `target_port=null`
- `run_id=null`
- `ps5_connection_authorized=false`
- `device_request_authorized=false`
- `result_receive_authorized=false`
- `target_build_authorized=false`
- `device_transfer_authorized=false`
- `device_execution_authorized=false`
- `installation_authorized=false`
- `autoload_authorized=false`
- `device_write_authorized=false`
- `automatic_retry=false`
- `reconnect_authorized=false`
- `resume_authorized=false`
The trace model cannot connect and cannot consume an approval.
@@ -0,0 +1,24 @@
# Phase 1.0AC inactive record
This is not a device approval.
```text
active=false
target_address=null
target_port=null
run_id=null
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
reconnect_authorized=false
resume_authorized=false
```
Phase 1.0AC contains only host-side synthetic tests. No value in this file can
activate a transport or authorize a later action.
@@ -0,0 +1,50 @@
# Phase 1.0B device-smoke approval template
This template is intentionally empty and non-authorizing.
```yaml
authorized: false
transfer_authorized: false
execution_authorized: false
installation_authorized: false
autoload_authorized: false
automatic_retry: false
artifact:
label: retroarch_ps5_software_smoke.elf
sha256: null
size: null
chimera_retroarch_source_commit: null
build_manifest_sha256: null
operator_observation:
firmware_text: null
firmware_expected: "9.60"
observed_by: null
observed_at: null
window:
maximum_transfers: 1
maximum_executions: 1
maximum_runtime_ms: 60000
live_replacement: false
retry: false
autoload: false
installation: false
expected_visible_phases:
- S07_RUNNING
- S08_SHUTDOWN_REQUESTED
expected_shutdown:
- OPTIONS_HOLD_2000_MS
- RUNTIME_LIMIT_60000_MS
- FRAME_LIMIT_3600
accepted_remaining_risks: []
operator_stop_criteria_reviewed: false
```
An edited copy is not valid unless every identity is exact and a new active
task explicitly grants that artifact-specific transfer and execution. This
template is not an execution package and contains no address, sender or
device command.
@@ -0,0 +1,10 @@
# Phase 1.0CZ launch-canary approval template
This tracked document is intentionally inactive and is not permission.
An active approval must be supplied separately in the active task by Jens and
must name the exact SHA-256
`8dadce9d9faaef21ea129a3d216c768eea9a3ca9bf8ecb8d852e376b58a9bf95`,
firmware 9.60, the raw-elfldr baseline route, target, port, unique run ID,
timeout, one transfer, one execution and one bounded result reception. It must
also state no installation, autoload, device write, retry, reconnect or reboot.
@@ -0,0 +1 @@
{"active":false,"run_id":null,"target":null,"port":9021,"artifact_size":109896,"artifact_sha256":"147b5bede0f0b5b7d2be903bc72ff0d0541a2cdc28eae7d86b6bf95e1978ebdf","snapshot_path":null,"receipt_path":null,"not_before":null,"not_after":null,"one_connection":false,"one_transfer":false,"one_execution":false,"result_receive":false,"target_file_read":false,"device_write":false,"installation":false,"autoload":false,"retry":false,"reconnect":false}
@@ -0,0 +1 @@
{"active":false,"run_id":null,"target":null,"port":9021,"artifact_size":110032,"artifact_sha256":"914fce06a490ad048fdd0a85ae117858e8904b47c72054bf12fbfebc213a6db8","output_path":null,"receipt_path":null,"not_before":null,"not_after":null,"one_connection":false,"one_transfer":false,"one_execution":false,"result_receive":false,"directory_inventory":false,"possible_atime_effect_acknowledged":false,"device_file_content_read":false,"persistent_device_write":false,"installation":false,"autoload":false,"retry":false,"reconnect":false}
@@ -0,0 +1 @@
{"active":false,"run_id":null,"target":null,"port":9021,"artifact_size":109928,"artifact_sha256":"077307b98e44f566fa1db82b08cd5e71bd56bd9792826fc7254965fa768c0dc7","output_path":null,"receipt_path":null,"not_before":null,"not_after":null,"one_connection":false,"one_transfer":false,"one_execution":false,"result_receive":false,"four_exact_metadata_reads":false,"possible_atime_effect_acknowledged":false,"app_pkg_read":false,"backup_read":false,"persistent_device_write":false,"installation":false,"autoload":false,"retry":false,"reconnect":false}
@@ -0,0 +1,28 @@
# Phase 1.0E one-shot result test approval
Status: **CONSUMED — NO FURTHER DEVICE ACTION AUTHORIZED**.
On 2026-07-22 the repository owner issued an exact, artifact-bound approval.
The immediately preceding proposal bound that confirmation to:
- `retroarch_ps5_result_diag.elf`;
- 1,844,880 bytes;
- SHA-256
`1049c78099a60b472a3fb0e2999e3393b6ad76337a28532a7e53872e7772dedf`;
- exact firmware 9.60 and the separately confirmed current session address;
- one connection, one direct in-memory raw-ELF transfer, one execution;
- result reception through the same inherited connection; and
- no retry, reconnect, installation, autoload or device write.
The bounded host deadline is 75 seconds. The address is held only in the local
ignored approval record and is not committed. The first connection attempt
consumes this permission regardless of send, execution or result success.
Timeout, EOF, reset, parser failure or any exception stops the run without a
second connection.
This approval does not apply to any other artifact or later device action.
The attempt used one connection, transfer and execution and received validated
D00-D02 frames before remote EOF. No retry or reconnect occurred. All device,
transfer, execution and result-receive authorization fields were reset to
`false`; the artifact is no longer transfer- or execution-eligible.
@@ -0,0 +1,24 @@
# Phase 1.0F device-test template — inactive
This is a non-authorizing review template for the offline Phase-1.0F artifact.
It is not permission to connect, transfer, receive results or execute.
```text
artifact=retroarch_ps5_interval_diag.elf
size=1845152
sha256=e8bfc01c61bfb14b5814280a6e5442f1a5ad05ace5439d1c09e7e5ee00cd0055
firmware=9.60
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
result_receive_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
```
Any future authorization must be a new explicit statement in the active task,
repeat the exact name, size and SHA-256, set the intended actions explicitly,
and bound connection, transfer, execution, reception and observation counts.
No authority carries from RUN A, RUN B or RUN C.
@@ -0,0 +1,34 @@
# Phase 1.0G one-shot approval template — inactive
This is a review checklist, not an authorization. The tracked JSON template is
intentionally inactive and must never be edited into a reusable project-wide
permission.
Current values:
```text
authorized=false
consumed=false
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
result_receive_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
protocol_activation_authorized=false
run_id=null
target=null
port=null
```
A future approval, if Jens chooses to issue one, must name the exact artifact
name, size and SHA-256; firmware; one target; protocol `CHD10F01`; timeout;
unique run identifier; result reception; and one connection, transfer,
execution and receive. It must separately keep installation, autoload, device
write, retry, reconnect, resume and automatic reboot false.
The active record must stay outside tracked repository paths, carry an exact
approval reference, and be reviewed together with the active execution
manifest. No prior RUN A, B or C permission carries forward.
@@ -0,0 +1,23 @@
# Phase 1.0H device-test template — inactive
This non-authorizing template identifies the offline Phase-1.0H artifact. It
is not permission to connect, transfer, receive results or execute.
```text
artifact=retroarch_ps5_startup_args_diag.elf
size=1845152
sha256=822f2cf1f4d33a514d2bdd88fde40ad580dda5d85f537362ef6dff2eafcb56b6
firmware=9.60
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
result_receive_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
```
Any possible device test requires a new active-task statement naming this
exact artifact, size and hash and separately bounding connection, transfer,
execution, receive and observation. This template grants nothing.
@@ -0,0 +1,38 @@
# Phase 1.0K one-shot approval template — inactive
This is a review checklist, not authorization. Its tracked JSON companion is
permanently inactive and contains no device address, port or run ID.
Current state:
```text
authorized=false
consumed=false
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
result_receive_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
protocol_activation_authorized=false
run_id=null
target=null
port=null
```
Any later approval must be newly issued by Jens and bind exactly:
- `retroarch_ps5_write_diag.elf`;
- size `1845208`;
- SHA-256 `6ff0f7ea391da5f15ea43512a871078133e896a6900ae9f8f3fa75711abb8009`;
- firmware `9.60`;
- protocol `CHD10J01`, version 1, 64-byte frames;
- one explicit target, port, timeout and unique run ID;
- exactly one connection, transfer, execution and result reception.
It must keep installation, autoload, device write, retry, reconnect, resume and
automatic reboot false. The active approval must remain outside tracked
repository paths and agree byte-for-byte with a separately reviewed active
manifest. This template grants nothing and prior permissions do not carry.
@@ -0,0 +1,39 @@
# Phase 1.0N one-shot approval template — inactive
This is a review checklist, not authorization. Its tracked JSON companion is
permanently inactive and contains no device address, port or run ID.
Current state:
```text
authorized=false
consumed=false
ps5_connection_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
result_receive_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
protocol_activation_authorized=false
run_id=null
target=null
port=null
```
Any later approval must be newly issued by Jens and bind exactly:
- `retroarch_ps5_write_diag.elf`;
- size `1845208`;
- SHA-256 `c99a0856309a357ad2667d89b4924e4063ad214cae09c8a419457b0732f583cd`;
- firmware `9.60`;
- protocol `CHD10J01`, version 1, 64-byte frames;
- scope `EXACT_ONE_SHOT_PHASE_1_0N`;
- one explicit target, port, timeout and unique run ID;
- exactly one connection, transfer, execution and result reception.
It must keep installation, autoload, device write, retry, reconnect, resume and
automatic reboot false. The approval must remain outside tracked repository
paths and agree with a separately reviewed active manifest. This template
grants nothing; consumed Phase-1.0K and all earlier permissions do not carry.
@@ -0,0 +1,32 @@
# Phase 1.0T shsrv metadata collection approval
Status: `INACTIVE_TEMPLATE`
This document is deliberately unapproved. It is not a command list, device
client, or permission to connect.
```text
attested=false
active=false
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
process_side_effects_accepted=false
automatic_serial_query_accepted=false
automatic_telemetry_query_accepted=false
serial_redaction_contract_accepted=false
automatic_retry=false
reconnect_authorized=false
target_address=null
listener_already_running_attested=false
window=null
exact_literal_path=null
commands=[]
expires_at=null
```
Any future approval must name exactly one window, one connection, the exact
commands, a short deadline, and whether the unavoidable spawned shell and
automatic serial/telemetry reads are accepted. Acceptance does not authorize
hbldr, target staging, file writes, app termination, remount, execution,
autoload, retry or any other device action.
@@ -0,0 +1,35 @@
# Phase 1.0V shsrv collector approval
Status: `INACTIVE_TEMPLATE`
This template grants no authority and cannot activate the offline model.
```text
attested=false
active=false
collector_source_sha256=null
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
automatic_serial_query_accepted=false
automatic_telemetry_query_accepted=false
spawned_shell_effects_accepted=false
sanitized_output_only_accepted=false
physical_memory_erasure_unproven_accepted=false
automatic_retry=false
reconnect_authorized=false
target_address=null
target_port=null
listener_already_running_attested=false
window=null
exact_literal_path=null
commands=[]
deadline_seconds=null
run_id=null
expires_at=null
```
Any future live collector requires a new phase because Phase 1.0V contains no
network transport. Filling this template does not add one and does not
authorize hbldr, file content reads, writes, execution, transfer, installation,
autoload, path discovery, retry or reconnect.
+43
View File
@@ -0,0 +1,43 @@
# Phase 1.0W shsrv client approval
Status: `INACTIVE_TEMPLATE`
There is no live client in Phase 1.0W. This template cannot activate the
policy model or create network capability.
```text
attested=false
active=false
policy_sha256=null
collector_sha256=null
run_id=null
target_address=null
target_port=null
window=null
exact_literal_path=null
commands=[]
deadline_seconds=null
expires_at=null
listener_already_running_attested=false
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
spawned_shell_effects_accepted=false
automatic_serial_query_accepted=false
automatic_telemetry_query_accepted=false
sanitized_output_only_accepted=false
physical_memory_erasure_unproven_accepted=false
target_build_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
reconnect_authorized=false
resume_authorized=false
fallback_authorized=false
```
A later phase must create and audit a separate inactive transport before any
approval can be considered. No field in this template authorizes a connection.
@@ -0,0 +1,47 @@
# Phase 1.0X inactive transport approval
Status: `INACTIVE_TEMPLATE`
Phase 1.0X has no live network adapter. This record is deliberately inert and
cannot authorize or activate a connection.
```text
attested=false
active=false
policy_sha256=null
collector_sha256=null
transport_sha256=null
run_id=null
target_address=null
target_port=null
window=null
exact_literal_path=null
commands=[]
deadline_seconds=null
expires_at=null
listener_already_running_attested=false
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
spawned_shell_effects_accepted=false
automatic_serial_query_accepted=false
automatic_telemetry_query_accepted=false
sanitized_output_only_accepted=false
physical_memory_erasure_unproven_accepted=false
directory_entry_durability_unproven_accepted=false
blocking_call_preemption_unproven_accepted=false
target_build_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
reconnect_authorized=false
resume_authorized=false
fallback_authorized=false
```
No value may be filled under Phase 1.0X. A later phase must first prove exact
prompt/Telnet framing and implement an independently reviewed inactive network
adapter. That work still would not inherit authority from this template.
@@ -0,0 +1,33 @@
# Phase 1.0Y shsrv framing approval
Status: `INACTIVE_TEMPLATE`
This phase is source audit and synthetic modeling only. It contains no live
transport to activate.
```text
attested=false
active=false
framing_model_sha256=null
source_family=null
run_id=null
target_address=null
target_port=null
commands=[]
ps5_connection_authorized=false
device_request_authorized=false
result_receive_authorized=false
target_build_authorized=false
device_transfer_authorized=false
device_execution_authorized=false
installation_authorized=false
autoload_authorized=false
device_write_authorized=false
automatic_retry=false
reconnect_authorized=false
resume_authorized=false
fallback_authorized=false
```
No field may be filled under Phase 1.0Y. Official-source framing is not proof
of the deployed shsrv family, live prompt boundaries or firmware behavior.
@@ -0,0 +1,27 @@
# Phase 1.0Z passive-batch approval record
This tracked record is deliberately inactive. It is not permission to connect,
send, receive or execute anything.
- `active=false`
- `attested=false`
- `run_id=null`
- `target_address=null`
- `target_port=null`
- `window=null`
- `exact_literal_path=null`
- `ps5_connection_authorized=false`
- `device_request_authorized=false`
- `result_receive_authorized=false`
- `target_build_authorized=false`
- `device_transfer_authorized=false`
- `device_execution_authorized=false`
- `installation_authorized=false`
- `autoload_authorized=false`
- `device_write_authorized=false`
- `automatic_retry=false`
- `reconnect_authorized=false`
- `resume_authorized=false`
Any later action requires a new exact artifact/session-specific approval and a
separate reviewed live-adapter phase. Nothing in this template activates one.
@@ -0,0 +1,39 @@
# Phase-0.7 installation authorization packet
Status: **NOT AUTHORIZED**. This file prepares a later installation request;
it grants no authority and contains no transfer or execution command.
## Hash-bound installation set
- elfldr:
`63e810982471eb40cae3a20aa9df9a0a02892f420e429874fae4e99aa400b561`
(397000 bytes)
- controlled Payload Manager:
`8fecf8241a46246eddbd21e8bb4d875f5d76f1f4f4c6a11384df1f131aa5e5b1`
(99560 bytes)
- lifecycle probe:
`bfb4a5cc768e162fe4c2fddf41c3978e152722918a39085277fd172cb95a7182`
(112680 bytes)
- firmware: exact `9.60`
- automatic retry: `false`
- lifecycle timeout: `2000 ms`
The permanent blocked hash
`4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63`
is excluded and must still be rejected.
## Exact later permission sentence
> Ik geef toestemming om uitsluitend op mijn PS5 met exact firmware 9.60 de
> geharde elfldr met SHA-256
> 63e810982471eb40cae3a20aa9df9a0a02892f420e429874fae4e99aa400b561
> en de controlled Payload Manager met SHA-256
> 8fecf8241a46246eddbd21e8bb4d875f5d76f1f4f4c6a11384df1f131aa5e5b1
> éénmalig te installeren, nadat de bestaande bestanden hashgebonden zijn
> geback-upt. Deze toestemming omvat geen overdracht of uitvoering van de
> lifecycle-probe en geen automatische start.
After that separate installation is verified, a second, artifact-specific
authorization would still be required to transfer and execute the lifecycle
probe. Installation permission must not be interpreted as execution
permission.
@@ -0,0 +1,41 @@
# Phase-0.7 lifecycle transfer and one-time execution request
Status: **NOT AUTHORIZED**. Do not use this request until the hardened elfldr
and controlled Payload Manager have been separately authorized, installed,
hash-verified on-device, and recorded in a new active task.
## Exact later execution subject
- lifecycle probe SHA-256:
`bfb4a5cc768e162fe4c2fddf41c3978e152722918a39085277fd172cb95a7182`
- size: 112680 bytes
- artifact ID: `chimera-gfx-lifecycle-phase07-fw960-v1`
- firmware: exact `9.60`
- maximum runtime: 2000 ms
- automatic retry: `false`
- requested action count: one transfer and one execution
## Preconditions
- on-device hardened elfldr hash equals
`63e810982471eb40cae3a20aa9df9a0a02892f420e429874fae4e99aa400b561`;
- on-device controlled Payload Manager hash equals
`8fecf8241a46246eddbd21e8bb4d875f5d76f1f4f4c6a11384df1f131aa5e5b1`;
- the original installed components have hash-bound backups;
- the permanent blocked hash is rejected by both installed consumers;
- the static policy gate is rerun against the exact transferred bytes;
- no autoload or automatic retry is enabled.
## Exact later permission sentence
> Ik geef toestemming om uitsluitend op mijn PS5 met exact firmware 9.60 de
> lifecycle-probe met SHA-256
> bfb4a5cc768e162fe4c2fddf41c3978e152722918a39085277fd172cb95a7182,
> 112680 bytes en artifact-ID
> chimera-gfx-lifecycle-phase07-fw960-v1 eenmalig over te dragen en eenmaal uit
> te voeren via de reeds geinstalleerde en exact geverifieerde geharde runtime,
> met een harde limiet van 2000 ms, zonder retry, autoload, VideoOut, GNM, SDL
> of netwerkgebruik door de probe.
This text is a future request template only. Its presence in the repository is
not approval.
@@ -0,0 +1,94 @@
# Firmware 9.60 probe transfer and one-time execution package
Status: **BLOCKED — do not transfer and do not execute**.
This is the separate review package requested after the offline build. It is
not an authorization request because the current artifact cannot satisfy the
project's no-kernel-change boundary.
## Bound artifact
- Filename:
`chimera-gfx-capability-probe-0.1.0-fw-9.60-offline-audit-only.elf`
- SHA-256:
`4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63`
- Size: 110424 bytes
- Source commit: `ba8f6a40cf37dff628254caa9b11d83a73957cf8`
- Firmware build gate: exact `9.60`
- Manifest: `manifests/artifacts/chimera-gfx-capability-probe-0.1.0-fw-9.60.json`
- Offline evidence: `docs/evidence/probe-9.60-offline-2026-07-17.md`
- Transfer / execution recorded: false / false
- Execution eligible: false
- Permanent denylist: `manifests/artifact-denylist.json`
## Intended one-time project action
If a future replacement artifact closes every blocker, the first action would
be a single manual, foreground capability probe with application arguments:
```text
--firmware 9.60 --acknowledge-read-only-probe
```
Project code would open the candidate GNM module, perform exactly 21 `dlsym`
lookups, log names plus booleans, call none of the returned addresses, and
attempt `dlclose`. It would request no VideoOut, framebuffer, GNM command,
draw, dispatch, submit, flip, GPU-memory mutation, MMIO, or register operation.
There would be no retry or automatic boot path.
## APIs and side effects under review
Project path: `strcmp`, `chimera_gfx_firmware_gate_allows`,
`chimera_gfx_ps5_make_loader_ops`, `chimera_gfx_ps5_probe_symbols`, `dlopen`,
`open_module`, `dlerror`, `resolve_symbol`, `dlsym`, `log_line`, `snprintf`,
`write_log`, `fprintf`/`fwrite`, `close_module`, `dlclose`, and
`chimera_gfx_status_string`.
Pinned SDK transitive path includes `__patch_init`, kernel credential and
syscall-permission writes, rtld initialization, possible
`sceKernelLoadStartModule` calls, SDK kernel reads while inspecting module
metadata, and possible `sceKernelStopUnloadModule` during cleanup. The complete
audited path is in the evidence document.
## Blocking findings
1. SDK v0.41 performs kernel process-state writes before `main`. The firmware
gate cannot prevent them.
2. No bounded/cancellable loader API or safe external supervisor has been
proven. A hang can prevent cleanup.
3. Module start/stop internals on firmware 9.60 are unknown.
4. The gate trusts a supplied string and does not attest firmware.
5. Runtime delivery of the required four arguments has not been observed.
Likely failure outcomes range from a clean refusal or loader error to a payload
crash, persistent loaded-module/process state, or a console restart. GPU/display
effects are not requested, but driver-internal effects cannot be ruled out.
## Timeout, cleanup, and recovery status
No safe timeout or forced-cancellation procedure exists for this artifact.
Normal cleanup attempts `dlclose`; crash/hang cleanup and CRT kernel-state
restoration are not guaranteed. Therefore no transfer, launch, kill, retry, or
recovery procedure is approved.
## Approval checklist
- [x] Offline artifact hash and source commit recorded
- [x] Full imports and call chain audited
- [x] VideoOut/Phase-1 excluded from the build
- [ ] Public, kernelwrite-free startup/loader path proven
- [ ] Replacement artifact built and newly hashed
- [ ] Firmware attestation and argument delivery proven
- [ ] Bounded timeout and cleanup/recovery proven
- [ ] New artifact-specific transfer approval
- [ ] New artifact-specific one-time execution approval
## Permission text
There is deliberately **no valid permission text for this hash**. Generic or
future approval must not be interpreted as authorization for it. After the
blockers are closed, a newly named and newly hashed replacement needs a new
package and an exact permission sentence that names that replacement hash.
ADR-0009 makes this hash permanently ineligible; closing future startup
blockers cannot rehabilitate these bytes.
@@ -0,0 +1,54 @@
# External evidence integrity check — 2026-07-29
## Decision
`EXTERNAL_EVIDENCE_WORKSPACE_NOT_REPRODUCIBLE`
This is a host-only integrity record. No PS5, network, transfer, target build,
installation, execution, result reception, autoload, or device write was used.
Every authorization remains false and automatic retry remains false.
## Findings
The standalone tracked-input suite passes, but the currently available sibling
workspace cannot reproduce every historical cross-repository validator:
- Phase-0.9B and Phase-0.9C source digests do not match several committed
blobs at the commits named by their historical manifests;
- the expected historical bytes are not present in any local commit of the
affected sibling repositories;
- Phase-1.0L and Phase-1.0M require ignored sibling audit documents that are
absent from the current RetroArch checkout;
- Phase-1.0P and Phase-1.0R bind older RetroArch revisions and Phase-1.0R also
requires ignored Phase-1.0M ELF/map evidence that is absent;
- a single sibling worktree cannot simultaneously represent all historical
revisions.
Worktree CRLF conversion is a separate source of false mismatches on Windows.
The historical validators and their checksum inventories are immutable and
were not rewritten. A future source-evidence contract should bind committed
Git blobs or explicitly normalized text, but that change must use a new schema
and record rather than altering the historical evidence package. Comparison
against committed blobs confirmed that several remaining mismatches are
genuine evidence-availability failures, not line-ending conversion.
## Test boundary
The default CTest suite uses tracked files only. Historical validators needing
sibling repositories, upstream trees, or ignored artifacts are registered only
with `CHIMERA_GFX_REGISTER_EXTERNAL_EVIDENCE_VALIDATORS=ON` and must be run one
at a time against the exact phase-specific workspace described in
`TEST_PLAN.md`.
Unregistered does not mean passed. Missing or mismatched external evidence
remains fail-closed and cannot support a compatibility, hardware-safety,
execution, cleanup, or recovery claim. The historical records are preserved;
their missing bytes are not reconstructed or replaced by current source.
## Recovery requirement
To re-establish a historical external validation, supply the original exact
ignored evidence and source bytes, verify their SHA-256 values independently,
and bind them to a clean phase-specific checkout. If those bytes cannot be
recovered, the affected source-binding claim remains unavailable permanently;
no manifest hash may be rewritten merely to make a validator pass.
+41
View File
@@ -0,0 +1,41 @@
# Phase-0 build evidence — 2026-07-16
This record captures local compile evidence only. No PS5 connection, transfer,
or execution occurred.
## Inputs
- source workspace: standalone `chimera-gfx`
- PS5 Payload SDK: v0.41 / commit `d2e2e585740362976a39fdd5ccf390f199a7bc37`
- SDK ZIP SHA-256:
`ebfb0acb5260511951a80e17db41650c62d20a8caf8659a230b928dc85005984`
- host compiler: MSVC 19.42.34436.0
- cross compiler: Ubuntu clang 18.1.8 (`20ubuntu8`)
- CMake: host 3.29.5-msvc4; cross 4.2.3
- Ninja: 1.13.2
## Host result
The Debug host library and test executables compiled with warnings as errors.
Clang-tidy completed during the WSL/Clang build. All 7 unit, manifest,
generated-file, safety, secret, and format checks passed.
## PS5 compile result
`chimera-gfx-capability-probe.elf` compiled as a 64-bit x86-64 PIE using the
public SDK toolchain, with `CHIMERA_GFX_PS5_ALLOWED_FIRMWARE=NONE` and warnings
as errors. Initial artifact SHA-256 before the final source split was
`618eadc14975eb3f20942ee2228007b2457c0f6c1b0e4daa72d17ae9feb64c5c`.
After splitting unused host allocation code out of the linked probe surface and
performing the final rebuild, the artifact SHA-256 is
`bc09865f6d26ba4fa86a5167b99841ad3ebee3629421a2cb4bae678bde63227f`.
Read-only symbol inspection found:
- GNM imports: 0
- VideoOut imports: 0
- loader entry points present: `dlopen`, `dlsym`, `dlclose`
- undefined allocation imports (`calloc`, `free`): 0
- representative GNM names present only as embedded lookup strings
This evidence does not claim runtime compatibility with any firmware.
+76
View File
@@ -0,0 +1,76 @@
# Phase-0 and offline Phase-1 build evidence
- Date: 2026-07-17
- Source commit: `72292f2d5788ad643e9d1816ce28ab754ef739b5`
- Branch: `main`
- Firmware gate: `NONE`
- Hardware transfer/execution: **not performed**
The source tree was clean when the two artifacts below were rebuilt. Generated
build directories and ELFs are ignored; only their machine-readable manifests
are tracked.
## Host verification
| Environment | Result |
|---|---|
| Windows, Visual Studio 2022 x64 Debug | 11/11 CTest tests passed |
| Windows, Visual Studio 2022 x64 Release | 11/11 CTest tests passed |
| WSL, Clang 18.1.8, clang-tidy 18, warnings as errors | 12/12 CTest tests passed |
| WSL, GCC 15.2.0, ASan + UBSan | 12/12 CTest tests passed |
| Installed core library consumer | compiled and exited 0 |
| Installed RetroArch/SDL2 scaffold consumer | compiled and exited 0 |
The tests include API/error/lifecycle validation, cross-context ownership,
resource limits, deterministic mock upload/present state, adapter refusal,
firmware-gate negative cases, symbol-manifest generation, artifact-manifest
tamper rejection, format, safety policy, and secret scanning.
The Clang ASan/UBSan variant was attempted but could not link because this WSL
installation lacks Clang 18's `compiler-rt` ASan archives. That attempt is not
counted as a passed test. The available GCC sanitizer runtime completed the
same 12-test suite successfully.
Docker was not installed in the local environment, so the pinned Dockerfile
was reviewed but not built. Its host and Phase-0 cross-build commands were run
directly with the same pinned compiler/SDK inputs. No Gitea job is claimed as
passed merely from being queued.
## Cross-build verification
The clean PS5 compile used:
- PS5 Payload SDK `v0.41`, commit
`d2e2e585740362976a39fdd5ccf390f199a7bc37`;
- PS5 SDL2 commit `0baf4ac49382b537ba449901b5b6d0d189bb1fbb`;
- the single reviewed keyboard/IME-removal overlay;
- SDL2main, audio, joystick, haptic, sensor, power, file, filesystem, locale,
misc, OpenGL, LoadSO, render, Vulkan, dummy/offscreen video, and HIDAPI
disabled for the Phase-1 candidate;
- warnings as errors and firmware identifier `NONE`.
All core, adapter, firmware-gate, probe, and disabled Phase-1 targets compiled
and linked. Static `prospero-nm` inspection then passed the strict import audit.
| Artifact | Size | SHA-256 | Static result |
|---|---:|---|---|
| `chimera-gfx-capability-probe.elf` | 110424 | `f0f74978ac62490ff2482386e9c4efa3ad6d6cc46e10d54c41cb8669b4449f36` | 0 direct Sce imports; 0 GNM imports |
| `chimera-gfx-phase1-videoout-clear.elf` | 1566368 | `2e826ac4ea2bffb626d82e370f98909bb508417d92b1ac3796e9f5a902e975c9` | exact reviewed 15-name Sce set; 0 GNM/keyboard/IME/UserService imports |
The 15 Phase-1 imports are six direct-memory/equeue functions, one
SystemService function, and eight VideoOut functions listed in
`docs/phase1/VIDEOOUT_CLEAR_EXPERIMENT.md`.
`llvm-objdump-18` confirmed the retained control-flow order in the Phase-1
`main`: firmware gate at offset `0x78`, `SDL_SetMainReady` at `0xa9`,
`SDL_Init` at `0xb4`, and the sole `SDL_UpdateWindowSurface` at `0x1fc`. The
probe likewise reaches its firmware gate before loader construction and probe
logic. With embedded identifier `NONE`, both return before the later calls.
The corresponding tracked manifests are:
- `manifests/artifacts/chimera-gfx-capability-probe-0.1.0-none.json`;
- `manifests/artifacts/chimera-gfx-phase1-videoout-clear-0.1.0-none.json`.
Both manifests verify against the local bytes and state `authorized: false`,
`transferred: false`, and `executed: false`.
@@ -0,0 +1,67 @@
# Phase 0.5 startup offline evidence — 2026-07-17
## Outcome
Decision: **BLOCKED**. The stock SDK v0.41 startup is `UNSAFE`, and the exact
loader caller needed to prove safe return from a replacement is absent. No
custom `_start` source and no PS5 ELF were created.
No PS5 connection, transfer, execution, VideoOut open, module load, network
initialization, GNM operation, framebuffer mutation, credential change,
syscall-bound change, MMIO access, or firmware change occurred.
## Offline startup audit
`tools/audit_ps5_startup_feasibility.py` was run twice independently against
the pinned SDK source and install. Both JSON outputs were byte-identical:
- startup audit SHA-256:
`d0e8202c1a07e4104476cadf6c14a1dea2d724b1d97495dddcdf05858f6c8d4a`;
- 12 transitive stock CRT sources enumerated;
- six other CRT-named installed files confirmed as empty archives;
- 31 functions and 182 call/tail-call edges reachable from stock `_start`;
- reachable prohibited set: `__patch_init`, `kernel_copyin`, `kernel_copyout`,
`kernel_set_ucred_caps`, and `kernel_set_ucred_attrs`;
- compiler `-###` trace confirmed that `-nostartfiles -nodefaultlibs` adds no
stock CRT or default library and produced no ELF;
- non-SDK local loader-contract hits: zero.
## Policy verification
The real legacy artifact, its updated manifest, and the permanent denylist were
evaluated together. The policy tool returned exit 2 with both
`ARTIFACT_PERMANENTLY_DENYLISTED` and
`MANIFEST_EXECUTION_INELIGIBLE`.
JSON Schema validation passed for all three tracked artifact manifests and the
permanent denylist.
## Host and static tests
- Windows MSVC warnings-as-errors build: passed.
- Windows CTest: 14/14 passed.
- WSL Clang 18 plus clang-tidy build: passed.
- WSL Clang CTest including formatting: 15/15 passed.
- WSL GCC 15 ASan+UBSan build: passed.
- WSL GCC ASan+UBSan CTest: 15/15 passed.
- Python syntax compilation for every changed tool/test: passed.
- `git diff --check`: passed at review time.
An initial Clang ASan configure did not compile a project source because the
local Clang install lacks `libclang_rt.asan*`. GCC's available ASan/UBSan
runtime was used successfully instead. The failed configure is an environment
toolchain limitation and was not reported as a passed test.
## Bound hashes
| Record | SHA-256 |
|---|---|
| permanent denylist | `e9603b0e3792781ad5b511afb22ef61e3d4fd4c5a16bf928f8609193bcd97783` |
| denylist schema | `78d0d28da552550e4b7dabc5b9c25347fb2618c4664b7a554b87c6de69cd6c96` |
| startup audit JSON | `d0e8202c1a07e4104476cadf6c14a1dea2d724b1d97495dddcdf05858f6c8d4a` |
| non-build decision | `b04dd224c00af0c7228c582f6ba3ca55ef03e9453287f233a0c4ff2e545092fc` |
| machine proof matrix | `aefd1d1e663be617ed1042c6a1d68b9f21dd0c137f0c601d15cdcbfdf03dadb7` |
| permanently blocked legacy ELF | `4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63` |
The last hash names pre-existing bytes only. It is not a Phase-0.5 artifact and
must not be transferred or executed.
@@ -0,0 +1,61 @@
# Phase-0.7 offline build evidence — 2026-07-17
- Public SDK: v0.41,
`d2e2e585740362976a39fdd5ccf390f199a7bc37`
- Firmware build gate: exact `9.60`
- Host validation: MSVC 19.50 `/W4 /WX`; Clang 18
warnings-as-errors/clang-tidy/format; GCC 15 ASan/UBSan
- Fuzz fallback: 100,000 deterministic ASan/UBSan inputs for both controlled
header and verified metadata
- Cross-build: all three targets with warnings-as-errors
- Reproducibility: two clean byte-identical builds per ELF
- Console actions: none
The complete machine evidence is
`manifests/runtime/phase-0.7-offline-audit.json`. Full ignored reports and
artifacts are packaged below `outputs/phase07/`.
## Exact outputs
| Artifact | SHA-256 | Size | Undefined imports | `DT_NEEDED` |
|---|---|---:|---|---|
| hardened elfldr | `63e810982471eb40cae3a20aa9df9a0a02892f420e429874fae4e99aa400b561` | 397000 | none | `libSceLibcInternal.sprx`, `libSceNet.sprx`, `libkernel_web.sprx` |
| controlled Payload Manager | `8fecf8241a46246eddbd21e8bb4d875f5d76f1f4f4c6a11384df1f131aa5e5b1` | 99560 | none | `libSceLibcInternal.sprx`, `libSceNet.sprx`, `libkernel_web.sprx` |
| lifecycle probe | `bfb4a5cc768e162fe4c2fddf41c3978e152722918a39085277fd172cb95a7182` | 112680 | `_exit`, `sceKernelSendNotificationRequest` | `libSceLibcInternal.sprx`, `libkernel_web.sprx` |
The lifecycle project's called functions are exactly one
`sceKernelSendNotificationRequest` followed by `_exit`. The normal SDK startup
is statically included and reaches `__patch_init` before `main`; that fact is
proven from source, linker map, disassembly, and the 499-edge lifecycle
callgraph rather than inferred from imports. The hardened loader audit records
1032 call edges and the controlled manager records 478.
The lifecycle linker map also contains stock-SDK `__dlopen`, `__dlsym`,
`sceKernelLoadStartModule`, and `sceKernelStopUnloadModule` symbols. Direct
static reachability proves the rtld initialization path but cannot resolve all
116 indirect lifecycle edges. The audit therefore records linked symbols,
direct `_start` reachability where symbolization permits it, and every
unresolved indirect edge separately. No graphics/display-sensitive symbol is
linked in any of the three audited ELFs.
## Final offline tests
- Chimera GFX Windows host build: MSVC `/W4 /WX`, 16/16 CTest passed.
- Hardened elfldr: MSVC 1/1; Clang 18 plus clang-tidy 1/1; GCC 15
ASan/UBSan 1/1; 100,000-input sanitizer fuzz pass.
- Controlled Payload Manager: MSVC 1/1; Clang 18 plus clang-tidy 2/2; GCC 15
ASan/UBSan 2/2; 100,000-input sanitizer fuzz pass.
- All three PS5 cross-builds passed warnings-as-errors and reproduced the
exact hashes and sizes above.
- Negative lifecycle firmware `9.50` configure failed before creating a build
graph.
- Controlled-manager build without exact hash/size/artifact ID failed.
- Static execution-policy refusal suite, manifest schemas, Phase-0.5/0.6
historical gates, Phase-0.7 proof matrix, safety audit, and secret scans
passed.
The local Clang installation does not contain the optional
`libclang_rt.asan`/libFuzzer runtime archives. Clang warnings and clang-tidy
therefore run without sanitizers; GCC supplies the ASan/UBSan and deterministic
fuzz coverage. This is a host-tool packaging limitation, not a target
compiler, linker, or ABI blocker.
@@ -0,0 +1,147 @@
# Firmware 9.60 capability-probe offline evidence
Date: 2026-07-17. No PS5 connection, transfer, deployment, or execution was
performed.
## Artifact identity
| Field | Value |
|---|---|
| Artifact | `chimera-gfx-capability-probe-0.1.0-fw-9.60-offline-audit-only.elf` |
| Size | 110424 bytes |
| SHA-256 | `4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63` |
| Source commit | `ba8f6a40cf37dff628254caa9b11d83a73957cf8` |
| SDK | PS5 Payload SDK v0.41, commit `d2e2e585740362976a39fdd5ccf390f199a7bc37` |
| Build type | Release, C11, warnings as errors |
| Phase-1 VideoOut | explicitly `OFF`; target not built or linked |
| Transfer / execution | false / false |
| Execution eligibility | **false** |
Two clean builds around an audit-tool-only commit produced the same size and
SHA-256. The tracked manifest is
`manifests/artifacts/chimera-gfx-capability-probe-0.1.0-fw-9.60.json`.
## Firmware gate
The checked-in discovery allowlist is exactly `["9.60"]`; CMake still defaults
to `NONE`. Configure rejects `9.61`. The Phase-1 target rejects `9.60` and every
other non-`NONE` value.
The ELF embeds `9.60` and requires exactly these application arguments:
```text
--firmware 9.60 --acknowledge-read-only-probe
```
Disassembly places `chimera_gfx_firmware_gate_allows` at `main+0x7f`, before
`chimera_gfx_ps5_make_loader_ops` at `main+0xa5` and the probe call at
`main+0xb2`. This is only a comparison against an operator-supplied string; it
does not independently attest the console firmware. SDK startup occurs before
`main` and therefore before this gate.
## Complete dynamic import inventory
Undefined symbols (`prospero-nm -u`), exact set:
- `__stderrp`
- `__stdoutp`
- `fprintf`
- `fwrite`
- `snprintf`
- `strcmp`
`DT_NEEDED` modules (`llvm-readelf-18 --dynamic-table`), exact set:
- `libkernel_web.sprx`
- `libSceLibcInternal.sprx`
- `libSceNet.sprx`
There are zero direct `sce*`, GNM, VideoOut, SDL, draw, dispatch, submit, or
flip imports. `libSceVideoOut.sprx` text is present only because the SDK rtld
statically includes a general sysmodule-name table; there is no corresponding
import or call. `INIT_ARRAYSZ` and `FINI_ARRAYSZ` are both zero.
## Project-requested functions
Before the firmware gate, project `main` uses only argument checks, `strcmp`,
and a refusal log on error. After the gate, the complete project path is:
1. `chimera_gfx_ps5_make_loader_ops`;
2. `chimera_gfx_ps5_probe_symbols`;
3. internal `log_line`/`write_log` callbacks for boolean JSON events;
4. loader callback `open_module`, which calls
`dlopen("libSceGnmDriver.sprx", RTLD_LAZY | RTLD_LOCAL)`;
5. loader callback `resolve_symbol` 21 times; it calls `dlerror`, `dlsym`, then
`dlerror`; every returned address is reduced to a boolean and discarded;
6. `snprintf` plus `fprintf`/compiler-selected `fwrite` for boolean JSON lines;
7. loader callback `close_module`, which calls `dlclose`;
8. `chimera_gfx_status_string` and a final summary log.
No resolved GNM pointer is cast to a callable type or invoked. The 21 exact
names are machine-checked against `manifests/ps5_gnm_symbols.json`.
## SDK startup and loader side effects
Pinned-source review plus disassembly proves this pre-`main` success path:
1. `_start` clears payload BSS.
2. `__crt_syscall_init`, `__kernel_init`, and `__klog_init` initialize SDK
state from loader-supplied arguments.
3. libc `__isthreaded` is set to one.
4. `__patch_init` reads current process credentials, calls
`kernel_set_ucred_caps` and `kernel_set_ucred_attrs`, and performs two
`kernel_copyin` writes that change the process syscall-address bounds.
5. `__rtld_init` initializes SPRX/SO/payload/dlfcn support and may call
`sceKernelLoadStartModule` for `libSceSysmodule.sprx` if it is absent.
6. payload dependencies are opened and relocations modify payload memory;
payload init/fini arrays themselves are empty.
After the project gate, SDK `dlopen` first checks loaded modules through SDK
kernel reads. If GNM is absent it can call `sceKernelLoadStartModule`. It then
uses `kernel_copyout` to copy module metadata, symbol tables, and string tables
into allocated user memory. The pinned SPRX-specific `init` callback is empty,
but the internal behavior of the system load/start call is unknown.
These facts mean the ELF is non-rendering at project level but is not globally
non-mutating. The pre-`main` kernel writes violate the project's userland-only
execution boundary.
## Cleanup audit
The bounded project loop attempts `dlclose` after all lookups and on lookup or
format failures. SDK `dlclose` calls rtld fini, close, and destroy. The pinned
SPRX `fini` callback is empty. If this open loaded the module, `sprx_close`
calls `sceKernelStopUnloadModule`, then frees copied tables and clears local
state.
Cleanup is not guaranteed:
- there is no documented cancellation or bounded timeout around loader calls;
- a crash or hang can bypass `dlclose`;
- a stop/unload failure can leave the module loaded while SDK bookkeeping is
destroyed;
- the CRT's credential/syscall-permission changes have no matching restoration
path in the pinned source;
- a `libSceSysmodule.sprx` load during rtld initialization has no observed
matching unload in this call chain.
## Offline verification results
- Windows MSVC Debug: 11/11 tests passed.
- WSL Clang 18 with clang-tidy and formatting: 12/12 tests passed.
- Strict artifact audit: six exact undefined symbols, three exact
`DT_NEEDED` modules, empty init/fini arrays, all 21 manifest names, zero
direct Sce/GNM imports.
- SDK runtime source audit: passed and concluded execution eligibility false.
- Negative configure tests: firmware `9.61` rejected; Phase-1 with `9.60`
rejected.
- Artifact-manifest digest/size verification: passed.
- Secret scan and `git diff --check`: passed.
## Remaining blockers
The exact system-module initialization effects, runtime argument delivery,
firmware attestation, loader timeout behavior, and partial-failure recovery are
unproven. More decisively, the SDK v0.41 CRT performs prohibited kernel writes
before the project firmware gate. This exact artifact must not be transferred
or executed.
+53
View File
@@ -0,0 +1,53 @@
# Hardware approval package
Status: **not authorized; offline review artifacts only**.
## Current offline review artifacts
| Artifact | Firmware | SHA-256 | Transfer/execution |
|---|---|---|---|
| `chimera-gfx-capability-probe.elf` | `NONE` | `f0f74978ac62490ff2482386e9c4efa3ad6d6cc46e10d54c41cb8669b4449f36` | false / false |
| `chimera-gfx-phase1-videoout-clear.elf` | `NONE` | `2e826ac4ea2bffb626d82e370f98909bb508417d92b1ac3796e9f5a902e975c9` | false / false |
| `chimera-gfx-capability-probe-0.1.0-fw-9.60-offline-audit-only.elf` | `9.60` | `4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63` | false / false; permanently denylisted |
The two `NONE` artifacts are tied to source commit
`72292f2d5788ad643e9d1816ce28ab754ef739b5`. The offline test and import
evidence is in `docs/evidence/phase0-build-2026-07-17.md`. These exact artifacts
cannot enter the project-requested GNM module open or SDL initialization because
their firmware gate is `NONE`. The SDK payload CRT still initializes before
`main`.
## First hardware gate
The first console action, if it ever becomes safe and receives new permission,
must be the non-rendering capability probe, not the VideoOut experiment.
Project code would call only `dlopen`, `dlsym`, `dlclose`, and standard output
functions. It would resolve the 21 manifest names, record only booleans, invoke
no resolved pointer, and request no submit, draw, dispatch, flip, or GPU-memory
operation.
Jens reported exact firmware `9.60` and authorized only its offline build and
audit. The pinned SDK v0.41 payload CRT performs prohibited kernel process-state
writes before `main`, so the resulting ELF is not execution-eligible even
though the project gate precedes `dlopen`. A kernelwrite-free startup route and
a newly built digest are required before execution can be considered.
## VideoOut gate after successful discovery
The later experiment would execute the exact SDL sequence and indirect API
inventory in `VIDEOOUT_CLEAR_EXPERIMENT.md`. Likely failures are a clean error,
payload crash, stuck payload, lost display ownership, or required controlled
console restart. Automatic retry is prohibited. The unbounded SDL flip wait is
an unresolved blocker even after symbol discovery.
## Authorization state
The 9.60 offline build authorization has been received. No transfer or execution
authorization has been received. No execution-permission wording is offered
while the SDK CRT blocker remains. The firmware-specific evidence and blocked
approval package must record the filename, SHA-256, exact source commit, all
imports, startup/loader/cleanup call chain, and offline tests. Approval never
carries forward to the VideoOut test.
The completed firmware-specific package is
`docs/approvals/probe-9.60-transfer-execution.md`.
+39
View File
@@ -0,0 +1,39 @@
# Firmware and ABI checklist
## Firmware identity
- [ ] Exact user-visible firmware identifier supplied by Jens
- [ ] Reproducible identification method documented without kernel access
- [ ] Identifier added to one candidate build only
- [ ] `FIRMWARE_COMPATIBILITY.md` row created as untested
- [ ] No compatibility inferred from another revision
## Discovery gate
- [ ] Capability-probe artifact manifest and SHA-256 reviewed
- [ ] Explicit artifact-specific execution permission recorded
- [ ] Probe resolves names only and invokes no resolved pointer
- [ ] Redacted result log archived
- [ ] Runtime module candidate confirmed or rejected for this firmware
## SDL/VideoOut evidence
- [x] SDL source commit pinned
- [x] Zlib license and overlay notice recorded
- [x] Project code uses public SDL2 APIs only
- [x] Keyboard/IME initialization removed from the staged build
- [x] Direct GNM imports forbidden
- [ ] Bounded flip-wait or safe supervisor proven
- [ ] Cleanup behavior observed on this exact firmware
## Artifact review
- [ ] Clean source commit matches manifest
- [ ] SDK and SDL commits match locks
- [ ] Firmware is not `NONE`
- [ ] ELF filename, size, and SHA-256 match
- [ ] Imports match the API inventory
- [ ] Offline host, static-analysis, cross-compile, and secret tests pass
- [ ] Transfer and execution remain false until separately approved
Any unchecked runtime item blocks execution.
+58
View File
@@ -0,0 +1,58 @@
# Phase-1 hardware test plan
## Preconditions
Every item must be complete before transfer:
- exact firmware is recorded and allowlisted for one artifact;
- the discovery-only capability probe has already completed on that firmware;
- source commit, SDK/SDL commits, artifact SHA-256, and static imports match the
reviewed manifest;
- the console has no unsaved work and automatic retry/boot integration is off;
- an operator and observer have the redacted JSON-stage log visible;
- the bounded-wait blocker below has an accepted resolution.
## Proposed timeline
1. Verify digest again immediately before transfer.
2. Transfer manually using an existing approved userland loader workflow.
3. Start once, manually. No boot hook or retry.
4. Require `firmware_gate`, `video_init`, `window_create`, `surface_acquire`,
and `cpu_fill` within five seconds total.
5. Permit exactly one `single_present` and a one-second hold.
6. Require `cleanup` and process exit within five seconds after present.
7. Preserve logs and mark the firmware row pass, fail, or anomalous.
## Watchdog and timeout
The application stages are bounded except the pinned SDL call
`SDL_UpdateWindowSurface`, whose backend waits for a flip event without a
publicly proven finite timeout. A cooperative application thread cannot safely
cancel it. Force-killing a thread while it owns VideoOut or direct-memory state
is prohibited.
Before authorization, one of these must be proven and separately reviewed:
1. a public, licensed SDL/VideoOut change that supplies a bounded wait and
returns control for cleanup; or
2. a userland process supervisor whose termination semantics guarantee OS
cleanup of VideoOut, equeue, and direct-memory ownership.
Until then, the operator wall-clock limit is a detection mechanism only, not a
safe watchdog, and the hardware test remains blocked.
## Cleanup, rollback, and emergency stop
Normal cleanup is `SDL_DestroyWindow` followed by `SDL_Quit`; the pinned
backend then closes VideoOut, releases direct memory, and deletes its equeue.
No second flip is attempted during cleanup.
On any error, missing stage, display anomaly, or deadline:
- do not retry;
- request normal userland process termination only if responsive;
- do not kill an individual worker thread;
- if display ownership does not return, use the console's normal controlled
restart procedure; never patch firmware, registers, clocks, or fans;
- after restart, use the existing SDL software path and mark the artifact and
firmware combination failed/unknown pending review.
+13
View File
@@ -0,0 +1,13 @@
# Offline Phase-1 preparation
No Phase-1 artifact has been transferred or executed. This directory contains
the review package for the first CPU-framebuffer/VideoOut experiment:
- `VIDEOOUT_CLEAR_EXPERIMENT.md`: exact design and API inventory;
- `HARDWARE_TEST_PLAN.md`: staging, timeout, cleanup, rollback, and stop rules;
- `FIRMWARE_ABI_CHECKLIST.md`: evidence that must be completed per firmware;
- `APPROVAL_PACKAGE.md`: artifact-specific authorization gate.
The compile target is off by default and the produced review artifact embeds
firmware `NONE`, so it refuses before `SDL_Init`. This preparation does not
authorize a hardware test.
+62
View File
@@ -0,0 +1,62 @@
# Minimal VideoOut clear-frame experiment
## Goal and non-goals
Display exactly one fixed 1920x1080 solid frame through the existing pinned
PS5 SDL2 CPU-framebuffer backend, hold it for one second, and cleanly release
SDL. This experiment does not use `libchimera-gfx` hardware contexts, GNM,
shaders, command buffers, compute, custom tiling code, input, audio, OpenGL,
OSMesa, or a render loop.
## Application sequence
Project code performs the following calls only after exact compile-time and
runtime firmware identifiers match and the literal acknowledgement is present:
1. `SDL_SetMainReady`
2. `SDL_Init(SDL_INIT_VIDEO)`
3. `SDL_CreateWindow`
4. `SDL_GetWindowSurface`
5. `SDL_MapRGBA`
6. `SDL_FillRect`
7. `SDL_UpdateWindowSurface` exactly once
8. `SDL_Delay(1000)`
9. `SDL_DestroyWindow`
10. `SDL_Quit`
The fixed color is RGBA `(0x18, 0x2a, 0x41, 0xff)`. Logs contain stage names
and booleans only.
## Indirect pinned-SDL behavior
At commit `0baf4ac49382b537ba449901b5b6d0d189bb1fbb`, the reviewed PS5 video
backend indirectly uses these public export names:
- initialization: `sceSystemServiceHideSplashScreen`, `sceVideoOutOpen`,
`sceKernelAllocateMainDirectMemory`, `sceKernelMapDirectMemory`,
`sceKernelCreateEqueue`, `sceVideoOutAddFlipEvent`,
`sceVideoOutSetFlipRate`, `sceVideoOutSetBufferAttribute2`, and
`sceVideoOutRegisterBuffers2`;
- single present: `sceVideoOutSubmitFlip` and `sceKernelWaitEqueue`;
- cleanup: `sceVideoOutDeleteFlipEvent`, `sceVideoOutClose`,
`sceKernelReleaseDirectMemory`, and `sceKernelDeleteEqueue`.
These are indirect implementation observations, not independently proven
`chimera-gfx` ABI declarations. The overlay removes keyboard and IME setup.
## Build boundary
`tools/build-phase1-videoout.sh` verifies both upstream commits, stages the
reviewed SDL overlay, disables SDL2main plus unrelated SDL subsystems, and
cross-compiles the probe and candidate. It then statically requires the exact
15-name Sce import inventory above and zero GNM, keyboard, IME, or UserService
imports. It contains no upload, run, host, port, or boot command. The default
firmware identifier is `NONE`.
## Known blocker
The pinned SDL backend waits inside `sceKernelWaitEqueue` with no publicly
proven bounded timeout in this call path. Project code cannot safely cancel
that wait. The artifact is suitable for offline inspection, but not yet for
hardware authorization until `HARDWARE_TEST_PLAN.md` records an accepted
supervisor/recovery mechanism and an exact firmware.
+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.

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