Nexus: verified completion status

NBG1 capture-only tile-fetch address correction — 2026-10-24

Merged PR #19 corrects Saturn’s NBG1 capture decoder to calculate the name-table address in 16-bit words, apply the 18-bit word-address wrap, then convert to byte addressing. Character numbers use Saturn’s 32-byte stride for both 4bpp and 8bpp paths. Against an authentic Japanese startup frame, MAP1A/MAP1B at 0x44/0x46 select plane 0x17, the visible name-table span begins at 0x5c000, and charno=0x1000 resolves to character bytes at 0x20000. The 64×64 test window visits 64 unique cells. This test does not assert full-frame traversal or authenticate the capture by itself.

This merged change is capture-only. It proves address interpretation for the captured NBG1 layer, not an asset owner, text-page map, menu composition, HUD, viewport, or production rendering. The Menu gate stays at 3/8 and production readiness stays at 0%.

Japanese date/time setup VDP2 trace — 2026-10-24

Ymir --debug captures from a session configured with the hash-verified Japanese retail CUE and IPL show a date/time setup frame with NBG0 at VRAM 0x000000 and NBG1 at 0x020000, both 512×256 8bpp bitmaps. The frame-105 filtered trace replays all 128 KiB of NBG1 with zero mismatches; the frame-118 CRAM trace contains 272 writes and zero drops. The captured NBG0 bytes form Japanese date/time text and a cursor, while NBG1 contains UI box shapes.

The source analyzer now checks both layers against hash-verified retail assets. Frames 105, 118, 278, and 295 all have zero exact bitmap source joins; the setup frames also have no exact tested palette match. The source join remains unbound and semantic admission remains blocked. No source-PC or disc- read evidence ties this screen to Nexus, and the capture does not prove that the game booted. Treat it as a pre-game/system setup state, not a game startup witness. It does not change Nexus completion status. Full evidence and reproduction commands are in docs/nexus/NEXUS_RUNTIME_CAPTURE.md.

The separate authenticated English-media run does have a positive loader source witness: runtime PC 0x00205f18 wrote an exact 16 KiB TM.BIN chunk to 0x06027000. Rechecking the same captured chunk against the Japanese retail CUE also finds it at ISO offset 0xdc1800, but that source-corpus lookup does not make the runtime capture Japanese-media evidence. Neither capture binds that code to the rendered title/menu or a gameplay transition. Nexus completion therefore remains unverified.

Structure1Fb floor-decoration boundary — 2026-09-29

The production mechanics loader no longer classifies every authentic Structure1Fb floor-decoration record as a Vi altar. The decoder still retains the exact source records and model/texture fields, while the altar registry remains empty until both an altar-ownership join and its Saturn interaction consumer are established. This corrects a semantic overreach; it does not claim that the retail levels contain no altars.

The all-playable-level real-media boot regression now checks for an empty altar registry after each production load of LEV01–LEV15. That regression has been rebuilt on TRV2 and passed three consecutive serial loops against /home/trv2/.firestaff/data/nexus.

All-playable-level floor-item production handoff — 2026-09-29

The TRV2 real-media boot regression now checks the production loader’s ITEM.IBS → Structure1Fa → floor-registry handoff on every playable retail level, LEV01–LEV15. For each DGN item declaration it requires the registry record to preserve its exact (x, y), declaration ID, quantity, two raw attributes, and Structure1F source-entry index; the total registry count must equal the declared count. The CTest passed in three consecutive serial loops against /home/trv2/.firestaff/data/nexus.

The production-boundary CTest also now exercises nexus_mechanics_tick() with an ISO source identity and queued forward input. It passes while the Saturn action owner remains unbound, confirming that this tick leaves retail pose, tick count, and queue unchanged. These checks establish authored item-state handoff and a closed mutation boundary only; they do not establish Saturn item pickup/use behavior, a playable start, or complete Nexus support.

Local Japanese retail-media verification — 2026-08-26

The supplied Japanese retail corpus was opened directly both as its original nine-track CUE/BIN set and as the original ZIP container. In both cases the native launch probe found the same 137 ISO members, loaded the real title, warning, game-over, STMP and LOGOBG surfaces, and completed five engine ticks without materializing game data. The CUE binding check also verified the original raw BIN bindings for CD tracks 2–9.

This is a media and native-launch result only. It does not promote CDDA playback or a playable start. Later New Game tracing and static table analysis bound the retail LEV01 start level and coordinates (29,47). Paired input and fixed-point pose evidence now map the level-1 heading 0x8000 to Firestaff North. Full title/menu handoff, gameplay ownership, and the real CDDA consumer remain unbound. LEV00 remains title-only, and runtime start is still fail-closed until gameplay ownership is complete.

Japanese held-START SMPC witness — 2026-08-27

An external, instrumented Mednafen session used the same JP 1.01 BIOS and the hash-verified nine-track CUE/BIN disc. START was held for all 90 captured frames after 30,000 boot frames. The producer wrote the current Firestaff V2 envelope, which the native transport validator now accepts:

The observed master SH-2 PCs all map into the authenticated DM.BIN range, but the trace does not bind a returned controller byte to a named menu action, new-game state transition, LEV01 load, or party pose. It is therefore transport and source-range evidence only; it does not authorize a native menu/start consumer or substitute a start coordinate. BIOS and capture artifacts remain outside the repository and Firestaff’s runtime.

Japanese START/control VDP comparison — 2026-08-27

A clean V2 producer build was run twice against the same JP BIOS and original CUE/BIN media over emulation frames 1800–1810: once with START held over the eight captured frames and once with no injected input. Both raw VDP1/VDP2 captures pass the native V2 transport validator and have the identical SHA-256 995929ef9e06700bdf333f278979c30f9b59872c14d4060a8ef8f59dae95f45a. The respective SMPC receipts differ (11546931ede2b625b147fc41848830763de4fde388b522238265726c890bf8b0 with START; 1ae296ff7c420d61f143333608193f5face85867021626b6af6a645f2a8ee218 without), proving delivery changed while the observed VDP state did not.

The V2 producer also exposes that its normal Mednafen path has no usable PC_ID value, so the analyzer reports pipeline_unavailable rather than pretending to have a retired-instruction identity. This is negative visual and instruction-binding evidence only. It does not authorize a Saturn menu, LEV01 load, party pose, or a synthetic substitute.

Japanese title-window control recheck — 2026-08-29

The JP 1.01 BIOS and the same hash-verified Japanese CUE/BIN media were run again with the instrumented capture producer over frames 12590–12709, this time with no injected input. The resulting 120-frame raw VDP1/VDP2 witness passed the native transport validator and has SHA-256 7e00dc4a3512e21d3662a9f85db3f139db18113bd5f926ac8489be4acbb7d1a8. It is byte-identical to the prior witness taken over the identical frame window with a START pulse at frame 12596, across VDP1 state, VRAM and both framebuffers plus VDP2 registers, VRAM and CRAM.

This is a controlled negative result: delivery of START does not make this window the interactive title menu. The capture is external development evidence, not a Firestaff runtime dependency, and the title/menu gate remains fail-closed pending a source-owned consumer and transition witness.

Japanese post-intro blank-window recheck — 2026-08-30

An external instrumented Mednafen 1.32.1 session ran the supplied Japanese retail CUE/BIN set with the supplied Japanese 1.01 BIOS and retained two raw VDP1/VDP2 frames beginning at emulation frame 12,590. The raw witness is 3,155,302 bytes and SHA-256 1924c9363e82921e8e6ba468edd68930ae7b5cece4c62f42b5a7147b86d0ed0a. Its validated VDP2 register receipt is little-endian with TVMD=0x8000 and BGON=0x0000 on both frames: no NBG layer is enabled. It is therefore a post-intro blank-window observation, not a title frame. A START pulse in the same two-frame window does not turn this into a menu witness. The BIOS and raw artifact remain outside the repository; Firestaff retains its fail-closed title/menu boundary.

Japanese late START VDP comparison — 2026-08-27

The same clean V2 producer then held START for sixty frames after 30,000 boot frames. The direct CUE/BIN run produced 60 validated VDP frames (SHA-256 2506793d61d50420c10f30cef4b01da976ca9d301ab157463118a09a8f6a574c), 120 injected-input rows (SHA-256 055f4e14e9a8880742768f8ae8dc85a0fd928c6454f855cff65cdd6cb823ab2f), and 525 SMPC reads over frames 30038–30065 (SHA-256 991d29494c20170c1463570d5216849179b76cb89b77fb9a8a0aece8a82dc4c1).

The first 60 raw frames are byte-identical to both the matching no-input control and a previously captured START/A/B/C sequence. Thus a real controller transport change still has no observed VDP consumer in this late title window. The result remains a fail-closed block on menu semantics, level selection and start pose; the raw receipts remain external to the repository.

Japanese START high-RAM state comparison — 2026-08-27

Two V2 high-RAM snapshots were taken from direct JP CUE/BIN sessions at the same frame 1810, one with START held from frame 1800 and one without input. Both contain the exact 1 MiB 0x06000000–0x060fffff WorkRAMH image. Their payloads differ in six bytes: 0x0602c8f9–fa, 0x0602c900–01, 0x0602c90c, and 0x0602c910; the latter two are 0x10 in the held run and 0x00 in that control.

This is not a state-owner receipt. A repeat no-input snapshot at frame 1900 also differs from the first no-input run, including the same two long-lived addresses. Their values therefore have an uncontrolled timing or session component, and the held/control difference cannot be attributed to START. The state owner and consumer remain capture-gated; Firestaff must not promote these bytes into synthetic gameplay state.

A direct byte-write follow-up used a frame-windowed SH-2 WorkRAMH tracer for 0x0602c8f0–0x0602c91f over frames 1798–1804. The START run and two no-input runs have the same 154-write layout and the same producing PCs (0x0601438e–0x06014ade), but values vary across no-input sessions too: 32 value differences occur between the two controls, versus 42 between START and the first control. This rules out the trace as an input attribution receipt. In particular, 0x06014518, 0x06014588, and 0x0601459a are observed writers, not proven title-menu or start-pose consumers.

Japanese SMPC relocated-instruction receipt — 2026-08-27

A same-session JP capture over frames 1798–1802 pairs 105 master-SH-2 SMPC reads with five exact 1 MiB WorkRAMH images. The debug capture loop provides nonzero PC_ID/PC_IF; every captured PID word matches the corresponding address in its same-frame runtime snapshot. The verifier also reads and hashes the original DM.BIN in place, reporting master_sh2_instruction_identity=runtime_snapshot_verified.

This resolves instruction identity after retail code has been relocated to WorkRAMH, not controller semantics. The receipt neither proves a menu action nor a new-game/LEV01 transition, so native pose and title admission remain closed.

Japanese SMPC-to-WorkRAMH transport — 2026-08-27

A one-frame debug receipt at frame 1798 records the seven initial pad-bus reads from 0x20100021 (SMPC byte registers 0x11–0x17) with the live destination base R3=0x0602c900. The verified relocated loop at 0x06014510–0x06014518 reads each byte and stores it into that WorkRAMH buffer before incrementing its index. Subsequent reads of 0x20100021 through 0x20100025 feed nearby fields such as 0x0602c90c, 0x0602c90e, and 0x0602c940; the runtime code masks and packs nibbles while doing so.

This proves an authored controller transport and runtime buffering path. It does not name the fields, identify a title selection, or establish a gameplay action, so it is not a basis for an inferred START route or pose.

A one-frame START pulse at the same capture point changes SMPC register 0x10 from 0x00 to 0x10 in that verified read chain. The copy source and WorkRAMH destination remain the same. Other pad bytes differ across separate sessions, so only this explicitly injected bit is attributed to START. This is an input-transport receipt, not a title-menu or new-game receipt.

The V3 WorkRAMH-reader receipt records the live master-SH-2 register bank for each bounded read. In the same JP START capture, PC=0x06014388 reads the buffer through R4=0x0602c908 and R3=0x0602c8f8; the next reader at PC=0x0601439a follows the linked words at 0x0602c90c and 0x0602c910. This establishes a real input-buffer consumer chain. It still does not expose the target’s menu state or a level-load call, therefore it does not admit a native new-game pose.

The same capture includes an exact frame-1798 1 MiB WorkRAMH snapshot. Runtime disassembly shows the SMPC copy loop at 0x06014500–0x0601451a, followed by the nibble packing path at 0x06014568–0x060145c6 and the later branch/table reader beginning at 0x06014620. The 36-row receipt passes analyze_nexus_sh2_ram_read_trace.py with workram_input_consumer_chain=verified. These are input transport and normalization instructions only: no observed branch target is identified as a title selection, save action, LEV01 load, coordinate, or facing assignment.

An independent 60-frame START hold at frame 1800 was compared against an otherwise identical no-input JP run. Render receipts at frames 1750, 1800, 1850, 1900, 1950, and 2000 are byte-identical. This eliminates title-animation changes as a false positive and proves no observed presentation transition for that input interval. It does not prove that START is ignored globally, and it cannot authorize a menu or gameplay route.

The same bounded A-button (0x20) hold produces the same byte-identical six frame receipts against the no-input control. Both common confirmation inputs therefore have negative evidence in this particular intro window. Further capture work must move to a distinct observed input-ready state rather than repeating the 1800–1860 interval.

The later A-button hold at frame 3000 likewise matches the no-input control byte-for-byte at frames 2250, 2500, 2750, and 3000. The long intro window is therefore not a valid substitute for a title-menu receipt; the next capture must target a distinct input-ready state.

The no-input timeline remains title-composed at frames 8000 and 10000, then becomes a completely black 704x480 PPM at frame 12000 (one RGB value across all 337,920 pixels). This observed blanking boundary is not a menu or gameplay transition, so it cannot supply a native startup route or a pose witness.

Japanese retail start-pose disassembly audit — 2026-08-27

The Japanese CUE data track was read in place and the authenticated DM.BIN member was statically disassembled in memory. The resulting identities are:

Member ISO LBA Size MD5 SHA-256
DM.BIN 44 555,144 e88d60859f65f08fa622e1992b02280f 3bbca125e0bfb486897e4926541e7c31adbff010d01a9b0c736637f432aad124
LEV01.DGN 500 280,576 751e1442bf7dccbd41bf146b5be144ab b359a89ffa344439b6d0d15de223f3211caa7725b13dfdb4461b579c48f06723

DM.BIN+0x366b8 and +0x36990 contain the generic LEV%02d.DGN format; the nearby +0x36744/+0x36788 strings identify debug level selection/loading, and +0x36a18 names SLEV%02d.BIN. There is no literal LEV01 reference apart from unrelated SNDLEV01 text. A later focused disassembly identified the separate 16-entry per-level start table at DM.BIN+0x39550 (runtime 0x06049550); the generic format strings alone do not establish its meaning or player ownership.

A read-only Ghidra 12.2 follow-up on the same DM.BIN hash confirmed the load base at 0x06010000 and mapped FUN_06017e6e to a generic level-resource loader referenced by the LEV%02d.DGN format string. It is called from FUN_06020fee, whose caller is FUN_060110ac. FUN_06020fee passes coordinate-like structure fields to an indirect initializer. This narrows the generic loader path. A later New Game trace and table consumer establish that a per-level record is copied into this loader structure; the angle field still needs a Firestaff direction mapping before runtime admission.

A paired 1,800-frame Ymir --debug trace then compared the accepted New Game input with a no-input control while tracing [0x06064000,0x06065000). Both receipts are complete with zero dropped rows. Only the accepted run records FUN_0602022c writing words 1, 0x8000, 29, and 47 into 0x06064544..0x0606454b; FUN_06020fee later reads the coordinate words at +4 and +6. Follow-up Ghidra analysis identified the retail table source: the 16-entry table at DM.BIN+0x39550 is read by FUN_06011984, called from FUN_0601128e, and copied into the same loader structure. Its level-1 entry is 00 01 00 01 1d 2f 80 00: level 1, enabled flag 1, coordinates (29,47), and angle word 0x8000. Enabled entries use 0x0000, 0x4000, 0x8000, or 0xc000, consistent with quarter-turns in a 16-bit angle field. The accepted New Game trace reaches the same structure through FUN_0602022c. The (29,47) cell is passable in the hash-verified retail LEV01 DGN, so this is a source-owned level-1 loader coordinate, not a guessed walkable cell. FUN_0601f584 stores the angle in the live pose object. A paired Up/control capture reads its 16.16 position fields: (29,47) maps exactly to (0x0024e000, 0x003b6000), and Up changes Y to 0x003b5c00 while angle 0x8000 remains unchanged. Thus this level-1 start faces Firestaff North, where Up movement decreases DGN Y. One-frame left/right inputs change the angle by +100/-100, consistent with this orientation. This proves the level-1 direction mapping only; other table headings and the complete gameplay ownership path remain unverified. The native start path now authenticates DM.BIN, parses that level-1 entry, loads canonical LEV01.DGN, validates the start cell, and emits a dungeon-start receipt before continuing the runtime handoff. Viewport, material, and HUD routes still have separate evidence gates, so this is not yet a playable-start result. TRV2 compiled the firestaff target, and the authentic-data nexus_v1_launch_smoke_probe passed 22/22, including the new launcher start receipt. The interactive M11 path has not yet been captured in Ymir. The loader tuple itself remains unchanged by paired Up input. Exact trace and Ghidra export hashes are in the external nexus_new_game_capture_20261028/config-struct-sh2-trace-1800/ evidence directory.

LEV01 door and entrance-source boundaries — 2026-08-27

DMWeb’s Nexus DGN specification, checked against the hash-verified JP LEV01.DGN, identifies Structure1E as 16-byte door records. It documents the grid coordinates, orientation, model index, initial closed/open state at byte 0x08, and movable-wall type 0x04 at byte 0x0d. The same source identifies four LEV01 floor sensors: entrance face animation, entrance music, an exit-door pressure plate, and the stairs to level 2. This is sufficient to preserve and validate the authored data records; it is not evidence of the Saturn input/trigger dispatcher, state-write timing, audio consumer, or VDP consumer. Firestaff therefore must not enable the DM1-shaped door or sensor runtime merely from these fields.

The DGN decoder now retains each bounded 16-byte Structure1E record verbatim and exposes only the documented coordinate/descriptor bytes, initial-state byte (0x08), and movable-wall-type byte (0x0d). The hash-verified retail LEV00–LEV15 corpus contains respectively 2, 8, 24, 49, 21, 30, 15, 44, 29, 5, 15, 28, 60, 8, 10, and 16 terminated records. A real-data regression checks the per-level census and each retained record against its original file bytes. This establishes preservation of the source table only: it does not prove a door-record-to-Structure1B mapping or authorize interaction, collision-state, animation, or sensor dispatch.

The production mechanics loader therefore resets, but does not populate, the legacy DM1-shaped door-state registry from Structure1B cells. Decoded type-8 cells remain geometry candidates; the hash-verified retail corpus and static tables do not establish that they correspond to Structure1E records or Saturn door state. A same-session Saturn trace must prove the cell/table join and state consumer before this registry can represent retail doors.

Local Japanese post-render title witness — 2026-08-26

A separate, temporary developer capture used the hash-verified Japanese Saturn 1.01 BIOS and the same original nine-track Japanese CUE/BIN set. The capture producer is outside Firestaff’s runtime and the BIOS, raw capture and its build artifacts were not retained in the repository. Its ten post-render frames pass the Firestaff raw-layout validator; frames 6–9 have the measured active title NBG0 state exactly:

This is a region-matched post-render observation and confirms the title-frame boundary used by the fail-closed NBG0 tools. The same capture session’s frame-12596 VDP2 trace contains exactly 32,850 clear writes tagged 0x060230ac and 31,616 byte-lane writes tagged 0x0602312c; replaying all 64,466 writes reconstructs the frame-6 NBG0 bytes and hash exactly. A same-frame SH-2 instruction trace records the 31,616 preceding WorkRAM byte loads in order; their values match the VDP2 byte lanes exactly. The same JP session also captures the 17,408 CDB FIFO payload words for TITLE.BIN LBAs 6039–6055, checks every word against raw Track 1, and records the CDB data-port and FIFO word position for the WorkRAM receipt. The title/menu display consumer is still unbound, so this does not authorize a playable start.

Japanese late-intro rendered-frame check — 2026-09-08

The same hash-verified Japanese CUE/BIN media and JP 1.01 BIOS were run for 18,000 emulation frames by the external capture producer. The bounded one-frame receipt (52b423d1ba65d796508fe36583cf2006faba03ec1345a08107f767ff345b08c1, 1,577,672 bytes) passes the raw-layout validator and contains one active VDP1 and VDP2 state. Its accompanying 704x480 renderer output visibly contains the retail red-crystal hand sequence, rather than a title or input-ready menu.

This establishes a real late-intro render point only. The generic hardware receipt reports asset_semantics=unassigned; it contains no same-state TITLE.CG/MAPD consumer binding, named menu action, level-load transition, or party pose. It must therefore remain external verification evidence and must not be promoted into a native menu route or substitute title artwork.

Static SH-2 disassembly correction — 2026-08-26

The hash-verified retail DM.BIN was fully disassembled directly from the original CUE member in memory using the frame-specific static code mapping 0x06010040. The frame-12596 PC tag 0x0602312c is the loop checkpoint immediately after the relevant instructions: mov.b @r5+,r1 at 0x06023120 and mov.b r1,@r4 at 0x06023128. The tag itself decodes as cmp/pl r14; its following branch and delay slot advance the destination pointer. This resolves the observed byte-copy instruction instead of guessing it from the PC tag. A full-member scan also identifies an outer direct BSR from 0x06022772 to 0x060230c0. The authenticated frame-12596 trace instead records the copy helper’s live PR=0x06023176 on all 31,616 rows. Those are not interchangeable: PR is a live SH-2 link register and may be replaced by nested work before the sampled store. The verifier reports the static edge and requires one consistent observed PR, without falsely attributing it to the outer BSR. It does not identify the transform or Saturn display consumer, so native title/menu admission remains closed.

Current external-data verification — 2026-08-13

Authentic archive-source verification — 2026-08-14

Archive-only directory launch is now source-complete at the media handoff: M12 admits the real English ISO member from the supplied .7z, and Nexus directory discovery uses the same memory-backed ISO reader as direct archive launch. A real copy of the supplied archive was tested without extracting or writing game data. The remaining result is the existing authentic Saturn presentation blocker, not a missing-data error.

The supplied authentic Nexus .7z can now be passed directly as the data source. Firestaff selects the real English ISO member and opens its ISO 9660 tree in memory (137 files); it does not rewrite the archive or create game data files. The boot probe reaches the authentic title route and reports levelLoaded=0 with the existing Saturn-capture blocker, so the remaining failure is presentation/start-pose evidence rather than media discovery.

Verification-count correction — 2026-08-14

The current configured external-data CTest selection contains 184 Nexus tests: 173 pass and 11 are intentional capture-gated skips. The older 304/14 count below belongs to a broader registration set and must not be presented as the current configured run. Neither count opens the still-missing Saturn semantic gates.

Authenticated virtual-source read correction — 2026-08-14

Hash-based discovery may identify a real Nexus asset as a virtual source path, for example disc.iso::DM.BIN or an archive member. The runtime now reads ISO members with the sector-aware reader and other supported archive members with the bounded in-memory reader. It no longer treats the virtual path as a host filename, and it never writes a materialized game-data file. Real ISO, launch, manifest, and hash-scan regressions pass.

Media discovery correction — 2026-08-14

Nexus discovery now validates each CUE/BIN/ISO candidate before selecting it. This is required for authentic data directories that contain more than one regional image or unrelated media: directory enumeration order is not a source identity. A candidate is admitted only when its ISO tree contains the real DM.BIN and LEV01.DGN files. Firestaff reads the selected original image in place; it does not unpack or rewrite game data. The focused ISO/CUE, launch, manifest, and external-data tests pass.

When discovery first identifies a physical Track 1 payload, launch resolves its CUE ownership strictly: a sibling CUE is accepted only when exactly one sheet opens that exact payload as its Nexus ISO track. The native engine then receives the CUE, preserving authored CDDA declarations without extraction. Zero or multiple owners fail closed rather than selecting a filename guess.

The identical no-extraction provenance rule now covers the original ZIP: when its internal CUE declares Tracks 2–9, each selection resolves to an explicit archive.zip::Track N.bin member only after that member has been validated in the archive. This is a CDDA source receipt, not host playback or a replacement for the still-unbound Saturn CDDA selector/decoder.

The external checkout was tested against /Volumes/Extern-disk/FirestaffUserData/data/nexus: all 304 registered Nexus CTest cases completed successfully. Fourteen tests remain intentionally capture-gated and are reported as skips, not as passing semantic evidence. The real English MENU.BPK decoder independently decodes all 162 PRS3 surfaces (test_nexus_v1_bppk), and the engine exposes the resulting READY_DECODED source route. The later hash-bound Japanese TITLE session also proves the five MAPD planes in order (N,E,X,U,S) reach VDP2 VRAM at 0x05c000..0x05dbff, and proves the matching 16-colour palette transfer from Work RAM 0x060c0c4c..0x060c0c6b to CRAM 0x100400..0x10041f. This is a transport and provenance boundary, not a presentation authorization: the Saturn display-window transform, MAPD plane selection/timing and final VDP1/VDP2 consumer are still unbound. The startup/menu, LEV01 pose, HUD/viewport, SLEV/SAL playback, and Saturn-save production gates therefore remain closed where their source-owned runtime witnesses are missing.

Correction — long SCSP traces remain structurally admitted only

The parser ceiling is now 64 MiB, so the authenticated gameplay traces of about 33 MiB are no longer rejected before parsing. The two retained run-slev-scsp-gameplay-20260811j/k pairs pass structural trace validation. Their runtime join is still fail-closed: neither trace contains the disassembly-bound SDDRVS handler PC 0x3224. They therefore do not open the producer-to-SDDRVS-to-SCSP production gate, and no event, MAP, SAL or playback semantics are claimed.

No meaningful percentage can be based on the number of C files or tests. That would count parser code and no-op gates as completed runtime. This document therefore distinguishes implementation coverage from production readiness. Implementation coverage measures built format, analysis, and capture support. Production readiness measures what may actually be used in a playable, region-matched Saturn chain.

Current evidence correction — 2026-08-13

The CLI boot-probe path now selects SDL’s dummy video driver by default when no driver was supplied. This makes headless Nexus receipts reproducible on CI and display-less hosts; it does not alter interactive rendering. With the authentic external Nexus corpus, the probe exits cleanly and still reports the source-owned title VDP-capture blocker rather than claiming a playable menu.

The local Nexus boot-profile hardening is now verified: nested asset checks honour the caller’s diagnostic-buffer capacity instead of using the enum’s larger maximum. This prevents validation from corrupting adjacent runtime state. The focused boot/launch set and the external-data Nexus selection both pass after the fix. Two further operator-only J-BIOS capture attempts (run-followup-20260813c12 and run-followup-20260813c14) stopped before a raw witness during the external Mednafen video/init profile, so they add only negative emulator diagnostics and do not change the production percentages or open any Saturn gate.

The latest attached-media J-region run at /Volumes/Extern-disk/nexus-capture-20260813/run-attachment-j-20260813/ used the hash-verified J BIOS 1.01 and English merged CUE, and produced 1,200 validated raw frames with 1,156 active VDP1 observations. It still contains no source-owned LEV01 level/x/y/facing record. The raw witness is retained as negative transport evidence; capture_exit_status=143 records that the emulator was stopped after the complete frame set had been written. It does not open the start-pose, save, HUD/viewport, or audio gates.

The later J-BIOS/English-Merged run at /Volumes/Extern-disk/nexus-capture-20260813/run-followup-20260813c5/ used the documented active-low debug sequence and produced a validator-clean 1,200-frame raw witness. It did not produce a source-owned LEV01 level/x/y/ facing record. Its long operator process ended before the launcher’s final receipt append, so the capture is diagnostic evidence only and is not counted as a complete semantic gate. The launcher now finalizes capture_exit_status and available trace hashes on signal/timeout; the regression is covered by the raw-capture launcher test. This does not change the production status below: Saturn startup, HUD/viewport, SLEV/SAL playback, and Saturn save import remain closed until their source-owned runtime joins are authenticated.

The verified Nexus startup now explicitly distinguishes title/asset boot from a playable start. Firestaff no longer writes NEXUS STARTUP RECEIPT READY when levelLoaded=0; it instead reports status=blocked with the current source-owned blocker. This does not change production readiness: the authentic startup→menu→LEV01 chain still lacks a verified start-position and consumer witness.

Post-render title falsification — 2026-09-07

The external JP-BIOS/Japanese-retail-CUE capture was replayed with the already instrumented Mednafen post-render hook at the r33 absolute frame (13460). Its raw VDP1/VDP2 state has SHA-256 f700206629eaf6f37dd750271b3a76371d11bd80a2b1abcf79224337f8dbb672, the same raw state as the r33 MAPD-to-VDP2 receipt. The independently emitted 704×480 RGB post-render frame has SHA-256 703587d6bb955636f4c5688f2eb862b0f103317343b28f5c71cd65b4e80ea993 and shows the Sega Saturn BIOS splash, not a Nexus title/menu surface.

This is a negative but useful result: r33 continues to prove the exact MAPD transport, CRAM/VRAM state and timing facts recorded above; it does not prove that those facts are the active title display consumer at that frame. The post-render artifact remains operator-owned under ~/.firestaff/external/nexus-capture/ and is not shipped or required by Firestaff. The public title-vdp-owner-compositor-capture-required gate must stay closed until a same-session post-render frame shows the actual Nexus title/menu and can be joined to the relevant VDP1/VDP2 state. Raw VDP1/VDP2/VRAM/CRAM/timing transport is already authenticated; it cannot identify the title owner or authorize an inferred compositor.

On 2026-09-08, a fresh JP-BIOS/retail-CUE r38 scout requested one post-render frame at absolute frame 18,000 through the hash-manifested raw-capture launcher. The launcher cleanly killed the external Mednafen process at its five-minute bound before the requested frame was reached; no raw witness or image was emitted. The empty operator-owned directory was removed. This is only a capture-duration measurement, not hardware or title evidence: a later attempt must use a longer bounded window and still require a validated raw witness plus an actual Nexus post-render image.

Current external-disk audit, 2026-08-13: the verified game corpus contains CUE/ISO and extracted retail files. A new isolated J-BIOS/English-Merged capture is now available as operator evidence on external disk: /Volumes/Extern-disk/nexus-capture-20260813/run-jp-merged/. The capture binds the BIOS and disc hashes, 60 raw frames, and 16 active VDP1 observations; the separate validator passes with --require-frames 60 --require-vdp1-activity. The capture is nevertheless semantic-blocked: no byte-exact startup→menu identity, start pose, HUD/viewport consumer, or SLEV/SAL dispatch is verified. Saturn BIOS, disc, and capture bytes remain outside the repository and must not be treated as a Firestaff distribution.

Area Verified gates Implementation coverage Production readiness Primary blocker
Startup 3/6 50.0 % 0 % The J-BIOS/media pair is now available and a reset frame is validated, but no valid startup→menu witness exists
Menu 3/8 37.5 % 0 % PRS3 byte decoding, the NBG1 consumer, and a separate FONT256 CG/palette join exist, but page/text-code mapping and actual menu composition are missing
DGN face/mesh/texture 4/7 57.1 % 0 % Format, mesh topology, material owner, and DMWeb 08h/28h source decoding are bound, but selector/UV, runtime transform, culling, and rasterization are missing
Saturn VDP1 capture 9/12 75.0 % 0 % Raw capture, command framing, material/CLUT join, atomic replay, multi-command sequence, display origin, and separate direct-colour pixel decoding are verified; scene owner, Saturn face selection, transform/culling, and production consumer are missing
HUD/viewport 1/7 14.3 % 0 % Layout/adapters and capture-only composition exist, but no authenticated VDP1/VDP2 pixel handoff to production
SLEV/SAL/SDDRVS 2/8 25.0 % 0 % Corpus, driver, and write traces exist; selector, codec, MAP binding, event dispatch, and actual playback are unproven

The arithmetic mean of implementation coverage is (50,0 + 37,5 + 57,1 + 75,0 + 14,3 + 25,0) / 6 = 44,0 %. As a checksum, the named gates are 22/48 = 45,8 %; that figure does not replace the area mean, because an area would otherwise weigh more merely for having more sub-gates. For the prioritized startup → menu → HUD/viewport chain, with weights 30/35/35, implementation coverage is 50,0 × 0,30 + 37,5 × 0,35 + 14,3 × 0,35 = 33,1 %. Production readiness is currently 0% for both measures: the validated J capture is a reset/transport witness without startup→menu identity, and the existing E-BIOS/French capture likewise opens no semantic runtime consumer. The figures must not be averaged across models.

External retail corpus

The separate authentic corpus on external disk is verified through launcher boot and level probes: FIRESTAFF_NEXUS_DATA_DIR points to the corpus, the additional English CUE opens without repacking files, title and warning surfaces load, and LEV01.DGN–LEV15.DGN pass the real 64×64 structure and playability probe. This confirms data access and format reading, but not the missing Saturn startup→LEV01 pose or VDP consumers. Firestaff must therefore still stop before playable runtime where no authenticated save or Saturn witness exists.

Counting rule

Implementation coverage is the number of verified gates divided by an area’s named gates; the mean over the table’s six areas is rounded to one decimal. A parser, hash, or no-op may count only toward the gate it actually verifies.

The gates are fixed in this revision: startup = data/BIOS, region, input, capture, start identity, startup→menu; menu = BPK, PRS3, source row, pixel/mode semantics, palette, VDP2 map, FONT256, menu capture; DGN = DGN format, mesh topology, face/material ownership, texture semantics, transform, culling, production raster; VDP1 = raw transport, authenticated frame, VDP1 state, command framing, texture/CLUT join, direct-colour pixel decoding, atomic replay, multi-command sequence, display origin, scene owner, face selection, transform/culling; HUD/viewport = layout, HUD source, VDP2 source, VDP1 source, pixel handoff, composition, production consumer; SLEV/SAL/SDDRVS = corpus, driver, trace, selector, codec, MAP binding, event dispatch, playback.

Production readiness is a gated measure: original data, the Saturn runtime owner, correct BIOS/media region, and production consumer must be bound in the same verified witness. Parser, hash, static disassembly, capture-only adapter, and no-op count as partial implementation coverage but as zero production readiness.

The European VDP2 source comparator accepts both authenticated English and French MENU.BPK. Missing optional sources, such as TITLE.CG in a partial external extraction, are reported separately and do not invalidate the entire raw witness; they do not open semantic admission.

Latest authenticated VDP1 window

Regionmatchad J/J-startup-witness

External disk now holds a separate hash-bound capture using Japanese Saturn BIOS 1.01 and the Japanese-region English Nexus disc. Mednafen reports SGAREA=J, and the launcher manifest binds BIOS and CUE hashes to 560 frames. During the targeted reset window, VDP1 source 0x63e00 is written by the observed SH-2 corridor (pc0=0x0601307c); the same session has a raw VDP1 snapshot and a verified write trace. This is stronger startup/writer provenance than the E/French runs, but source spans still lack a byte-exact match in MENU.BPK, TITLE.BIN/TITLE.CG, FONT256.S2D, or STABG.BIN. NBG1 bitmap state (TVMD=0x0080, BGON=0x0002, CHCTLA=0x1211) and the VDP1 direct-colour command are therefore capture evidence without menu identity or a production consumer.

The region-matched J/J session run-codex-j-menu-long-20260809/runtime-vdp12.raw is now verified with 1,200 frames, BIOS J 1.01, a full merged disc, and START handoff. VDP1 state reports SysClipX=319, SysClipY=223 throughout the window. VDP1 VRAM changes, but the examined frame-500 record is a mode-5 direct-colour draw from 0x63e00 (33,280 bytes) with no exact match in the hash-verified retail corpus. VDP2 is unchanged in its register/VRAM/CRAM configuration and remains a lone NBG1 bitmap observation without a MENU.BPK/FONT256/TITLE/STABG join. The session is therefore negative, authenticated evidence for transport/ state—not startup→menu or HUD/viewport evidence. The production gate remains closed.

In the local, user-owned capture corpus, run-codex-menu-long-20260809f/runtime-vdp12.raw, frame 760 is the best investigated DGN candidate. C’s command-chain adapter binds 242 records and verifies order, clip, local coordinate, and END state, but the first textured draw is direct-colour (mode 5, source 0x5ad68, 130,320 bytes) and matches no byte-exact span in the hash-verified retail corpus. A separate mode-1 observation at 0x0e160 matches LEV00 Structure2 image 49, but is not sufficient by itself to replace the unproven draw in the full chain. Frame 760 is therefore capture-only evidence; it must not be used as complete scene replay or proof of Saturn face selection, transform, culling, or production rasterization. The C adapter nexus_v1_saturn_runtime_capture_frame() reads the same authenticated VDP1/VDP2 raw envelope in C, and nexus_v1_vdp1_capture_replay_runtime_frame() passes VDP1 VRAM/COPR directly to the bounded replay chain. The new nexus_v1_vdp1_dgn_material_resolver() binds a verified LEV file to a unique mode-1 image and a unique reusable CLUT with byte-identical Saturn ordering; palette ownership need not reside on the same Structure2 descriptor as the image. CMDCOLR is converted from Saturn word address to the correct byte offset (<<3). Ambiguous or unattested sources are rejected. It remains capture-only, and consequently leaves face selection, transform, culling, direct-colour materials, and ordinary production blocked.

Direct-colour lane

VDP1 mode 5 is now semantically decoded in the separate capture-only lane nexus_v1_vdp1_capture_decode_direct_color(). It follows Mednafen 1.32.1 src/ss/vdp1.cpp::TexFetch for 16-bit 32K-RGB words and ECD’s transparency code (word & 0xc000) == 0x4000, and writes to a separate RGBA surface rather than quantizing colour to the Nexus indexed framebuffer. A synthetic test and an external gameplay capture pass. The lane still always sets renderer_permitted=0: it proves VDP1 pixel semantics, not DGN ownership, face selection, transform, or production rasterization. It therefore does not raise production readiness or the Nexus V1 target score. Frame 760’s first mode-5 record still has no byte-exact retail owner; its command-chain join also lacks sufficient valid screen coordinates to open full replay.

The authenticated raw-frame chain is also now available as nexus_v1_vdp1_capture_decode_direct_color_runtime_frame(). The capture binds the frame, COPR/command list, display origin, and selected mode-5 command to the same raw capture and returns the command offset in its receipt. The API remains explicitly capture-only; it creates neither menu identity, material ownership, nor a production consumer.

The gameplay witness also now has nexus_v1_vdp1_capture_replay_runtime_frame_mode1_material(). It follows the frame’s complete COPR chain, tries only mode-1 draws, and passes a draw to the verified DGN image/CLUT resolver when both spans match exactly. External EU capture frame 760 passes with LEV00.DGN: analysis shows 227 of 231 mode-1 draws with image and palette matches and 198 with Structure3 face ownership; the C test renders one such draw through the same runtime API. This is not yet a full scene renderer: Saturn face selection, camera transform, culling, and scene ownership of the complete draw list remain blocked.

The separate nexus_v1_vdp1_capture_replay_runtime_frame_mode1_sequence() lane now traverses the entire authenticated command list in frame 760 and atomically replays the source-bound mode-1 subset. C verification counts 242 command records, 235 draw records, 218 exact DGN image/CLUT joins, 16 unowned mode-1 records, and one unowned non-mode-1 record; seven control records remain separate. The missing type-9 system clip record is separately marked in the receipt and must not be replaced with a user clip or host bounds. When authenticated runtime state exists, replay instead uses its live SysClipX/SysClipY as the inclusive raster envelope. This remains neither a full Saturn scene nor a production compositor because scene ownership and several draw records are missing.

The instrumented Mednafen source now also captures VDP1’s separate SysClipX/SysClipY state. In a new 800-frame EU capture, frame 760’s values are 0x013f/0x00ff (319×255), despite the command list having zero type-9 system-clip records. The C parser accepts both old and new capture rows and marks state provenance explicitly. Gameplay frame 760 with (319,223) now passes the source-bound VDP1 subset with the clip consumer active. A capture with SysClipY=255 preserves the receipt but closes renderer_permitted against the 224-line host surface. VDP12 composition propagates this to the viewport receipt; HUD and full viewport production remain closed until scene ownership and display-window transform are verified.

The VDP2 raw format is now also correctly bound in C: every frame has 4,096 bytes of CRAM, 524,288 bytes of VRAM, and a 512-byte register window in the same order as the external capture validator: RawRegs → VRAM → CRAM. The C reader and nexus_v1_saturn_runtime_capture_vdp2_register_receipt() now use the same order and deterministically select register byte order. At frame 80, the authenticated English long run shows TVMD=0x8000, BGON=0x0003, and active NBG1 in character mode; this is a hardware-state observation, not menu ownership or a text binding. nexus_v1_vdp2_capture_replay_runtime_frame_nbg1_tilemap() can feed an authenticated raw frame to the NBG1 tilemap compositor when a caller has already attested the source name table, character generator, CRAM, and exact VRAM offsets. It does not guess MENU.BPK/FONT256 ownership or placement; menu and production readiness therefore remain unchanged.

nexus_v1_font256_vdp2_capture_join() requires the same attested FONT256.S2D for an exact CG span and 256-colour palette span. A changed source or capture is rejected. The join does not set text-code→tile, page PND, placement, or layer ownership; it is source provenance, not an unlock of FONT256 runtime or startup→menu.

VDP2 also has an independent raw-capture consumer, nexus_v1_vdp2_capture_decode_runtime_frame_nbg1_bitmap(). It decodes the authenticated frame’s NBG1 512×256/8bpp span and CRAM to a separate RGBA surface and verifies register byte order, BMPNA/CRAOFA addressing, and the same frame envelope. J/J frame 500 passes this lane; the span is fully transparent, which is preserved as valid=1, written_pixels=0 rather than fabricating a menu image. The API continues to block the production consumer and asset owner.

The title lane has a corresponding separate NBG0 consumer: nexus_v1_vdp2_capture_decode_runtime_frame_nbg0_bitmap(). It accepts only the measured 512×256/8bpp lane at VRAM offset zero and BMPNA and CRAOFA bank zero, and produces a capture-only RGBA surface with renderer_permitted=0. A new transient check against the owned JP CUE and JP-1.01 BIOS passed on 2026-08-26 for the title frame: TVMD=0x8000, BGON=0x0003, CHCTLA=0x0013, BMPNA=0x0000; the first 131,072 VRAM bytes have SHA-256 ad10d99f00c3eecdf9577b15af1a7b86870a4ba83299dc50a09881dc569ad5e8. Neither BIOS, capture, nor external producer is a Firestaff runtime dependency, and the decoder does not establish VDP1 priority, title/menu ownership, timing, or host-window placement.

The raw-frame receipt additionally exports PRINA/PRINB and unmasked NBG0/NBG1 priorities using the same verified register byte order. This makes the observed VDP2 ordering available to the next native gate, but is not proof of VDP1 priority, window logic, colour calculation, or final composition.

A new transient JP title capture from the same 2026-08-26 revision also makes the window gate concrete: WCTLA–WCTLD=0x0000, SPCTL=0x1536, CCCTL=0x0043, PRINA=0x0404, and PRINB=0x0000. NBG0 and NBG1 therefore have the same observed VDP2 priority (4) in this frame, and the four VDP2 window-control words are zero. This does not exclude VDP1’s separate priority, colour-calculation rules, or other timing; these facts do not open the native final compositor.

Frame 80: NBG1 owner remains unbound

A separate byte comparison of frame 80 from the authenticated long run shows BGON=0x0003, CHCTLA=0x1013, and NBG1 in character mode. NBG1’s visible raw span lies in VDP2 VRAM around 0x5c000 and consists of two-word PND patterns; it is unchanged between frames 78 and 80. No exact byte sequence for the FONT256.S2D Page, Character Generator, or Palette region occurs there, and no MENU.BPK/PRS3 source binds the same span. This is negative provenance evidence: frame 80 must not be attributed to FONT256 or MENU.BPK and must not yet feed the production compositor. The menu gate therefore remains at 3/8 and production readiness at 0%.

SLEV/SAL/SDDRVS trace gate

nexus_v1_scsp_write_trace_parse() and the separate main-SH-2 parser now save the first raw-byte offsets for the produced mailbox command, sound-CPU mailbox, SDDRVS handler, and SCSP voice register. For the sound-CPU trace, the order mailbox → handler → voice register is marked only when it actually occurs in the same raw trace. Two separate trace files lack a common time base and must not therefore be used to claim event ownership, SAL codec, MAP binding, or playback.

The external NXSLSC01 artifact was inventoried with scripts/analyze_nexus_slev_capture_envelope.py: header and payload are structurally valid, all 65,536 records are SH-2 writes, but none of the four retail FNV identities for SLEV00.BIN, SNDLEV00.SAL, SNDLEV00.MAP, and SDDRVS.TSK matches. It is therefore a runtime observation, not a source-bound capture. The SLEV/SAL/SDDRVS gate remains at 2/8 and production readiness at 0%.

Cold-boot progress (2026-10-27)

A fresh Japanese retail cold boot in Ymir now reaches the native title menu with NEW GAME, CONTINUE, and CONFIGURATION visible. The run confirmed the BIOS date/time page, advanced past the opening intro, and held Start on the title prompt. It loaded no emulator state and no game save. This closes the emulator evidence gap from system startup through the native title menu. Firestaff menu rendering, playable-level entry, real save loading, HUD, and gameplay parity remain unverified. The exact input schedule, screenshot hash, complete raw memory dump, and reproduction command are recorded in nexus_startup.md. The Ymir controller scheduler is submitted separately in yeager/Ymir PR #1.

English-version cold-boot reference (2026-10-27)

A separate authenticated English-version disc-image cold boot reaches the same native three-choice title menu without an emulator state or game save. Replaying the captured same-frame VDP1/VDP2 display state reproduces the retained 640×448 screenshot pixel-for-pixel. The source join has 126 informative matches among 137 textured draws; 11 zero-filled spans are excluded. The visible menu asset and CLUT owner remain unidentified, so this reference does not open Firestaff’s production menu or renderer gate. It also does not establish playable-level entry, save loading, HUD or gameplay parity. Details and hashes are in the English cold-boot receipt.