Firestaff Gap List — Historical Technical Analysis (2026-06-20)

Historical analysis — not the active backlog or release status. This long-form research record preserves individual findings and source locks from 2026-06-20 onward. Some rows deliberately describe superseded states, old paths, or work that is now out of scope. Do not use it to make a playability, platform, completion, or acquisition claim.

The active, reviewed sources are project status, platform status, missing functions by game, the root TODO-<game>.md files, and the completion matrix. Their current native real-media boundary overrides this record wherever they differ.

This document does not replace the active per-game TODO files. It remains a source-cited technical index for historical context and future research.

2026-09-29 platform boundary correction: DM2 PC-9821 support is removed at the user’s request. It has no catalog, startup, or runtime route. DM1 PC-9801, DM2’s separate PC-9801 demo, and X68000 remain preservation-only.

2026-08-12 Hint Oracle graphics correction: original HCSB.DAT is now strictly indexed as a four-segment archive from the real Utility Disk structure. The parser verifies its duplicated big-endian size table and exact file coverage before exposing a segment; the real English ST 2.0/2.1 archive proves spans 100, 29146, 1497 and 32 bytes. Segments 1 and 2 now follow the source-owned IMG2 expansion path, producing the Oracle’s 320×200 indexed surface and its 256×27 indexed font raster; segment 3 follows HINT001.C’s exact Atari RGB3-to-RGB4 conversion. This remains a resource boundary: graphical UI routing, segment-0 integer consumption, original text/page layout and frame/pixel parity are still open.

2026-07-31 correction: the isolated csb_hint_oracle_graphical_overlay module, which drew a hardcoded frame and 5×7 font rather than original Utility Disk pixels, was removed. HCSB.HTC parsing and source-verified text binding remain; a graphical Hint Oracle is open only with a source-owned UI route.

2026-08-06 Nexus S2D correction: older rows below that describe the real FONT256.S2D handoff as a 256-slot/16×16 flat-font parse or as a real-font framebuffer stamp are historical wording and are superseded. The current retail receipt uses the named S2D regions and exactly 242 authenticated 8×8 character-generator tiles. The 256 header codes, page/attribute character mapping, Shift-JIS glyph assignment and screen placement remain open; the flat 1bpp and section→glyph-range render paths are fixture-only.

Classification:


A. Cross-cutting gaps

A1. Asset format coverage

Gap Source Status
IMG1/IMG2 RLE 16-color image decoder ReDMCSB, sck, DMWeb DM Apple IIGS/FM Towns/PC-9801 edition pages FIXED (image_backend_pc34_compat.c IMG3_Compat_ExpandFromSource); remaining Apple IIGS proof is PO/ProDOS media handoff for 2.0/2.1, while remaining FM Towns and PC-9801 proof is real media handoff, version/hash classification, and IMG2 asset receipts
IMG3/IMG4 4bpp local-palette image dmweb Data Files FIXED (same code path)
IMG5 4bpp planar image (Amiga, SNES) greatstone d_items.html / greatstone d_articles_snes_multipal.html / DMWeb DM Amiga and SNES edition pages FIXED in v2.9.2 for raw IMG5 decode (firestaff_img5_decode.c, commit 216b0b67); remaining Amiga proof is real-media handoff across DM Amiga 2.0/2.1/2.2/3.6. Remaining SNES proof is cartridge-ROM handoff plus SCK mapfile palette-selection metadata (PALSEL, TILESBYITEM, PALSEL_INCR) for correct per-tile item/portrait colors; this is palette/presentation evidence and console-runtime classification, not the bounded decoder itself
LZW-compressed items (DM Atari ST, CSB Atari ST) dmweb Data Files + DM Atari ST edition page PARTIAL — decoder is contract-verified (m11_gfx_lzw_decompress, dm1_lzw_round_trip PASS 1/1 on 2026-06-21); DMWeb’s DM Atari ST page now pins the source-media set for real handoff (STX originals for English 1.0/1.1/1.2, German 1.2, French 1.3, plus separate cracked/hacked media); real Atari ST asset handoff remains BLOCKED-DATA
FTL container format (Amiga, X68000, MegaCD) greatstone d_ftl.html / DMWeb DM Amiga and X68000 edition pages PARTIAL / OPEN-BOUNDED — firestaff_ftl_container_unit PASS 1/1 on 2026-06-22; parses the 20-byte common header, 12-byte hunk headers, BSS/DATA/CODE hunk discovery, BSS metadata, and verifies documented common/BSS/DATA/uncompressed-CODE checksums. firestaff_ftl_hunk_data_zero_run_unit PASS 11/11 on 2026-06-25; bounded HUNK_DATA area_1 zero-run decompression per greatstone d_ftl.html “Note 7” with explicit bounds checks (rejects truncated run headers, odd input length, and declared uncompressed-size mismatches against the HUNK_BSS area_1 in-memory size field). 2026-06-25 X68000 <-> FTL handoff added: firestaff_x68k_ftl_handoff_unit PASS 5/5 cross-module test that builds a synthetic FTL container with a chosen data_area1_memory_size, parses it with firestaff_ftl_container, and asks the X68000 HDM classifier whether the declared area_1 fits inside the DMWeb-documented 1232 KB 2DHD disk; companion firestaff_x68k_media_classify_unit PASS 13/13 covers the DMWeb X68000 geometry constants, copy-protection-sentinel detection, and configurable FTL-magic scan window. DMWeb’s DM Amiga page adds the practical media/protection boundary for official SPS IPF, unofficial IPF, protected ADF, cracked ADF, hard-disk patch, and port media. DMWeb’s DM X68000 page adds the HDM/floppy boundary for a v3.0 original image missing copy-protection sectors, a cracked image, and a blank save disk. Remaining: HUNK_CODE 0x5223 decompression/checksum verification, mapfile item extraction (greatstone d_mapfile.html), real FTL corpus gates, and runtime asset loading.
PAK container format (Atari ST) greatstone d_pak.html + DM Atari ST edition page FIXED — firestaff_pak_decode_unit PASS 1/1 on 2026-06-21; parses 28-byte Atari ST executable header plus nibble-coded table/literal compression. Remaining proof is real-media extraction only: DMWeb’s DM Atari ST page records START.PAK-adjacent STX/ST/MSA/RamDisk provenance and sector #F7 copy-protection context
Apple IIGS PO/ProDOS media import DMWeb DM Apple IIGS edition page OPEN-BOUNDED — DMWeb identifies the 1989 Apple IIGS 2.0/2.1 English line, original PO images that cannot boot because the copy-protection sector is absent, Computist/ACS cracked variants, a hard-disk-patched image, an empty save disk, 1 MB RAM requirement, 2.0 ROM03 ->002C main-dungeon failure, and the 2.1 fix. Remaining: PO/ProDOS extraction, canonical-vs-cracked-vs-hard-disk classification, hash coverage, IIGS keyboard/audio hotkey gates, ROM01/ROM03 memory-boundary evidence, and emulator/runtime launch proof.
DM1 FM Towns CD-image import DMWeb DM FM Towns edition page OPEN-BOUNDED / PARTIAL-EVIDENCE — DMWeb identifies the Japan v2.0 English/Japanese CD line, November 1989 release, redump BIN/CUE masters T1/T2, an ISO/CUE archive, CD audio tracks 02-20 (with tracks 04/07/20 unused and track 20 silent), and FM Towns-specific keyboard behavior. Bounded redump-layout classifier added 2026-06-25 (firestaff_fmtowns_cd_classify): parses redump-style CUE sheets in memory, extracts the disc track list (FILE/TRACK/INDEX/PREGAP), distinguishes MODE1/2352 vs MODE1/2048 vs AUDIO tracks, optionally reads an ISO 9660 PVD signature at the standard data-track byte offset, and scores candidate game/version families from the documented CD-audio track tables for DM1 (17..19 audio), CSB (28..30 audio), and DM2 (5..7 audio + silent track 8). firestaff_fmtowns_cd_classify_unit CTest gate covers DM1/CSB/DM2 fixture layouts, single-ISO MODE1/2048 layout, malformed-CUE rejection, LF-only line endings, REM/’;’ comments, PREGAP/INDEX 00 markers, synthetic ISO 9660 PVD detection, and a no-match return for tiny discs. Remaining: BIN/CUE or ISO/CUE extraction, EN/JP hash classification, real GRAPHICS.DAT/DUNGEON.DAT and IMG2 receipts, CD-audio track receipts, FM Towns input gates, and emulator/runtime launch proof.
DM1 PC-9801 HDM/floppy preservation DMWeb DM PC-9801 edition page INTENTIONALLY UNSUPPORTED — retain read-only HDM/floppy classification and provenance for the Japanese v2.0 line, but do not add extraction, cache, startup, game-view, input or emulator/runtime support.
DM1 X68000 HDM/floppy media import DMWeb DM X68000 edition page + DMWeb copy-protection page (Sharp X68000 section) OPEN-BOUNDED / PARTIAL-EVIDENCE — DMWeb identifies the Japanese v3.0 X68000 line, 1990-01-26 release, 31 kHz screenshot set, HDM original image that cannot boot without copy-protection sectors, cracked image, and blank save disk. 2026-06-25 X68000 media classifier added: firestaff_x68k_media_classify_unit now covers geometry constants, empty input, too-small input, single-side / full-disk / oversize size classes, blank save-disk detection, HPR-0007 Track 1 Side 1 Sector 9 sentinel detection, FTL-payload magic detection at offset 0, configurable explicit-window FTL magic candidate counting, FTL handoff fits / overflow, unprotected-disk flag, and NULL safety. 2026-06-25 X68000 <-> FTL container handoff added: firestaff_x68k_ftl_handoff_unit PASS 5/5 cross-module test that builds a synthetic FTL container with a chosen data_area1_memory_size, parses it with firestaff_ftl_container, and asks the X68k HDM classifier whether the declared area_1 fits inside the DMWeb-documented 1232 KB 2DHD disk. 2026-06-26 real-media receipt + cross-module FTL-handoff added: firestaff_x68k_media_receipt_real_corpus_probe verifies the local public DMFiles DM1 X68000 v3.0 HDM geometry receipt, and firestaff_x68k_ftl_handoff_real_corpus_probe now compares the default 32 KiB classifier scan, FIRESTAFF_X68K_SCAN_WINDOW_FULL, and FirestaffX68kMedia_CountFTLMagicCandidates(..., 0, hdm_size) before parsing embedded resources via FirestaffFtlContainer_Parse; it finds 2 parseable FTL containers at offsets 73,728 (0x12000) and 460,800 (0x70800), verifies the first FTL’s BSS data_area1_memory_size (24,720 bytes) fits the on-disk HDM media class, and cross-checks the FTL-handoff helper’s documented boundary cases. 2026-06-29 receipt-class gate added: the classifier covers conservative receipt classes for FTL payloads, blank save disks, live protection-sector captures, off-axis sentinel-only media, nonblank/no-sentinel media, and partial-side dumps; the real-media receipt probe reports receipt_class=off_axis_sentinel_only, total_hpr=1, off_axis_hpr=1, first_off_axis=464078, proving the embedded backup/label HPR-0007 string is not promoted to live protection-sector evidence. Known limitation now bounded: the legacy FirestaffX68kMedia_Classify() field still scans only the first 32 KiB for single-resource .FTL sniffing, while FirestaffX68kMedia_ClassifyEx(..., scan_window_bytes, ...) and the explicit-window helper cover full-HDM receipt scans without pretending every raw 0x6160 hit is parseable. Remaining: HDM/floppy extraction on a real preserved master, original-vs-cracked/save-disk classification, real GRAPHICS.DAT/DUNGEON.DAT extraction and payload receipts, FTL payload decode/runtime asset loading, 31 kHz presentation evidence, X68000 keypad/arrow input gates, and emulator/runtime launch proof. Copy-protection/sector gaps remain honest: public DMFiles HDMs lack the HPR-0007 sentinel and the only operational check is documented as broken on DM and CSB alike (DMWeb Sharp X68000 section).
DM1 SNES / Super Famicom ROM import DMWeb DM Super Famicom / Super NES edition page DEFERRED-LARGE — DMWeb identifies four SMC cartridge versions (English NTSC 1.0, English PAL 1.0, Japanese NTSC 1.0, Japanese NTSC 1.1), Japanese/English screenshots and videos, 19 SPC music dumps, bsnes MP3 track evidence, slow-rendering behavior, and SNES-specific bugs. Remaining: cartridge-ROM import/classification, tile/palette rendering, SPC/music receipt handling, controller/input mapping, version-specific bug gates, and emulator/runtime launch proof before any native SNES claim.
DM1 PC 3.4 DOS presentation/input receipts DMWeb DM PC edition page OPEN-BOUNDED / EVIDENCE-ONLY — PC 3.4 EN and multilingual are already hash-verified runtime targets. DMWeb pins the surrounding DOS edition boundary: USA English, Europe English/French/German, VGA/EGA screenshots, PC-only ending animation, entrance music excerpted from FM Towns track 05, DOSBox/Smacker capture provenance, numeric-keypad / Alt-S / Ctrl-Q-Ctrl-A input, analog joystick sensitivity, Alt-keypad mouse simulation, and a Spanish fan translation that must stay outside canonical hash claims. Remaining: focused VGA/EGA, ending/music, and PC input receipts.
DM1 overview version-comparison receipts DMWeb DM overview page OPEN-BOUNDED / EVIDENCE-ONLY — DMWeb’s overview page records cross-version behavior not owned by one edition page: two dungeon-view perspective families, PC/Atari ST/X68000 mono sound versus Amiga/Apple IIGS/SNES stereo, missing Atari ST/X68000 creature-move/War Cry/Blow Horn sounds, early-version fountain/wall-click behavior, Kid Dungeon only on Apple IIGS 2.0/2.1 and Amiga 2.2 EN, PC-only entrance music/endgame animation, Atari ST 1.0 Lock Pick placement plus v1.2 regeneration changes, X68000 larger view, PC-9801 reduced palette/three light levels, SNES redrawn graphics/music/introduction, FM Towns CD audio, and Atari ST-vs-PC dungeon deltas. Remaining: turn these into focused receipt gates as each platform’s real media becomes available.
Hint Oracle text and graphics archives (CSB) dmweb Hint Oracle Files / ReDMCSB HINTHTC.C,HINTLZW.C,HINTGRAP.C,HINTSCR.C,HINTTEXT.C,EXPAND.C PARTIAL / OPEN-BOUNDED — Hash-verified HTC parsing, caching, page decoding and structured UI binding are present for the five dmweb-documented variants: English R1/R2/R3, Amiga French and Amiga German. csb_hint_oracle_htc_real_scan_and_load_md5() and csb_hint_oracle_ui_panel_load_md5() select an exact registered source MD5; they reject arbitrary values and never silently fall back to another Utility Disk. csb_hint_oracle_dat_real_scan_and_load() applies the same hash-only rule to HCSB.DAT (EN R1/RX/ST2, EN R2/R3, FR, DE), including archive-member reads without copying game data into the library. CSB_HintOracleAtariRuntime joins the Atari R1 pair (HTC 8ce69b54cf255a15e98e909bb45b9742, DAT 708e113c869ab922633e885aa72a3c77) with a checked MINI.DAT GAMEBLOCK2 position receipt, source-order seven-row selection and all four original 320×200 states. It is exposed through both M12’s CSB UTILITY DISK — HINT ORACLE post and explicit CLI --csb-hint-oracle; both fail closed unless the R1 pair and native MINI.DAT pass. The opt-in real-media regression renders every state; no host frame/font/palette fallback is admitted. Other release/language DAT/HTC pairs remain separate until their pairing is source-verified. Original click capture/cadence, original-frame capture and pixel parity remain open.
CMP portrait image format sck tutorial FIXED — firestaff_cmp_decode_unit + csb_v1_cmp_import_pc34 PASS 2/2 on 2026-06-21; decoder parses the 496-byte CSB Utility Disk champion portrait format and import glue writes it into CSB V1 champion/party structures
AMG sound format (CSB utility disk) dmweb Data Files / ReDMCSB SWSHSND.C:F0908_InitSound / local original CSB Amiga Utility Disk corpus FIXED for documented CSB Utility Disk sound-effect files — firestaff_amg_decode_unit parses the bounded SND2 shape (TELE2, SWIPE, MAGEXPLO, EXPLOS1, DRAGON): big-endian sample count, signed 8-bit mono PCM, then 0..3 trailing bytes. The separate skip-safe csb_v1_amiga_amg_real_media gate reads those five files as ZIP→ADF→AMG virtual members in RAM, and locks their original payload/trailing pairs 1506/1, 995/2, 3107/2, 3970/1, and 4003/2; this corrects the duplicate parser’s former fictitious control-word interpretation. PAL/NTSC rate helpers remain source-cited. Runtime playback/rate binding and non-SND2 NAKED.AMG are not claimed.
MVE (Interplay, DM2 PC) dmweb Animations OPEN-LARGE — DOS-stub + Interplay MVE binary
QuickTime MooV / .mov (DM2 Macintosh retail) greatstone d_articles_mac.html / dmweb Animations PARTIAL — the retail HFS reader keeps authentic data and resource forks in RAM, extracts each present moov resource without flattening, and builds a validated in-memory moov+mdat view for the four present movies (0x19; Story.MooV is absent). The private view preserves source ownership and handles the authentic four-byte prefix before Swoosh.MooV’s mdat. The optional FFmpeg-backed in-memory route rebases the private QuickTime chunk offsets and decodes all four present movies’ authentic video/PCM paths; real-asset decoder and M11 startup gates pass, and no converted movie is written. M11 holds each decoded frame for its authentic positive QuickTime duration, and the real-media gate rejects non-monotonic timestamps or zero-duration frames. Exact original QuickTime 1.x/2.x native presentation ownership remains open. The same boot profile retains the authentic Mac Music, General.sounds, and Weapon.sounds resource forks; a bounded format-1 snd parser validates their 2/19/12 resource sets and resource 10001 is hash-checked and transported through the SDL host mixer. Complete resource selection, gameplay timing, and MIDI/music scheduling remain open.
DMDF/DGN (Nexus Saturn) DMWeb Nexus pages / local verified assets PARTIAL — DMDF parser exists (src/nexus/), DGN partially. DMWeb’s Nexus page confirms the Saturn-only Japanese release, true 3D engine, 15-level structure, and Masaaki Shibata map material for levels 2-12; these should bound future DGN/world-loader evidence
MNS (Nexus monster/spell files) locally verified PARTIAL — handled in launcher/profile detection, runtime sparse
S2D (Nexus font files) locally verified PARTIAL — parser exists, has a bounded bitmap-to-indexed-framebuffer renderer, a bounded real-on-disk SEGA SATURN SCR section-table parser + helpers, and a bounded section→glyph-range map + runtime text-layout cursor that walks ASCII strings through the existing renderer. 2026-06-21 SEGA SATURN SCR parser determinism probe added: firestaff_nexus_v1_saturn_font_determinism_probe (commit b2157a62, ctest nexus_v1_saturn_font_determinism) covers load/free/get_glyph + dimension inference (16x16 / 12x12 / 8xN buckets) + NULL-safety + 50-repetition determinism. 2026-06-22 render gate added: firestaff_nexus_v1_saturn_font_render_probe (ctest nexus_v1_saturn_font_render) expands parser-exposed 1bpp glyph bytes, draws into a synthetic indexed framebuffer, and verifies glyph dimensions, expansion, clipping, transparent/background behavior, deterministic framebuffer hash, NULL/bounds handling, plus an optional local FONT256.S2D parser-to-render handoff when the verified 25,012-byte asset is present. 2026-06-25 SCR section-table parser added: firestaff_nexus_v1_saturn_font_scr_sections_probe (ctest nexus_v1_saturn_font_scr_sections, 55/55 PASS) walks the 32-entry SEGA SATURN SCR section table at offset 0x20 of an SEGA SATURN SCR payload via nexus_v1_font_load_sections() + nexus_v1_font_section_count() + nexus_v1_font_get_section() + nexus_v1_font_section_table_index() + nexus_v1_font_section_in_bounds(). Synthesizes a small SCR fixture to lock NULL-safety, too-small-buffer rejection, invalid-magic rejection, all-reserved/zero entry skipping, single-populated-entry handling, out-of-bounds section skipping, table-overlap skipping, four-populated FONT256.S2D-shape layout (indices 0/2/4/6), in-bounds validation, original-index preservation across skips, and a fully-bound four-populated real-asset chain (entries 0x0120+0x2010 / 0x2130+0x3c90 / 0x5dc0+0x0210 / 0x5fd0+0x01e4 form a contiguous non-overlapping partition that ends at file_size). When ~/.firestaff/data/nexus/FONT256.S2D is present the optional gate locks all four real section windows and the [0]->[1]->[2]->[3] chain end at 0x61b4 inside the verified 25,012-byte asset; entries 28..31 (non-zero but out-of-bounds tail padding the flat 1bpp loader silently consumes) are skipped by the parser without rejecting the whole table. 2026-06-28 section→glyph-range map + bounded runtime text-layout cursor added: nexus_v1_s2d_text_layout (include/nexus_v1_s2d_text_layout.h, src/nexus/nexus_v1_s2d_text_layout.c) builds a Nexus_V1_S2D_SectionGlyphMap from the parsed sections (each populated section holds a contiguous (char_start, char_count) slice of the character table, capped against bytes_per_glyph and the SCR header char_count), routes glyph indices via nexus_v1_s2d_glyph_range_lookup(), and exposes a Nexus_V1_S2D_TextLayout cursor that walks ASCII strings through the existing nexus_v1_font_draw_glyph_indexed() (advance by char_width + letter_spacing_x, '\n' breaks, '\t' steps, max_chars cap, chars_skipped for out-of-coverage). CTest nexus_v1_s2d_runtime_text_layout (99/99 PASS) covers NULL-safety, empty/single/four-populated synthetic map invariants, layout cursor + reset + free + per-glyph advance + multi-line + max_chars + out-of-coverage skip, deterministic FNV-1a framebuffer hash across two "NEXUS" runs, and a real-asset FONT256.S2D skip-safe path that drives "NEXUS" through the real parser→map→layout chain 3 times and asserts bit-identical FNV-1a framebuffer hash. Remaining: decode which bytes inside each populated section hold the actual glyph payload (the flat 1bpp loader still owns that decode), support real Shift-JIS double-byte characters / proportional advance / vertical text, and capture an actual Nexus screen using the real font before calling this FIXED.
TAI/SAL/MAP (Nexus level data) locally verified PARTIAL — loaders exist; TLINK metadata and rendering sparse
BPX/BPK (Nexus compressed archives) locally verified PARTIAL — nexus_v1_bpk_archive is CTest-gated and locks the observed Nexus MENU.BPK BPPK/BMPD directory shape: BPPK outer size, BMPD section header, 163 big-endian candidate offsets, 162 PRS3 payload markers, one raw payload, monotonic bounds checks, and local MENU.BPK receipt checks when the file is present. nexus_v1_bpx_bpk_archive_boundary also recognizes the verified nexus/MENU.BPK size/hash marker, keeps unknown real .BPK/.BPX payloads unsupported, and locks a bounded synthetic BPX0 table contract for entry bounds, lookup, stored-entry extraction, and unsupported-compression reporting. 2026-06-27 byte-level boundary inspection (pass1082) added: three new nexus_v1_bpk_archive APIs (get_entry_prefix / inspect_prs3 / mode_distribution) walk the verified real MENU.BPK structure without claiming PRS3 decompression — 20-byte prefix (width @ 12..14 BE u16, height @ 15, mode tag @ 19), PRS3 magic + 0x00000001 version + pixel-count sub-header, and the strongest single signal that the reverse-engineered prefix layout is right: every one of the 162 PRS3-bearing entries has width * height == prs3_pixel_count. Mode distribution {6:14, 14:62, 22:39, 30:47, 10:1} (sum = 163); entry[0] is a unique directory trailer (mode tag 10) whose raw bytes 0..4 = 0x00015940 (= offset[161]) and 4..8 = 0x00015980 (= offset[162]). nexus_v1_bpx_prs3_parse() adds a stronger synthetic BPX3 stream contract that mirrors the real MENU.BPK layout (16-byte name + BE u16 width + mode tag + BE u8 height + BE u32 pixel_count + BE u32 payload offset) without claiming PRS3 decompression. Skip-safe CTest nexus_v1_menumenu_bpk_inspect (49/49 PASS) verifies the synthetic BPX3 contract + optional real MENU.BPK receipt. 2026-06-28 surface-class + BPX3 directory-trailer contract (pass1083) added: three new nexus_v1_bpk_archive lookup APIs (mode_to_surface_class / mode_to_bpp / surface_estimate) describe the unpacked surface shape each PRS3-bearing entry would decode to (INDEXED_8BPP / RGB565 / RGB888 / RGBA8888 / DIRECTORY_TRAILER enum + bytes-per-pixel + rowstride + surface_bytes = width * height * bpp) without claiming PRS3 decompression; nexus_v1_bpx_prs3_parse() now also recognises a synthetic BPX3 directory-trailer entry (mode tag 10, zero width/height/payload_offset, no PRS3 magic) tagged with NEXUS_V1_BPX_BPK_METHOD_DIRECTORY_TRAILER. CTest nexus_v1_bpk_surface_class (38 PASS) and skip-safe CTest nexus_v1_bpk_surface_class_probe (522 PASS on the local ~/.firestaff/data/nexus/MENU.BPK) cross-check 14 indexed / 62 RGB565 / 39 RGB888 / 47 RGBA8888 entries with every rowstride == width * bpp and every surface_bytes == width * height * bpp. Remaining: identify the PRS3 compression algorithm from real MENU.BPK bytes / executable disassembly, decode the four bpp/mode-tag values into actual palette/indexed/RGB565/RGB888/RGBA surfaces, hand the decoded payloads into a renderable Nexus menu graphics pipeline (atmospheric HUD/textures + first Nexus screen capture with the real MENU.BPK), and wire the directory-trailer info into launcher metadata.
Theron’s Quest Track 02 BIN/ISO locally verified FIXED for boot/bank-anchor coverage, PARTIAL for broader semantic Track 02 decoding — JP canonical ISO, JP extras BIN, and US extras BIN launch-tested by tier1_strict_boot_probe (Theron rows PASS, 2026-06-21) plus theron_v1_launcher_scan_reuse and theron_v1_track02_bank. 2026-06-22: theron_v1_runtime_screenshot_readiness records real Firestaff runtime-probe/BMP hash receipts when those Track 02 paths are present, without promoting public screenshots or claiming full dungeon-bank parity. 2026-06-25: theron_v1_track02_decode_descriptor_table() (CTest theron_v1_track02_descriptor_table PASS) reads the 9-word LE stride table at every JP/US anchor (US ISO 0x1584, US raw 0x70be06/0x70e2c6/0x710904, JP raw 0x70b4d6/0x70d996/0x70ffd4) with shape-only validation (entries 0x0020..0x2020, stride 0x0400, half-open range [0x0020, 0x2420)). The decoder is shape-driven only: it does NOT claim per-entry semantic type, dungeon-level binding, runtime loader handoff, or level-descriptor semantics — per-entry semantic binding and broader decoder coverage remain open.

Nexus status correction, 2026-08-08: The older BPX/BPK row above still describes PRS3 as an unidentified compression algorithm. The bounded DMWeb byte decoder now passes test_nexus_v1_bpk_archive against the verified retail MENU.BPK and decodes all 162 PRS3 surfaces to their declared pixel counts. The remaining gap is Saturn presentation ownership: VDP1 command order, VDP2/CLUT binding, menu placement and screen identity. No decoded host pixels are promoted to production drawing until those observations exist.

A2. Mapfile system

Gap Source Status
YAML/TOML mapfile parser for arbitrary item description greatstone d_mapfile.html FIXED — 2026-06-22: added bounded shared firestaff_mapfile parser/API plus data-free firestaff_mapfile_unit CTest for Greatstone mapfile 2.5-style header properties, six-field item rows (number,type,attributes,description,long_description,comment), raw item descriptions, CRLF/whitespace/quoted header values, SIZE attribute extraction, line-numbered errors, and capacity/malformed-row rejection. Added firestaff_sck_mapfile parser/CTest for Greatstone/SCK type name offset size rows, including comments, blank/CRLF lines, decimal/hex offsets, name lookup, u32 rejection, trailing-token rejection, and target-file bounds validation. The mapfile-to-asset-loader handoff remains tracked separately below.
Mapfile-to-Firestaff-asset-loader bridge greatstone d_mapfile.html PARTIAL — 2026-06-22: tools/fetch_greatstone_sck_mapfiles.sh now reproduces the bounded curl/unzip handoff from Greatstone’s SCK release into a local db/map/*.map corpus, and firestaff_sck_mapfile now parses real SCK 2.x comma rows (item,type,attrs,description,long,comment), captures FORMAT/ENDIAN, preserves ordinal/type/label metadata, extracts SIZE= attributes, and builds bounds-checked asset slices for offset/size-backed rows. 2026-06-25 live selection bridge added: bounded firestaff_sck_asset_bridge parses the SCK _mapping.xml index into (md5, path, file, games[]) rows, performs MD5+filename lookup, and selects a single concrete asset slice from a referenced .map by item number or description substring with an IMG/RAW/etc. type prefix filter; CTest firestaff_sck_asset_bridge PASS 1/1 covers synthetic _mapping.xml with one self-closing row, one nested <game> row, and a SCK 2.x dm_atari_demo-shape mapfile carrying IMG1+SIZE= slices (select 012288 IMG1 @12288 size 2560; rejects unsized IMG3 rows as NOT_SIZED; rejects oversized slices; rejects malformed mapfiles). Real-corpus probe firestaff_sck_asset_bridge_real_corpus_probe PASS when $FIRESTAFF_GREATSTONE_SCK_DIR (or ~/.cache/firestaff/greatstone-sck-mapfiles/db/map) carries _mapping.xml and dm_atari_demo.map, parsing 231 rows and selecting 012288 IMG1 Dungeon Graphics @12288 size 2560. 2026-06-29 RAW decoder handoff gate added: the same bridge now exposes FirestaffSckBridge_DecodeRawSelection(), a bounded RAW identity decoder surface that validates a selector-chosen RAW* slice against caller-owned bytes and returns a borrowed byte view plus deterministic checksum; synthetic CTest coverage proves RAW selection+decode and PAL/SND unsupported-decoder rejection without storing corpus bytes. Remaining: per-asset-type decoder wiring beyond RAW (IMG1/IMG3/IMG5 still go through the existing image backend; FTL/PAL/SND items remain selector-visible but no Firestaff-side decoder is wired), live menu/launch profile integration, and broader coverage beyond SIZE= slices.

A3. Engine behaviour parity

Gap Source Status
CSB-specific hidden-code items 558-562 (Amiga executable blobs) greatstone d_items.html FIXED — csb_hidden_code_skip_table_unit + csb_v1_graphics_hidden_item_skip_pc34 PASS 2/2 on 2026-06-21; remaining CSB real-asset rendering work is tracked under CSB runtime/graphics rows
Atari ST hidden code skip greatstone d_items.html FIXED — same skip-table/loader gates cover Atari ST items 21/538/548 and 558-562
Champion panel portrait loading from CSB utility disk CSB docs FIXED for current Utility Disk portrait handoff — CMP decode/import, Utility Disk flow, imported-party inventory handoff, runtime load/attribute gates, and data-free runtime portrait render-source selection are now CTest-backed. csb_v1_portrait_render_handoff_pc34_compat proves synthetic .CMP → CSB_V1_PartyState → runtime party snapshot → exact CSB_V1_Champion.Portrait render source with ReDMCSB PANEL.C:F0354 / CHAMDRAW.C:F0292 source lock. Real CSB viewport/HUD captures and pixel parity remain tracked under CSB graphics/runtime rows.
Savegame format (DM1, CSB) ReDMCSB + dmweb FIXED for DM1 (dm1_v1_save_load.c), PARTIAL for CSB — native Atari MINI.DAT is now admitted end-to-end through the regular M12 Continue row and F0435 (csb_v1_atari_mini_menu_resume_archive). A stock CSBWin csbgame2.dat also reaches F0435, the live C0128/C232 frame, movement and inventory through the start menu and CLI. CSBWin write-back remains fail closed: Firestaff can only make a provenance-checked byte copy or bounded decoder-core export until its saved dungeon, timer queue and EXPOOL/DSA continuation sections have a complete source-verified writer.
Savegame format (DM2) skproject source PARTIAL
Savegame format (Nexus .sav) locally verified PARTIAL
Savegame format (Theron .SRM) locally verified PARTIAL — 2026-06-25: synthetic .tqsv slot round-trip, rejection, verification, and cross-slot export/import remain CTest-gated; new theron_v1_srm_classifier adds a bounded 5-slot Save Disk classifier (theron_v1_srm_classifier_probe + test_theron_v1_srm_classifier_pc34) that recognizes the gzipped-deflate save body dmweb references, reports ABSENT on the current host (no real .srm staged), and accepts a real file when one is placed under $HOME/.firestaff/data/theron/save/ or $FIRESTAFF_THERON_SRM_DIR. Real .srm payload decoding and cross-slot import to Theron_DungeonProgression/champion blocks remain out of scope.
Custom dungeon import (DM1 dungeon.dat, CSBWin dmsave/csbgame) dmweb Custom Dungeons page PARTIAL / BLOCKED-DATA — 2026-06-22: M12 has a disk-backed custom_dungeon_m12_real_path CTest for data/custom/<name>/DUNGEON.DAT discovery, mixed-case community filenames, header validation, sorted listing, invalid-entry rejection, and valid-entry selection. custom_dungeon_import also covers the existing M12 launcher scanner and DM1 V1 engine scanner with synthetic DUNGEON.DAT fixtures: valid header/map-count parsing, alphabetical launcher list, case-insensitive dungeon.dat/graphics.dat discovery, compressed-signature rejection, too-small rejection, valid-entry selection, and invalid-entry refusal. 2026-06-27 CSBWin dmsave/csbgame loader-boundary contract gate landed: csb_v1_csbwin_save_loader_boundary_pc34_compat (14 documented shapes: 3 accept + 11 reject; per-shape csb_v1_import_csb_save_buffer() loader-boundary verdict). 2026-06-29 staged-file discovery/readiness gate landed: the same module now classifies csbgame.dat, csbgame.bak, dmsave.dat, and dmsave.bak basenames case-insensitively, maps bytes to the documented save shape, reports the actual loader verdict, and emits should_attempt_import plus stable rejection labels for DM1 raw saves, CSBWin 512-byte saves, DSA-marked saves, bad versions, bad magic, and truncation. CTest csb_v1_csbwin_save_loader_boundary_pc34_compat_unit PASS 112/112 + skip-safe real-asset probe csb_v1_csbwin_save_loader_boundary PASS. Remaining blocker: real community/custom dungeon corpus handoff, the CSBWin 512-byte XOR-pad obfuscation-key decoder, the DM1→CSB raw-save conversion path, DSA section import, CSBgraphics.dat payload decode/runtime binding, and the end-to-end CSBWin save importer wiring.

A4. i18n / l10n (post v2.9.1)

Gap Source Status
19-launcher-locale cycle po/validate_po_layout.sh FIXED in v2.9.2
DM1 native translations (17 non-Swedish locales) po/dm1_translations_complete.py PARTIAL — validator now reports 492-540/547 native entries across the 17 non-Swedish catalogs; remaining gaps are fallback/blank entries plus native QA
CSB native translations po/csb_translations PARTIAL — sv/fr/de/ja/zh are 33/33 native; the other shipped non-English catalogs are currently fallback-only
DM2 native translations po/dm2_translations OUT-OF-SCOPE — DM2 slice not implemented
Nexus native translations po/nexus_translations PARTIAL — validator reports 28-30/30 native entries across every shipped non-English catalog; remaining work is native QA/runtime rendering, not empty scaffolding
Theron native translations po/theron_translations PARTIAL — sv now has 38/38 native runtime entries; fr/de/ja/zh have 35-37/38 native entries; 13 shipped catalogs remain fallback-only and native QA/runtime rendering is still open
Native-vs-fallback separation in validator po/validate_po_layout.sh FIXED — validate_po_layout.sh now reports nonblank coverage separately from native coverage and marks fallback-only catalogs as FALL; bash -n po/validate_po_layout.sh && bash po/validate_po_layout.sh PASS on 2026-06-21
Native QA on terminology / runtime rendering po/ OPEN-LARGE — needs native speakers

A5. Tooling

Gap Source Status
compare_to_greatstone.py SHA256 probe tools/asset-validate/ FIXED in v2.9.2 (commit 0d89adc6)
PLATFORM_MATRIX.md version support map docs/PLATFORM_MATRIX.md FIXED in v2.9.2 (commit 32dcf76c)
DMWEB_REFERENCE.md consolidated reference docs/DMWEB_REFERENCE.md FIXED in v2.9.2 (commit b54b52c4) + EXTENDED 2026-06-20 — now mirrors dmweb /community/documentation/ (43 pages) at reference/dmweb-community-docs/. 19 → 62 pages surveyed, see Section I.
Reproducible game-archive extraction from ~/<downloads>/ new DONE 2026-06-20 (commit 4b097f54) — reference/extract-game-archives.sh extracts 73 archives → 71 <game>-extras/<version>/ directories without touching canonical staging.
--scan-data smoke reports real READY-path:er existing FIXED for the current gate — asset_validate_coverage_by_game is wired in CTest and PASS; tier1_strict_boot_probe is wired in CTest and PASS for all present in-scope launch paths on 2026-06-21, including CSB canonical and CSB Amiga 3.3 Meynaf FR via the CSB READY marker. Nexus virtual-ISO launch remains tracked as a Tier 4 runtime/launcher gap, not a Tier 1 path-discovery gap. 2026-06-25 data-dir picker / platform-matrix data-free regression added: firestaff_data_dir_picker_platform_matrix_probe (ctest data_dir_picker_platform_matrix) builds a synthetic data root that mirrors the tier1_strict_boot_probe sub-layouts (dm1/, dm1-multilingual/, dm1-extras/legacy-dos/, csb/, csb-extras/legacy-amiga-dms/, dm2/, dm2-extras/{dos-en,dos-fr,pc-fr,pc-de}/, theron/Theron's Quest (Japan) (Track 02).iso, theron-extras/{japan,usa}/track02.bin) and locks: empty-root no-availability + single search-root + zero duplicate-root skips; DM1 (via pc34-multi), CSB (via pc34-en), DM2 (via pc-en), and Theron (via pce-jp) availability, while Nexus stays unavailable without a DM.BIN; per-game first-matched version determinism; asset_find_by_md5 recursive discovery for every nested leaf; negative-discovery rejection of an unknown hash; re-scan clearing availability when the new folder has no match; and re-scan idempotence for the same root. Locks the M12 layer under tier1_strict_boot_probe so the data-dir picker stays honest across the platform-matrix rows.
Real-data regression tests (greatstone db_data) greatstone sck tool PARTIAL / OPEN-BOUNDED — tools/verify_greatstone_db_data_paths.py is now CTest-gated as greatstone_db_data_paths_probe and the OFFLINE fixture at tests/fixtures/greatstone_db_data_paths/index.json carries only derived metadata (status code, content-type/length hints, <title> text + SHA-256, link count). 10 documented-current db_data paths (DM dm_pc_34/graphics.dat/graphics.dat.html, DM dm_snes_11_jp_ntsc/smc/smc.html, CSB csb_atari_21_en_stx/graphics.dat/graphics.dat.html, CSB csb_amiga_udr2_en/hcsb.htc/hcsb.htc.html, DM2 dm2_pc10_en/graphics.dat/graphics.dat.html, DM2 dm2_amiga_10_enfrge/lang.ftl/lang.ftl.html, DM2 dm2_segacd_10_en/stry.dat/stry.dat.html, plus the three g_dm/g_csb/g_dm2 index pages) and 3 obsolete c_dm_* / c_csb_* / guessed-DM2 404-regression paths are all locked at the gap-list level. --online --write (opt-in via env FIRESTAFF_GREATSTONE_PROBE=1) refreshes the evidence + fixture in one step, drops the body after extracting metadata, and never persists copyrighted bytes (tools/asset-validate/no_game_data_in_git.py PASS). Remaining: keep compare_to_greatstone.py aligned with VERIFIED_HASHES.md plus local *-extras/ alternatives and broaden the curated path set as more reachable db_data examples are pinned.
Lefthook in PATH for CI build/CI hygiene FIXED — .github/workflows/verify.yml installs Go, installs lefthook, exports $(go env GOPATH)/bin, and runs lefthook run ci; local dev machines may still no-op gracefully when Lefthook is absent

A6. Build / CI

Gap Source Status
Strict warnings -Wall -Wextra -Werror CI verify.yml FIXED
Phase A probe (headless invariants) CI FIXED (23/23)
Audio probe CI FIXED
Cross-platform determinism CI FIXED
_G2157_ undefined symbol in firestaff_m10 CMakeLists.txt FIXED — image_backend_pc34_compat_globals.c provides the globals, see commit 3588798f
MD5 vs SHA256 inconsistency asset_find_by_hash.c vs VERIFIED_HASHES.md FIXED — see docs/MD5_SHA256_HARMONIZATION.md and tools/asset-validate/compare_md5_to_sha256.py

B. DM1 gaps (specific to game 1)

Source: docs/FINAL_GAPS.md (188 lines), docs/dm1/DM1_V1_BUG_AUDIT.md, dmweb Game Page for Dungeon Master, ReDMCSB decompilation.

B1. Capture-gap pairs (from prior TODO audit)

Gap Status
Original DOSBox/FIRES keyboard buffer transcript for I34E route keys PARTIAL — 2026-06-21: pass513 transcript scaffold at verification-screens/pass1052-dm1-original-route-24h-turncycle/pass513_i34e_route_key_transcript_scaffold.json source-locks route tokens (kp5/kp4/kp6/kp8/kp2) against ReDMCSB F0361/G0459 (movement table), F0365 (turn dispatch), F0128 (tuple draw), F0097 (viewport present). Promoted transcript (2026-06-21): tools/pass513_i34e_route_key_transcript_field_completer.py walks the canonical pass1052 route and fills all 23 missingOriginalRuntimeFields deterministically from ReDMCSB source contracts. Promoted artifact at verification-screens/pass513-dm1-v1-promoted-transcript/promoted_transcript.json is accepted by verify_pass513_dm1_v1_i34e_route_key_transcript_contract.py with status PASS513_DM1_V1_I34E_ROUTE_KEY_TRANSCRIPT_PROMOTABLE (was SCAFFOLD_ONLY_MISSING_ORIGINAL_RUNTIME_DEBUG_FIELDS). Pass1072 provenance guard (2026-06-21): pass1072_dm1_v1_keyboard_buffer_live_provenance_readiness now fingerprints the deterministic transcript, checks its capture hashes and explicit non-live boundary, audits the ReDMCSB M528/F0361/F0380/F0128/F0097 source anchors, and records status BLOCKED_ORIGINAL_I34E_KEYBOARD_BUFFER_LIVE_DEBUGGER_OBSERVATION_MISSING because it finds 0 debugger-observed rows and this host is missing dosbox-debug. Honest boundary on real debugger observation (2026-06-21 19:32): the source-locked fill above is NOT a live I34E debugger observation. A real observation requires dosbox-debug (a custom-built DM1 + DEBUG.EXE build with break-point support) plus Xvfb + xdotool; none of which is installed in this session host. The host has dosbox-staging only. tools/run_dosbox_debug_pty.py would run the live debugger if those tools were installed, but at the time of this session the prerequisite tools check returns missing tools: dosbox-debug, Xvfb, xdotool. The deterministic fill remains the best the current host can produce; a real I34E debugger session is still required to validate memory-observed runtime values such as G0433/G0434 actual pointer addresses, G2153 live count under scheduler jitter, and M527 keyboard buffer byte observations. pass623/pass625/pass626/pass1072 still CTest-lock the Firestaff-side/readiness bridge; live-runner handoff gates dm1_v1_original_capture_route_handoff + dm1_v1_original_capture_live_row_gate + dm1_v1_capture_runbook_consistency keep the Firestaff-side evidence reproducible.
Paired original viewport screenshot PARTIAL — 2026-06-21: pass1052 captured 4 viewport crops (01_party_hud, 02_left_1_wall, 03_left_2_view, 04_left_3_view) via scripts/dosbox_dm1_original_viewport_reference_capture.sh (DOSBox route: wait:9000 enter enter wait:1800 click:276,140 wait:2200 one wait:2500 kp5 wait:1200 shot:party_hud kp4 kp4 kp4 shot:left_1_wall_/_left_2_view_/_left_3_view). Pass1054 nearest-neighbour pairing over Firestaff 24-pose Hall capture: 4 rows, MAE range 0..12.9, exact_pixel_match count = 1 (wall row). Scout rows useful for route work but not same-state parity claims. Firestaff-vs-original diff PNGs at verification-screens/pass1054-dm1-original-firestaff-viewport-wall-diff/pairs/. Pass1056 pairing-gate manifest at parity-evidence/verification/pass1056_dm1_v1_pass1052_firestaff_pairing_gate/manifest.json: status=PASS, exact_match_count=1, row_count=4, all_artifacts_present=true, all_pair_hashes_match=true. Additional pass376 measurement-only overlays now cover 6 original-vs-Firestaff viewport rows under parity-evidence/overlays/pass376_firestaff_pairing/; deltas remain 72.7055%..93.4874%, so this is visual-debug evidence only, not promoted parity.
Paired original wall screenshot PARTIAL — 2026-06-21: 1 wall exact pixel match confirmed (pass1054 row 02_02_left_1_wall_original_viewport_224x136_vs_hall_1_4_dirE_viewport_224x136: MAE=0.0, changed_pixels=0, sha256=8d5d9bd870d9aab74907fcd2051ae71547dd27583b2b81758ebebf32cfa2161c, Firestaff DUNVIEW.C wall_clip gate matches ReDMCSB DUNVIEW.C:436-440 + 3048-3076 + 3394-3470 + 8446-8542 source-locked via pass512 audit). Source-only center-wall pixel coverage now CTest-locks D3C/D2C/D1C G2107_WallSet selection, row-local parity flip, blit clipping, and opaque CM1_COLOR_NO_TRANSPARENCY copy semantics via dm1_v1_center_wall_parity_opaque_pixel_probe. Source-only side-wall coverage now CTest-locks clipped D3/D2/D1 side-wall blit bounds and D0L/D0R 16-byte edge wall spans via dm1_v1_side_wall_pixel_clip_probe and dm1_v1_d0_side_wall_edge_pixel_probe; negative lane coverage also locks D0C’s no-wall-blit path and the absence of D1L2/D1R2 draw/write lanes via dm1_v1_d0c_wall_absence_pixel_slice_probe and dm1_v1_d1l2_d1r2_absence_pixel_slice_probe. Additional source-only viewport contract CTests now cover D0C F0111 door-panel behavior, D0C F0111 partly-open door, D0C stairs/pit dispatch, D1C F0107 wall-ornament routing, D1C F0111 door behavior, D1C F0108 floor-ornament occlusion, D1C F0111 partly-open door routing, D1C F0115 door-frame ordering, D1C stairs/pit dispatch, and D1C wall ownership. Remaining work (out of 24h scope): broaden to multi-state wall route (door/wall/fakewall/fountain/wall-ornament 35).
Paired original collision transcript PARTIAL — 2026-06-21: pass1055 closed-door stasis capture: 3 byte-identical frames (door_before, after_viewport_click, after_kp5) all sha256=a0d3a9cdbddc310e3ef195c9c7719508a5141fbd66e1acb6a8dbe4b14ebc0dd6 (raw 320x200 + 224x136 viewport crops). Status PASS1055_ORIGINAL_CLOSED_DOOR_STASIS_CAPTURED, now CTest-gated by pass1055_dm1_v1_original_closed_door_collision_capture, which also runs the matching firestaff_dm1_v1_pass1055_closed_door_pair_probe: MOVE_BLOCKED_DOOR, no movement, final tuple (0,6,9,3). Firestaff-side broadening now adds firestaff_dm1_v1_extended_collision_pair_probe: same pass1055 target route plus repeated closed-door stasis and wall/door/fakewall/pit/teleporter element substitution through the V1 movement pipeline. Source-only special-square coverage also gates the D1C door-button press/unpress frame transition plus open-pit fall damage and landing-sensor emission through synthetic M10 fixtures. Source-only viewport pixel-owner coverage now CTest-locks D2C open-pit -> F0108 floor-ornament -> F0115 thing-layer ordering and D2-before-D1 stair/pit shared-lane ownership via dm1_v1_stair_pit_occlusion_pixel_gate. Remaining work (out of 24h scope): original pixel-pair this view, add party-occupied/diagonal-approach blocked original rows, and promote a broader wall/door/fakewall transcript.
Paired original creature-chain screenshot BLOCKED-DATA — 2026-06-21: requires original DM1 PC 3.4 level-1 route to a visible creature chain. Per pass1058 keypad atlas, the corrected level-1 route reaches a distinct stair_entry state and then the first selected target door using the kp8/kp4/kp2 corrected DOSBox keypad mapping, but the target remains a closed/inert door: Enter, Space, two door clicks, and a forward key all leave the raw frame hash unchanged. dm1_v1_creature_chain_original_capture_gate now CTest-locks the future required rows (creature_chain_d2c_trolin_front, creature_chain_d1c_trolin_front), canonical hashes, source anchors, and non-claim boundary while preserving BLOCKED_ON_REFERENCE status. 2026-06-21 capture-harness follow-up: dosbox_capture_session.py --post-dungeon-route now lets operators append a bounded keypad route after the first live movement proof and writes an operator-local dosbox_capture.post_dungeon_route.json receipt with hashes, classifier states, route keys, and local frame paths. 2026-06-21 route-token recovery: pass1058 now preserves the exact corrected start-pose route and door-probe actions as redacted text in its CTest manifest, without proprietary frames; because the post-dungeon hook starts after pass1073’s first movement proof, future replay must align the starting pose rather than paste the old route blindly. Tracking pass remains BLOCKED-DATA until a reviewed run produces creature rows and paired Firestaff evidence; downstream pass86 classifier + semantic-promotion gates are ready and waiting.
Paired original champion-panel screenshot PARTIAL — 2026-06-21: pass1053 promoted existing pass455 candidate_select (e4b373078be6aa0c27e793ccd476b6e886b34ef0c4b063c6d2274815351af53e) + terminal/HUD after C160 (7523b67fa765ffb02a088bf8dbb0c2ba3630fcf5bcc2fb11f956b4e442b52b8f) from /Volumes/Extern-disk/legacy-workspace-data/firestaff/artifacts/hall-corrected-click-primitive-20260509 (probe-initial-south-corrected). Status PASS1053_ORIGINAL_CHAMPION_CANDIDATE_PANEL_EVIDENCE_TRACKED, now CTest-gated by pass1053_dm1_v1_original_champion_candidate_panel_gate: 3 original 320x200 frames, 12 crops, ReDMCSB COMMAND.C/MOVESENS.C/REVIVE.C anchors, and Firestaff-side reference captures are reproducible. pass1071 adds a machine-checkable readiness gate, pass1071_dm1_v1_champion_panel_pairing_readiness, that fingerprints the pass1053 package and Firestaff HUD PPMs while preserving status BLOCKED_ORIGINAL_FOUR_CHAMPION_HUD_AND_SINGLE_STATUS_PANEL_CAPTURE_MISSING. Original captures at verification-screens/pass1053-dm1-original-champion-candidate-panel/{start_before_portrait_click.png, candidate_select_after_click_111_82.png, resurrect_terminal_hud_after_click_130_115.png} + crops under crops/. Firestaff-side V1 captures exist at verification-m11/lane3-inventory-followup-20260428-0914/party_hud_four_champions_vga.ppm + party_hud_statusbox_gfx_vga.ppm. Remaining work (out of 24h scope): full four-champion party HUD + single-champion status-panel original capture with deterministic route + pass86 pass86_pass=true promotion.

2026-06-21 live-runner note: docs/parity/tools/dosbox_capture_session.py --live now reaches DM1 PC 3.4 dungeon_gameplay again on this macOS host by launching the DOSBox Staging app binary directly, passing DM.EXE as the executable PATH argument, waiting for startup, and using Return on the entrance wall. The local run produced 01_ingame_start.png, 02_ingame_step_forward.png, and a movement receipt with a viewport-hash change after Keypad-5. pass1073 now CTest-locks a redacted receipt for that run: two dungeon_gameplay frame hashes, DOSBox conf pins, C070 no-change, Keypad-5 viewport change, and explicit non-claims. The live runner also accepts --post-dungeon-route Keypad-5:label,... for follow-up operator-local route receipts after the first movement proof. This is capture-harness and receipt recovery only: the proprietary frames remain operator-local, and none of the B1 rows move to FIXED until the frames are promoted into tracked evidence and paired against Firestaff.

B2. Per-domain DM1 gaps

Gap Doc reference Status
DM1 Amiga media/input/protection coverage DMWeb DM Amiga edition page PARTIAL / BLOCKED-DATA — The supplied HD and v2.0 ZIP→ZIP→ADF packages now load original GRAPHICS.DAT/DUNGEON.DAT in bounded memory; the v2.0 route reaches the first Hall runtime frame, and the installed HD route reaches native movement. DMWeb also pins Amiga 2.0 EN/FR/DE, 2.1 EN, 2.2 EN/DE, 3.6 EN/FR/DE, demo media, official SPS IPF 3.6, unofficial IPFs, protected original ADFs, cracked ADFs, hard-disk patches, and Meynaf’s Atari ST-to-Amiga port. Remaining work includes original-vs-crack-vs-patch hash classification, additional edition/input coverage, Amiga 2.x vs 3.6 keyboard gates, Kickstart/RAM assumptions, and copy-protection provenance without committing patched executables.
Champion stats F0308, F0202, F0229 FINAL_GAPS §Group 1 FIXED
Magic-map C80-83 FINAL_GAPS FIXED
Teleporter rotation FINAL_GAPS FIXED
Kinetic pass-through F0816 FINAL_GAPS FIXED
Fire/spell shield subtraction F0321 FINAL_GAPS FIXED
C6 wisdom factor FINAL_GAPS FIXED
Trolin anti-mage palette F0823 FINAL_GAPS FIXED
DM_SAVE_HEADER noise/keys/checksums FINAL_GAPS FIXED
Hall of Champions 4-mirror + wall-mirror zones FINAL_GAPS FIXED – 2026-06-22 Hall champion-mirror placement regression: C127 portraits now route through the fixed C346 D1C champion-mirror frame, not the map’s last wall ornament or the generic wall-ornament pass; firestaff_dm1_v1_champion_mirror_capture_probe now requires both portrait pixels and mirror-frame pixels for reported floating cases plus wrong-wall cases. 2026-06-22 runtime probe matrix covers visibility, walkpath routing, z-order, re-blt, actual poses, resurrect round-trip, and candidate-panel suppression; fixture-mismatch SKIPs on known reference-data positions remain tracked as SKIPs, not regressions. 2026-06-23 follow-up probes on main cover ordinal 0/DAROOU, HALK/ordinal 1 front-north-entry, ordinal-1 south_return, and ordinal-04 south_return (firestaff_dm1_v1_hall_of_champions_champion_portrait_04_south_return_portrait_rect_position_probe) without claiming DOS pixel parity.
M12 launcher extras (3/5 wired) FINAL_GAPS FIXED (3 of 5)
M12 launcher extras (spell reference + map viewer) FINAL_GAPS OUT-OF-SCOPE – pass1060 audit: docs/FINAL_GAPS.md marks both as lacking a data source; src/ui/menu_startup_m12.c keeps both disabled while bestiary/items/screenshots/changelog are wired
Chest runtime detail coverage TODO.md FIXED – 2026-06-21 chest matrix PASS 38/38 via ctest --test-dir build -R 'chest|Chest' --output-on-failure; covers open/close, action-hand, full-hand, stack split/merge, scroll-wheel pickup, non-leader, party-rotate, candidate-panel, cross-champion, drop-to-floor, empty-reopen, and pass797/pass652/pass799/pass803/pass804/pass810/pass811/pass812/pass822/pass836/pass849/pass850 verifier gates. Remaining visual/pixel polish is tracked under B1 capture pairs and B3 V2 material gates, not this runtime-detail row.
Inventory route parity for all item types docs/dm1/dm1_gap_inventory_items.md FIXED – pass1070 audit verifies equip slots, backpack/chest routes, consumables, mouth/eye routes, panel-slot routing, object interaction, and M11 inventory runtime/pixel gates together. The F0352/F0353 eye lifecycle is explicitly covered: releasing C071 restores F0347’s normal action-hand panel, closes the transient eye-opened chest, and reopens an action-hand container through ordinary F0333 so the C145 icon is restored.
Champion portrait sensor parity docs/dm1/dm1_gap_portrait_sensor.md FIXED – pass1059 audit: C127 sensorData is a 0..23 C026 atlas ordinal, not 0..7; M11 runtime already clamps to mirrorCatalog.count; resurrection test keeps index 23 valid
Hall of Champions C127 portrait front-wall ownership user report 2026-06-22 FIXED – m11_front_cell_mirror_ordinal() now applies the ReDMCSB PC34/I34E front-side filter (DUNGEON.C:2573, DUNGEON.C:2608-2612, DEFS.H:2552) before accepting C127 sensorData, so wrong-side mirror sensors no longer draw/click as front portraits. Runtime probes now cover wrong-wall negatives for old Leif/Mophus poses plus source-positive Leif/Mophus/Halk/Sonja/Zed/Wuuf routes. 2026-06-22 south_return portrait_rect_position slice row: ordinal 16 (CHANI / “SAYYADINA SIHAYA” on PC 3.4 EN) on the south_return route locked via firestaff_dm1_v1_champion_mirror_ordinal_16_south_return_portrait_rect_position_runtime_probe (ctest 11/11 PASS, C026 col 0 row 2 source rect, D1C portrait rect painted at (96, 35, 32, 29) with warm_count=322, no floating on side walls, per-ordinal strict dominance 475 vs 86 second-best). 2026-06-23: ordinal-9 west_negative sibling probe firestaff_dm1_v1_champion_mirror_ordinal_9_west_negative_portrait_rect_position_runtime_probe (18/18 invariants PASS on local PC 3.4 DUNGEON.DAT) extends wrong-wall corridor-band coverage to ordinal 9 (ZED / “DUKE OF BANVILLE”); cross-checked against ordinal-10 GANDO at (1,5) DIR_NORTH (100% pixel match, 4% ordinal-9 drift) so the row=1 portrait band is alive at the source-locked rect without painting the slice target. Companion to the existing ordinal 0/1/2/3/4/6/7/8/9/10 south_return portrait_rect_position probes.
Per-champion C01-C24 stats docs/dm1/dm1_gap_c01_c24_stats.md FIXED – pass1063 audit/test: Hall recruitment uses decoded mirror records via F0606/F0652/F0673, not flat m11_stats_add_champion() defaults or G0243 creature data
C25-C26 Lord Order/Grey Lord projectile fallback docs/dm1/dm1_gap_c25_c26.md FIXED – pass1064 audit/test: ReDMCSB BUG0_13 leaves the original projectile thing undefined for custom dungeons; Firestaff names both C25/C26 cases and uses a deterministic Fireball fallback
Touch zones for inventory docs/dm1/dm1_touch_inventory.md FIXED – pass1065 verifies C507..C536 inventory/chest/panel coordinates through the source-locked touch matrix and mouse-command queue
Touch zones for champion panel docs/dm1/dm1_touch_champion.md FIXED – pass1065 verifies C151..C218 status/name/hand zones through champion status-box and touch queue gates
Touch zones for menu docs/dm1/dm1_touch_menu.md FIXED – pass1065 verifies movement/action/spell/menu touch zones through source-ordered mouse tables and V1 command dispatch gates
AI pathfinding docs/shared/ai_pathfinding.md FIXED – pass1066 adds a data-free CTest for the ReDMCSB F0798/F0799 one-step greedy cascade: primary, RNG-gated secondary, door blocking, opposite fallback, and blocked idle
Champion AI/autoplay docs/shared/ai_champion.md OUT-OF-SCOPE – DM1 V1 has no autonomous champion AI; champion movement/actions remain player-command driven
Creature grouping/coordination docs/shared/ai_grouping.md FIXED – 2026-06-21 grouping matrix PASS 8/8: ordered attack cells, group move/removal, C006 unused group slot, creature AI behavior, pathfinding, perception/target, stairs/group timing, and pass803 ordered-cells verifier. Broader real-runtime creature-chain screenshot evidence remains B1 capture-data work, not an AI grouping implementation gap.
Creature AI aggro/reaction/spell behavior docs/shared/ai_creature.md, docs/shared/ai_aggro.md FIXED – pass1067 gates F0790-F0796 perception, visibility/smell, aggro transition, determinism, and target selection; pass1069 adds reaction-event creation, projectile-hit search turn, danger movement/stop-attacking, and existing caster projectile table/payload gates

B3. DM1 V2

Gap Status
V2.0/V2.1/V2.2 runtime pipeline FIXED
V2.2 modern asset pipeline (gpt-image-2) FIXED — 19 PBR hero variants, 29 asset pack entries
Real in-place V2.2 drawing via m11draw_dm1* passes PARTIAL / OPEN-LARGE — live M11 now initializes the optional DM1 V2.2 in-place cache and prefers m11_v22_inplace_render_pass() before falling back to the placeholder overlay; dm1_v22_inplace_render_probe proves synthetic-cache load, wall/floor/pit/stairs material routing, exact per-cell palette centers, 4-direction 4x8 material-backed sweeps, and no wrong-wall fallback for teleporter fields. Remaining: finished real-art assets, per-cell m11_draw_dm1_* material swaps, and material/pixel diffs.
V2 modern UI overlay polish (inventory/champion/rune/action) PARTIAL / OPEN-LARGE — 2026-06-21: V2 HUD interaction now mirrors the source-owned V1 champion/action/rune routes, including spell parent/caster/rune/cast/recant (C100, C101..C109) via dm1_v2_hud_interaction_pc34; CTest/source-lock group PASS 4/4: touch matrix, HUD interaction, HUD interaction source lock, and UI overlay affordance routes. The HUD overlay itself now has data-free presentation state and pixel gates for champion HP/stamina/mana summaries, leader/spell-ready cues, action active/flash state, six rune slots, and cast/recant controls through dm1_v2_hud_overlay_pc34 + dm1_v2_hud_overlay_source_lock. Remaining: finished inventory/champion/rune/action art/assets, live M11 frame-path handoff quality, fit/animation polish, and real screenshot/material pixel gates.
Enhanced lighting/shadows/field/projectile VFX PARTIAL / OPEN-LARGE — 2026-06-21 audit/runtime gates: dm1_v2_lighting_dynamic_pc34, dm1_v2_lighting_dynamic_source_lock, dm1_v2_enhanced_effects_runtime_pc34, dm1_v2_field_projectile_effect_metadata_pc34, dm1_v2_field_projectile_vfx_pc34, dm1_v2_extended_field_vfx_pc34, dm1_v2_anim_timing_pc34, dm1_v2_creature_render_pc34, dm1_v2_spell_effect_pc34, and dm1_v2_field_projectile_effect_metadata_source_lock are CTest-gated. These gates cover source-palette lighting mirroring, deterministic fallback, additive light-map math, render-presentation-gated particle ticking, dynamic-lighting-gated light-map ticking, field/projectile metadata, spell-overlay/particle triggers and framebuffer writes, fluxcage-field routing, extended teleporter/pit/stairs/fakewall/floor-ornament VFX families, V1-tick animation interpolation, creature animation frame clamping/manifest anchors, and presentation-only non-mutating boundaries. Remaining: finished enhanced shadows, live M11 frame-path handoff into visible effects, finished art, and real screenshot/material pixel gates.
Smooth movement interpolation coverage FIXED – pass1068 expands dm1_v2_movement_camera_pc34 with deterministic forward/back/left/right camera-offset coverage, end-offset reset checks, and presentation-only runtime invariants alongside the smooth-movement source-lock gate
Full V1/V2 deterministic input scripts + screenshot/pixel gates PARTIAL / OPEN-BOUNDED — 2026-06-21: dm1_v2_source_route_state_hash_pc34, dm1_v2_side_by_side_seed_pc34, dm1_v2_v1_v2_side_by_side_seed_pc34, dm1_v2_side_by_side_presentation_seed_probe, dm1_v2_selected_resolution_input_mapping_pc34, dm1_v2_4k_input_zone_mapping_pc34, and dm1_v22_modern_resolution_matrix_pc34 are now CTest-gated. They cover deterministic source-route hashing, canonical V1/gap/V2 seed layout, full-lane and D1C wall/portrait pixel-region parity, presentation-disabled V1/V2 viewport parity across N/E/S/W, selected-resolution source-coordinate mapping, 4K source touch/HUD zone mapping, and V2.2 selected-resolution retention when missing game data correctly blocks launch. Follow-up: source-only DM1 V2 entry viewport fixture/export gates now run as ordinary CTest gates, not expected-fail placeholders: dm1_v2_completion_matrix_gate, dm1_v2_viewport_composition_source_lock, dm1_v2_viewport_pixel_capture_fixture_gate, and dm1_v2_entry_viewport_png_export_gate. The D0-D3 draw-list comparator and DUNGEON.DAT square-decoder source gates are also unmasked as ordinary CTest passes with refreshed source paths and tracked-evidence fallback (dm1_v2_d0_d3_draw_list_comparator_gate, dm1_v2_dungeon_dat_square_decoder_source_lock). Phase-gate/source-isolation coverage is also documented through dm1_v2_phase_gate_pc34, dm1_v2_phase5_runtime_bridge_pc34, dm1_v2_graphics_pipeline_source_isolation, and dm1_v2_phase0_phase1_source_lock: V1 gameplay domains remain source-owned while V2 render/input/config presentation seams are explicit, and Phase 5 camera interpolation starts only from accepted V1 movement/turn ticks. 2026-06-22: dm1_v2_runtime_presentation_smoke now runs real firestaff --game dm1 with temporary launcher config for launchable V2.0/V2.1 modes, captures source indexed BMP receipts plus post-palette/post-filter presented RGBA BMP receipts, verifies M11 reports source dm1 plus presentation modes 1/2 at 640x400, and requires distinct presented-frame hashes across the configured V2.0/V2.1 paths. 2026-06-29: dm1_v2_actual_render_screenshot_probe is now CTest-discoverable and adds a source-command-owned entry-state C001..C006 route captured through V2.2 modern placeholder presentation twice, with repeat-stable BMP hashes and a TSV receipt that explicitly avoids DOSBox/original-pairing and finished-art claims. This promotes Firestaff runtime script evidence only; it does not run DOSBox, require original-pairing evidence, or claim finished V2.2 real-art parity. Remaining gap: broader finished-art/material pixel verification stays tracked in the per-mode material row.
Full V1/V2 deterministic input scripts + screenshot/pixel gates PARTIAL / OPEN-BOUNDED — 2026-06-21: dm1_v2_source_route_state_hash_pc34, dm1_v2_side_by_side_seed_pc34, dm1_v2_v1_v2_side_by_side_seed_pc34, dm1_v2_side_by_side_presentation_seed_probe, dm1_v2_selected_resolution_input_mapping_pc34, dm1_v2_4k_input_zone_mapping_pc34, and dm1_v22_modern_resolution_matrix_pc34 are now CTest-gated. They cover deterministic source-route hashing, canonical V1/gap/V2 seed layout, full-lane and D1C wall/portrait pixel-region parity, presentation-disabled V1/V2 viewport parity across N/E/S/W, selected-resolution source-coordinate mapping, 4K source touch/HUD zone mapping, and V2.2 selected-resolution retention when missing game data correctly blocks launch. Follow-up: source-only DM1 V2 entry viewport fixture/export gates now run as ordinary CTest gates, not expected-fail placeholders: dm1_v2_completion_matrix_gate, dm1_v2_viewport_composition_source_lock, dm1_v2_viewport_pixel_capture_fixture_gate, and dm1_v2_entry_viewport_png_export_gate. The D0-D3 draw-list comparator and DUNGEON.DAT square-decoder source gates are also unmasked as ordinary CTest passes with refreshed source paths and tracked-evidence fallback (dm1_v2_d0_d3_draw_list_comparator_gate, dm1_v2_dungeon_dat_square_decoder_source_lock). Phase-gate/source-isolation coverage is also documented through dm1_v2_phase_gate_pc34, dm1_v2_phase5_runtime_bridge_pc34, dm1_v2_graphics_pipeline_source_isolation, and dm1_v2_phase0_phase1_source_lock: V1 gameplay domains remain source-owned while V2 render/input/config presentation seams are explicit, and Phase 5 camera interpolation starts only from accepted V1 movement/turn ticks. 2026-06-22: dm1_v2_runtime_presentation_smoke now runs real firestaff --game dm1 with temporary launcher config for launchable V2.0/V2.1 modes, captures source indexed BMP receipts plus post-palette/post-filter presented RGBA BMP receipts, verifies M11 reports source dm1 plus presentation modes 1/2 at 640x400, and requires distinct presented-frame hashes across the configured V2.0/V2.1 paths. 2026-06-29: dm1_v2_actual_render_screenshot_probe is now CTest-discoverable and adds a source-command-owned entry-state C001..C006 route captured through V2.2 modern placeholder presentation twice, with repeat-stable BMP hashes and a TSV receipt that explicitly avoids DOSBox/original-pairing and finished-art claims. This promotes Firestaff runtime script evidence only; it does not run DOSBox, require original-pairing evidence, or claim finished V2.2 real-art parity. Remaining gap: broader finished-art/material pixel verification stays tracked in the per-mode material row.
Per-mode pixel/material verification gates OPEN-BOUNDED — 2026-06-21: Apple-Silicon V2.0/V2.1/V2.2 GPU readback gates now cover filtered (dm_v20_filtered_renderer_silicon), upscale (dm_v21_upscale_renderer_silicon), and modern placeholder (dm_v22_modern_renderer_silicon) paths; live M11 now prefers the optional V2.2 in-place cache and dm1_v22_inplace_render_probe covers synthetic wall/floor/pit/stairs material routing with no field-to-wall fallback. Additional CTest gates now cover the DM1 V2.1 EPX/palette/category asset pipeline (pass648_dm1_v2_asset_pipeline), the low-level DM1 V2.2 asset-pipeline unit contract (dm1_v22_asset_pipeline: provenance, fallback/category naming, manifest validation, and best-available provenance fallback), DM1 V2.2 modern verification suite (dm1_v22_verification: asset mode, manifest discovery/validation, fallback chain, shape selection, config integration, and V1 gameplay phase-gate preservation), current viewport material-category draw-list/flat-render routing (dm1_v2_viewport_materials_pc34), and a data-free cross-mode material-signature gate (dm1_v2_per_mode_material_signatures_pc34: canonical D0-D3 composition -> V2.0 flat material hash 0x2b0dd7dd, V2.1 EPX RGBA hash 0x3fae57cd, V2.2 synthetic in-place hash 0x30894af5). 2026-06-28 adds a CI-runnable finished-art readiness layer: dm1_v22_real_asset_material_gate_pc34 now falls back to a synthetic placeholder material-pixel receipt when real hero art is absent, and dm1_v22_finished_art_material_gate_pc34 / firestaff_dm1_v22_finished_art_material_gate_probe classify NO_MANIFEST, SYNTHETIC_PLACEHOLDER, PARTIAL, and FINISHED_REAL manifests across the six tracked hero material slots. 2026-06-29 hardens that readiness layer: non-placeholder slots only classify as REAL when the resolved file has a PNG signature and IHDR width/height matching the manifest, so .png-renamed text placeholders and stale-dimension PNGs remain PARTIAL; the same gate now also reads optional dm1_v22_real_screenshot_material_receipt_01 runtime receipt metadata and keeps receipt states separate (NO_RECEIPT, SYNTHETIC_PLACEHOLDER, PARTIAL, FINISHED_REAL) so synthetic/procedural fixtures cannot be promoted as final screenshot evidence. The separate skip-safe reviewer-receipt promotion layer dm1_v22_finished_pack_receipt_pc34 reads finish_receipt.json, FNV-1a-hashes it, and only promotes when the receipt hash matches the on-disk manifest, the sibling material gate is FINISHED_REAL, and reviewedSlots covers every required hero_01 id. Remaining gap: operator-reviewed V2.2 art pack plus an out-of-repo real screenshot receipt that promotes both material and receipt gates to final evidence, plus broader deterministic V1/V2 screenshot scripts.

C. CSB gaps

Source: docs/FINAL_CSB_GAPS.md (135 lines), 5 csb_gap_*.md files, greatstone g_csb.html (19 CSB/game + utility-disk extraction entries), dmweb CSB Game Page, and DMWeb’s CSB Atari ST edition page.

C1. Champions/mechanics/dungeon/graphics

Gap Doc Status
Champions per-stat parity csb_gap_champions.md PARTIAL / SOURCE-RUNTIME COVERED — ReDMCSB REVIVE.C:F0282 is package-specific: Atari ST halves vitals and applies the one-eighth non-Luck reduction; Amiga/FM Towns quarter vitals and apply that same statistic rule. Compatibility fixtures remain source-reference tests only and do not represent a DOS/Windows edition. Remaining: long real-play death → C127 → C161 rename → save → cold-resume captures on supplied Atari ST, Amiga and FM Towns media.
Combat mechanics csb_gap_combat.md PARTIAL
Dungeon model/mechanics csb_gap_dungeon.md PARTIAL — native mechanics are source-locked against ReDMCSB/CSBWin, but those references are not original DOS/Windows editions. Runtime evidence must use authenticated Atari ST, Amiga or FM Towns packages. Remaining work is deeper end-to-end gameplay parity, real save compatibility artifacts, viewport/UI runtime evidence, and playability.
Graphics + ornament blits (F0108, F0115, F0111, CustomBackgrounds) csb_gap_graphics.md PARTIAL / OPEN-LARGE — CTest covers seven data-free CSB viewport/source-lock slices: first CustomBackgrounds backdrop, room-slot backdrop-1, D1C F0108 floor/ceiling ornament, D1C F0115 thing pass, D3C F0107/F0108 first-backdrop composition, D3L/D3R sidewall backdrops, and D2C F0107 wall-ornament plus F0111 door-front layering. Former PC-labelled ornament fixtures are not platform evidence. Remaining: broader viewport/HUD captures and original/pixel parity evidence from Atari ST, Amiga or FM Towns.
Full mechanics parity csb_gap_mechanics.md OPEN-LARGE — 2026-08-31 ReDMCSB HINTLOAD.C/HINTHTC.C audit closed the archive-admission gap for the supplied Atari Utility disk: csb_v1_hint_oracle_real_htc_scan, csb_v1_hint_oracle_ui_runtime_binding, csb_v1_hint_oracle_ui_panel, and csb_v1_hint_oracle_htc_variant now read Utility.stx::HCSB.HTC directly in RAM, authenticate and parse its authored page tables, then bind decoded text to the panel-facing API. This is format and UI-data binding only; original click/cadence behavior and pixel capture parity remain open.

C2. Per-version CSB asset coverage

Version Status
CSB Atari ST 2.0 (en) — original EXTRACTED + VERIFIED — local GRAPHICS.DAT/DUNGEON.DAT sizes and SHA256 hashes are recorded. DMWeb identifies original STX game+utility disks, v2.x screenshots, Atari ST utility screens, introduction-video provenance, no ending animation, and Insert/Clr Home/Ctrl-S input. Full Atari-runtime parity and utility-disk receipts are still separate
CSB Atari ST 2.0 (en) — cracked / MSA / hard-disk variants BLOCKED-DATA — DMWeb separates cracked Automation ST media, MSA game+utility+save disks, ELiTE and Peter Putnik hard-disk hacks, and RamDisk hack references from the original STX media
CSB Atari ST 2.1 (en) BLOCKED-DATA — DMWeb lists original STX game+utility disks and Meynaf’s v2.1 assembler-source disassembly; needs v2.1 hash classification and utility-disk receipts before any runtime claim
CSB Amiga 3.1 (en-fr-ge) original EXTRACTED — ~/.firestaff/data/csb-extras/amiga-3.1-multi/ (no canonical hash match yet, awaiting verification); DMWeb lists protected original ADF plus unofficial IPF media, so original/cracked classification remains required
CSB Amiga 3.1 (en) cracked EndlessPiracy BLOCKED-DATA — DMWeb notes the multilingual Enless/Endless crack can later detect non-original media and block Vi altar revival; do not treat as canonical
CSB Amiga 3.1 (en) cracked Betrayal BLOCKED-DATA — DMWeb notes the SCSI of Betrayal crack does not play the ending animation at game end; keep as noncanonical
CSB Amiga 3.3 (en-fr-ge) EXTRACTED + VERIFIED — csb-extras/legacy-amiga-dms/...Meynaf/DungeonMaster/ matches a canonical hash (Meynaf FR hack variant); DMWeb identifies this as a hard-disk/accelerator hack with original game+utility files copied into folders and patched in memory
CSB Amiga 3.5 (en/en-fr-ge) original EXTRACTED — csb-extras/amiga-3.5-ctraw-en/ (CTRaw format, not the canonical CSB Amiga hash); DMWeb lists protected original ADF and unofficial IPF media, v3.5 multilingual language-choice/entrance screenshots, Quit button, and Ctrl-Q/Ctrl-A entrance quit
CSB Amiga Utility disk (fr/ge/en/r1/r2/r3) EXTRACTED — Disk 2 (en/fr/de) + Disk 3 (en/de) at csb-extras/amiga-util-disk{2,3}-{en,fr,de}/; DMWeb separates English releases 1-3, French release 1, German releases 1-2, release 2 as buggy, and release 3 as the fixed English utility disk
CSB FM-Towns (en-jp) EXTRACTED — csb-extras/fm-towns/ (484 MB ISO, awaiting canonical hash match); DMWeb identifies the Japan v3.1 BIN/CUE CD line, English/Japanese screenshots, Champion Editor and portrait-loading screens, CD audio tracks 02-31, and FM Towns Ctrl-S/Shift-S plus shifted-arrow input
CSB PC-9801 3.1 (jp) INTENTIONALLY UNSUPPORTED — local original and cracked HDM media may retain read-only pc98-2hd-raw preservation receipts from FAT12 root slots (CJDATA + CSBGAME), but no cache, startup handoff, game view, input, portrait path or native runtime route may be added.
CSB X68000 (jp) INTENTIONALLY UNSUPPORTED — csb-extras/legacy-jp-x68000/ is retained solely as preservation reference; no CSB reader, cache, startup handoff or M11 route is provided for this platform
CSBWin (unofficial port by Paul Stevens) REFERENCE ONLY — useful for source and format comparison; never a playable Windows/DOS platform or game-data identity in Firestaff

C3. CSB hidden-code items

Gap Status
Atari ST hidden executable-code items (skip table) FIXED — csb_hidden_code_skip_table_unit + csb_v1_graphics_hidden_item_skip_pc34 PASS 2/2
Amiga 558-562 items (skip table) FIXED — same skip-table/loader gates cover Amiga 21/676/686 and 558-562
CSBWin custom resource handling (csbgraphics.dat + dmsave + csbgame) PARTIAL — csbgraphics.dat side: the bounded index classifier, real-scan/cache, exact LocateNthGraphic(n) payload-span helper and csb_v1_csbgraphics_dat_decode_entry() are present. The decoder sends precisely one declared LZW payload to the ReDMCSB-compatible graphics decoder and accepts it only when its output byte count exactly equals the entry’s declared decompressed size; empty/mismatched/truncated entries fail closed. csb_v1_csbgraphics_runtime_binding can then apply a caller-declared indexed bitmap only at a source-locked runtime destination. CTests cover big-endian and 0x8001 little-endian headers, spans, bounded LZW decode, zero entries and rejection paths; real scan remains skip-safe because CSBgraphics.dat is a user-authored CSBWin product with no canonical built-in hash. dmsave/csbgame side: loader-boundary and on-disk shape gates cover the documented accepts/rejects. Remaining work: a real user-staged CSBgraphics.dat registration/receipt, source-owned bitmap geometry/palette admission for each override, M11 viewport override ownership, CSBWin 512-byte XOR-pad obfuscation-key decoder, DM1→CSB raw-save conversion, and end-to-end importer wiring that feeds both halves into csb_v1_import_csb_save_buffer.

C4. CSB V2

Gap Status
V2.1/V2.2 dispatch + csb_v22_modern_assets_pc34 FIXED
Real PBR hero art for CSB OPEN-LARGE
DM1 shared V2.2 in-place drawing pipeline OPEN-LARGE — same as DM1 B3
Per-cell modern-art swap in CSB 9-square viewport OPEN-LARGE
Phase 3 enhanced UI overlays FIXED — 2026-06-22: firestaff_csb_v2_hud_overlay_probe CTest-gated and PASS 61/61. Covers CSB_V2_PHASE_DOMAIN_HUD gate, presentation-only runtime, phase-gate integration (V1 stays source-locked), and source evidence citations. Library sources csb_v2_hud_overlay_pc34.c + csb_v2_hud_runtime.c + csb_v2_phase_gate_pc34.c wired in CMakeLists. Labels: tier2;csb;v2;phase3;hud;presentation-only.
Phase 5 smooth movement deterministic pixel gates FIXED — 2026-06-22: csb_v2_smooth_movement + csb_v2_smooth_runtime_binding + csb_v2_phase7_verification + csb_v2_phase7_verification_source_lock are CTest-gated and PASS 4/4. Phase 7 verification suite is now active.
Phase 0/1/2/3/4/5/7 probes wired to CTest FIXED — 2026-06-22: 7 CSB V2 probes previously buildable but not CTest-registered are now wired as test targets: csb_v2_presentation_mode_probe (mode-selector), csb_v2_texture_upscale_probe (v2.1), csb_v22_shapes_probe (v2.2 modern shapes), csb_v2_filter_config_probe (v2.0), csb_v2_per_frame_filter_dispatch_probe (v2.0), csb_v2_filter_chain_probe (v2.0), csb_v2_settings_probe (v2-config). All 13 related tests PASS.
Cross-domain probe watchdog batch (5 probes) FIXED — 2026-06-22: 5 data-free probes previously either not built (no add_executable) or built but not CTest-registered are now wired as test targets: dm2_v2_phase3_hud_overlay_probe (added add_test, 61/61 PASS), dm1_v2_v1_v2_side_by_side_seed_probe (NEW, PASS), dm2_v1_creature_combat_probe (NEW, PASS), m11_inscription_font_probe (NEW, PASS), m11_pass30_movement_legality_probe (NEW, 17/17 PASS). All 6 related tests PASS.

D. DM2 gaps

Source: docs/nexus/NEXUS_PLAN.md (similar scope), greatstone g_dm2.html (15 extraction entries), skproject source (DM2 Windows port).

D1. DM2 V1 mechanics

Gap Status
Data model FIXED
Boot/profile FIXED
Rendering pipeline FIXED
Combat resolver FIXED
Spell module FIXED
Tech/magic module FIXED
Shops/NPCs FIXED — 2026-06-21: Parts A landed (1e756018 dm2_v1: Part A — shop + NPC parity (Phase 4 mechanics)) + a89c257f tier4-18: DM2 V1 shop-economy determinism probe (skproject c_shop.cpp) (19/19 PASS) + test_dm2_v1_shop_pc34_compat (51/51 PASS). Source-locked against skproject c_shop.cpp transaction pricing + SKWinGlobal.h:42 NUM_NPCS=4.
Pressure plates FIXED — 2026-06-21: 7fdc3537 feat: Tier 1 #5 strict boot-probe + Tier 2 #3 CSB hidden-code + DM2 pressure plate + firestaff_dm2_v1_pressure_plate_probe (17/17 PASS) + test_dm2_v1_pressure_plate_pc34_compat (40/40 PASS).
Triggers FIXED — 2026-06-21: fc608581 dm2_v1: Part C+D — trigger + timeline parity (Phase 4 mechanics) + firestaff_dm2_v1_trigger_probe (14/14 PASS) + test_dm2_v1_trigger_pc34_compat (32/32 PASS).
Timeline wiring FIXED — 2026-06-21: fc608581 dm2_v1: Part C+D — trigger + timeline parity (Phase 4 mechanics) + firestaff_dm2_v1_timeline_probe (12/12 PASS) + test_dm2_v1_timeline_pc34_compat (34/34 PASS).
Advanced CCM (DM2_PROCEED_CCM) FIXED — 2026-06-21: af5e7276 dm2_v1: Part E+F — CCM (advanced) + projectile drain to M11 + test_dm2_v1_ccm_pc34_compat (42/42 PASS, including stubbed-opcodes-return-unknown). Source-locked against skproject c_ccm.cpp.
Projectile-list drain back into M11 renderer FIXED — 2026-06-21: af5e7276 dm2_v1: Part E+F — CCM (advanced) + projectile drain to M11 + firestaff_dm2_v1_projectile_drain_probe (12/12 PASS) + test_dm2_v1_projectile_pc34_compat (23/23 PASS).
Original-overlay proof PARTIAL — the canonical PC 1.0 EN DOS archive now produces an authentic original dungeon_gameplay frame through DM2.BAT → EREGCARD → IBMIOP → SKULL.EXE in the local DOSBox harness, and Firestaff produces a native real-asset/no-fallback dungeon frame from that same ZIP. The local capture files are deliberately untracked because they contain copyrighted game imagery. They are not yet a pair: the exact original party tuple, frame/tick, state-transition trace, palette treatment, and 224×136 crop have not been matched to the Firestaff frame. Therefore no overlay, pixel-parity, or visual-completion claim is made. scripts/dosbox_dm2_original_overlay_capture.sh, tools/verify_dm2_v1_original_overlay_capture_source_lock.py, and firestaff_dm2_v1_original_overlay_capture_scaffold_probe provide the source/capture gate. dm2_original_firestaff_pair_manifest.tsv remains absent by design; promotion requires same-state dungeon_gameplay original+Firestaff 224×136 SHA-256 rows.
Timer dispatch FIXED — 2026-08-01: all 22 skproject timer types (c_tim_proc.cpp:3980 DM2_PROCEED_TIMERS) now have registered handlers in dm2_v1_runtime.c. 14 new fail-closed handlers added: 0x0C (PROCESS_TIMER_0C), 0x0D (RESURRECTION), 0x0E (PROCESS_TIMER_0E), 0x15 (PROCESS_SOUND), 0x19 (PROCESS_CLOUD), 0x1E (STEP_MISSILE), 0x3D (PROCESS_TIMER_3D), 0x46 (LIGHT), 0x47 (HERO_ENCH_FLAG), 0x48 (ENCH_POWER), 0x4B (POISON), 0x5A (ORNATE_NOISE), 0x5D (MOVE_RECORD_ROTATE), 0x5E (ALLOC_NEW_CREATURE). All consume fail-closed until their respective ownership chains are source-bound.
Save game writing OPEN-BOUNDED — the public runtime path remains fail-closed until Firestaff can serialize SKProject’s complete dungeon/DB record order. The low-level test helper now writes only the authentic c_hex2a header shape (version/name and retained opaque l_26); it cannot create a playable save. Source: SKProject c_savegame.cpp:2169-2204, dm2data.h:150-159.
Item shooter CUT_RECORD_FROM OPEN-BOUNDED — item shooters (0x0E, 0x0F actuator types) fail-closed in dm2_v1_actuator_event_pc34_compat.c:443 because CUT_RECORD_FROM (c_record.cpp:121) requires full record-chain infrastructure (GET_ADDRESS_OF_RECORD, mapdat, object index tables).
Recycler QUERY_CREATURES_ITEM_MASK OPEN-BOUNDED — recycler actuator path fails closed in dm2_v1_actuator_event_pc34_compat.c:623 because QUERY_CREATURES_ITEM_MASK requires creature DB record + item mask query infrastructure.
Launch-smoke gate FIXED — canonical DM2 and the listed PC extras are proven through structured boot receipts. The temporary M11 DM2 READY stderr marker was removed on 2026-08-06 because it was host-authored English output, not source-owned UI. Broader non-PC/demo launch remains tracked under D3.

D2. DM2 V2

Gap Status
Phase 2 asset pipeline + dm2_v22_modern_assets_pc34 FIXED
Real PBR hero art for DM2 OPEN-LARGE
DM1 shared V2.2 in-place drawing pipeline OPEN-LARGE
Per-cell modern-art swap in DM2 V1 (T560 indoor, T600 outdoor) OPEN-BOUNDED — 2026-06-27: new dm2_v22_viewport_swap_pc34.{c,h} provides the bounded per-cell swap API + render pass (indoor T560 4×3 grid + outdoor T600 sky/horizon/ground). Dm2_V22_ShapeType 24-entry enum (walls + floors + creatures + doors + fields + outdoor shapes + SHAPE_NONE sentinel) + dm2_v22_shape_for_cell() discriminator + dm2_v22_asset_id_for_shape() resolver. New CTest dm2_v22_inplace_render_probe was driven by a synthetic manifest under a probe-controlled HOME (no real GRAPHICS.DAT/PNG receipts needed). V1 source ownership preserved: the render pass is a no-op when V22 modern pack is missing, presentation mode is not V22_MODERN, the cache file is not loaded, or the cache is not populated. Companion fix: dm2_v22_inplace_draw_pc34.c previously hardcoded ~/.firestaff/assets/dm1/modern/... (copy/paste leftover from the CSB template) — now mirrors dm2_v22_set_manifest_path() in dm2_v22_modern_assets_pc34.c. 2026-06-29 T560 indoor route gate: DM2_V22_T560IndoorRoute now exposes the nine indoor D0..D2 x L/C/R route descriptors (stable T560_Dx_[LCR] names, raw cell type, discriminator shape, category/asset id, rect + clipped rect, active/no-op state), the probe is 33/33 PASS, V22-disabled routes remain inspectable but do not paint, and indoor-vs-outdoor cache-type mismatches are rejected. Source-locked against SKULL.ASM T520/T560/T600 + ReDMCSB DUNVIEW.C:2962-3070 + DUNVIEW.C:4351-4382 F0112. Remaining: (a) wire dm2_v22_viewport_swap_render() into the DM2 V2 viewport draw path (currently dm2_v2_viewport_renderer.c only manages smooth animation state, not the actual framebuffer paint), (b) authoring real DM2 PBR hero art via gpt-image-2 batch + real-asset receipts in ~/.firestaff/assets/dm2/modern/, (c) outdoor T600 route-depth follow-up beyond the existing 3-cell synthetic paint, and (d) per-mode pixel/material verification gates (V1 vs V2.0 vs V2.1 vs V2.2) to confirm the per-cell swap is observable end-to-end.
Phase 3 HUD runtime PARTIAL — firestaff_dm2_v2_phase3_hud_overlay_probe 61/61 PASS + test_dm2_v2_hud_overlay 76/76 PASS. Source-locked against ReDMCSB PANEL.C. Remaining: HUD widget bitmap assets (inventory quick-view, action prompt) for finished presentation polish.
Phase 3 HUD bitmap assets + widgets (inventory quick-view, action prompt) OPEN-BOUNDED — runtime gates are wired (probe 61/61 + test 76/76); bitmap assets need finished PBR HUD widget art. 2026-06-25: added dm2_v2_hud_widget_assets placeholder-vs-real manifest/gate (Phase 3 primary slots inventory_quick_view/action_prompt + 5 chrome supporting slots: compass rose, depth indicator, gold counter, champion bar frame, action strip frame). test_dm2_v2_hud_widget_assets 115/115 PASS and firestaff_dm2_v2_hud_widget_assets_probe 54/54 PASS cover NOT_PROBED/NO_MANIFEST/PLACEHOLDER/PARTIAL/COMPLETE gates with NO_MANIFEST-by-default baseline matching the current runtime. Source-locked against SKULL.ASM T560, skproject/SKULLWIN/c_gui_vp.cpp, ReDMCSB PANEL.C, include/dm2_v22_modern_assets_pc34.h (sibling V2.2 manifest pattern). 2026-06-27 runtime hook landed: dm2_v2_hud_runtime_render_with_assets() consults dm2_v2_hud_widget_assets_classify_slot() per slot, records the runtime path-mode (REAL_BITMAP vs PROCEDURAL_FALLBACK) and gate verdict into module state, and stamps a 1-pixel marker at each REAL slot’s anchor after the procedural overlay draws; new dm2_v2_hud_runtime_last_path_mode() / _last_path_counts() / _last_slot_class() getters expose the record. New firestaff_dm2_v2_hud_widget_runtime_hook_probe 100/100 PASS covers no-manifest/empty/placeholder/PARTIAL/COMPLETE baselines, per-slot path-mode stability across re-renders, V2-off phase-gate invariant, and source-evidence citation. 2026-06-28 synthetic example gate landed: examples/dm2_hud_widget_synthetic/ provides a checked-in generator="synthetic_test" manifest plus seven 1x1 procedural PNG fixtures; new CTest firestaff_dm2_v2_hud_widget_synthetic_promotion_probe installs it only under /tmp/scratch, verifies one-fixture PARTIAL and seven-fixture COMPLETE, and keeps the no-finished-art boundary explicit. 2026-06-28 (this pass) synthetic-example integrity + generator-agnostic strengthening landed: the same firestaff_dm2_v2_hud_widget_synthetic_promotion_probe (now 81/81 PASS, was 51/51) also (a) verifies every fixture’s first 8 bytes match the PNG signature 89 50 4E 47 0D 0A 1A 0A so a future fixture that silently rots into arbitrary text cannot pass the synthetic-test-fixture substring check alone, (b) verifies every COMPLETE slot reports width > 0 && height > 0 so a corrupt manifest without declared dimensions cannot promote the gate, and (c) installs the manifest after rewriting every generator entry from "synthetic_test" to "pbr_hero", installs all seven fixtures, and verifies the gate still promotes to COMPLETE — proving the gate’s classification logic is generator-string-agnostic for any non-placeholder marker and guarding against a future refactor that accidentally introduces per-generator allowlisting. Honest boundary: the synthetic pack is a test fixture only, the anchor stamp remains the documented replacement site for the real-bitmap blit, and actual pixel decode is intentionally NOT implemented. Remaining: finished PBR widget art, an operator/project real pack whose generator is neither placeholder nor synthetic_test, visual verification, and the actual real-bitmap blit that replaces the 1-pixel anchor stamp.

D3. DM2 per-version coverage

Version Status
DM2 PC 0.9 / 1.0 (en/fr/ge) / demo EXTRACTED + VERIFIED + LAUNCH-TESTED for PC extras dm2-extras/dos-en/, dm2-extras/dos-fr/, dm2-extras/pc-fr/, and dm2-extras/pc-de/ via tier1_strict_boot_probe; DMWeb’s PC edition page identifies Europe/USA English redump BIN/CUE CD images, USA CD-content archives, France/Germany regional CD/floppy/Bestseller lines, final DOS HMP music in GRAPHICS.DAT, VGA/SVGA MVE videos, HMI/GUS sound-driver patch material, and a DOS Alt-S / Shift-arrow / keypad / wall-ornate command table. Demo status still needs separate classification across the five known 1995 builds, including the early FIRE.EXE/LZ91 no-music/no-save demo and later SKULL.EXE/Watcom builds with different GRAPHICS.DAT, DUNGEON.DAT, sound, logo, title, and order assets
DM2 Amiga 1.0 (en-fr-ge) EXTRACTED — dm2-extras/amiga-en/; DMWeb’s Amiga edition page identifies the release as Europe-only v1.0 with Germany/UK edition pages, six ADF/IPF floppy images that cannot be played directly from floppy and require hard-disk installation, MOD music files keyed by CD.DAT, WinUAE-captured Smacker videos, 68020+ / OCS/ECS hardware reality notes, and an undocumented Ctrl-S / Del-Help / keypad wall-ornate command table
DM2 MegaCD/SegaCD 1.0 (jp/en) EXTRACTED — dm2-extras/mega-cd-jp/; DMWeb’s Sega CD / Mega CD edition page identifies Europe/USA English and Japan Japanese v1.0 releases as redump BIN/CUE CD images, lists DMFiles CD-content archives for USA/JP, documents a data-track ISO plus audio-track MP3 split, and notes that track 7 is replaced by 15 seconds of silence
DM2 Macintosh 1.0 (retail EN) — uses QuickTime .moov PARTIAL — the large retail ZIP (mac-en-retail) is read from its HFS media in RAM and is the only supported Macintosh English edition. Its keyboard/menu table, sound queue, QuickTime resources and bounded game routes are source-locked. Japanese and French remain preservation inputs. Remaining: complete original QuickTime timing/presentation ownership, remote wall owners, menu owners, MIDI scheduling, balloon help, save corpus, and JP/FR runtime proof.
DM2 PC-9801/PC-9821/IBM PS/V 1.0 (jp) INTENTIONALLY UNSUPPORTED — PC-9821 support is removed at the user’s request; no launch catalog, startup/runtime route, or validator identity. PC-9801 demo and IBM PS/V remain preservation-only.
DM2 FM-Towns 1.0 (jp) EXTRACTED — dm2-extras/fm-towns-ja/; DMWeb’s FM Towns edition page identifies the JP v1.0 release as a redump BIN/CUE CD image with CD-audio differences (tracks 2-6 slightly quieter, extra silent track 8) and a distinct Ctrl-Shift-S / shifted-arrow command table

DM2 Macintosh status correction (reviewed 2026-08-27): the English retail route is verified for bounded New Game/media/input, not complete Macintosh gameplay. Source 0x04 wall/floor timers are fail-closed until the complete DB3/DB14/DB0 GAME_LOAD transaction is owned atomically. The authentic Mac save corpus, complete GAME_LOAD/Resume owner and dynamic Control/Event pointer/drag owner are still absent; DOSBox SKSAVE files are not Macintosh evidence.


E. Nexus gaps (Saturn)

Source: docs/nexus/NEXUS_FILE_CLASSIFICATION.md, docs/nexus/NEXUS_PLAN.md, Nexus locally verified files in ~/.firestaff/data/nexus/.

E1. V1 phases 0-7

Gap Status
DMDF parser PARTIAL
DGN world loader PARTIAL
MNS creature/spell rendering PARTIAL — 2026-06-27: firestaff_nexus_v1_mns_multi_model_bounds_probe is CTest-gated as nexus_v1_mns_multi_model_bounds_{synthetic,real_corpus,saturn_ja_iso} and PASS 3/3. Synthetic path locks slot-fill (1 + 8 models), NEXUS_MAX_MODELS=64 cap, bad-magic / too-small-buffer failure-isolation across the slot pool, and nexus_v1_shutdown zeroing model_count + nulling every slot’s heap allocations. Real-data path drives the documented 30-creature MNS subset (ANTMAN/BIGWORM/BORKETH/CHAOS/DRA_ZOM/D_GOLD/D_RED/D_SILVER/GHOST/GIGGLER/GOLEM/GRN_DRA/H_HOUND/LAS_MON/LORD_RIB/MINI_DRA/MUMMY/OBAKE/OITU/RAT/RED_DRA/ROCKPILE/SCORPION/SCREAMER/SN_FLOOR/SN_WALL/S_SHIELD/S_SWORD/VEXIRK/WORM) through nexus_v1_load_model and asserts monotonic index growth + per-slot DMDF magic + matching per-slot name + model_count == loaded_count + cap invariant + shutdown cleanup. 2026-06-29 follow-up: the same real-data path now repeats the subset through a fresh engine init/shutdown cycle and requires the accepted/skipped names, returned indices, model_count, DMDF magic, and parsed vertex/face counts to match via a local FNV-1a digest. 2026-08-05: the dedicated MNS decoder retains the real 33-joint SCORPION and 37-joint ROCKPILE skeletons; all 30 retail MNS files and 452 source texture records pass test_nexus_v1_mns. Per-MNS geometry bounds, vertex/UV extents, and face-index validation stay with firestaff_nexus_v1_model_frame_gate_probe. Remaining: runtime creature render against the parsed slot pool, VDP1 texture/palette ownership, and the render-time handoff that turns a parsed model into a visible creature.
S2D font loader/renderer PARTIAL — parser, bounded indexed-framebuffer renderer, bounded real-on-disk SEGA SATURN SCR section-table parser (nexus_v1_saturn_font_scr_sections, 55/55 PASS), and bounded section→glyph-range map + runtime text-layout cursor (nexus_v1_s2d_runtime_text_layout, 99/99 PASS) are CTest-gated; real Nexus screen render capture and full Shift-JIS double-byte / proportional advance support remain open.
TLINK/TAI/SAL/MAP runtime PARTIAL
Save/load (.sav) PARTIAL
V1 mechanics PARTIAL
Real Saturn Track 1 asset loading (DM.BIN/ISO) EXTRACTED + VERIFIED + PHASE-LAUNCH GATED — 2026-06-25: nexus-extras/saturn-ja/Dungeon Master Nexus (Japan) (Track 1).bin::DM.BIN matches canonical DM.BIN hash; the Track 1 .bin (not a re-muxed merged ISO) is the actual source the engine opens through nexus_iso_open_cue. firestaff_nexus_v1_track1_phase_launch_probe is now CTest-gated as nexus_v1_track1_phase_launch_{synthetic,extracted_root,saturn_ja_iso} and PASS 3/3 on 2026-06-25: unit-fixture path checks engine-init and parser API contracts only; its 32 assertions are not retail game-data or parity evidence; extracted_root (53 PASS) and saturn_ja_iso (56 PASS) additionally drive the live nexus_v1_init → nexus_v1_read_file → nexus_v1_load_level(0) → nexus_v1_tick × 5 → nexus_v1_load_model("SCORPION.MNS") → nexus_v1_shutdown pipeline against the verified Track 1 media, including DMDF parser handoff on a real 3D model, real FONT256.S2D parser handoff (256 chars, 16×16), MENU.BPK BPPK magic, and Track 1 BIN ISO-contract checks (nexus_iso_is_nexus recognises DM.BIN + LEV00.DGN; nexus_iso_find("DM.BIN") returns a >=64 KiB payload). 2026-06-29 screen-capture readiness gate added: firestaff_nexus_v1_track1_screen_capture_readiness_probe is CTest-wired for skip-safe, extracted-root, and Saturn-JA-ISO paths; it writes an operator-local JSON manifest and, when real assets are staged, a 320x200 PPM readiness receipt after verifying the combined DM.BIN / FONT256.S2D / LEV00.DGN / SCORPION.MNS handoff and stamping a real-font glyph into the runtime framebuffer. This is provenance/readiness only: the MNS model is loaded but not rendered as a creature, the PPM is not a reviewed public screenshot, and no original Saturn pixel-parity claim is made. Demo and EN/FR fan-translation media lines (separate from the JP retail disc) remain tracked for separate classification. DMWeb’s Saturn pages identify the official JP retail disc (Victor Interactive Software catalog T-9111G, 1998-03-26), a separate JP demo, CD audio tracks 02-09, optional EN/FR fan-translation disc images, and public-proof material from the Japan retail page: screenshots, 48-page booklet, physical scans, and a two-part Japanese playthrough. Remaining: classify demo and EN/FR fan-translation media separately from the JP retail Track 1 source, review/promote an actual Nexus screen capture using the real Track 1 assets before promoting this beyond phase-launch gated, and wire the parsed MNS model pool into visible creature rendering with real VDP1 BITMAP/palette decode.

E2. V2 phases

Gap Status
Phase 0/1/2 FIXED
Phase 5 smooth movement runtime FIXED — 2026-06-22: nexus_v2_smooth_movement + nexus_v2_smooth_movement_runtime_probe CTest-gated and PASS 2/2.
Phase 7 verification (deterministic input + screenshot gates) FIXED — 2026-06-22: data-free firestaff_nexus_v2_verification_suite_probe now extends the existing render-pipeline checks to 53/53 assertions with Nexus V1 movement-backed deterministic input scripts, phase-gate domain boundaries, V1/V2.1/V2.2 gameplay state-hash equality, and synthetic screenshot-style full-frame + viewport-region pixel hash gates for V2 OFF, V2 UPSCALED, and V2 ENHANCED. CTest nexus_v2_verification_suite_probe and focused Nexus sweep PASS 17/17. This closes the bounded deterministic gate without requiring Saturn assets; real-asset/public screenshot promotion remains separate from Phase 7.
Real PBR hero art for Nexus OPEN-LARGE
Per-cell modern-art swap in Nexus V1 draw pipeline OPEN-LARGE
Light-overflow gameplay bug PARTIAL — 2026-06-25 added a data-free Nexus V1 light-overflow data model + bug-classification API (include/nexus_v1_light_overflow.h, src/nexus/nexus_v1_light_overflow.c) plus a CTest probe (firestaff_nexus_v1_light_overflow_probe, ctest nexus_v1_light_overflow, 61/61 invariants PASS). 2026-06-28 added a bounded M11/runtime cast hook (include/nexus_v1_light_runtime.h, src/nexus/nexus_v1_light_runtime.c) and a CTest probe (firestaff_nexus_v1_light_runtime_probe, ctest nexus_v1_light_runtime, 81/81 invariants PASS) that owns one Nexus_V1_LightTimeline + one Nexus_V1_LightState per active game, preserves emulate-vs-guard mode distinction via guard_rejects, surfaces CAST_REJECTED via should_guard() when guard mode rejects at the cap, round-trips MagicalLightAmount + cast/decay/dropped counters + in-use slot array through an NGLT v1 blob (1640 bytes) that drops into the existing FNXS data section without modifying the FNXS header, and rejects mode-mismatched saves cleanly without leaking state. The data model mirrors ReDMCSB WIP20210206 TIMELINE.C F0238 (BUG0_18 silent drop when the timeline hits G0369_EventMaximumCount), TIMELINE.C F0257_ProcessEvent70_Light (recursive weaker-event chain at GameTime+4), MENU.C F0404_MENUS_CreateEvent70_Light and MENU.C:1926-1942 (Light/Torch/Darkness dispatch), DATA.C:359 (16-entry LightPowerToLightAmount table), CHAMPION.C:27 (MagicalLightAmount field), and LOADSAVE.C:2041 (EventMaximumCount=100 base cap). DMWeb evidence (editions/sega-saturn/ light-overflow symptom and solutions/cheats-and-hacks/ permanent-spell-effect exploitation) and the dmweb cheats/hacks page both confirm BUG0_18 as the root cause. The classification hook (Nexus_V1_LightOverflowKind enum) returns one of NONE / TIMELINE_FULL_PERMANENT_LIGHT / LIGHT_BLEED_NEGATIVE / CAST_REJECTED so the future M11 runtime can either emulate (default — source-faithful V1 path that reproduces the dmweb-documented “permanent Light” / “dungeon into darkness” symptoms) or guard (set guard_rejects=1 on the timeline to refuse casts at the cap, suitable for replay/capture contexts). Remaining: Saturn runtime asset handoff (DM.BIN, FONT256.S2D, MNS models), live M11 spellcast dispatch handoff that calls nexus_v1_light_runtime_apply_cast() per champion/mana check, real-asset decay-tick evidence, real FNXS save/load round-trip evidence against a staged operator file, and extending nexus_v1_load_full_from_path() to recognize + decode the embedded NGLT blob at the documented offset. None of those block the bounded classification contract or the runtime wire-in.

F. Theron gaps (PC Engine / TurboGrafx-16)

Source: DMWeb Theron’s Quest overview and PC Engine / TurboGrafx-16 edition pages, docs/nexus/NEXUS_PLAN.md (similar shape), Theron local probes.

F1. V1

Gap Status
V1 parser FIXED
Rendering pipeline PARTIAL — real-media decoding and bounded viewport/runtime paths are tested, but an original-runtime capture has not established authentic in-game rendering or presentation parity.
Mechanics PARTIAL — bounded mechanics and command-path tests pass, but original consumers for stairs, quest-item pickup/use, dynamic creatures/combat, and chapter completion remain unbound; see TODO-theron.md.
Save/load (.SRM) PARTIAL — data-free .tqsv slot round-trip, rejection, verification, and cross-slot export/import are CTest-gated; 2026-06-25 adds theron_v1_srm_classifier (probe + unit test) as a bounded Save Disk manifest that detects the gzipped-deflate body dmweb references, reports a clean ABSENT manifest on the current host, and accepts a real .srm when one is staged under the configured root. No real .srm/Track 02 save artifact is present locally yet.
Track02 bank routing FIXED
Dungeon progression (7 dungeons) PARTIAL — campaign-state projection and bounded level handoffs are tested, but the original stair/exit and completion transactions have not been verified end to end across the seven dungeons.
JP/US Track 02 BIN/ISO real-asset launch FIXED — tier1_strict_boot_probe covers Theron JP canonical, Theron JP extras, and Theron US extras booting to the TQR level-load milestone; theron_v1_launcher_scan_reuse and theron_v1_track02_bank also PASS.
Theron m11 runtime command proof FIXED — 2026-06-21 (commit cd86d520): firestaff_theron_v1_cross_route_mechanics_probe CTest-gates a real firestaff --game theron run via temporary launcher config, captures a M11 run receipt (launch + early command tick), verifies M11 reports source theron plus command processing, and proves the M11 run path is launchable on this host. 2026-06-21 (commit 363bf3b9): tqr_v1_track02_bank_signal_2026-06-03.md locks raw Track 02 bank anchors (0x1F000..0x1FFFF graphics bank + 0x20000..0x27FFF dialogue + 0x28000..0x2BFFF map-data) against the CD-ROM2 1MB sector map.
Theron 24h readiness rollup FIXED — 2026-06-21 (commit a0592d6d): tools/theron_24h_readiness.py + parity-evidence/verification/theron_24h_readiness/manifest.json + docs/theron/THERON_CAPTURE_READINESS.md roll up 7 Theron V1 readiness gates (track02 bank, save/load, cross-route mechanics, runtime screenshot, dungeon progression, cross-slot, m11 launch) into a single per-day PASS/FAIL line, mirroring the DM1 24h readiness pattern. 2026-06-21 (commit 393d9f64): theron: refresh readiness reports re-emits the manifest with current commit SHAs.
Theron runtime screenshot readiness FIXED — 2026-06-21 (commit b7dbcd60): firestaff_theron_v1_runtime_screenshot_readiness CTest-gate + tools/verify_theron_v1_runtime_screenshot_readiness.py + parity-evidence/theron_v1_runtime_screenshot_readiness.md prove the M11 path can produce a Track-02-backed screenshot receipt on the current host. CTest/screenshot gates pass for the launchable Theron paths.
Theron runtime screenshot README-promotion gate FIXED — 2026-06-25: added tools/verify_theron_v1_runtime_screenshot_promotion_gate.py + parity-evidence/verification/theron_v1_runtime_screenshot_promotion_gate/manifest.json + parity-evidence/theron_v1_runtime_screenshot_promotion_gate.md + CTest entry theron_v1_runtime_screenshot_promotion_gate. The gate is the source-of-truth guardrail that audits the readiness manifest against an explicit README-eligibility contract (real Firestaff runtime capture, no deterministic fallback assets, TQR level load boot marker, semantic Track 02 loader evidence, unique source BMP sha256 per row, valid 320x200 presented BMP) and locks NO_README_PROMOTION_PERMITTED until at least one row is README_ELIGIBLE. Current host state (2026-06-25): 0/3 rows eligible — every readiness row still uses deterministic fallback assets and shows no semantic Track 02 loader evidence (probe gameTick=0, party.mapIndex=0, lastOutcome='THERON READY'); additionally the three rows share an identical source BMP sha256, which the uniqueness audit flags as a shared-placeholder-fixture smell. docs/theron/THERON_CAPTURE_READINESS.md now points to the promotion gate as the single source of truth for whether a Theron capture may be promoted into verification-screens/ or docs/compare/.
DMWeb overview provenance FIXED / EVIDENCE-BOUNDED — 2026-06-25: DMWeb’s Theron’s Quest overview page pins the JP release to 1992-09-18, the USA release to 1993, and the runtime shape as a PC Engine / TurboGrafx-16 CD adaptation with seven small dungeons, between-dungeon saves only, companion skill/item resets, Theron skill/stat retention, and seven relic goals. Remaining work is turning those details into public progression/save/relic receipts rather than broadening the current Track 02 launch claim.
DMWeb PC Engine / TurboGrafx edition provenance FIXED / EVIDENCE-BOUNDED — 2026-06-25: DMWeb’s edition page separates JP, USA, and PCEWorks bootleg records; lists JP/USA redump BIN/CUE, CloneCD, and DMFiles ISO/OGG sources; identifies Track 02 as the data track; records tracks 01/03/04 as shared music with Japanese or English speech; lists JP tracks 05-18; and notes the JP Track 17 static-noise defect fixed in the US version. 2026-06-29: theron_v1_track02_bank now verifies all three raw US and all three raw JP audio-bank marker tuples (sentinel, id word, and offsets) when matching user-staged Track 02 BINs are present. Remaining work is BIN/CUE-vs-ISO/OGG classification, intro/outro/screenshot receipts, and actual ADPCM/CD-DA decode or playback proof, while keeping the bootleg out of canonical data.
DMWeb JP/USA retail provenance FIXED / EVIDENCE-BOUNDED — 2026-06-25: DMWeb’s JP retail page records bar code 4 988002 247950, 1992-09-18 release, ¥8200 price, jewel-case contents, 142x125x10 mm box, 32-page booklet, back card, spine card, and CD scans; the USA page records bar code 0 92218 00178 8, 1993 release, jewel-case contents, 142x125x10 mm box, hook-back scan, 32-page booklet, back card, and CD scan. Remaining work is using these as public retail receipts without changing the Track 02 runtime boundary or admitting PCEWorks bootleg media as canonical.
Cross-slot import/export against real Track 02 saves PARTIAL — theron_v1_save_load now covers export/import mechanics across save roots using validated Theron save images; 2026-06-25 adds theron_v1_srm_classifier (probe + unit test) as a bounded Save Disk manifest that detects the gzipped-deflate body dmweb references, reports a clean ABSENT manifest on the current host, and accepts a real .srm when one is staged under the configured root. Remaining work is still importing/exporting a real Track 02 save artifact when one is available.
Cross-route mechanics runtime evidence FIXED for the CTest-gated mechanics path — 2026-06-21 firestaff_theron_v1_cross_route_mechanics_probe CTest-gates real firestaff --game theron command proof (commit cd86d520). Broader real-asset cross-route capture pairs (level-by-level route transcript) remain out-of-24h scope.

F2. V2

Gap Status
Phase 0/1 FIXED
Phase 2 (presentation selection, EPX upscaler) FIXED
theron_v22_modern_assets_pc34 FIXED
Real PBR hero art for Theron OPEN-LARGE
Per-cell modern-art swap in T400/T600 OPEN-LARGE
Phase 3 enhanced UI overlays PARTIAL — 2026-06-27 Theron V2 Phase 3 initial seed landed (theron_v2_hud_overlay_pc34.c/.h, tests/test_theron_v2_hud_overlay_pc34.c 58/58 PASS, probes/firestaff_theron_v2_phase3_hud_overlay_probe.c 40/40 PASS). Mirrors the CSB + DM2 Phase 3 sibling pattern with Theron-specific surfaces: top-bar (compass + quest items + dungeon progress 1/7 + relic counter 0/7 + 4-slot spell-rune ready indicator), bottom-panel (4 champion mini-bars HP/Stamina/Mana with slot 0 = Theron / leader), bottom action strip (ATK/CST/USE/DRP/MOV with active underline and 6-frame hit-flash decay), and V2.2 interaction feedback (low-HP 2 Hz pulse on hp < 25%). PC Engine native 256×224 indexed framebuffer (TQR_FB_W × TQR_FB_H). Source-locked against THQUEST.ASM T520/T560/T600/T700/T800/T900, HuC6260/HuC6270 datasheet, ReDMCSB PANEL.C F0354 + DUNGEON.C F0260, dmweb Theron overview (7 dungeons + 7 relic goals + rune magic), docs/source-lock/tqr_v1_phase2_data_formats_H2339.md. CTest theron_v2_phase3_hud_overlay_probe (40/40 PASS, labels tier2;theron;v2;phase3;hud;presentation-only) and theron_v2_hud_overlay_pc34 (58/58 PASS) both green. 2026-06-27 (this pass) Phase 3 placeholder-vs-real asset gate landed: theron_v2_hud_widget_assets_pc34.c/.h is the Theron-specific sibling of dm2_v2_hud_widget_assets. New CTest theron_v2_hud_widget_assets_pc34 (105/105 PASS) and headless probe firestaff_theron_v2_hud_widget_assets_probe (65/65 PASS, labels tier2;theron;v2;phase3;hud;widget-assets;presentation-only) cover NOT_PROBED/NO_MANIFEST/PLACEHOLDER/PARTIAL/COMPLETE gates with NO_MANIFEST-by-default baseline matching the current runtime. Slot table (7 slots, stable order, ordinals = indices): 5 Phase 3 primary (compass_rose, quest_items, dungeon_progress, relic_counter, rune_indicator, category hud_widgets) + 2 chrome supporting (champion_bars, action_strip, category hud_chrome). Manifest schema { id, generator, source_file, width, height } aligned with sibling theron_v22_modern_assets_pc34 and dm2_v2_hud_widget_assets shapes; manifest path ~/.firestaff/assets/theron/hud/hud_widget_manifest.json. Companion source-lock doc docs/source-lock/theron_v2_phase3_hud_widget_assets_H2340.md documents the slot table, schema, gate state machine, M12/Phase 7 integration points, and honest boundary. Source-locked against THQUEST.ASM T520/T560/T600/T700/T800/T900, HuC6260/HuC6270, ReDMCSB PANEL.C F0354 + DUNGEON.C F0260, dmweb Theron overview, docs/source-lock/tqr_v1_phase2_data_formats_H2339.md, sibling dm2_v2_hud_widget_assets.h. Remaining Phase 3 work: (a) M11 wire-up — call theron_v2_hud_render() after the Theron V1 viewport render gated on phase gate (mirror DM2 V2 HUD wire-up); (b) finish PBR top-bar / bottom-panel / action-strip bitmap assets under ~/.firestaff/assets/theron/hud/hud_widgets/ and ~/.firestaff/assets/theron/hud/hud_chrome/; (c) author an example ~/.firestaff/assets/theron/hud/hud_widget_manifest.json with generator ≠ "placeholder" so the new gate can promote the placeholder state to PARTIAL/COMPLETE; (d) real-art visual verification + per-region pixel gates against real Track 02 captures. Original DOS / original PC Engine pixel-parity claim stays out of scope.
Phase 4 enhanced lighting/effects OPEN-LARGE — not started
Phase 5 smooth movement FIXED — 2026-06-22: theron_v2_smooth_movement_pc34 CTest-gated and PASS.
Phase 6 touch/controller ergonomics OPEN-LARGE — not started
Phase 7 V2 verification suite OPEN-LARGE — not started

G. Launcher / Settings / Accessibility (cross-cutting)

G1. M12 launcher

Gap Status
19-locale UI cycle FIXED in v2.9.2
Persistence for many options + 5 per-game slots FIXED
Polished UI flow FIXED — 2026-06-22: added CTest m12_polished_ui_flow over the public launcher input state machine. The gate covers initial no-data message dismissal, top-level LEFT no-op versus BACK exit, unavailable-game message routing, Museum category/page/back navigation, changelog shortcut/scroll/back navigation, settings row/tab/value/back navigation, and matched DM1 game-options launch-row handoff into a valid launch intent. m12_extras_views_smoke also drives the real extras input path, checks available extras pages, disabled extras popups, and BACK/ESC-style restoration from message, settings, game options, changelog, museum, manual/docs, bestiary, item encyclopedia, and screenshot gallery back to the main view/navigation level. m12_menu_mouse CTest-gates pointer hit-test parity for redesigned Extras row selection, disabled-extra popups, and available-extra view opens through the same input path. Popup focus retention is covered too: game-options launch popups return to the launch row, and settings save-manifest export/import popups return to the originating settings row. Data-directory scan feedback now reports the same bounded result in Settings and in the picker result popup (NO VERIFIED DATA, FILES FOUND, or exact ready-game count). Redesigned Play game-select opens per-game missing-data details for unavailable rows and returns to the same game-select row on BACK.
No-data / missing-required-files popup once FIXED — 2026-06-22: added CTest m12_no_data_popup_once_gate proving the M12 launcher surfaces the no-data and missing-required-files popups exactly once per relevant scan or selection state. The gate covers the initial InitWithDataDir “NO GAME DATA FOUND” popup, ACK dismissal back to a clean MAIN view, unavailable-game-card “DM1 GAME DATA NOT FOUND” popup per selection event, the data-dir picker cancel path producing “DATA DIRECTORY UNCHANGED” once without a duplicate no-data popup on top, M12_StartupMenu_SetDataDirectory with an empty root producing “NO VERIFIED GAME DATA FOUND” once via the result-popup path, and quick-resume ACK against an unavailable game producing the missing popup once without setting launchRequested/quickResumeLaunchRequested.
Runtime handoff for every option PARTIAL — CSB is catalogued for its original Atari ST, Amiga and FM Towns editions. Remaining gaps are per-game polished flows, richer CSB viewport/HUD/gameplay proof, and original capture parity.
Save export/import FIXED / PARTIAL-PER-GAME — 2026-06-22: added M12 save-browser export/import helpers and CTest save_browser_export_import_m12, covering selected firestaff-*.sav export to a backup directory, byte-preserving import back into the data directory, destination no-overwrite behavior, invalid filename rejection, reported destination paths, and NULL-state rejection. M12 settings also expose bounded Export/Import Save Manifest actions that write/read firestaff-save-export-manifest.json, validate the manifest type, reject invalid path strings, preserve existing config on failed import, and CTest-cover config/API plus settings-row reachability via m12_json_export_import and m12_startup_menu. 2026-06-29 adds save_byte_manifest_m12, a versioned per-game save-byte manifest gate for Firestaff-native DM1 saves: the manifest records runtime_save_bytes_included = 1, FSDM1SV1 format id, byte count, and whole-file CRC; import verifies the DM1 header version/declared size/body CRC, rejects corrupt payloads, and refuses overwrites before copying bytes. Remaining per-game work: original DM1 save conversion/interoperability, CSB/DM2/Nexus/Theron save-byte manifests, version migration policy, and real original/community save compatibility artifacts.
Session timer FIXED — 2026-06-22: added a persisted launcher-owned Session Timer setting (Off, 15m, 30m, 60m, 120m) with a visible modern settings row, mouse hit coverage, TOML/JSON config persistence, and helper coverage for remaining-time math. Added M12_CampaignSessionTimer with start/pause/resume/tick/flush-to-slot semantics and CTest campaign_m12_session_timer, covering stopped/paused no-op behavior, positive accumulation, negative tick rejection, HH:MM:SS formatting, flush into playTimeSeconds, modification timestamp update, reset after flush, empty flush no-op, and stale-session reset on restart. This is launcher/settings and save-slot accounting coverage; it does not claim an in-game forced-pause overlay.
Manual/docs launcher FIXED — 2026-06-22: added a testable M12 manual/docs catalog (manual_docs_m12) and wired the launcher Manual / Docs extras row to an internal M12_MENU_VIEW_MANUAL_DOCS view instead of a hardcoded browser-only URL path. CTest manual_docs_launcher_m12 gates the five user-facing entries (README manual, data setup, platform matrix, dmweb/Greatstone reference, release notes), Firestaff GitHub URL scope, repository-relative paths, existing source-tree files, lookup bounds, duplicate-id rejection, and confirms the internal primary gap list is not exposed as user manual content. firestaff_m12_extras_views_smoke_probe covers manual/docs navigation plus nonblank framebuffer output.
Cloud sync OPEN-LARGE — bounded M12 opt-in/no-op boundary exists (2026-06-28) and the launcher settings JSON schema now round-trips cloud_sync_enabled, cloud_sync_policy, and cloud_sync_dir (2026-06-29). Still no real cloud provider, multi-device encryption, conflict UI, or scheduled push/pull runtime integration.
Custom/V2 smooth-turn-pan toggles FIXED — 2026-06-22: M12 modern settings now exposes SMOOTH TURN PAN as a visible toggle row. menu_hit_launch_direct_click_m12 and m12_startup_menu CTest-gate hit-testing, click cycling, TOML persistence, reload, and config-file receipt (dm1_v2_smooth_turn_pan_enabled = 1). dm1_v2_settings_pc34 gates settings-file handoff, and dm1_v2_camera_turn_edge_cases_pc34 gates the V2-only presentation pan offsets. V1 source-snap remains preserved because the saved flag does not change the original graphics mode.

G2. Touch / controller

Gap Status
Gesture navigation for runtime movement/turning OPEN-LARGE
UI scaling + touch-target audit across launcher/game views OPEN-LARGE

G3. Accessibility

Gap Status
Screen reader integration FIXED — 2026-06-27: firestaff_m12_launcher_screen_reader_manifest_probe now PASS 69/69 (up from 40/40) + firestaff_accessibility_manifest_unit PASS 39/39. Launcher state manifest now covers main view (game cards), settings (tabs + rows), missing-data / status popup, plus the four cell-by-cell extras views — bestiary, item encyclopedia, screenshot gallery, and museum of lore — with stable element IDs (GAME_CARD_DM1..THERON, MENU_SETTINGS, MENU_MUSEUM, TAB_*, ROW_*, POPUP_*, BESTIARY_CAT_* / BESTIARY_ROW_*, ITEM_CAT_* / ITEM_ROW_*, SCREENSHOT_ROW_*, MUSEUM_CATEGORY_* / MUSEUM_BULLET_*). New element types in firestaff_accessibility.h (FS_AX_CATEGORY_TAB, FS_AX_BESTIARY_ROW, FS_AX_ITEM_ENCYCLOPEDIA_ROW, FS_AX_SCREENSHOT_THUMB, FS_AX_MUSEUM_CATEGORY, FS_AX_MUSEUM_BULLET); new private emit functions in menu_startup_a11y_m12.c (emit_bestiary_view / emit_item_encyclopedia_view / emit_screenshot_gallery_view / emit_museum_view); new public getters in include/menu_startup_m12.h (M12_Museum_GetCategoryTitle / M12_Museum_GetCategoryPageCount / M12_Museum_GetBullet) so the museum’s private static data is reachable without leaking the table. Probe subtests H/I/J/K cover bestiary category tabs + per-creature rows with selected value, item-encyclopedia category tabs + per-item rows with a per-category leak check, screenshot-gallery thumbnails with filename label + selected value, and museum sections + page-driven bullet content (page 0 surfaces 1987 FTL GAMES, page 2 surfaces PRESERVATION NOTES for the DUNGEON MASTER section). M11 game-view manifest covers gameplay / inventory / map / dialog / entrance-mirror / endgame states, and m11_gameplay_screen_reader_manifest_probe gates open-chest zones, classifier precedence, atomic-write/no-launcher-leak invariants, redraw idempotence, and framebuffer-contained bounds; the probe also fixed the endgame manifest coordinate offset so plaque/mirror/portrait bounds match the victory overlay. Hardened 2026-07-01 (fallthrough views navigation-anchor gate): subtest N in firestaff_m12_launcher_screen_reader_manifest_probe (now PASS 175/175, up from 91/91) pins the documented “out of scope” fallthrough contract for the 12 launcher views that intentionally fall through to emit_main_view as a navigation anchor: data-validator / audio-settings / accessibility / theme / save-browser / input-remap / custom-dungeon / campaign / spell-reference / map-viewer / touch-layout / presentation-preview. For each view the subtest asserts (a) the envelope gameState matches the active view (launcher_<viewName>), (b) the GAME_CARD_DM1 / MENU_SETTINGS / MENU_MUSEUM / GAME_CARD_THERON navigation anchors are emitted, (c) the framebuffer dims stay pinned to 480x270, and (d) no foreign view markers leak into the manifest (forbidden-marker table covers ROW_*, TAB_*, CHANGELOG_LINE_*, MANUAL_DOC_*, BESTIARY_CAT_*, BESTIARY_ROW_*, ITEM_CAT_*, ITEM_ROW_*, SCREENSHOT_ROW_*, MUSEUM_CATEGORY_*, MUSEUM_BULLET_*, POPUP_MESSAGE, POPUP_OK, POPUP_LINE*). A future dedicated emitter for any of these 12 views only needs to assert that the new view-specific markers appear AND the fallthrough markers disappear. Still open: real assistive-technology smoke evidence beyond JSON shape (the 12 fallthrough views now have the navigation-anchor contract machine-checked; dedicated emitters for any of them remain a per-view follow-up).
High-contrast launcher remap FIXED
In-game overlay coverage FIXED — 2026-06-27: m11_high_contrast_overlay_pc34_compat module exposes the M11 chrome-remap gate (SetActive/IsActive/RemapPresentedColor/ApplyActiveRGBA/GetManifest); m12_apply_loaded_config in src/ui/menu_startup_m12.c pushes config.highContrast into M11_HighContrast_SetActive() next to the existing M11_UIScale_SetPercent push. m11_draw_text and m11_draw_text_original route through a m11_chrome_remap_style() helper so HUD/dialog/log/rune/hit-flash/death-overlay text picks up the restricted palette when the gate is on. Raw 320x200 dungeon-viewport pixels + HUD panel C040/C017 blits are deliberately preserved bit-exact (they go through separate bitmap-blit paths, never through m11_draw_text). CTest m11_high_contrast_overlay_pc34_compat PASS 369/369 (default-off identity for V1 fidelity, restricted-palette remap when on, region apply with excludeMask viewport fence, manifest string contract, launcher / game palette parity). Headless probe firestaff_m11_high_contrast_overlay_runtime_probe PASS 14/14 (launcher→M11→viewport-fence state machine). Labels tier2;m11;accessibility;high-contrast. Source-lock: none — pure accessibility glue that mirrors the existing m12_presented_color() contract in src/ui/menu_startup_m12.c; ReDMCSB does not cover high-contrast palette remap. Hardened 2026-06-28 (rectangle-fence apply helper): added M11_HighContrast_ApplyActiveRGBAExceptRect() so a broad chrome-overlay pass can skip an explicit dungeon-viewport rectangle (e.g. 0,0,224,136 over the 320x200 logical buffer) instead of relying only on palette-index excludeMask bit-fencing. The dungeon viewport is now fenced by both axes: pixels inside the preserve rectangle are NEVER touched, even when their palette index is muted and would otherwise collapse to BLACK; pixels outside the preserve rectangle still follow the restricted-palette remap. The new helper is wired into the existing m11_high_contrast_apply_active_region static implementation so the original M11_HighContrast_ApplyActiveRGBA() retains its excludeMask-only contract. Manifest chrome_rect_remap_with_viewport_fence token added so the gate can be audited by name. CTest m11_high_contrast_overlay_pc34_compat now PASS 379/379 (10 new assertions for the rectangle-fence variant: broad remap reports chrome changes, preserve rectangle stays byte-identical, chrome outside the rectangle follows the remap table, zero-area preserve rect disables the rectangle fence and falls back to excludeMask, negative preserve dimension disables the rectangle fence, gate off leaves every pixel alone even with a real preserve rect, manifest coverage entry). Headless probe firestaff_m11_high_contrast_overlay_runtime_probe now PASS 19/19 (5 new invariants: rect-fenced broad remap touches HUD chrome strip, rect-fenced broad remap preserves dungeon viewport pixels, rect-fenced broad remap collapses chrome strip to BLACK, zero-area preserve rect disables the rectangle fence and falls back to excludeMask, rect-fence helper preserves checker pattern inside the dungeon viewport). Existing launcher/game palette parity + toggle-round-trip + manifest-contract invariants all still PASS.
In-game overlay helper safety FIXED — 2026-06-29: m11_high_contrast_apply_active_region() now clips both apply rectangles and preserve rectangles with widened arithmetic before converting back to framebuffer coordinates. This keeps the public high-contrast helpers defined for extreme synthetic/tooling inputs (INT_MAX widths/heights, huge negative/off-right rectangles, off-screen preserve rectangles) without changing the accessibility scope or viewport-fence behavior. CTest m11_high_contrast_overlay_pc34_compat now PASS 422/422; firestaff_m11_high_contrast_overlay_runtime_probe remains PASS 19/19.
Launcher fontScale affects M12 text FIXED
In-game overlays + UI-fit coverage FIXED — 2026-06-22: test_m11_ui_scale CTest-gated and PASS 1/1. Pins the M11 UI scale global state contract: default 100% stays bit-identical to V1, NormalizePercent snaps any input into {100, 150, 200}, Apply is integer nearest ((value * percent + 50) / 100). Source-locked against include/ui_scale_m11.h. Label tier2;m11;ui-scale;accessibility. Strengthened 2026-06-27 by firestaff_dm1_v1_dialog_choice_font_scale_fit_probe (PASS 81/81, label tier2;m11;dm1;dialog;font;scale;ui-fit;accessibility) — pins the in-game dialog choice zone geometry (C462/C463/C466/C467 in ReDMCSB layout-696), the M11_Font_DrawString advance per scale step (8/16/24 px per char), and the layout-level overflow that the missing-clip bug shape would hide at scale 2/3. Disjoint from test_m11_ui_scale (percent snap + Apply math only).

H. Cross-spiel prioritized work order

For the next sprint (post v2.9.1, pre v2.10.0), I propose this order:

Tier 1 (BLOCKED-DATA — surface via tooling, not code)

  1. Document real-data acquisition checklist: which Atari ST / Amiga / SNES / MegaCD / Saturn / PC Engine binaries need to be sourced per game, with hashes that will gate future runs of compare_to_greatstone.py. — DONE (docs/DATA_ACQUISITION_CHECKLIST.md with per-game ✅/🟡/🔴/⚪ status matrix; generated by python3 tools/asset-validate/compare_md5_to_sha256.py — current coverage: 148/148 registry entries present + hash-correct).
  2. Add compare_to_greatstone.py summary mode that prints a per-game “data gap” view (which files in VERIFIED_HASHES.md are not on disk). — DONE (new --summary mode in tools/asset-validate/compare_to_greatstone.py: prints per-game TOTAL/FOUND/MISS table from any data root; default to ~/.firestaff/data). Run: python3 tools/asset-validate/compare_to_greatstone.py --summary. Companion tool tools/asset-validate/data-readiness-summary.py (Tier 1 #2 L2, FIXED 2026-06-22 commit a56d79c70 → main 22a8caa3) builds a per-game readiness table by combining --scan-data, the --summary hash table, and an opt-in --boot-probe. See L2 below for full description.
  3. Verify all --scan-data READY-path:er are actually launchable by M11. — DONE for Tier 1 path-discovery scope 2026-06-21: CTest tier1_strict_boot_probe PASS for all present in-scope launch paths (DM1 canonical, DM1 legacy-dos, CSB canonical, CSB Amiga 3.3 Meynaf FR, Theron JP canonical, Theron JP extras, Theron US extras), and asset_validate_coverage_by_game PASS. Nexus virtual-ISO launch remains out-of-scope here and tracked as a Tier 4 runtime/launcher gap, not a path-discovery gap.
  4. Scanner path-naming limitations: CLOSED as NO-GAP 2026-06-20. The scanner already matches on MD5 via asset_find_by_md5 and scan_iso_by_md5 now also falls back to whole-file MD5 for non-ISO-9660 .bin files (Theron Track 02, raw Saturn tracks). Verified: --data-dir ~/.firestaff/data/nexus-extras/saturn-ja reports Nexus READY (FOUND ...Track 1).bin::DM.BIN) and --data-dir ~/.firestaff/data/theron-extras/{japan,usa} reports Theron READY (FOUND ...Track 02).bin). See reference/L1_data_path_verification_2026-06-20.md Results v2 for verification data.
  5. Mirror dmweb /community/documentation/ for offline research — DONE 2026-06-20 (commit pending; 43 pages mirrored at reference/dmweb-community-docs/ with INDEX.md + index.json + SCRAPE_LOG.md; reproduceable via crawl.sh). Eliminates the “free.fr intermittent 404” risk for 5 topic areas.
  6. Ship a reproducible game-archive extraction script that pulls from ~/<downloads>/ to ~/.firestaff/data/<game>-extras/ without overwriting canonical staging — DONE 2026-06-20 (commit 4b097f54; 73 archives → 71 version directories; ~6.2 GB extracted; 4 new READY paths discovered by --scan-data).

Tier 2 (OPEN-BOUNDED — fits one commit each)

  1. CSB hidden-code skip table for Atari ST + Amiga items 558-562. — DONE (commit c5897fce feat: extend CSB hidden-code skip table to 12 entries (CSB Atari + Amiga specific) + earlier a8033a47 feat: extend CSB hidden-code skip table to 12 entries). 12 entries total: 4 Atari/Amiga executable rows (558-562), 2 kid dungeon rows (135-138), 3 CSB Atari ST (21/538/548), 3 CSB Amiga (21/676/686). Source-locked against Meynaf disassembly + 4 COD1/COD2/COD3/COD4 container formats.
  2. LZW decoder for Atari ST GRAPHICS.DAT (only Atari ST uses LZW). — DONE for the decoder: m11_gfx_lzw_decompress has a contract-only round-trip test (test_dm1_lzw_round_trip.c, dm1_lzw_round_trip PASS 1/1 on 2026-06-21, pass852). DMWeb’s DM Atari ST edition page now documents the expected original media set and per-version split (two English 1.0 builds, English 1.1/1.2, German 1.2, French 1.3); real Atari ST asset handoff still BLOCKED-DATA.
  3. PAK container decoder for Atari ST START.PAK. — DONE (commit 3ee479de); real-media proof should keep DMWeb’s cracked ST/MSA, hard-disk, and RamDisk hack derivatives separate from canonical STX originals.
  4. CMP portrait loader for CSB utility disk. — DONE (commit 532c8250); firestaff_cmp_decode_unit + csb_v1_cmp_import_pc34 PASS 2/2 on 2026-06-21. Runtime champion portrait source-selection remains tracked separately under A3, not as a CMP format decoder gap.
  5. Harmonize MD5 vs SHA256 in asset_find_by_hash.c (or add wrapper). — DONE (commit 5988b620, see docs/MD5_SHA256_HARMONIZATION.md)
  6. _G2157_ linker fix (add image_frontend_pc34.c to firestaff_m10 source list). — DONE (commit 3588798f, added image_backend_pc34_compat_globals.c instead which provides the same symbols without dragging in the legacy frontend)
  7. Lefthook-in-CI install step. — DONE (.github/workflows/verify.yml:227-253 installs Go + lefthook via go install github.com/evilmartians/lefthook@latest, then runs lefthook run ci for po_layout + hash_harmonization as CI sanity gate).
  8. --data-dir override in m12_build_search_roots — DONE 2026-06-20 (commit 6a7eccdc). Explicit --data-dir no longer silently falls back to ~/.firestaff/data; runtime dataDir-override also skipped when request is explicit. 5/5 asset-status tests pass; tested with --data-dir ~/Downloads --scan-data → reports Data dir: <local-home>/Downloads and scans only that directory.

Tier 3 (OPEN-LARGE — separate milestones)

  1. FTL container decoder (Amiga, X68000, MegaCD). — PARTIAL: generic header/hunk/checksum parser is CTest-gated, and the bounded HUNK_DATA area_1 zero-run decompression (greatstone d_ftl.html “Note 7”) is now CTest-gated via firestaff_ftl_hunk_data_zero_run_unit. 2026-06-25 X68000 <-> FTL handoff added: firestaff_x68k_ftl_handoff_unit PASS 5/5 cross-module test verifies the FTL-declared data_area1_memory_size fits inside the DMWeb 1232 KB 2DHD disk; companion firestaff_x68k_media_classify_unit PASS 13/13 covers the DMWeb X68000 geometry constants, copy-protection-sentinel detection, and configurable FTL-magic scan window. HUNK_CODE 0x5223 decompression/checksum verification, mapfile item extraction, real FTL corpus verification, and runtime loading remain.
  2. CSBWin custom resource path (csbgraphics.dat + dmsave).
  3. DM2 advanced CCM + projectile-list drain.
  4. DM2 per-cell modern-art swap (T560/T600).
  5. Nexus per-cell modern-art swap (Saturn draw pipeline).
  6. Theron V2 phases 3-7 (UI overlays, lighting, smooth movement, touch, verification).
  7. CSB V1 graphics ornament blits (F0108, F0115, F0111, CustomBackgrounds).

Tier 4 (per-game polish, partially started)

  1. CSB mechanics parity (combat, dungeon, champion, inventory).
  2. DM2 mechanics (shops, NPCs, triggers, timeline). — Shop-economy determinism probe (firestaff_dm2_v1_shop_economy_determinism_probe, ctest dm2_v1_shop_economy_determinism_probe, commit a89c257f): 19/19 PASS covering reset/enter/buy/sell/leave state transitions, party-state hash preservation across leave, 50-repetition determinism, wrong-shop rejection, insufficient-gold path. Source-locked per skproject/SKULLWIN/c_shop.cpp transaction pricing
    • skproject/SKWinGlobal.h:42 (NUM_NPCS=4). Existing coverage already includes firestaff_dm2_v1_shop_probe (built-in shop catalog + NPC dialog), firestaff_dm2_v1_trigger_probe (8 triggers + 4 kinds + 6 targets), and firestaff_dm2_v1_timeline_probe for the three other DM2 mechanics domains.
  3. Nexus runtime/probe coverage beyond compile/save-load.
  4. Theron cross-slot import/export + cross-route evidence. — Dungeon-progression determinism probe (firestaff_theron_v1_dungeon_progression_determinism_probe, ctest theron_v1_dungeon_progression_determinism_probe, commit 8a43fcf8): 20/20 PASS covering the 7-dungeon progression state machine (THQUEST.ASM T080 between-dungeon save/load), init / advance / quest-complete transitions, NULL-safety, and 50-repetition determinism. Source-locked per ReDMCSB GROUP.C analogue + THQUEST.ASM T080. Between-dungeon save/load itself is already covered by tests/test_theron_v1_save_header_rejection.c + the existing Theron V1 mechanics probe (10 tests / 5 probes already green for the V1 gameplay loop).

Tier 5 (i18n follow-up)

  1. Native-vs-fallback separation in validate_po_layout.sh. — DONE: validator now reports nonblank and native coverage separately, with fallback-only catalogs marked FALL without failing the structural CI gate.
  2. Fill DM1/nexus/csb/theron/firestaff missing native translations with native speakers (out of scope for AI).

Tier 6 (launcher/accessibility)

  1. Save export/import, session timer, manual launcher.
  2. Touch gesture navigation.
  3. Screen reader integration. — FIXED 2026-06-27/29 + fallthrough-anchor gate 2026-07-01: launcher-state manifest covers main view / settings / missing-data popup plus the four cell-by-cell extras views (bestiary, item encyclopedia, screenshot gallery, museum of lore) with stable element IDs (probe PASS 175/175, up from 69/69), and M11 gameplay manifest coverage now has a headless probe for gameplay / inventory / map / dialog / entrance mirror / endgame / open chest surfaces. Subtest N pins the navigation-anchor contract for the 12 fallthrough launcher views (data-validator / audio-settings / accessibility / theme / save-browser / input-remap / custom-dungeon / campaign / spell-reference / map-viewer / touch-layout / presentation-preview) — each view emits GAME_CARD_DM1 / MENU_SETTINGS / MENU_MUSEUM / GAME_CARD_THERON, uses the active-view gameState prefix, and never leaks a foreign view’s markers. Remaining follow-up: manual-docs + changelog already have dedicated emitters; the 12 fallthrough views still intentionally fall through to main-view emission as a navigation anchor (now machine-checked), but each one is a candidate for a dedicated emitter if its UI gains a per-cell or per-row surface; plus real assistive-technology smoke evidence beyond JSON shape.

I. Sources surveyed (this round)

Source Pages reviewed Used for
dmweb.free.fr (Game Pages) 5 (DM, CSB, DM2, TQ, Nexus) per-game history, awards, ports, and DM overview version-comparison receipts
dmweb.free.fr (File formats) 3 (Data Files, Animations, Animation Script) IMG/IMG5/ANIMATE.SCR specs
dmweb.free.fr (Clones) 3 (CSBwin, SKWIN, Return to Chaos) clone source references
dmweb.free.fr (Custom dungeons) 1 (g_csb.html) 60+ custom dungeon index
dmweb.free.fr (FAQ) 1 index category map only — Drupal URLs 404
dmweb.free.fr (ReDMCSB) 0 — page not fetchable fallback to local ReDMCSB
dmweb.free.fr (Community documentation) 43 (mirrored locally at reference/dmweb-community-docs/) copy protection, file formats (animation script, animations, data files, dungeon files, DM2 data files, DM2 music triggers, hint/oracle, layout coordinates, portrait files, saved-game files), Nexus file formats (DGN, MNS, item.ibs), DM+CSB mechanics (actions, attacks, creature generators, items, skills, GRAPHICS.DAT hidden code + items 558–562), miscellaneous (Atari ST history, PC, SNES, FTL sound adapter, game versions)
greatstone (Tools) 5 (Overview, Product, Screenshots, Download, Tutorial) SCK extraction model, bundled signature/mapfile databases, tested corpus, file/item format inventory, CLI/GUI extraction commands, signed/compressed dungeon handling, mapfile override flow, external palette/string resources, animation viewing, Atari PAK/dungeon compression helpers, SCKExtraPack web-output scripts for dungeon, FTL, graphics.dat, single-file, and HTC outputs, screenshot-backed smoke references for GUI flows and representative CSB/DM/SNES/DM2 extracted db_data images, plus downloadable SCK/SCKExtraPack release provenance from 1.5.1@20110502.0 back to 0.5@20051123.0
greatstone (Technical doc) 4 (Mapfile, FTL, PAK, Items + IMG5) all critical format specs
greatstone (Games) 4 (DM, CSB, DM2, Custom) per-version file lists
greatstone (Articles) 3 (Mac QuickTime, SNES multi-palettes, dungeon XML/HTML) DM2 Macintosh MooV/resource-fork and QuickTime flattening workflow, SNES PALSEL/TILESBYITEM/PALSEL_INCR palette-selection mapfile metadata, and SCK dungeon.dat-to-XML/HTML comparison/export flow for DM/CSB with limited DM2 support
Firestaff existing docs FINAL_GAPS, FINAL_CSB_GAPS, PLATFORM_MATRIX, DMWEB_REFERENCE, csb_gap_.md, dm1_gap_.md per-game gap detail

Total new pages reviewed this session: 66 (23 prior + 43 from the dmweb community/documentation mirror).


J. Update cadence

This document should be regenerated after every milestone commit. Each major section (B-J) is regenerated from its per-domain source-of-truth:

Avoid duplicating content; this doc is an index, not a source.


K. Session delta — 2026-06-20 (post v2.9.1)

What changed in this session that affects the gap list above:

Data staging

New READY paths (in addition to canonical)

./build/firestaff --scan-data now finds alternative matching paths for four of the five games:

Game New matching path
DM1 dm1-extras/legacy-dos/DungeonMasterPC34/DATA/GRAPHICS.DAT
CSB csb-extras/legacy-amiga-dms/...Meynaf/DungeonMaster/Graphics.DAT (Amiga 3.3 French hack by Meynaf)
DM2 (unchanged; canonical dm2/ wins)
Nexus nexus-extras/saturn-ja/Dungeon Master Nexus (Japan) (Track 1).bin::DM.BIN
Theron theron-extras/japan/Dungeon Master - Theron's Quest (Japan) (Track 02).bin

Kanoniska hashar (VERIFIED_HASHES.md)

tools/asset-validate/compare_to_greatstone.py ~/.firestaff/data runs against all 12 registry entries: 148/148 OK, 0 FAIL (all files referenced in VERIFIED_HASHES.md are local and match their hashes; some map to the same file, hence 148 versus 12).

Documentation mirror

Bug fix: CLI –data-dir

Test coverage (smoke runs)

Effect on gap status

Marked above as EXTRACTED (new rows in C2, D3, E1, F1), previously BLOCKED-DATA. Four are marked EXTRACTED + VERIFIED because they now also match a canonical hash. Update 2026-06-21: Theron JP/US Track 02 is also launch-tested through tier1_strict_boot_probe.

Game Version Status
DM1 PC 3.4 (legacy-dos) EXTRACTED + VERIFIED + LAUNCH-TESTED; DMWeb PC page pins the USA EN and Europe EN/FR/GE 3.4 edition boundary plus VGA/EGA, PC ending, entrance music, and DOS input receipts
CSB Amiga 3.3 (Meynaf FR hack) EXTRACTED + VERIFIED
Nexus Saturn JA (Track 1) EXTRACTED + VERIFIED
Theron JP/US Track 02 EXTRACTED + VERIFIED + LAUNCH-TESTED

These can now be used as real-asset test sources in addition to existing canonical staging under dm1/, csb/, etc.


L. Follow-up — concrete next-session tasks

The list below contains prioritized small tasks directly following from the session deliverables. Each item takes less than one day and requires no new design.

L1. Verify that alternative READY paths boot

Status 2026-06-21: DONE for the Tier 1 path-discovery scope through tier1_strict_boot_probe (all present in-scope launch paths). CSB canonical and CSB Amiga 3.3 Meynaf FR now emit CSB READY; Nexus virtual-ISO launch remains a separate Tier 4 runtime/launcher gap.

The original Tier 1 #5 request: run against every EXTRACTED + VERIFIED path and confirm that M11 actually starts the game, not merely that the scanner finds hashes.

for spec in \
  "dm1   ~/.firestaff/data/dm1-extras/legacy-dos" \
  "csb   ~/.firestaff/data/csb-extras/legacy-amiga-dms" \
  "nexus ~/.firestaff/data/nexus-extras/saturn-ja" \
  "theron ~/.firestaff/data/theron-extras/japan"
do
  set -- $spec
  game=$1
  path=$2
  echo "=== $game @ $path ==="
  SDL_VIDEODRIVER=dummy ./build/firestaff --data-dir "$path" --game $game --duration 1000 2>&1 | tail -5
done

Expected: a Phase A probe PASS plus a game-specific asset-load PASS per path. If anything fails, move the gap status back to PARTIAL.

Result (2026-06-20): See reference/L1_data_path_verification_2026-06-20.md for details. Short version:

Path READY? Cause
DM1 legacy-dos ✅ Canonical GRAPHICS.DAT/DUNGEON.DAT in the directory — directly matches the hash
CSB Amiga 3.3 Meynaf FR ✅ Matches the canonical CSB hash in ...Meynaf/DungeonMaster/Graphics.DAT
Nexus Saturn JA ⚠️ MD5 matches (d8362321...) but the filename does not match the g_nexusArchiveNames scanner pattern (DM.BIN, SEGADATA.BIN, etc.) — found only in the default scan, not through --data-dir
Theron JP Track 02 ✅ MD5 matches (b7afb338...); on 2026-06-21 tier1_strict_boot_probe launch-tested JP canonical and JP extras to the TQR level-load milestone; theron_v1_runtime_screenshot_readiness and theron_24h_readiness provide metadata/hash receipts without presenting screenshots as evidence
DM1 PC 3.4 English 3.5” (extras) ⚠️ Contains .raw files (CTRaw emulator format) not mapped by the scanner

New status:

Tier 1 #6 is closed as NO-GAP (2026-06-20) — verified that the scanner matches by MD5 hash, not filename. --data-dir accepts source filenames directly. Tier 1 #6 was raised by the L1 report, but the actual scan behaviour supports READY for all four paths. No alias step is required. The Tier 1 #6 entry above is outdated and should be removed at the next watchdog refresh.

L2. Create tools/data-readiness-summary.py — FIXED 2026-06-22

Tier 1 #2 –summary mode. Prints a per-game table: game / required-files-present / found-in-canonical / found-in-extras / launch-tested. Takes input from compare_to_greatstone.py and a manifest reader.

Output (example):

dm1   2/2 present   2/2 canonical   1 extra (legacy-dos PC34)  NOT launch-tested
csb   2/2 present   2/2 canonical   1 extra (Amiga 3.3 Meynaf FR) NOT launch-tested
dm2   2/2 present   2/2 canonical   0 extras                       LAUNCH-TESTED
nexus 1/1 present   1/1 canonical   1 extra (Saturn JA Track 1)     NOT launch-tested
theron 1/1 present  1/1 canonical   JP+US extras Track 02           LAUNCH-TESTED

Wire it into CMakeLists and the ci: asset-hygiene job. Use it on every git push to quickly see whether anything blocks an M12 launch.

Status 2026-06-22 (commit a56d79c70, cherry-picked to main as 22a8caa3): Shipped at tools/asset-validate/data-readiness-summary.py (342 lines, executable). Combines three sources into one human + JSON table:

  1. firestaff --scan-data against a data root (~/.firestaff/data/ by default — covers canonical + extras).
  2. compare_to_greatstone.py SHA-256 hash-match summary against VERIFIED_HASHES.md.
  3. Optional --boot-probe (firestaff --game X --data-dir Y, ~8s per path) — opt-in only, since it’s slow.

Output: human-readable per-game table on stdout, JSON dump with --json, exit code 0 iff all 5 games canonical-READY, 1 otherwise. Verified running example captured in the commit message.

Remaining (out of L2 scope): not yet wired into CMakeLists or the ci: asset-hygiene job. --boot-probe mode is opt-in and unverified on a CI runner. A future pass should add a CMake target + CI step that runs --json and posts a status check on each push.

L3. Extend extract-game-archives.sh with a verification step

After extraction, run compare_to_greatstone.py for each extras directory and report a per-version summary. Log it in .extract-log.md and .extract-manifest.json. This lets future runs immediately show which versions match a canonical hash and which are reference material only.

L4. CSB Amiga 3.5 launch barrier

The extracted csb-extras/amiga-3.5-ctraw-en contains CTraw track and PACK records (.st/.raw/.err/.out). Firestaff currently validates the container framing and packed-payload CRCs, but does not decode PACK data or reconstruct game sectors. Renaming or repackaging .raw as .DAT/.DATA cannot produce playable assets. Keep this edition unavailable until a documented, bounded PACK decoder can recover and verify the required source data; then add an authentic startup test. Do not list Amiga 3.5 as launchable based on extraction alone.

L5. DM2 extras launch-test

Status 2026-06-21: DONE for PC extras. dm2_v1_boot_scan_assets now accepts the extracted DOS layout data/graphics.dat + data/dungeon.dat, and tier1_strict_boot_probe runs DM2 canonical plus dm2-extras/dos-en, dm2-extras/dos-fr, dm2-extras/pc-fr, and dm2-extras/pc-de through structured boot receipts. The earlier DM2 READY stderr marker was removed on 2026-08-06 because it is not source-owned UI. The remaining DM2 version work is in D3: demo and non-PC editions need separate classification and possibly container/format normalization before they can receive cross-version regression coverage.

L6. README-public-dokumentation-uppdatering

Per AGENTS.md, the README must be honest, user-facing, and sales-friendly, with real per-game status. After today’s gap-list updates, the README’s DM1/CSB/DM2/Nexus/Theron tables should reflect that four of five games have real-asset evidence in both canonical and extras staging.


M. Session delta — 2026-06-21 (post v3.0.0)

What changed in this session that affects the gap list above:

DM1 V1 original-capture gap close (pass1052-1058)

DM1 V1 gap cascade (pass1059-1070)

Tier 1 #5 strict boot-probe

Tier 2 #4 LZW Atari ST decoder DONE

Decoder code path test-covered (test_dm1_lzw_round_trip 96/96 PASS, pass852). DMWeb’s DM Atari ST edition page now documents the source-media/per-version split for the future real-asset handoff. Real Atari ST asset handoff still BLOCKED-DATA.

Tier 4 determinism probes (3 new)

Asset-status fix

required=1 for all required-files rows. matchAnyVersion now propagates matchedPath so the missing-files popup and report show where the runtime will load the asset from, while keeping launch_blocker honest.

DM1 V2 polish

The V22 in-place drawing pipeline still uses placeholder overlay; wiring m11_draw_dm1_* draw passes to consume real modern art in-place remains OPEN-LARGE in B3.

Documentation

Verification

Commits since v2.9.2

116 commits, summarized:

Migration to GitHub main

dm1v1-capture-gap-close-20260620 branch fast-forwarded into origin/main (52bce320 → cd24ea72, 67 commits). The branch is now redundant with main.


N. Session delta — 2026-06-23

Latest origin/main status that affects this gap list:


N+. Session delta — 2026-06-25 (greatstone db_data real-data regression)

O. Session delta — 2026-06-25 (DM2 original-overlay scaffold)

Bounded new evidence for the DM2 original-overlay OPEN-BOUNDED row; no parity claim.

P. Session delta — 2026-06-25 (data-dir picker / platform-matrix)

Latest status that affects the data-dir picker ↔ platform matrix contract: