[{"timestamp":"2026-10-28T21:23:48Z","commit_sha":"afc99703f3b6de8822641c07a729cc9cdc60b702","commit_message":"README status after the combined pass (5,279 of 7,117)","measures":{"fuzzy_match_percent":51.252823,"total_code":2783000,"matched_code":1395544,"matched_code_percent":50.14531,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5279,"matched_functions_percent":74.174515,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T19:42:04Z","commit_sha":"0598b91d1c893e7c0d811b25441064ac168ab1a2","commit_message":"Take fn_80087074 back out (it needed a call-site cast on fn_8008210C); progress notes and README status at 5,243 of 7,117","measures":{"fuzzy_match_percent":50.046337,"total_code":2783000,"matched_code":1361948,"matched_code_percent":48.938126,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5243,"matched_functions_percent":73.668686,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T18:47:14Z","commit_sha":"0eb3420b626ace6cf7166a9e36872d6eb8ac8d0b","commit_message":"Progress notes and README status after the third Batch 15 merge round (5,235 of 7,117)","measures":{"fuzzy_match_percent":49.5131,"total_code":2783000,"matched_code":1347108,"matched_code_percent":48.40489,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5235,"matched_functions_percent":73.556274,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T18:16:44Z","commit_sha":"5f1360b60de4b3b57481439eb3958b11cb37de1e","commit_message":"Progress notes and README status after the second Batch 15 merge round (5,230 of 7,117)","measures":{"fuzzy_match_percent":49.235126,"total_code":2783000,"matched_code":1339372,"matched_code_percent":48.12691,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5230,"matched_functions_percent":73.486015,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T17:41:26Z","commit_sha":"15fa5c67415062e1d1f969836721fd401a19fe3a","commit_message":"README status after the batch 15 merges (5,217 of 7,117)","measures":{"fuzzy_match_percent":48.473503,"total_code":2783000,"matched_code":1318176,"matched_code_percent":47.36529,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5217,"matched_functions_percent":73.30336,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T08:53:28Z","commit_sha":"4986d5ef9111ef840893582bdf1b588676f2fe90","commit_message":"Record the batch 14 results (976 bytes and up) in progress.md","measures":{"fuzzy_match_percent":48.102104,"total_code":2783000,"matched_code":1307840,"matched_code_percent":46.99389,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5155,"matched_functions_percent":72.432205,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T07:23:38Z","commit_sha":"2d09f92ba72aa977fec23003c4876e3465fa3a24","commit_message":"Progress notes: the held-back unification is paused after pass 3","measures":{"fuzzy_match_percent":47.512814,"total_code":2783000,"matched_code":1291440,"matched_code_percent":46.404602,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5145,"matched_functions_percent":72.291695,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T04:32:28Z","commit_sha":"305678050c28d725daac3a8ee4f65b247ab47ea9","commit_message":"Update the README status for the combined Ninja, EvObj and ring-menu/ending passes (5,124 of 7,117)","measures":{"fuzzy_match_percent":46.579433,"total_code":2783000,"matched_code":1265464,"matched_code_percent":45.47122,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5124,"matched_functions_percent":71.99663,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T02:44:45Z","commit_sha":"31e3b44fafbe2e7da99782810500bc39e7e468cf","commit_message":"Merge 14 held-back 632-byte matches by unifying their units' types (5,096 of 7,117)\n\nOne character task table and work type in unit_80005B50.c, task.h's Task for the task\nviews in unit_80055E94.c, one battle-slot task in unit_80074D9C.c and unit_8008B4A0.c,\na typed field-map object for lbl_80347450 in unit_800B2DA0.c and one archive reader in\nunit_801C5A60.c; fn_8003529C takes (f32 frame, u8 mode) like its siblings. The other\neleven are recorded in docs/progress.md with what blocks them.","measures":{"fuzzy_match_percent":45.816082,"total_code":2783000,"matched_code":1244220,"matched_code_percent":44.70787,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5096,"matched_functions_percent":71.6032,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T01:56:03Z","commit_sha":"553e98501e9df2e0dc5de91e7cbca80fb232cbc4","commit_message":"Call rand by its real name in the new wave-2 functions","measures":{"fuzzy_match_percent":44.63951,"total_code":2783000,"matched_code":1211476,"matched_code_percent":43.5313,"total_data":658516,"matched_data":109080,"matched_data_percent":16.564518,"total_functions":7117,"matched_functions":5023,"matched_functions_percent":70.57749,"complete_code":347420,"complete_code_percent":12.48365,"complete_data":205192,"complete_data_percent":31.15976,"total_units":272,"complete_units":168}},{"timestamp":"2026-10-28T00:37:25Z","commit_sha":"19a3440f217fc87cb9a07d66693cb36fb956dfe5","commit_message":"Type the menu texlists, shop layout tables, part tasks and save menu task; merge the last six shop functions (4,466 of 7,116)\n\nmenu_sprites' texlists are NJS_TEXLIST *, UiLayoutDraw/UiLayoutDrawPart take\nconst LayoutPart * (declared once in sprite.h; both now match in uiobj.c), and\n50 of the shop unit's .rodata tables are LayoutPart/LayoutDef data (byte-identical),\nso the draw calls need no casts. The cursor/arrow panel tasks fold into ShopPart,\nShopList and ShopSub38; the save menu's work is one SaveWork behind SaveTask.\n\nMerged: fn_801AC48C, fn_801AC678, fn_801B6950, fn_801B0B9C, fn_801A53D4,\nfn_8019F898.","measures":{"fuzzy_match_percent":39.71516,"total_code":2782996,"matched_code":1075012,"matched_code_percent":38.627865,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4466,"matched_functions_percent":62.75998,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-28T00:20:23Z","commit_sha":"3e282facba1799e5347d92a7633017c1fe3ee7db","commit_message":"One shop panel, part-work and shop-task type in unit_80199B9C.c; merge 14 functions (4,458 of 7,116)\n\nMenuPanel (0x6C) replaces 23 per-function views of the menu part panel and the\nUiObj pointers to it; MenuPartWork (0x58) replaces four views of the part's work;\nlbl_803471B8 is the ShopTask (party records, sell lists, parts) instead of\nGame_UNIT, ShopParty and four cast views; lbl_80311A60 is PadState *[].\nUiObj names f38/f3c. Every function in the unit passes fdiff and floatcheck.\n\nMerged: fn_801AD00C, fn_801B057C, fn_801B06CC, fn_801B0838, fn_801B46EC,\nfn_801B4CF0, fn_801AFD34, fn_801B0014, fn_801B5644, fn_801B571C, fn_801B914C,\nfn_801BE17C, fn_801BE2F0, fn_801A20AC.","measures":{"fuzzy_match_percent":39.627583,"total_code":2782996,"matched_code":1072124,"matched_code_percent":38.524094,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4458,"matched_functions_percent":62.647556,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-27T23:41:32Z","commit_sha":"87dcbbd693f88eff227d676ae5629cddc29f67a8","commit_message":"Name the save and stat header fields fn_80077228 and fn_801EF7E0 use; merge both (4,444 of 7,116)","measures":{"fuzzy_match_percent":39.374763,"total_code":2782996,"matched_code":1065088,"matched_code_percent":38.27127,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4444,"matched_functions_percent":62.450813,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-27T23:12:19Z","commit_sha":"e7a617a7bd18352b152493b0c2294d656c099fe4","commit_message":"Merge 13 more held-back isolated matches into their units (4,442 of 7,116)\n\neffect.c, unit_80005B50.c, unit_8014F970.c, unit_8015DC6C.c, unit_801C5A60.c,\nunit_801F5334.c and unit_80219378.c take the real struct fields and prototypes\nthese functions use. The candidates that needed casts, byte offsets or a second\nview of a global stay out; progress.md lists them.","measures":{"fuzzy_match_percent":39.33998,"total_code":2782996,"matched_code":1064120,"matched_code_percent":38.23649,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4442,"matched_functions_percent":62.42271,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-27T23:01:03Z","commit_sha":"f38ef315829f8ecaf3a65904c3e7985f64b9ebde","commit_message":"Merge four held-back isolated matches into their units (4,429 of 7,116)\n\nunit_80055E94.c: fn_80068E20, fn_80068F68 and fn_800683D8 (lbl_802AD440 is not\nconst; T24, WorkRec and T30 take the fields they use). unit_80199B9C.c:\nfn_801BE468. Notes on the rest and on tasks.c's fn_8003DCF4 in progress.md.","measures":{"fuzzy_match_percent":39.1642,"total_code":2782996,"matched_code":1059228,"matched_code_percent":38.06071,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4429,"matched_functions_percent":62.24002,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-27T22:52:41Z","commit_sha":"a8d8e71b9e7e3ab2d1492fff0a80f97161ce9921","commit_message":"Link gp_check.c (0x801D1AE8-0x801D24D0): display setup and the GP hang check\n\nAll ten functions match with -str reuse,readonly -inline noauto,deferred, including\nfn_801D1B28, fn_801D1ED4, fn_801D22CC and fn_801D2414, which no pass had tried.\nIts .rodata, .data, .sbss and .sdata2 come from C. The rest of the old unit is\nunit_801D24D0.c. unit_80055E94.c builds with -str reuse,readonly: every string it\nuses is in .rodata or .sdata2. 4,425 of 7,116 functions.","measures":{"fuzzy_match_percent":39.10958,"total_code":2782996,"matched_code":1057708,"matched_code_percent":38.006092,"total_data":658516,"matched_data":98540,"matched_data_percent":14.963949,"total_functions":7116,"matched_functions":4425,"matched_functions_percent":62.183807,"complete_code":241908,"complete_code_percent":8.692359,"complete_data":186976,"complete_data_percent":28.39354,"total_units":258,"complete_units":118}},{"timestamp":"2026-10-27T22:36:14Z","commit_sha":"263b6c87639897c61e7fcc0df876b46ab7ac804e","commit_message":"Opus pass over the remaining near misses under 632 bytes: 17 more functions merged (4,416 of 7,116)","measures":{"fuzzy_match_percent":39.03139,"total_code":2782996,"matched_code":1055532,"matched_code_percent":37.927902,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4418,"matched_functions_percent":62.085445,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T21:51:19Z","commit_sha":"e06594f7bb766bf82dd89ca64a77123ff4e6eed5","commit_message":"Record fn_8013AD9C as a near miss; document MWCC's inline budget and colouring order","measures":{"fuzzy_match_percent":38.88148,"total_code":2782996,"matched_code":1051360,"matched_code_percent":37.777992,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4401,"matched_functions_percent":61.846542,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T19:57:28Z","commit_sha":"2e5cf99bccc3e0b74f69e0896a82393ba905ad57","commit_message":"effect.c: fn_8004CF14 converts the degree angles with 182.04445f; text.c: the depth is -1.0699999f\n\nfn_8004CF14 built its rotation from 255.0f * w->a, which fdiff cannot see: the original\nmultiplies by 182.04445f (0x10000 / 360) and passes the result as Angle rot[3].\ntext_state.z is 0xBF88F5C2 in the original; -1.07f rounds to 0xBF88F5C3.\nBoth found by floatcheck; every matched game function now passes it.","measures":{"fuzzy_match_percent":38.695496,"total_code":2782996,"matched_code":1046184,"matched_code_percent":37.592007,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4400,"matched_functions_percent":61.83249,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T19:34:39Z","commit_sha":"51647d48186042fede62b1a3d324294c1de71ee7","commit_message":"Match fn_800631B0; record fn_80141610 as a near miss\n\nfn_800631B0 (6.4 KB, a battle action in unit_80055E94.c) matches; the\nunit now includes <math.h>. Its camera work (lbl_80346BD8) is the\nunit's own G800624FC, extended with the fields it uses. fn_80048DF0\ntakes a fourth argument (every caller passes 0), fn_80012F24 returns\ns32, fn_800177C0 is f32 (s32, f32 *). fn_80141610 (the party-member\nmenu, unit_8013D400.c) is 15 lines off with registers masked; its\nmessages come through a pooled .rodata base the unit doesn't define yet.","measures":{"fuzzy_match_percent":38.695496,"total_code":2782996,"matched_code":1046184,"matched_code_percent":37.592007,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4400,"matched_functions_percent":61.83249,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T19:02:15Z","commit_sha":"3a01076eb6b42bdb6e857281412973d7c1e3bdd0","commit_message":"Record fn_801B7624 and fn_800E4644 as near misses; type the result screen's work\n\nfn_801B7624 (the shop's sell screen) is a near miss: 31 lines against the\nunit, 14 (one register swap) with fn_801B93E8 returning s16 and\nfn_801B8F48 taking a u16 id. fn_801B11EC and fn_801B8F48 itself need s32\nand s16, so the unit keeps those; the conflict is noted in matching.md.\nfn_801B94F0/fn_801B952C are inline. fn_800E4644 (the battle result\nscreen) is exact with registers masked, 130 lines of register numbers;\nlbl_80346DCC's work is typed in the unit. Every matched function in both\nunits still matches; main.dol: OK.","measures":{"fuzzy_match_percent":38.464664,"total_code":2782996,"matched_code":1039760,"matched_code_percent":37.361176,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4399,"matched_functions_percent":61.81844,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T15:02:06Z","commit_sha":"633ffdf8a754d05bfdaa5f6f0f020658eb8a5f33","commit_message":"progress.md: 73 left in list C","measures":{"fuzzy_match_percent":38.464664,"total_code":2782996,"matched_code":1039760,"matched_code_percent":37.361176,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4399,"matched_functions_percent":61.81844,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T14:13:28Z","commit_sha":"9d0af11e7db2ae969d2023db715c9e5dab01e1b1","commit_message":"Record fn_801BA9CC, fn_801BE608, fn_8013A538 and fn_8013A8FC as near misses\n\nfn_801BA9CC (6.8 KB, the guild's discoveries window) compiles to 1712\nof 1713 instructions with 11/10 lines differing when registers are\nmasked; the register numbering is mostly the task and the status\nwindow's part swapping r29/r31. fn_801BE608, the guild-rank test, is an\n`inline` function: inlined into it and emitted out of line at the end\nof the file; 12 lines of two volatile registers.\n\nfn_8013A538 (10 lines) and fn_8013A8FC (74 lines, 2 of them\nscheduling) share the party helpers that fn_8013AD9C (9.8 KB) inlines.\n\nTypes only in the units: ShopWork.b36; Member b1e/b1f/b20 and Party b11\nin unit_8012F6C4.c. Every matched function in both units still matches.\nSources in docs/near/, findings in docs/matching.md and progress.md.","measures":{"fuzzy_match_percent":38.125317,"total_code":2782996,"matched_code":1030316,"matched_code_percent":37.021828,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4363,"matched_functions_percent":61.31253,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T11:14:43Z","commit_sha":"9963a585f03b7229ff4b1106383e942a7dcc472c","commit_message":"One script-command type for the script handlers: 55 more functions merged (4,363 of 7,116)\n\nunit_801F5334.c's 104 private views of the running script command are now one\nScpt record (cursor union at 0x1c, work union at 0x30), which is also the\nevent slot at lbl_8030CEA0.x10. Work blocks start with the message head they\npost (EvHead, Ev), so fn_80211058 and fn_802110E8 take (Scpt *, ..., Ev *)\nand (Scpt *, ..., EvHead *). Actor, SeqReq, the command table, the screen\nfade, camera paths and more Work8030CEA0/SaveData fields are typed. Six\nwaiting functions stay out, blocked by prototypes their callers see\ndifferently (docs/progress.md).","measures":{"fuzzy_match_percent":38.125317,"total_code":2782996,"matched_code":1030316,"matched_code_percent":37.021828,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4363,"matched_functions_percent":61.31253,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T10:14:21Z","commit_sha":"85ca83c9236eab59ed3dddb5cd9c69fa2aeecbfa","commit_message":"Record the isolated-match merge pass: 46 merged (4,308 of 7,116), 424 left by root cause","measures":{"fuzzy_match_percent":37.366425,"total_code":2782996,"matched_code":1009196,"matched_code_percent":36.26293,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4308,"matched_functions_percent":60.539627,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T09:40:56Z","commit_sha":"1b9138642cd79a6d4c1633805594fcdef4c5b31f","commit_message":"Opus pass over all near misses under 632 bytes: 137 more functions merged (4,262 of 7,116); record the batch","measures":{"fuzzy_match_percent":36.866386,"total_code":2782996,"matched_code":995280,"matched_code_percent":35.762897,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4262,"matched_functions_percent":59.893196,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T09:32:49Z","commit_sha":"6b7cfdc59999a9197c8ce237214ffe9245479ba1","commit_message":"Match fn_801B1B3C: UiLayoutDrawPart takes its index last\n\nUiLayoutDrawPart is (texlists, parts, count, pos, z, a, b, u16 index).\nThe registers are the same either way, but callers evaluate their\narguments in order, so the original loads the index last. That was the\nopen scheduling difference in three shop functions. The prototype is\nfixed in uiobj.c, unit_80199B9C.c and unit_801BEB10.c; nothing that\nmatched changes.\n\nfn_801B1B3C (the shop's top menu panel) now matches and is in the unit;\nfn_801B94F0 returns s32 (it returns sum != 0 and this caller compares\nit signed). fn_801B02F4 goes from 26 to 6 lines (registers exact,\nreading state through the Task parameter as fn_801ACE70 does; the\noriginal schedules the .rodata base lis before the switch's lbz) and\nfn_801B28D4 from 228 to 220. Unit: 155 of 247, counting the three\nfunctions the near-miss merges added.","measures":{"fuzzy_match_percent":36.431744,"total_code":2782996,"matched_code":983184,"matched_code_percent":35.32826,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4236,"matched_functions_percent":59.527824,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T07:07:17Z","commit_sha":"72dafaec564e6006129490b7ac148cfd77afb807","commit_message":"Merge 79 more functions of 329-631 bytes (script handlers, battle and task helpers); widen Work8030CEA0, untyped script/work parameters for fn_80211058/fn_802110E8; record the batch","measures":{"fuzzy_match_percent":35.73336,"total_code":2782996,"matched_code":963748,"matched_code_percent":34.62987,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4124,"matched_functions_percent":57.953907,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T06:13:06Z","commit_sha":"d867e5e16c38a909f51fe0280e89ab53944874d6","commit_message":"Match fn_801B11EC (the shop's item window); log fn_801B02F4, fn_801B0B9C and fn_801B1B3C as near misses and refresh fn_801B28D4\n\nUiDrawNumberText takes (x, y, value, flags); fn_801F4AE4 returns the item name; Game_UNIT gets the ShopSelOwner view fn_801B93E8 needs.","measures":{"fuzzy_match_percent":34.486504,"total_code":2782996,"matched_code":929048,"matched_code_percent":33.383015,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4045,"matched_functions_percent":56.843735,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T05:59:02Z","commit_sha":"7f067a816f265ca114c00cc069f797c0b4a4bd8e","commit_message":"Record the structural pass: shared camera/save/stat structs, 26 more functions, what stays unmerged","measures":{"fuzzy_match_percent":34.407883,"total_code":2782996,"matched_code":926860,"matched_code_percent":33.304398,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4044,"matched_functions_percent":56.829678,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T05:39:50Z","commit_sha":"e18d386d2e6c6a97661ef27e82cb88e856a1cb54","commit_message":"Define unit_80199B9C.c's .rodata in C; record fn_801B28D4 as a near miss\n\nThe unit now defines the original file's .rodata (0x802B6A18-0x802B8EDC)\nat its top, generated by tools/match/gen_rodata.py: byte-exact, every\nobject at its original offset, and all 150 matched functions still\nmatch. Six functions read this data through the section base and could\nnot come out right without it. rodata_80199B9C.py now types the layout\ntables lbl_802B717C and lbl_802B719C and prints whole floats plainly.\n\nfn_801B28D4 (6.7 KB, the equip/compare window) compiles to the same\n1673 instructions; 31 lines are scheduled differently and 119 differ in\nregister numbers, so it stays out of the unit, with its source in\ndocs/near/ (it includes the unit, so plain fdiff works on it).","measures":{"fuzzy_match_percent":34.186825,"total_code":2782996,"matched_code":920708,"matched_code_percent":33.083336,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4018,"matched_functions_percent":56.46431,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T05:13:12Z","commit_sha":"39c4492e9a085a7f2e3a029f4ed4a751fdb04b1c","commit_message":"Hand-merge 22 of the tier 3 type-clash functions: shared Cmd/Obj10A/ChrRec/Work8030CEA0 fields instead of per-function copies; record what stays unmerged","measures":{"fuzzy_match_percent":34.186825,"total_code":2782996,"matched_code":920708,"matched_code_percent":33.083336,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":4018,"matched_functions_percent":56.46431,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T03:38:04Z","commit_sha":"fb34d158d4a30dd90ece6ccf669d9a091bf11e0d","commit_message":"Merge 68 more matched functions that clashed with their units; one shared struct for lbl_8030CEA0, real prototypes and per-unit struct unification instead of casts; record what stays unmerged","measures":{"fuzzy_match_percent":33.12078,"total_code":2782996,"matched_code":891040,"matched_code_percent":32.017292,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3899,"matched_functions_percent":54.792015,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T03:09:34Z","commit_sha":"72a84e40cb7589fb7b37ca45c704313c971205ba","commit_message":"Match fn_801A6BDC, the 16.6 KB shop buy/equip state machine\n\n27 states covering the shop's item list, quantity and gold countdown, and\nthe equip-now prompt with the weapon, armor and accessory comparison\nwindows; 4,149 instructions, fdiff clean over the whole unit.\n\nStat gains the fields the shop uses (0x1568, 0x1580, 0x158A) inside its\npadding; fn_801F4C24 returns s32; docs/matching.md covers what large\nfunctions need under MWCC.","measures":{"fuzzy_match_percent":32.85143,"total_code":2782996,"matched_code":883544,"matched_code_percent":31.747944,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3831,"matched_functions_percent":53.836422,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-27T03:06:53Z","commit_sha":"8a66a5eb6eac0ebf7627f3dc47369a5309f93aee","commit_message":"Match 106 more never-tried functions under 200 bytes; record the 98 that clash with their units and the near misses","measures":{"fuzzy_match_percent":32.255096,"total_code":2782996,"matched_code":866948,"matched_code_percent":31.151608,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3830,"matched_functions_percent":53.822372,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T23:35:45Z","commit_sha":"bfd26a1285eef194027cd48f3f3498546afe197e","commit_message":"Merge 28 matched functions that clashed with their units; shared structs for the battle/system globals, real prototypes instead of casts; record what stays unmerged","measures":{"fuzzy_match_percent":31.859837,"total_code":2782996,"matched_code":855948,"matched_code_percent":30.756351,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3724,"matched_functions_percent":52.33277,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T22:51:02Z","commit_sha":"ab5efcde19863e0f102ebc247e066da9103eded4","commit_message":"Merge 25 more near-miss functions; record the 200-399 byte pass","measures":{"fuzzy_match_percent":31.189337,"total_code":2782996,"matched_code":837288,"matched_code_percent":30.08585,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3696,"matched_functions_percent":51.93929,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T22:42:17Z","commit_sha":"00ea4fadc07de2818ad9ba404db87803af2b3df0","commit_message":"Match 83 more near-miss functions (200-399 byte pass); add the SDK s16/u16 fast-cast inlines","measures":{"fuzzy_match_percent":30.927605,"total_code":2782996,"matched_code":830004,"matched_code_percent":29.824118,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3670,"matched_functions_percent":51.57392,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T21:43:33Z","commit_sha":"a495634bd8bc53a634760a931b024309d7d6e2e0","commit_message":"Merge 15 matched near-miss functions that had type clashes with their units","measures":{"fuzzy_match_percent":30.062494,"total_code":2782996,"matched_code":805928,"matched_code_percent":28.959005,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3587,"matched_functions_percent":50.407536,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T21:34:04Z","commit_sha":"ae9ab5da2b6356bb8eb3f80fd104c5d135eb5598","commit_message":"Match 76 more game functions of 632 bytes and up (batch 11); record near misses and held-back matches","measures":{"fuzzy_match_percent":30.010607,"total_code":2782996,"matched_code":804484,"matched_code_percent":28.90712,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3570,"matched_functions_percent":50.168633,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T21:32:06Z","commit_sha":"fc450850520312b2d4e3df602945eec90d2a3ebf","commit_message":"Move the SDK fast-cast inlines into OSFastCast.h instead of a scratch include","measures":{"fuzzy_match_percent":28.06134,"total_code":2782996,"matched_code":750236,"matched_code_percent":26.957855,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3494,"matched_functions_percent":49.10062,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T20:19:56Z","commit_sha":"0a8149bdb74629c50ec41336dcfe0f5bf726d44b","commit_message":"Name sound.c functions, voice slot and sound state fields; add comments","measures":{"fuzzy_match_percent":27.804573,"total_code":2782996,"matched_code":742496,"matched_code_percent":26.679737,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3402,"matched_functions_percent":47.807755,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T18:54:15Z","commit_sha":"05d90b2211de1ea08d7aa7000e8ab1ee65b788df","commit_message":"Link sound.c; split tasks.c into chunklist.c and tasks.c with exact data layout\n\nThe original built these files with -inline deferred and -str reuse,readonly:\nfunctions come out in reverse source order, local array initialisers ahead of\nevery string. sound.c is rewritten bottom-up and links (main.dol identical).\ntasks.c was two files (the 4-byte .data gap is alignment); both are ready to\nlink once four near-miss functions match. Document the finding.","measures":{"fuzzy_match_percent":27.804573,"total_code":2782996,"matched_code":742496,"matched_code_percent":26.679737,"total_data":658516,"matched_data":97820,"matched_data_percent":14.854613,"total_functions":7116,"matched_functions":3402,"matched_functions_percent":47.807755,"complete_code":239372,"complete_code_percent":8.601234,"complete_data":186176,"complete_data_percent":28.272053,"total_units":253,"complete_units":117}},{"timestamp":"2026-10-26T18:04:28Z","commit_sha":"279afe1ec6d24c23a37c380c665f2e2cc1867774","commit_message":"Match six more near-miss functions; record the partials batch","measures":{"fuzzy_match_percent":27.804556,"total_code":2782996,"matched_code":740344,"matched_code_percent":26.602407,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3399,"matched_functions_percent":47.7656,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":249,"complete_units":116}},{"timestamp":"2026-10-26T17:36:35Z","commit_sha":"d93c1921b615302c8aa73707d021854eaa55361e","commit_message":"Record the duplicate-copy batch; refresh status numbers and duplicates list","measures":{"fuzzy_match_percent":27.803352,"total_code":2782996,"matched_code":738088,"matched_code_percent":26.521345,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3393,"matched_functions_percent":47.681282,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":249,"complete_units":116}},{"timestamp":"2026-10-26T17:04:30Z","commit_sha":"b69a14a1da098beb9104d3f65c6116335d20b90c","commit_message":"Extend unit_801CBA60 down to 0x801CAE84 and add the copies that fall in it","measures":{"fuzzy_match_percent":27.282187,"total_code":2782996,"matched_code":723584,"matched_code_percent":26.000181,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3331,"matched_functions_percent":46.810005,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":250,"complete_units":116}},{"timestamp":"2026-10-26T16:27:13Z","commit_sha":"4352dd191447aa5bea27ac24b191a7aa68677222","commit_message":"Refresh status numbers and regenerate duplicates against the unit files\n\ndupes.py now reads every asm file and takes matched state from the objdiff report; update_status.py reports matched code and data separately from linked.","measures":{"fuzzy_match_percent":26.764471,"total_code":2782996,"matched_code":709176,"matched_code_percent":25.482468,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3018,"matched_functions_percent":42.41147,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T16:17:52Z","commit_sha":"3edcef8191fe02380fcf73ac61bc9ada723e73b4","commit_message":"Remove dtk template getting-started guide","measures":{"fuzzy_match_percent":26.764471,"total_code":2782996,"matched_code":709176,"matched_code_percent":25.482468,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3018,"matched_functions_percent":42.41147,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T16:14:01Z","commit_sha":"ef83e0f1dedca081c27f554341008fa34dc3a3cb","commit_message":"Remove recomp-only docs and references\n\nDelete the widescreen, camera and QoL/cheat notes and trim recomp-specific\npassages from the remaining docs, README and CONTRIBUTING. Docs only; no\nbuild, tool, config or license files touched.","measures":{"fuzzy_match_percent":26.764471,"total_code":2782996,"matched_code":709176,"matched_code_percent":25.482468,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3018,"matched_functions_percent":42.41147,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T15:14:58Z","commit_sha":"7757c6a9aed0616101a4138ba4d0991a3dc7a689","commit_message":"Merge 111 of the held-back function matches; record what is still stuck","measures":{"fuzzy_match_percent":26.764471,"total_code":2782996,"matched_code":709176,"matched_code_percent":25.482468,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3018,"matched_functions_percent":42.41147,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T15:14:58Z","commit_sha":"cf6543fc51692e1b7d3c70a640bda1e53a879a2d","commit_message":"Merge 111 of the held-back function matches; record what is still stuck","measures":{"fuzzy_match_percent":26.764471,"total_code":2782996,"matched_code":709176,"matched_code_percent":25.482468,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":3018,"matched_functions_percent":42.41147,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T05:06:03Z","commit_sha":"8535e8dff0ca5b3870afeab662f78601f6a0b4b2","commit_message":"Keep agent scratch files out of %TEMP%","measures":{"fuzzy_match_percent":20.826122,"total_code":2782996,"matched_code":543912,"matched_code_percent":19.544117,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":2648,"matched_functions_percent":37.211914,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T04:55:33Z","commit_sha":"2bd076d775f0347343373e3efc222ed4e58ce78f","commit_message":"Add 226 more mid-size function matches (13 units extended, 1 new)","measures":{"fuzzy_match_percent":20.826122,"total_code":2782996,"matched_code":543912,"matched_code_percent":19.544117,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":2648,"matched_functions_percent":37.211914,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":251,"complete_units":116}},{"timestamp":"2026-10-26T04:08:03Z","commit_sha":"53b5394c32a6b048f9dcf4990d0cbc58a2a9719b","commit_message":"Add 176 more small-function matches (13 units extended)","measures":{"fuzzy_match_percent":18.56525,"total_code":2782996,"matched_code":480992,"matched_code_percent":17.283245,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":2424,"matched_functions_percent":34.064083,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":250,"complete_units":116}},{"timestamp":"2026-10-26T03:29:13Z","commit_sha":"fbd9ad6a6d01bce6910e3aaaea85000c8a252828","commit_message":"Add 269 more small-function matches (28 units extended, 1 new)","measures":{"fuzzy_match_percent":17.37919,"total_code":2782996,"matched_code":447984,"matched_code_percent":16.097185,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":2248,"matched_functions_percent":31.59078,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":250,"complete_units":116}},{"timestamp":"2026-10-26T03:07:07Z","commit_sha":"9816e9923e1c07f4bed35404306c2cb4c03fa810","commit_message":"Refresh the duplicate list after the new units","measures":{"fuzzy_match_percent":16.606354,"total_code":2782996,"matched_code":426476,"matched_code_percent":15.324348,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1979,"matched_functions_percent":27.810568,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":250,"complete_units":116}},{"timestamp":"2026-10-26T03:06:15Z","commit_sha":"5acf77f2691927e8c88c2edebf9cb1bccd64ae66","commit_message":"Add 254 more small-function matches (14 units extended, 12 new)","measures":{"fuzzy_match_percent":15.341674,"total_code":2782996,"matched_code":391280,"matched_code_percent":14.059669,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1917,"matched_functions_percent":26.939291,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":250,"complete_units":116}},{"timestamp":"2026-10-26T02:45:10Z","commit_sha":"c334be8e4ed2c0d6c49d3f2902e4b5d43e8cdcd4","commit_message":"Add 17 units of small functions (298 matches) from 0x80055E94 to 0x801BEAE4","measures":{"fuzzy_match_percent":14.7140045,"total_code":2782996,"matched_code":373812,"matched_code_percent":13.431999,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1663,"matched_functions_percent":23.369871,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":237,"complete_units":116}},{"timestamp":"2026-10-26T02:16:16Z","commit_sha":"f453714e2c7039d743deb87a3425dff03780fcd7","commit_message":"Update the progress page after the second matching batch","measures":{"fuzzy_match_percent":14.383857,"total_code":2782996,"matched_code":364624,"matched_code_percent":13.101852,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1365,"matched_functions_percent":19.182125,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":220,"complete_units":116}},{"timestamp":"2026-10-26T01:30:46Z","commit_sha":"e9e86a6dd3b5ff0d5526b901423fd2fc490333f4","commit_message":"configure.py: update the near-miss notes","measures":{"fuzzy_match_percent":12.178413,"total_code":2782996,"matched_code":325000,"matched_code_percent":11.678062,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1262,"matched_functions_percent":17.734682,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":219,"complete_units":116}},{"timestamp":"2026-10-26T01:11:35Z","commit_sha":"a00e539cc6d01157b991333d70e5390b57fa1466","commit_message":"Add btlchar, draw2d, sound, effect, chunk and evobj; extend model.c\n\nSix new NonMatching units around tasks.c and after model.c, plus 22 more\nmodel.c functions (0x801E6148-0x801E7654). 119 of the 137 new functions match:\n- btlchar.c (0x80031254-0x80032E78): battle character command task and\n  its helpers, 21 of 23.\n- draw2d.c (0x80032E78-0x80035918): quad, billboard and model draw\n  helpers, 27 of 35.\n- sound.c (0x8003DEE0-0x80040010): .SAMP sample, voice and stream\n  loading, 26 of 28; the other two differ only in string offsets (the\n  strings belong in .rodata).\n- effect.c (0x80040010-0x80041238): effect and particle tasks, 10 of 11.\n- model.c now ends at 0x801E7654, 38 of 39.\n- chunk.c (0x801E7654-0x801E8CA4): motion sampling and chunk strip/UV\n  helpers, 13 of 15.\n- evobj.c (0x801E8CA4-0x801EA2DC): story-flag event object, 1 of 3.\nFile boundaries come from the .sdata2 pools; the guessed ones are noted\nin configure.py.","measures":{"fuzzy_match_percent":12.17501,"total_code":2782996,"matched_code":322096,"matched_code_percent":11.573714,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1255,"matched_functions_percent":17.636312,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":219,"complete_units":116}},{"timestamp":"2026-10-26T00:11:47Z","commit_sha":"25a0fcd3ad475693e8da7157cc405e9ceee3dfe8","commit_message":"Add a progress and handoff page","measures":{"fuzzy_match_percent":10.473602,"total_code":2782996,"matched_code":286024,"matched_code_percent":10.277556,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1136,"matched_functions_percent":15.9640255,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":213,"complete_units":116}},{"timestamp":"2026-10-25T23:40:15Z","commit_sha":"c1e40fdc00e8e3c29ddef6c4241a8804b61e1938","commit_message":"Add tasks.c: event task handlers and chunk lists (230 of 235 matching)\n\n0x80035918-0x8003DEE0 as one NonMatching unit: the resource chunk-list\nhelpers, the 0x50000/0x30000 task-key switches and lookup tables, and the\n85 task handlers built on the shared TaskAlloc/TaskNew inline. Five\nfunctions are still near misses (listed in configure.py).\n\nsymbols.txt: fn_800364F4 is 0x2C bytes; its trailing blr was split off as\na separate fn_8003651C.","measures":{"fuzzy_match_percent":10.473602,"total_code":2782996,"matched_code":286024,"matched_code_percent":10.277556,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7116,"matched_functions":1136,"matched_functions_percent":15.9640255,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":213,"complete_units":116}},{"timestamp":"2026-10-25T22:52:51Z","commit_sha":"dec1050655946406817dc64256441f60e44362b4","commit_message":"Add motion.c, flags.c and model.c (34 of 39 functions matching)\n\nThree files from the module after text.c, as NonMatching units until every\nfunction in each file matches:\n- motion.c: Ninja motion keyframe playback (9 of 11 match).\n- flags.c: table accessors and the story-flag bitset (8 of 11).\n- model.c: model object draw, motion blend and per-frame update (17 of 17\n  so far; the file continues past 0x801E6148).\nfdiff: also mask `sym+0xN@sda21` operands when aligning.","measures":{"fuzzy_match_percent":9.2479315,"total_code":2782996,"matched_code":253476,"matched_code_percent":9.1080265,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7117,"matched_functions":906,"matched_functions_percent":12.7300825,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":211,"complete_units":116}},{"timestamp":"2026-10-25T22:32:17Z","commit_sha":"89e30179cd566937d641d70f57d69075112e109a","commit_message":"Count unsplit code towards its progress category, add a Ninja category","measures":{"fuzzy_match_percent":8.888082,"total_code":2782996,"matched_code":244764,"matched_code_percent":8.794982,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7117,"matched_functions":872,"matched_functions_percent":12.252354,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":208,"complete_units":116}},{"timestamp":"2026-10-25T22:12:16Z","commit_sha":"4d727d51f60060c327470825fb90988cb6522928","commit_message":"Match TextPrintNumber, add a decomp-permuter setup script\n\n- TextPrintNumber: hold flags & 0x8000 in start for the test, which gives\n  the original's reuse of the zero register (29 of 33 in text.c now).\n- tools/match/permsetup.py builds a decomp-permuter directory for one game\n  function, without needing cpp, so it also runs on Windows.","measures":{"fuzzy_match_percent":8.888082,"total_code":2782996,"matched_code":244764,"matched_code_percent":8.794982,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7117,"matched_functions":872,"matched_functions_percent":12.252354,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":208,"complete_units":116}},{"timestamp":"2026-10-25T21:26:45Z","commit_sha":"d9e2bed8e173beb382b3b9bddbbbc09a2f9ab175","commit_message":"Remove the example workflow and document the self-hosted CI","measures":{"fuzzy_match_percent":8.887909,"total_code":2782996,"matched_code":244148,"matched_code_percent":8.772848,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7117,"matched_functions":871,"matched_functions_percent":12.238303,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":208,"complete_units":116}},{"timestamp":"2026-10-25T21:21:56Z","commit_sha":"adbb266d461ed3c51b9c9d65d82eaaf6e5184f0f","commit_message":"CI: rerun after installing ninja on the runner","measures":{"fuzzy_match_percent":8.887909,"total_code":2782996,"matched_code":244148,"matched_code_percent":8.772848,"total_data":658516,"matched_data":89568,"matched_data_percent":13.601492,"total_functions":7117,"matched_functions":871,"matched_functions_percent":12.238303,"complete_code":230876,"complete_code_percent":8.295952,"complete_data":183380,"complete_data_percent":27.847464,"total_units":208,"complete_units":116}}]