33 KiB
Safety and threat model
Non-negotiable boundary
This project uses only userland behavior and public, open-source information. It excludes kernel and hypervisor code, exploit development, DRM bypass, proprietary SDK material, leaked or decrypted headers/binaries, direct MMIO or register writes, clock/SMU/fan control, boost settings, and firmware patches.
No payload or ELF may be transferred to or executed on a PS5 without explicit approval from Jens in the active task. There is no boot-time or automatic execution path.
Documented temporary process/kernel runtime changes made by the exact public loader or SDK may be classified as expected volatile, restored by the loader, or payload-process-local. They are not automatically unsafe. Persistent writes and unbounded or unknown effects remain hard blockers.
Assets and adversaries
Protected assets include the console's stability, display availability, user data, network credentials, private repository credentials, and the accuracy of the project's compatibility claims.
Relevant failure or threat sources:
- an incorrect guessed ABI that corrupts stack or memory;
- a command submission that hangs the GPU or display path;
- unbounded waits or incomplete cleanup after partial initialization;
- symbol presence being mistaken for compatible semantics;
- firmware drift;
- malicious or compromised upstream artifacts;
- secrets entering logs, manifests, commits, or remote URLs;
- a build or CI target silently becoming a deployment path.
Phase-0 controls
| Risk | Control | Verification |
|---|---|---|
| ABI guess is called | No GNM declarations or calls; symbol addresses never escape | phase0_safety_audit test |
| GPU work is submitted | No submit/draw/dispatch/flip call sites | source allowlist audit |
| GPU memory changes | No GPU allocator, mapper, resource registration, or command buffer | source and build-graph audit |
| Probe runs accidentally | target disabled by default; runtime acknowledgement; firmware gate | CMake tests and code review |
| Unknown firmware runs | default is NONE; discovery build accepts only exact 9.60 |
unit test, CMake gate, compatibility file |
| Automatic deployment | no deploy/test/run target; output is compile artifact only | CMake audit |
| Supply-chain substitution | immutable upstream commit and release SHA-256 | lock manifest and bootstrap script |
| Secret disclosure | secret filename ignores, no credential scripts, boolean-only logs | repository scan before push |
| Adapter accidentally claims hardware | compiled queries report unavailable and reject hardware requests | adapter tests |
| Resource lifecycle leaks | context refuses destruction while child handles exist | mock integration tests |
| Phase-1 target enters normal build | separate option defaults off and requires PS5 plus explicit SDL path | configure and source audit |
| Pre-gate SDL side effect | candidate does not link SDL2main; gate precedes SDL_Init |
source-order audit and ELF imports |
SDK CRT changes kernel state before main |
classify exact effects; permanent legacy artifact remains blocked | pinned-source runtime audits and ADR-0010 |
Probe side-effect statement
After its firmware gate, project code requests only system module loading,
symbol lookup, boolean logging, and module unloading. It does not request a GNM
operation. The pinned SDK source proves that dlopen can call
sceKernelLoadStartModule and that dlclose can call
sceKernelStopUnloadModule; module start/stop internals remain unknown.
More importantly, SDK v0.41's payload CRT runs before main. Its startup calls
__patch_init, which writes process credential capability/attribute fields and
syscall-address limits through the SDK's kernel read/write primitives. The CRT
also sets libc __isthreaded, initializes syscall/kernel/log/rtld state, may
load libSceSysmodule.sprx, allocates loader bookkeeping, relocates the
payload, and runs constructors. Normal termination runs payload destructors;
project dlclose requests module stop/unload only when this open loaded it.
There is no guaranteed cleanup after a hang, crash, partial load, or failed
stop/unload.
Therefore no GPU mutation or rendering operation is requested by project code. The existing ELF remains permanently ineligible by artifact-specific denylist, independently of the corrected Phase-0.6 classification model.
The firmware-9.60 capability artifact with SHA-256
4be1c17b4964f2b68c39b5145bc4af4619c32512d60269ecf5c39728b390fa63
is permanently blocked in manifests/artifact-denylist.json. Its manifest
states execution_eligible=false, and all new manifests default to the same
false value. tools/check_artifact_execution_policy.py must be the first
static gate used by repository tooling and Payload Manager integrations:
missing or false eligibility, malformed input, changed bytes, or a denylist
match returns DENY. A pass is not execution authorization.
Phase-0.5 startup result
The stock v0.41 CRT is UNSAFE. Omitting it is mechanically possible, but the
loader caller and its return, cleanup, crash, and pre-entry behavior are
UNPROVEN. No minimal startup source or ELF exists, and the corresponding
CMake option fails closed. See docs/runtime/ and
manifests/runtime/phase-0.5-startup-audit.json.
Phase-0.6 historical lifecycle result
The installed Payload Manager v0.3.1 and elfldr v0.23 are exact public-release
matches. Temporary QA flag, credential, ptrace, mapping, and SDK startup
effects are classified individually. The lifecycle still fails closed because
it has PERSISTENT_WRITE and UNBOUNDED_OR_UNKNOWN effects: unbounded ptrace
loops, no detached-child watchdog, unresolved return/reaping/cleanup,
incomplete credential restoration, no launch-time hash check, and a manager
upload path that writes /data/pldmgr/payloads.
That result remains immutable evidence for the unmodified public-release chain. It is not the current runtime profile.
Phase-0.7 offline deployment-readiness result
The hardened elfldr and controlled Payload Manager close the Phase-0.6
implementation blockers with bounded ptrace steps, complete checked credential
restoration, centralized cleanup, a two-second kill/reap watchdog, exact
same-file-descriptor hashing, and receiver-side digest/denylist enforcement.
The lifecycle ELF is a normal SDK v0.41 payload that sends one notification
and calls _exit.
The current controlled-ps5-runtime profile binds exact firmware 9.60, SDK,
source commits, hashes, sizes, expected effects, a removable controlled
artifact-directory write budget, no payload network, 2000 ms maximum runtime,
and no retry. It is READY_FOR_HARDENED_RUNTIME_DEPLOYMENT only:
installed=false, execution_authorized=false, transferred=false, and
executed=false.
No PS5 connection, transfer, installation, or execution was used to reach
this decision. Hardware behavior remains unproven. The normal CRT
__patch_init path is process-local but means the lifecycle is not a
kernelwrite-free artifact. The old blocked hash remains permanently denied.
See docs/runtime/phase-0.7-hardening.md and
manifests/runtime/phase-0.7-offline-audit.json.
Phase-0.8 read-only preflight result
The offline collector-admissibility review is
READ_ONLY_PREFLIGHT_BLOCKED. The exact Payload Manager v0.3.1 HTTP handler
sets an in-process active flag for every non-OPTIONS request.
/autoload_status additionally sets autoload_triggered and reads the
autoload configuration. Direct filesystem collection has no pinned collector
or proof excluding atime, audit-log, cache, metadata, service-state, or
on-device-log changes.
No on-device session was started and no PS5 connection was made. Current
firmware, live object identities, listeners, startup state, and rollback
backups remain unobserved. The exact stock Payload Manager backup is therefore
a hard open gate. Installation, lifecycle, execution, and automatic retry
remain unauthorized. See docs/runtime/phase-0.8-read-only-preflight.md and
manifests/runtime/phase-0.8-read-only-preflight.json.
Phase-0.9A anti-brick design result
The offline anti-brick layer is DESIGN_ONLY. It models exact pre-image
identity, separate reopened backup, inactive staging, quiescence, an atomic
switch, post-switch verification and separately authorized rollback. No such
PS5 switch or recovery primitive is claimed. All fourteen interruption
boundaries remain UNPROVEN, so the design is not installation-suitable.
The host simulator performs only in-memory logical writes and cannot connect, transfer, install, execute, open a target artifact or start a compiler. Its synthetic atomic primitive is fault-test scaffolding, not hardware evidence. The byte-exact on-device Payload Manager backup and recovery independent of both elfldr and Payload Manager remain catastrophic hard gates. No authorization is granted and automatic retry remains false.
Phase-0.9B observer feasibility result
The offline result is BLOCKED. Normal SDK v0.41 startup is not
kernelwrite-free because _start() reaches __patch_init() before main.
Omitting the CRT is mechanically possible, but safe custom entry, return/exit,
crash handling and loader cleanup remain UNPROVEN.
The hash-bound hardened elfldr route deliberately gives the payload no
stdout/stderr socket, and the controlled Payload Manager transport does not
receive payload output. Notifications, klog and stock manager HTTP are not a
proven bounded non-persistent result channel. No observer source, target, ELF,
linker map or package was created. All device authorizations remain false, and
no PS5 action occurred. See
docs/runtime/phase-0.9b-observer-static-audit.md.
Phase-0.9C execution-feasibility result
The offline classification is
BLOCKED_MULTIPLE_FOUNDATIONAL_CONTRACTS. Source review proves that a normal
SDK entry is side-effecting before main; a freestanding entry has no closed
stack/BSS/relocation/TLS, read, monotonic-time, return, exit, or cleanup
contract. A normal ret resumes an unproven SceSpZeroConf continuation, and a
watchdog kill is not accepted as safe exit.
The 4096-byte D1 result format passes deterministic host tests, but no current
caller-owned target buffer, copy-out, cleanup finalizer, or manager delivery
exists. Firmware source two is absent; an SDK export name alone is not an ABI.
Filesystem and platform reads may still affect metadata, atime, audit, caches,
counters, service/security state, open bookkeeping, accounting, object
lifetime, or races. No target source, ELF, map or package was built, and no PS5
action or authorization occurred. See
docs/runtime/phase-0.9c-static-audit.md.
Phase-0.9D existing-stack readback result
The offline decision is BLOCKED_NO_READBACK_PATH. The full and controlled
Payload Manager profiles contain uploads, installs, deletes, launch-time file
reads, directory/configuration observations, and process actions, but no
binary-safe file-download response. Hardened elfldr returns fixed status text;
its controlled manager transport sends and closes without receiving component
bytes.
The full-profile server_active_flag is process-local and only suppresses a
fallback notification in audited source. It is LOW_VOLATILE, but has no
in-process reset and must be explicitly accepted in any future permission.
/autoload_status is excluded because it sets autoload_triggered and can
alter worker timing. No PS5 was contacted, no file was transferred, and no
target, observer, client, backup, package, staging action, or authorization was
created. See docs/runtime/phase-0.9d-readback-feasibility.md.
Phase-0.9E bootstrap provenance gate
The exact external exploit/host and rudimentary port-9020 listener must be available and provenance-bound before they can be considered an independent rescue executor. A matching filename, an opaque console backup, a public upstream, a generic sender command, or a conceptual dependency graph is not enough. Unknown filesystem staging or autoload effects are brick-relevant and remain hard stops.
No Phase-0.9F target design is authorized while the receive, mapping, entrypoint, live-file, output, cleanup, crash, and reboot contracts are missing. Phase 0.9E permits only local hashing, source/binary inspection, schemas, manifests, and host-only policy tests. It permits no network socket, device client, transfer, target build, payload, install, execution, autoload, retry, or recovery action.
Phase 0.9E-R permits only bounded official Gezine/Y2JB GitHub acquisition
and private-origin push. Official metadata excludes every current release
asset from matching the local backup, and official source contains no
port-9020 listener implementation. The ignored official source tree is
inspection-only; downloaded code was not executed. No outer association may
be promoted to opaque inner provenance, and neither an operator attestation
nor host tests are runtime evidence. All device, build, transfer, execution,
installation, lifecycle, autoload, write, and retry authorizations remain
false.
Phase 0.9E-R2 permits only host-side hashing, bounded browser metadata copies,
the exact MediaFire object page, one mandatory official backup, and
source-motivated community assets. Downloaded archives are static evidence:
never execute or restore them, never track them, and remove temporary copies.
The SIECAF parser is read-only and may inspect only public fixed-width
structural metadata; it may not decrypt, guess keys, extract, write, or invoke
ps5-bar-tool. MediaFire metadata, structural similarity, and an inner match
would each remain non-runtime evidence. The actual result is
LOCAL_BACKUP_UNCORRELATED, so Phase 0.9F and every authorization remain
blocked.
Phase-1.0E inherited result boundary
Prior RUN A and RUN B permissions were artifact-specific and consumed. RUN A visibly reached C1; RUN B produced an unreadable notification and no exact D-stage may be inferred. Phase 1.0E may record those observations and build a new execution-ineligible diagnostic candidate offline. Its later exact one-shot authorization was consumed on 2026-07-22.
The only added target operation is one nonblocking send attempt per reached
D-stage through stdout inherited from hardened elfldr's legacy raw-ELF
connection. It may not open a target socket, connect, listen, read requests,
retry, write the device filesystem, install or activate autoload. The host may
model one connect/send/write-half-close/bounded receive with fake sockets, but
no real device use occurs without new exact artifact-specific permission that
also names result reception. EOF, timeout, partial frames and send failure are
terminal, never retry triggers. The normal SDK CRT effects remain explicit;
this result channel is not side-effect-free. RUN C used the permitted single
connection and validated D00-D02 before remote EOF. It did not retry or
reconnect. D03, SDL, VideoOut, rendering, terminal status and cleanup remain
unproven. All authorization fields and artifact eligibility are now false.
Phase-1.0F startup interval boundary
Phase 1.0F may prepare an exact artifact offline to place I00-I14 checkpoints inside the source interval after D02 and through entry to D03. These checkpoints may only reuse the existing nonblocking, signal-suppressed inherited stdout send. They do not send notifications and may not add a socket, connect, listener, receive path, address, port, filesystem write, install, autoload, retry or reconnect.
The distinct CHD10F01 parser remains offline-only: the live CLI is not
activated for it and must continue to reject the ineligible manifest. Normal
SDK CRT patch effects and the existing SDL/VideoOut imports remain explicit;
the artifact is not side-effect-free and static success is not hardware
evidence. No prior authorization carries forward. Device connection, transfer,
result reception and execution each require a new exact permission.
Phase-1.0G one-shot runner boundary
Phase 1.0G may prepare and host-test a manifest-driven runner, but its tracked manifest and approval template remain inactive. The interval protocol cannot be selected through a free command-line switch. Activation requires both an exact active manifest and a separate untracked local approval whose artifact, firmware, target, protocol, limits and unique run identifier agree.
The runner must rehash the actual artifact before transport and exclusively
create and fsync a consumed-attempt receipt before opening a socket. This
fail-closed receipt prevents a host crash from silently making the same
permission reusable. Retry, reconnect, resume and trace overwrite remain
forbidden. The current repository contains no active target, run identifier or
authorization; no device action is allowed by Phase 1.0G itself.
The later exact Phase-1.0G authorization was consumed by one attempt. Valid frames ended at I03 and ordinary stdout proved the deliberate no-argument, no-menu help/exit path before I04. There was no retry or reconnect. This result does not authorize another action and does not prove SDL, VideoOut, rendering or terminal cleanup.
Phase-1.0H startup-argument boundary
Phase 1.0H may correct only the proven !HAVE_MENU && argc == 1 exit. The
reviewed profile adds RetroArch's existing verbose flag, generating -v, and
must retain null content/config/core paths, static contentless core, write
firewall, bounded runtime and the inherited one-send-per-stage stream. It must
allow H only through an exact active manifest plus separate matching local
approval, never a free protocol switch. No target, run ID, retry, reconnect,
installation, autoload or device-write authority may be tracked by default.
The exact H artifact is offline evidence only. It remains transfer-, execution- and installation-ineligible, and all authorizations are false. Phase-1.0G authority was consumed and cannot authorize H. A later action requires a new exact artifact-specific permission; static success does not prove I04, SDL, VideoOut, rendering, terminal status or cleanup.
The later exact Phase-1.0H authorization was consumed once. Its trace reached
I04, SDL2 video, VideoOut open and buffer registration, then the first flip
submit returned -1 and SDL init returned -1. The diagnostic pattern was
copied into mapped display memory before the failed submit. D12 also records a
write-firewall rejection during configuration parsing; the exact requested
operation is unobserved. No retry is authorized. Do not infer a visible frame,
runloop entry, complete cleanup or safe exit.
Phase-1.0I offline postmortem boundary
Phase 1.0I may inspect only the consumed H trace, exact source, ignored local
artifact/map and disassembly. It proves the submitted tuple
(handle, 0, 1, 0) and narrows E118 to linked OPEN or STREAM wrappers. It
does not know the exact blocked operation, original submit errno, VideoOut
argument semantics or root cause. The diagnostic/normal frame-zero/frame-one
mismatch is a source candidate only.
No target build, artifact, device client, connection, transfer, execution, result reception or retry belongs to Phase 1.0I. A later offline design must capture errno before reporting, transmit the exact write operation and stop before I04 on a firewall shutdown. Selecting a different frame ID requires a new ADR, new artifact audit and separate future authorization.
Phase-1.0O consumed write-free result
The exact M artifact was transferred and executed once. The exclusive receipt was created before the only connection; there was one send, zero retries and zero reconnects. No installation, autoload, persistent staging or device filesystem write occurred. The diagnostic pattern did mutate mapped display memory and one VideoOut flip submit was attempted, as bounded by the approval.
The run passed I04 with no D13, then reproduced the first flip-submit failure.
D07 reports -1 and saved errno 0; E104 is the overlay's generic
framebuffer_fail label after that failure, not proof of an allocation fault.
The subsequent D04 after terminal-flagged D12 prevents a successful terminal
classification. Do not infer visible output, event-wait behavior, complete
cleanup or safe exit. The authorization is consumed and no action carries.
Phase-1.0P offline VideoOut analysis
Phase 1.0P performs source, map, relocation and disassembly inspection only.
It proves the consumed artifact called sceVideoOutSubmitFlip(handle,0,1,0)
and received -1 with saved errno 0. It does not prove the semantic ABI,
opaque buffer contract, flip ownership, visible presentation or cleanup.
An exported symbol name is not permission to call a status or flip-master function. No argument experiment, target build, parser relaxation or device action is permitted by this analysis. The D12-before-D04 order is source-deterministic, and D12 remains a shutdown request rather than proof of lifecycle completion.
Phase-1.0Q public evidence boundary
The bounded official-source inventory found no independent PS5 VideoOut ABI. SDK v0.41 provides export names only; the PS5 declarations and opaque records originate together in one SDL lineage, and relevant official ports consume that same fork. OpenOrbis defines only the analogous PS4 contract.
Do not promote source repetition, a successful registration return, a PS4 constant or an exported status/flip-master name into PS5 semantic proof. No submit parameter, buffer layout, ownership state or error interpretation may change from Phase 1.0Q, and no target or device action is authorized.
Phase-1.0R launch-context boundary
The exact PS5 SDL2main adds no application ID, title identity, LNC setup,
VideoOut ownership or process creation. Its LoadExec("exit") occurs only
after SDL_main returns, and the tested RetroArch path already performs SDL's
splash-hide call before VideoOut open. Direct and Payload Manager raw-ELF
routes use the same hardened elfldr process constructor.
Do not treat PacBrew packaging, homebrew.js path/argument descriptors,
LakeSnes documentation, or the non-unique LNC log as proof of a different
working display context. The exact hbldr/shsrv launcher and runtime active-app
state are unbound. Keep
NO_SOURCE_PROVEN_LAUNCH_CONTEXT_FIX_TARGET_CHANGE_BLOCKED: no SDL2main,
LNC/SystemService, submit, VideoOut, target-build, transfer or execution
change is authorized.
Phase-1.0S hbldr/shsrv boundary
Official source proves that hbldr is materially different from raw elfldr: it launches a BigApp through SystemService and replaces the resulting process with a device-resident ELF. This is source evidence for a launch-context difference, not proof of VideoOut permission, visible output, safe cleanup or firmware-9.60 behavior. The exact deployed shsrv identity is unknown.
Never invoke or copy the existing route under this gate. It may kill the
running BigApp, performs kernel/ptrace process changes, lacks a hard deadline,
requires prior target staging, and current versions may remount /system_ex
and create persistent FAKE00000 content without an atomic write, rollback or
power-loss protocol. Keep
BIGAPP_CONTEXT_SOURCE_PROVEN_DEPLOYED_IDENTITY_UNPROVEN_DEVICE_PATH_BLOCKED.
No port-2323 connection, shsrv request/deployment, hbldr command, target build,
device file, app termination, remount, transfer or execution is authorized.
Phase-1.0T inactive shsrv identity boundary
The current shsrv source spawns a shell for every accepted connection and its
greeting automatically queries and transmits model, serial number, firmware,
temperatures and CPU frequency. Therefore a nominally read-only help request
is not side-effect-free and risks disclosing a device identifier. Phase 1.0T
contains no connector and authorizes no connection.
The offline parser must receive an already supplied transcript on stdin. It
must never persist raw input, serial, model or telemetry, and may retain file
metadata only for an independently supplied literal absolute path. help
identifies at most a source family; stat is metadata only; sum is a weak
16-bit rotating checksum and may cause atime/cache/accounting effects. None
can prove an exact binary. Wildcards, path discovery, content commands,
hbldr, launch, writes, signals, mounts, retry and reconnect remain forbidden.
All future windows are DESIGNED_NOT_ACTIVE and require separate exact review.
Phase-1.0U bounded local inventory
Phase 1.0U found no deployed shsrv candidate within the declared Chimera, attachment, known-download and ZIP-entry-name scope. This is not a global host or device absence claim. The official source checkout, host telnet wrapper and PacBrew recipe remain non-deployed references and must never be substituted for exact installed bytes. No discovered script or binary was executed.
The inventory grants no connection, shell command, target build, transfer, execution, installation, write, retry or launch-context experiment. Only the next offline inactive collector-design phase may proceed. A future live collector remains blocked behind a new exact approval and the Phase-1.0T serial/telemetry side-effect acceptance.
Phase-1.0V inactive collector-model boundary
Phase 1.0V is an offline stdin model with no network transport. It bounds raw and sanitized input to 65,536 bytes, permits at most 256 chunks, rejects incomplete Telnet controls and invalid UTF-8, and seals after one result. It retains only the Phase-1.0T sanitized record. The internal bytearray is cleared, but physical memory erasure is not proven.
The tracked activation and approval remain empty and false. Do not add an address, port, command, socket, connect/send path, automatic reply, persistent raw transcript, retry, reconnect, resume or fallback under this phase. Host model success is not device, prompt, cleanup or deployed-identity evidence.
Phase-1.0W reviewed inactive client architecture
Self-review remediates doubled-IAC state, empty-chunk accounting, path allowlisting, firmware/compile metadata validation and numeric-parser error normalization. Physical memory erasure remains unproven. The new policy accepts only synthetic dual records and returns a frozen data plan; the fake transport has no network primitives.
Keep the tracked activation and approval empty. Port 2323, one connection, ten-second deadline and T2/T3 command tokens are future constraints, not authority. A consumed receipt, exclusive sanitized output, monotonic deadline, network transport, Telnet reply/prompt contract and deterministic close remain missing. Do not connect, render shell lines or issue a request under this phase.
Phase-1.0X inactive injected transport
The X orchestrator accepts only an already validated immutable session plan, an injected adapter, an injected monotonic clock and a caller-owned host evidence directory. Repository tests supply only fake adapters. The consumed receipt is exclusively created and file-flushed before adapter open. Output is sanitized, exclusively created and bound to the reopened receipt hash. There is no overwrite, delete, raw-transcript persistence, target persistence, retry or second open.
Do not interpret file fsync as directory-entry durability. A partial file is
invalid and deliberately not cleaned up; the run remains consumed. Deadline
checks surround adapter boundaries but cannot preempt a blocking real adapter.
Exact prompt and Telnet framing, OS socket timeouts, live close behavior and
deployed shsrv identity remain blockers. No real adapter, address, port,
connection, request or authority may be added under X.
Phase-1.0Y offline shsrv framing
The Y model accepts synthetic bytes only. It distinguishes raw v0.7-v0.8 from
libtelnet/NVT v0.9-v0.19, never opens a transport and never formats a command.
Neither audited family proactively negotiates or server-echoes input. Current
source rejects unsupported WILL/DO; legacy source passes Telnet controls
into the shell. Future Chimera input must therefore emit no IAC commands.
A terminal $ is not a live completion proof. PWD is not forcibly
overwritten, the external Telnet client's local echo is undefined, wire chunks
are arbitrary, and current pipe/socket handlers do not complete short writes.
The server also has no bounded session deadline. Preserve deadline-based
partial-result rejection, keep all authority false, and do not add a real
network adapter under Y.
Phase-1.0Z offline passive batch
The Z contract produces one target-free ASCII/LF byte batch from a validated W
plan. It permits only help, or ordered stat and sum for one normalized
literal path. NUL, CR, IAC and shell separators cannot enter the batch. It has
no CLI, address, transport, clock or file output and authorizes no device use.
Incoming IAC fails closed; the model never sends a Telnet reply. Prompt text and remote EOF are not completion boundaries. Only an explicit synthetic hard-deadline event can seal, and incomplete help/stat/sum output remains invalid. This does not prove live timeout preemption. A future T3 read may still cause atime, cache, accounting and scheduler effects, while the automatic sensitive greeting and shell/connection state require explicit acceptance. Keep all authority false and add no real adapter under Z.
Phase-1.0AA offline fake-adapter integration
AA accepts only exact built-in fake adapter, fake clock and fake evidence-store types. Subclasses and arbitrary injected implementations are rejected, so the module cannot be repurposed as a live transport boundary. It creates an exclusive consumed receipt before fake open, permits one complete Z batch, seals only at a valid synthetic hard deadline and closes exactly once.
EOF, blocked receive, early or missing deadline, data at/after deadline, IAC,
partial output and evidence collisions are failures. A receipt remains after a
failed fake attempt; no cleanup deletes it. Logical event-buffer clearing does
not prove physical erasure. Host fsync does not prove directory-entry
durability, and the synthetic clock cannot prove OS preemption. Keep every
authorization false and do not add a network adapter or device action under AA.
Phase-1.0AB offline live-adapter feasibility
AB binds the local Python 3.13.2 Windows socket/select implementation but adds
no network import or adapter. Its trace model accepts synthetic operations only
and requires receipt-before-creation, nonblocking-before-connect, readiness and
SO_ERROR, positive bounded send/receive progress, deadline-only sealing,
sanitization, local close and then output.
Selector timeout is a maximum requested wait, not proof that host scheduling
cannot overshoot. Local close is not proof of remote shsrv/process cleanup.
Numeric-address parsing and the exact accepted Windows pending-connect error set
still require implementation review. Keep live implementation, socket creation,
DNS, target retention, connection and request as hard stops under AB.
Phase-1.0AC offline dormant-adapter boundary
AC executes only against the exact built-in fake syscall facade and fake clock. A precommitted receipt marker must precede synthetic creation; nonblocking setup precedes synthetic connect; partial progress is explicit; EOF, zero progress and data at the deadline fail. One fake local close is attempted after every successfully opened path. Unused fake events are logically discarded, which does not prove physical erasure or remote cleanup.
The module has no live adapter protocol, socket/selector import, DNS, address, CLI, real clock or file output. All authorization remains false. AC permits only a later offline inactive numeric-target/activation design; it does not permit a transport implementation, connection, request or device action.
Controls required before Phase 1
Phase 1 cannot begin until all of the following are recorded in a new ADR:
- explicit hardware-test approval;
- an allowlisted firmware and reproducible console identification method;
- proven function signatures and data layouts from acceptable public sources;
- a bounded timeout and operator recovery plan;
- independently reviewed cleanup and crash-log paths;
- a one-step-at-a-time test case with an SDL software/VideoOut fallback;
- an explicit statement of exactly which buffer or GPU state may mutate.
Approval for one test does not authorize later tests.
Timeout, watchdog, cleanup, and logs
The Phase-0 loop is statically bounded by the 21-entry manifest and always
attempts module cleanup after lookup begins. Dynamic-loader calls do not expose
a documented cancellation API, so an in-process forced timeout would risk
leaking loader state. The default NONE gate blocks the project-requested
module open. The 9.60 build gate does not remove the SDK CRT blocker and grants
no execution authority.
Before any approved hardware observation, a separate supervisor design must define a wall-clock deadline, progress events, operator-visible failure state, and a recovery action that does not kill a thread while it owns loader or GPU state. The probe already emits deterministic JSON-line stage events suitable for a redacted crash/timeout log; it never emits addresses. Later GPU phases must add explicit per-operation deadlines and prove cleanup for each partially completed state transition.
Disabled Phase-1 candidate
The candidate source contains one SDL window-surface update, but it is outside
every default target and automated test. Its default NONE build exits before
SDL initialization. Project code contains no direct VideoOut or GNM prototype.
The pinned SDL backend's flip-event wait has no proven finite timeout; this is
recorded as a hardware blocker rather than hidden behind a forced thread kill.
See docs/phase1/HARDWARE_TEST_PLAN.md.
Incident rule
On an unexpected return code, missing cleanup confirmation, display anomaly, hang, reset, or firmware mismatch: stop, preserve non-sensitive logs, mark the compatibility entry as failed or unknown, and do not retry automatically.