The project
This adapter comes out of a campaign teaching fleets of AI coding agents to
reconstruct shipped game binaries byte-for-byte — matching
decompilation, the console-preservation community's gold standard: rewrite
C++ until the original vintage compiler, at the original flags, reproduces
the retail machine code exactly. In that campaign, agent swarms byte-matched
over 44,000 functions of a stripped retail Xbox 360 binary in about ten
weeks — with every proposal judged by the real compiler and
objdiff, never by a model.
decomp-synth is the search-and-ML side of that system: an engine that
searches behavior-preserving C++ rewrites against the real build, and mines
its own verified attempts into training data. This adapter is part of the
project's practice of publishing research artifacts with their evidence
stated plainly, including the null results. The design rule throughout:
models propose, deterministic oracles dispose — byte-exact recompilation is
the only terminal judge.
Background reading, in order:
Honest status notes
Published as a research artifact with its evidence stated plainly:
- No evaluation has been run on this adapter yet. It finished training
on 2026-08-31 and is published as the freshly trained artifact; the
project's multi-turn eval re-baseline is in flight, and sibling arms
(pure-mint full/matched, r64, and 27B variants) train alongside it.
Until numbers land, v14-evalformat
remains the measured pick for the multi-turn feedback loop.
- Training loss learned cleanly (0.77 → 0.24 over 1,602 optimizer
steps, 2 epochs; min 0.02) — a supervision readout from the artifact's
train_summary.json, not an evaluation claim.
- Mix-vs-pure-mint is an unmeasured contrast. This arm exists to test
whether restoring single-turn supply helps the trajectory generation; no
verdict exists yet, and any future one is provisional under the
project's multi-seed rule (single seed, 42).
Model facts
Table | |
|---|
| base | Qwen/Qwen3.5-9B (apache-2.0) |
| method | LoRA r=32, α=64, dropout 0.05, all-linear, bf16 |
| corpus | 25,624 mixed rows (v17mix.jsonl, sha b67811d1…) |
| window | 90,112 tokens max_seq (zero rows dropped) |
| schedule | 2 epochs, 1,602 steps, eff. batch 32, linear LR, seed 42 |
| trained | 2026-08-31 |
| format | Qwen3.5 chat template, thinking ON, native XML tool calls |
Training data
The corpus mixes four layers. Counts are from the mix build's manifest
(exact-dedup across layers, mint rows winning — 1,106 duplicate rows
dropped):
- Teacher-minted tool trajectories (3,032 rows) — the complete
2026-08-30/31 mint union, byte-identical to the corpus of the sibling
v17-full
arm (sha
411cfaed…): multi-turn sessions where a tool-armed teacher
(GLM-5.3-flash) works decompilation targets from a private Halo: Combat
Evolved Anniversary (Xbox 360) reconstruction effort through the
project's compile-and-score harness — reading disassembly, proposing
C++, compiling with the real toolchain, and reacting to objdiff feedback
across turns.
- bundle-v5 (8,305 rows) — single-turn repair, synthesis-from-stub,
and edit-proposal rows from the project's verified-attempt bundle, the
same source set as the
v16-v5chat
corpus: change histories of community decompilation projects —
rb3-xenon,
dc3-decomp,
zeldaret/tww,
zeldaret/tp,
DarkRTA/rb3 — plus rows from the same
private reconstruction effort, which is not publicly linkable. See each
linked project for its own terms.
The single-turn layers were re-rendered through Qwen3.5-9B's own tokenizer
template (thinking ON, with the same served-tools context the eval driver
arms) and re-gated against the project's translation-unit-grain eval
holdouts at mix build time. No license claim is made for the corpus; it is
not published. The shipped PUBLISHED.json pins the corpus file's sha256
(b67811d1e00e…, 25,624 rows) as provenance.
How to use it
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel
base = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3.5-9B", dtype="bfloat16", device_map="auto")
tok = AutoTokenizer.from_pretrained("Qwen/Qwen3.5-9B")
model = PeftModel.from_pretrained(base, "freeqaz/decomp-synth-lifter-v17-mix-qwen3.5-9b-lora")
This adapter is trained for agentic tool use as well as single-turn
proposal shapes: serve it behind an OpenAI-compatible endpoint with tool
calling enabled and give it compile / diff / read tools. With vLLM:
vllm serve Qwen/Qwen3.5-9B --enable-lora \
--lora-modules v17mix=freeqaz/decomp-synth-lifter-v17-mix-qwen3.5-9b-lora \
--enable-auto-tool-choice --tool-call-parser qwen3_coder
The tool-call parser flag matters: the adapter emits tool calls in the
Qwen3.5 template's native XML form, which qwen3_coder parses; without it
(or with a JSON-style parser) the calls degrade silently into plain text.
Like every adapter in this family, it is a proposal engine for a
compile-and-score loop — sample multiple candidates, compile each with the
target project's real toolchain, and let objdiff judge. Byte-exact is the
only acceptance criterion. Trajectory rows ran up to ~87k tokens of session
context, so give it a long context window. In bf16 the 9B base fits a
single 24 GB GPU.
The adapter family
Table with columns: adapter, base, format, role| adapter | base | format | role |
|---|
| v10 | Qwen3.6-27B | RAW | single-turn matcher, reference 27B |
| gtp0c | Qwen3.8-27B | RAW | v10 recipe verbatim on the newer base (matched pair) |
| v13-chain r32 | Qwen3.5-9B |
Integrity
PUBLISHED.json (shipped) carries per-file sha256 written by the training
job at publish time. Two internal metadata files it pins
(train_summary.json, artifact-manifest.json) are retained in the
project's artifact store but not shipped here — they carry training-box
paths. adapter_config.json was rewritten post-training to the HF base id;
original bytes at provenance/adapter_config.orig.json.
License
Adapter weights: Apache-2.0. A model trained to reproduce shipped game
code can reproduce shipped game code — that is its purpose; decompilation
projects operate in a long-standing community norm of clean-room
reconstruction for interoperability and preservation.