Skip to the page
It's Decomplicated
Microsoft, 2005

Xbox 360 decomp guide

Recompilers get games running fast, but no Xbox 360 game has a finished decomp yet.

What this system is like

The Xbox 360 runs on a PowerPC chip. Its games are big, modern programs. Each game keeps its main code in one file, default.xex. Two tools turn that file into C++ that a PC can build: ReXGlue and XenonRecomp. This is called static recompilation.

All 15 projects reviewed here used static recompilation. Several reached a first boot within a week. The hard part comes after that. You find functions the tool missed. You fill in console system calls. Then you fix graphics and timing bugs one at a time.

A full decomp is a different story. No Xbox 360 game has one yet. The furthest public effort, Dance Central 3, is about 54% done after 16 months. This guide shows a slow but real route. You grow readable code out of a working recomp, one function at a time.

Almost every step runs on Windows. You need WSL only for an optional Linux build or the port step.

Two recompilers, one family

XenonRecomp came first and powers Unleashed Recompiled. ReXGlue borrows its code analysis and adds a runtime built on code from the Xenia emulator. A runtime is the code that stands in for the console. Eleven of the 15 reviewed projects use ReXGlue or a copy of it.

Finding functions is the main hand work

The .xex file lists many functions in a table called .pdata. The rest must be found. Forza Horizon ReImagined needed 220 extra entry points and 357 lost functions. Each one goes in a settings file as a hint.

Game memory stays big-endian

Xenon stores numbers with the big byte first. PC chips store the small byte first. The generated code swaps bytes on every read and write. Your own code must do the same when it touches game memory.

Graphics: copy the GPU or replace it

You can start with the copied Xenos GPU inside ReXGlue. It works but runs slow. Many top projects later wrote their own renderer for speed. That is a large, separate job.

Huge code and a closed compiler

One game can hold over 12 MB of code. The original compiler comes from Microsoft's closed Xbox 360 SDK. That is why byte-exact decomps are rare here.

Two paths

Path A

Get it running on PC

You point a recompiler at the game's default.xex. It writes C++ for every function it can find. You fix what it missed with hints in a TOML settings file. A runtime stands in for the console's kernel, graphics, sound and input. ReXGlue gives you that runtime ready to use.

Go to the steps

Path B

Full decomp for porting

No Xbox 360 game has a full decomp yet. The furthest public one, Dance Central 3, is about 54% done. The route here starts from your Path A port. You replace machine-made functions with readable C++, one at a time. A test compares each new function with its machine-made twin.

Go to the steps

Path A: Get it running on PC

You point a recompiler at the game's default.xex. It writes C++ for every function it can find. You fix what it missed with hints in a TOML settings file. A runtime stands in for the console's kernel, graphics, sound and input. ReXGlue gives you that runtime ready to use.

Method: static recompilation

Pick this first, for any Xbox 360 game. It is the only path the reviewed projects used. It also gives Path B the reference it checks against.

  1. Scope the game and pin the exact file

    Pick one game and one version. Check if someone already ported it, or a game on the same engine. Then write the Scope Contract. Every later session works on that same file.

    • Search RecompLauncher and GitHub for your game and its engine. FIFA World Cup 2010 started from the FIFA Street port.
    • Dump your own disc. Extract it with extract-xiso -s -x -d game/files <your.iso>. The -s flag skips the $SystemUpdate folder.
    • Record the hash of the main file. In PowerShell run Get-FileHash game/files/default.xex -Algorithm SHA256.
    • Note if a title update exists. Skate 3, Unleashed Recompiled and COGBox all build from one. Unleashed reads its patch as default.xexp.
    • List extra code modules, such as fifadllzf.xex.dll or EAWebkit.xex. Each one needs its own codegen.
    • Write SCOPE.md: game, region, hash, title update, recompiler, renderer plan, and what is out of scope.
    Prompt for Claude
    GOAL: Draft SCOPE.md for a static recompilation of <GAME> on Xbox 360.
    READ FIRST: `notes/game-files.txt` (my file list and the `default.xex` hash), `notes/prior-work.md` if it exists.
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Game|Region|Hash|Title update|Modules|Recompiler|Renderer|Milestone|Out of scope)$'`. Done means it prints 9 lines. The Hash section must hold the same SHA-256 that `Get-FileHash game/files/default.xex -Algorithm SHA256` prints. The Recompiler section names `ReXGlue` or `XenonRecomp` with one reason.
    BUDGET: Stop after 30 minutes of searching for prior work.
    IF BLOCKED: Stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the Select-String output and both hashes. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenSCOPE.md names the default.xex hash and the title update, and you have approved it.

    Proof this works: SpeedBreaker, Skate 3 Recomp, FIFA World Cup 2010, https://github.com/XboxDev/extract-xiso

  2. Set up the Windows tools and the SDK

    Install the compiler, the build tools and the ReXGlue SDK. Make the repo and keep game files out of it. Write one build command and one check command.

    • Install Visual Studio 2022 with Desktop development with C++. Add C++ Clang Compiler for Windows (20 or newer) and MSBuild support for LLVM (clang-cl).
    • Install CMake 3.25 or newer and Ninja.
    • Get the SDK: git clone --recursive https://github.com/rexglue/rexglue-sdk.git. Inside it run git checkout v0.10.1, then git submodule update --init --recursive.
    • Open the x64 Developer PowerShell for VS 2022. AC6 warns that an x86 prompt breaks the build. Then run cmake --preset win-amd64 and cmake --build out/build/win-amd64 --target install.
    • Add the install folder's bin/ to your PATH. Then make your project: rexglue init --app_name <game> --app_root ./<game>.
    • Add assets/, generated/, game/ and out/ to .gitignore.
    • Write tools/check.ps1. It builds, boots the game under a time limit, and prints PASS or FAIL. Give it the switches later steps use: -CodegenOnly, -BootSeconds <N>, -Golden [<name>] and -All. Have it save logs to out/logs/codegen.txt and out/logs/boot.txt.
    Prompt for Claude
    GOAL: Make `tools/check.ps1` build the <GAME> project and print PASS or FAIL.
    READ FIRST: `SCOPE.md`, the ReXGlue wiki page Getting Started (https://github.com/rexglue/rexglue-sdk/wiki/Getting-Started), `CMakePresets.json`.
    FENCE: Edit only `tools/`, `.gitignore` and `CLAUDE.md`. The SDK folder and `generated/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1`. Done means it configures, runs the `<game>_codegen` target, configures again, builds, then prints one line: PASS or FAIL with the reason. A failing boot is fine for now. Each switch (`-CodegenOnly`, `-BootSeconds <N>`, `-Golden [<name>]`, `-All`) must run. A switch with nothing to test yet prints SKIP.
    BUDGET: Stop after 3 failed tries at the same error.
    IF BLOCKED: Stop. Do not work around it. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: paste the last 20 lines of the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenpwsh tools/check.ps1 runs from start to end and prints one PASS or FAIL line.

    Proof this works: https://github.com/rexglue/rexglue-sdk/wiki/Getting-Started, Fable 2 Recomp, Skate 3 Recomp

  3. Map the executable in Ghidra

    You need a few addresses before the first codegen. You also need a function list to track progress. Ghidra, a free disassembler, reads default.xex with the right loader.

    • Install Ghidra. Then add the XEXLoaderWV zip that matches your Ghidra version with File, Install Extensions.
    • Import default.xex and its .xexp patch. Read the image base from the loader. Do not guess it.
    • Find setjmp and longjmp. The XenonRecomp README says you may find longjmp by its calls to RtlUnwind. setjmp often comes just after it.
    • For XenonRecomp only, find the eight register save and restore helpers by their byte patterns. __restgprlr_14 starts with e9 c1 ff 68.
    • Export every function to notes/functions.csv with address, size and a status column. Lost Odyssey keeps headless Ghidra export scripts for this in tools/ghidra.
    • Mark library code from the SDK, such as Direct3D and the C runtime, in the status column.
    Prompt for Claude
    GOAL: Fill `notes/functions.csv` and the special addresses in `<game>_config.toml`.
    READ FIRST: `SCOPE.md`, the Ghidra export in `notes/ghidra/` (made with the XEX loader), the XenonRecomp README section on setjmp.
    FENCE: Edit only `notes/functions.csv`, `notes/findings.md`, `tools/ledger_check.py` and the `setjmp_address` and `longjmp_address` lines. Ghidra project files and `game/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Write `tools/ledger_check.py` if it is missing. It prints PASS when every row has address, size, status and a library flag, with no overlaps. Run `python tools/ledger_check.py notes/functions.csv` and `Select-String -Path <game>_config.toml -Pattern '^(setjmp|longjmp)_address = 0x'`. Done means PASS and 2 lines. Each address has one line of evidence in `notes/findings.md`.
    BUDGET: Stop after 60 minutes, or after 3 wrong guesses at one address.
    IF BLOCKED: Stop. Do not guess an address. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: row count and the two addresses with evidence. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whennotes/functions.csv exists with a status column, and the config has both setjmp_address and longjmp_address.

    Proof this works: Forza Horizon 1: ReImagined, Lost Odyssey Recomp, https://github.com/hedge-dev/XenonRecomp, https://github.com/zeroKilo/XEXLoaderWV

  4. Run the first codegen

    Now the recompiler writes C++ for the whole game. It will report missed functions and jump tables. A jump table is a list of addresses a switch statement jumps to. You fix these in the TOML file, never in the output.

    • Set file_path and patch_file_path in <game>_config.toml.
    • Run cmake --preset win-amd64-relwithdebinfo, then cmake --build --preset win-amd64-relwithdebinfo --target <game>_codegen.
    • Configure again so CMake sees the new sources, then build. Skate 3, Blue Dragon and AC6 all needed this second configure.
    • For each error, add a [functions] entry with size or end, or a [[switch_tables]] entry.
    • Put a comment on every hint saying which error it fixes. COGBox does this for every entry.
    • Add a script that fails if generated code still has unresolved calls. FIFA Street uses verify_direct_branches.py.
    Prompt for Claude
    GOAL: Make `<game>_codegen` finish with no validation errors.
    READ FIRST: `SCOPE.md`, the last codegen log in `out/logs/codegen.txt`, the ReXGlue wiki page on the config file.
    FENCE: Edit only `<game>_config.toml` and files it includes. `generated/` is machine-made and read-only. Never pass `--force`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1 -CodegenOnly`. Done means codegen exits 0 with no validation errors. Copy any 'Unresolved conditional branch' warnings into `notes/findings.md`. Fable 2 shows these warnings are not fatal.
    BUDGET: Fix at most 20 hints per session. Stop after 3 failed tries on one address.
    IF BLOCKED: Stop. Do not work around it. Tell me the address, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: error count before and after, and the last log lines. 3) Files changed, with one comment per new hint. 4) What is left. 5) New parking-lot items.
    Done whenCodegen exits 0 without --force, and the game executable links.

    Proof this works: https://github.com/rexglue/rexglue-sdk/wiki/rexglue-CLI-Commands, Skate 3 Recomp, reblue, COGBox, ReStreet

  5. Boot to the first screen

    Run the game until it stops. Most early stops name a function that was never found. You add that address as a hint, rebuild and run again. You repeat this until a screen shows.

    • Run the game with its data folder: <game>.exe --game_data_root=<path>. Hell's Gate found this must be a command-line flag. With no flag, the runtime looks in assets/ next to the exe.
    • Look in the log for Call to invalid or unregistered function at guest address 0x....
    • Add that address to the config and rebuild. COGBox runs this loop with tools/boot_loop.ps1.
    • Stub a missing kernel call with REX_EXPORT_STUB_RETURN(<name>, <value>) only to get past it. Use REX_STUB_RETURN for a game function. List each stub in notes/stubs.md.
    • Run every boot under a time limit. Stop only your own process, by its process ID.
    Prompt for Claude
    GOAL: Get <GAME> past its next boot stop at guest address <ADDRESS>.
    READ FIRST: `SCOPE.md`, the last 50 lines of `out/logs/boot.txt`, `notes/stubs.md`.
    FENCE: Edit only `<game>_config.toml`, `src/kernel/` and `notes/stubs.md`. `generated/` is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1 -BootSeconds 120`. Done means the log no longer stops at <ADDRESS>. Paste the new last log line.
    BUDGET: One stop per session. Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not skip the call or fake its result to move on. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: old and new last log lines. 3) Files changed. 4) Any stub added, and why. 5) New parking-lot items.
    Done whenpwsh tools/check.ps1 -BootSeconds 120 prints PASS: the log shows the title-screen line you picked, within the time limit, and out/shots/boot.png exists.

    Proof this works: Hell's Gate, COGBox, Forza Horizon 1: ReImagined, FIFA World Cup 2010, https://github.com/rexglue/rexglue-sdk/wiki/Function-Overrides

  6. Fix one bug at a time, with evidence

    Now play forward. Each crash, hang, wrong picture or missing sound is one unit of work. Find the cause first. Compare with the Xenia Canary emulator or a real console before you change code.

    • Log each bug in notes/bugs.md with exact steps to see it.
    • Run the same scene in Xenia Canary on a copy of your install. If it breaks there too, it may be a bug in the original game.
    • Change behavior with REX_HOOK, REX_HOOK_RAW or a [[midasm_hook]] entry. Never edit generated/.
    • Keep one TOML hook file per feature, as Blue Dragon does in config/hooks/.
    • Use RenderDoc for graphics bugs. It captures one frame so you can inspect each draw.
    • Give each fix its own on and off setting, as AC6 does. Then you can test with one fix off.
    Prompt for Claude
    GOAL: Find and fix the cause of bug <BUG-ID> in <GAME>.
    READ FIRST: `notes/bugs.md` entry <BUG-ID>, `notes/findings.md`, the log and capture files named in the bug.
    FENCE: Edit only `src/` and `config/hooks/`. `generated/`, `game/` and the SDK are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1 -Golden`. Done means the bug's repro run passes and every older golden run still passes. Show the cause with evidence before you change any code.
    BUDGET: Stop after 2 failed fixes, or 45 minutes with no new evidence.
    IF BLOCKED: Stop. Do not hide the crash by skipping the call. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the cause with its evidence, then the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe bug's repro run passes in the check script, and all older golden runs still pass.

    Proof this works: Lost Odyssey Recomp, FIFA World Cup 2010, reblue, AC6 Recomp, Unleashed Recompiled

  7. Build golden runs

    Playing by hand does not scale. Script runs that load a scene, play fixed input and check the result. Run them after every change. Then old fixes stay fixed.

    • Make a read-only save file to start from. Copy it to a fresh folder for each run, as Pinyon Shift does.
    • Launch each level by a command-line flag. Run it for a set time, take a screenshot, and record ran, stopped or crashed. COGBox's chapter_sweep.ps1 does this.
    • Compare screenshots with saved baselines. Forza Horizon ReImagined checks six render scenes this way.
    • Add a debug-only local port so a script can press buttons and read game state. Fable 2 does this and leaves it out of release builds.
    • Wrap it all in one command, such as tools/prerelease.ps1, that prints PASS or FAIL for each check.
    Prompt for Claude
    GOAL: Add golden run <NAME> that loads <SCENE> and checks it.
    READ FIRST: `SCOPE.md`, `tools/check.ps1`, `tests/golden/README.md`.
    FENCE: Edit only `tests/golden/` and `tools/`. Never touch my real save folder. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1 -Golden <NAME>` three times. Done means it passes all three times on the current build. It must also FAIL when I swap in the screenshot from <OTHER-SCENE>.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not loosen the image threshold to make it pass. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the three passing runs and the one forced failure. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOne command runs every golden run on a clean checkout and prints PASS for each.

    Proof this works: Pinyon Shift, COGBox, Forza Horizon 1: ReImagined, Fable 2 Recomp

  8. Package it without game data

    Players must use their own copy. The repo must hold only your code. Most projects build on the player's PC from the player's own disc.

    • Check the player's default.xex by SHA-256 against a list of known versions. Reject the rest with a clear reason.
    • Keep generated/, assets/ and extracted files out of git. Add a check that fails if game files slip in, like Pinyon Shift's check-repository-boundary.ps1.
    • Pin every tool the build downloads by version and hash.
    • Write a status page that lists what was tested, and on which hardware.
    • Check the license of any code you borrow. Xenia uses BSD-3-Clause. Unleashed Recompiled uses GPL-3.0.
    Prompt for Claude
    GOAL: Make the installer accept only supported copies of <GAME> and keep game data out of the repo.
    READ FIRST: `SCOPE.md`, `installer/`, `config/supported-versions.json`.
    FENCE: Edit only `installer/`, `config/supported-versions.json` and `tools/check-boundary.ps1`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check-boundary.ps1` and `pwsh installer/test.ps1`. Done means both print PASS. A changed `default.xex` must be rejected with a reason.
    BUDGET: Stop after 3 failed tries.
    IF BLOCKED: Stop. Do not weaken the hash check. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both outputs, plus the rejection message. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenA clean clone plus your own disc image builds and boots through the installer, and the boundary check passes.

    Proof this works: Pinyon Shift, ReStreet, Forza Horizon 1: ReImagined, SpeedBreaker

Path B: Full decomp for porting

No Xbox 360 game has a full decomp yet. The furthest public one, Dance Central 3, is about 54% done. The route here starts from your Path A port. You replace machine-made functions with readable C++, one at a time. A test compares each new function with its machine-made twin.

Method: non-matching decompilation, grown from a working recomp

Pick this only after Path A runs well, and only if you want readable source. Recomp ports already run on ARM64 Linux, macOS, Android and iPhone. So a port alone does not need Path B.

  1. Choose matching or non-matching

    Decide how you will prove each function is right. Matching means your C++ builds to the exact original bytes. That needs Microsoft's PowerPC compiler from the closed Xbox 360 SDK. Non-matching uses your working recomp as the reference instead.

    • Look for prior work on GitHub and decomp.dev. Dance Central 3 and Banjo-Kazooie XBLA are the known Xbox 360 efforts.
    • Find the compiler version. Dance Central 3 uses X360/16.00.11886.00. decomp.me offers msvc_ppc_14.00.2110 and msvc_ppc_16.00.11886.00.
    • If you cannot get that compiler legally, take the non-matching route. The rest of this path covers that route only.
    • For matching, start from jeff-template: run python configure.py, then ninja, and compare units in objdiff. Its build downloads a compiler pack from files.decomp.dev. Check what is inside before you rely on it.
    • Read the community's AI rules. Dance Central 3 and Marathon Recomp both turn away AI-made work.
    • Update SCOPE.md with the route, the check, and what done means.
    Prompt for Claude
    GOAL: Recommend matching or non-matching decompilation for <GAME> and update SCOPE.md.
    READ FIRST: `SCOPE.md`, `notes/prior-work.md`, https://github.com/rjkiv/jeff, https://github.com/rjkiv/jeff-template. I read the Dance Central 3 repo myself, because its owners ask AI agents not to use it.
    FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Everything else is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Route|Per-function check|Compiler|AI policy|First unit)$'`. Done means it prints 5 lines, and every claim under them has a link.
    BUDGET: Stop after 45 minutes.
    IF BLOCKED: Stop. Do not suggest ways to get the compiler that may break its license. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the new SCOPE.md section. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenSCOPE.md states the route, the per-function check and the compiler (or why there is none), and you approved it.

    Proof this works: https://github.com/rjkiv/dc3-decomp, https://github.com/banjo360/bk360, https://github.com/decompme/decomp.me, Marathon Recomp

  2. Freeze the recomp as your reference

    Your Path A build is the oracle. An oracle is a trusted source of right answers. Every rewritten function must act the same as its machine-made twin. So you pin that build and never let it drift.

    • Tag the working port, for example git tag reference-v1.
    • Pin the SDK tag and the config. Any change to them means you rerun every check.
    • Save the golden runs and their screenshots from Path A.
    • Keep each machine-made function callable. In ReXGlue, sub_X always has a twin named __imp__sub_X.
    Prompt for Claude
    GOAL: Freeze the <GAME> recomp build as the Path B reference.
    READ FIRST: `SCOPE.md`, `tools/check.ps1`, `tests/golden/`.
    FENCE: Edit only `notes/reference.md` and git tags. Code, config and `generated/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/check.ps1 -Golden` on a clean clone of the tag. Done means every golden run passes, and `notes/reference.md` lists the tag, SDK tag, config hash and run results.
    BUDGET: Stop after 2 failed clean builds.
    IF BLOCKED: Stop. Do not change code to make a run pass. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whengit tag shows the reference tag, and every golden run passes on a clean clone of it.

    Proof this works: https://github.com/rexglue/rexglue-sdk/wiki/Function-Overrides, Forza Horizon 1: ReImagined, COGBox

  3. Map and name functions

    A decomp needs names and types. Trace which functions run during each game moment. Then record every finding with how you know it.

    • Log every function entry, as Fable 2's call tracer does. Play one moment and list the unnamed sub_ functions that ran.
    • Record each name in notes/functions.csv with address, role, evidence and a confidence: confirmed, probable or guess.
    • Write down what an address does not do, too. Pinyon Shift asks for this so nobody repeats a dead end.
    • Check names before each commit. Fable 2 lost its sound when a name matched a kernel function.
    • Mark library code, such as Direct3D and the C runtime. Leave it machine-made for now.
    Prompt for Claude
    GOAL: Name the functions that run during <GAME MOMENT> in <GAME>.
    READ FIRST: `notes/functions.csv`, `notes/findings.md`, the trace file `out/traces/<TRACE>.txt`.
    FENCE: Edit only `notes/functions.csv`, `notes/findings.md`, `tools/check_names.py` and the `name` fields in `<game>_config.toml`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: If `tools/check_names.py` is missing, write it first, like Fable 2's `tools/check_manifest_collisions.py`. Run `python tools/check_names.py`. Done means it prints PASS (no name clashes with kernel exports), and each new name has evidence and a confidence in the ledger.
    BUDGET: Name at most 25 functions. Stop after 60 minutes.
    IF BLOCKED: Stop. Mark the function as guess instead of inventing a role. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and a count by confidence. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenEvery function in the target area has a name, a status and an evidence note, and the name check passes.

    Proof this works: Fable 2 Recomp, Pinyon Shift

  4. Build the per-function check

    Write one tool that runs a function both ways and compares the results. Every worker will use it. No reviewed project has published one, so you write it yourself.

    • Declare REX_EXTERN(__imp__sub_X) and wrap the function with REX_HOOK_RAW(sub_X). Save the registers and memory it touches. Run __imp__sub_X, then your version from the same saved state, and compare.
    • Borrow a test format. The rexglue recompile-tests command checks recompiled code against register and memory values given in the assembly file.
    • Feed it inputs recorded from real golden runs, not made-up values.
    • Make it print one line: PASS, or FAIL with the first difference.
    • Test the tester. Break a known-good function on purpose and confirm the check fails.
    Prompt for Claude
    GOAL: Write `tools/fncheck.ps1` that compares a rewritten function with its machine-made twin.
    READ FIRST: `SCOPE.md`, the ReXGlue wiki page Function Overrides, `notes/reference.md`.
    FENCE: Edit only `tools/fncheck.ps1` and `src/fncheck/`. `generated/` and `src/decomp/` are read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/fncheck.ps1 sub_<ADDR>` on an exact copy: it must print PASS. Then change one constant in the copy: it must print FAIL with the first difference.
    BUDGET: Stop after 3 failed designs.
    IF BLOCKED: Stop. Do not compare only the return value. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the PASS run and the forced FAIL run. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whentools/fncheck.ps1 sub_<ADDR> prints PASS on an exact copy and FAIL on a broken one.

    Proof this works: https://github.com/rexglue/rexglue-sdk/wiki/Function-Overrides, https://github.com/macabeus/asmlift/blob/main/.claude/commands/dogfood-klonoa.md, https://github.com/rexglue/rexglue-sdk/wiki/rexglue-CLI-Commands

  5. First light: one readable function

    Take one small function that calls nothing else. Copy its machine-made body as an override, line for line. Then rewrite it as plain C++. Prove it still acts the same.

    • Copy the body word for word into src/decomp/<area>/<name>.cpp and build. Fable 2's /hotfunc skill does this step.
    • Then remove goto labels and use real types. Keep every memory read and write in the same order, as Fable 2's /cleanuphotfunc does.
    • Run the function check and the golden runs.
    • Mark the file with a first line such as // Hand-tuned override.
    Prompt for Claude
    GOAL: Rewrite `sub_<ADDR>` (<NAME>) as readable C++ that acts the same.
    READ FIRST: `generated/` file holding `sub_<ADDR>` (read only that function), `notes/functions.csv` row for it.
    FENCE: Edit only `src/decomp/<AREA>/<NAME>.cpp`. `generated/` is machine-made and read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `pwsh tools/fncheck.ps1 sub_<ADDR>` and `pwsh tools/check.ps1 -Golden`. Done means both print PASS, the file never calls `__imp__sub_<ADDR>`, and `rg "goto |loc_"` on the file finds nothing.
    BUDGET: Stop after 5 tries with no gain.
    IF BLOCKED: Stop. Keep the verbatim copy. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both check outputs and the rg result. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe function check and golden runs print PASS, and rg "goto |loc_" finds nothing in the file.

    Proof this works: Fable 2 Recomp, Forza Horizon 1: ReImagined

  6. Grind through each area in parallel

    Now repeat for many functions. Do small leaf functions first, then the ones that call them. Each worker takes one function in its own git worktree. A worktree is a second copy of the repo on its own branch.

    • A lead session picks the next units from the ledger and writes one task card each.
    • Start each worker with claude -w <name> so it gets its own worktree.
    • A new worktree has no ignored files, so generated/ and game/ are missing. Link them in with the worktree.symlinkDirectories setting.
    • Merge only when the function check and the golden runs pass on the merged branch.
    • Send functions that fail three tries to a hard job. Record what was tried in the ledger.
    Prompt for Claude
    GOAL: Rewrite the next <N> functions from the ledger in area <AREA>, one worker each.
    READ FIRST: `notes/functions.csv` (status todo, area <AREA>), `CLAUDE.md`.
    FENCE: You are the lead. Edit only `notes/functions.csv` and `notes/dispatch.md`. Workers each edit one file in `src/decomp/`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: After each merge, run `pwsh tools/fncheck.ps1 <FUNC>` and `pwsh tools/check.ps1 -Golden` on main. Done means every merged unit passes both, and the ledger shows each unit as done, hard or failed.
    BUDGET: At most <WORKERS> workers at once. Each worker stops after 3 tries.
    IF BLOCKED: Stop dispatching. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the ledger counts before and after, and the last check output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe ledger shows the area's functions as done, and the full golden run passes on main.

    Proof this works: Lost Odyssey Recomp, https://github.com/cdlewis/nigel, https://code.claude.com/docs/en/worktrees.md, https://code.claude.com/docs/en/settings-reference.md, https://github.com/macabeus/asmlift/blob/main/.claude/commands/dogfood-klonoa.md

  7. Recover the data structures

    Readable code needs real structs, not raw offsets. Write headers for the game's objects. Let the compiler catch wrong layouts for you.

    • Write one header per struct with its fields, offsets and size.
    • Add static_assert checks for every offset and the total size. Marathon Recomp requires these in its game headers.
    • Read game memory through helpers that swap bytes, since the game is big-endian.
    • Swap raw offsets in rewritten functions for struct fields. Then rerun each function check.
    Prompt for Claude
    GOAL: Write a header for struct <STRUCT> and use it in the rewritten functions that touch it.
    READ FIRST: `notes/findings.md` entries for <STRUCT>, the rewritten files listed in `notes/functions.csv` for it.
    FENCE: Edit only `include/game/<STRUCT>.h` and the rewritten files that use it. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `cmake --build --preset win-amd64-relwithdebinfo`. It must pass with every `static_assert`. Then run `pwsh tools/fncheck.ps1 <FUNC>` on each touched function. Done means the build passes and all print PASS.
    BUDGET: Stop after 3 failed layouts.
    IF BLOCKED: Stop. Use a padding field marked unknown instead of guessing. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: build output and each function check. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe headers build with every assert on, and every rewritten function still passes its check.

    Proof this works: Marathon Recomp, Unleashed Recompiled

  8. Harden the decomp

    Check that the progress is real. A fresh session hunts for cheats. Then everything must pass from a clean clone.

    • Run a fresh verify session on each merged batch. It looks for rewrites that just call __imp__, stubs, and changed checks.
    • Run rg __imp__ src/decomp and confirm each hit is listed as allowed.
    • Run every function check and golden run from a clean clone in one command.
    • Track the share of rewritten functions in PROGRESS.md.
    Prompt for Claude
    GOAL: Verify the last batch of rewritten functions in <AREA> is real work.
    READ FIRST: `git log` since tag <TAG>, `notes/functions.csv`, `CLAUDE.md`.
    FENCE: Read-only review. Edit only `notes/verify-<DATE>.md`. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: On a clean clone, run `pwsh tools/check.ps1 -All`. Done means you list each claimed unit as OK or SUSPECT. Look for: calls to `__imp__`, stubs, edited checks or baselines, loosened thresholds, and changes outside the fence.
    BUDGET: Stop after 90 minutes.
    IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and the OK and SUSPECT lists. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenOn a clean clone, one command runs all checks and prints PASS, and the verify note lists no unexplained __imp__ call.

    Proof this works: Lost Odyssey Recomp, https://github.com/i12bp8/decomp.wtf/wiki

  9. Port to a new system

    Put the console parts behind clear interfaces. Then build for the new system. Run the same golden runs there.

    • Keep kernel, graphics, sound and input code in their own folders.
    • Turn PowerPC sync, lwsync and eieio into real memory barriers. Lost Odyssey crashed on ARM without them.
    • Watch the memory page size. Apple Silicon uses 16 KiB pages, which broke memory tricks in Lost Odyssey.
    • Build with Clang for the new target. For Linux, run cmake --preset linux-amd64-relwithdebinfo, then cmake --build --preset linux-amd64-relwithdebinfo in WSL. Blue Dragon pins its Linux build to an ubuntu:24.04 container.
    • Run the golden runs on the new system.
    Prompt for Claude
    GOAL: Make <GAME> build and boot on <TARGET>.
    READ FIRST: `SCOPE.md`, `notes/port-<TARGET>.md`, the build log from the last try.
    FENCE: Edit only `src/platform/<TARGET>/`, `CMakePresets.json` and `notes/port-<TARGET>.md`. Decomp code in `src/decomp/` is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
    CHECK: Run `<TARGET BUILD COMMAND>` then the golden runs on <TARGET>. Done means it boots and the first golden run passes.
    BUDGET: One build error or one crash per session. Stop after 3 failed tries.
    IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
    OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
    REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: build and golden run output. 3) Files changed. 4) What is left. 5) New parking-lot items.
    Done whenThe game boots on the new system and passes the same golden runs as on Windows.

    Proof this works: Lost Odyssey Recomp, reblue, SpeedBreaker, Skate 3 Recomp

Tools you need

ToolWhat it doesHow to get itHow we know
ReXGlue SDK
Required both
Turns Xbox 360 PowerPC code into C++ and gives you a ready runtime taken from Xenia. It runs the init, codegen and migrate steps.
Path A Path B
In the x64 Developer PowerShell for VS 2022: git clone --recursive https://github.com/rexglue/rexglue-sdk.git && cd rexglue-sdk && git checkout v0.10.1 && git submodule update --init --recursive && cmake --preset win-amd64 && cmake --build out/build/win-amd64 --target installREADME, wiki pages Getting Started, CLI Commands, CLI Configuration File, Function Overrides, ReXApp, and release v0.10.1 of 2026-11-06 (read 2026-11-13); the submodule step is from ReStreet's build guide; used by 11 of 15 reviewed projects
XenonRecomp and XenonAnalyse
Helpful both
The first Xbox 360 recompiler. It gives no runtime, so you write one. XenonAnalyse finds jump tables and writes them to a TOML file.
Path A
git clone --recursive https://github.com/hedge-dev/XenonRecomp.git, then open the folder in Visual Studio with the clang-cl toolset (CMake 3.20+, Clang 18+)README (read 2026-11-13); used by Unleashed Recompiled, Marathon Recomp, Lost Odyssey Recomp, SpeedBreaker
XenosRecomp
Helpful both
Turns Xbox 360 shader programs into HLSL for Direct3D 12 and Vulkan. You need it only if you write your own renderer.
Path A
git clone --recursive https://github.com/hedge-dev/XenosRecomp.git, then build with CMake 3.20+ (C++17)README (read 2026-11-13); used by Unleashed Recompiled, Marathon Recomp, Lost Odyssey Recomp, reblue
Visual Studio 2022 with Clang
Required Windows
The Windows compiler setup ReXGlue expects. You need the C++ Clang Compiler for Windows, because the generated code builds only with Clang.
Path A Path B
Install Visual Studio 2022 Community with Desktop development with C++, plus C++ Clang Compiler for Windows (20 or newer) and MSBuild support for LLVM (clang-cl)ReXGlue wiki Getting Started (read 2026-11-13); used by Unleashed Recompiled, Marathon Recomp, Fable 2 Recomp, Pinyon Shift
LLVM (Clang)
Helpful both
A standalone Clang if you want a newer one than Visual Studio ships, or for a Linux build in WSL.
Path A Path B
Run LLVM-23.1.5-win64.msi from the LLVM 23.1.5 release (2026-11-03); in WSL with Ubuntu 24.04: sudo apt install clang-20 lld-20LLVM releases page and packages.ubuntu.com page for clang-20 in noble (both read 2026-11-13); COGBox pins LLVM 23.1.4, Pinyon Shift pins 20.1.8, Skate 3 needs Clang 20 on Ubuntu 24.04
CMake and Ninja
Required both
CMake writes the build plan and Ninja runs it fast. Every reviewed project builds this way.
Path A Path B
Use the copies in Visual Studio's C++ CMake tools, or install CMake 3.25+ from cmake.org and Ninja with pip install ninjaReXGlue wiki Getting Started and Dance Central 3 README (pip install ninja), both read 2026-11-13; CMake is used by all 15 reviewed projects
extract-xiso
Required both
Unpacks an Xbox disc image into a folder so you can reach default.xex and the game data.
Path A Path B
Download extract-xiso-Win64_Release.zip from the latest release (build-202609111233) and run extract-xiso -s -x <your.iso> -d game/filesREADME and releases (read 2026-11-13); used by SpeedBreaker, ReStreet, FIFA World Cup 2010, Pinyon Shift
Ghidra
Required both
A free disassembler and decompiler from the NSA. You use it to find addresses, functions and data in default.xex.
Path A Path B
Download ghidra_12.1.3_PUBLIC to use the ready XEXLoaderWV zip, or ghidra_12.1.4_PUBLIC if you also want GhidraMCP 2.0. Unzip it and install JDK 21 (both versions need Java 21)releases page and Ghidra/application.properties at tags 12.1.3 and 12.1.4 (application.java.min=21), read 2026-11-13; Forza Horizon 1: ReImagined uses Ghidra 12.1.4, Lost Odyssey Recomp uses headless export scripts
XEXLoaderWV
Required both
A Ghidra add-on that opens Xbox 360 .xex files. It also applies .xexp title update patches.
Path A Path B
Download ghidra_12.1.3_PUBLIC_20260920_XEXLoaderWV.zip from release 12.1.3 and add it in Ghidra 12.1.3 with File, Install Extensions. For another Ghidra version, set GHIDRA_INSTALL_DIR and run gradle buildExtensionREADME and releases (read 2026-11-13: newest release 12.1.3 of 2026-09-20); used by Forza Horizon 1: ReImagined
Xenia Canary
Helpful both
An Xbox 360 emulator. You run the same scene in it to tell a port bug from a bug in the original game.
Path A Path B
Download xenia_canary_windows.7z from the latest release (2026-11-12) and unpack itREADME and releases (read 2026-11-13); used as reference by FIFA World Cup 2010, Forza Horizon 1: ReImagined, COGBox
RenderDoc
Helpful both
Captures one frame so you can step through every draw. Use it to find graphics bugs.
Path A
Download the Windows installer for v1.47 from renderdoc.orgrepo and releases (read 2026-11-13: v1.47 on 2026-10-31); used by Forza Horizon 1: ReImagined and Hell's Gate
jeff and jeff-template
Helpful both
jeff splits an .xex into pieces for a matching decomp. jeff-template is the project layout around it. Use them only on the matching track.
Path B
git clone https://github.com/rjkiv/jeff-template.git, then python configure.py and ninja; configure.py pins jeff v0.5.1 (dtk_tag) and fetches it, objdiff and a compiler pack by tagjeff README and releases (newest v0.5.2, 2026-10-01), jeff-template README and configure.py (read 2026-11-13); used by the Dance Central 3 decomp, which says WSL is not needed on Windows; jeff ships Windows, Linux and macOS builds
objdiff
Helpful both
Compares your compiled code with the original, function by function. It supports Xbox 360 PowerPC.
Path B
Download objdiff-windows-x86_64.exe and objdiff-cli-windows-x86_64.exe from release v3.8.3README and releases (read 2026-11-13); used by the Dance Central 3 decomp and Banjo-Kazooie XBLA research
Git
Required both
Gets the SDK and tools, and tags your reference build. Its bash also runs the ghidra-headless skill on Windows.
Path A Path B
Download Git for Windows from git-scm.com and run the installerdownload page answers (read 2026-11-13); every reviewed project builds from a git clone
Python 3
Required both
Runs the ledger and name checks, pip install ninja, and the jeff-template build script.
Path A Path B
Download the Windows installer from python.org and add Python to PATHDance Central 3 README (install Python and add it to PATH), read 2026-11-13; Fable 2, FIFA Street and Forza Horizon 1: ReImagined use Python tools
PowerShell 7
Required Windows
Runs the pwsh tools/check.ps1 scripts in this guide. Windows 11 ships the older Windows PowerShell 5.1, which has no pwsh command.
Path A Path B
winget install --id Microsoft.PowerShell --source wingetMicrosoft install page (read 2026-11-13); Hell's Gate runs pwsh ./setup.ps1, COGBox and Pinyon Shift use PowerShell scripts
ripgrep
Required both
A fast text search. The Path B checks use rg to find goto labels and __imp__ calls in rewritten files.
Path B
winget install BurntSushi.ripgrep.MSVCripgrep README (read 2026-11-13); Fable 2's cleanuphotfunc skill checks its result with rg

Skills and add-ons

Read any skill before you install it. A skill is a set of instructions that Claude will follow. See Tools and Skills for the full list and safety notes.

xbox360-decomp

skills.sh

The only Xbox 360 skill found. It covers ReXGlue, XenonRecomp and matching. It keeps a project state file and has a routine for a crash seen twice. It was written for Cursor, so fix its folder names.

npx skills add dohmboy64bit/xbox360-decomp-skill --skill xbox360-decomp -a claude-code

recompile-console-binary

skills.sh

Guides XenonRecomp and rexglue work. Its main rule matches the reviewed projects: never edit generated code, fix the settings instead.

npx skills add xsyetopz/skills --skill recompile-console-binary -a claude-code

GhidraMCP

MCP server

Lets Claude list functions, decompile and rename inside your open Ghidra project. The xbox360-decomp skill uses it with XEXLoaderWV.

Install uv. Unzip GhidraMCP-release-2-0.zip and add its ghidra_12.1.4_PUBLIC GhidraMCP zip in Ghidra 12.1.4 with File, Install Extensions; then claude mcp add ghidra -- uvx --from git+https://github.com/LaurieWired/GhidraMCP ghidra-mcp --ghidra-server http://127.0.0.1:8080/

ghidra-headless

skills.sh

Runs Ghidra with no window and saves functions and text to files. Forza Horizon ReImagined and Lost Odyssey map their games this way. On Windows it needs Git Bash, and you set GHIDRA_HOME yourself.

npx skills add trailofbits/skills-curated --skill ghidra-headless -a claude-code

verification-before-completion

skills.sh

Claude may not say done without fresh proof. Lost Odyssey's rule is the same: a green build does not mean the game runs.

npx skills add obra/superpowers --skill verification-before-completion -a claude-code

systematic-debugging

skills.sh

No fix until the cause is found. That fits the Path A grind, where most bugs are crashes, hangs and timing.

npx skills add obra/superpowers --skill systematic-debugging -a claude-code

handoff

skills.sh

Writes a short note so a fresh session can carry on. Tell it to save inside the repo, as Lost Odyssey keeps its handoffs in docs/archive/.

npx skills add mattpocock/skills --skill handoff -a claude-code

hotfunc (copy one function into an override)

write-your-own

Fable 2 uses this exact skill. It makes the copy step the same every time, so later differences come from your edits only.

A skill in `.claude/skills/hotfunc/SKILL.md`. Input: a function name. It finds that one function in `generated/`, copies it word for word into `src/decomp/unsorted/<name>.cpp` as a strong override, runs a Release build in the background, and reads the exit code from a status file. It stops if there is no match or more than one. It never touches `generated/` or a file marked `// Hand-tuned override`.

boot-loop (one missed function per run)

write-your-own

COGBox automates this loop. Letting a script do the one safe fix keeps Claude's time for real bugs.

A skill plus script `tools/boot_loop.ps1`. It boots the game under a time limit, reads the 'unregistered function at guest address' line from the log, adds that address with a source comment to the config, rebuilds and repeats. It stops and reports on any other kind of failure.

Claude setup for this system

Cut Path A by stop point. One unit is one boot stop, one crash, or one wrong picture, each with a repro run. Cut Path B by function. One unit is one rewritten function with its compare check. Keep library code, such as Direct3D, out of the units. Every unit ends with the golden runs, never with a build alone.

Which model and effort for each job

The model and effort names come from one shared table, so they stay the same on every guide. See Claude Setup for the reasons.

JobWhat it means on this systemMax 20x (now called Ultra)Max 5x (now called Max)
Plan the projectPick the game version, title update and recompiler. Check for a port of a sister game on the same engine. Write SCOPE.md.Fable 5.2
effort high
One session. This choice shapes months of work.
Opus 5.5
effort high
Use Fable 5.2 for this one session if you have weekly room.
Set up the projectInstall Visual Studio with Clang and build the pinned ReXGlue SDK. Write tools/check.ps1 with the second configure step built in.Opus 5.5
effort medium
Sonnet 5.5
effort medium
Study the game fileRead default.xex in Ghidra. Find setjmp, longjmp and missed functions. Name functions from call traces and record each finding with its confidence.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for function edges and data layouts. A mistake there spreads.
Bulk unitsAdd the next boot-stop hints, one address each. In Path B, rewrite small leaf functions that the compare check can prove.Sonnet 5.5
effort medium
Haiku 5.5 for the plainest units.
Sonnet 5.5
effort medium
Fewer workers at once. Haiku 5.5 for the plainest units.
Hard unitsVector math that differs from the console, fiber code, exception handlers, and functions that failed three bulk tries.Fable 5.2
effort high
Go to xhigh only after a failed try at high.
Opus 5.5
effort high
Send only the last few that still fail to Fable 5.2.
Build the runtimeKernel and XAM calls, file paths, save data, sound through the XMA decoder, input, and any custom renderer.Opus 5.5
effort high
Opus 5.5
effort medium
Raise to high for timing and graphics bugs.
Find a bugCrashes and hangs. Compare with Xenia Canary, use RenderDoc captures and call traces. Prove the cause before the fix.Opus 5.5
effort high
After two failed tries with full evidence, move to Fable 5.2.
Opus 5.5
effort high
One bug at a time.
Check the workA fresh session reruns the golden runs and reads the diff. It hunts for skipped calls, new stubs, loosened image checks and edits to generated/.Opus 5.5
effort medium
Always a new session, never the one that did the work.
Sonnet 5.5
effort high
Always a new session, never the one that did the work.
Keep the recordsUpdate PROGRESS.md, notes/functions.csv, notes/stubs.md and the bug list after each unit.Haiku 5.5
effort medium
Haiku 5.5
effort medium

How many sessions at once

Max 20x (now called Ultra)

Run one lead session and three to five workers, each in its own worktree. Builds are heavy, so cap compile jobs per worker. Lost Odyssey warns that unlimited agents burn the quota fast.

Max 5x (now called Max)

Run one lead and one or two workers. Use workers for bulk hints and leaf functions. Keep debug and hard jobs to one at a time.

Lines for this project's CLAUDE.md

Add to CLAUDE.md
- Read `SCOPE.md` and `PROGRESS.md` at the start of every session.
- Never edit anything in `generated/`. Change the config TOML or write an override in `src/` instead.
- `game/`, `assets/` and the SDK folder are read-only. Never commit game files, extracted data or screenshots of the game.
- The only proof is `pwsh tools/check.ps1 -Golden`. A green build alone is not done.
- Every new config hint gets a comment saying which error or run it came from.
- Before adding an override for `sub_X`, search `src/` to see if it is already hooked. One function gets one override.
- After any change to a hook TOML, rerun codegen before you build.
- Record every finding in `notes/findings.md` with address, name, how you know it, and confidence: confirmed, probable or guess. Record dead ends too.
- Run the game only under a time limit. Stop only your own process, by its process ID.
- In a worktree, use absolute paths and run the full check before you report.
- Start every report with DONE, PARTIAL or BLOCKED, then paste the check output.

Keep the context small

  • Never let Claude list or read all of generated/. Point it at one function by name.
  • Give the last 50 log lines and the stop address, not the whole log.
  • Have scripts summarize RenderDoc captures and traces. Lost Odyssey's rule is to read the summary and pick five rows at most.
  • Add Read(./game/**) to permissions.deny in .claude/settings.json. Do not deny generated/, because Path B reads one function there at a time.
  • Use /clear between units. The state lives in the ledger files, not the chat.

More prompts for this system

Each step above has its own prompt. These extra prompts cover the rest of the work. Fill in the parts in <ANGLE_BRACKETS>.

Scope and feasibility

Before any work, to see if your game is a good first target.

Prompt for Claude
GOAL: Tell me if <GAME> (Xbox 360, title ID <TITLE ID>) is a good recomp target, and draft SCOPE.md.
READ FIRST: `notes/game-files.txt`, https://github.com/rexglue/rexglue-sdk/wiki, RecompLauncher's list for my game.
FENCE: Edit only `SCOPE.md` and `notes/prior-work.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `Select-String -Path SCOPE.md -Pattern '^## (Prior work|Modules|Title update|Risks)$'`. Done means it prints 4 lines: prior ports of this game or its engine (with links), the `.xex` module count, title update needs, and risks. Each fact has a link or a file path.
BUDGET: Stop after 45 minutes of research.
IF BLOCKED: Stop. Say what you could not find. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the links. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A short yes, no or maybe, with links to any sister-engine port, a module list and a draft SCOPE.md.

Map the binary

After setup, to build the function ledger from Ghidra's export.

Prompt for Claude
GOAL: Build `notes/functions.csv` for `default.xex` of <GAME>.
READ FIRST: `notes/ghidra/functions.txt` (headless export), `<game>_config.toml`.
FENCE: Edit only `notes/functions.csv` and `notes/findings.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `python tools/ledger_check.py`. Done means it prints PASS: every row has address, size, area, library flag and status, with no overlaps.
BUDGET: Stop after 60 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and row counts by status. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: DONE with a row count, a count of library functions, and a PASS line from the check.

Unit loop, Path A: one boot stop

Each time the game stops on an unregistered function or a missing kernel call.

Prompt for Claude
GOAL: Get past the boot stop at guest address <ADDRESS>.
READ FIRST: last 50 lines of `out/logs/boot.txt`, `notes/stubs.md`.
FENCE: Edit only `<game>_config.toml` and `notes/stubs.md`. `generated/` is read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `pwsh tools/check.ps1 -BootSeconds 120`. Done means the stop at <ADDRESS> is gone and the new last log line is pasted.
BUDGET: One address. Stop after 3 tries.
IF BLOCKED: Stop. Do not fake a return value. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: old and new last log lines. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: DONE, one new hint with a source comment, and a log that now stops later or not at all.

Unit loop, Path B: one function

Each time a worker rewrites one function as readable C++.

Prompt for Claude
GOAL: Rewrite `sub_<ADDR>` as readable C++ that acts the same.
READ FIRST: only `sub_<ADDR>` in `generated/`, its row in `notes/functions.csv`, `include/game/`.
FENCE: Edit only `src/decomp/<AREA>/<NAME>.cpp`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `pwsh tools/fncheck.ps1 sub_<ADDR>` and `pwsh tools/check.ps1 -Golden`. Done means both print PASS and the file does not call `__imp__sub_<ADDR>`.
BUDGET: Stop after 5 tries with no gain.
IF BLOCKED: Stop. Keep the last passing version. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: both outputs. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: DONE with two PASS lines, one changed file, and no goto left.

Batch dispatch

In the lead session, to hand out the next set of units.

Prompt for Claude
GOAL: Start <N> workers on the next units from the ledger.
READ FIRST: `notes/functions.csv` or `notes/bugs.md`, `CLAUDE.md`.
FENCE: Edit only `notes/dispatch.md` and the status column of the ledger. Each worker runs in its own worktree. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: After each merge, run `pwsh tools/check.ps1 -Golden` on main. Done means it prints PASS each time, and each worker returned DONE, PARTIAL or BLOCKED with pasted proof.
BUDGET: At most <N> workers at once. Pick units that touch different files.
IF BLOCKED: Stop dispatching. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: a table of unit, worker result and main check. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A table with one row per unit and a passing check on main after the merges.

Debug with evidence

When a crash or bad picture has no clear cause yet.

Prompt for Claude
GOAL: Find the cause of <SYMPTOM> at <WHERE IN GAME>. Do not fix it yet.
READ FIRST: `notes/bugs.md` entry <BUG-ID>, the crash log, the RenderDoc capture summary.
FENCE: Read-only, except `notes/findings.md` and debug-only logging in `src/debug/`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `git diff --stat`. It must list only `notes/findings.md` and `src/debug/`. Then run `pwsh tools/check.ps1 -Golden <BUG-ID>`. It must still fail the same way, since this is not a fix. Done means you show the cause with proof: a log line, a trace, a watchpoint hit, or the same scene in Xenia Canary. Mark each claim verified or guess.
BUDGET: Stop after 60 minutes with no new evidence.
IF BLOCKED: Stop. Report what you ruled out. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the evidence. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A named cause, with proof, plus a list of what was ruled out and how.

Verify (hunt for cheating)

In a fresh session, after any batch of claimed fixes or rewrites.

Prompt for Claude
GOAL: Check that the work since <COMMIT> is real.
READ FIRST: `git diff <COMMIT>..HEAD --stat`, `PROGRESS.md`, `CLAUDE.md`.
FENCE: Read-only. Edit only `notes/verify-<DATE>.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: On a clean clone, run `pwsh tools/check.ps1 -All`. Done means you list each claim as OK or SUSPECT. Look for edits to `generated/`, new stubs, skipped calls, loosened image checks, changed baselines, calls to `__imp__` in rewrites, and changes outside the fence.
BUDGET: Stop after 90 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
OTHER PROBLEMS: Write them in `notes/parking-lot.md`. Do not fix them.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output and the OK and SUSPECT lists. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A list of every claim with OK or SUSPECT, and a reason for each SUSPECT.

Status report

Once a week, or before you change direction.

Prompt for Claude
GOAL: Give me a numbers-only status of the <GAME> project.
READ FIRST: `PROGRESS.md`, `notes/functions.csv`, `notes/bugs.md`, `notes/stubs.md`.
FENCE: Read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `pwsh tools/check.ps1 -Golden`. Done means you give: golden runs passed out of total, open bugs, stubs, functions named and rewritten, and the furthest point reached in the game.
BUDGET: 15 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the check output. 3) Files changed (none). 4) What is left. 5) New parking-lot items.

A good answer: A short table of numbers taken from the ledgers, with no padding.

Session handoff

At the end of a session, so the next one can start cold.

Prompt for Claude
GOAL: Write what the next session needs into the ledger files.
READ FIRST: this session's work, `PROGRESS.md`.
FENCE: Edit only `PROGRESS.md`, `notes/findings.md` and `notes/handoff/<DATE>.md`. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `Select-String -Path notes/handoff/<DATE>.md -Pattern '^## (Folder and branch|Base commit|Active unit|Last check|Evidence|Guesses|Dead ends|Next step)$'`. Done means it prints 8 lines, and each section is filled in.
BUDGET: 10 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the handoff file path. 3) Files changed. 4) What is left. 5) New parking-lot items.

A good answer: A handoff note that a new session could act on with no chat history.

Blocked or cannot deliver

When a unit keeps failing and you need a plain answer.

Prompt for Claude
GOAL: Tell me plainly whether <UNIT> can be done with the current tools.
READ FIRST: `notes/bugs.md` or `notes/functions.csv` entry for <UNIT>, all past attempts in `notes/findings.md`.
FENCE: Read-only. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `git status --porcelain`. It must print nothing, since this task changes no files. Done means you answer CAN, CANNOT YET or UNKNOWN. Give the exact reason, the evidence, and two or three options with their cost.
BUDGET: 30 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the evidence. 3) Files changed (none). 4) What is left. 5) New parking-lot items.

A good answer: One word answer first, then the reason and real options, such as an SDK patch, a different hook, or parking the unit.

Scope change request

When Claude finds that the fix needs files outside the fence.

Prompt for Claude
GOAL: Ask me before you leave the fence for <UNIT>.
READ FIRST: `SCOPE.md`, the current task card.
FENCE: Make no edits. Do not add features, refactors, tools or cleanups I did not ask for.
CHECK: Run `git status --porcelain`. It must print nothing, since you make no edits. Done means you list: the files you want to touch, why the fence is not enough, the risk to other work, and how you will check it.
BUDGET: 10 minutes.
IF BLOCKED: Stop. Tell me what blocked you, what you tried, and what you need from me.
REPORT: 1) DONE, PARTIAL or BLOCKED. 2) Proof: the evidence that the fence is too small. 3) Files changed (none). 4) What is left. 5) New parking-lot items.

A good answer: A short request I can answer yes or no, with the exact files and the check.

Keep Claude on task

These are the detours Claude tends to take on this system, and the rule that stops each one. The full method is on Stay on Task.

The detourThe rule to give Claude
Claude edits the C++ in generated/ to fix a crash. The next codegen wipes the fix and hides the cause.Never edit generated/. Fix the config TOML or add an override in src/. Add Edit(./generated/**) to permissions.deny in .claude/settings.json.
Claude makes a crash go away by skipping a call or stubbing a function. The game moves on but is now wrong.Do not fix a crash by skipping a call. First prove where the bad value came from. List every stub in notes/stubs.md.
Claude says a fix is done because the build passed. Lost Odyssey's workflow warns that green CI does not mean the game runs.Done needs the golden runs, with output pasted. A build alone is never proof.
Claude passes --force to codegen to get past validation errors, then chases crashes the errors already named.Never pass --force. Codegen must exit 0 before any boot test.
Claude adds a second override for a function that is already hooked. Only a full link catches it.Search src/ for sub_X before adding an override. Run the full Release link before you report.
Claude copies a fix from Xenia or another port without checking it fits. Lost Odyssey slowed its sound thread this way.Borrowed code needs evidence it applies to this game, plus a before and after measurement.
In Path B, a rewritten function just calls its machine-made twin, so the compare check passes for free.A rewrite must not call __imp__sub_X. The verify job runs rg __imp__ src/decomp on every batch.

Problems other projects hit

CMake cannot see the generated sources after the first codegen, so the build misses the game code.

Fix: Configure, build the codegen target, configure again, then build. Put this order in your check script.

Seen in: Skate 3 Recomp, reblue, AC6 Recomp

The game stops at boot with 'Call to invalid or unregistered function'. The recompiler never found that code.

Fix: Add the address as a function hint and rebuild. Script the loop. Expect dozens to hundreds of these.

Seen in: Hell's Gate, COGBox, Forza Horizon 1: ReImagined

A function name in the config matched an Xbox kernel export. It silently replaced the real import, and sound broke.

Fix: Run a name-clash check before each commit. Add a suffix such as _Guest to game versions.

Seen in: Fable 2 Recomp

A vector dot product returned infinity on PC but NaN on the console. About half of free-roam loads crashed.

Fix: Match the console's vector math exactly. Follow Xenia's behavior at every site.

Seen in: Forza Horizon 1: ReImagined, Hell's Gate

Game logic built for 30 fps breaks at high frame rates. Menus run fast and movies fall out of sync.

Fix: Find the per-frame tick and fix it at the source. Test each fix with its own on and off switch.

Seen in: Unleashed Recompiled, AC6 Recomp, Hell's Gate, Fable 2 Recomp

On Windows, the SDK's libmspack submodule holds Unix symlinks. They do not survive a Windows git clone. The copy pinned by v0.10.1 still has 15.

Fix: If the build fails there, replace the stub files with real copies of their targets. FIFA World Cup 2010 replaced 14.

Seen in: FIFA World Cup 2010

A hook TOML was changed but codegen was not rerun, so the hook never fired.

Fix: Rerun codegen after every hook change. Make the check script do it.

Seen in: Lost Odyssey Recomp

A different disc region or title update has different code. Its addresses do not match your config.

Fix: Pin one version by hash. To add another, map functions between builds with a script and check every hook site.

Seen in: SpeedBreaker, COGBox, Fable 2 Recomp, Forza Horizon 1: ReImagined

One bad line or a single backslash in a TOML path silently reset every setting.

Fix: Use forward slashes in TOML paths. Have the app log which config file and values it loaded.

Seen in: AC6 Recomp, FIFA World Cup 2010

Too many agents at once used up the plan's quota fast.

Fix: Keep running agents to a small, fixed number. Never start one agent per finding.

Seen in: Lost Odyssey Recomp

Some communities reject AI-made work. Marathon Recomp and the Dance Central 3 decomp both say so.

Fix: Read the contribution rules before you share work with any upstream project. Keep AI work in your own fork.

Seen in: Marathon Recomp

How long it takes

Max 20x (now called Ultra)Max 5x (now called Max)One person, no AIHow sure
Path A: running on PC3 to 10 weeks2 to 6 months6 to 18 monthsmedium confidence
Path B: full decomp1.5 to 4 years3 to 10 years10 to 20 years, not realistic for one personlow confidence

Read this first

The numbers assume one medium commercial game and one person giving 10 to 15 hours a week. Path A comes from five dated AI-assisted Xbox 360 projects. They agree that a first boot takes days and a playable build takes weeks. But their real hours are unknown, and several reused earlier ports, so confidence is medium. Path B has no finished example on this system. It is a rough guess from Dance Central 3 and from GameCube work on the same chip family, so confidence is low.

What makes it faster or slower

  • A port of a game on the same engine. FIFA World Cup 2010 reached gameplay in days by starting from FIFA Street.
  • How many functions the recompiler misses. Forza Horizon needed 577 extra hints; a small arcade game needs far fewer.
  • Extra code modules and title updates. Each one adds its own codegen and address checks.
  • Your renderer choice. The built-in emulated GPU is quick to start. A custom renderer adds months.
  • For Path B, the size of the code. Dance Central 3 alone has about 12 MB of code.

The facts behind these numbers

ProjectWhat happenedLink
Lost Odyssey RecompFirst commit 2026-09-03. Release v0.1 on 2026-09-06. v1.1.0 on 2026-10-26. One maintainer with Claude Code as the main session.source
Fable 2 RecompFirst commit 2026-09-02. First release 2026-09-06. A local model got it running in about an hour; mapping enough functions to finish took much human work.source
FIFA World Cup 2010Codegen on 2026-10-16. Gameplay reached 2026-10-19. First release 2026-10-22. Agent session log in NOTES.md.source
ReStreet (FIFA Street)Manifest made 2026-09-30. First release 2026-10-07. Release v2.1.4-online-beta on 2026-10-30. Built with ChatGPT, Codex and Claude Code.source
Forza Horizon 1: ReImaginedFirst commit 2026-10-10. First release 2026-10-21. Reused the same author's Halo Reach recomp work. Developer flags AI use.source
Unleashed RecompiledBefore coding agents. First commit 2024-09-30. First release 2025-03-01. 26 contributors, from hedge-dev, which also publishes the recompilers.source
reblueNo AI stated. First commit 2026-02-07. First release 2026-08-23. Four contributors.source
Dance Central 3 decompMatching decomp, no AI. Started 2025-07-25. 53.84% decompiled on decomp.dev on 2026-11-13, with 18 contributors.source
Super Smash Bros. Melee decomp (GameCube, PowerPC)Matching decomp. The last function matched on 2026-09-07, in a PR labelled ai-assisted. All 19,828 functions match.source

Projects reviewed (15)

We took the project with the most stars for each of the top 12 games on RecompLauncher. We added the three biggest projects whose makers say they used AI. RecompLauncher lists 269 projects for 207 Xbox 360 games. Forza Horizon shows up twice, because two teams ported it.

What each project teaches

Unleashed Recompiled

Sonic Unleashed

Top rated on RecompLauncherstatic recompplayable
XenonRecompXenosRecompplumeClangCMake

Started: 2024-09. First release: 2025-03. Code: C++.

AI: none stated

Lesson: Made by hedge-dev, the group that also publishes XenonRecomp. It wrote its own renderer and judges every picture against a real console.

Skate 3 Recomp

Skate 3

Top rated on RecompLauncherstatic recompplayable
ReXGlue forkClang 20CMakeDirect3D 12Vulkan

Started: 2026-05. First release: 2026-06. Code: C++.

AI: none stated

Lesson: Build the title-update version, not the retail one. Keep the old emulated renderer one key away as a reference.

Pinyon Shift

Forza Horizon

Top rated on RecompLauncherstatic recompplayable
ShiftGlue (ReXGlue fork)Clang 20.1.8CMakeVulkanextract-xiso

Started: 2026-08. First release: 2026-08. Code: C++ and Python.

AI: yes: AGENTS.md and CLAUDE.md in the repo; store flag Agent files: AGENTS.md, CLAUDE.md.

Lesson: Record every finding with its evidence and confidence, including dead ends. Test rendering from a read-only save copied per run.

Lost Odyssey Recomp

Lost Odyssey

Top rated on RecompLauncherstatic recompplayable
XenonRecompXenosRecompplumeGhidraClang

Started: 2026-09. First release: 2026-09. Code: C++.

AI: yes: one maintainer with Claude Code as main session, Codex CLI and subagents (docs/AI_WORKFLOW.md) Agent files: docs/AI_WORKFLOW.md, tools/opencode/skills/lo-render-flicker/SKILL.md, .github/workflows/claude-code-review.yml.

Lesson: Keep built, tested, accepted and released as four separate states. One worktree per task, and treat a subagent report as a claim to check.

GoldenEye 007 PC Recompilation

GoldenEye 007 (XBLA)

Top rated on RecompLauncherstatic recompstalled
ReXGlue 0.8ClangCMake

Started: 2026-06. First release: 2026-06. Code: C and C++.

AI: yes: README says AI helped write code; tool not named

Lesson: A small game needs only a config, one hook file and a few source files. Without build docs, nobody else can rebuild it.

reblue

Blue Dragon

Top rated on RecompLauncherstatic recompplayable
ReXGlue 0.10XenosRecomp forkplumeClangvcpkg

Started: 2026-02. First release: 2026-08. Code: C++.

AI: none stated

Lesson: Keep one hook file per feature. A three-disc game needs an installer that checks each disc.

Hell's Gate

Dante's Inferno

Top rated on RecompLauncherstatic recompplayable
ReXGlue 0.10DiligentCoreClangRenderDoc

Started: 2026-08. First release: 2026-09. Code: C++.

AI: yes: README says AI helped with docs, research and Git only

Lesson: Over 50 missed functions showed up only while playing. A new renderer was first run as a silent observer and checked per draw.

Marathon Recomp

Sonic the Hedgehog (2006)

Top rated on RecompLauncherstatic recompin progress
XenonRecomp forkXenosRecomp forkplumeClangvcpkg

Started: 2024-09. First release: none. Code: C++.

AI: no: contributing guide forbids AI-made contributions

Lesson: Reuse a working port's layout. Put size and offset checks on every struct header. Read a project's AI rules first.

SpeedBreaker

Need for Speed: Most Wanted

Top rated on RecompLauncherstatic recompplayable
XenonRecomp with 8 patchesextract-xisoClangVulkanFFmpeg

Started: 2026-10. First release: 2026-10. Code: C++.

AI: store flag only; contributing guide allows tested AI help

Lesson: Pin the exact default.xex hash. Expect to patch the recompiler, and test each added instruction.

Fable 2 Recomp

Fable II

Top rated on RecompLauncherstatic recompplayable
ReXGlue 0.10 forkClangCMakepytest

Started: 2026-09. First release: 2026-09. Code: C++, Python and C#.

AI: yes: README says a local open-source model got it running in about an hour; repo has two Claude Code skills Agent files: .claude/skills/hotfunc/SKILL.md, .claude/skills/cleanuphotfunc/SKILL.md.

Lesson: Override one function by copying it word for word first, then clean it up. A debug-only control port lets scripts drive the game.

AC6 Recomp

Ace Combat 6: Fires of Liberation

Top rated on RecompLauncherstatic recompin progress
ReXGlue forkClang 20CMakePython

Started: 2026-03. First release: 2026-08. Code: C++ and Python.

AI: none stated

Lesson: Give every fix its own on and off setting. Then one setting can show which fix caused a problem.

ReStreet

FIFA Street

Top rated on RecompLauncherstatic recompplayable
ReXGlue (pinned commit)extract-xisoClangCMake.NET 8

Started: 2026-10. First release: 2026-10. Code: C#, C++ and PowerShell.

AI: yes: README credits ChatGPT, OpenAI Codex and Claude Code

Lesson: Scripts that fail the build on unresolved calls catch missing code before you play. A status page lists what was and was not tested.

Forza Horizon 1: ReImagined

Forza Horizon

Added: developer used AIstatic recompplayable
ReIGlue (ReXGlue fork)Ghidra 12.1.4XEXLoaderWVClangRenderDoc

Started: 2026-10. First release: 2026-10. Code: Python and C++.

AI: yes: developer flag; AGENTS.md rules for coding agents Agent files: AGENTS.md, CLAUDE.md.

Lesson: Scripts that read the .xex found 577 missed functions. One release script boots, compares render scenes and prints PASS or FAIL.

COGBox

Gears of War, Gears of War 2, Gears of War 3, Gears of War: Judgment

Added: developer used AIstatic recompplayable
ReXGlue nightly with patchesLLVM 23.1.4CMakeDirect3D 12Vulkan

Started: 2026-11. First release: 2026-11. Code: C++ and C.

AI: yes: developer says Claude helped create the project

Lesson: Automate the boot loop and sweep every level with a script. Write on each hint where it came from.

FIFA World Cup 2010

2010 FIFA World Cup South Africa

Added: developer used AIstatic recompin progress
ReXGlue (pinned commit)extract-xisoXenia CanaryClang

Started: 2026-10. First release: 2026-10. Code: PowerShell, C# and C++.

AI: yes: developer flag; notes read as an agent's session log

Lesson: Starting from a port on the same engine got gameplay in days. Mark each note verified or guess, and keep a table of corrections.

What we could not check

  • No reviewed project has published a per-function compare check like the one in Path B step 4. The idea follows the ReXGlue override docs, but you must build and test it yourself.
  • The jeff-template and Dance Central 3 builds download a compiler pack from files.decomp.dev. Whether it holds the Xbox 360 compiler was not checked, since this review downloaded nothing. Whether you may legally use that compiler is your call.
  • XEXLoaderWV's newest zip targets Ghidra 12.1.3, while GhidraMCP 2.0 targets Ghidra 12.1.4. Building the loader for 12.1.4 with gradle buildExtension was not tested.
  • Whether the ReXGlue v0.10.1 Windows release zip can replace building the SDK from source was not tested.
  • Whether the 15 libmspack symlinks at v0.10.1 still break a Windows build was not tested.
  • Linking generated/ and game/ into worktrees with worktree.symlinkDirectories was not tested with a ReXGlue build.
  • The tools/check.ps1 switches, tools/ledger_check.py, tools/check_names.py and tools/fncheck.ps1 are scripts you write. They are modeled on the projects' tools, not copied from one.
  • How much of each AI-flagged project was written by AI is not stated, except for Lost Odyssey Recomp.
  • The real start dates of GoldenEye, SpeedBreaker and COGBox are hidden, because their public history was reset or squashed.
  • Hours per week spent on any project are unknown, so the time ranges are estimates.
  • No build in this guide was run here. Commands come from the projects' docs and the tools' READMEs.

Sources