# openQ4 0.6.5 Release Notes

## Highlights

- The single-player weapon wheel has a cleaner depth-of-field backdrop: blur is smoother and more circular, with less smearing or color bleed around the view weapon and nearby geometry.
- Runtime packaging is more robust: openQ4 PK4s now track `content/baseoq4/pak0/` and `content/baseoq4/pak1/` through generated source manifests, so removed generated content no longer leaves stale build dependencies.
- Release packaging is unblocked when Apple signing credentials are not configured. The release workflow keeps Windows/Linux artifacts mandatory, publishes signed/notarized experimental macOS DMGs when the Apple Developer ID and notary secrets are present, and otherwise publishes clearly labeled unsigned/unnotarized experimental macOS archives.
- The renderer does less repeated CPU work in GL, material, submit, and AAS-heavy paths by caching stable loop counts, stage metadata, material masks, and texture binding state.
- OpenGL rendering is more resilient to driver stalls, context recreation, and malformed GPU-driven work, while debug-context validation now exposes structured driver errors instead of allowing them to be hidden by the test harness.
- dhewm3-style BC7 texture packs now work through the complete `dds/` image-program naming convention, with direct validated mip uploads and reliable fallback to stock images.
- Windows windowed play defaults to a smoother borderless presentation path, reducing OpenGL swap stalls seen in BSE-heavy outdoor scenes such as Air Defense 1.
- Sound playback is closer to retail Quake 4, including attenuation, master volume, frequency-shift behavior, restart/reload diagnostics, and cinematic skip timing.
- OpenAL playback is steadier for streamed and combat-heavy scenes: stream chunks stay inside playable ranges, restart offsets are aligned to the retail/OpenAL block boundary, sample choice and loop starts follow retail diversity behavior, leadin-then-loop sounds now receive retail-style random-start diversity too, live `frequencyShift` changes keep resumed/restored voices, completion, leadin volume, and shake/amplitude sampling on the same playback clock, `no_dups` variants account for the outgoing channel before replacement, stopped channels release their hardware voices immediately, the mixer again uses retail-style volume/protected-voice ranking with a real extra sort candidate, silent channels no longer consume dense-scene voice slots, musical sound-class volume now follows the music controls, non-retail one-shot/loop/music priority boosts were removed, existing emitter channels are no longer evicted during sound admission, reused sources reset cleanly, failed starts release their voice slots, and invalid payloads fail closed.
- OpenAL audio has been restored to the end-of-day June 23 sound implementation after reliability reports on the newer OpenAL work. The temporary experimental voice controls have been removed instead of shipping as user-facing compatibility switches.
- Performance presets are fully wired through the System settings menu and console commands, with conservative memory telemetry handling, shared menu/console command validation, registry coverage, a validation self-test, low-power sound-shader sample caps, and corrected audio restoration when moving back from constrained profiles.
- Multiplayer joins now open on a Quake Live-like entry screen with server details and gametype-aware join choices, while the client waits as a spectator at the map intermission view when possible.
- The main menu now uses a fixed set of five single-player campaign backgrounds, precached from menu-owned assets, with subtle pan/zoom motion and static edge fading instead of random loadscreen expansion tiles.
- Experimental macOS push verification builds are healthy again after replacing raw C string compares in process handoff and environment filtering with openQ4's guarded string comparison API.

## Upgrade Notes

- This release publishes Windows x64, Windows ARM64, Linux x64, Linux ARM64, and experimental macOS ARM64 packages, including Windows installers, Linux debug-symbol archives, and separate macOS dSYM symbol archives for crash symbolication.
- Release packages now use optimized binaries on Windows, Linux, and experimental macOS while keeping Windows PDBs and Linux debug-symbol archives available for crash reports.
- If Apple signing and notarization secrets are not configured, the experimental macOS OpenGL and Metal bridge downloads are named `-unsigned.tar.gz`, are ad-hoc signed only for bundle validity, and may require normal Gatekeeper approval on first launch. Credentialed release runs publish signed/notarized DMGs instead.
- Set `ui_autoJoin 1` before connecting if you prefer the previous multiplayer behavior that immediately enters the match instead of showing the join screen.
- OpenAL now uses the June 23 sound implementation directly. Remove any local experimental audio overrides from launch configs; they are no longer supported settings.
- Replace an existing openQ4 package with the matching new archive or installer, keeping your retail Quake 4 `q4base/` assets separate from openQ4's `baseoq4/` runtime files.
- Put texture-pack DDS files under `baseoq4/dds/` using their dhewm3 paths, then set `image_usePrecompressedTextures 2` for BC7-only replacement. See the [DDS Texture Replacements guide](../../user/texture-replacements.md) for compatibility paths and diagnostics.

## Experimental macOS Limitations

- macOS packages remain experimental Apple Silicon/arm64-only downloads. Intel Mac, universal2, and Rosetta release targets are not supported by this release line.
- The macOS Metal download is a Metal bridge around the OpenGL renderer, not a native Metal renderer. The legacy `platform_backend=native` Cocoa/OpenGL path is comparison-only diagnostic infrastructure, not a release backend.
- [GitHub issue #73](https://github.com/themuffinator/openQ4/issues/73) tracks launch-time `SIGSEGV` reports on some M4/M5 Apple Silicon systems in the Apple OpenGL 2.1/ARB2 startup corridor. Keep macOS support claims experimental until the issue is closed or the limitation is carried forward with matching signoff evidence in `docs/dev/macos-signoff-evidence.md`. If you hit this path, attach full terminal output as text, `openq4.log`, any matching `.ips` crash report, and the archive from `collect_macos_support_info.sh`; see [Experimental macOS Support Data](../../user/macos-support-data.md).
- Crash logs now include the `last renderer startup phase`, and normal logs include ordered renderer startup breadcrumbs through `first ARB2 interaction handoff`, `ARB2 interaction driver bypass`, `ARB2 interaction bypass state restored`, `ARB2 interaction bypass light scale skipped`, `ARB2 interaction bypass ambient rescue`, and `ARB2 interaction bypass frame tail` so issue #73 reports can identify the last ARB2/upload or first-frame transition reached before a crash. Older 0.6.92 test logs may show `ARB2 interaction bypass light scale` before this skip was added.
- Apple OpenGL 2.1 compatibility detection now uses normalized vendor/version and selected context facts for M4/M5/Tahoe-style reports, forces the CPU-backed vertex cache plus `SimpleInteraction.vfp`, bypasses ARB2 light interaction drawing on the unstable compatibility path, restores the classic post-interaction GL state, texture-unit state, and ARB program bindings before later frame passes, forces a neutral light-scale state, skips the post-interaction light-scale fullscreen pass on that degraded path, and fails closed with `Unsupported Apple OpenGL 2.1 compatibility path` if that required fallback shader pair cannot load. The bypass is a degraded-lighting fallback, not a full native macOS renderer fix.
- macOS packages include `SYMBOLS.txt`, and release assets include matching `openq4-<version>-macos-arm64-<bridge>-symbols.tar.xz` dSYM archives. Attach `SYMBOLS.txt` or the support collector archive with any `.ips` report so maintainers can choose the right symbols without asking you to rerun the crash.
- Moving only `openQ4.app` away from the package root now fails with a localized macOS startup error that names the adjacent-root contract, and support archives include `package/path-resolution.txt` with package/app paths plus copied `fs_basepath`, `fs_cdpath`, and `fs_savepath` log lines when available.
- Renamed `.app` bundles still use the same adjacent package-root startup diagnostic when launched from a standard `*.app/Contents/MacOS` layout. Release packages remain named `openQ4.app`.
- Support archives now include `package/build-metadata.txt` with package/app `VERSION.txt` metadata, including openQ4 and `openQ4-game` commits when present, so maintainers can match a crash report to the exact engine and GameLibs source inputs.
- Support archives now include `system/rosetta.txt`, `logs/renderer-summary.txt`, `package/binary-architecture.txt`, `package/dylib-dependencies.txt`, `package/signing.txt`, and `package/quarantine.txt` so issue #73-style reports preserve translated-process state, renderer breadcrumbs, Mach-O architecture/dependency facts, `codesign`/Gatekeeper/stapler diagnostics, and quarantine presence without launching openQ4. The collector also copies recent app, loose-client, and loose-dedicated-server DiagnosticReports when macOS writes them, rejects symlinked or missing package roots, skips symlinked package/log/crash-report inputs instead of following their targets, skips DiagnosticReports names that are not archive-safe, records notes instead of aborting when `HOME` is missing, and it inspects any loose `x64` or `x86` executable names that are present without treating those paths as supported release targets.
- macOS package-root startup errors are more specific when a package is incomplete: the dialog/log text now includes the expected runtime architecture, names missing or non-executable files, and lists obvious stale x64/x86 or wrong-platform game-module files found beside the app.
- Experimental macOS packages remain on the Apple OpenAL framework. OpenAL Soft remains a migration-only build path for local Mac experiments until package layout, install names, signing, license, and notarization allowlists are deliberately added; support archives now include `logs/openal-summary.txt` with OpenAL vendor, renderer, device, and EFX lines copied from existing logs when available.
- Maintainers without Mac access can now run the `macos-static` validation profile to check static macOS policy, synthetic Apple GL 2.1 behavior, synthetic macOS package/archive fixtures, and release-matrix dry-runs without claiming macOS runtime coverage.

## Change Log

- Render targets now reject stale context-generation handles without querying recycled GL names, cache successful cubemap-face completeness checks, and avoid framebuffer-validation calls in their bind path. Texture binding selects core DSA, EXT DSA, or compatibility entry points safely; the state cache handles VAO-owned element buffers and target-aware texture groups; upload streams scan for idle ring slots and record bounded-wait fallback telemetry; debug contexts install a queued KHR/ARB callback; and GPU-driven draw, bucket, and indirect-command indices are range checked with validation counters.
- Renderer validation now forces GL error reporting, scans log/stdout/stderr together for driver and framebuffer failures, and treats an explicit failed gameplay benchmark threshold as a failed case.
- Weapon-wheel depth of field now scales its blur footprint per pixel and rejects samples across strong depth edges, replacing the previous sparse cross-shaped blur pattern.
- DDS replacement loading now derives canonical paths from full image programs, validates DX10/FourCC layouts with header-only probes, uploads supported DXT/BC7 mip chains directly, honors downsize and unmipped policies, rejects stale or malformed replacements safely, and exposes opt-in selection logs plus a focused self-test.
- Release workflow now builds a credential-aware package matrix, always keeps experimental macOS ARM64 OpenGL/Metal packages in the release, and verifies the expected signed DMG or unsigned archive names for the credential state that actually ran.
- macOS release packaging now keeps dSYM bundles out of runtime packages and publishes separate bridge-specific symbol archives with a runtime `SYMBOLS.txt` manifest for crash reports.
- macOS app bundles now include localized `OpenQ4PackageRoot.strings` resources, package validation requires them, and the support collector writes `package/path-resolution.txt` without launching the app.
- macOS app-bundle launches now reject symlinked adjacent runtime entries with a clear package-root diagnostic, matching the symlink-free package validation policy.
- macOS app-bundle detection now recognizes renamed `.app` bundles in the standard `*.app/Contents/MacOS` layout, while release packaging and archive validation remain pinned to `openQ4.app`.
- macOS `openQ4.app` startup preflight now expects `game-sp_<arch>.dylib` and `game-mp_<arch>.dylib` under `baseoq4/`, matching release packages, instead of incorrectly requiring those modules to be copied into retail `q4base/`.
- macOS Apple GL 2.1 first-frame hardening now restores client-array, texture-unit, ARB program, stencil, and state-cache baseline when ARB2 light interactions are bypassed, records post-bypass breadcrumbs after a July 5 issue #73 report showed 0.6.91 reaching `ARB2 interaction driver bypass`, and skips the post-interaction light-scale pass after a July 6 0.6.92 report reached `ARB2 interaction bypass light scale` before crashing.
- macOS support collection now writes `system/rosetta.txt`, `logs/renderer-summary.txt`, `package/binary-architecture.txt`, `package/dylib-dependencies.txt`, `package/signing.txt`, and `package/quarantine.txt` without launching the app, making Rosetta/translation, startup, architecture/dependency, Gatekeeper/stapling, quarantine, and accidental extra-architecture package reports easier to diagnose remotely.
- macOS support tooling now avoids GNU-only `dirname --`, suppresses AppleDouble sidecars in support archives, writes private non-overwriting support archives through a temporary tarball, bounds copied package/log and DiagnosticReports text, stream-limits command/report output before redaction, sanitizes embedded control characters in copied public text, rejects unsafe package-root and support archive output targets, skips symlinked package/log/crash-report evidence inputs, constrains copied DiagnosticReports names to archive-safe characters, and includes the detected runtime architecture token in package path reports.
- The macOS support collector now tolerates launch environments without `HOME`: home-scoped logs and DiagnosticReports are skipped with archive notes while package-local logs are still inspected.
- macOS Apple-host guest scripts now accept `OPENQ4_GUEST_HOME` as an explicit home-directory override when `HOME` is absent, and the host workflow exposes it as `-MacHome /Users/<name>`; the path is validated before using `~/openq4-work`, Meson shims, or Desktop launcher targets, and wrong-host Darwin checks stay ahead of workspace creation.
- macOS staged-package validation now requires `collect_macos_support_info.sh` to be installed beside the app and loose binaries, executable, UTF-8/LF-only, size-bounded, still carrying the privacy/no-launch markers and bounded truncation fallback, and free of known environment-dump, launch-redirection, or xattr-value dump patterns before staged installs, signed/notarized DMG source trees, runtime archives, Apple-host signoff runs, or manual release packages are accepted.
- macOS staged-package validation now rejects symlinked `.install` roots, symlinked `baseoq4/` game roots, and symlinked payload entries before parsing the support collector, matching the stricter release/archive policy for real files and directories.
- Oversized macOS support logs and crash reports now stay bounded even if truncation fails, preventing an accidental full-file copy in that rare failure path.
- macOS release packaging now reports malformed support-collector collateral as a clean package error instead of a Python traceback.
- The macOS support collector now creates its output tarball through `mktemp` in the requested output directory and rejects package/output paths containing control characters before writing a support archive.
- The macOS support collector now routes direct diagnostic command output and generated package/log/signing/quarantine report sections through `mktemp`-backed redacted/truncated copy paths like logs and crash reports, validates the generated tarball before publishing it, rejects empty or oversized compressed support archives, and exposes the final archive through a same-directory hard link from the private temporary tarball so a target that appears during collection is not replaced.
- macOS local `.install` validation and package validation now reject stale root engine binaries such as extra `openQ4-client_*` or `openQ4-ded_*` files for another architecture, and manual release staging also rejects stale `.dylib` game modules before publication.
- macOS package archive validation now rejects missing or symlinked archive inputs, unknown archive formats, mismatched `.tar.gz`/`.tar.xz` compression, malformed or corrupt zip inputs, unsafe zip member modes, self-including release/DMG output paths, and control-character member names in tar/zip artifacts before publication, matching the stricter signoff-archive path policy.
- macOS package archives now reject excessive member counts and total expanded payload sizes before publication, and macOS dSYM symbol archives reject symlinked archive inputs, mislabeled non-xz tar data, excessive member counts, excessive total expanded size, oversized `SYMBOLS.txt` metadata, Finder/AppleDouble sidecars, and duplicate or case-conflicting members before publication.
- macOS `SYMBOLS.txt` manifests are checked more precisely before symbol archives are published: duplicate or unknown header keys, mismatched package suffixes, wrong runtime/symbol archive names, missing or unexpected binary rows, invalid hashes/sizes/Mach-O UUID architecture lines, and wrong dSYM mappings now fail validation instead of relying on loose token matching.
- macOS runtime package validation now requires `SYMBOLS.txt` to name the exact runtime archive being validated, rejects path-like runtime or symbol archive names in manifests, and rejects renamed signoff evidence archives whose filename no longer matches the run ID.
- macOS signoff evidence recording now validates recorded package artifact names before updating the evidence index, rejecting path-like names, case-insensitive duplicates, non-macOS-arm64 artifact names, typoed bridge variants, unrequested bridge artifacts, and bridge-incomplete artifact lists.
- macOS signoff evidence recording now rejects symlinked archive inputs before validation and symlinked evidence-index inputs before update.
- macOS signoff evidence recording now rejects control characters in release metadata and validated signoff report/log text, and reports malformed signoff tarballs as clean recorder errors instead of tracebacks.
- macOS signoff evidence recording now parses reports through the same bounded text reader as the archive validator and updates the evidence index through an atomic temporary-file replace, reducing the risk of unchecked or partially written release evidence.
- macOS signoff archive validation now caps tar member path and path-segment lengths before report/log parsing, so malformed copy-back archives with oversized path metadata fail with clear validation errors.
- macOS dSYM symbol packaging now rejects unsafe staging paths before external symbol tools run: stale staging roots must be real directories, dSYM outputs cannot be stale symlinks or files, and symbol tarballs cannot be written inside the staging tree they are archiving.
- macOS VM source/GameLibs transfers and Quake 4 asset installation now inspect tar members with structured metadata before extraction, catching malformed member paths, control characters, duplicate members, case-insensitive member collisions, macOS metadata/debug sidecars, symlinks, hardlinks, and special files before `tar -xf` runs.
- macOS VM transfer extraction now uses `COPYFILE_DISABLE=1` on remote tar listing and extraction paths so AppleDouble sidecars are not generated while syncing source, GameLibs, or retail asset payloads to the Apple host.
- macOS VM workflow inputs now reject asset basepaths inside reserved workflow workspace children (`openQ4/`, `openQ4-game/`, `incoming-quake4/`, and `results/`) on both the host preflight and guest scripts, preventing `rsync --delete` asset installation from overwriting synced source trees, scratch extraction data, or collected signoff evidence.
- macOS direct guest scripts now reject control characters in `OPENQ4_GUEST_HOME`/`HOME`, expanded workspace and asset-root paths, and the incoming Quake 4 asset tar path before creating directories, logs, launchers, or extracting archives.
- macOS host workflow remote archive expansion and result collection now reject a control-character remote `HOME` fallback before expanding `~` or creating copy-back archives, matching explicit `-MacHome` path hygiene.
- macOS host workflow reserved-directory preflight now resolves `~/` through `-MacHome` for mixed-form `-MacWorkspace`/`-MacBasePath` checks and trims trailing workspace slashes before appending source-sync child directories.
- macOS signoff result copy-back now downloads remote archives into a same-directory temporary file, rejects empty transfers, and publishes without overwriting an existing archive for the same run ID.
- macOS Apple-host result archiving now writes the remote copy-back tarball to a temporary file, rejects empty or unlistable tar output, and hard-links the validated archive into the final remote name without replacing an existing target.
- macOS guest result directories now fail closed if the selected `<run-id>-<action>-<bridge>` directory already contains files before logging starts, preventing stale logs or renderer evidence from being blended into a rerun.
- macOS signoff archive validation now rejects excessive total expanded evidence size, special-mode members, group/world-writable evidence members, and overlong run/action identifiers before collected Apple-host evidence can satisfy the release evidence gate.
- macOS signoff result collection now requires `renderer-mp-smoke` file evidence on the Apple host before creating the copy-back archive, matching the local signoff archive validator's multiplayer evidence requirement.
- The `macos-static` profile now syntax-checks the Apple-host guest bootstrap, asset-install, and build/signoff scripts, while the host/guest workflow keeps Mac Meson build output under `builddir*` or `.tmp/`.
- macOS OpenAL provider policy now keeps release builds on the Apple OpenAL framework, keeps `macos_openal_provider=system` migration-only for OpenAL Soft experiments, and adds `logs/openal-summary.txt` plus issue-template fields for OpenAL vendor, renderer, device, and EFX diagnostics.
- macOS native-backend containment now has static validation: Carbon and NSOpenGL stay confined to the comparison path, SDL3 Darwin sources and framework linkage stay Carbon-free, and native Metal remains blocked until a separate renderer design plan exists.
- Experimental macOS GameLibs alignment now has static validation across `openQ4` and `openQ4-game`: arm64 `.dylib` names, `@loader_path` install names, concrete macOS architecture build strings, package/support provenance for openQ4 and `openQ4-game` commits, and ARM64-sensitive allocation, savegame serialization, pointer-width, and alignment-sensitive allocation assumptions are guarded without requiring macOS runtime testing.
- The macOS no-runtime validation track is now explicit: `validate_macos_static.ps1`, `validate_macos_static.sh`, and `python tools/validation/openq4_validate.py macos-static` run static/policy tests, synthetic Apple GL 2.1 checks, synthetic macOS package/archive fixtures, shell syntax checks, and push/PR dry-runs, while optional renderer self-test binaries are limited to non-macOS hosts.
- Windows release builds now use the same optimized diagnostics profile as Linux and experimental macOS instead of debug binaries, with runtime asserts disabled for packaged performance.
- Windows video-memory detection now uses DXGI with a conservative fallback, so performance auto-detect no longer sees a bogus 100 TB VRAM value on fresh Windows runs.
- Runtime PK4 dependency tracking now follows generated source manifests instead of stale explicit file references.
- Main menu background rotation now uses five fixed single-player campaign images, precaches them during menu setup, and fades the moving center image edges with a static mask instead of relying on separate expansion images.
- Runtime logs now begin with the openQ4 product name and version before the log-open timestamp.
- Air Defense 1 generated light-grid outputs were removed from source content without breaking local or CI packaging.
- Multiplayer clients now default to a spectator join state, use an intermission camera or spawn fallback for the initial view, and show a Q4-asset join screen with server info plus DM/team/tourney-appropriate join controls.
- Renderer hot paths cache stable counts and material state across GL, material, submit, and AAS loops.
- BSE culling, debris precache, and borderless-window defaults reduce outdoor frame pacing problems.
- System settings post-effects rows no longer overlap in compact display layouts, so Renderer Fallback and HDR Tonemap remain readable and selectable from the menu.
- Sound attenuation, pitch, diagnostics, reload behavior, and cinematic skip audio aging were aligned more closely with retail behavior.
- OpenAL queued streams now keep available buffers refilled and drain processed buffers after one-shot streams finish, trim queued chunks to each sample's playable range, convert sound times to sample offsets with bounded 64-bit math, align restart offsets to the retail/OpenAL block boundary, keep leadin-to-loop handoff inside playable ranges, restore retail diversity mapping for sample choice and deterministic loop starts, apply looping random-start diversity to leadin-then-loop sounds too, accumulate and save/restore retail-style shifted playback time for live `frequencyShift` changes so resumed voices, completion, leadin volume, and shake/amplitude sampling stay on the same clock, make `no_dups` sample selection see the outgoing channel before channel replacement, release stopped channels and their hardware voices immediately, restore retail-style mixer ranking based on audible volume plus protected voice/dialogue channels, skip inaudible channels before they can compete for dense-scene voice slots, remove the non-retail one-shot/loop/music priority boosts that could reorder busy combat scenes, stop evicting existing emitter channels during sound admission, preserve a real extra mixer candidate while keeping the full configured voice budget, apply music volume/mute handling to the retail musical sound class as well as flagged music samples, reset reused OpenAL sources to a neutral silent mix state before new playback, wet/dry routing clears backend errors locally, keep paused or queued voices busy until playable buffers are drained, release failed starts or backend queue/update failures immediately instead of holding silent mixer slots, fail closed on unplayable payloads, and keep invalid mix gain/filter/fraction/slow-motion/pitch values clamped before reaching OpenAL.
- `testSound` is more useful for audio validation in scripted or unfocused launches: it can recover an allocated sound world for explicit diagnostic playback and pump the sound system immediately instead of only reporting that no world was active.
- `listSoundDecoders` now reports active OpenAL-backed channels from every allocated sound world and labels current versus inactive worlds, making fallback-world and scripted audio validation easier to read.
- Sound restarts and sample reload cleanup now tolerate sparse world, emitter, or channel lists while audio worlds are being rebuilt or torn down.
- Runtime `s_noSound` changes now detach active hardware voices, stop controller rumble, keep sound time fresh while audio rendering is disabled, and restart the sound backend when audio is re-enabled.
- Sound restarts no longer recreate queued-stream buffer pools while audio is disabled or after OpenAL fails to reinitialize, log when stream/sample reload work is skipped, and avoid a redundant second restart after manually re-enabling audio.
- Sound sample diagnostics, lookup, level-load cleanup, and sample-free voice cleanup now tolerate missing sample-table entries without silencing unrelated one-shot sounds.
- Game/menu sound-world switches now release the outgoing world's OpenAL voices immediately, so inactive worlds do not keep silent sources or occupy voice slots after a transition.
- Optional engine-side sound-world helper calls now no-op safely when the game or menu sound world is absent, while save/load sound-world operations still fail loudly instead of silently skipping data.
- Sound-world teardown, direct diagnostic playback, stop-all, reload, and pause/resume paths are more tolerant during map transitions and scripted audio probes.
- Sound emitters now clean up stale channel slots more consistently, so playback, stop/fade/modify commands, amplitude checks, and currently-playing queries are less fragile during audio reloads and map transitions.
- The sound-world mixer is more tolerant of sparse emitter/channel slots and cushion-fade cvar edge cases, improving stability in dense audio scenes and debug voice reporting.
- Sound save/load and demo cache handling now avoids malformed audio channel records and treats missing restored shaders as completed muted audio instead of invalid live channel state.
- Sound demo recording and playback now reject truncated fields, empty cached/start shader names, bad emitter indices, and unknown audio opcodes more clearly, tolerate null recording targets, write sound-start commands only after live channel creation succeeds, and allow valid local-emitter playback commands at index `0` without writing local-emitter allocation/free records.
- The post-June OpenAL voice, streaming, diagnostics, and source-lifecycle experiments have been removed from this release line. Audio behavior now matches the June 23 baseline while the newer work is reconsidered outside the shipped runtime.
- `applyPerformancePreset`, `autoDetectPerformancePreset`, the System-menu bridge, the settings registry, and `performancePresetSelfTest` now keep preset selection, auto-detection, command arguments, cvar effects, preset progression, localized choice labels, restart guidance, cvar state restoration, and release validation in sync.
