[{"timestamp":"2026-10-17T20:26:01Z","commit_sha":"7453214cb3e665e4879be5968b1d3e3a47e3f534","commit_message":"Match _unknown_after_abeshi 25feb0 and 260150 by hand (1713 / 6254)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T17:45:45Z","commit_sha":"34116729be179a4c4551d375cf19eecd87dca7c0","commit_message":"Match nori 2709c0 and 270cf0 by hand (1711 / 6254)\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T17:29:06Z","commit_sha":"252d9f051972cd066557041d1d3e4fdded1a4e4e","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T17:28:54Z","commit_sha":"acd1299a0622bfcb3dd2866b587348a36ebc4030","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T17:26:47Z","commit_sha":"01f1236985419f30a0210bacee3ec822d0e1cd67","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T16:40:25Z","commit_sha":"bfa8804b711a05f874c5b85b95e4d7940f5a2ce2","commit_message":"990721 builds with 991111-01's assembler; 5 more from gen_ghidra (1709 / 6254)\n\n- the 990721 compiler setting uses 991111-01's assembler (short-loop\n  padding as in the game); its float-to-int libcall shows the game's\n  build was a version in between\n- gen_ghidra caches each search pass apart (PASSES; a -fno-gcse pass\n  added) and found 5 functions with 990721\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.8676705,"total_code":2022408,"matched_code":57996,"matched_code_percent":2.8676705,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1709,"matched_functions_percent":27.326511,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":447,"complete_units":0}},{"timestamp":"2026-10-17T16:03:15Z","commit_sha":"3cebb124e4f84774e0038d0b0769095d59fdd5c4","commit_message":"Match 5 more by hand; second compiler and per-file flags (1704 / 6254)\n\n- Some files were built with ee-gcc 2.9-ee-990721 (src/after_abeshi_990721.c,\n  // compiler: 990721) and some with 991111-01 -fno-gcse\n  (src/nori_nogcse.c, // cflags: -fno-gcse); asm_build.compile_c picks\n  the compiler, used by match.py, report.py, gen_ghidra.py and the\n  permuter setup (tools/ee_cc.py)\n- gen_ghidra tries 990721 for what 991111-01 does not match; its cache\n  key is a version number now, and --from-cache rewrites src/ghidra only\n- gen_ghidra no longer skips functions that hand-written C merely calls\n- switch tables: per-function check when several share a .text; the\n  report gives the target objects a .rodata to relocate against\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.8385963,"total_code":2022408,"matched_code":57408,"matched_code_percent":2.8385963,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1704,"matched_functions_percent":27.246561,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":442,"complete_units":0}},{"timestamp":"2026-10-17T15:31:19Z","commit_sha":"8b048da04870f35f33c68d3ce5ba98af110a1e6e","commit_message":"Match 22 more functions in nori, _unknown_after_abeshi, cam_min (1699 / 6254)\n\n- src/nori.c: 16 functions (22 of 64 in the group); src/after_abeshi.c and\n  after_abeshi_eh.c: 5 more (22 of 54); src/cam_min.c: 1 (2 of 5)\n- C files may now have their own data (a switch's jump table): match.py\n  places it where the original code points and checks it there, and\n  asm_build.py links it at that address\n- tools/perm_setup.py and perm_objdump.py run decomp-permuter on one\n  function, scored against the executable without MIPS binutils\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.751769,"total_code":2022408,"matched_code":55652,"matched_code_percent":2.751769,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1699,"matched_functions_percent":27.166615,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":440,"complete_units":0}},{"timestamp":"2026-10-17T15:22:43Z","commit_sha":"745cf1318bce92538b77b9191fa2af0a7730f3a2","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.8385963,"total_code":2022408,"matched_code":57408,"matched_code_percent":2.8385963,"total_data":1767972,"matched_data":52,"matched_data_percent":0.002941223,"total_functions":6254,"matched_functions":1704,"matched_functions_percent":27.246561,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":442,"complete_units":0}},{"timestamp":"2026-10-17T14:59:21Z","commit_sha":"061f1d42f565b6e3a1965b1c3ccea04fb725c5d1","commit_message":"Match half of _unknown_after_disp by hand, 3 of _unknown_after_abeshi (1677 / 6254)\n\n- src/after_disp.c: 33 functions (53 of 106 in the group now match):\n  GS TEX0/TEST packet writers, a depth-sorted list, sqrtf lengths,\n  wrappers that pass their arguments on (Ghidra drops those)\n- src/after_abeshi.c: 3 functions\n- src/gs.h: GS register layouts; common.h: s64/u64\n- src/symbols.txt: names for library functions the compiler treats as\n  builtins (sqrtf), read by match.py and asm_build.py\n- match.py FILE.c checks every MATCH-marked function in the file\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.636461,"total_code":2022408,"matched_code":53320,"matched_code_percent":2.6364613,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1677,"matched_functions_percent":26.814838,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":437,"complete_units":0}},{"timestamp":"2026-10-17T14:35:13Z","commit_sha":"7e7bbaa70cf88d50bd13fbc813f9fbd6f66f28fd","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.751769,"total_code":2022408,"matched_code":55652,"matched_code_percent":2.751769,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1699,"matched_functions_percent":27.166615,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":440,"complete_units":0}},{"timestamp":"2026-10-17T14:33:24Z","commit_sha":"71137376bdc4acab5d0aa73f0edc0a47d8cdda03","commit_message":"gen_ghidra: skip repeated candidates, cache results\n\nOptions often produce the same C text; each distinct text is compiled\nonce. Results are cached in build/gen_ghidra_cache.json, keyed by the\nfunction's Ghidra text and a hash of the tools, headers, function list,\nexecutable and compiler, so a rerun only compiles what changed. A compile\nthat hangs ends the search for that function.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.4764538,"total_code":2022408,"matched_code":50084,"matched_code_percent":2.4764538,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1641,"matched_functions_percent":26.239208,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":435,"complete_units":0}},{"timestamp":"2026-10-17T13:50:28Z","commit_sha":"46fb0e45a73a1b850c14f6473f64bca560dbbd2e","commit_message":"Match 252 more functions (1641 / 6254)\n\n- gen_ghidra: try -fexceptions for functions that make calls (the game's\n  C++ files were built with it, so they have no tail calls); pad stack\n  frames for unused locals; swap if/else branches; find Ghidra's files of\n  named functions; time out compiles that hang\n- gen_tiny: translate straight-line code ending in a return or tail call\n- asm_build/match/report: per-file flags from a // cflags: line\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.4764538,"total_code":2022408,"matched_code":50084,"matched_code_percent":2.4764538,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1641,"matched_functions_percent":26.239208,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":435,"complete_units":0}},{"timestamp":"2026-10-17T12:53:06Z","commit_sha":"48fd83665d1b9efed8d54220b6b75a2b0310a666","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.4764538,"total_code":2022408,"matched_code":50084,"matched_code_percent":2.4764538,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1641,"matched_functions_percent":26.239208,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":435,"complete_units":0}},{"timestamp":"2026-10-17T11:31:12Z","commit_sha":"73123105f11c7ed102280485513a3781bae6f2f5","commit_message":"Match 261 more functions from Ghidra's output (1389 / 6254)\n\n- gen_ghidra retries non-matching functions with rewrites: numbers that\n  are addresses as address references (lui/addiu, not lui/ori), signed\n  bytes/shorts/ints, float or widened parameters, signed 64-bit values\n- calls to names Ghidra repeats are resolved to the function the\n  original calls and written as func_XXXXXXXX; the linker no longer\n  defines repeated names\n- 1389 functions (1.76% of code) built from C; byte-identical\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T11:15:36Z","commit_sha":"b4323e449990e6014e36f08f228881aaf0c70324","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T10:56:06Z","commit_sha":"d78f2ec8e465cb3368358cda1a9c2b63126ddf39","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T10:45:26Z","commit_sha":"11aaa8f634fb2ef7cc7ad5f1a657ed60058409b1","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T10:45:08Z","commit_sha":"2f6f4df5d24dc8580f4be63e8f725147dae3da37","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T10:39:35Z","commit_sha":"cc32f35b229524be8d34bb5527b725d768416c74","commit_message":"Update README.md","measures":{"fuzzy_match_percent":2.191447,"total_code":2022408,"matched_code":44320,"matched_code_percent":2.191447,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1389,"matched_functions_percent":22.209785,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":374,"complete_units":0}},{"timestamp":"2026-10-17T10:29:33Z","commit_sha":"dcf80ed44a099a040f10418ac72d9d3d863cfd8d","commit_message":"Prepare for ByteMatch: no string fragments, not-a-matching-decomp wording\n\n- gen_ghidra writes string globals by address only, so no game text\n  survives in identifiers\n- README: say this is not a matching decompilation and that ByteMatch\n  counts only byte-identical functions; ByteMatch badges; accurate legal\n  note (no game files or assets; C reconstructed from analysis)\n- PROGRESS.md says the same\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-17T10:29:33Z","commit_sha":"b49e959a4409159fdd9742508396057795db553c","commit_message":"Prepare for ByteMatch: no string fragments, not-a-matching-decomp wording\n\n- gen_ghidra writes string globals by address only, so no game text\n  survives in identifiers\n- README: say this is not a matching decompilation and that ByteMatch\n  counts only byte-identical functions; ByteMatch badges; accurate legal\n  note (no game files or assets; C reconstructed from analysis)\n- PROGRESS.md says the same\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-17T09:58:54Z","commit_sha":"82ffe818494fb71066ec28af738628dc0c7ba65b","commit_message":"Update README.md","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-17T09:55:51Z","commit_sha":"182b3a406de601354edc73ea9e1fab7932b4a362","commit_message":"Update README.md","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-17T09:31:10Z","commit_sha":"b793007cf319b8954db2a3d78577142f9226c280","commit_message":"Update README.md","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-16T22:49:21Z","commit_sha":"78c6d866559e3cc037aca150746a015f80bb890d","commit_message":"Match 149 more functions from Ghidra's output (1128 / 6254)\n\n- gen_ghidra: fit prototypes to the call sites, allow gotos, drop\n  Ghidra's division-check traps, address PTR_/s_ globals and up to six\n  DAT_ globals, give float constants their f, and use the original\n  copies of constants the compiler would place itself\n- match.compare keeps a nop that sits in a delay slot (it hid a wrong\n  tail call)\n- 1128 functions (1.48% of code) built from C; byte-identical\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":1.4772489,"total_code":2022408,"matched_code":29876,"matched_code_percent":1.4772489,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":1128,"matched_functions_percent":18.036457,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":356,"complete_units":0}},{"timestamp":"2026-10-16T22:29:29Z","commit_sha":"543d89c86c6bd926ec18ac8afea99e376ce5f700","commit_message":"Match 373 more functions from Ghidra's output; exact relocation checks\n\n- tools/gen_ghidra.py compiles Ghidra's decompilation of the unmatched\n  functions (with gp-relative and absolute globals as D_ symbols, types\n  tried where Ghidra has none) and keeps exact matches in src/ghidra/\n- match.py (and both generators) now fill in relocated fields from the\n  symbols' real addresses instead of masking them, so a wrong call or\n  global counts as a difference\n- report units: one per C file plus one per source group for the rest\n- 979 / 6254 functions (1.13% of code) built from C; byte-identical\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":1.134687,"total_code":2022408,"matched_code":22948,"matched_code_percent":1.1346871,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":979,"matched_functions_percent":15.653981,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":337,"complete_units":0}},{"timestamp":"2026-10-16T22:12:53Z","commit_sha":"ebafaf76f35e50bb322409cf5e966b29a38ccbec","commit_message":"Add objdiff progress report and a workflow uploading it as SLES_508.91_report\n\n- tools/report.py builds objdiff target objects (original code, one unit\n  per source group, plus the data sections) and base objects (the C),\n  and writes report/report.json with objdiff-cli: 606 / 6254 functions\n- .github/workflows/progress.yml uploads the committed report as the\n  artifact SLES_508.91_report on pushes to main, the form ByteMatch and\n  decomp.dev read; CI cannot build without the game's executable\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.47329718,"total_code":2022408,"matched_code":9572,"matched_code_percent":0.4732972,"total_data":1767920,"matched_data":0,"matched_data_percent":0,"total_functions":6254,"matched_functions":606,"matched_functions_percent":9.689798,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":155,"complete_units":0}}]