[{"timestamp":"2026-10-22T23:58:08Z","commit_sha":"0d05b6ccc61fcea090d8318a00af9f1634810e18","commit_message":"Progress reports: data measures (data written as C: 2,157 of 531,043 bytes) and per-region categories (ARM9, ITCM, overlays, TWL, each game and SDK); docs and CI point at ByteMatch","measures":{"fuzzy_match_percent":100,"total_code":3396468,"matched_code":3396468,"matched_code_percent":100,"total_data":531043,"matched_data":2157,"matched_data_percent":0.4062,"total_functions":35197,"matched_functions":35197,"matched_functions_percent":100,"complete_code":3396468,"complete_code_percent":100,"complete_data":2157,"complete_data_percent":0.4062,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-22T22:45:16Z","commit_sha":"4f8544d3b28e24ea09747afcdb36ee476bc20680","commit_message":"Progress reports regenerated (35,197 functions, 3,396,468 code bytes: the four functions that were filed as data now count); CI uploads Black (IRBO_report) and White (IRAO_report) for decomp.dev and ByteMatch","measures":{"fuzzy_match_percent":100,"total_code":3396468,"matched_code":3396468,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35197,"matched_functions":35197,"matched_functions_percent":100,"complete_code":3396468,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T13:53:34Z","commit_sha":"ed489422cd300f402b4cd26df9337ec96c1924d3","commit_message":"Every src/game header compiles on its own (host and mwcc)\n\ntools/hdrcheck.py compiles a one-line unit per header with both compilers; 151 headers failed,\nnow 0 (Black and White). Headers include the owners of the types they use (sdk_os.h for OSIntrMode,\nOSIrqMask; sdk_rtc.h RTCResult; sdk_ioreg.h SCFGCpuSpeed; the *_types.h owners), and mkheaders\nemits the owning include for SDK base typedefs. 306 duplicate local typedefs in 171 .c files are\ngone. New bool_types.h (enum Bool, included only where a header returns it) and ov009/gs_types.h.\nEvery file EXACT, hostcheck FAIL 0, protocheck 0, typedup 0, gamecheck and funcaddrs clean, touched\nregions link Black and White.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T12:59:18Z","commit_sha":"4f0c61188cb8b6e11da0d75c704ac39deafc4d0f","commit_message":"README: Milestone 5 remaining work, repository cleanup and port fixes","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T12:57:57Z","commit_sha":"c347e80ed6d69c860ed29af039770c922bf076b8","commit_message":"README: simpler milestones; White is Milestone 4, the PC port Milestone 5 with its two source items","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T12:29:35Z","commit_sha":"e96969f058be8d37e1bcc7a7427c8f52af9509ad","commit_message":"Wave 20 phase 5a: pointer width (ARM9 core, field, battle, part of menus); ov198 bag cursor callbacks are code\n\nReal pointer types where the original had pointers: heap/arena/flash/save, GameData and\nBattleSetupParam pointer fields, TCBL_GetOwnedWork, BG_SYS_GetBuf, PARTICLE user data,\nNNS_GfdRegisterNewVramTransferTask in its SDK form, PokeToolArg, and field/battle locals,\nparameters and returns. SDK and hardware integer addresses stay as the original has them.\n64-bit pointer-width count 8,501 -> 6,132. ov198 0x02211A54/60/6C are the bag cursor callbacks\nB_PLIST_MAIN_HideCursor, HideCursorOnTouch and MoveCursor (only the CursorVtbl d_022122A0 names\nthem, so the layout had filed them as data; eidos crashed when the bag opened in battle);\ntools/codeasdata.py finds function pointers that land in data, tools/datareg.py keeps listed\nfunctions out of data tails. Every file EXACT, hostcheck FAIL 0, protocheck 0, every region links\n(Black and White), both ROMs rebuild identical.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T11:15:10Z","commit_sha":"c1a5af1bc8404e93ac89f30f9c756e0c10815579","commit_message":"ASSETS.md: town map archives a/0/8/5 and a/0/8/6 and the spot table layout","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T09:56:35Z","commit_sha":"d99753e5cf3101f8e3390e716260be629052f471","commit_message":"assets docs: NCER mapping_type 0-3 is 1D (32 << n byte unit), 4 is 2D; the old '4 = 1D 256B' note was wrong","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T08:10:10Z","commit_sha":"b4b12c4b604490a296e0b3cffa18b4cb618e5720","commit_message":"README: shorter Milestone 3 and 5 lines","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T05:16:19Z","commit_sha":"0934e62e3af4ea6f3e9ef3a6c24de9b84a0effb0","commit_message":"Wave 20 phase 3e: 0 mismatched declarations, empty EXCEPTIONS list; Milestone 3 cleanup done\n\nG3D_UTIL_GetObject returns G3dObject * and the NNS G3D resource functions take the SDK types\n(NNSG3dResFileHeader, NNSG3dResMdlSet, NNSG3dResTex, NNSG3dAnmObj); touchbar takes Strbuf/GfFont\npointers; SCRIPT_SYS_CreateScriptEventSimple has a header declaration; DEBT.tsv holds only\nfile-name guesses and unread fields. protocheck 0 (also with NOEXC=1), EXCEPTIONS empty, typedup 0,\nhostcheck FAIL 0, missing returns 0, 945 guards all archived in docs/ORIGINAL_BUGS.tsv. Every file\nEXACT, every region links (Black and White), both ROMs rebuild identical.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T04:05:36Z","commit_sha":"f5bcfb3145ad5c54f559efc3c3dbc833b329b7eb","commit_message":"README: Milestone 5 done (White byte-identical from src/game, White data mode 181/181, per-function tracking 35,669 EXACT)","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T04:04:48Z","commit_sha":"fa93861b626afc820675bd62efb3942d359299a1","commit_message":"Wave 20 phase 3d: no hidden declarations; field, ARM9 and menu retypes; hand_waza is one file\n\nprotocheck 1 row (7 with NOEXC=1; the EXCEPTIONS list is down from 216 to 6 entries): each hidden\nmismatch was either fixed by retyping or became an archived original mismatch (a whole-statement\n__MWERKS__ guard with a docs/ORIGINAL_BUGS.tsv row; 942 guards, 772 rows, guardaudit clean).\nhand_waza.c is one original file (its data block is one interleaved run); its last four\nfunction-pointer casts were wrong types in our C and are plain calls now. GAME_DATA_GetEventState,\nGetFieldGimmick, GetBgmInfo return real types; bsubway_scr.c holds no pointers in ints; SDK\nRTCDate/RTCTime replace the game's copies; NNS G2D OAM manager and BmpMenuListTemplate are real\nstructs; TCBL_IsDeletePending is TCBL_GetOwnedWork, SCRCMD_WORK_GetOccupyInfo is\nSCRCMD_WORK_GetMmdlSys. Every file EXACT, every region links (Black and White), both ROMs rebuild\nidentical, gamecheck/aliascheck/funcaddrs clean, hostcheck FAIL 0.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T02:06:50Z","commit_sha":"d82ca9502f94658f875f26db6394b0004409be93","commit_message":"Wave 20 phase 3c: ARM9/field/battle/menu leftovers, guards archived, src/game stands alone\n\nprotocheck 41 rows (258 with NOEXC=1, the exceptions list is next); typedup conflicts 0; missing\nreturns 0; hostcheck FAIL 0; function-pointer call casts 14 (from about 600). No src/game file\nincludes src/matched any more (30 files got their own types). docs/ORIGINAL_BUGS.tsv has about\n550 rows and guardaudit checks that no guard splits a statement. ARM9: G2D bank loaders, sound\nbank, save-outside, Battle Subway stat row, ARC_UTIL_UploadBgCharFromArchive typed; DspRing,\nNdmaConfig, HistoryEntry, Node have one definition each. Field: ov021 declarations 232 -> 17,\nvoid-read definitions return what r0 holds, a wrong ov039 call target is the ov038 plate-doors\nevent. Battle: BTLV_INPUT_* and the pmsWork chain typed, server-flow command records are structs,\nbtl_net trainer data uses the shared types. Menus: Box2, BR list-menu and actor views merged.\nclaims are safe under concurrent lanes (lock, atomic write). Every file EXACT, every region links\n(Black and White), both ROMs rebuild identical.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-21T00:16:12Z","commit_sha":"e61be7fa50b519466fa32d5de2bbad16bcdd4160","commit_message":"Wave 20 phase 3b: width pass, generic global names, EncEffWork\n\nWidth settlement (tools/widthinfer.py): 55 functions applied, the ones that broke a caller undone;\n50 redundant DS-prototype guards removed (651 left); protocheck 493. Generic data names that\ncollide with identifiers (site, table, coords, ...) have module-prefixed names from use\n(tools/globrename.py, 147 rows, 59 files). struct EncEff stand-in is EncEffWork, the type\nov021/enceff.c defines. Every file EXACT, every region links (Black and White), both ROMs\nrebuild identical, gamecheck/aliascheck/namesync clean.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T22:25:06Z","commit_sha":"45f95e267eb91015a8737d3e85ef5da1c45689e7","commit_message":"ov194 NAMEIN_GRAPHIC_InitInputField: the font argument is a halfword on the DS (original prototype) and a whole GfFont pointer on the host (NameinFontArg); DS bytes unchanged","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T21:19:06Z","commit_sha":"2d06770b7e9dd07413e41317dde3bee85baf3a04","commit_message":"Wave 20 phase 3a: network pointer types, pointer-width casts, PaletteFade, SDK register names; eidos-safe names\n\nnetptr: GFL_NET_COMMAND_* tables are NetCommandEntry, session callbacks and user args are pointers\n(GFLNetUserFunc), size_t has one owner in types.h, MSL string functions take their libc form.\nptrfix: 5,311 pointer casts use uptr/sptr and 619 locals/statics are retyped; the 64-bit\npointer-width count is 8,768 (from 16,362). palfix: PalAnmSlot is gone, the palette object is\nPaletteFade everywhere. ioregnames: raw I/O addresses use the SDK register names from\nsdk_ioreg.h/sdk_ioreg_reg.h. No function-like macro or host #undef is named after a real\nfunction; MIi_CpuClearFastAlias is mwcc-only; short globals (ov133 b1/b2, ov172, ov213, pow bp)\nhave names from use. Every file EXACT, hostcheck FAIL 0, gamecheck/aliascheck clean, both ROMs\nrebuild identical.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T18:49:48Z","commit_sha":"999783ad9ded29326c183c89f2af52102bf6dcbe","commit_message":"Wave 20 phase 2: overlay types and per-file headers; host build compiles; original bugs archived\n\nDuplicate types tree-wide 4 (from thousands); protocheck 520 mismatches (from about 10,000), reading\nthe host branch of __MWERKS__ guards; about 1,100 calls through cast function pointers are plain\ncalls; btl_server_flow.c and the battle client use real battle types; hostcheck FAIL 0 with a new\n64-bit pointer-width class (uptr/sptr in types.h); docs/ORIGINAL_BUGS.md and .tsv list the bugs\nkept from the original (host form under !__MWERKS__, gameplay fixes under BUGFIX); one stdarg\nheader (sdk_stdarg.h) for every variadic function; SDK register names (sdk_ioreg.h); DSi data as\ngenerated C; network, string and size_t types; gamecheck reads only the DS branch of guards.\nEvery file EXACT, every region links (Black and White), both ROMs rebuild identical.\nTools: castfix, guardaudit, ioregnames, mkcast, netptr, palfix, protocast, ptrfix, twldata,\ntwlnames, va_apply, widthinfer.","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T03:56:05Z","commit_sha":"5fba411aa6c39143fc4e2aad84ac29fcd705600c","commit_message":"pm: 0x027313AC is PMi_GetBatteryLevelCore (u32 (u16 *levelBuf), SDK form); arm9/pm.c called it PMi_GetACAdapterCore; aliascheck resolves every extern through function_addrs.tsv","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T02:34:19Z","commit_sha":"b9caa4f64f8cd0c436e5d38945e3ded30b359303","commit_message":"os_spinlock.c: OSi_DoLockByWord returns the last OSi_DoTryLockByWord result (s32, SDK form) and OS_LockByWord returns it; removed from the missing-return exceptions","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T02:24:07Z","commit_sha":"020f1e29d46b0112d193c04fed05376d8a193db3","commit_message":"Wave 20 phase 1: ARM9 types and per-file headers; White data mode, DSi block from source, White tracked at 100%; missing returns; every function has an address\n\n- ARM9 shared types: one owner per struct (bg_sys.h, app_taskmenu.h, mystatus_types.h, zonedata_types.h, poke_personal_types.h, nns_g2d_* and sdk headers ...); about 2,100 ARM9 externs replaced by per-file headers (tools/mkheaders.py keeps hand-written header content)\n- SDK stand-in prototypes replaced by the real ones; PlayerRecord is MyStatus; DWCi_IsFold has external linkage\n- 31 functions that fell off the end return their r0 value (10 kept with DEBT rows); hostcheck reports missing returns\n- tools/funcaddrs.py and layout/function_addrs.tsv: every defined function's address; 478 functions added to function: headers\n- White: data mode 180/180 and ARM9, arm9i rebuilt from src/game/twl for both games, tools/whitetrack.py and layout/matched_white (35,669 functions EXACT), progress/report_white.json 100%\n- Black onelink and White romlink IDENTICAL; gameverify 1374 EXACT; aliascheck, namesync, placeholders, funcaddrs 0; hostcheck 0 FAIL","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-20T00:17:40Z","commit_sha":"4ee960765e4eac924744aa97899ac38581fe1a81","commit_message":"layout/function_addrs.tsv: address of every function src/game defines (35,181 rows, static ones included), from tools/funcaddrs.py","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-19T21:49:37Z","commit_sha":"25c15c1610e2b022a5323b413f04b1f6625a1ac1","commit_message":"Wave 20 phase 0: shared type headers (types.h, sdk_*.h), duplicate-type and header tools, 48 second names fixed\n\n- src/game/types.h and sdk_fx/os/os_thread/fs/wm/gx/rtc/soc/ncfg/dwc/math/card/mb/nnsfnd headers: one definition per base and SDK type; 37 wrapper headers removed\n- tools/typedup.py --conflicts (cross-file type conflicts 345 -> 261), tools/basetypes.py, tools/typemerge.py; tools/mkheaders.py resolves cross-overlay externs and uses the shared headers\n- tools/aliascheck.py checks a file's own rows; 48 second names fixed (dwc_match DWCi_GetNumConnectionHost returns int)\n- gameverify 1374 EXACT, hostcheck 0 FAIL, Black onelink and White romlink IDENTICAL","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-19T20:42:02Z","commit_sha":"9dc9d30fba8504c310da7b0ee3c650027f165e20","commit_message":"gx_load2d.c: restore the ' * ' prefix of the symbols: header line (sSubBGExtPltt row was skipped by header parsers)","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-19T16:54:40Z","commit_sha":"00fe7d65b9fd14265a47296e18fe4f9330309763","commit_message":"Wave 19: src/game is correct C for a host compiler; short calls, linkage, helper calls and second names fixed; retail White builds byte-identical from src/game\n\n- all 65 short calls pass their real arguments (or the unused parameter is gone); 50 static/extern pairs, casts as lvalues and undeclared calls fixed; tools/hostcheck.py: 1361 PASS, 0 FAIL, 13 ABI-only\n- explicit compiler-helper calls became C operations; the mcss.c link break traced to a u32 field (COMPILER_NOTES section 12)\n- gameverify no longer passes unattested call targets; gamelink names a file whose call disagrees with the bound address\n- tools/protocheck.py: 20,611 declaration mismatches down to 6,039 (rest for the header waves)\n- DEBT rows closed: helpers, second names, ov183 per-process structs, crt0 split into build record and SDK version units, Sea/Wave Incense swap, SDK field names\n- narrow-type bugs: beacon nickname and Mystery Gift message banks are pointers; the name-entry font stays u16 (likely original; host must patch)\n- White: verified No-Intro dump; version switches in src/game/version.h; 180/180 overlays, ARM9, ITCM link; romlink --version white IDENTICAL (bc696a0d)\n- docs/OV230_CHECKS.md: genuine behaviour of the anti-tamper chains; ov230 hook names","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1374,"complete_units":1374}},{"timestamp":"2026-10-19T10:39:36Z","commit_sha":"fc75b4e4bcb5db1e1e53461675da16085a119b6c","commit_message":"Coverage maps (old versions dropped from history)","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1367,"complete_units":1367}},{"timestamp":"2026-10-19T09:53:29Z","commit_sha":"8495755dbbb6712d9a91a8c03a1a6ca41b89abcd","commit_message":"Wave 18: whole ROM from one link and with the secure area from C; names synced with the evidence store; manifests list every unit member; README rewritten\n\n- tools/onelink.py + romlink --onelink: ARM9, ITCM and 180 overlays in one mwldarm run, IDENTICAL\n- secure area: 1,980 bytes of libsyscall filler generated as C data (tools/arm9data.py); no image bytes in ARM9\n- tools/aliascheck.py and tools/namesync.py: second extern names and src/game vs evidence names at 0\n- tools/match.py records every member of a unit entry (53 short lists fixed)\n- placeholder names at 0 (accepted original/domain names listed in tools/placeholdernames.py)\n- soft-float helper calls become C float operations; CLACT speed setters; sqrt; gClactTables\n- cross-overlay rows all proved correct (xovcheck 0); coverage maps redesigned (one panel per region, coverage_all.svg)\n- docs/HISTORY.md holds the wave history; README rewritten","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1367,"complete_units":1367}},{"timestamp":"2026-10-19T08:57:43Z","commit_sha":"4254f611e23b9eca7a42ddbf6fe4859444b5ad7b","commit_message":"short_calls.tsv: 65 src/game calls with fewer arguments than the callee takes","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1367,"complete_units":1367}},{"timestamp":"2026-10-19T06:34:52Z","commit_sha":"a5c1ab95a5608d7ce4812046c8b1f1bfb2043843","commit_message":"Wave 17: overlay 230 fully matched (both encryption layers), 376 more names corrected, second MyStatus layout removed; overlays 100%\n\n- ov230 is built with the 2.0/sp2 compiler; tools/ovcrypt.py opens and seals the 18 second-layer\n  bodies; all 46 decrypted functions are EXACT C with evidence and manifests (layout/matched/ov230d);\n  romlink IDENTICAL with no ov230 bytes from the image\n- second meaning pass: 376 function renames, MyStatus/misc record/bsubway/GDS field renames,\n  PlayerStatus folded into MyStatus, GAME_DATA_GetMyStatusPlayer, ov093 BtlNetTrainerData\n- gamecheck covers ov230d; match.py full selftest fixtures follow the renames (383/0)\n- idiom summaries completed; new 2.0 inline-helper idiom; DEBT row for ov230 file names\n- figures: overlays 24,885/24,885 functions, fully linked 100.00% game and all code","measures":{"fuzzy_match_percent":100,"total_code":3396440,"matched_code":3396440,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35193,"matched_functions":35193,"matched_functions_percent":100,"complete_code":3396440,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1367,"complete_units":1367}},{"timestamp":"2026-10-19T06:30:26Z","commit_sha":"226479d414a3a9d28954410b27377c3e66d42ac0","commit_message":"unit_members_unlisted.tsv: 53 game units whose manifest omits members the source defines","measures":{"fuzzy_match_percent":100,"total_code":3393140,"matched_code":3393140,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35175,"matched_functions":35175,"matched_functions_percent":100,"complete_code":3392028,"complete_code_percent":99.9672,"complete_data":0,"complete_data_percent":0,"total_units":1350,"complete_units":1349}},{"timestamp":"2026-10-19T05:51:48Z","commit_sha":"c30e2ab6d1ab94d42b49b42787f8b11d17276556","commit_message":"port_renames.tsv: the runtime float helpers are declared with two ABIs","measures":{"fuzzy_match_percent":100,"total_code":3393140,"matched_code":3393140,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35175,"matched_functions":35175,"matched_functions_percent":100,"complete_code":3392028,"complete_code_percent":99.9672,"complete_data":0,"complete_data_percent":0,"total_units":1350,"complete_units":1349}},{"timestamp":"2026-10-19T03:42:40Z","commit_sha":"766c4b4239b0c4b6d4e81df16e36cddc1f38e886","commit_message":"Wave 16: merged files split, 580 misnamed functions corrected, whole ROM built byte-identical from src/game; overlay 230's decrypted code counted\n\n- Boundary audit: the files that held several originals were split on __FILE__\n  anchors, data order, statics and prefixes (arm9 vm.c, save_control.c, mail.c,\n  time_icon.c, shinka_check.c, particle.c, ica_anime.c and more; ov010 calender.c,\n  waza_oshie.c; the libVCT files; ov021, ov093, ov110, ov118, ov123, ov125, ov132,\n  ov135, ov136, ov217); ten head/tail pieces merged back into their originals;\n  others kept whole on evidence. docs/restructure/BOUNDARY.md. 1,350 files.\n- Meaning audit: 13 read-only lanes checked names against bodies; 580 renames\n  applied in src/game and src/matched (GF_STANDARD CRC-16/RTC/sine-cosine, the misc\n  save money and badges, BG priority/scroll, camera script commands, box, trade and\n  musical screens, offset-named getters); 17 struct fields renamed per struct.\n  tools/namecheck.py flags names to read.\n- tools/xovcheck.py: 13 externs named another overlay's function at a shared\n  address; fixed with gamelink proof.\n- Division helpers: explicit _s32_div_f/_u32_div_f calls became / and %, checked\n  with gamelink for signed vs unsigned; 2 left in docs/DEBT.tsv.\n- tools/romlink.py builds the whole .nds from src/game: SHA-1 identical. ITCM links\n  with no image bytes; ov230 is built from linked plaintext and re-encrypted\n  (tools/ovcrypt.py encrypt).\n- Overlay 230's decrypted view was in no figure: now counted (28 functions, 2,112\n  bytes); 22 matched, 6 stream-cipher functions are asm stand-ins still open, and a\n  second sealed layer (3,564 bytes) is not decoded yet. Game code linked 99.96%.\n- docs/DEBT.tsv lists what is left on purpose and why.\n\nChecks: gameverify 1350 files, 0 not exact, 0 MATCH; gamecheck 35522 present, 0\nmissing, 0 doubled; manifest clean; selftest 373/0; datagen 10164/10164; data mode\n180/180 and arm9 PASS; romlink IDENTICAL; linkstats game 99.96%, all 99.97%.","measures":{"fuzzy_match_percent":100,"total_code":3393140,"matched_code":3393140,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35175,"matched_functions":35175,"matched_functions_percent":100,"complete_code":3392028,"complete_code_percent":99.9672,"complete_data":0,"complete_data_percent":0,"total_units":1350,"complete_units":1349}},{"timestamp":"2026-10-19T02:59:35Z","commit_sha":"b2b04a804f7e14aaeb3d9e3eaa6766325829c657","commit_message":"port_renames.tsv: the clact animation table's speed setters and its second extern name","measures":{"fuzzy_match_percent":100,"total_code":3391028,"matched_code":3391028,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35147,"matched_functions":35147,"matched_functions_percent":100,"complete_code":3391028,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1269,"complete_units":1269}},{"timestamp":"2026-10-19T00:59:49Z","commit_sha":"804654645615bfe23f43f1bde8e989ec6abe5830","commit_message":"Wave 15: fields, parameters and locals named (3,299 placeholders to 212); misnamed functions corrected; data mode covers all 180 overlays and ARM9\n\n- 26 naming lanes, one per region or region group: struct fields, parameters and\n  locals named from evidence (callee parameter names, stores and reads, vendor names\n  for SDK/NitroSystem/DWC/GameSpy/MSL code). Counted by the new\n  tools/placeholdernames.py; the 212 left are fields nothing reads or writes.\n- tools/protonames.py copies definition parameter names into prototypes (1,767).\n- Function names that contradicted their bodies: EVENT_GAMECLEAR_* (game-clear\n  sequence, was SCRCMD_NETWORK_*CommBattle*), EVENT_FIELD_MENU_* (X-button menu,\n  was *BattleRecordLink*), BOX2_MAIN_DepositPartyMon / SwapBoxAndPartyMon /\n  ResetShayminFormInBox / SyncItemForm / MoveMonToListedBox / MovePartyMonToListedBox,\n  BOX2_SEQ_StateReleaseMon / StateConfirmRelease, the swapped bag pair\n  BTL_MAIN_RemoveItemFromBag / BTL_MAIN_AddItemToBag, BTLV_CORE_GetSelectedItemCost /\n  GetItemTargetSlot / GetItemTargetFlag, POKE_TOOL_LearnLevelUpMove,\n  POKELIST_TryLearnMove, and 28 offset-named getters (ICA_ANIME_GetField1C is\n  GAMESYSTEM_GetGameData, GAME_DATA_GetField160 is GAME_DATA_GetStartLocation, ...).\n- Field names: BmpMenuList.font (was textParam; it is PRINTSYS_PrintColor's font),\n  CPSSslConnection.hostName, NNSG2dPaletteData.pRawData, GameData.fieldMenuCursor.\n- Data mode: datagen refreshes a stale plain-link cache (ov023/ov030/ov031/ov069);\n  tools/datamode_all.py runs every overlay (180 of 180 PASS); tools/arm9data.py and\n  gamelink.py arm9_main --data link ARM9 byte-identical with all .rodata/.data/.bss\n  from C, only the 1,980-byte secure area from the image.\n- README: the one-file-per-original box is open again (about 65 files still hold\n  several originals); wave 16 splits them.\n\nChecks: gameverify 1269 files, 0 not exact; gamecheck 35522 present, 0 missing,\n0 doubled; manifest clean; selftest 373/0; datagen 10164/10164; linkstats 100.00%\ngame, SDK and all, strict included; data mode 180/180 overlays and arm9_main PASS.","measures":{"fuzzy_match_percent":100,"total_code":3391028,"matched_code":3391028,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35147,"matched_functions":35147,"matched_functions_percent":100,"complete_code":3391028,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1269,"complete_units":1269}},{"timestamp":"2026-10-18T23:59:36Z","commit_sha":"2c3bfe1a1c4ba18c15d9eab2f7a6c92de0cbb8ce","commit_message":"port_renames.tsv: 18 wrong names and 10 likely ones found while porting; two misplaced functions\n\nRows in the unnamed_renames.tsv format (old, new, address, region, isa,\nnote with evidence). Found by reading callers in eidos's mod-event work:\nthe game-clear ending and the X-button menu carry network names, three PC\nbox functions do something other than their names, POKE_TOOL_GetLevelUpMove\nlearns the move, BTL_MAIN_AddItemToBag removes it.","measures":{"fuzzy_match_percent":100,"total_code":3391028,"matched_code":3391028,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35147,"matched_functions":35147,"matched_functions_percent":100,"complete_code":3391028,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1269,"complete_units":1269}},{"timestamp":"2026-10-18T22:57:33Z","commit_sha":"746d276c0d9f37851580c431226d1e001530cfa1","commit_message":"Wave 14 renaming finished; ov074 and ov109 matched; SDK asm stand-ins replaced by C; strict figure 100.00%\n\n- src/game holds no func_/sub_ address name in code, header rows, comments\n  or notes. Name clashes were fixed by correcting the wrong prototype (SDK or\n  GameSpy signatures), not by adding second names. One documented second\n  extern stays: MIi_CpuClearFastAlias in ov013/vct_main.c (the original has\n  two calls to 0x02082AC0; one name makes mwcc merge them, 4 bytes short).\n- ov016 DWCi_IsFold copies moved into the scene files that call them.\n- Three matched entries that were not functions removed (sub_02011292,\n  sub_020113D2: bytes inside VM_End and VM_SetWait; func_02050084: a label on\n  a getter's bx lr).\n- ov074 and ov109 held code the disassembler classed as data: ov074 is\n  FLD3D_CI_GetNameRow and its 26-row table (loaded by ov021\n  FLD3D_CI_StartNameSequence, which now calls it by that name), ov109 is\n  IDLE_SCREEN_Run (nothing loads it). Both matched, seeded in\n  layout/function_starts.txt, linked; 183 of 183 code regions link.\n- SDK asm checked against the SDK objects' line tables: 20 stand-ins became\n  C (FS_CloseFile, OS_InitEvent, OS_UnlockMutex, GX_SetBankForLCDC, RTC,\n  CTRDG, DWC and others, plus arm9 ui.c DWCi_IsFold); every genuine asm body\n  carries the hand-written marker; DWCi_ScreenDC_FlushRange is DC_FlushRange.\n- linkstats marker check no longer takes a name quoted in a comment as the\n  definition.\n- Evidence repaired: ov013 VCT_SESSION_MixVoices (second extern lost in a\n  rename) and ov132 SCRIPT_COMMAND_CmdCompareScores (struct Record defined\n  twice since wave 12).\n\nChecks: gameverify 1269 files, 0 not exact; gamecheck 35520 present, 0\nmissing, 0 doubled; manifest clean (33543 EXACT); selftest 373/0; datagen\n10164/10164; linkstats 100.00% game, SDK and all, strict included.","measures":{"fuzzy_match_percent":100,"total_code":3391028,"matched_code":3391028,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35147,"matched_functions":35147,"matched_functions_percent":100,"complete_code":3391028,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1269,"complete_units":1269}},{"timestamp":"2026-10-18T20:20:56Z","commit_sha":"d3299c5215b49156be6b4b6273b765a55b65733f","commit_message":"field_skill_check.c (UNVERIFIED): FieldSkillUseFlags.usableMask sits at +0x14, where func_02028748/func_02028754 set and test it (was declared at +0x00)\n\nOnly this file was compiled (gameverify: EXACT); the full verification of this batch is still pending.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-18T20:19:09Z","commit_sha":"d88f7f2ddde3e8fbdf124c83b761229ee1e40424","commit_message":"Unnamed functions pass (UNVERIFIED): 101 address names given real names, 14 wrong G3D camera/light names corrected\n\nRename table: docs/restructure/unnamed_renames.tsv (old, new, address,\nregion, isa, evidence + reason, per docs/NAMING.md \"How to apply\").\n\n- Pass 1 (owner-approved): 14 existing G3D_CAMERA_/G3D_LIGHT_ names in\n  g3d_light.c corrected to what the camera record and callers show\n  (projection block, then camPos/camUp/target; light slots dir/color).\n- Pass 2: 87 rows. Most point old func_/sub_ references at the name the\n  function already has (often defined in another overlay or inside a merged\n  file without its own manifest entry); the rest are SDK/MSL names and new\n  inferred game names. 10 rows applied by tools/sdkrename.py, 77 by a\n  whole-word replace limited to the files the worklist found using each name\n  (sdkrename refuses targets that already exist at the same address and\n  cross-overlay callers).\n\nHeld back, flagged in docs/restructure/misplaced.tsv: func_02028748,\nfunc_02028754, ov135 func_021F9260 (both spellings) and six ov230 guard\nthunks (no home file).\n\nNOT verified: run gameverify / match.py on the changed files. Expect some\ndoubled or conflicting prototypes where a file now declares a name twice,\nand check rand/connect/NdCallback/rtcWork/micWork/AOSSi_Alloc, which also\nname fields or locals.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-18T20:07:36Z","commit_sha":"175ee96335bff3576715e56d873bf28795e8d6d2","commit_message":"Stale references batch 5 (UNVERIFIED): sdkrename recognises ovNNN_func_ names; 117 more address names replaced by real names\n\ntools/sdkrename.py: ADDR_NAME also accepts the overlay-prefixed form\novNNN_func_/ovNNN_sub_, which the tool treated as a vendor name and scoped\nto too few files.\n\nRenames: 116 stale references plus func_02082A7C -> MIi_CpuClear32, freed by\ncorrecting the ITCM copy's stale symbols rows (MIi_CpuClear32 at 0x01FF852C)\nto OSi_CpuClear32, the name os_reset.c already defines it under.\n\nNOT verified: run gameverify on the changed src/game files and match.py on the\nchanged src/matched files. Some files now hold the old and the new name in two\nprototypes; a partial run found doubled-declaration CCERRs in about 9 files\n(e.g. ov172/exifenc.c, ov107/mb_parent.c, ov009/gpiprofile.c,\nov009/dwc_match.c) and one DIFF (ov013/vct_main.c) to fix.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-17T03:32:25Z","commit_sha":"c30eb64e24e5fb7d8384d5099850aa7544144d63","commit_message":"Stale references batch 4: 554 more address names replaced by the real names","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-16T09:56:24Z","commit_sha":"0e5cb2f9881c8272c533c1d11bdf6b8521fe0682","commit_message":"Stale references batch 3: 566 more address names replaced by the real names\n\n- the remaining unblocked names (about 4,200 references) across 214 files; 5 rows refused on purpose (same library symbol at a second address)\n- 14 files with a function declared under both names and two prototypes got the old name back on the lines that used it\n- gameverify: 1267 files, 0 not exact after the repairs","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-16T08:27:30Z","commit_sha":"86c78f969958a7666d93265ded7afab9129dcd25","commit_message":"Restructure wave 13 and integration: 56 new originals split out of the over-merged files; the biggest is iss_switch_sys.c into 7; unnamed down to 13; 922 stale function references found and queued\n\n- The split campaign (wave 13: lanes A1..A9 arm9, B..I overlays, plus NAMES, INFER and COVERAGE).\n  17 split lanes created 56 new originals and re-cut the over-merged files; src/game now holds\n  1267 .c files (was 1211), all byte-exact, with unnamed down to 13 of 36222. The biggest cut is\n  arm9/iss_switch_sys.c into 7; others split printsys.c out of app_taskmenu.c, field_task_manager.c\n  out of field_flash.c, the ov225 manual files (manual_data, manual_title, manual_explain,\n  manual_list, manual_top, manual_touchbar) out of manual_common.c and manual_category.c, and the\n  ov112 musical and shot files. Each new original carries its own *_shared_types.h where needed.\n- The corrected rename status (INT14, the big new finding). Every rename check before this one\n  counted only DEFINITIONS, so it reported renaming done while the tree still held func_NNNN names\n  used as REFERENCES. Re-measured over src/game (S/INT14/measure.py, output S/INT14/stale_refs.tsv):\n  1544 distinct func_/sub_ names are used, 1033 are stale (a real name exists at that address; the\n  raw address-only count of 1096 includes 63 cross-region false positives), 412 unknown and 36\n  genuine, across 21441 occurrences in 8453 (name,region,kind) rows. 111 names are blocked (99\n  naming gaps, 2 ambiguous addresses, 10 accepted duplicates), so 922 are unblocked. The top names\n  by use are func_020307B0 -> GFL_HEAP_Free (2858), func_02030734 -> GFL_HEAP_Alloc (2234) and\n  func_02045EC0 -> MSGDATA_AllocString (911). A one-file test batch (arm9/net_save.c) was\n  byte-neutral (gameverify not exact 0); the renames are NOT applied, wave 14 applies them in\n  batches.\n- The wave 14 worklist (S/INT14/wave14.tsv, 42 rows) and LAUNCHQ.md, grouped for direct launch:\n  SR (the stale-reference batches and the naming gaps), MV (the 51 confirmed INFER moves), COV\n  (the COVERAGE leftovers), OV (the 13 overlays no wave 13 lane entered), JDG (the judgement\n  items), NAME (the naming leftovers) and MATCH (the ov009 src/matched gap and the definition-index\n  rebuild).\n- Wave 13 open items folded into DEBT.tsv: 64 new rows (D-2816..D-2879), including lane C's\n  move_pokemon.c full-TU merge BLOCK (D-2844), the non-anchor boundaries, the file renames lanes\n  made, the module-prefix leftovers, the ov009 src/matched gap, the 51 confirmed INFER moves, the\n  368 unresolved inference rows and the COVERAGE items.\n- Docs and bookkeeping: README.md, docs/ROADMAP.md, docs/HANDOFF.md, docs/NAMING.md (a new Stale\n  references section) and progress/report.json are updated to 1267 files, unnamed 13 and the\n  corrected rename status. The coverage SVGs regenerated byte-identically. progress_report.py\n  reads 1267 units, all code 100.000 percent.\n- Checks: minimum only, per the check policy. gameverify --file src/game/arm9/net_save.c not exact 0\n  (during the rename test and after the revert); gamecheck --region arm9 6777 functions, 0 missing,\n  0 doubled; gamelink arm9_main PASS; progress_report.py all code 100.000 percent; coveragemap.py\n  100.00 percent both, SVGs unchanged. The whole-tree suite is deferred to the final verification\n  wave.\n- Remaining: the 922 unblocked stale renames (wave 14 SR), the 99 naming-gap names, the 12\n  ambiguous/duplicate names, the 51 confirmed moves, the 13 overlays with no wave 13 lane, and the\n  13 unnamed definitions.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1267,"complete_units":1267}},{"timestamp":"2026-10-16T06:50:03Z","commit_sha":"8374c51de58f139dc0a77be9519cb38e28855998","commit_message":"Cleanup wave 12 and integration: the misplacement table found stale and rebuilt from the disassembly to 1056 anchors; the stand-in class cleared; wifilist merged and the first non-contiguous original landed; unnamed down to 20\n\n- The misplacement pass (MP-1..MP-10, the 900-row table). The table was built from callers and\n  behaviour, not anchors, so it was stale and mostly inference: of the 900 rows only 9 carried the\n  suspect's own anchor, and the lanes' verdicts stop at the anchor-bearing functions. The ten lanes\n  examined 466+ suspects and moved the proven cases: MP-2's regulation trio, MP-7's ISS cluster of\n  17 across two blocks, and INT13's two wih_dwc tail functions into net_err.c. VER-1's independent\n  scan (S/W12/VER-1) put the anchor-backed set at 72 functions across 35 files; INT13 rebuilt the\n  anchor table and raised it to 76 functions across 36 files (S/INT13/anchor_scan.tsv).\n- The anchor table was incomplete. tools/fileanchors.py rebuilt layout/file_anchors.txt from the\n  disassembly: 1022 -> 1056 anchors (34 added, 0 removed). MP-8 had proved it omitted\n  event_ircbattle.c and report_event.c; 32 more were missing (battle_examination.c, backup_system.c,\n  net_state.c, g3d_util.c, event_gtsnego.c, musical_event.c and others). The true remaining\n  restructuring is a split campaign, not a move list: S/INT13/split_list.tsv holds 113 rows (76\n  anchor-proven + 37 structural, 88 needing a new file).\n- Two file merges. MP-6 merged wifilist_tail.c into wifilist.c (contiguous after all), so\n  wifilist_tail.c is removed and the file count is 1211. NCR-1 landed\n  ov118/pokemontrade_demo_common.c as the first end-to-end use of the non-contiguous capability\n  FIX2 built, with gamelink reporting two pieces.\n- The stand-in class cleared to 2 leftovers across the whole tree (arm9/iss_switch_sys.c\n  Struct_0202441C, arm9/wipe_sub.c comment-only). The ov009 SDK names were applied:\n  func_021685CC -> DWCi_GetMathRand32, func_021894D8 -> gpiSendData, func_02189780 ->\n  gpiRecvToBuffer, with the doubled declaration and the three mangled static symbol rows fixed.\n- Naming: unnamed drops to 20 of 36222 definitions (brace parser), from 24 at the wave start, and\n  all 20 are classified (4 duplicates, 3 real collisions, 1 real mislabel, 4 mislabel clusters,\n  plus no-name and guess rows). The 6 unrecorded ov009 name duplicates are accepted duplicates,\n  recorded in DEBT.tsv, like get_sockaddrin and long_from_char.\n- Corrections recorded: poke_regulation.c was never non-contiguous; layout/file_anchors.txt was\n  incomplete; src/matched/arm9/func_02019D84.c is the normal manifest evidence source, not a\n  redundant second definition; the nns_fnd_expheap.c stale symbol rows are removed. The\n  src/matched store is out of scope for cleaned and documented so in README and HANDOFF.\n- Files and checks: src/game holds 1211 .c files, 0 not exact; gamecheck 35523 functions, 0\n  missing, 0 doubled; linkstats game AND all code 100.00 percent covered, complete and linked;\n  ovstats arm9 436032/436032 and overlays 2183302/2183302, both 100.0000 percent; Obj view\n  references 0; selftest 373 cases, 0 failures; manifest --check clean (28053 shards); datagen\n  10164 of 10164.\n- Debt and docs: the 16 wave 12 lanes' open items are absorbed into DEBT.tsv (124 rows) plus 14\n  INT13/MISC-1 rows (2677 -> 2815); README.md, docs/ROADMAP.md, docs/HANDOFF.md, docs/NAMING.md,\n  the three coverage SVGs and progress/report.json are updated. LAUNCHQ.md is refreshed as the\n  wave 13 start list: S/INT13/split_list.tsv grouped into 9 region clusters (arm9, ov021, ov010,\n  ov112, ov225, ov107, ov009, ov121, ov208).\n- Remaining: the split campaign (76 anchor-disagreeing functions across 36 files, 88 needing a new\n  file), the two large arm9 moves deferred to wave 13 (pm_voice -> gfl_use.c, button_man ->\n  particle.c), 39 unresolved anchors, the 20 unnamed, and the func_0206074C -> FNDHEAP_Finalize\n  rename in nns_fnd_expheap.c.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1211,"complete_units":1211}},{"timestamp":"2026-10-16T04:38:36Z","commit_sha":"25644aecb72ece0aaf1d3a1a6e7dafaa2638eeb3","commit_message":"Cleanup wave 11 and integration: 3874 Obj view references removed to zero; the SDK gap closed to 100.00 percent linked; three missing byte runs found to be missing manifest entries; coverage-accounting bug fixed; 341 functions named\n\n- Obj removal (25 lanes plus continuations, folded by INT12 and INT12b): every address-named\n  ObjNNNNN view reference is folded into real structs, from 3874 in 37 files down to 0, and the\n  placeholder struct tags over src/game fall to 0. 341 functions are named tree-wide (INT12\n  applied a 345-row map, INT12b applied 12 more from the older wave maps); unnamed drops from 365\n  to 24 of 36222 definitions (brace parser). Five shared owner headers are added (ov111\n  viewer_types.h, ov112 musical_shot_types.h, ov184 br_download_types.h, ov213\n  comm_btl_demo_shared_types.h, ov016 gx_oam_types.h) and the ov174 LocalTvtSys, the ov185\n  BrPokeSearchOwner and the ov112 actor-pool/elem duplicate pairs fold to one owner header each.\n- The SDK and linking gap is closed. func_021F6AA4 is IsGetAllRequestData (libmb mb_block.o) and\n  func_021E2A5C is wsLoginCertReadXML (libdwcgswebservices authservice.o), both covered as C with\n  no markers added. linkstats reads game AND all code 100.00 percent covered, complete and linked\n  (covered_sdk 760078 of 760078); ovstats reads arm9 436032/436032 and overlays 2183302/2183302,\n  both 100.0000 percent, and coveragemap prints 100.00 percent for both.\n- The three residual byte runs (arm9 0x02072788, ov125 0x021D85DC, ov175 0x021DD560) were missing\n  MANIFEST entries, not missing code: TAILSTUB-1 files three per-function matched files and their\n  shards, so gamecheck goes 35520 to 35523. The 1994-byte arm9 disagreement between coveragemap\n  and ovstats was an accounting bug: tools/worklist.py did not credit a listing label inside a\n  matched game unit's compiled bytes. Fixed in tools/fnaddr.py, tools/worklist.py and\n  tools/coveragemap.py, and the arm9 path now cross-checks ovstats and exits on disagreement.\n- Investigations (INV-A, INV-A2, INV-B, INV-B2, INV-C). INV-C builds two independent call graphs\n  over 39933 function records; exactly 22 have no reference of any kind and all 22 are explained\n  (entry point, SVC veneers, fall-through heads, function-map artefacts), so there is no dead code.\n  The four search shapes that hide a call (data table, proc descriptor, step table, pointer-only\n  word) are recorded in S/STANDING.md. WifiBattleMatchParams is 0x44 bytes, confirmed by the\n  allocation site WIFIBATTLEMATCH_SYS_BuildMatchCommand and a compile-time size check.\n- Corrections: two struct bugs (pad_18C[4] in ov175 and the ov111 actor views), a false \"missing\n  0x30 pad\", and 16 of 21 \"the typed form DIFFs\" fallback records that were either wrong or had a\n  byte-exact alternative. docs/COMPILER_NOTES.md records trap 9: a PARTIAL conversion is not a\n  valid test. The arm9 PalAnm/PalAnmSlot spelling is unified in 13 files.\n- Files: src/game holds 1212 .c files, 0 not exact; gamecheck 35523 functions, 0 missing, 0\n  doubled; tucount 1212 of 1212; selftest 373 cases, 0 failures; manifest --check clean (28053\n  shards); datagen 10164 of 10164. 0 placeholders, 0 unit_ files, 0 unplaced dirs.\n- Debt: the wave 11 lane and investigation open items are absorbed into DEBT.tsv (708 rows,\n  D-1970..D-2677), the measured_unread sets are recorded as measured-unread in docs/NAMING.md (not\n  naming debt), and LAUNCHQ.md is refreshed as the wave 12 start list. The second-tier stand-ins\n  (265 distinct names in 93 files) and the misplaced-function pass remain for wave 12.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390676,"complete_code_percent":100,"complete_data":0,"complete_data_percent":0,"total_units":1212,"complete_units":1212}},{"timestamp":"2026-10-15T21:09:06Z","commit_sha":"80f06a261e8731f2db94c1a66627bb351ad47673","commit_message":"Cleanup wave 10 and the gap fixes: game code fully linked at 100.00 percent; ov194 namein_graphic split into five originals; arm9 ui merged; non-contiguous pieces now verifiable\n\n- Obj removal (22 lanes plus integration): the ov093, ov112, ov116, ov121, ov122, ov128,\n  ov129, ov175, ov176, ov185, ov204, ov214, ov216 and ov225 overlays, the two mixed rest\n  blocks, and the arm9 and ov009 continuations fold the address-named ObjNNNNN views into\n  real structs. 967 functions named and 4,168 Obj view references removed (7,345 across 109\n  files down to 3,874 across 37) and 15 regions reach zero views. The two opaque PROSYS\n  spellings struct Obj0203159C and struct S020315D4 become one name struct Proc across 886\n  references in 325 files. Four standing per-file *_shared_types.h fold into owner headers\n  and three owner headers are added (ov176 livebattlematch_shared_types.h, ov185\n  br_pokesearch_types.h, ov223 psel_types.h); no unused Obj*.h header is left.\n- Compiler notes: docs/COMPILER_NOTES.md records the five corrections from INT11 (any\n  introduced struct can change the codegen, not only one at 0x530; missing explicit\n  padding; a volatile reload; signedness changing control flow; one wrong field width\n  propagating) and item 8, the non-contiguous split.\n- Gap fixes (three lanes). FIX1 folds arm9 ui_p02.c into one whole ui.c (54 functions,\n  EXACT, ui_p02.c deleted). FIX1's ov194 namein_graphic merge is REFUSED: the p01/p02/p03\n  union DIFFs by 33 bytes in 8 runs (a real seam, the p01 pool word 0x021F5780 dropped and\n  p01's last function grown by 4). FIX3 splits the range at the real boundaries into five\n  whole byte-exact TUs (namein_graphic_main.c, namein_graphic_field.c, namein_graphic.c,\n  namein_data.c, nsbtx_to_clwk.c), so tucount is 1,212 of 1,212. FIX2 generalises the\n  per-function verify path to a non-contiguous C piece (the contiguous: no marker,\n  match.piece_entry_status, gameverify piece_kind/piece_verify, the gamecheck and worklist\n  guards), additive and dormant, 10 selftest cases.\n- cw_runtime policy (owner confirmation pending): the H1 hand-written marker is applied as\n  a comment above the 33 arm9 cw_runtime.c asm bodies, which raises the linked figure by\n  10,360 bytes without matching anything. Comment-only, no bytes changed, trivially\n  revertible; DEBT D-1963.\n- Files: src/game holds 1,212 .c files, 0 not exact; 35,520 functions, 0 missing, 0\n  doubled; tucount 1,212 of 1,212 translation units whole, split 0.\n- Fully linked: 100.00% of game code (2,630,598 of 2,630,598 bytes), 99.98% of all code\n  (3,390,128 of 3,390,676 bytes; the remaining gap is the SDK side, covered_sdk 759,530 of\n  760,078, the two uncovered SDK functions ov107 func_021F6AA4 and ov175 func_021E2A5C);\n  181 of 243 regions link byte-identical. Names: 36,202 of 36,567 (brace parser), 365 still\n  address named; 0 unit_ files, 0 unplaced dirs, 0 placeholders.\n- Checks: gameverify 1,212 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0\n  doubled; linkstats 243 regions, 0 failures; gamelink arm9_main, itcm and ov194 PASS;\n  manifest --verify 28,050 shards, 33,541 entries, 0 rewritten, --check clean; selftest 373\n  cases, 0 failures; datagen 10,163 of 10,163; tucount 1,212 of 1,212.\n- Debt: the FIX1 and FIX3 open items absorbed (D-1961..D-1968: the namein merge refusal,\n  the p03 anchor evidence, the cw_runtime policy awaiting owner confirmation, the two\n  unresolved original names and the two unresolved cut addresses), plus a FIX2 planning row\n  (D-1969); DEBT.tsv is 1,968 rows. README, docs/NAMING.md, docs/HANDOFF.md,\n  docs/ROADMAP.md, docs/COMPILER_NOTES.md, docs/restructure/REPORT.md and\n  progress/report.json are updated and LAUNCHQ.md is refreshed for wave 11.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3390128,"complete_code_percent":99.9838,"complete_data":0,"complete_data_percent":0,"total_units":1212,"complete_units":1212}},{"timestamp":"2026-10-15T17:09:29Z","commit_sha":"0ab682f645b106e177a6a227dea78aadbfcf4de6","commit_message":"Cleanup wave 9: 720 functions named and 5052 Obj view references removed across 12 regions reaching zero views; ov133 and misc_savedata split into their originals; compiler notes recorded; 98.99% of game code fully linked\n\n- Obj removal (24 lanes): the ov112, ov121, ov128, ov129, ov133, ov170, ov173, ov175,\n  ov176, ov194, ov197, ov198, ov204, ov208, ov210, ov215, ov223 and ov225 overlays, the two\n  mixed rest blocks, and the arm9 and ov009 continuations fold the address-named ObjNNNNN\n  views into real structs. 5,052 references removed (12,397 across 164 files down to 7,345\n  across 109) and 12 regions reach zero views. New owner headers for ov211, ov215, ov204,\n  ov198, ov173, ov210, ov133, ov128 and ov121.\n- Names: 757 applied tree-wide with tools/sdkrename.py (747 unique (address, region) keys,\n  0 conflicts), 2 refused and 1 reverted after a codegen check that DIFFed five files; the\n  reverted row and the two refusals are open items.\n- Splits (STRUCT10): ov133 cut at 0x021BA0C8 into dup_fitting.c (57 functions) and\n  dup_fitting_item.c (31 functions); arm9 misc_savedata.c split into misc_savedata.c,\n  battle_examination.c and misc_savedata_2.c as three contiguous pieces, all EXACT and the\n  region links. Six cuts are deferred with a reason (DEBT D-1501..D-1505, D-1507).\n- Compiler notes: docs/COMPILER_NOTES.md records the three recurring traps (the literal-pool\n  load for a struct-member offset at or above 0x530, the load-bearing pointer-chasing reload,\n  and match.py one needing the original address); linked from docs/NOTES.md.\n- Files: src/game holds 1,211 .c files, 0 not exact; 35,520 functions, 0 missing, 0 doubled.\n- Fully linked: 98.99% of game code (2,607,034 of 2,633,560 bytes), 99.20% of all code\n  (3,363,602 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Files whole: 1,206\n  of 1,208 translation units (split 2). Names: 35,235 of 36,567 (brace parser), 1,332 still\n  address named; 0 unit_ files, 0 unplaced dirs, 0 placeholders.\n- Checks: gameverify 1,211 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0\n  doubled; linkstats 243 regions, 0 failures; manifest --verify --force 28,050 shards,\n  --check clean; selftest 363 cases, 0 failures; datagen 10,163 of 10,163; tucount 1,206 of\n  1,208.\n- Debt: 234 open items absorbed from the 24 wave 9 lanes, D-087/D-540/D-543/D-886 closed by\n  DEBT9 and D-1506 by STRUCT10; DEBT.tsv is 1,740 rows. README, docs/NAMING.md,\n  docs/COMPILER_NOTES.md and progress/report.json are updated and LAUNCHQ.md is refreshed\n  for wave 10.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3363602,"complete_code_percent":99.2015,"complete_data":0,"complete_data_percent":0,"total_units":1211,"complete_units":1206}},{"timestamp":"2026-10-15T14:30:55Z","commit_sha":"2c0ae303768a0c3d1db241142ad72598823c5863","commit_message":"Cleanup wave 8: 2965 functions named across ten overlay continuations, arm9 graphics/logic/wifi, ov009 from the SDK symbol table and the ov137/170/172/186/119/209/217 tails; 61 files split into their originals; 98.99% of game code fully linked\n\n- Naming continuations (24 lanes): the ten sweep blocks ov210-215, ov181-199, ov203-207,\n  ov216-222, ov223-231, ov111-118, ov115-121, ov127-134, ov132-198 and ov175-195 are named and\n  their structs cleaned; the arm9 graphics, logic and wifi clusters, ov009 named from the SDK\n  symbol table (symbols_sdk.json), and the ov137, ov170, ov172, ov186, ov119, ov209 and ov217\n  continuations are advanced.\n- Names: 3,294 rename rows, 3,294 unique (address, region), 0 conflicts; 3,241 applied tree-wide\n  with tools/sdkrename.py, 53 refused (SDK-name collisions, the two ov009 static duplicates and\n  no-ops the lanes had already renamed in place). Two functions that had left the count during\n  the wave (ov009 getlocalhost and SBServerParseQR2FullKeysSingle) were restored in src/matched\n  and verify EXACT, so no function was lost.\n- Splits (SPLIT8, 61 new files): the ov203, ov204, ov212, ov215, ov127, ov115, ov121, ov118,\n  ov132 and ov195 overlays; the arm9 bmp, bmp_menu, bmp_menulist, bmp_oam, gf_font, g3d_util,\n  bg_sys, tcbl, mcss, mystery_data, touchpanel, msl_c_lib (ten-way), nns_fnd_unitheap and\n  bsubway_savedata pieces; the ica_anime/btl_setup game_data merge and the double3Ddisp into\n  billboard merge. ov118's header is renamed pokemontrade_demo_types.h. Seven cuts are deferred\n  with a reason (DEBT D-1501..D-1507).\n- Types: the shared headers the splits need; ov009 duplicate SDK prototypes reconciled; arm9 ISA\n  rows corrected to thumb where the image says thumb.\n- Files: src/game holds 1,208 .c files, 0 not exact; 35,520 functions, 0 missing, 0 doubled.\n- Fully linked: 98.99% of game code (2,607,034 of 2,633,560 bytes), 99.20% of all code\n  (3,363,602 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Files whole: 1,203 of\n  1,205 translation units (split 2). Names: 34,168 of 36,220 (brace parser), 2,052 still address\n  named; 0 unit_ files, 0 unplaced dirs, 0 placeholders.\n- Checks: gameverify 1,208 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0 doubled;\n  linkstats 243 regions, 0 failures; manifest --verify --force 28,050 shards, 0 removed, 0\n  rewritten, --check clean; selftest 363 cases, 0 failures; datagen 10,163 of 10,163; tucount\n  1,203 of 1,205.\n- Debt: 258 open items absorbed from the 23 non-debt wave 8 lanes, 2 rows closed by DEBT8 and 3\n  by C123g, and the 7 deferred SPLIT8 cuts added; DEBT.tsv is 1,507 rows. docs/gamegaps.py now\n  maps the member names of a merged unit shard, so renamed functions resolve again and the\n  regenerated docs/restructure/gamegaps.tsv drops the false gaps. README, docs/NAMING.md,\n  progress/report.json and the coverage maps are updated and LAUNCHQ.md is refreshed for wave 9.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3363602,"complete_code_percent":99.2015,"complete_data":0,"complete_data_percent":0,"total_units":1208,"complete_units":1203}},{"timestamp":"2026-10-15T09:11:56Z","commit_sha":"20e3d93dbfec13b294e303f52adcd5d5082d3521","commit_message":"Cleanup wave 7 follow-up: ISA comments in 41 matched records corrected to arm where the image says arm; two source files reverted to thumb","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3363602,"complete_code_percent":99.2015,"complete_data":0,"complete_data_percent":0,"total_units":1149,"complete_units":1144}},{"timestamp":"2026-10-15T07:19:13Z","commit_sha":"016c74e770f38f05357373ccdcfafd0d0a451967","commit_message":"Cleanup wave 7: tree fully restructured (0 unit_ files, 0 unplaced dirs, 0 placeholders), four sweep blocks plus ov095/122/131/174/176/177, arm9 graphics/logic/fs/wifi/msl, ov009 from the SDK symbol table, ov137/170/172/186/119 continuations; 98.99% of game code fully linked\n\n- Sweep blocks: ov095/122/131/174/176/177, ov181/182/184/194/196/197, ov199/203/204/205/206/207\n  and ov210/211/212/213/214/215 are restructured and named, plus ov216/218/219/220/221/222,\n  ov223/224/225/227/228/230/231 and the twl region. The last unit_ files, unplaced dirs and\n  placeholder files are gone: 0 unit_, 0 unplaced, 0 placeholders.\n- Boundaries: three anchor-confirmed splits in ov174, ov176 and ov177 finished the last file\n  boundaries; every file holds one original.\n- arm9: the graphics cluster (bg_sys, gf_font, ica_anime, bmp family, billboard, double3Ddisp,\n  spl_emitter, nns_g2d/nns_gfd/nns_g3d, gx, g3, fx), two logic groups, the filesystem (fs, card,\n  nvram, ncfg), wifi (dwc, wm, net, wih, wifilist) and msl_c_lib are cleaned and named.\n- ov009: the remaining files are named from the SDK symbol table (symbols_sdk.json); the\n  DWCi_HandleGPError collision and the DWCi_Acc_GetFlag_DataType rename are resolved.\n- Overlay continuations: ov137 (guru2 conversion), ov170 (box2 macro removal), ov172 (ctvt_comm),\n  ov186 (br_btn), ov119 (TradeRequest) and ov217/ov209 are advanced.\n- Names: 3,070 renames applied tree-wide from the lane maps plus 22 scoped POKETRADE rows; 127\n  refused (87 are ov170 no-ops, 18 real SDK-name collisions, the rest explained). 31,203\n  functions named, 5,017 still have address names (of 36,220; the counter now uses the brace\n  parser, so the wave 6 figure of 6,111 was an undercount).\n- Types: ov009 dwc_auth/dwc_http/socl_command get owner headers; ov116, ov127, ov174, ov176 and\n  ov177 get shared _types.h headers; ui.c byte 0x3E is frameCounter tree-wide.\n- Files: 1,149 files, 0 not exact; 35,520 functions, 0 missing, 0 doubled. 5,140 source and 1,737\n  manifest files changed by the rename apply.\n- Fully linked: 98.99% of game code (2,607,034 of 2,633,560 bytes), 99.20% of all code\n  (3,363,602 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Files whole: 1,144 of\n  1,146 (split 2).\n- Checks: gameverify 1,149 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0 doubled;\n  manifest check clean (28,050 shard files); selftest 363 cases, 0 failures; datagen 10,163 of\n  10,163; tucount 1,144 of 1,146.\n- Debt: 252 open items absorbed from the wave 7 lanes and 12 ov021 rows closed by DEBT7a;\n  DEBT.tsv is 1,232 rows. progress/report.json, the coverage maps, README and NAMING.md are\n  updated and LAUNCHQ.md is refreshed for wave 8.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3363602,"complete_code_percent":99.2015,"complete_data":0,"complete_data_percent":0,"total_units":1149,"complete_units":1144}},{"timestamp":"2026-10-15T03:44:19Z","commit_sha":"2f6b7c9e35ac9339392cb312616e6020619e1444","commit_message":"Cleanup wave 6: four small-overlay sweeps, ov094/ov119/ov123/ov135/ov137/ov170/ov172/ov186/ov208/ov209/ov217 and arm9 os, mi, heap, lib, save and sound clusters; 98.88% of game code fully linked\n\n- Small-overlay sweeps: ov111/112/117/118, ov115/116/120/121, ov127/128/129/132/133/134 and\n  ov173/178/179/183/185/198 are restructured, cleaned and named. 25 unit_ files and 19\n  unplaced dirs are cleared this wave.\n- Overlay continuations: ov094 btlv_input (20 Obj includes removed), ov119 (ParticleManager\n  unified), ov123 (gsync, 7 views folded into GsyncConn), ov135 (world trade), ov137\n  (guru2_main), ov170 (box2 retyped to BoxWork, 580 functions named), ov172 (ctvt), ov186\n  (br_proc_sys consolidated, 45 Obj includes gone), ov208 (zukan detail), ov209 (struct\n  ZukanList built, 38 Obj includes removed) and ov217 (research, 506 functions named).\n- arm9: the os, mi, heap, lib, save and sound clusters are cleaned and named. Shared headers\n  folded this wave: nns_fnd_types.h, nns_snd_types.h, snd_shared_types.h, dwc_svl_types.h,\n  namein_args.h, os_system_work_types.h and frame_list_params.h.\n- Names: 2,440 renames applied tree-wide from the lane maps; 26,175 functions and data\n  objects named in total, 6,111 functions still have address names (was 24,078 / 8,208).\n- Types: NNSiFndHeapHead, SndStrm/SndFader, SNDSharedWork, DWCSvlResult, NameInArgs,\n  OSSystemWork and FrameListParams each get one owner header; mb_parent.c is renamed to\n  mb_parent_sys.c.\n- Files: 1,150 files, 0 not exact; 35,520 functions, 0 missing, 0 doubled. unit_ files 51 to\n  26, unplaced dirs 54 to 35 (69 leaves), 33 placeholder ovNNN_func_ files left. 179 CRLF src\n  files converted to LF.\n- Fully linked: 98.88% of game code (2,603,962 of 2,633,520 bytes), 99.11% of all code\n  (3,360,548 of 3,390,676 bytes); 181 regions link byte-identical. Files whole: 1,179 of 1,181.\n- Checks: gameverify 1,150 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0\n  doubled; manifest verify then check clean (28,050 shard files); selftest 363 cases, 0\n  failures; datagen 10,163 of 10,163; tucount 1,179 of 1,181.\n- Added .gitattributes (`* text=auto eol=lf`) so the LF rule is enforced by git instead of\n  core.autocrlf.\n- Debt: 243 open items absorbed from the wave 6 lanes and 49 rows closed with evidence;\n  DEBT.tsv is 980 rows. progress/report.json, the coverage maps, README, NAMING.md and the\n  restructure tables are updated.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3360548,"complete_code_percent":99.1114,"complete_data":0,"complete_data_percent":0,"total_units":1150,"complete_units":1145}},{"timestamp":"2026-10-14T09:21:00Z","commit_sha":"30a49c5c5963e15c6003b1dcc95a0a0c703facc6","commit_message":"Cleanup wave 5: ov013, ov015, ov021 and ov010-ov014 unit files, ~25 small overlays, ov107 to ov217 overlays restructured and named; 98.65% of game code fully linked\n\n- Field and system overlays: ov013 (vct), ov015 (irc, irc_internal, ircnet), the ov021 unit\n  files (11 named scrcmd, event and field files) and the ov010 to ov014 unit files are\n  restructured, cleaned and named. About 25 small overlays and ITCM (mi_dma, os_irqhandler,\n  os_reset, scfg_proc) are done. ov101 to ov106 share their IR headers.\n- Network, trade and menu overlays: ov107 (libmb SDK files, mb_comm_sys), ov119 (pokemon trade,\n  6 files), ov123 (7 gsync and pdwacc files), ov125, ov135 (14 world trade files), ov136 (mail),\n  ov137 (guru2, 4 files), ov170 (box2 header), ov171 (dendou view), ov172 (14 ctvt, camera and\n  ssp files), ov180 (hall of fame), ov186 to ov188 (battle recorder), ov208 and ov209 (zukan\n  detail and list), ov217 (research, 11 files).\n- Types: ov094 btlv files are typed; the battle record and poke_tool types are unified in ARM9.\n- Names: 4,127 more functions and data objects named; 24,078 named in total, 8,208 functions\n  still have address names. unit_ files 160 to 51, unplaced files 102 to 53.\n- Tools: renamefile.py rolls back on a failed verify and has a selftest; gamelink.py uses a\n  per-run build directory and has a selftest; splitfile.py writes LF output and .c names and has\n  a selftest.\n- Manifest records, coverage maps, progress/report.json, README, NAMING.md and the restructure\n  tables updated.\n- Fully linked: 98.65% of game code (2,597,918 of 2,633,520 bytes), 98.93% of all code\n  (3,354,504 of 3,390,676 bytes); 181 regions link byte-identical. Files whole: 1,198 of 1,200.\n- Checks: gameverify 1,150 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0 doubled;\n  manifest check clean; selftest 363 cases, 0 failures; datagen 10,163 ok.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3354504,"complete_code_percent":98.9332,"complete_data":0,"complete_data_percent":0,"total_units":1150,"complete_units":1145}},{"timestamp":"2026-10-13T22:02:00Z","commit_sha":"6a6b6c60e1f374ce8ad3ad735973f3679c28c114","commit_message":"Cleanup wave 4: ov095 to ov106, ov110, ov114, ov175 restructured, refused merge groups resolved; 98.40% of game code fully linked\n\n- Battle overlay: ov095 is fully restructured into hand_field, hand_pos, hand_side, btlv_scd,\n  btl_sick, btl_id_sets, btl_pick_list, btl_pokeset, btl_wazarec, btl_deadrec and btl_pospoke.\n  The last ov093 unit files are merged into btl_client, btl_calc, btl_action_word, hand_tokusei\n  and btlv_scu. Handler names HAND_FIELD_, HAND_POS_, HAND_SIDE_ and BTL_SICK_ added.\n- Network and menu overlays: ov096 trainer AI on one work record with named fields and locals;\n  ov097 to ov106 (list, data converter, IRC compatibility, rhythm, result and ranking screens)\n  merged and named; ov099 Wi-Fi Club merged into wifi_club.c and wifi_club_actor.c on one work\n  record with a state enum; ov110 phrase input split into 9 files at the cuts found in the code\n  and named; ov114 HTTP, DWC and crypto code placed in 34 library-style files; ov175 sake, SC and\n  GDB code placed in 12 SDK object files.\n- Refused merge groups: all remaining groups in ARM9, ov009 and ov016 are merged (about 70\n  groups), including the NNS graphics and sound objects, DWC match and GameSpy code, and the ov016\n  scene files. ARM9 svc stubs are split into 17 files. All _Alt names are gone. Gimmick data and\n  script command names are set per module.\n- Names: 4,570 more functions and data objects named from lane tables and the SDK, with\n  library-style DWCi_ names for DWC internals; one wrong name (TCBL_IsDeletePending) fixed;\n  duplicate declarations removed from 53 files.\n- Tools: libmatch caches the SDK archive walk (checks on vendor files go from minutes to seconds),\n  restructure classify keys typedefs by their trailing name, gamelink prefers the local template\n  when it places identical rodata blobs. The sole-ref/self selftest fixture moved to an\n  undeclared address because 0x0209FB18 is a declared record table; selftest is now 363 cases,\n  0 failures.\n- Manifest records, coverage maps, progress/report.json, README and NAMING.md updated.\n- Fully linked: 98.40% of game code (2,588,448 of 2,630,598 bytes), 98.72% of all code\n  (3,347,284 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Files whole: 1,233 of\n  1,236.\n- Checks: gameverify 1,138 files, 0 not exact; gamecheck 35,520 functions, 0 missing, 0 doubled;\n  manifest check clean; selftest 363 cases, 0 failures.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3347284,"complete_code_percent":98.7203,"complete_data":0,"complete_data_percent":0,"total_units":1138,"complete_units":1132}},{"timestamp":"2026-10-13T18:13:43Z","commit_sha":"cb9a548c838f2abec3ff093a12fcc7d319520438","commit_message":"Cleanup wave 3: battle overlay finished, ov094 split into its original files, ov095 handlers; 98.30% of game code fully linked\n\n- Battle overlay ov093: the view and message code is merged into btlv_core and btlv_scu with one\n  shared BtlvCore record; btl_field is named; the ability, item and move handlers are merged into\n  hand_tokusei, hand_item, hand_waza and hand_common (HAND_COMMON_ for the shared helpers) with one\n  record set, one prototype header and one event key enum. About 700 more functions named.\n- ov094 is split into its 13 original files (btlv_stage, btlv_field, btlv_camera, btlv_effect,\n  btlv_effvm, btlv_mcss, btlv_clact, btlv_input, btlv_gauge, btlv_b_gauge, btlv_timer, btlv_bg,\n  btlv_finger_cursor), each cut confirmed by the file name strings in the code.\n- ov095 handlers: field, position and side effects are in hand_field, hand_pos and hand_side\n  with HAND_FIELD_, HAND_POS_ and HAND_SIDE_ names.\n- Gimmick overlays: 221 functions renamed per mechanism, 128 macros named, the shared gimmick\n  save header added; wrong cross-overlay names found by an audit were fixed (14 cases).\n- File names: unit files of ARM9, ov009 and ov016 renamed to the original or SDK object names,\n  using the real case of the SDK object names.\n- Tools: tools/splitfile.py added (splits one file at given addresses and keeps includes, headers\n  and layout in sync); renamefile, sdkrename and gamecheck improved.\n- Manifest records, coverage maps, progress/report.json, README and NAMING.md updated.\n- Fully linked: 98.30% of game code (2,585,832 of 2,630,598 bytes), 98.64% of all code\n  (3,344,432 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Files whole: 1,673 of\n  1,677.\n- Checks: gameverify 1,565 files, 0 not exact; gamecheck 35,519 functions, 0 missing, 0 doubled;\n  manifest check clean; selftest 363 cases, 1 known failure (sole-ref/self).","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3344432,"complete_code_percent":98.6361,"complete_data":0,"complete_data_percent":0,"total_units":1565,"complete_units":1558}},{"timestamp":"2026-10-13T14:40:02Z","commit_sha":"c5623337dbfde94eca7afe3526873413b2290a59","commit_message":"File names: 848 unit files renamed to their original or descriptive names\n\n- ARM9 (364 files), ov009 (185) and ov016 (299): unit_XXXXXXXX.c files take the name of the SDK or\n  vendor object they belong to (os_irqtable.c, os_spinlock.c, dwc_match.c, gt2main, qr2, ...), the\n  original name from the game's own anchors, or a descriptive module name. Consecutive units of one\n  object are merged into one file; includes, header guards, file lines and gamegaps paths follow.\n- Units that cannot merge (clashing prototypes, globals or types between members) keep one file\n  each, numbered in address order (nns_g3d_tex_1.c, ...). 69 groups were refused by the tool, 15\n  more merged but did not compile or match and were split back, and qr2 merged but changed the\n  ov009 link (data placement), so it was split back as well; 84 groups in all.\n- tools/renamefile.py: SDK and vendor object names are accepted as file names; an existing file can\n  take in neighbouring units by listing it as its own target. The generic libdwcutil main.c is\n  named dwcutil_main.c.\n- Counts: files whole 1,820 of 1,824; no figure moved (98.30% of game code, 98.64% of all code\n  fully linked; 181 of 243 regions link byte-identical).\n- Checks: gameverify 1711 files, 0 not exact; gamecheck 35,519 functions, 0 missing, 0 doubled;\n  manifest check clean; datagen 10,163 of 10,163 objects identical; selftest 363 cases, 1 known\n  failure (sole-ref/self). progress/report.json and README figures regenerated.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3344396,"complete_code_percent":98.6351,"complete_data":0,"complete_data_percent":0,"total_units":1711,"complete_units":1704}},{"timestamp":"2026-10-13T13:49:51Z","commit_sha":"54fe5e991eb6f8af493c56e49a5c624ef2a0d0c0","commit_message":"Cleanup wave 2: battle overlay, menu overlays, gimmick overlays, names from the SDK; 98.30% of game code fully linked\n\n- Battle overlay ov093: btl_main (merged from the old setup unit, 139 functions typed, BtlSide,\n  BtlSideSlot and BtlTrainerSlot records), btl_client, btl_server_flow (fields, statics, locals\n  and 16 flag casts cleaned) and btl_server_cmd named; the ability, item and move handlers are\n  split into hand_tokusei, hand_item and hand_waza files with one prefix per group\n  (HAND_TOKUSEI_, HAND_ITEM_, HAND_WAZA_) and one shared event key enum (BtlEventVarKey).\n  Move handler units found and named from the move registry (about 600 HAND_WAZA_ functions).\n- Menu and tool overlays: ov070 itemmenu, ov071, ov088 and ov091 pokelist finished (typed\n  work structs, named locals and data); item menu helper types unified.\n- Gimmick overlays ov030 to ov065: unplaced leaves merged, the gimmick table decoded, files\n  named for the mechanism they implement, GIMMICK table entries named.\n- Names: 1,276 more functions named from lane tables and the SDK, handler prefixes normalised,\n  SDK names that had leaked onto game functions replaced (24 cases).\n- SDK classification: 16 matched functions that carried SDK names by coincidence of a few\n  bytes are game code: their records and sources moved to the game side and the 7 overlay\n  placements dropped from layout/sdk_class.json (game bytes +120, SDK bytes -120).\n- Fixes found by the checks: one linker ISA row corrected from the image; two legacy matched\n  sources broken by renames (a data name replaced by a placeholder, one name used for two\n  views of one table) repaired and re-verified; tools/renamefile.py added (renames and merges\n  src/game files, keeps includes, headers and layout paths in sync).\n- Manifest records, coverage maps, progress/report.json and NAMING.md regenerated or updated.\n- Fully linked: 98.30% of game code (2,585,796 of 2,630,598 bytes), 98.64% of all code\n  (3,344,396 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Overlay game bytes\n  matched 2,183,286 of 2,183,302 (99.9993%). Files whole: 1,969 of 1,973.\n- Checks: gameverify 1860 files, 0 not exact; gamecheck 35,517 functions, 0 missing, 0 doubled;\n  manifest check clean; selftest 363 cases, 1 known failure (sole-ref/self).","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3344396,"complete_code_percent":98.6351,"complete_data":0,"complete_data_percent":0,"total_units":1860,"complete_units":1853}},{"timestamp":"2026-10-13T09:51:53Z","commit_sha":"0d50a9c2a9cb47ce9b0f9752e1f4a2ee49aa785c","commit_message":"Rename pass: 12,026 names applied from cleanup lane tables\n\n- Functions and data names taken from the cleanup lanes' rename tables and applied region by\n  region with tools/sdkrename.py (address-scoped, so one address in one overlay never renames the\n  same address in another). Source files, headers, standalone records and manifest entries all\n  carry the new names. ov021, ov093, ov010, arm9 and the one-file overlays hold most of them.\n- Two-name conflicts resolved by the lane that owns the file defining the function (106 cases);\n  171 conflicts and the ov093 handler prefix choices are left open, with the candidate names listed.\n- ov093 field-effect callback 0x021C4C40 now named BTL_SERVER_FLOW_OnFieldEffectExpired (it had\n  taken an SDK name by mistake).\n- Renames that would have broken a file were taken back: 27 rows where a file held two names for\n  one function with different prototypes, plus 11 per-file cases (data or function declared twice\n  under two names, header prototype clashes). Linker ISA tags of 201 callee rows were corrected\n  from the image (arm versus thumb).\n- Checks: gameverify 1911 files, 0 not exact; gamecheck 35,518 functions, 0 missing, 0 doubled;\n  manifest check clean; 181 of 243 regions link byte-identical; 98.13% of game code fully linked\n  (no figure moved); selftest 363 cases, 1 known failure.","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3339950,"complete_code_percent":98.504,"complete_data":0,"complete_data_percent":0,"total_units":1911,"complete_units":1904}},{"timestamp":"2026-10-13T08:33:31Z","commit_sha":"02072cf91257f43c28a5f844718e5b4deb7901e7","commit_message":"Cleanup wave 1, renames from SDK and lane tables, merged and split files; 98.13% of game code fully linked\n\n- Cleanup lanes (per-file struct views instead of per-function views, shared _types.h headers,\n  descriptive names for functions, types, fields, statics and locals), all files EXACT:\n  about 240 ARM9 files, ov009 to ov021 (net, delivery, field, fldmmdl, scrcmd, intrude, union room,\n  Entralink, C-Gear, field effects, tasks), the ov024 to ov065 one-file overlays, ov067 to ov092\n  tool and menu overlays, and the battle overlay ov093 (battle main, client, server and flow, event,\n  pokeparam, calc, setup headers).\n- Merges and splits at original file boundaries: ov070 itemmenu, ov071 monolith_tool, ov088\n  startmenu and save_control_intr, ov091 pokelist, ov093 btl_* files, ov021 field files (field_menu,\n  field_task, bsubway_scr split into seven), ov012 union_comm, ov010 eventdata_system parts; stale\n  unit_* files and unplaced leaves deleted.\n- Renames: SDK and library names given to functions across regions (tools/sdkrename.py,\n  region-scoped), GFLNetModeOps slots named from the device tables, ov013 voice-chat code named.\n- SDK classification: four ov013 matches (80 bytes) were rejected as SDK; they are game code.\n- Fixes found by the checks: the standalone record for WMi_GetSystemWork named its function from the\n  file name (function: line added); AREAMAN_MarkUsed needed a symbols row for AREAMAN_TraceByte; two\n  comments named a person.\n- Manifest records, gamegaps.tsv, split_tus.tsv, coverage maps and progress/report.json regenerated.\n- Fully linked: 98.13% of game code (2,581,230 of 2,630,478 bytes), 98.50% of all code\n  (3,339,950 of 3,390,676 bytes); 181 of 243 regions link byte-identical. Overlay game bytes\n  matched 2,183,108 of 2,183,182 (99.9966%). Files whole: 2,047 of 2,051.\n- Checks: gameverify 1911 files, 0 not exact; gamecheck 35,519 functions, 0 missing, 0 doubled;\n  selftest 363 cases, 1 known failure (sole-ref/self).","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3339950,"complete_code_percent":98.504,"complete_data":0,"complete_data_percent":0,"total_units":1911,"complete_units":1904}},{"timestamp":"2026-10-13T02:57:50Z","commit_sha":"7d691b20e628f6c86f81bed661d0b7e4f067fa07","commit_message":"Cleanup wave 1 batch, SP3 splits, tool address lookup, SDK reclassification; 97.66% of game code fully linked\n\n- Cleanup lanes (struct views to per-file structs, names, shared _types.h headers), all files EXACT:\n  arm9 backup_system, bmp, clact, g3d_system, ica_anime, mcss, mystery_data, particle, pokeparty,\n  procsys, ringtone_sys, save_control, systemfont, tcbl, textprint, time_icon, wifilist, wih_dwc,\n  zonedata, pm_voice, gfl_use, net_* and about 60 arm9 unit files; ov000-ov008 event files;\n  ov009 unit files and dwc_rap; ov010 delivery_beacon and scrcmd_proc; ov021 fldmmdl rail files.\n- SP3 certain splits committed with their parents: flash_access, savedata, msgdata, codein_param,\n  poke_regulation, g3d_util, poke_tool, net, ui_p02, touchpanel, net_handle, net_command,\n  net_system, ov014 net_whpipe_p02, ov021 field_3dbg_p01, field_msgbg_p02, fldmmdl_g3dobj,\n  fldmmdl_rail, fldmmdl_rail_move, field_rail_loader, ov101 irc_compatible, ov121 mystery_album.\n- ov009 gstats.c replaces three unit files (GS1); ov119/ov120 data moves (DX1/DX3).\n- Veneer rule: 12-byte stubs with an even pool word are code (tools/disasm.py, 14 callers renamed).\n- Tools: fnaddr.py resolves functions by address whatever their name (gamecheck, linkstats,\n  progress_report, coveragemap, worklist, ovstats, placeholders, restructure, sdkrename, match);\n  gamelink/datagen data mode; worklist credits SDK labels inside a matched SDK routine.\n- SDK classification: 158 ARM9 functions in NitroSDK, NitroSystem and DWC objects (9,192 bytes)\n  move from game to SDK (layout/sdk_class_extra.json, tools/sdkclass.py). Game code total\n  2,639,652 -> 2,630,460 bytes; ARM9 game bytes 443,828 -> 436,032 by the worklist measure.\n- Fully linked: 97.66% of game code (2,568,780 of 2,630,460 bytes), 98.14% of all code;\n  181 of 243 regions link byte-identical. The rise from 89.64% is mostly ov093 (214,314 bytes),\n  which now links; the old figure was measured before it did.\n- docs/restructure/split_tus.tsv: drop the stale ov009 unit_021573C4 row (one file now).","measures":{"fuzzy_match_percent":100,"total_code":3390676,"matched_code":3390676,"matched_code_percent":100,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35145,"matched_functions_percent":100,"complete_code":3327518,"complete_code_percent":98.1373,"complete_data":0,"complete_data_percent":0,"total_units":1808,"complete_units":1798}},{"timestamp":"2026-10-13T00:15:42Z","commit_sha":"b02f92d774de214460e15956899a57afd3daa1ce","commit_message":"Phase end: hidden functions, twl one file per SDK object, ARM9 links from objects; 89.64% of game code fully linked\n\nMatched code: overlays 2,183,148 of 2,183,164 game bytes (99.9993%) and\n563,740 of 563,740 SDK bytes; ARM9 443,820 game bytes and 140,610 of 140,610\nSDK bytes; twl 48,976 of 48,976 SDK bytes. Fully linked (tools/linkstats.py,\ncode in whole all-exact files linked by mwldarm from our objects into a\nbyte-identical region): 89.64% of game code, 90.95% of all code; 180 of 243\nregions link with every file, ARM9 static image included.\n\nMain parts:\n- asm-to-C conversions of the remaining asm bodies, and register-mismatch\n  closures (layout/register_mismatch.txt, tools/regmismatch.py)\n- twl: one C file per SDK object (48 files: camera_*, dsp_*, nwm_*, aes_*,\n  fatfs_*, mi_ndma*, micex, pm, sndex, ...) with the vendor names\n  (tools/sdkrename.py, docs/restructure/twl_vendor.tsv, twl_objects.tsv);\n  false starts 0x027028E8 and 0x0270745C removed, duplicate entries dropped\n- SDK name fixes tree-wide and twl rows in layout/symbols_sdk.json; the\n  0x021A8E14 EL_GetLibSize hit is a function tail, not a function: retired\n- listings regenerated with the new disassembler and function starts,\n  switch tables included\n- hidden functions: about 240 new starts from pointer tables and call\n  targets (layout/function_starts.txt), matched in src/matched and filed\n  in src/game; crt0 microcode words are data now\n- placeholder class: tools/placeholders.py, ovstats/worklist/coveragemap\n  count empty sources as unmatched (0 placeholders)\n- checker fixes: gameverify checks runtime-kind files per function,\n  match.py compare() returns EMPTY for 0-byte compiles, loaded_overlay_ids\n- whole files: ARM9 425 of 425, 1,958 of 1,963 overall; ov009, ov016,\n  ov021, ov107 and the ARM9 static image link byte-identical\n  (tools/gamelink.py, tools/twllink.py)\n- decomp.dev progress report (tools/progress_report.py, progress/report.json,\n  .github/workflows/progress.yml)\n- coverage maps and both README figures refreshed; personal paths and names\n  removed from tracked files; .gitignore guard rules for asset formats\n\nChecks: manifest 33,541 entries (27,088 EXACT, 6,453 EXACT*), --check clean;\ngameverify 1,976 files 0 not exact before the cleanup lanes started;\ngamecheck 35,528 functions, 0 missing, 0 doubled; placeholders 0;\nselftest 371 cases, 0 failures.\n\nprogress/report.json was generated while two in-flight cleanup edits (arm9\nbmp_menulist.c, ov093 btl_server.c) broke those links, so its complete_code\n(64.77%) is lower than the linkstats figure above; the next commit\nregenerates it. Files that cleanup and split lanes were editing are left\nfor the next commit.","measures":{"fuzzy_match_percent":99.9887,"total_code":3390676,"matched_code":3390292,"matched_code_percent":99.9887,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":35145,"matched_functions":35122,"matched_functions_percent":99.9346,"complete_code":2196104,"complete_code_percent":64.7689,"complete_data":0,"complete_data_percent":0,"total_units":1807,"complete_units":1111}}]