Symptom index¶
Look up what you see, find the known cause and fix. Format: one row per symptom: Symptom, Cause, Fix, Found on (title or area, change note).
Add a row when you find a new one (newest at the bottom of its section). Per-subsystem entry points are in reference.md; per-title status is in titles/.
tools/check_docs.py checks that every link and anchor in these files resolves.
Boot, crashes, hangs¶
| Symptom | Cause | Fix | Found on |
|---|---|---|---|
Boot thread spins at 25 M WaitSynchronization(handle 0, timeout 0) -> 0xe401 per second, nothing renders |
IApplicationFunctions cmd 210 was a guessed CreateMovieMaker returning an object; the real reply carries a copy handle to an event, so the guest kept handle 0 |
cmd 210 returns a copy handle to a never-signalled event (runtime/src/services/applet.c). Proof: NAPPLE_TRACE_IPC=all shows the spin right after ICommonStateGetter::GetOperationMode |
Animal Crossing, ac-boot-spin |
Abort "request on handle 0" in nn::vi::Initialize (sdk+0x447b30), Break at sdk+0xc80730 |
TIPC sm refusal reply (services outside the NPDM list: vi:m, vi:s, pctl:*) was header plus result only; the SDK reads move handle and result at the success positions, found the request bytes there, and treated the service as available |
sm_tipc_error_layout() in runtime/src/ipc.c puts a move handle 0 into the error reply. Test: runtime/tests/test_ipc.c |
Animal Crossing 3.0.x, guest-handle |
| ACNH 3.0.3 boots but draws 0 frames, thread sits in sdk+0x5087xx | The SDK's Npad lifo reader retries forever on an odd outer sampling number; our HID writer produced 0,1,2,3... Real HID outer numbers are even | input/src/hid_shm.c: outer = 2n, inner = n (input/tests/test_hid.c expects it). Check with NAPPLE_PCPROF=1 |
Animal Crossing 3.0.3, ac-render (integrator file claude-ac-render-2026-10-25-titles) |
CRASH signal=11 fault=0x38 right after the pl:u opens, intermittent ("unreproducible boot crash") |
Save root without system/fonts: the guest got zero-size shared fonts |
pl.c serves a built-in placeholder TrueType font when no real font is found (prints one actionable line). Install real fonts into <save-root>/system/fonts for text |
LAS, SMO, fonts-fallback, verify-media-dlc |
MK8D 1.0 (AArch32) faults at main+0x562d00 / 0x822994 (this = NULL + 0x3e74) around frame 175 |
Mii default CharInfo did not have a UUID v4 create id, so CharInfoAccessor::IsValid failed, MK8D never built its Mii head-model singleton and a worker thread dereferenced it |
Default Miis are UUID v4 (services/mii_core.c, commit 76249e5); tests/test_svc_mii.c follows |
MK8D, mk8d-recompiler branch note 2026-10-25-mk8d-recompiler |
MK8D AArch32 interpreter crashes in SharedMemoryImplByHorizon::Map |
Main thread stack (0x20000000) lay in a Free gap; the SDK's address-space scan put the pl:u shared fonts (0x1100000 bytes at 0x1fe04000) over it |
Reserve the main stack for QueryMemory (runtime/src/a32/a32_proc.c) |
MK8D 1.0, mk8d-64 branch note 2026-10-26-claude-mk8d-64-2026-10-25-titles |
| AC v0 SIGSEGV about one run in three | Command-buffer recording lists were touched by several threads without one lock; finalized or null command buffers dereferenced | Recording lists under one lock, null/finalized buffers tolerated (gfx/src/api_cmd.c); 0 crashes in 9 runs |
Animal Crossing v0, ac-render |
AC shows the real date as 1970 / boot waits on olsc / prepo |
The game's clock read epoch 0; olsc:u cmd 13 must succeed; prepo:u 10104/10105 must succeed |
AdjustableUserSystemClock override in services/time.c, called from main.c; the olsc and prepo handlers |
Animal Crossing 3.0.3, ac-render |
nvnProgramSetShaders with a tiny pool-relative address (0xe00) crashes |
The game passes code offset 0xe00 once | Reject pool-relative shader addresses instead of dereferencing (gfx/src/api_program.c) |
Animal Crossing, ac-render |
TextureInitialize: storage out of range (pool .. off .. size ..) |
CUBEMAP_ARRAY layout used depth = layers, but the game's depth is layers x 6 faces; pool allocated for fewer | Cube-array depth = layer-faces (gfx/src/tex/napple_layout.c and the one line in mtl_tex.m). MK8D still logs a similar one for another texture |
Animal Crossing; MK8D open |
| iOS Simulator: abort in gfx for 48 bytes of colour attachment | The Simulator allows 32 bytes per pixel of render-target storage; MK8D's G-buffer pass needs 48 | Open: needs a gfx fallback (split the pass or drop attachments) | MK8D on iOS Simulator, ios |
| LAS aborts in the movie library on iOS | Needs more than the 3.25 GiB device heap cap; the Simulator uses 4 GiB | Open (decision: trim the low gap or require the increased-memory entitlement) | LAS on iOS, ios |
| Depth textures crash on iOS | Depth textures must not be Shared storage on iOS | gfx/src/mtl_tex.m uses Private on iOS |
iOS Simulator, ios-sim branch |
Rendering¶
| Symptom | Cause | Fix | Found on |
|---|---|---|---|
| ACNH presents a black image although frames are drawn | The final pass into the window texture was culled or mis-rendered (winding for the upper-left origin), later a never-sampled composite not copied into the window | Stopgap mtl_frame_present_pick presents the composite target (disable with NAPPLE_NO_ORPHAN=1); root cause (no op copies the composite into the window, pool slot 1634) open. ACNH shows its game with it |
Animal Crossing 3.0.3, ac-render |
| SMO exploded geometry (huge slabs/wedges), parrot after ~2 min idle, shattered cap brim and white ribbons on the title menu | The command-list graveyard released recordings idle for > 30 s (GRAVE_IDLE_S); the game calls those handles again, CallCommands: stale or invalid command handle ... ignored, so display lists run without their state |
Recordings are kept until a byte budget (NAPPLE_REC_BUDGET_MB, default 1024) instead of idle time (gfx/src/api_cmd.c, ac-render). Proof: A/B at 215 s with GRAVE_IDLE_S 30 vs unlimited, see the nx-shader branch note 2026-10-25-nx-shader |
SMO, nx-shader |
CallCommands: stale or invalid command handle 65 k+ per minute |
MK8D creates about 4000 lists/s and never finalizes them; the recording budget is exceeded | Open (needs a smarter keep-alive: do not release unfinalized handles the game can still call) | MK8D |
| SMO half-scale duplicate view in the top-left ~53 % of the frame | With render scale on, a pass mixed attachments: colour 0 is a 2D array (never scaled) next to scaled siblings and depth; Metal renders only the overlap | pass_unify_scale (mtl_replay.m) and mtl_tex_force_scale (mtl_tex.m) lift unscaled same-size attachments. Find similar with NAPPLE_SCALE_DIAG=1 |
SMO, perf-las-live |
| Skinned draw reads garbage bones / neighbouring memory | Register-indexed constant-buffer reads past the bound size read the ring memory; hardware returns 0 | cbr(cb, size, off) with the sizes table at [[buffer(30)]], translator version 7 (gfx/src/shader) |
SMO |
Comparison a != b true for NaN, wrong branch in translated shaders |
Maxwell's ordered NE is false when either operand is NaN; MSL != is true |
Emit (a < b) \|\| (a > b) for FSETP/FSET/FCMP NE; fmin/fmax as precise::. NAPPLE_GFX_MATH=safe\|relaxed\|fast |
nx-shader (G13), t_xlate |
| Shader build fails "unknown instruction 3b34056060470100" | VMNMX (video min/max) not translated |
Implemented in full in the translator (maxwell_translate.c) |
AC v0 fragment 23e43e94e45bb1d5 |
| Stutter of 170-1300 ms when entering a new area | Pipelines and shaders built synchronously on first use (mtl_pipe_get) |
Persisted keys (pipelines.bin) survive translator bumps, seed manifests (NAPPLE_GFX_PIPE_SEED), key normalisation; opt-in speculation NAPPLE_GFX_SPECULATE=1. A warm second visit is smooth |
LAS, SMO, perf-las-live, nx-shader |
RSS 2-3.4 GB growing, Malloc Small 2 GB |
Command-list graveyard released at most 256 recordings per second | Release everything idle each pass (api_cmd.c); watch cmdrecs live in NAPPLE_PERF_LOG=1 |
LAS, perf-las-live |
| MK8D stops at about 45 fps headless | Guest blocked in SyncWait ~21 ms per present, per-submit commit to complete ~21 ms, present GPU time <= 8 ms, replay CPU 0.7 ms: gfx-bound (LAS runs 58 fps) | Open. Headless pacing as a timer in mtl_present.m gave 46 to 60 on one run (see ac-render integrator file) |
MK8D |
| Render target view of a block-compressed texture (format 0x44) shows stale data | Compressed render-target shadow is not copied back | Open (G4) | MK8D |
Services and input¶
| Symptom | Cause | Fix | Found on |
|---|---|---|---|
| Title shows "Ver. 1.0.0" for an updated game | GetDisplayVersion always returned 1.0.0 |
Display version from napple-app.json (NACP) when the data directory is the newest version (services/host_info.c) |
MK8D update |
time:u cmd 300 not implemented, MK8D latest update stops |
Missing CalculateMonotonicSystemClockBaseTimePoint |
Implemented on the ios-sim and mk8d-64 branches; both add it to services/time.c: keep one handler (conflict at integration) |
MK8D update |
| Updated game: save files appear as a different title's | Base and update share one title save dir on purpose (they are one title) | Not a bug. Device vs account saves are mounted separately (save/space1/device, save/space1/account/<uid>) |
MK8D |
| Out of disk building an updated title (19 GB RomFS) | The patched RomFS is materialised | napple build ... --data-only --update-romfs in-place writes romfs.map (268 MB for MK8D). Never ship a map: it holds keys and host paths |
MK8D, mk8d-64 |
zsh: NAPPLE_INPUT_SCRIPT="..:$t:A" turns into a path |
$t:A is a zsh modifier |
Quote or escape $; write 15:A,19:A,... literally |
iOS Simulator work |
pgrep -f napple-runtime finds other sessions' processes |
Same binary name | Include the data directory in the pattern; never pkill by name |
all |
Building¶
| Symptom | Cause | Fix | Found on |
|---|---|---|---|
codesign fails on a build under ~/Documents |
File Provider extended attributes | Build in $TMPDIR as the scripts do, or xattr -cr |
packaging |
make -C runtime link fails on a test after adding a debug trace |
Guest-stack trace aids referenced from runtime code but not linked in the host tests | Keep trace aids out of files the host tests link, or stub them | ac-render |
iOS build misses a32 symbols |
tools/build_ios.sh did not compile runtime/src/a32/*.c |
Fixed on the ios-sim branch | iOS |
dylibize fails on an AArch32 (NTB2) title |
NTB2 modules are not Mach-O liftable | Skipped for NTB2 | iOS, MK8D |