OpenOmega is a clean-room, pure-native compatibility reimplementation research project for
Syphon Filter: The Omega Strain (NTSC-U, SCUS-97264). PCSX2 is used as a behavioral
oracle and debugger; it is not intended to be a dependency of the eventual native runtime.
The shipping runtime is pure modern-CPU native code: no MIPS interpreter, recompiler, translated
retail instruction blocks, or PS2 execution layer.
Omega Strain compatibility is also the proving workload for an independently designed OpenOmega engine and SDK. Evidence-backed canonical data, runtime services, and authoring tools may become reusable as their contracts stabilize; this project does not claim to recover or represent Bend Studio's historical engine source or internal toolchain.
- Official PCSX2
masterbuilt from commit86d76bbf590566d9ea74d381eeff3acd9856503a. - Build output:
third_party/pcsx2/bin/pcsx2-qtx64-avx2.exe(PCSX2 2.7.485). - E-0099 records runnable-tool and configuration-initialization readiness for a separately
maintained local custom PCSX2 branch based on that exact source. The branch combines bounded VUM
producer commit
13df8ef7, front-end producer commit78ea3c8, and coordinated-lifecycle commitd17a521c. Its one-job MSVC RelWithDebInfoPCSX2core target and true Releasepcsx2-qttarget both build successfully. The Release executable has SHA-2562D3EAC421BDD1E6C09C8454F574D4AF32AD41F4E51BF87AA254CDAFB93BEA870; import inspection confirms release Qt/KDDockWidgets dependencies with no debug-CRT chain, and linked-image inspection finds both private producer namespaces. An isolated-versionlaunch reportsv2.7.485-3-gd17a521cabefore its intentional exit 1, and an isolated external-datapath -testconfiglaunch exits 0. The custom source, build tree, executable, configuration, and any future private inputs or reports remain outside this repository. No producer capture, BIOS, disc, savestate, private site, or owner input was used for E-0099. - Official Windows dependency archive SHA-256:
9C02B2CF15DA632B7D862131486B6CD8D7C58979D5F8C345F0BA4E0E2AEC3FD1. - Owned NTSC-U disc image SHA-256:
A60A4B41FEA808335BAA3B887A377BB98063F6F169CA498EFEE49397FBA96130. - Boot verified with USA BIOS v1.60, serial
SCUS-97264, CRCD5605611, ELF entry point0x00100008, and D3D12 rendering. - The disc is extracted under the ignored
private/extracted-disc/tree. - All 273 top-level HOG archives validate against the documented directory layout: 32,351 contained entries and zero structural errors.
- The native range reader validates all 6,677 nested HOG spans: 501 exact and 6,176 with verified all-zero sector tails.
- The first native scene importer validates the terrain prefix of all 18 level POP files: 5,351 records, including 4,144 with nonzero alignment bytes that are safely skipped.
- A retail-only passive POP post-terrain descriptor fail-closed checks the already-established
ordered 19-candidate aligned-literal envelope and five exact arithmetic extent hypotheses without
promoting any literal, word, stride, or opaque range to section, count, record, or payload
semantics. Its fixed-schema native verifier discovers and accepts all 18 owned-corpus
.POPcandidates with zero rejections or errors. Independent accepted-only input/items/logical-output/string/scratch maxima are919360 / 1 / 168 / 26 / 80036; no tuple co-occurrence is asserted. The descriptor is fixed owned hypothesis metadata, not canonical asset IR, and the report exposes no source identity or descriptor observation. - The native host validates an owner-supplied NTSC-U data root, loads MINSK as 299 canonical manifest cells with matching owned spatial meshes, and renders a deterministic synthetic canonical-COL wireframe contact sheet through SDL_GPU/D3D12.
- E-0102 adds an explicit native opening-movie path: bounded MPEG-PS and H.262 inspection, Windows Media Foundation video decode to owned NV12, project-owned RGBA8 conversion, stable GPU texture updates, and bounded PSS PCM presentation through a device-demand clock. The modal boot reducer supports skip, EOS, safety timeout, and fail-open transition to the existing native front end while suppressing simulation catch-up and isolating capture/replay. This is one narrow compatibility path, not a general media engine or a frame-exact retail audiovisual parity claim. Its custom PCM grammar remains a project-defined provisional compatibility hypothesis: generated fixtures prove implementation boundaries, and the recorded owner-stream smoke proves only that one stream passed them, not the field meanings or deinterleave semantics independently.
- E-0112 adds a second explicit selector,
--opening-movie-member=NAME, without adding automatic intro discovery. It resolves only that case-insensitive exact member from fixedZMEDIA/ZMOVIES.HOGthrough the frozenGameDataService/SourceLocatorboundary. The service indexes the top-level directory without loading the multi-gigabyte archive, reads only the selected payload under the unchanged 512 MiB cap, and hands an identity-free move-onlyOpeningMovieSourceto the existing player. Path and member selectors reject each other and both remain isolated from probe/capture/replay. Missing, malformed, oversized, unreadable, or rejected input emits no path/member identity and fails open to Profiles. Selecting the automatic launch member remains deferred until private owner-side observation; no member is guessed here. - E-0104 adds an opt-in generated-playback acceptance smoke at the
OmegaAppboundary. Generated RGBA and silent PCM traverse the actual SDL GPU host, dummy-driver SDL audio service, event-input path, boot reducer, scheduler gate, and synthetic front end. Natural EOS reaches Main and a fresh next-frame Down edge selects Profiles; primary skip is covered before playback and after two and five advances. The smoke asserts zero transition simulation, complete movie-resource and audio containment, and categorical redaction of a hostile path-bearing playback error. It does not read or decode an owned stream, exercise Media Foundation lifetime, prove finite-source PCM or hardware drain, establish perceptual synchronization or retail timing, or replace repeated owner runs. - The native host owns the system-default SDL playback stream as 48 kHz stereo F32. Its callback
supplies project-owned silence while idle and can consume opening-movie PCM from a fixed 4,096-
frame ring. Project callback code performs no file access, logging, explicit locking, or dynamic
allocation. The main thread applies the bounded provisional PSS
SShd/SSbd48 kHz stereo PCM16 compatibility shape, deinterleaves exact frame ranges into owned memory, queues converted samples, and contains the stream on skip, completion, or failure. This is opening-movie presentation, not a general mixer, proof of final hardware playback, or a retail timing-parity claim. E-0090 separately adds a backend-neutral, bounded VAG-to-owned-mono-PCM16 decoder for the complete observed 48-byte-header/version/rate/zero-tail envelope and standard five-predictor PS-ADPCM frames. Raw frame flags and marker sample offsets survive as data, but no flag applies playback, looping, resampling, mixing, asset selection, or title-specific audio policy. - E-0093 adds a separate bounded SKAS structural-text adapter for the two-candidate aggregate envelope. It owns the exact printable-ASCII/CRLF text and 72 opaque source-order line ranges, validates five blank lines, 67 one-colon lines, and one through three trailing zero bytes, and assigns no label, value, relationship, animation, skeleton, or SKA-association semantics.
- E-0101 records bounded passive FNT, GUI, and IE project-defined prefix hypotheses backed by generated tests. They retain only narrow neutral scalars/ranges, own no source payload, and remain offline structural scaffolding. No tracked evidence records the retail provenance of their exact constants, and no font, widget, hierarchy, layout, rendering, consumer, or retail-menu semantics are assigned.
- An app-owned, non-hot-reloadable SDL input leaf owns the process-global event pump, keyboard and
mouse routing, and explicitly opt-in primary-gamepad support. No controller is required to start,
navigate, or play the native diagnostic runtime. The SDL gamepad subsystem and discovery are
disabled by default and enabled with
--set=input.gamepad_enabled=true; only then does the leaf filter controller events by SDL instance ID, reset gamepad controls on disconnect, and promote the next available device. A deterministic headless virtual-gamepad test covers that hotplug boundary; selecting only one primary gamepad is a synthetic host-shell policy, not a claim about retail behavior. - The standalone
omega_persistencefoundation implements OpenOmega-owned native saves instead of PS2 RAM, memory-card-device, or emulator-savestate state. Its versioned little-endian key/value database uses two complete checksummed snapshots, private-temp flush plus atomic inactive-slot replacement, synchronized directory publication, strict allocation and file bounds, generation-unique record revisions, atomic optimistic batches, anchored no-follow file access, and an operating-system-held exclusive lifetime lock. Synthetic tests cover reopen, torn-newest fallback, missing-established-slot rejection, post-recovery commit, hard-link containment, namespace anchoring, both-slot corruption, future-version rejection, and competing owners. The native profile catalog and app-owned startup composition never create or select an implicit default profile. E-0089 snapshots at most 1,024 already-existing profiles before SDL startup and projects at most three sorted names into a fixed project font. E-0096 also copies those three IDs into the owned bounded front-end model and lets an explicit project-owned Profiles action select one as session-onlyOmegaAppstate. E-0106 adds one explicit zero-to-one transition: Primary on an empty Profiles screen creates fixed project profile00000000000000000000000000000001namedPROFILE 1through the transactional catalog, but leaves the active profile unset until a later Primary edge selects it. Complete empty and one-profile GPU presentations are preloaded before the transaction, so the successful durable commit is followed only by a no-throw presentation swap. Main, Profiles, Controls, and AssetTopology remain modal; only DiagnosticPlay advances simulation. This synthetic shell establishes no retail art, layout, input, save policy, behavior, or fidelity. The standaloneomega_ps2_compatlayer now recognizes strict standard 8 MiB logical/raw card envelopes, reads one explicitly selected top-level directory as ordered opaque files, and creates a new deterministic logical or raw card without patching an existing image. Owner saves and exported card images stay outside version control; Omega Strain payload interpretation remains a separate evidence-backed mapping slice. - E-0108 makes entry into that project-owned shell explicitly profile-gated. The pure
constexpr/noexceptPlanProjectFrontEndStartupStateopensProfileson its first slot only for a bounded, internally consistent nonempty snapshot or an exact empty snapshot with explicit first-profile-creation capability. A malformed or out-of-bounds count pair, or zero profiles without that capability, fails closed to the establishedMainstartup state. LiveOmegaAppstartup and fresh replay call the same planner; neither path creates or selects a profile automatically. The fresh-replay summary publishes only its bounded final project-ownedfront_end=<mode>/<row>/<slot>state, and the existing CLI smoke pins the exact empty-profile route toProfiles/Profiles/Firstwithout changing capture schema. Generated acceptance fixtures compose the existing opening-movie and profile lanes asmovie -> Profiles -> explicit create -> release -> explicit select -> Main, including a swallowed skip press that must be released before creation. A generated bounded playback failure also fails open toProfileswhile leaving the durable catalog empty. This policy adds no GPU resource: testedNoContentno-opening-movie accounting remains 8 slots / 233,476 logical bytes for an empty catalog and 6 / 159,748 for a nonempty catalog; the generatedNoContent2x2 movie fixture temporarily raises the empty case to 9 / 233,492, then releases exactly one slot and 16 bytes on transition. Compilation and execution of the new fixtures remain pending. This is project-owned startup composition, not retail startup, menu, profile, save, PS2, proprietary-input, or behavioral-parity evidence. - E-0109 makes the existing Profiles Primary action an explicit project-owned durable
confirmation before it publishes either the projected Main state or the app-session active
profile.
NativePersistencestoresprofiles/activeat record schema 1 as exactly 32 bytes:OOACTPRF, little-endian payload version 1, zero flags, zero reserved word, and the raw 16-byteProfileId. Its default app database ceiling is 1,025 records, providing capacity for the bounded 1,024-profile startup model plus this pointer without claiming a namespace reservation. Bootstrap rejects a malformed, unsupported, or stale pointer through one typed startup category. A same-ID reconfirmation validates the durable revision but writes no new generation. Every app launch still entersProfiles/Profiles/Firstwith session activation unset; a valid stored confirmation is never an automatic selection. Generated persistence totals are exactly one 41-byte logical profile value at generation 1, then two records / 73 logical value bytes at generation 2 after the 32-byte pointer commit. Failure leaves Profiles, database totals, session state, and GPU state unchanged. Capture/replay retains the existing schema and remains persistence-free, and the live policy adds no GPU resource. A non-installed test-only writer now prepares the same deterministic profile plus confirmation for the direct process and Windows portable-package contracts. Both launch the real shell twice at zero frames, require one profile with empty stderr, and require the native-save bytes and neighboring test/package trees to remain unchanged; the package's exact member allowlist excludes both the helper and native-save state. Static validation passed all 340 tooling tests, Python compile-all, the 262-file native dependency gate, the 109-record ledger gates, the 439-blob staged public-tree gate, diff checks, and independent core/package reviews. Local C++ compilation/execution and publication CI remain pending. This establishes no retail or PS2 save, menu, profile, campaign, checkpoint, memory-card, proprietary-input, owner-corpus, or behavioral-parity semantics. - E-0111 supersedes only E-0109's production record ceiling and no-checkpoint boundary. Startup
enumerates at most the shared front-end maximum of 1,024 direct profile markers with
ProfileCatalog::ListBounded; checkpoint-shaped and other child records do not consume that marker budget, and a 1,025th direct marker fails closed before parsing. The app database ceiling is now 2,049 records: enough for 1,024 profile markers, one independent 32-byte project diagnostic checkpoint per profile, andprofiles/activewhen no unrelated record consumes capacity.FrontEndCapabilitieskeeps creation, diagnostic-start support, and the active-profile requirement independent. Main/Start Diagnostic is inert unless start support is open and the optional gate is satisfied by a confirmed ID that still resolves in the bounded model. A successful live transition publishes typedStartDiagnosticCampaign, appliesPrepareDiagnosticCampaignStart, and only then publishes DiagnosticPlay and simulates. The canonical recordprofiles/<id>/campaigns/diagnostic/checkpoint, schema 1, contains exactlyOODIAGCP, little-endian payload version 1, zero flags/reserved word, and the raw 16-byteProfileId. Bootstrap rejects malformed, mismatched, or orphan markers through one sanitized category; the same confirmed active ID and observed pointer revision are prerequisites, and an exact existing marker is a no-write success. Replay may publish the typed command from its caller-supplied support plus identity-free confirmation mirror but never touches persistence. Generated live and opening-movie paths reach generation 3, three records, and 105 logical value bytes. Static validation covers 361 tooling tests and 111 evidence records; no local C++ build or executable test was attempted under the host RAM STOP condition, and remote compilation/execution remains pending. This is a project-generated diagnostic launch marker, not a retail/PS2 campaign, save, checkpoint, gameplay, continuation, world-state, memory-card, emulator, owner-input, or parity claim. - E-0112 adds the first complete project-owned profile-to-character-to-briefing-to-session path. A
stateless
CharacterCatalogstores bounded metadata atprofiles/<profile-id>/characters/<character-id>/metadataand validates the parent profile on every operation. Explicit profile confirmation now prepares and opens a Characters surface. Primary on its exact empty state creates fixed native ID00000000000000000000000000000001namedDIAGNOSTIC CHARACTERbut does not select it; a later release and Primary edge confirms it through the 48-byteOOACTCHRactive-character pointer and opens the project-ownedBriefingRoom/mission-selection surface. Switching profiles atomically replaces the profile pointer and invalidates the character pointer. Mission activation remains inert until both per-launch identities resolve against their bounded models, thenPrepareGameSessionStartvalidates both durable revisions and writes or reuses the 48-byteOOGAMECPmarker at the character-owned diagnostic-session key before publishing DiagnosticPlay. Cancel returns from BriefingRoom to Characters, and the DiagnosticPlay menu edge returns to BriefingRoom. Capture/replay retain bounded commands and identity-free confirmation mirrors; neither owns persistence or a catalog view. The production database uses the existing hard 4,096 record and 255-byte key ceilings because the canonical session key exceeds the standalone 96-byte default. Generated catalog, reducer, corruption, profile-switch, reopen, and session tests cover the complete transactional boundary. A separate owner-only manual smoke reached the existing MINSK diagnostic topology and actor marker through create, select, start, close, reopen, reselect, and restart; no owner input or captured byte entered this tree. This is a functional native bootstrap into the current diagnostic game view. BriefingRoom is a synthetic selector for the one startup-bound diagnostic content value; it is not a retail character editor, appearance, loadout, campaign, mission catalog, scene, save, checkpoint, world-state, or parity claim. - E-0103 introduced the project-owned cancel edge; the current keyboard/mouse-first host mapping
requires no gamepad. W/A/S/D and the arrow keys navigate menus and move in DiagnosticPlay;
Return, keypad Enter, or F1 select; Space or left mouse selects in menus and fires the synthetic
diagnostic cue in play; Escape or Backspace cancels; T or held right mouse targets in play, with
right mouse also acting as menu back; and F10 quits. The 26 physical bindings cover nine logical
actions. Gamepad buttons and D-pad directions become optional aliases only after
--set=input.gamepad_enabled=true, never a startup or play requirement. Live capture and replay consume bounded logical actions without physical provenance. These bindings, cues, and transitions are synthetic native-shell policy, not evidence of a retail control map, combat system, or menu graph. - E-0113 adds
omega_tool frontend-envelope-coverage-verify-tree <root>, a bounded project-passive coverage command for the existing FNT, GUI, and IE prefix/envelope descriptors. It performs identity-guarded traversal, reads every admitted top-level HOG during successful discovery, and records SHA-256 for each 64 KiB chunk, including a shorter final chunk. Parser bytes are exposed only through one verified 64 KiB cache after matching those discovery digests. The retained 32-byte digest payload is globally capped at exactly 8 MiB; parser raw-read allowances are bounded by admitted top-level sizes plus chunk-rounded nested spans. Nested members classified by an ASCII-case-insensitive.hogsuffix are followed to depth 32, loose candidates are ignored, and output contains only deterministic schema-version-1 family totals with typed rejection counts. Infrastructure failures discard partial observations and emit a zero report plus one fixed path-free category. The unkeyed digests are consistency pins, not source authentication, provenance, a signature, or an atomic filesystem snapshot. Generated fixtures cover SHA-256 known answers, chunk boundaries/cache reuse, exact and padded nested spans, forced resource limits, descriptor rejections, privacy equivalence, unsafe entries, and identity/content races. No owner-corpus run is recorded. Acceptance is not retail validity, semantic decode, UI/menu evidence, format or consumer meaning, rendering behavior, or PCSX2 parity. - E-0114 adds the bounded renderer-neutral
SceneIR, generation-safe indexed-mesh pool and draw-list contracts, SDL GPU mesh submission, and the first native application composition of canonical level geometry.OmegaAppbuilds one project-owned global diagnostic projection that preserves relative offsets and scale along its selected aggregate axes, validates every camera-times-instance transform before upload, transactionally uploads the complete mesh set, and publishes mesh commands only inDiagnosticPlay; the existing actor, fire, and targeting cues remain ordered texture overlays. Generated and Direct3D12 fixtures cover ordered multi-mesh rendering, full prefix rollback, stale/foreign handle rejection, matrix order, exact pixel presentation beneath an overlay, and zero-residual teardown. The app presentation and large smoke scenarios are heap/sibling-owned so checked Windows builds retain bounded stack use. This is a project-authored diagnostic view: it establishes no retail placement, camera, visibility, material, lighting, collision, draw order, owner-corpus publication, or visual parity. - E-0115 supersedes only E-0114's single-camera-matrix composition wording.
SceneCameraIRnow owns identity-defaultworld_to_viewandview_to_clipstages, and the project-ownedComposeObjectToClipcontract evaluatesview_to_clip * world_to_view * local_to_worldwithout retaining state or allocating. It rejects non-finite inputs and non-representable intermediate or final results before any mesh upload. Synthetic fixtures use non-commuting stages and a nontrivial homogeneous fourth row to pin full 4x4 order, identity behavior, input immutability, fixed app rejection, and zero pre-rejection uploads. Current diagnostic builders leave both camera stages identity, so the renderer command and pixel contracts remain unchanged. These are OpenOmega matrix conventions only; no retail coordinate, storage, axis, handedness, camera, projection, or parity claim is made. - E-0116 supersedes E-0114's actor-texture-overlay wording only for a nonempty indexed diagnostic
scene. A project-owned factory builds one independently owned 3-position, 3-index, 48-byte
triangle;
OmegaAppuploads it after at most 63 environment meshes and appends its magenta draw after at most 63 immutable environment commands. After each frame's fixed simulation steps, the app maps the final synthetic X/Z position into a bounded local transform, composes it through the retained scene camera, and atomically republishes the environment prefix plus actor without a GPU upload or release. Target and fire cues remain texture overlays, while an empty scene keeps the complete E-0107 texture fallback. Startup failures attempt to release the uploaded prefix in reverse order, with the host retaining final-cleanup authority; tested budget failures leave zero residency. Teardown releases actor first, then environment resources in reverse order. Keyboard/mouse defaults and opt-in-only gamepad behavior are unchanged. Generated tests cover the exact 64-command/resource boundary, actor-stage slot/position/index/byte failures, camera composition, multi-command prefix preservation, atomic retained-state rejection, movement without mesh upload/release or residency change, and zero-residual release. This is synthetic OpenOmega presentation policy only; it establishes no retail actor, geometry, placement, camera, materials, animation, owner-corpus result, emulator equivalence, or visual parity. - E-0117 adds a project-owned absolute pointer sample beside, but independent from, bounded digital
input.
SdlInputServicereads finite SDL mouse-motion and mouse-buttonx/yvalues, resolves the event window's current logical dimensions, clamps each coordinate to that window, and rounds it into the inclusivePointerPositionQ16range[0,65536]. The latest valid sample persists until replacement or focus loss; malformed samples leave the prior value and digital event counters unchanged. Capture retains the exact optional sample for every frame and replay reconstructs it exactly. The project target bars and fire square follow that sample, with a bounded target-center fallback while no pointer is available. LMB still selects or fires, RMB still targets or backs, and W/A/S/D plus arrows still navigate or move. Keyboard and mouse are the complete default path; the SDL gamepad subsystem is not initialized unless--set=input.gamepad_enabled=trueexplicitly opts in. This is synthetic diagnostic input and presentation policy only. It establishes no retail mouse sensitivity, acceleration, crosshair, camera, weapon, projectile, raycast, damage, collision, coordinate-axis, or parity semantics. - E-0118 adds one allocation-free project diagnostic proximity reducer over an inclusive signed X/Z volume. Each successful fixed simulation step classifies the positioned actor as outside, entered, inside, or exited; the first in-volume observation latches one launch-local objective that survives later exits and BriefingRoom round trips but is never persisted. A fixed visible rectangle marks the still-armed zone and disappears after activation. Fresh replay applies the same reducer after each reconstructed step and exposes the same owned trigger state. This is a synthetic movement-to- objective seam only: it establishes no retail coordinate, trigger, objective, mission, checkpoint, collision, AI, combat, or persistence behavior.
- E-0119 turns the existing normalized pointer and target/fire actions into one deterministic project diagnostic engagement. A successful proximity crossing publishes a fixed inclusive Q16 target marker in that rendered frame; target/fire eligibility observes that completion on the following input frame. Held RMB or T acquires only while an available normalized pointer sample is inside it; an LMB or Space press is one attempt and latches completion only when acquired. Missing-pointer, untargeted, and outside-target shots remain misses rather than using the presentation fallback. Evaluation occurs once per normal input frame; closed menu/play gates supply a disabled input that clears transient acquisition, while successful zero-step play frames can accept an edge. State publishes only after the frame's complete fixed-step batch succeeds. The target reuses the existing marker texture, replaces the completed objective marker, and disappears on a hit; fresh replay owns and reproduces the same state. This is project-authored 2D hit-test policy, not evidence for retail targeting, weapons, projectiles, raycasts, damage, camera behavior, AI, or visual parity.
- E-0120 wraps that diagnostic seam in one allocation-free project mission lifecycle with
Ready,Active,Succeeded, andFailedstates. Every accepted BriefingRoom deployment resets the positioned actor to the project origin, clears proximity and target completion, and entersActive; keyboard select and menu LMB can redeploy without leaking their edge into play. A newly latched target hit entersSucceededand returns to BriefingRoom in the same rendered frame. An explicit direct Primary or Cancel edge while already in DiagnosticPlay entersFailedand returns to BriefingRoom; LMB fire and held RMB/T targeting remain gameplay-only there. Fresh replay owns the same optional lifecycle and reset policy, and production capture/replay compares exact final mission, proximity, target, actor-position, and front-end values. No gamepad default, persistence record, renderer resource, input/capture schema, or asset lifetime changes. A serialized MSVC Debug build of the executable and focused targets is warning-free; focused CTest passes 3/3 and the direct real-host app-capture smoke passes. Hosted gates remain pending. This is not evidence for retail mission, death, health, timer, debrief, checkpoint, spawn, campaign, inventory, reward, owner-corpus behavior, or PCSX2 parity. - E-0086 adds a bounded aggregate-only front-end HOG topology scanner. It accepts one supplied HOG
or recursively discovers HOG files below one supplied directory, then follows only normalized
.hogmembers through the established span parser. Its fixed schema reports approved public extension/category counts, archive-depth and exact/zero-padded extent distributions, fixed member-size buckets, and sibling same-basename extension-pair totals. Unknown suffixes collapse toother; no input path, member name, hash, offset, payload byte, raw suffix, identifier, per-archive row, or exception message is emitted. Strict configurable plus hard count, depth, directory, name, file-size, and cumulative-span caps fail closed. The slice uses only synthetic exact, padded, malformed, and limit fixtures and makes no front-end role, lookup, layout, state, binding, rendering, audio, or retail-behavior claim. - The native content service resolves all 5,351 manifest cells across all 18 levels into 5,351 owned spatial meshes with zero errors: 20,203 canonical nodes, 93,356 leaves, 889,640 vertices, 1,239,980 triangles/references, and 2,137 normalized empty meshes.
- The native TDX adapter converts all 15,248 texture assets into owned renderer-neutral storage: 15,442 source-order blocks, 17,960 primary planes, 285,521,272 primary bytes, 15,190 palette blocks, and zero errors. It normalizes 4,112 duplicate-proven implicit zero bytes without guessing pixel or channel layout.
- E-0091 adds a stateless bounded LPD counted-envelope adapter. It requires the fixed 22-word
little-endian header, preflights the 21 source-track counts and exact payload extent, and owns each
source-order four-byte entry without interpreting it. Exact inputs and all-zero physical tails up
to the aggregate-proven 1,932-byte maximum canonicalize identically; the observed 8-byte minimum
is not enforced as an invented minimum or alignment rule. The aggregate-proven 4,096-byte
physical-input ceiling derives fixed maxima of 1,002 entries, 1,024 items, and
sizeof(LpdEnvelopeIR) + 4,008output bytes; caller limits may only tighten them. All 21 final-sized vectors are explicitly allocated inside the typed error boundary. Scratch and nesting are unused. The slice is not wired to startup, audio, animation, or playback and assigns no track, scalar, timing, interpolation, pose, or VAG-relationship semantics. - E-0092 adds a strict native PAR text-envelope boundary over the public aggregate evidence. It preserves exact owned CRLF logical text and source-order line ranges, recognizes only the eight observed six-decimal first-line version tokens, and omits only a validated bounded NUL tail. It assigns no key/value, field, path, asset-role, particle, compatibility, rendering, gameplay, or emulator-equivalence semantics.
- E-0094 adds a strict passive VPK wrapper-envelope boundary over the 85 aggregate-fingerprinted
spans. It requires raw
b" KPV", the independent little-endian word 2,048 at0x08, the observed 1,320,960-through-9,005,056-byte physical range, and independent 2,048-byte alignment. Its fixed descriptor retains only two source-order opaque four-byte prefix values, physical byte count, and derived aligned-block count; it retains no remaining wrapper or payload byte. The equal numeric values of the observed word and alignment imply no semantic relationship. No codec, ADPCM, rate, channels, audio or music role, seek table, streaming, playback, storage geometry, runtime wiring, or emulator semantics are assigned. - E-0098 adds a bounded passive SO module descriptor over the already tracked custom little-endian
grammar. It retains section ranges, counts, neutral record summaries, and structural regularity
results but no LP string, code-cell value, or opaque payload byte. Its 512 KiB input ceiling is a
synthetic decoder safety policy, not an owner-corpus or wire-format limit. The descriptor is
analysis-only and is never consumed by content, simulation,
ScriptService, or the shipping runtime; retail script cells are never interpreted, translated, recompiled, dispatched, or executed. - E-0087 adds a diagnostic-only Indexed8 candidate projection over one strict canonical storage
shape: one matching
Packed8plane, one exact 256-entry palette, and exact index, palette, and output cardinality. Callers must explicitly choose identity versus bit-3/4 palette permutation, one of all six source-slot-zero-through-two mappings, opaque/slot-three/doubled-clamped alpha, and linear top-down versus bottom-up rows. Caller budgets can tighten but cannot raise the synthetic 16 MiB-plus-palette source and 64 MiB output hard maxima. This utility is not wired to startup or the renderer and establishes no retail display, channel, alpha, row-origin, swizzle, palette, material, or menu semantics. - E-0121 documents a sibling diagnostic-only Indexed4 candidate projection over one strict direct
storage shape: one matching
Packed4plane, exactly one block, exactly one 16-entry palette, and a packed plane of exactly(width * height + 1) / 2bytes. Callers must explicitly choose all five unresolved axes: low- versus high-nibble-first packing, source-order palette lookup only, one of all six source-slot-zero-through-two mappings, opaque/slot-three/doubled-clamped alpha, and linear top-down versus bottom-up rows. An odd texel count leaves one nibble of the final packed byte unread, and its value cannot change the output. Caller budgets can tighten but cannot raise the synthetic 8 MiB packed-source-plus-exact-64-byte-palette and 64 MiB output hard maxima. This utility is stateless, reentrant, CPU-only, performs no I/O, and is not wired to startup, the renderer, or any service; it establishes no retail nibble, palette, channel, alpha, row-origin, swizzle, mip, material, menu, rendering, gameplay, corpus, or PCSX2 semantics. - A bounded common-archive containment scan accepts all 18 runtime levels, 5,351 manifest cell
occurrences, and 5,413 scanned archive-directory occurrences with zero errors and finds zero
normalized
.TDX-suffixed members. This extension-bounded negative result does not exclude embedded texture data or assign ownership or a texture-to-cell/material/mesh relationship. - A separate direct-only scan accepts both explicit sibling container classes for every runtime level: 36/36 exact containers and 5,801/5,801 direct TDX members with zero errors, collisions, malformed textures, nested traversal, or non-TDX members. The two role classes contribute 5,765 and 36 occurrences. This establishes direct containment only, not retail ownership, necessity, priority, or a texture-to-material/cell/mesh binding.
- The public-safe native level-texture verifier accepts all 18 runtime levels, 36 explicit sources,
and 5,801 level-inventory texture occurrences with zero errors. It loads 5,913 storage blocks,
7,603 planes, 615,232 palette entries, and 29,562,280 owned storage bytes. Its independent
field maxima are Open input/items/logical-output/depth/scratch
3,076,944 / 1,460 / 111,014 / 0 / 71,467and Load3,139,344 / 5,169 / 333,232 / 0 / 65,595; these maxima are fieldwise and are not asserted to co-occur. Internal store defaults are 4 MiB input, 512 KiB logical output, 128 KiB scratch, 8,192 items, 4 KiB strings, and depth one. The measured byte/item fields are rounded independently to the next binary boundary above the larger Open/Load maximum; depth one is the smallest nonzero headroom above measured depth zero. These values are not runtime configuration or--setkeys. The verifier emits no paths, names, hashes, offsets, payloads, per-level rows, identities, or bindings. - E-0043 adds the bounded asynchronous native
AssetServicev0.OmegaAppowns it optionally only when startup has aLevelTextureStore; fixed reusable generation handles and explicit release govern a preallocated slot pool, while acceptedJobServicework retains a shared implementation through worker return and teardown expires the public service identity. A clean MSVC build produced zero warnings and errors, the focused checks and full 18/18 CTest suite passed, and 100 repeated lifecycle-test runs passed. Two owned-tree verifier passes produced byte-identical schema-version-1 reports over 18 levels, 36 sources, and 5,801 texture occurrences with zero errors. Requests,Readystates, successfulGetcalls, releases, stale-handle rejections, and zero-residual checks each total 5,801. Loaded storage totals are 5,913 blocks, 7,603 planes, 615,232 palette entries, 27,101,352 plane bytes, 2,460,928 palette bytes, and 29,562,280 owned bytes; maximum active slots, in-flight requests, and resident logical bytes are1 / 1 / 333,232. The verifier uses one worker, one pending job, and service limits of one slot, one in-flight request, and 524,288 resident logical bytes. Runtime defaults are 64 slots, 64 in-flight requests, and 64 MiB resident logical output, with a hard 8,192-slot maximum. These bounds are synthetic project policy, not retail limits or user settings. The service performs no VUM-name or material lookup, alias resolution, binding, display-pixel expansion, GPU upload, placement, visibility, or rendering. Its fixed aggregate report exposes no paths, names, hashes, offsets, payloads, per-level rows, identities, bindings, messages, or exception text; the unchanged E-0038 store verifier was revalidated separately. - E-0044 added the SDL-free bounded
RenderTexturePoolfoundation for project-owned tightly packed RGBA8 images. It preallocates a fixed slot pool, checks the exactwidth * height * 4extent with overflow protection, and separates backend work into transactionalReserve,Publish, andRollbackphases. Unique nonzero process-local pool identities plus slot and 64-bit generation fields reject default, foreign, stale, and released handles; explicit release refunds logical resident bytes, and a maximum generation retires rather than wraps. Defaults are 64 slots and 64 MiB of logical RGBA8 bytes with a hard 8,192-slot maximum. At E-0044,RenderFramePacketcarried one default-invalid fixed-width diagnostic handle while remaining trivially copyable and standard layout. A clean MSVC build produced zero warnings and errors, the focused test passed, 100 repeated focused runs passed, and the full 19/19 CTest suite passed. This was renderer-neutral metadata and lifecycle policy only: at that milestone it created no GPU resource, and neitherSdlGpuHostnorOmegaAppconsumed the handle. The existing one-off debug-image upload remained unchanged; no GPU upload, blit, residency,AssetService, TDX, VUM, material, binding, or display semantic was connected. - E-0045 then superseded E-0044's host non-consumption and unchanged one-off-upload state. At that
milestone,
SdlGpuHostowned a fixed parallel SDL texture table and ran project-owned RGBA8 uploads as RAII transactions: poolReserve, backend create/copy/submit, thenPublish, with rollback and backend cleanup on failure. Explicit release waited for GPU idle.RenderFramePacketcarried the generation handle that selected a blit, while its default-invalid handle selected a clear; aggregate host snapshots exposed no resource or pool identities.OmegaAppuploaded its existing project-generated diagnostic image, retained only the handle, and explicitly released it before host fallback teardown. Post-swapchain command buffers submitted on unwind instead of attempting the illegal cancel path. Host defaults remain 64 slots and 64 MiB of logical RGBA8 with the hard 8,192-slot maximum. A clean MSVC build completed with zero warnings and errors, and the default full 19/19 CTest suite passed. One initial plus 20 repeated public zero-file GPU smokes all passed ondirect3d12(21 total), and the separate public two-frameopenomegasmoke passed. Each GPU smoke uses one slot and a 256-byte budget, submits one clear-only frame, uploads and blits an opaque 8x8/256-byte image, releases it, rejects its stale handle before GPU access, then uploads and blits a 4x8/128-byte image in the same slot with a new generation. The final checked-idle snapshot has two uploads, 384 cumulative logical bytes, two releases, two blits, one clear-only submission, one rejection, zero unavailable-swapchain submissions, and one free slot with no reserved, resident, retired, or charged bytes. This proves command submission and checked idle, not framebuffer pixel identity or readback. It establishes noTextureStorageIR/AssetServicebridge, TDX plane or palette consumption, channel/alpha/nibble/palette/swizzle/mip/display expansion, VUM/material/alias/binding, scene placement/visibility, retail rendering, gameplay, measured GPU-byte accounting, streaming/eviction, asynchronous upload, or fence design. - E-0046 supersedes E-0045's historical single-handle frame boundary.
RenderFramePacketnow owns a fixedRenderDrawListwith at most 16 commands and a normalized Q16 target extent of 65,536. Each command contains a generation handle and normalized destination rectangle; construction rejects overflow, default handles, and zero, inverted, or out-of-range rectangles while preserving source order and duplicates. The draw list and packet remain trivially copyable and standard layout, but commands neither own nor pin texture generations. A future asynchronous queue therefore requires an explicit residency-pinning design.SdlGpuHostresolves every active handle and backend slot into fixed storage before acquiring a GPU command buffer. The first invalid, stale, foreign, released, or inconsistent handle rejects the entire list before any prefix can reach the GPU. An empty list retains clear-only rendering. For a nonempty list and available swapchain, the host first performs one full-target clear and then issues every full-source opaque nearest-filtered aspect-contained blit in source order withLOADtarget semantics; later overlapping commands overwrite earlier ones. Aggregate snapshots add the successfully submitted draw total without exposing resource identities. A clean MSVC build completed with zero warnings and errors. The focused portable test passed once and through 100 additional repetitions; the default suite passed 20/20. One initial plus 20 repeated direct GPU smokes all passed ondirect3d12. Each smoke used capacity two with a 384-byte logical budget and ended at exactly three uploads, 640 cumulative logical bytes, three releases, two successful blit frames, four successful blit draws, one clear-only submission, one rejected stale list, zero unavailable-swapchain submissions, and zero residual residency. The opt-in GPU test passed as the 21st CTest; registration was then restored to off and the default listing returned to 20 tests. The public two-frameopenomegasmoke also passed with deterministic dummy audio. This validates bounded command ownership, ordered submission, checked idle, and atomic resident-handle prevalidation only. It does not guarantee all-or-none behavior for arbitrary backend failures, framebuffer readback, or pixel identity. It establishes no retail draw order, target coordinates, filtering, clear color, compositing, placement, visibility, camera, material, texture, mesh, or gameplay semantics; noTextureStorageIR/AssetServicebridge or display expansion; and no measured GPU-byte accounting, streaming, eviction, asynchronous upload, or fence design. - E-0047 extends each bounded blit command with a half-open normalized Q16 source crop plus explicit
project-owned
Contain/Stretchfit andNearest/Linearfilter choices. Draw-list construction rejects capacity overflow first, then validates commands in source order with fixed handle/source/target/fit/filter priority while retaining the owned, zero-tailed, trivially copyable value contract. The pure integer source mapper floors left/top texel edges and ceilings right/bottom edges; the overflow-safe planner preserves that mapped crop exactly, maps the target with the same half-open rule, and either aspect-contains with deterministic round-half-up centering or stretches to the complete mapped destination.SdlGpuHostpreserves three complete-list fail-closed passes: it resolves the complete handle/backend-slot set, then maps every source crop and filter before acquiring GPU work. Once a nonzero swapchain is available, it plans the complete frame before recording the full-target clear and source-order blits, so a later stale handle or planning rejection cannot submit an accepted visible prefix.OmegaAppkeeps its existing project-generated diagnostic image on the full-source, full-target,ContainplusNearestdefault and retains its separate handle solely for explicit release. A clean MSVC build rebuilt seven translation units with zero warnings and errors. The focused portable executable passed once and through 100 additional repetitions, and the default suite passed 20/20. One initial plus 20 repeated public zero-file GPU smokes all passed ondirect3d12; every run ended with exactly three uploads and 640 cumulative logical bytes, three releases, two submitted blit frames containing four successful draws, one clear-only submission, one stale-list rejection, zero unavailable-swapchain submissions, and zero residual residency. The opt-in GPU configuration passed 21/21 CTests, after which registration was restored to OFF and the default listing to 20 tests. A public two-frame D3D12openomegasmoke also passed with deterministic dummy audio. Publication CI is tracked separately from these local validation claims. This proves bounded project-owned crop/fit/filter command validation, planning, and SDL submission, not framebuffer pixel identity or readback, arbitrary backend-failure atomicity, alpha or blending semantics, or retail draw order, source/target coordinates, filtering, clear/composition, placement, visibility, camera, material, texture, mesh, or gameplay meaning. It establishes noTextureStorageIR/AssetServicebridge, TDX plane/palette or display expansion, measured GPU-byte accounting, streaming/eviction, asynchronous upload/rendering, residency pins, or fence design. - E-0048 adds packet-owned project clear policy through
RenderClearColorRgba8. The generic value defaults to{0, 0, 0, 0}, whilekDefaultRenderClearColorand a defaultRenderFramePacket::clear_colorare{4, 5, 10, 255}. Every unsigned-byte channel combination is valid. Before GPU command-buffer acquisition,SdlGpuHostmaps each channel to SDL asbyte / 255.0and uses that same value for both an empty-list clear and the full-target clear preceding source-order blits. This removes the host pulse and draw-list-dependent fixed colors;OmegaAppexplicitly selects the named default. The final regenerated MSVC build completed with zero warnings and errors. The focused portable executable passed once plus 100 repeated runs, and the default suite passed 20/20. One initial plus 20 repeated public zero-file GPU smokes passed ondirect3d12; every run retained the exact three-upload/640-byte, three-release, two-blit-frame/four-draw, one-clear-only, one-stale-rejection, zero-unavailable, and zero-residual snapshot. The opt-in configuration passed 21/21 CTests, then was restored to OFF with 20 default tests. A public two-frame D3D12openomegasmoke passed with dummy audio. Publication CI is tracked separately from these local validation claims. Frame submission counters, complete-list preflight, planning, submit-on-unwind, and failure ordering are unchanged. The clear value is an in-process renderer-neutral policy, not a stable ABI, serialized or persistent value, or retail semantic. It establishes no framebuffer pixel identity, readback, color-space, alpha, blending, display-expansion, or asset-service/storage bridge claim. - E-0049 adds a private friend-only
SdlGpuHostTestAccessseam for a synchronous synthetic clear readback. An empty packet clears a temporary 2x2R8G8B8A8_UNORMcolor target through the sameRecordClearPassused by production rendering, downloads its tightly packed 16 bytes, submits with a fence, waits, maps, explicitly decodes four owned RGBA8 values, and unmaps/releases every SDL resource through guards. The probe changes no production counter or texture residency. The public zero-file smoke reads back endpoint colors{0, 255, 0, 255}and{255, 0, 255, 0}exactly from all four pixels. A nonempty draw list is rejected before SDL/GPU work with exact errorclear readback requires an empty draw list; accepted and rejected probes both preserve the complete host snapshot. A clean incremental MSVC build issued four compile requests with zero warnings or errors. One initial plus 20 repeated public zero-filedirect3d12GPU smokes passed; every run preserved the established production totals of three uploads/640 cumulative logical bytes, three releases, two blit frames/four draws, one clear-only submission, one stale rejection, zero unavailable submissions, and zero residual residency. Default CTest passed 20/20. The opt-in configuration passed 21/21, was restored to OFF, and listed 20 default tests. A public two-frame D3D12openomegasmoke passed with dummy audio. Publication CI is tracked separately from these local validation claims. E-0049 confirms only the two synthetic endpoint values in a temporary offscreen target on the observed D3D12 path. It establishes no stable public readback API or exposed SDL handle; no swapchain, on-screen, presentation, sRGB/HDR, color-space, or intermediate-value rounding guarantee and no guarantee for untested values; no alpha interpretation, blending, or composition semantics beyond the exact tested 0/255 alpha bytes; no blit/filter or other backend pixel guarantee; no arbitrary backend- failure atomicity or production asynchronous queue/pin/fence contract; and no stable ABI, serialization, persistence, wire/plugin, measured GPU-memory, streaming/eviction, display-expansion, asset-binding, retail-rendering, or gameplay semantic. - E-0050 adds a private friend-only synchronous blit-readback seam over a fixed synthetic 4x4
R8G8B8A8_UNORMtarget without widening the public renderer contract. An empty draw list fails before SDL/resource work with exact errorblit readback requires a nonempty draw list. For a nonempty list, the seam resolves every generation/backend slot, maps every source crop and filter, and plans every 4x4 destination before allocating the temporary target, 64-byte download buffer, or command buffer. Production rendering and the probe now share filter mapping and the exact source-orderLOADblit recorder, while both retain the shared clear-pass recorder. The public zero-file smoke uploads an opaque endpoint 2x2 source laid outR G / B W, clears to opaque black, applies one top-row Contain+Nearest blit and one later bottom-left Stretch+Nearest overwrite, then reads back exactly the sixteen row-major RGBA8 pixelsKKKK/RRBG/RRBG/KKKK. Accepted and rejected probes preserve the complete host snapshot, and releasing the probe restores empty portable/backend residency before the existing A/B/C flow. The corrected MSVC build completed with zero warnings or errors. Default CTest passed 20/20. One initial plus 20 repeated public zero-file GPU smokes passed ondirect3d12; every run ended with exactly four uploads/656 cumulative logical bytes, four releases, two production blit frames/four draws, one clear-only submission, one stale rejection, zero unavailable submissions, and zero residual residency. The opt-in configuration passed 21/21, was restored to OFF, and listed 20 default tests. A public two-frame D3D12openomegasmoke passed with dummy audio. Publication CI is tracked separately from these local validation claims. This endpoint-only fixture confirms the two tested crops/plans, command order, load preservation, and sixteen exact opaque RGBA8 pixels on the observed D3D12 path. It is not a public readback API and establishes no general Nearest, Linear, crop, aspect, rounding, sample-center, edge, border, Contain, Stretch, flip, cycle, mip, layer, alpha interpretation, blending, sRGB/HDR, color-space, presentation, swapchain, asynchronous lifetime, cross-backend, retail-rendering, asset-binding, or gameplay guarantee. - E-0051 changes no production/runtime code or public interface. The added smoke fixture uses the
existing private offscreen probe with two simultaneously resident synthetic sources. A's first
texel from its 8x8 source is stretched over the fixed 4x4 target, then B's first texel from its
4x8 source overwrites the center 2x2. Exact colors A=
{32, 192, 224, 255}and B={224, 80, 32, 255}produce the exact row-major fixed-4x4 gridAAAA/ABBA/ABBA/AAAAwith source-orderLOADblits on the observeddirect3d12path. The complete host snapshot remains unchanged, and the production packet is reset before the existing A/B submission flow. This closes only E-0050's same-handle fixture gap by confirming that the two tested commands select their respective live generation/backend texture. The one-file MSVC build completed with zero warnings or errors. Default CTest passed 20/20. One initial plus 20 repeateddirect3d12GPU smokes passed with unchanged exact totals of four uploads/656 cumulative logical bytes, four releases, two production blit frames/four draws, one clear-only submission, one stale rejection, zero unavailable submissions, and zero residual residency. The opt-in configuration passed 21/21, was restored to OFF, and listed 20 default tests. A public two-frame D3D12openomegasmoke passed with dummy audio. Publication CI is tracked separately. This proves only the two tested handles, first-texel crops, colors, commands, and fixed 4x4 result. It establishes no arbitrary multi-texture, slot/generation, crop, target, Stretch, Nearest, interpolation, edge, aspect, rounding, Linear, Contain, alpha, blending, color-space, swapchain, asynchronous-lifetime, cross-backend, asset-binding, retail-rendering, or gameplay guarantee. - E-0052 adds a bounded, move-only
InputTraceRecorderand immutableInputTracefor in-process post-binding logical snapshot capture.Createaccepts a synthetic capacity of 1 through 65,536 frames whose contiguousuint64_trange cannot overflow and one nonempty, strictly ascending, unique schema of at most 64 logical actions. It validates configuration before schema before allocation and, after E-0117's packed-pointer extension, pre-sizes private 40-byte records. At the hard maximum, 65,536 record elements plus the fixed 64-slotuint32_tschema backing contain exactly 2,621,696 bytes of element payload. This does not measure excess vector capacity, allocator/object overhead, or process RSS. Allocation-freeAppendobserves a const caller snapshot, captures held/pressed/released masks plus accepted/rejected event counts, and fails atomically in fixed recorder-state, capacity, frame-discontinuity, then schema-mismatch priority. Allocation-free expectedFinishaccepts an open empty recorder and leaves the source inert.FrameAtandActionAtreturn owned values; onlyactions()borrows storage. Recorder use is game-thread exclusive, while a published immutable trace supports reentrant const reads on any thread when no read races its move or destruction. The final MSVC build completed with zero warnings or errors. The focused public zero-file test passed once plus 100 repeated runs, and default CTest passed 21/21. The opt-in Direct3D12 configuration passed 22/22, after which registration was restored toOFFand the default list returned to 21 tests. Publication CI remains separate. This establishes only bounded logical action/schema/counter capture and owned query behavior. It provides no input injection, playback, scheduler timing or pacing, quit/run-control, simulation or gameplay state, replay execution, host event/device capture, serialization, file/wire/stable ABI contract, concurrent recorder use, or retail limit or timing semantics. - E-0053 adds a bounded, move-only
SchedulerElapsedTraceRecorderand immutableSchedulerElapsedTracefor exact caller-supplied scheduler elapsed values.Createvalidates a capacity of 1 through the synthetic hard maximum of 65,536 and a nonoverflowing contiguousuint64_tframe range before allocation, then pre-sizes one privateint64_trecord per slot. At the hard maximum, those record elements contain exactly 524,288 bytes (512 KiB) of element payload. This excludes excess vector capacity, allocator/object overhead, and process RSS. Allocation-free atomicAppendpreserves every signed nanosecond value and fails in fixed recorder-state, capacity, then frame-discontinuity priority. Allocation-free expectedFinishaccepts an open empty recorder and leaves the source inert.FrameAtreturns an owned value. Recorder use is game-thread exclusive, while a published immutable trace supports reentrant const reads on any thread when no read races its move or destruction. A pairedFrameSchedulertest proves direct and trace-retrieved elapsed values produce identical plans, accumulator state, planned-step totals, and dropped-time totals for the tested configuration. The final MSVC build of the signed-nanosecond implementation completed with zero warnings or errors. The focusedomega_scheduler_elapsed_trace_testsexecutable passed once plus 100/100 repeated runs, and default CTest passed 22/22. The opt-in Direct3D12 configuration passed 23/23, after which registration was restored toOFFand the default list returned to 22 tests. The static native dependency gate passed 133 files, and all 204 tooling tests passed. Publication CI remains separate. This establishes no clock source or timestamp accuracy,FramePlancapture or checkpoint restoration, input alignment beyond caller indices, quit/run-control, simulation/gameplay, injection/replay/app wiring, CLI, persistence, file/wire/stable ABI, retail tick rate, or cross-configuration determinism. - E-0054 adds the SDL-free
omega_runtimeRunCaptureSessioncoordinator. It pairs oneInputTracewith oneSchedulerElapsedTraceunder a shared capacity of 1 through 65,536 and a contiguous leaf range that may end exactly atUINT64_MAX.Createallocates input backing before elapsed backing and publishes a session only after both succeed. The exclusive game-thread state machine accepts input followed by either elapsed or terminal input; elapsed uses the internally retained pending input index, while a terminal owns that index plus independent host-quit and logical-quit flags and requires at least one true reason. Errors retain an explicit operation stage, fixed session category, and exact optional leaf code. Phase checks run first, and every failure before a successful transition is atomic. An open empty session may finish; a pending unpaired input rejects finish without consumption. Once valid leaf finalization begins, the session is consumed even if a leaf fails. Session and immutable pair are move-only with nothrow moves and inert sources. Pair trace accessors borrow references, while the optional terminal query returns an owned value. Published pair reads are reentrant on any thread when no read races pair move or destruction. At the hard maximum, the paired input records, fixed action-schema backing, and elapsed records contain exactly 3,145,984 bytes of element payload after E-0117. This excludes excess vector capacity, allocator/object overhead, and process RSS. The final MSVC build completed with zero warnings or errors. The focusedomega_run_capture_session_testsexecutable passed once plus 100/100 repeated runs; default CTest passed 23/23. The opt-in Direct3D12 configuration passed 24/24, was restored toOFF, and left 23 tests in the default list. The static native dependency gate passed 136 files, and all 204 tooling tests passed. Publication CI remains separate. This is capture coordination only. It adds noOmegaAppwiring, clock measurement, scheduler/RunResult/checkpoint capture, host quit detection beyond caller-supplied flags, CLI, simulation/render/audio work, persistence/file/wire/stable ABI, injection/playback/replay, external-failure rollback, concurrent session use, tracker-wide exhaustion guarantee, or retail limit, timing, or determinism claim. The separately publishedInputTracker::next_frame_index()accessor is future app-integration support, not coordinator behavior; E-0055 must preflight a planned capture ofNframes withN, notN - 1, before tracker-index wrap. - E-0055 adds owned scheduler snapshots and finite captured app runs.
FrameScheduler::Snapshotcopies configuration, accumulated remainder, and lifetime planned-step and dropped-time totals; it adds no restore or delta API. Planning rejects negative limits before limits above 65,536. A zero-frame plan creates capacity-one empty traces at any next index. PositiveNrequiresN <= UINT64_MAX - next_frame_index, intentionally usingNso the following tracker index remains representable. Move-onlyRunCaptureOutcomeowns the requested limit, partialRunResult, completion, before/after scheduler states, optional failure text, and an optional trace pair.OmegaApp::RunandRunWithCaptureshare one loop, preserving ordinaryRun. Capture preallocates before logging, clock sampling, or mutation. Zero capture performs no event, clock, scheduler mutation, simulation, render, audio, job, or log work. Each active frame capturesEndFrameinput first, retains both independent quit flags on terminal input, or captures the exact raw elapsed value before the sameBeginFrame. Only planning or session creation returns outerunexpected. Loop operational and capture failures publish nontransactional partial outcomes and best-effort traces. The CLI andmainremain unchanged and use ordinaryRun. The clean MSVC build completed with zero warnings or errors.omega_core_testspassed.omega_run_capture_testspassed once plus 100/100 repeated runs; default CTest passed 24/24. With Direct3D12 and dummy audio,omega_app_capture_smokepassed once plus 20/20 repeated runs. Its unowned-draw fixture forced the real render-error path, which retained one paired input/elapsed sample, zero rendered frames, owned failure text, and the exact scheduler boundary; the next capture then resumed successfully. The public zero-fileopenomega.exe --frames=2path also succeeded with two rendered and input frames and equal planned and executed steps. GPU CTest passed 26/26. Registration was restored toOFFwith 24 default tests. The dependency gate passed 140 files, all 204 tooling tests passed, and Python compile-all passed. Publication CI remains separate. This adds no capture CLI, replay, input/playback injection, restore, persistence, serialization, stable ABI, simulation checkpoint, RNG state, fake services, rollback, ordinaryRuntracker exhaustion guarantee, or retail timing or determinism claim. - E-0056 adds an explicit finite-capture command without changing ordinary finite runs.
The exact once-only
--capture-runflag requires an explicit--frames=Nin the synthetic range 1 through 65,536. Without the flag, existing--frames=0and values above 65,536 retain their ordinary parser behavior; capture cannot compose with--probe-only, and help remains standalone. Only the explicit flag routesmainthroughRunWithCapture; all other runs still call ordinaryRun. A captured command prints the ordinaryRunResultcounters, aggregate trace-pair presence and frame counts, optional terminal metadata, and selected absolute before/after scheduler counters derived from snapshots. These counters are not complete snapshots or deltas. The testedIsCompleteRunCaptureOutcomehelper fails closed unless a positive request ends at the frame limit with no failure, quit, or terminal; exact run/input/trace counts and capacities; matching trace origins; and equal planned and executed steps. A portable process contract verifies exact zero-frame and invalid-capture exit/output behavior without entering the host loop. The opt-in GPU test uses an exit-code-safe CMake wrapper before checking the two-frame run, aggregate trace, and scheduler summaries. The clean incremental MSVC build completed with zero warnings or errors.omega_core_testspassed.omega_run_capture_testspassed once plus 100/100 repeated runs; default CTest passed 25/25. With Direct3D12 and dummy audio, GPU CTest passed 28/28, including the capture CLI smoke. Registration was restored toOFFwith 25 default tests. The dependency gate passed 140 files, all 204 tooling tests passed, and Python compile-all passed. Publication CI remains separate. This adds no capture files, persistence, serialization, wire format, stable ABI, per-frame printing, replay, injection/playback, restore or delta interpretation, checkpoint, RNG state, rollback, interactive or zero-frame capture command, probe composition, ordinary-above-65,536 execution claim, or retail timing or determinism semantics. - E-0057 adds the SDL-free
omega_runtimeRunCaptureReplaySession. The concrete move-only session owns one movedRunCaptureTracePairand advances one exclusive game-thread cursor.Createvalidates both leaf traces, shared capacity and origin, normal-versus-terminal frame counts, and terminal reason/index before moving; rejection leaves the caller's pair unchanged. Every successfulNextpublishes aRunCaptureReplayFramethat reconstructs the exact recorded logical state as an owned immutableInputSnapshot, including its frame index, schema, held/pressed/released masks, and accepted/rejected event counts. A normal frame owns the exact signed elapsed value; a terminal frame owns the independent host-quit and logical-quit flags instead, so a frame never exposes both.InputSnapshotreconstruction allocation or defensive trace-read failure leaves the cursor unchanged. Exhausted and moved-from sessions report distinct complete and invalid-state errors.RunCaptureOutcome::TakeTracePairis rvalue-only and transfers its optional trace pair while normalizing the whole outcome to the same inert state used after move construction, including when no pair exists. This is bounded in-process replay data access only. It adds no SDL,OmegaApp, or CLI replay route; input injection orInputTrackermutation; synthetic physical events; scheduler creation, feeding, pacing, clocking, or state restoration; simulation checkpointing, RNG restoration, or world mutation; render, audio, or job work; persistence, serialization, file/wire/stable ABI, or cross-process contract; seek, rewind, looping, rollback, or retail timing or determinism claim. - E-0058 adds the portable app-layer
RunReplaySession. The move-only session takes one validated capture pair only after it has created a fresh scheduler from caller-supplied synthetic timing configuration and a fresh empty simulation world with the same fixed step. Each successfully published normal replay frame feeds its exact signed elapsed value to that scheduler and executes every planned simulation step. Separate session observers return owned scheduler and simulation snapshots. A terminal frame completes without changing either subsystem. A lower replay read or reconstruction failure leaves the app session, scheduler, and world unchanged so the same frame can be retried. The defensive representation branch is unreachable under the current 65,536-frame, 64-step-per-frame, and one-second-step bounds. If those bounds expand and it is reached, consumed replay/scheduler work and earlier world steps make it a permanent failed state. This is replay into a fresh synthetic timeline, not restoration of the captured app. Reconstructed input is observable but is not injected into the world. There is no existing-OmegaAppreplay, host-event synthesis, captured scheduler/world checkpoint, entity or RNG restoration, pacing or clock ownership, rendering, audio, jobs, persistence, file/wire/stable ABI, cross-process compatibility, seek, rewind, loop, rollback, or retail timing or determinism claim. - E-0059 adds the exact once-only
--replay-capturelaunch flag for one-process finite capture and immediate fresh replay. It is valid only with--capture-runand its explicit--frames=Nrange of 1 through 65,536; token order does not change those dependencies.mainfirst performs the existing capture and accepts replay only when the capture is complete and consistent, has no terminal frame, and began from a scheduler whose counters and remainder were all zero. Only after those checks does rvalue extraction transfer the trace pair and normalize the capture outcome. Replay then creates a fresh scheduler from the captured starting configuration and a fresh empty world, consumes every elapsed frame on the main thread, and compares replay aggregates, the final scheduler state, and the fresh world's final clock and empty-entity state with capture results. Any mismatch or replay error fails the process immediately. Success alone prints one fixedOpenOmega fresh replay:aggregate line withreplayed_frames, planned and completed simulation steps, clamped and dropped frame counts, andcompletion=complete. Ordinary runs and capture-only commands retain their prior behavior. This does not replay into the existingOmegaApp; after capture, the main-thread replay orchestration makes no calls into or reads from it. The host remains alive, so its audio callback may continue independently.RunReplaySessionitself performs no pacing, clock sampling, rendering, audio, or job work. The command adds no terminal or incomplete CLI replay, input injection or world input use, gameplay reconstruction, captured scheduler/world state, entity or RNG restoration, persistence, file/wire/stable ABI, cross-process contract, seek, rewind, loop, rollback, or retail timing or determinism claim. - E-0060 adds the first input-driven native simulation component without assigning retail meaning.
For captures with the new movement schema, it supersedes E-0059's empty-world and no-world-input
clauses; older replay callers remain neutral by default.
SimulationWorldnow directly owns a bounded, preallocatedPosition3store and can create, query, clean up, and translate one positioned entity as part of an allocation-free fixed-step transaction. Clock exhaustion, stale identity, absent position, and signed coordinate overflow are typed failures that leave the complete attempted step unchanged; the original no-input step remains the neutral wrapper. A separate SDL-freeomega_gameplayvalue maps only the synthetic digital domain-1/0/1to one signed project unit on the X/Z axes.OmegaAppowns one synthetic diagnostic actor and binds W/S/A/D plus the arrow keys to held movement actions; the gamepad D-pad is an optional alias. The same immutable command is applied to each fixed step planned for that input frame.RunReplaySessioncan opt into the identical input-to-world path; its default stays neutral for old callers, while the finite capture/replay CLI enables it only when all four synthetic action identifiers are present. The establishedOpenOmega fresh replay:output line remains unchanged. Synthetic tests verify exact movement, release, and terminal outcomes, while the real-host smoke compares the captured app and fresh-replay positions; the CLI itself validates only fresh replay ownership, aggregates, scheduler state, clock, actor count, and position presence, and still never reads the live app after capture. This diagnostic actor is not the retail player. Its identifiers, bindings, origin, axes, integer unit, step rate, and diagonal policy establish no retail controls, coordinates, movement, physics, collision, camera, animation, mission, network, asset, or rendering semantics. - E-0107 gives that synthetic actor one bounded project-owned presentation only while
DiagnosticPlayis active. A pureconstexpr/noexceptplanner maps an ownedPosition3copy into a half-open normalized-Q16 marker rectangle: the origin is centered, every marker is 2,048 by 2,048, each synthetic X/Z unit moves 1,024, X increases right, Z increases up, Y is ignored, and X/Z saturate independently to[-31, 31]before arithmetic.OmegaApppreloads one opaque 1x1 RGBA8{255,64,224,255}texture, adding exactly one texture slot and four logical resident bytes. After simulation it rebuilds only the fixed CPU base-plus-marker draw list, using Stretch plus Nearest; it performs no frame-time upload, texture update, or release. Fresh replay derives the same optional Q16 destination from its existing owned diagnostic position without a capture-schema change or retained marker state. This overlay, mapping, color, extent, axes, clamp, composition, and error policy are native diagnostics, not retail actor/player, coordinate, camera, transform, level-placement, collision, visibility, animation, or rendering-equivalence evidence. No proprietary or owner input is consumed. - E-0061 begins with a portable project-owned diagnostic-menu value and deterministic 128x72
opaque RGBA8
DEVcard. The pure toggle-edge reducer and integer-only image generator use no files, platform APIs, decoded assets, or retail inputs. The complete 36,864-byte output contains four project-authored colors and is frozen by FNV-1a-640xdaf00c60d17f05b5. Action 6 is reserved only; this first slice is not bound to a physical control, uploaded to the GPU, rendered, serialized, or replayed. It establishes no retail menu art, text, palette, layout, controls, navigation, selection, activation, pause behavior, timing, asset provenance, or UI semantics. - E-0062 wires that project diagnostic value into
OmegaApp: keyboard F1 and gamepad Start feed logical action 6 as a press edge. The toggle is processed after terminal handling and remains nonmodal, so a nonterminal toggle frame continues through the existing movement, simulation, and rendering path. Startup generates and uploads the 128x72 card once, then retains fixed hidden/base and visible/base-plus-menu draw lists. The menu blit uses Q16 source{0,0,65536,65536}, exact Q16 destination{2048,2048,26624,15872},Stretch, andNearest; frames select one prebuilt list without another menu upload or per-frame draw-list allocation. Capture retains action 6 in the ordinary input row, including a terminal row, but terminal input does not mutate menu visibility. Fresh replay preserves that input row while owning no menu state, and the establishedOpenOmega fresh replay:success line is unchanged. This remains synthetic developer UI and establishes no retail menu, control, pause, navigation, rendering, timing, or replay semantics. The clean MSVC build completed with zero warnings or errors. The focused portable test passed; the real D3D12 host smoke passed directly plus 20/20 repetitions; default CTest passed 29/29; the opt-in GPU matrix passed 33/33; and the unchanged capture/replay CLI smoke passed 20/20. Runtime-off validation built and ran the exact portable menu target and registered 26 tests. Static dependency, tooling, compile-all, and public-tree gates also passed. The exact E-0062 main tree subsequently passed the Windows x86-64 native, Linux x86-64 native, and public-tree safety publication-CI jobs. - E-0063 makes the project diagnostic menu the explicit native startup state while retaining a
safe default. Default construction yields
DiagnosticPlayonStartDiagnosticPlay, andOmegaAppexplicitly starts inMainMenuon that first row. The constexpr/noexcept reducer validates both enums before consuming press edges; invalid state resets directly to the startup value. Existing actions 2/3/6 remain W/S plus gamepad D-pad Up/Down and F1 plus gamepad Start. Primary has priority, opens row zero from play, enters play from the first menu row, and is inert on the two reserved project rows. Previous/next clamp, and simultaneous navigation edges are neutral. Capture and terminal handling remain before the reducer, while ordinary menu frames remain nonmodal for held locomotion, scheduling, simulation, rendering, and fresh replay. Replay reconstructs the ordinary action rows but owns no menu state. Startup reuses the one existing 128x72 card upload and retains one hidden/base list plus three immutable base/card/amber-marker lists. The card uses source{0,0,65536,65536}and target{2048,2048,26624,15872}. The marker reuses card crop{18432,9103,59392,14563}at row targets{3584,7424,4352,9344},{3584,10304,4352,12224}, and{3584,13184,4352,15104}, withStretch/Nearestthroughout. Frames select a prebuilt list without another upload, list construction, or per-frame menu allocation. These modes, rows, reused controls, priorities, crop, and targets are synthetic and establish no retail menu, control, pause, activation, timing, persistence, replay-UI, private-input, or PCSX2-equivalence claim. E-0063 local validation used project-generated zero-file fixtures only and no private inputs. A clean incremental MSVC build completed with zero warnings and errors. The focused portable executable passed directly plus 20/20 repetitions, and the realdirect3d12host smoke passed directly plus 20/20 repetitions. Default CTest passed 29/29 both before and after restoring GPU registration; the opt-in GPU configuration passed 33/33. The unchanged capture/replay CLI smoke passed 20/20. Runtime-off validation built and ran the exact portable menu target directly and through CTest, with 26 tests registered. The native dependency gate checked 152 files, all 209 tooling tests passed, Python compile-all passed, and the public-tree gate checked 239 indexed text blobs. Publication CI remains separate and is not claimed here. - E-0064 replaces the card's geometric-only presentation with readable project-authored 3x5 labels:
OPEN OMEGA,W/S SELECT,F1 START,ESC QUIT,START DIAGNOSTIC, and the twoRESERVED SLOTrows. The card remains a generated 128x72 opaque RGBA8 image with no external font or asset input. Host ownership is unchanged: startup performs one menu-texture upload, retains the same hidden list and three base/card/amber-marker lists, and selects a prebuilt list per frame without another upload, list construction, or menu allocation. The resulting menu state now gates only app-layer simulation. On each nonterminal live frame, input capture and menu reduction happen before the gate: a validDiagnosticPlaystate supplies actual elapsed time to the scheduler, whileMainMenuor an invalid state supplies zero and skips locomotion planning and world steps. Entering the menu freezes that same frame; entering diagnostic play resumes that same frame, and the live clock baseline still advances while modal, so menu wall time is not replayed as catch-up work. Capture stores the actual measured elapsed value rather than the gated zero. Input pumping/capture, rendering, audio, and job-service boundaries continue while the menu is modal.RunReplaySessionConfigcan optionally own an initial diagnostic-menu state and applies the same reducer-before-gate rule to reconstructed rows. Its default remains no menu state, preserving the legacy nonmodal replay contract; the finite capture/replay route explicitly supplies the native startup state without changing CLI syntax or output. No action ID or binding, input/trace schema, captured checkpoint, serialization, or CLI surface changes, and no menu state is inferred from or embedded in a capture. These labels and modal rules remain synthetic project diagnostics, not a retail-menu, timing, pause, persistence, or PCSX2-equivalence claim. E-0064 local validation is green: the final incremental MSVC build was warning-free; the portable diagnostic and replay tests each passed directly plus 20/20 repetitions; the real Direct3D12 host smoke passed directly plus 20/20 repetitions; default CTest passed 29/29 before and after the opt-in 33/33 GPU matrix; and the capture/replay CLI passed 20/20 repetitions plus one 20-frame run. The exact runtime-off portable target and focused CTest passed with 26 tests registered. The native dependency gate checked 152 files, all 209 tooling tests passed, Python compile-all passed, and the public-tree gate checked 239 indexed text blobs. Publication CI remains separate and is not claimed here. - E-0065 replaces main-menu row one with
CONTROLSand adds the syntheticDiagnosticMenuMode::Controlsvalue without adding an action or retail meaning. The explicit startup state remainsMainMenu/StartDiagnosticPlay, the safe default remainsDiagnosticPlay/StartDiagnosticPlay, and invalid mode or row bytes reset to startup before consuming an edge. Primary still has reducer priority: main row zero enters diagnostic play, main row one enters Controls while retaining row one, main row two is inert, any valid DiagnosticPlay row returns to main row zero, and any valid Controls row returns to main row one. Previous/next navigation is MainMenu-only, clamped, press-edge-only, and neutral when simultaneous. Only a fully valid DiagnosticPlay state permits simulation; MainMenu, Controls, and invalid states remain modal while input/capture, rendering, audio, and jobs continue. The main card now labels row oneCONTROLS. A second independent project-generated 128x72 opaque RGBA8 card labelsCONTROLS,W FORWARD,S REVERSE,A LEFT,D RIGHT,F1 RETURN, andESC QUIT. The main image has exact background/cyan/slate/amber populations 3,739/1,491/3,506/480 and FNV-1a-640x5303b94979cd74d6; the Controls image has 2,104/1,326/5,373/413 and FNV-1a-640xa68873cc7444bdf6. Startup uploads both generated cards once. In the zero-file host that is exactly two uploads and 73,728 resident logical bytes. Retained Controls presentation contains the optional base diagnostic draw followed by one controls-card draw; main-menu presentation retains the optional base draw, main card, and row marker. Teardown clears every retained list before releasing controls, menu, and optional base textures. Live and opt-in replay use the established reducer-before-gate rule, discard modal elapsed from scheduling without later catch-up, and resolve terminal input before reduction. Null replay menu ownership remains legacy nonmodal. Action IDs and bindings, input/elapsed trace schemas, captures, checkpoints, serialization, CLI syntax/output, and file/wire/stable-ABI surfaces do not change. E-0065 validation used only public, project-generated zero-file fixtures. The final MSVC build was clean; diagnostic and replay tests passed directly plus 20/20 repetitions; the Direct3D12 host passed directly plus 20/20; default CTest passed 29/29, the opt-in GPU matrix passed 33/33, and restored-default CTest passed 29/29. A 20-frame capture/replay passed, as did 20/20 short repetitions. Runtime-off focused direct and CTest runs passed with 26 registrations. The native dependency gate checked 152 files, all 209 tooling tests passed, Python compile-all passed, and the public-tree gate checked 239 indexed text blobs. During validation, three test-onlySimulationStateC2676 comparisons were corrected to the fieldwise helper; a direct configure outsidevcvarsalso contaminated generated cache settings, which were restored to the exact MSVC linker, archiver, and flags without a source change. No private data, disc image, retail executable, emulator, or PCSX2 input was used. This establishes only synthetic developer UI and no retail menu, controls, pause, timing, persistence, private-input, or emulator-equivalence semantics. Publication CI remains separate and is not claimed for E-0065. - E-0066 adds a portable, metadata-only canonical
TextureStorageIRtoruntime::DebugImageadapter. It is not connected toOmegaApp,AssetService, GPU upload, or the retail TDX decoder.BuildTextureStorageTopologyDebugImageborrows one already-canonical value, validates it in a strict typed order under independent block, plane, palette-entry, and output-byte budgets, and returns a fully owned image without I/O or shared state. Source-order blocks occupy 32x32 tiles with at most eight columns. Opaque background and slate borders frame cyan 2x2 sample/transfer-enum masks (0x1,0x9,0x7,0xf); palette presence adds one amber plus. After validation, only block order, sample and transfer encodings, and palette presence can affect pixels. Plane and palette bytes and dimensions are validation inputs, not display data. The canonical three-block fixture is 96x32 RGBA8 (12,288 bytes), has exact background/slate/cyan/amber populations 2,667/372/23/10, and FNV-1a-640xb56c8db088c5a9fe. The adapter is reentrant and safe for any worker thread. It establishes no retail pixel expansion, display/channel/alpha/nibble/swizzle/palette interpretation, material or geometry binding, or app/render behavior. MSVC configure, focused-target, and full builds were clean with zero warnings or errors; the executable passed directly and 20/20 repetitions, focused CTest passed, and default CTest passed 30/30. Runtime-off direct and focused checks passed with 27 tests registered. The dependency gate checked 155 native files, all 209 tooling tests passed, and Python compile-all passed, and the final staged-tree public gate checked 242 indexed text blobs. Validation used no private data, D-drive content, disc image, retail executable, emulator, or PCSX2 input. Publication CI remains separate and unclaimed. - E-0067 verifies the first complete public-fixture composition of the existing texture asset path
with that topology adapter, without adding a production binding. Two generated direct-24 TDX
members contain deliberately different payload bytes and load asynchronously through
LevelTextureStore,JobService, andAssetService. Their ready immutableTextureAssetView::storagevalues each produce one owned 32x32 RGBA8 topology tile with 4,096 bytes, and the two images are pixel-identical because payload bytes are not topology inputs. Both asset handles then release to an exactly empty two-slot snapshot while both independent images remain intact. This is a test-only ownership and composition proof:OmegaApp, startup selection, GPU upload, material/geometry association, and retail display expansion remain unwired. - E-0068 turns main-menu row two into a zero-file, project-owned
ASSET TOPOLOGYscreen without selecting a retail asset. The additiveAssetTopologymode is byte 3 and row-twoShowAssetTopologyremains byte 2. Primary enters the screen from row two and returns every valid topology state to that row; the screen is modal under the existing live/replay reducer-before-gate rule. The updated 128x72 main card has exact background/cyan/slate/amber populations 3,739/1,481/3,516/480 and FNV-1a-640xf37b700c33071a92.BuildProjectDiagnosticAssetTopologyImagecreates the exact public E-0066 three-block fixture before SDL/platform creation and returns its owned 96x32, 12,288-byte image with populations 2,667/372/23/10 and FNV-1a-640xb56c8db088c5a9fe; allocation failures stay in the existing typed topology-error contract. After host creation, startup uploads the topology texture after the menu and controls cards and builds one immutable optional-base-plus-topologyContain/Nearestlist. Zero-file startup therefore owns three uploads, three resident textures, and 86,016 logical bytes. Teardown clears every retained list, then releases topology, controls, menu, and optional spatial textures in reverse upload order. Real Direct3D12 testing freezes sixteen topology texels and the complete entry/hold/release/terminal/return modal lifecycle without adding a per-frame upload or allocation. No action/binding, capture/replay schema, CLI, asset-service, decoder, material, geometry, or retail display behavior changes. - E-0069 adds conventional confirmation aliases without changing the logical input contract.
Keyboard Return, keypad Enter, and gamepad South join F1 and gamepad Start as five physical
bindings for the existing action 6. The complete host table is 15 physical bindings over the
unchanged six sorted logical actions. Existing first-down/last-up tracking means a second alias
cannot repeat a press and one release cannot end action 6 while another alias remains held.
Capture still records one action-6 row without physical provenance, and replay consumes that row
through the unchanged reducer, terminal-before-reducer order, and modal elapsed gate.
The generated legends now read
F1/ENTERandF1/ENTER RETURN. The main card's exact background/cyan/slate/amber populations are 3,725/1,495/3,516/480 with FNV-1a-640x0a1373c69c8bcce2; the Controls card's are 2,104/1,381/5,318/413 with FNV-1a-640xd57a5b0500696505. Dimensions, full opacity, three uploads, three resident textures, 86,016 logical bytes, draw lists, topology raster, failure ordering, and teardown remain unchanged. These project-owned aliases and labels establish no retail input map or platform-specific button-name claim. - E-0070 adds conventional vertical-navigation aliases without expanding the logical input
contract. Keyboard Up joins W and gamepad D-pad Up on existing action 2; keyboard Down joins S
and gamepad D-pad Down on action 3. The complete host table is now 17 physical bindings over the
unchanged six sorted actions. First-down/last-up aggregation prevents a second same-action alias
from repeating navigation and prevents a non-final release from ending the action. Because the
menu intentionally reuses the synthetic forward/reverse actions, Up/Down also drive that
project-owned diagnostic locomotion while in DiagnosticPlay; this is not a retail control claim.
The legends become
W/S/UP/DOWN,W/UP FORWARD, andS/DOWN REVERSE. The fully opaque main card's background/cyan/slate/amber populations are 3,702/1,518/3,516/480 with FNV-1a-640x9a4662f8f943521d; the Controls card's are 2,104/1,452/5,247/413 with FNV-1a-640xcfa7cc57696aae0a. Dimensions, topology pixels, action rows, reducer rules, modal timing, draw lists, three-texture 86,016-byte residency, failure ordering, and reverse teardown remain unchanged. These aliases establish no retail menu, key-repeat, wrapping, or controller behavior. - E-0071 makes the existing content-startup ownership boundary explicit before the native host
allocates or touches platform state. A nonallocating
noexceptclassifier accepts only an empty state (NoContent),GameDataServicealone (DataMounted), or the complete five-owner level state (LevelContent); every partial or mixed shape is rejected.OmegaApp::Createperforms this check before owning config/content, creating logs/jobs/scheduler/input/simulation/topology, or touching SDL, audio, or GPU state, and reports the fixedcontent startup state: inconsistent-ownershiperror on rejection. The generated main card now labels the copied startup stage asCONTENT NONE,CONTENT DATA, orCONTENT LEVEL. The three opaque images have exact background/cyan/slate/amber populations 3,593/1,627/3,516/480, 3,600/1,620/3,516/480, and 3,594/1,626/3,516/480, with FNV-1a-64 values0x8e8e3f7fff4f971a,0x517ad52bbf1fbe61, and0x08405186aa105db1. Invalid stage enum values render theNoContentcard. Controls remains0xcfa7cc57696aae0a, topology remains0xb56c8db088c5a9fe, and no action, reducer, capture/replay, file, schema, asset decoding, retail presentation, or platform lifecycle contract changes. - E-0072 adds a borrowed
DescribeContentStartupErrorpresentation adapter for the existing all-or-error startup boundary. It accepts only the four representations thatStartContentpublishes:InvalidOptionsandDebugImagewith no nested error,GameDatawith only itsGameDataError, andLevelTextureswith only itsLevelTextureStoreError. Empty messages, unknown outer or nested codes, missing or unexpected nested errors, and both-nested shapes fail closed to the fixed process diagnosticcontent startup [inconsistent-error]: content startup error representation is inconsistent. Valid output is byte-for-byte unchanged and borrows the outer message. The underlying name functions retain their stableunknownfallback even though the adapter rejects those values. A CMake-created empty root now fixes the pre-SDL process contract atcontent startup [missing-required-file]: game-data root is missing SYSTEM.CNF. This synthetic error-presentation seam adds no retry, picker, fallback, persistence, menu, resource, asset, capture/replay, schema, or retail-input behavior. Focused and full MSVC builds were clean;omega_core_tests, the process contract, and 30/34/30 default/GPU/restored CTest matrices passed. Runtime-off checks retained 27 registrations, the dependency gate checked 157 native files, all 209 tooling tests passed, and Python compile-all passed. Publication remains unclaimed. - E-0073 gives valid no-level startup states a visible synthetic
DiagnosticPlaysurface without changing the level-content path.BuildProjectDiagnosticNoLevelImageindependently owns one opaque 128x72 RGBA8 image and reads no file, platform object, decoded asset, or retail input. It draws the existing frame andOPEN OMEGAheader withDIAGNOSTIC PLAY,NO LEVEL IMAGE,F1/ENTER MENU, andESC QUIT; its exact background/cyan/slate/amber populations are 3,327/1,285/4,124/480 and its FNV-1a-64 is0x37f823d27a4cb3ce. After the existing ownership classifier succeeds,OmegaAppkeeps an owner-supplied level debug image when present and otherwise builds this placeholder. Both flow through the existing diagnostic texture upload, full-source/full-targetContain/Nearestcommand, handle, error, and teardown path. Zero-file upload order is placeholder, menu, controls, topology: four distinct resident textures and exactly 122,880 logical bytes. MainMenu submits base/card/marker, Controls and AssetTopology submit base/card, and no-level DiagnosticPlay submits the one base blit. START DIAGNOSTIC remains available forNoContentandDataMounted; reducer, simulation, locomotion, elapsed, return, terminal priority, capture, and replay behavior are unchanged. Residency totals apply only to no-level startup. This is a project-generated missing-level diagnostic, not a retail UI, level selector, framebuffer-identity, private-input, or emulator-equivalence claim. Focused and full MSVC builds, direct and repeated diagnostic/replay/GPU checks, 30/34/30 default/GPU/restored CTest, capture-replay, runtime-off, dependency, tooling, and compile-all validation passed. Publication remains unclaimed. - E-0074 adds an explicit content launch profile to the existing strict runtime configuration.
content.data_rootplus optionalcontent.level_codeare read only from a selected--configfile and its validated--setoverrides; no neighboring or per-user file is discovered. The effective configuration tuple is validated even when direct CLI content options are present. A direct--data-rootplus optional--levelthen wins atomically and never inherits the configured level. A configured level without a root, an empty/unrepresentable native root, an invalid level, and a defensive malformed direct pair return the stable categoriesmissing-data-root,invalid-data-root,invalid-level-code, andinvalid-optionswith fixed diagnostics that echo no path or invalid level bytes. Valid level codes are the eighteen names decoded from the reference level-name table (analysis/elf/level-name-table.md, E-0129); they are matched without ASCII case sensitivity and normalize to the table's uppercase spelling before the unchangedStartContentboundary. An unknown level fails at the argument or configuration boundary rather than late inside content I/O. With neither content key and no direct root, startup remains zero-file./openomega.cfgis ignored because it can contain a private local path. This slice adds no ambient/default discovery, persistence, picker, filesystem probing in the resolver, asset semantics, retail UI, or emulator-equivalence claim. For the original E-0074 slice, focused and full MSVC builds,omega_core_tests, the process contract, 30/34/30 default/GPU/restored CTest, runtime-off checks with 27 registrations, the 157-file dependency gate, all 209 tooling tests, and Python compile-all passed. E-0129 was initially cross-compiler checked with project MSVC/CMake/CTest explicitly deferred; this integration has since passed serialized MSVC builds and focused CTest for the table, core, and process contracts. Full local and hosted validation remains pending. Publication remains unclaimed. - E-0075 adds an optional per-user default runtime profile without changing the configuration
grammar or content precedence. After successful argument parsing and the help fast path, main
captures only the host-family search roots when
--configis absent. Absolute roots resolve lexically to%LOCALAPPDATA%/OpenOmega/openomega.cfgon Windows,$HOME/Library/Application Support/OpenOmega/openomega.cfgon macOS, and$XDG_CONFIG_HOME/openomega/openomega.cfgor$HOME/.config/openomega/openomega.cfgon XDG hosts. An explicit--configbypasses discovery and inspection. A missing default is silent; a regular default is loaded before validated--setoverrides; and a reported final-entry symlink, dangling symlink, directory, or other non-regular type is rejected without following it. Configuration failures use fixed explicit/default/--setsource categories and never disclose a source filesystem path, user-controlled key, or raw value. Parser diagnostics retain only structural line and budget information; typed runtime diagnostics may name only a compile-time-known public setting. Discovery performs no normalization, canonicalization, token expansion, write, directory creation, migration, or success-path printing. This slice does not claim rejection of symlinked parents, add a picker or startup dialog, choose a default level, or inspect private content. Serialized local validation passed: focused and full MSVC builds completed cleanly; directomega_core_testsand the exact process contract passed; default, opt-in GPU, and restored CTest passed 30/30, 34/34, and 30/30; runtime-off direct and focused checks passed with 27 registrations; the dependency gate checked 160 native files; all 209 tooling tests and Python compile-all passed; and the staged public-tree gate checked 247 indexed text blobs. On Windows, the non-missing inspection-error oracle was explicitly skipped because MSVC maps the available invalid and overlong candidates to not-found. Commit, DCO, publication, and exact-main validation remain unclaimed. The later non-reflective diagnostic hardening passed scoped diff checks, the 244-file dependency gate, the 411-blob public-tree gate, Python compile-all, and all 298 tooling tests. Its C++ build, process contract, and CTest remain delegated to the serialized integration lane because local preflight wasCAUTION. - E-0076 adds one app-private, stateless startup-failure dialog adapter for the already-fatal
pre-SDL runtime-configuration, runtime-settings, content-launch-profile, and content-startup
paths. Main preserves each exact stderr line and exit code, flushes stderr, then best-effort calls
SDL_ShowSimpleMessageBoxwith titleOpenOmega startup error, no parent, and a fixed projected body. The adapter neither initializes nor quits SDL, retains no borrowed input, and owns no global state; suppression reads SDL's cached environment view. Category and detail fields are sanitized with bounded local stack storage into an owned 640-byte result, with 48-byte and 384-byte limits; empty fields use fixed fallbacks and overflow ends in.... Only exactOPENOMEGA_DISABLE_STARTUP_DIALOG=1suppresses presentation, and invalid policy values fail closed as suppressed. CMake supplies that suppression to the existing synthetic process and capture contracts, while the dedicated unit contract exercises only suppressed presentation and verifies that SDL remains uninitialized. Parse/help, the run loop, capture, and replay failures remain console-only. A later hardening step extends presentation to app creation, including SDL/GPU/audio setup, while preserving its exact stderr diagnostic: the dialog uses fixed codeapplication-startupand fixed detailApplication components could not be initialized., so raw backend text never reaches the packaged dialog. The E-0076 baseline validation passed: focused and full MSVC builds; the direct dialog unit and exact process contract; CTest 31/35/31; runtime-off direct and focusedomega_core_testswith 27 registrations and no dialog target; the 163-file dependency gate; all 209 tooling tests; Python compile-all; and the staged public-tree gate checked 250 indexed text blobs. Interactive dialog smoke, commit, DCO, publication, and exact-main validation remain unclaimed. No private or owner files, D-drive content, disc image, executable, emulator, or PCSX2 input was used. - E-0077 adds a stateless startup adapter that selects only canonical
LevelTextureStore::HandleAt(0), loads it through the existing asynchronousAssetService, and feeds the borrowed immutable storage to the existing metadata-only topology raster. It requires exclusive access to an aggregate-empty asset service, rejects an empty inventory, waits only for the accepted asset request, and always attemptsReleasefor an accepted handle before returning an independently owned image. Fixed identity-free diagnostics retain only the applicable typed texture-store, asset-service, or topology-image enum; release failure outranks residual-state mismatch, which outranks an earlier Get or image failure. Entry and final snapshots are captured; after a successfulRelease, all ten public fields are compared while deliberately ignoring the hidden recycled-slot generation.OmegaApp::Createbuilds the resulting 32x32 RGBA8 image only for completeLevelContentbefore SDL creation; the later GPU upload retains the existing fourth-texture path. Its 2x2 fixture base, two 128x72 cards, and topology image total four resident textures and 77,840 logical bytes.NoContentandDataMountedretain the project synthetic 96x32 topology and 122,880-byte presentation. Public generated contracts pin the 32x32 hash, repeat ownership, exact cleanup, bounded and nested failures, canonical-first selection, GPU probes, upload order, draw policy, and unchanged fallback branches. Serialized local validation passed: focused and full MSVC builds; direct asset and D3D12 app smokes; focused asset CTest; default, GPU-opt-in, and restored CTest at 31/35/31; 20/20 repeated D3D12 app smokes; runtime-off direct and focused asset checks with 27 registrations; the 165-file dependency gate; all 209 tooling tests; and Python compile-all. The staged public-tree gate checked 252 indexed text blobs. The merged commit carries its matching DCO sign-off; PR #38 published E-0077 as exactmaincommit2a9182e560a504125a5b8278a7202fcad7220c44, and exact-main run29710089254passed all three jobs. No private or owner files, D-drive content, disc image, executable, emulator, or PCSX2 input was used. This is not a claim about display texels, channel or alpha meaning, palettes, nibble order, swizzles, mip levels, UVs, materials, cells, placement, visibility, geometry, retail rendering, gameplay, streaming, eviction, GPU pinning, asynchronous upload, or emulator equivalence. - E-0078 adds
BuildPacked24TransferDebugImage, a stateless worker-thread diagnostic projection for one strict canonical storage shape: nonzero matching texture/plane rectangles, knownPacked24sample and transfer-element enums, exactly one block and one plane, no palette, and an exactwidth * height * 3source allocation. Checked source/output arithmetic and independent 48 MiB/64 MiB synthetic limits fail closed through sixteen fixed typed errors. Each consecutive three source byte slots is copied into the first three slots of one owned four-slot output group; the fourth slot is the project constant0xff. A generated 16x16 fixture maps 768 source bytes to 1,024 owned bytes with FNV-1a-640x4abb645f50f5a325for seed0x21and0x36590f25eee3ab25for seed0x61. The standalone runtime-off-capable contract freezes every ordinal/name/message, validation priority, independent overflow oracle, exact and one-below budgets, slot mapping, hashes, repeat determinism, and ownership after source mutation and destruction. Serialized local validation passed: focused/full MSVC builds; the direct unit plus 100/100 repeated runs; focused CTest; default/GPU/restored CTest at 32/36/32; runtime-off direct and focused checks with 28 registrations; the 168-file dependency gate; all 209 tooling tests; and Python compile-all. The staged public-tree gate checked 255 indexed text blobs. The merged commit carries its matching DCO sign-off; PR #39 published E-0078 as exactmaincommit47378588471d9271a43dfaeb56f3138c01137e1f, and exact-main run29710670162passed all three jobs. This slice changes no app, GPU, renderer, AssetService, E-0077, or existing test behavior and uses no private or owner files, D-drive content, disc image, executable, emulator, or PCSX2 input. It assigns no channel names, display-ready meaning, row origin/order, swizzle, color space, alpha semantics, premultiplication, block/plane purpose, Packed32/indexed expansion, palette/nibble policy, material/UV/geometry binding, gameplay behavior, or emulator equivalence. - E-0079 freezes the first Windows portable-delivery contract. Only an MSVC x64
Releasebuild may produceOpenOmega-0.1.0-windows-x86_64.zip; that archive must contain exactly one internalOpenOmega-0.1.0-windows-x86_64/root withopenomega.exe,launch-openomega.cmd,README-WINDOWS.md,LICENSE,NOTICE,TRADEMARKS.md,THIRD_PARTY_NOTICES.md, andLICENSES/SDL3.txt. The executable uses the static MSVC runtime for this package. The command launcher changes to its own directory, forwards every argument toopenomega.exe, and preserves the process exit code; the package contract requires exactOpenOmega native shell: rendered_frames=0stdout with empty stderr plus an invalid-option forwarding check from an unrelated working directory. A sibling.zip.sha256sidecar covers the exact archive. This is an unsigned preview, not an installer or signed release, and it deliberately excludes proprietary inputs or assets, PCSX2, user profiles, PDBs, and developer tools. Serialized local validation generated the package and matching SHA-256 sidecar, passed the focused package contract, and observed one canonical root containing exactly two directories and eight files. The launcher is exactly 96 ASCII bytes with five CRLF line endings and no BOM; its success and invalid-option forwarding oracles passed. The executable is x64 PE32+ with the Windows console subsystem. The local MSVC 19.38 binary imports exactly 11 allowed direct operating-system DLLs; the contract also permits only the Windows OS synchronization API-setAPI-MS-WIN-CORE-SYNCH-L1-2-0observed under hosted VS 18/MSVC 19.51/Windows SDK 26100, while rejecting SDL, MSVC, UCRT, debug-runtime, every other API-set, and every other unapproved import. The executable contains no source/build path prefix after deterministicReleasepath mapping and the enforced narrow/wide byte scan. Full MSVC CTest passed 32/32Debug, 32/32RelWithDebInfo, and 33/33Release; the 168-file dependency gate, all 209 tooling tests, and Python compile-all also passed. The staged public-tree gate checked 258 indexed text blobs. DCO passed, PR #40 merged the slice as exactmaincommitff8376b, and exact-main run29713390065passed all four jobs and retained the named Windows archive artifact. General clean-machine behavior remains unclaimed. Validation used only public source and generated output; no private or owner files, D-drive content, disc image, executable, emulator, or PCSX2 input was accessed. - E-0080 defines the first main-push-only consumer of the retained Windows archive. After the
windows-portable-packageproducer succeeds, a separate fresh GitHub-hostedwindows-2022job downloads the same run's namedOpenOmega-0.1.0-windows-x86_64artifact without checking out source or invoking CMake, CTest, a compiler, or the producer build tree. It requires exactly the ZIP and.zip.sha256sidecar as regular non-reparse files, parses its BOM-free ASCII lowercase digest, two spaces, exact filename, and single-CRLF syntax, recomputes the archive digest, and extracts exactly the frozen two-directory/eight-file package tree into an isolated directory. It then constrainsPATHto the Windows system directories and pointsLOCALAPPDATA,APPDATA,USERPROFILE,TEMP, andTMPat an isolated synthetic profile. Through the absolute system command processor, from an unrelated working directory, it requires the packaged launcher to pass both exact process oracles: exit zero, exactOpenOmega native shell: rendered_frames=0plus one newline on stdout, and empty stderr for--frames=0; then exit one, empty stdout, and the frozen exact diagnostic and usage text on stderr for the invalid sentinel. SHA-256 manifests of the downloaded artifact, extracted package, unrelated working directory, and synthetic profile must be identical after each launch. Local emulation of the exact PowerShell body extracted from the workflow YAML passed against both the freshly regenerated local package and the retained E-0079 main artifact. Full Release CTest passed 33/33, the 168-file dependency gate and all 209 tooling tests passed, Python compile-all passed, and the staged public-tree gate checked 258 indexed text blobs. PR #41 merged E-0080 as exactmaincommit4868e1118bcd32c6713a7f4be57dd243d40996ed. Exact-main push run29714679947completed all five jobs successfully. Consumer job88266108572downloaded retained artifact ID8450186290; GitHub verified that artifact envelope's SHA-256 asaea3f4869d17874305bf6027bce370d884ddcaed35e3e9d7a4bc2217aa6baac2, while the strict sidecar/recompute check verified the retained inner package ZIP SHA-256 asc06ce722572c5edbb0c34ce6b3fc985bcadd4e24ebda0cc07dff59df65ccfe5d. The job emittedfresh-VM portable consumer: OK (artifact, checksum, tree, launch, immutability). This hosted result covers only same-run artifact transfer, integrity, extraction, package-relative launch, exact process behavior, and non-mutation on that runner image. Because its zero-frame path returns before application/platform creation, E-0080 does not validate a window, menu interaction, GPU, audio, owner data, physical or arbitrary clean machines, Windows client editions, other Windows Server releases, or other runner images. Both digests identify retained E-0080 artifact8450186290; they are not hashes for every later package build. - E-0081 locally smoke-validates a separately identified current portable package's generated
no-content main menu on the tested Windows host. Its sidecar matched the package ZIP, all eight
extracted regular files matched their ZIP members, and the absolute extracted launcher started
without arguments from an unrelated empty working directory under an isolated profile. No owner
data, level, or configuration argument was supplied. The exact
OpenOmega - native runtimewindow title appeared, and a temporary operator-visible screenshot showed only the project-generated no-content OPEN OMEGA diagnostic menu. Its ignored PNG was deleted after display and is not retained or committed. Native Escape closed the visible run, and a second same-package exit oracle returned zero. Direct process evidence contained two stdout lines, exactly three INFO-only stderr records, and zero warning, error, or fatal stderr records. The unrelated work directory remained empty. GPU drivers wrote only shader-cache files inside the isolated profile, so profile immutability is intentionally unclaimed. No proprietary input, retail asset, retail executable, emulator, PCSX2 input, or D-drive filesystem input was accessed. This is not a pixel-golden test or evidence of retail-menu fidelity, owner-data behavior, controller or audio coverage, another machine, another Windows release, or PCSX2 equivalence. - E-0082 wires the strict E-0078 Packed24 projection into complete
LevelContentstartup while preserving the mandatory E-0077 topology path.BuildFirstLevelTextureDiagnosticPreviewruns both builders inside the existing canonical-handleAssetServicetransaction and returns an independently owned topology image plus either an optional transfer image or its typed rejection. Every Packed24 diagnostic rejection is intentionally nonfatal;OmegaAppkeeps the topology-only presentation and emits one fixed identity-free INFO category. On the public synthetic Packed24 fixture, the combined helper produces frozen 32x32 topology and 16x16/1,024-byte transfer outputs. App-state inspection establishes five resident uploads totaling 78,864 bytes and an exact three-command base-plus-split-topology-plus-transfer draw list; a GPU probe confirms the first four packed triples and their synthetic0xfffourth slots. Teardown releases the transfer texture before the topology texture. On the synthetic Packed32 fixture, startup remains topology-only with four resident uploads totaling 77,840 bytes, and the log contains exactly one fixedunsupported-sample-encodingINFO record without fixture identity. A helper-level output-limit rejection preserves topology and restores aggregateAssetServicestate. Source inspection shows one Request/Release transaction. A test-only 77,840-byte renderer-pool budget rejects the optional fifth upload before GPU allocation; startup still succeeds with four resident textures, the full-width topology list, exact pool-state preservation, and one fixed identity-freeupload-failedINFO record. Serialized local validation passed focused and full MSVC builds; direct asset-service and Direct3D12 app smokes; default, GPU-opt-in, and restored CTest at 32/36/32; the 168-file dependency gate; all 209 tooling tests; Python compile-all; and the public-tree gate over 258 indexed text blobs. Diff and DCO checks passed. PR, head, publication, and exact-main validation remain unclaimed. These checks do not prove a cumulative exact request count, every rejection category, full-image GPU fidelity, backend-specific fifth-upload failures, release failure, allocation injection, or valid-transfer failure rollback. The opt-in GPU suite ran locally; default hosted CI only compiles that integration test. The diagnostic assigns no channel, alpha, row-order, swizzle, color-space, material, geometry, retail-rendering, gameplay, or emulator-equivalence semantics. Only public source and generated fixtures were used; no private or owner file, proprietary input, D-drive content, disc image, retail executable, emulator, or PCSX2 input was accessed.
Provenance quarantine: an earlier README revision reported a private ReSymbol
Ps2EeR5900LeCoreV1cross-check with a 38/38 result. No evidence-ledger entry preserves its source and check, so it is excluded from this verified baseline pending a new reproducible, privacy-safe evidence record. It supports no current loader, decoder, format, runtime, or retail-behavior claim.
- E-0023 records that the native VUM adapter converts all 7,036 material catalogs into owned neutral data: 38,793 source-order names, 38,899 material records, and 42,631 dense name references with zero errors. E-0033 records that level-wide service orchestration independently loads the 5,351 manifest-referenced catalogs across all 18 levels with zero errors: 34,267 owned names, 34,589 material records, and 37,893 dense references in exact manifest order. E-0024 records that a separate retail-only passive descriptor validates 91,460 payload pairs, 38,023 normalized targets, 134,122 middle-to-final references, and 365,840 ordered Q/P references without exposing payload bytes, render geometry, or console instructions.
- E-0041 records a bounded analysis-only lexical-coherence pass that compares complete normalized
VUM member-name occurrences only against exact complete direct locator strings when the VUM name
ends
.TDX. Two passes are byte-identical, scan 18/18 levels with zero errors, and exactly reproduce the native cell/catalog/name/material/reference and container/locator populations. All 34,267 VUM name occurrences and 37,893 dense references classify as non-.TDX; no name enters the eligible exact-candidate lookup branch, and all 5,801 class-qualified locators remain unreached. This narrow negative result tests no alias family, observes no native or retail lookup, establishes no texture role, material binding, source priority, or runtime integration, and exposes no identities or proprietary data. - E-0042 records a separate exact-first one-terminal-extension pass that keeps that direct
.TDXlocator universe unchanged. After complete normalization, it independently removes at most one syntactic extension from the final component on both sides only when the full strings are not already equal; directory components and original class-qualified locators are preserved. Two passes are byte-identical and scan 18/18 levels with zero errors. All 34,267 VUM name occurrences and 37,893 dense references are extension-elided unique-primary candidates; all 34,589 material records inherit a unique extension-elided candidate, while 5,690 original locator occurrences are reached only through extension elision and 111 remain unreached. This offline lexical result does not observe a retail alias rule or material consumption, establish a texture role or binding, assign class priority, or justify runtime integration, and it exposes no identities or proprietary data. - E-0034 records the first privacy-safe VUM consumer trace: one strict-validator-accepted complete 120-frame pair from one selected runtime copy. Its repeat is byte-identical; each validated report contains two EE-read aggregate rows, two anonymous-site rows, and zero VIF1 chunk rows. Post-run containment auditing found no retained runtime copy, executable surface, reparse point, owner-input copy, or emulator/build process. An independently guarded second ranked trial reproduced those aggregates exactly: one capture with four accepted aggregate rows, split evenly between EE-read and anonymous-site rows, zero VIF1 rows, and zero aggregate-count deltas. In both trials, the EE-read rows remain confined to the already-opaque header-vector block; no accepted row reaches counts, records, metadata, payload, VIF, or tail data. This repeated header-only observation does not exclude copied buffers or activity outside the bounded observation window and assigns no geometry, topology, vertex, material, packet, draw, placement, visibility, or gameplay semantics.
Build the native launcher and game once, then double-click Play-OpenOmega.cmd. The separate
openomega_launcher.exe presents only prelaunch setup: choose an extracted NTSC-U data folder or
an owned ISO, optionally enable a gamepad, then Play. Profiles, character creation and selection,
the briefing room, mission selection, and gameplay remain inside openomega.exe. The launcher uses
compact antialiased DirectWrite text and native Windows pickers; it never embeds or copies retail
data. It also never starts a build implicitly, and prints exact build commands when missing.
cmake --preset vs2022-x64
cmake --build --preset vs2022-launcher-debug
.\Play-OpenOmega.cmdThe explicit developer-diagnostics path is keyboard and mouse only: W/A/S/D or the arrow keys
navigate and move; Return, keypad Enter, or F1 selects; Space or left mouse selects/fires; Escape,
Backspace, or right mouse goes back in menus; T or held right mouse targets in play; and F10 quits.
Gamepad discovery remains off unless the developer explicitly supplies
--set=input.gamepad_enabled=true.
Supplying arguments to Play-OpenOmega.cmd retains the direct-game developer path.
scripts/run-openomega.ps1 accepts -Config Debug|RelWithDebInfo|Release,
-Preset auto|msvc|vs2022-x64, an optional -ConfigFile, and any remaining native game arguments.
It runs from the repository root and forwards the game's exit code:
.\Play-OpenOmega.cmd --frames=120 --capture-run --replay-capture --developer-diagnostics
powershell -NoProfile -File .\scripts\run-openomega.ps1 -ConfigFile .\openomega.cfg --frames=120 --developer-diagnosticsDouble-click Open-OpenOmega-VS.cmd to generate and open the Visual Studio 2022 x64 solution. The
solution keeps the launcher, game, provisional SDK tool, engine libraries, compatibility layers,
platform backend, and tests in separate projects/folders, with openomega_launcher as the default
startup project. Set openomega as startup whenever the debugger should begin inside the game.
The command generates IDE files but deliberately does not compile; build the solution once before
using a library project as an executable debug host.
The emulator remains a research/reference lane and is not required to launch the native game. Start the user's locally installed reference environment with the explicitly named script:
powershell -NoProfile -File .\scripts\launch-pcsx2-reference.ps1Open the PCSX2 debugger and break at the game entry point:
powershell -NoProfile -File .\scripts\launch-pcsx2-reference.ps1 -DebuggerLoad the recovered resume state or print the exact command without launching another emulator instance:
powershell -NoProfile -File .\scripts\launch-pcsx2-reference.ps1 -Resume
powershell -NoProfile -File .\scripts\launch-pcsx2-reference.ps1 -Debugger -DryRunStatic analysis confirms that -lMINSK is valid attached argument syntax and selects the MINSK
entry. The user-facing meaning of -x and the resulting gameplay state remain unverified; the
reference launcher can test the pair explicitly against the private environment:
powershell -NoProfile -File .\scripts\launch-pcsx2-reference.ps1 -Debugger -GameArgs '-x -lMINSK'The native runtime is C++23 with bounded content intake and an SDL3/SDL_GPU host. Configure inside a VS2022 developer environment, then use the checked-in multi-config presets:
cmake --preset msvc
cmake --build --preset msvc-debug
ctest --preset msvc-debug
.\build\msvc\Debug\omega_sdl_gpu_texture_smoke.exe
.\build\msvc\products\sdk\Debug\omega_tool.exe hog-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe hog-verify-nested-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe frontend-envelope-coverage-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe pop-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe pop-post-terrain-hypotheses-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe level-manifest-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe level-spatial-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe level-material-catalogs-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe level-texture-store-verify-tree .\private\extracted-disc
.\build\msvc\products\sdk\Debug\omega_tool.exe asset-metadata-verify-tree .\private\extracted-disc
.\build\msvc\products\game\Debug\openomega.exe --data-root=.\private\extracted-disc --level=MINSK --probe-only
.\build\msvc\products\game\Debug\openomega.exe --data-root=.\private\extracted-disc --level=MINSK --frames=120 --developer-diagnostics
.\build\msvc\products\game\Debug\openomega.exe --data-root=.\private\extracted-disc --opening-movie-member=NAME
python -B .\tools\probe_native_levels.py .\build\msvc\products\game\Debug\openomega.exe .\private\extracted-disc --aggregate-only
.\build\msvc\products\game\Debug\openomega.exe --frames=120 --developer-diagnostics
.\build\msvc\products\game\Debug\openomega.exe --frames=120 --capture-run --developer-diagnostics
.\build\msvc\products\game\Debug\openomega.exe --frames=120 --capture-run --replay-capture --developer-diagnostics
.\build\msvc\products\game\Debug\openomega.exe --config=.\openomega.cfg --set=log.minimum_severity=debug --frames=120 --developer-diagnosticsopenomega is the pure-native SDL3/SDL_GPU host shell. Normal launch is fail-closed after the
opening movie until an evidenced retail-data presentation is available; it never substitutes the
project-authored diagnostic menus or gameplay. The exact --developer-diagnostics flag enables
those visibly labelled project-authored surfaces for engineering tests only, and the launcher does
not expose that flag. With diagnostics enabled, --frames=N opens the modern GPU backend, renders
exactly N frames, and exits without user input. Adding --capture-run explicitly selects bounded
in-process capture for 1 through 65,536 frames and requires --developer-diagnostics. It prints
only aggregate trace metadata plus selected absolute scheduler counters; it creates no
capture file and prints no per-frame input or elapsed records. Ordinary --frames behavior is
unchanged when the flag is absent.
Adding --replay-capture to that finite capture performs immediate main-thread replay into a fresh
scheduler and world in the same process. When the captured action schema contains all four E-0060
debug-movement actions, that fresh world owns one positioned synthetic actor and consumes the
reconstructed held input; older schemas remain clock-only. Replay requires a complete nonterminal
capture and a zero-origin capture scheduler, fails fast on any replay or comparison error, and
prints the unchanged fixed fresh-replay aggregate line only after aggregate and final-state
verification succeeds. Without --replay-capture, capture-only output and behavior remain unchanged.
--probe-only validates the retail root and selected level, then loads the owned manifest plus one
all-or-error LevelContentIR and opens an inventory-only LevelTextureStore without opening a
window. The store is retained only after the existing content and debug-image gates succeed. No
LevelTextureStore payload is loaded or used for display expansion, material binding, GPU upload, or
rendering; the rendered path uploads only the existing project-generated diagnostic RGBA8 image.
--opening-movie=PATH selects one external movie, while --opening-movie-member=NAME selects only
the named member of ZMEDIA/ZMOVIES.HOG below the effective data root. These options are mutually
exclusive and are rejected with probe, capture, or replay. The archive-backed route performs no
member discovery or fallback; callers must supply a name learned outside the public repository.
The spatial meshes and role-free material catalogs are decoded under one shared budget while each
common/cell archive is traversed once; their parallel manifest order asserts no mesh-to-material
binding. The current MINSK view is a deterministic synthetic
canonical-COL wireframe contact sheet: meshes occupy source-order tiles, and each mesh is projected
along its two largest coordinate extents. This clean-room diagnostic is not world placement or
reconstructed geometry and makes no VUM, TDX, or other retail semantic claim. The app-owned loop
converts steady-clock deltas into bounded fixed-step plans and executes each step against a
platform-neutral deterministic SimulationWorld; the configured default remains a synthetic-shell
timing value, not a retail-rate claim. The app also owns a non-hot-reloadable SDL audio service whose
callback never reads files, logs, blocks, or touches retail data; the current silent stream proves
device lifecycle and thread plumbing without embedding or guessing proprietary audio. A separate
non-hot-reloadable SdlInputService is the sole global event-queue consumer through PumpEvents,
routes keyboard and mouse input without requiring a controller, and owns a primary-gamepad lifetime
only when explicitly enabled. SdlGpuHost is consequently limited to video, window, GPU, and
rendering resources.
The current native controls are keyboard/mouse first. W/A/S/D or the arrow keys navigate and move;
Return, keypad Enter, or F1 select; Space or LMB selects in menus and fires the synthetic diagnostic
cue in play; Escape or Backspace cancels; T or held RMB targets in play, with RMB acting as back in
menus; F12 writes one fixed 640x448 BMP to the platform-local private OpenOmega screenshots
directory; and F10 quits. F12 is reserved from logical gameplay/menu input and from the opening
movie skip signal. Screenshot host paths and pixels are never written to logs or version control.
Target and fire cues follow the latest valid normalized mouse position and use target center when
no pointer sample is available. The gamepad subsystem is not initialized by
default; --set=input.gamepad_enabled=true opts into optional button and D-pad aliases. These are
project-authored diagnostic controls, not a retail input, aiming, or combat map.
The zero-file omega_sdl_gpu_texture_smoke target compiles whenever tests and the SDL backend are
built, but hardware/display-dependent CTest registration is off by default for headless safety.
Configure with -DOMEGA_RUN_GPU_SMOKE_TEST=ON to register it as a serial GPU integration test.
OpenOmega owns a native persistence database rather than emulating PS2 RAM, memory-card hardware,
or emulator savestates. Non-probe startup opens the platform-native OpenOmega/native-save
directory and validates front-end-bounded profile and character catalogs plus project-owned active
identity and diagnostic-session records before platform creation; --frames=0 therefore bootstraps
persistence, while --probe-only never touches it. A fresh database contains two checksummed
generation-zero snapshots and an empty process-lock file. Profiles and characters use bounded,
versioned metadata records. Startup never automatically creates or selects a default identity:
explicit Primary edges separately create, select, and durably confirm the native profile and
DIAGNOSTIC CHARACTER. Character confirmation opens the project-owned BriefingRoom/mission
selector.
Only the currently resolved profile/character pair can activate its one startup-bound diagnostic
content value; successful preparation writes the fixed session marker before DiagnosticPlay, and
repeating the same valid preparation performs no write. This flow is native bootstrap policy, not a
retail profile, character, mission, or save representation.
Windows uses %LOCALAPPDATA%/OpenOmega/native-save, macOS uses
$HOME/Library/Application Support/OpenOmega/native-save, and XDG hosts use
$XDG_DATA_HOME/openomega/native-save or $HOME/.local/share/openomega/native-save.
The optional project-owned configuration file uses strict lower_snake_case dotted keys and
key = value lines. --config=PATH is always authoritative. Without that option, openomega
looks for one host-family default: %LOCALAPPDATA%/OpenOmega/openomega.cfg on Windows,
$HOME/Library/Application Support/OpenOmega/openomega.cfg on macOS,
$XDG_CONFIG_HOME/openomega/openomega.cfg when that root is absolute on XDG hosts, otherwise
$HOME/.config/openomega/openomega.cfg when HOME is absolute. Missing, empty, or relative
required roots produce no candidate. A missing default profile is equivalent to the empty store;
the final entry must be a reported regular file and is never followed when reported as a symlink.
Configuration failures use fixed explicit/default/--set source categories without printing the
source path, a user-controlled key, or a raw value. Structural parser diagnostics may report a line
number or fixed budget, and typed errors may name a compile-time-known public setting. No profile
directory or file is created. --set=KEY=VALUE applies one validated command-line override per key.
Current keys are
log.minimum_severity, log.ring_capacity, jobs.worker_count, jobs.max_pending_jobs,
frame.simulation_step_ns, frame.max_steps_per_frame, frame.max_delta_ns,
input.max_events_per_frame, input.gamepad_enabled, content.data_root, and
content.level_code. The gamepad key is an exact boolean and defaults to false. The content root plus
optional level form one profile; direct --data-root/--level options override that profile as one
pair. Frame defaults are synthetic host-shell engineering values, not claims about the retail tick
rate. A local root-level openomega.cfg is ignored by version control because it may contain a
private filesystem path.
Architecture, completion criteria, and the compatibility-first engine/SDK direction are versioned in
docs/02-Runtime-Architecture.md and
docs/03-Milestones.md, with the staged long-horizon plan in
docs/07-Engine-and-SDK-Roadmap.md and its accepted decision in
ADR 0004. Research confidence is tracked in
analysis/evidence/ledger.jsonl.
docs/— architecture, milestones, decisions, policy, research contracts, and handoffs.native/— independently written runtime, engine libraries, tools, and synthetic tests.tools/— deterministic disc/ELF archaeology tools.analysis/— generated, redistributable metadata and reports.analysis/formats/HOG.md— validated HOG container layout and extraction notes.analysis/formats/POP.md— validated terrain-prefix contract, passive post-terrain hypothesis boundary, and native verifier.analysis/formats/TDX.md— validated texture block, plane, palette, and zero-suffix contract.analysis/formats/VUM.md— validated material catalog and render-payload boundary contract.analysis/formats/SCENE-FRAGMENT.md— bounded private-fragment parser, anonymous transform observation contract, and the exact camera/geometry semantics blockers.analysis/elf/loader-hints.md— confirmed executable evidence and open loader questions.third_party/pcsx2/— ignored official PCSX2 checkout and build.runtime/— ignored isolated PCSX2 data/configuration and logs.private/— ignored owned BIOS, disc image, extracted assets, and save states.
The repository must never contain Sony firmware, a game ISO, extracted proprietary assets, save states, or keys. Contributors provide their own legally dumped PS2 BIOS and retail disc. Only original source code, tools, documentation, hashes, metadata, and independently created compatibility data belong in version control.
This is an unofficial project and is not affiliated with Sony Interactive Entertainment or
Bend Studio. See TRADEMARKS.md and CONTRIBUTING.md.
Original project code and documentation are licensed under Apache-2.0. That license does not
grant rights to any retail game, firmware, asset, or third-party trademark.
See docs/04-Legal-and-Takedown-Readiness.md for the
project's preventive controls and response process. Dependency licenses are recorded in
THIRD_PARTY_NOTICES.md.
Official references: PCSX2 source, BIOS dumping, and disc dumping.