Polish release — 17 commits since v2.3.0. No new emulation features; this is an infrastructure / triage / safety pass that was on develop between v2.3.0 (April 2026) and now. None of the long-standing audio or game-compatibility issues changed; the difference is that future bug reports about them have a real chance of being actionable. - **Runtime crash watchdog** — a new opt-out core option, `Crash Detect`, logs `gpu_pc_escape` / `dsp_pc_escape` / `gpu_wedge` / `dsp_wedge` / `video_stall` events to the RetroArch log when a game hangs or goes black. Bug reports about freezes can now be triaged from the log alone, without save states or replays. - **DSP wedge fix** — when the DSP PC escapes into unmapped memory, the inner exec loop now drains the timeslice instead of busy-looping for minutes. This was a v2.3.0 regression that made the headless test harness hang on Wolfenstein 3D for 12+ minutes per session. - **Audio presence test** (`test/test_audio_presence.c`) — counterpart to the existing clipping check. Catches the silencing-regression class where a "fix" drops a game's RMS to zero (clipping check passes silence as PASS). Iron Soldier 1 is the in-tree baseline (RMS ~1175 on develop). Both audio tests now run in `make test` and CLAUDE.md documents that audio / DSP changes must clear both before being declared done. - **Bug-report template** clarified — the BIOS-mode dropdown previously implied users needed to supply `jagboot.rom` in `system/`, which has never been the case for this libretro core (the BIOS is bundled in the dylib). The template now distinguishes the boot **path** users had selected, which is what bug triage actually cares about. - **DSP**: bail out of the exec loop when the DSP PC is in unmapped memory. Avoids a busy-loop that burned the entire timeslice emulating opcodes fetched from bus-default 0xFFFF. Wolf3D headless test now completes in <30 seconds, matching v2.2.0 wall-clock. - **`src/core/crash_detect.c`** — opt-out runtime watchdog. Once-per- frame hook with cheap PC-range checks and a 256-pixel rolling framebuffer hash; off-mode short-circuits at the first instruction. Modes: `enabled` (default) / `disabled` / `verbose` (heartbeat every 600 frames). - **`test/test_audio_presence.c`** — asserts the audio onset is reached and the window RMS lies in `[floor, ceiling]`, with no long zero runs. Per-ROM thresholds via CLI args. Wired into `make test` against Iron Soldier 1. - **`test/tools/test_video_dim_log.c`** — diagnostic harness that prints every video resolution change and black-frame streak. Useful for correlating "crash after N seconds" reports against actual hardware events. - Dependabot bumps for GitHub Actions (codecov-action 5→6, actions/cache 4→5, actions/labeler 5→6, actions/upload-artifact 4→7, cirrus-actions/rebase 1.4→1.8). - `test/tools/test_frame_timing` added to `.gitignore`. - **CLAUDE.md** — new "Runtime crash watchdog" and "Audio / DSP work — required tests" sections. Pins the rule that DSP/audio PRs must clear both `test_audio_clipping` AND `test_audio_presence`, with PR #170 cited as the precedent (clipping passed on a "fix" that silenced Iron Soldier 2). - **Bug-report template** — clarified HLE vs Real BIOS distinction. - **Doom**: runs at ~2x speed, music silent. Bus arbitration / cycle accuracy modeling not implemented; PR #169 (draft) is in design limbo. - **Wolfenstein 3D**: no audio. The dsp-diag tool shows the DSP PC drifting to $0006EE in main RAM around frame 48 (Bank1 registers never finish initializing); the runtime watchdog subsequently logs `dsp_pc_escape pc=$00FFF004E8` once the drift hits unmapped register space, and the new wedge bail-out (this release) prevents the headless harness from hanging on it. Long-standing — present in v2.2.0 too, not a v2.3.x regression. - **Skyhammer / Iron Soldier 2**: saturated square-wave audio in HLE (DSP engine state not fully replicated). Both tests deliberately flag these as `EXPECTED-FAIL` in the suite manifest until a real fix lands. - **Battle Sphere**: menu navigation issues. - **Jaguar CD**: PR #120 is rebased and builds, but multi-track CD games still break mid-game; not in this release. 18 files changed, +1,004 / -17 lines across 17 commits. Pre-built libretro cores for 16 platforms: - Linux: x86_64, aarch64, i686 - macOS: arm64, x86_64 - Windows: x86_64, i686 (MSYS2/MinGW) - iOS: arm64; tvOS: arm64 - Android: arm64-v8a, armeabi-v7a, x86_64, x86 - Web: Emscripten WASM - Consoles: PS Vita, Nintendo Switch Each binary has a matching `*-debug.tar.gz` with split debug symbols. SHA256 checksums in `SHA256SUMS.txt`. libretro/Provenance fork: Joseph Mattiello (@JoeMatt, Provenance-Emu). Thanks to @checktext00 for the bug-report template fix (#179).