GetVibrationDeviceHandles used routed haptics availability to decide whether handles existed. Games that cache this answer at startup could retain an empty answer after a controller connected. Return handles for a connected npad style when rumble is enabled and an output sink is installed; check routed outputs when values are sent, keeping the existing permission and lifecycle behavior. Include the PR's rumble diagnostics, count unroutable values individually in mixed batches, and protect aggregate counters across game threads. Correct the code comment to describe Unicorn Overlord's observed empty handles and zero values without claiming restored physical rumble. Add regressions for cached startup handles delivering a nonzero value after routing, diagnostic totals and concurrent sends. Include HID in the existing ThreadSanitizer target and record the mechanism in the service reference. Checked with GAME=010069401ADB8000: full host suite, 73 HID checks, audio and HID ThreadSanitizer checks, docs checks, Mac host build, and iOS compilation (133 files). Physical rumble and iOS runtime remain untested. Broader tool validation is incomplete because Capstone is missing and iconutil failed. Co-authored-by: parsifal295 <130349765+parsifal295@users.noreply.github.com>
Subsystem references
How the host meets each part of a Switch game, and every failure met so far, one entry per mechanism: symptom, cause, fix (file and function), the games it was found on (linked to their notes in dm/games/<id>/README.md). Start from the symptom index when you have a log line or a visible result; the workflows that lead here are in docs/agents.
| File | Covers |
|---|---|
| rewriter.md | The NSO rewriter patch_nso.py: jump tables, exclusive windows, patch area reach, cuts and observation gates, functions without unwind entries, stack and system registers, relocations |
| memory.md | Guest layout, heap and application pool, virtual address memory and the alias region (the SDK's node area), engine allocators, mapping SVCs, running out of memory |
| threads.md | Thread creation and cores, address arbitration, yields and spin waits, events |
| services.md | SDK calls and system services: sm connections, names that changed between SDKs, file system and saves, add-on content, input, keyboard and applets, display and operation mode, accounts and network, settings and fonts, C library and time, modules |
| movies.md | The SDK's movie library: decoder lifecycle, output slots, native-texture output, demuxers and codecs, game movie players |
| audio.md | The audio renderer and its command lists by SDK, AudioOut and devices, codecs, timing |
| frame-rate.md | The host's frame step, engine frame limiters, present intervals and display rates, CPU cost |
| nvn-objects.md | NVN object sizes, memory pools, command memory, queues and syncs, CPU-written textures, NVN entry points |
| rendering.md | The replay on Metal: textures, passes and clears, blend / depth / stencil, vertex input, uniforms and ordering, conditional rendering; the Vulkan and OpenGL layers |
| shaders.md | Shader containers by engine, control sections and code, translation, bindings and handles, shaders compiled at run time, pipelines and caches |
| game-state.md | Saves, scripted state, and game behaviour that looks like a host bug but is not |
A new general finding goes into the file and section it belongs to, in the same form, with a line in the symptom index; a fact about one game goes into that game's note.