[{"timestamp":"2026-10-19T01:30:58Z","commit_sha":"4814f3b5eb8ba20e43621a41b52b39ca40f76905","commit_message":"Phase 3 task 3: behaviour-tree nodes' CreateRuntime\n\n31 of the BT nodes' CreateRuntime functions (new of their runtime node\nthrough GripRBTNode's allocator), with each node's class read from the\nPDB's vtable symbols. gen_header.py: overloaded virtuals in adjacent slots\nare declared in reverse, as MSVC lays them out; template arguments are\nonly forward-declared.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":57.41841,"total_code":136660,"matched_code":78468,"matched_code_percent":57.41841,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":875,"matched_functions_percent":69.55485,"complete_code":1364,"complete_code_percent":0.9980975,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":1}},{"timestamp":"2026-10-19T01:20:41Z","commit_sha":"c1ef37c19f7c7dcf60008ce9a49ddcb3d7d1015a","commit_message":"Phase 3 task 3: exec thunks, Unity_UDKWeaponEtAl.cpp.obj\n\ngen_classes.py writes the script compiler's exec<Name> thunks whose\nparameters are ints, floats, bytes, UBOOLs, object pointers or FVector\nand FRotator (P_GET_*, P_FINISH, the call, the result), through a\nhand-written FFrame::Step (Core/Inc/UnScript.h). pdbtype.py keeps a const\npointer's const, which the decorated names need. 155 of the object's 195\nfunctions match.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":53.730427,"total_code":136660,"matched_code":73428,"matched_code_percent":53.730427,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":844,"matched_functions_percent":67.09062,"complete_code":1364,"complete_code_percent":0.9980975,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":1}},{"timestamp":"2026-10-19T01:14:10Z","commit_sha":"1f3db588240f2574f8d49ddf8311a5a24ca946e9","commit_message":"Phase 3 task 3: Unity_UDKCoverEtAl.cpp.obj, and generated one-liners\n\nAUDKCover's six functions and three of CCSNorman's, with the classes\nthey touch rendered with members. gen_classes.py also writes the\nfunctions whose whole body returns a constant or a string literal, or\ndoes nothing (80 of them, read from the basefile), DECLARE_CLASS's Super\ntypedef, and Epic event thunks a package's code inlines.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":50.20928,"total_code":136660,"matched_code":68616,"matched_code_percent":50.20928,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":791,"matched_functions_percent":62.877583,"complete_code":1364,"complete_code_percent":0.9980975,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":1}},{"timestamp":"2026-10-19T01:05:46Z","commit_sha":"4c4447ba06c11fa3968a9ca7d2d9982f4d5149ec","commit_message":"Phase 3 task 3: Unity_NullSurveysEtAl.cpp.obj, 26 of 34 matched\n\nMegaHaloGame's vector constants, its natives' registrars\n(IMPLEMENT_FUNCTION), GetSystemSettings and two empty functions. The\nrest needs UE3's TArray, FMemoryWriter and FFrame templates.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":49.184837,"total_code":136660,"matched_code":67216,"matched_code_percent":49.184837,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":702,"matched_functions_percent":55.80286,"complete_code":1364,"complete_code_percent":0.9980975,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":1}},{"timestamp":"2026-10-19T01:01:20Z","commit_sha":"d0f9e3cd7c1152fa6e529a19b522a8d086dfd39d","commit_message":"Phase 3 task 3: Unity_CCSMainEtAl.cpp.obj, 25 of 25 matched\n\nThe registrant functions, and the Xenon vector constants' dynamic\ninitializers (the first VMX128 code matched), from a shared\nCore/Inc/UnMathXe.h. check.py finds dynamic initializers by name.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":48.625786,"total_code":136660,"matched_code":66452,"matched_code_percent":48.625786,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":682,"matched_functions_percent":54.213036,"complete_code":1364,"complete_code_percent":0.9980975,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":1}},{"timestamp":"2026-10-19T00:56:54Z","commit_sha":"0c6c054dd0c818075c8c9b068eba7483faf05c44","commit_message":"Phase 3 task 2: generated class boilerplate and event thunks\n\ntools/gen_classes.py writes what UE3's DECLARE_CLASS, NO_DEFAULT_CONSTRUCTOR\nand IMPLEMENT_CLASS expand to, and the script compiler's event thunks, for\nn-Space's native classes: a <Package>Classes.h per package and one source\nfile per object. 665 nspace functions now match and 4 are near. The\nleftovers need full layouts (members with destructors, interface vtables)\nor are exec thunks and cpptext inlines; DECOMPILING.md lists the groups.\n\ngen_header.py: static members in opaque classes, blobs that keep the\nclass's alignment, varargs and pointers to members (pdbtype.py).\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":48.183815,"total_code":136660,"matched_code":65848,"matched_code_percent":48.183815,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":665,"matched_functions_percent":52.861687,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-19T00:31:16Z","commit_sha":"abd72d3b3cc634f1d66c3081c7df25b872b9f809","commit_message":"Phase 3 task 1: headers from the PDB\n\ntools/gen_header.py writes declarations from the PDB's types: target\nclasses with their members at the PDB's offsets, everything they need as\nopaque classes, vtables in slot order and methods with their access. The\nKamikaze example's header is now generated, and its 10 functions still\nmatch. tests/test_sources.py re-checks every source file, so a header\nchange can't demote a matched function.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-19T00:08:31Z","commit_sha":"6c9db1a16cc3b48acfcabe63d478f47ee65f72eb","commit_message":"Phase 3 plan: n-Space's C++\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-19T00:03:49Z","commit_sha":"856f94f97b089b02d20e6a78327ddb4ea94a0c28","commit_message":"Phase 2: simplify switch_tables.py and imports.py\n\nswitch_tables.py: drop the unused _is_branch, read functions.csv with\ninventory.read_csv, share one sign-extension helper (_simm) and one bctr\nwalk between find and survey, track the bounded register as one value\nrather than a one-element set, and fold mtspr and mtcrf into the opcodes\nthat write no GPR (mfspr was already the default). classify's docstring\nnow lists 'rejected'. imports.py counts libraries with Counter. Output is\nunchanged: recomp/switch_tables.toml (345 tables), the survey and\nconfig/imports.csv regenerate byte for byte.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T23:47:22Z","commit_sha":"ae13a02e67d2574ee173d0d535762cbce6302ae2","commit_message":"Point the progress report at ByteMatch, decomp.dev's successor\n\ndecomp.dev has shut down; the project is registered on ByteMatch with its\nGitHub app installed. docs/DECOMP_DEV.md becomes docs/BYTEMATCH.md (the\nregistration steps become the project page link), the workflow becomes\n.github/workflows/bytematch.yml (same artifact, retail_report), and the\nREADME, PROGRESS.md, llms.txt, the Pages site and the design's Phases link\nto the project page. tools/decomp_dev_export.py keeps its name.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T21:04:47Z","commit_sha":"0f8006ac20923ee268f191aa016dee5710c66634","commit_message":"Phase 2 task 7: docs and the clean-clone check\n\nPORTING.md's steps, followed in a fresh worktree from main, build the game\nand reach the first level. The check found two problems, both fixed: build\nthe codegen target first, then configure again (a one-step build fails at\nlink), and runtime/ now prefers the clone's own SDK install over another\nregistered one. README, llms.txt, the Pages site, PROGRESS.md and the\ndesign's Phases record Phase 2 as done, with what is left over.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T20:29:06Z","commit_sha":"942abe9a7b06ded10aa31cceeb3184457d6070bd","commit_message":"PORTING.md: build and run the PC port\n\nPrerequisites, supplying your own copy of the build, cloning the SDK\nsubmodule, each tool in order, the SDK and game builds, running haggar\n(controls, known issues, testing options), Steam Deck as a user step, and\nthe stand-in build. tools/fix_symlinks.py replaces the symlink stubs git\nleaves on Windows without symlink rights.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T20:27:07Z","commit_sha":"bed73bac3b9670799fe4d6941340c91d8e172221","commit_message":"tests: skip the bctr survey without orig/\n\ntest_every_bctr_classified read the basefile directly, so CI (which has no\norig/) failed instead of skipping it.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T20:25:43Z","commit_sha":"a58d187823438583f8bacd2882eacdd3d5858175","commit_message":"Phase 2 task 6: Linux build and CI\n\nThe SDK fork and the game build under WSL2 with clang 19 (clang 18 lacks\nlibstdc++ 13's std::expected) in 11 minutes. On WSLg's software Vulkan device\nthe game reaches UE3 startup, then asserts before the first frame; real GPUs\nare a user step. --audio=nop selects the SDK's no-op audio system (Wwise\nasserts without an output device). The Linux build stages librexruntime.so\nnext to the host.\n\n.github/workflows/port-linux.yml builds the SDK and the host on ubuntu-24.04\nagainst tools/stub_recomp.py's stand-in for the generated code\n(HAGGAR_SKIP_CODEGEN), so it needs no orig/.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T19:38:24Z","commit_sha":"68debc455700859ef1213710dd139913c6275655","commit_message":"Phase 2 task 5: the recompiled game reaches gameplay (M5)\n\nhaggar.exe runs the recompiled build on ReXGlue's Xenia-derived runtime.\nM1 the entry point runs to its kernel calls; M2 UE3 logs 'Initializing\nEngine Completed'; M3 the first frame (the mission briefing) by 15 s; M4\nthe briefing and the dev menu (the build has no title menu); M5 the jungle\nlevel is playable after the build's known Ghost Walk workaround, at 11 to\n16 fps on an integrated GPU. The host maps DEVKIT: to a writable folder,\nand adds --capture_every and --press for unattended runs. The rexglue fork\n(729dafe) logs the guest frame rate.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T19:37:07Z","commit_sha":"c7c07bc3f7fa5e5d9ea36bd5370c0a4c7ad9af1f","commit_message":"Phase 2 task 4: full compile of the recompiled game\n\nruntime/ is the ReXGlue project: haggar_codegen, haggar_recomp (the 506\ngenerated files) and the haggar host. Everything compiles with clang 19 in\nabout 6 minutes and links into a 187 MB haggar.exe. recomp_config.py leaves\nthe import thunks out of [functions], which had renamed them sub_<address>\nin place of __imp__<export>. The 50 boundaries ReXGlue splits are genuine\nsecond entry points; functions.csv is unchanged.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T18:35:04Z","commit_sha":"31aedd2b3efacfdf06c268956fd6b84830283026","commit_message":"Phase 2 task 3: ReXGlue codegen, no unimplemented instructions\n\ntools/recomp_config.py now writes the ReXGlue codegen manifest and the PDB's\nfunction list into $HAGGAR_BUILD_DIR/recomp (paths.BUILD honours\nHAGGAR_BUILD_DIR). The codegen translates the XEX in 55 s into 506 files with\nno unimplemented instruction; the 4 undecodable words are unused import\nthunks. The rexglue fork (6a4c532) fixes two O(n^2) analysis loops, returns\nXenia's xbdm values for the game's imports, and adds 31 instruction tests\n(1,495 cases pass). The image has no invalid update forms.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T17:50:09Z","commit_sha":"ef7b432120ba101c05c1b840ce1792e7e6639d8e","commit_message":"Phase 2 task 2: jump tables\n\ntools/switch_tables.py finds the bounds-checked lwzx tables behind every\nbctr in any instruction order (this compiler's lis; slwi; addi; lwzx as well\nas XenonAnalyse's), through mr copies, addi offsets, clrlwi masks, cmpldi and\nbgtlr. Every label must lie inside its function. The survey classifies all\n6,720 bctrs: 345 tables, 6,375 pointer calls or tail calls, 0 unexplained.\nrecomp/switch_tables.toml holds the tables in ReXGlue's [[switch_tables]]\nform.\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T16:48:52Z","commit_sha":"2ae483263d169e96c484c02a9deca80a1f90ed79","commit_message":"Phase 2 plan: PC port\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T16:40:49Z","commit_sha":"818aabd0505425361442038b8bb72fa7584e96b0","commit_message":"Phase 1 task 6: publish\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}},{"timestamp":"2026-10-18T16:38:03Z","commit_sha":"e8b4214d045e7b69adbb11dd73d8d70a3d214b6f","commit_message":"Halo Mega Bloks (Project Haggar) decompilation: tools, inventory, scripts and docs\n\nCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>","measures":{"fuzzy_match_percent":0.36001757,"total_code":136660,"matched_code":492,"matched_code_percent":0.36001757,"total_data":0,"matched_data":0,"matched_data_percent":0,"total_functions":1258,"matched_functions":8,"matched_functions_percent":0.63593006,"complete_code":0,"complete_code_percent":0,"complete_data":0,"complete_data_percent":0,"total_units":5,"complete_units":0}}]