100 KiB
The tool index — every tool, keyed by the need it answers
Generated by tools/tool_census.py from the tree and config/tool_dictionary.tsv; never edited by hand (a --check in tools-health asserts
freshness). The derived columns come from the tree on every run; the authored ones (phase, need, portability, verdict) from the
dictionary, whose coverage is asserted both ways. Read it by NEED: find the phrase that matches what you are trying to do, then the tool,
then what proved it. The same data generates the day-one kit's manifest and its verbatim tool corpus.
Coverage: 313 tool files in scope (submodules, vendored and downloaded code excluded; find and git ls-files agree) + 38 retired under tools/sunset/. Classes: LIVE 249 (a runtime consumer), REFERENCED 31 (a SETUP row only), ORPHAN 33 (neither) — of 313. Portability: PORTABLE 23, ADAPT 273, PROJECT-ONLY 17.
P1 — extraction + manifest
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| build and verify a deterministic sorted checksum manifest of an extraction tree | bfm_extract/manifest.py |
Builds and verifies a deterministic sorted SHA1 manifest of an extraction tree | extract.py, build_fuel_manifest.py, family_hseq.py, family_manifest.py (+2) | the extraction output root | LIVE |
| walk a raw data track's filesystem and extract files by name | bfm_extract/iso9660.py |
Reusable reader for a raw 2352-byte-sector data track; walks the filesystem and extracts files by name | extract.py, extract_exe.py, extract_proto_exe.py, disc_audit.py (+1) | none | LIVE |
P2 — the oracles + the load map
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| batch-decompile an address list into one source file per function | ghidra_scripts/DecompileFunctions.java |
Headless batch decompile of an address list into one C file per function | build_fuel_manifest.py, prefetch_fleet.py | none | LIVE |
| batch-decompile one representative per distinct open class into a cache | prefetch_fleet.py |
Batch headless decompilation of one representative per distinct open class into a cache | api_draft.py, ghidra_roster.py | repo paths, binary registry | LIVE |
| capture and diff live console memory across scenarios to type struct fields | ram_probe.py |
Captures, diffs and reads emulator main RAM over its web API for field typing | — | emulator host/port, 2 MB console RAM map | ORPHAN |
| close the analysis program cleanly so its edits actually persist | ghidra_mcp_stop.sh |
Clean save-and-close via a sentinel file; the only persistence event | Makefile, auto_supervisor.sh, ghidra_apply_symbols.sh, ghidra_export_annotations.sh (+7) | repo paths, project name | LIVE |
| create functions at externally validated entry points listed in a file | ghidra_scripts/DefineFunctions.java |
Disassembles and creates functions at externally validated entry points listed in a file | ghidra_rebuild.sh, ApplySymbols.java, prefetch_fleet.py | repo scratch path | LIVE |
| decompile one function at a given address straight from the analysis database | ghidra_scripts/DecompileAt.java |
Headless script decompiling the function at one address and printing its C | — | default address | ORPHAN |
| derive the hand-authored annotations by subtracting a fresh analysis baseline | ghidra_annotations_delta.py |
Derives the hand-authored annotation rows by subtracting a fresh rebuild baseline | ghidra_rebuild.sh, ExportAnnotations.java | repo paths | LIVE |
| dump per-function fingerprints in three hash tiers for cross-binary correspondence | ghidra_scripts/DumpFunctionSignatures.java |
Read-only per-function fingerprint dump in three hash tiers for cross-binary correspondence | Makefile, corpus.py, ExportAnnotations.java, match_protos.py (+1) | none | LIVE |
| emit function start and length seeds for the executable's own code objects | main_seed_ends.py |
Emits function start/length seeds for the executable's game-code objects, derived from the build | Makefile | repo build paths | LIVE |
| export a program's annotations to byte-stable line-delimited records, read-only | ghidra_export_annotations.sh |
Read-only export of a program's annotations to byte-stable line-delimited JSON | ghidra_rebuild.sh | repo paths | LIVE |
| export the analysis database's hand-authored symbols to a committable text file | ghidra_scripts/ExportSymbols.java |
Exports user-defined symbols to a committable text file so annotations are version-controlled | — | none | ORPHAN |
| find code that materializes an absolute address, tracking registers rather than pairing windows | find_addr_refs.py |
Register-tracked scan for code that materializes an absolute address; never window-paired | idxtab_map.py | MIPS encodings, repo binary registry | LIVE |
| generate and check a roster of committed analysis programs from the registry | ghidra_roster.py |
Generates and checks a roster of committed analysis programs from the build registry | .github/workflows/no-rom.yml, Makefile, ghidra_rebuild.sh | repo config paths | LIVE |
| import a flat headerless blob at a given base with the right processor spec | ghidra_import_raw.sh |
Headless import of a flat headerless blob at a given base with the right processor spec | prefetch_fleet.py | PS1 processor spec, project name | LIVE |
| import and auto-analyze a console executable headlessly with the platform loader | ghidra_import.sh |
Headless import and auto-analysis of a console executable with the platform loader | ghidra_import_raw.sh | PS1 executable loader, project name | LIVE |
| import annotations back into a program, comparing before writing | ghidra_scripts/ImportAnnotations.java |
Idempotent compare-before-write import of the annotation JSONL back into a program | ghidra_rebuild.sh | none | LIVE |
| name the code segments that must be split before their switch functions carve | split_indicator.py |
Names code segments that must be split before their switch functions can be sectioned | Makefile, docs/wave-playbook.md | repo config layout | LIVE |
| print a program's language, compiler spec, image base and function count | ghidra_scripts/DumpProgramInfo.java |
Prints program metadata: language, compiler spec, image base, function count, properties | ghidra_import.sh, ghidra_import_raw.sh, ghidra_rebuild.sh | none | LIVE |
| print the symbol name at one address for scripted persistence checks | ghidra_scripts/GetSymbolAt.java |
Prints the function or symbol name at one address for scripted persistence checks | ghidra_mcp_verify.sh | none | LIVE |
| rank candidate load addresses for a payload that was never onboarded | payload_base_evidence.py |
Ranks candidate load addresses for an unonboarded payload from pointers, self-calls and upper-half reach | — | the source game's payload map | REFERENCED |
| re-open read-only to confirm a symbol edit survived the save | ghidra_mcp_verify.sh |
Read-only re-open confirming a symbol edit actually persisted after save-shutdown | ghidra_apply_symbols.sh, ApplySymbols.java, GetSymbolAt.java | repo paths, project name | LIVE |
| rebuild an analysis program from committed text plus extracted bytes, proving equality | ghidra_rebuild.sh |
Rebuilds one analysis program from committed text plus extracted bytes, and proves equality | ghidra_annotations_delta.py, ghidra_roster.py, DefineFunctions.java, ExportAnnotations.java | repo paths, project layout | LIVE |
| resolve a vendor SDK type archive into the program's type manager | ghidra_scripts/ImportPsyqGdt.java |
Headlessly resolves a vendor SDK type archive into the program's type manager | ghidra_import.sh, ghidra_import_raw.sh, ghidra_rebuild.sh, ExportAnnotations.java | PS1 SDK type archive name | LIVE |
| serialize types, signatures, data, comments and labels to stable records | ghidra_scripts/ExportAnnotations.java |
Read-only serialization of types, signatures, data, comments, bookmarks and labels to stable JSONL | ghidra_annotations_delta.py, ghidra_export_annotations.sh, ghidra_rebuild.sh, ghidra_roster.py (+1) | none | LIVE |
| serve the analysis tool over an automation protocol, saving on a sentinel stop | ghidra_scripts/BfmMcpServer.java |
The headless MCP server itself; holds an open transaction and saves on a sentinel stop | ghidra_mcp_start.sh | repo sentinel path, server port | LIVE |
| start the disassembler's automation server detached on a fixed local port | ghidra_mcp_start.sh |
Starts the headless disassembler MCP server detached on a fixed local port | auto_supervisor.sh, ghidra_import.sh | repo paths, project name, port | LIVE |
P3 — the all-assembly baseline
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| ask whether an object's scattered zero-init section can be placed byte-exactly | psyq_bss_probe.py |
Asks whether an object's scattered zero-init section can be split and placed byte-exactly | psyq_bss_split.py | PS1 SDK object shape | LIVE |
| byte-verify one binary by hand the only correct way, re-extract included | verify_binary.py |
The correct hand verification of one binary: full re-extract plus rebuild, then hash compare | — | repo make targets | REFERENCED |
| convert vendor library members to the linker's format and archive them | psyq_build_libs.sh |
Converts vendor library members to ELF and archives them per library | Makefile, fetch_psyq.sh, gate_main_parallel.py, make_apicard_used.py (+3) | PS1 SDK, repo scratch paths | LIVE |
| extract vendor SDK library files from the vendor's runtime-library disc | psyq_libs_from_disc.py |
Extracts vendor SDK library files from the vendor's runtime-library disc image | fetch_psyq.sh | vendor disc layout, PS1 SDK | LIVE |
| generate segment lines and a stub list for a multi-block vendor library region | gen_lib_subsegs.py |
Generates segment lines and a stub list for a multi-block vendor library region | Makefile | repo config layout, PS1 SDK libs | LIVE |
| link a whole library's objects in place of stubs, placing data no-load | psyq_link_region.py |
Links a whole library's objects in place of stubs, placing non-code sections as no-load | make_libgs.sh, psyq_integrate.py | PS1 SDK, repo paths | LIVE |
| link every used object of a vendor library and byte-verify each | psyq_link_lib.py |
Driver linking every used object of a library and byte-verifying each | — | PS1 SDK, repo paths | REFERENCED |
| link one vendor object at a fixed address so its code is byte-identical | psyq_link.py |
Links one vendor object at a fixed address so its code is byte-identical to the target | gen_lib_subsegs.py, make_apicard_used.py, make_snd_used.py, psyq_bss_probe.py (+3) | PS1 SDK, repo build paths | LIVE |
| locate where vendor library objects are linked in a target image | psyq_identify.py |
Locates where vendor library objects are linked in a target image via relocation-masked patterns | gen_lib_subsegs.py, make_apicard_used.py, make_snd_used.py, psyq_link_lib.py (+1) | PS1 SDK objects | LIVE |
| onboard any flat blob in one command: config, registry entry, first build | new_binary.sh |
One-command onboarding of any flat blob: config from template, registry entry, first build | Makefile, config/modules.mk, config/overlays.mk, new_overlay.sh (+1) | repo config/template paths, the source game's payload classes | LIVE |
| reorder a generated linker script to reproduce the original section interleaving | ld_interleave.py |
Reorders a generated linker script to reproduce the original section interleaving | Makefile | repo build paths | LIVE |
| restore the assembler-reorder build path for objects originally assembled that way | reorder_passthrough.py |
Restores the assembler-reorder build path for the objects originally assembled that way | Makefile, docs/wave-playbook.md, match_one.py, oracle_reorder.py (+1) | pinned assembler flags, repo build paths | LIVE |
| split a source file at object boundaries, preserving matched code and stubs | split_src_region.py |
Splits a source file at object boundaries, preserving matched code and stub blocks | overlay_src_split.py | repo src/config layout | LIVE |
| split a vendor library archive into its member objects | psyq_lib_split.py |
Splits a vendor linker-format library archive into its member objects | Makefile, fetch_psyq.sh, psyq_build_libs.sh | PS1 SDK archive format | LIVE |
| split one zero-init section of an object into per-base no-bits pieces | psyq_bss_split.py |
Rewrites an ELF object, splitting one zero-init section into per-base no-bits pieces | Makefile, make_libgs.sh, psyq_bss_probe.py, psyq_integrate.py (+2) | ELF32 REL layout | LIVE |
| wire real library objects into the split build, replacing stub subsegments | psyq_integrate.py |
Wires real library objects into the split build, replacing stub subsegments | Makefile, docs/wave-playbook.md, gen_lib_subsegs.py, progress.py | repo config/build paths | LIVE |
| write the generated binary-registry makefile safely, validating before replacing | mk_write.py |
The only safe writer of the generated binary-registry makefile; validates before replacing | jr_isolate_all.py, jtbl_carve.py, jtbl_pads_fix.py | repo config path | LIVE |
P4 — the compiler pinned; the probes
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| compare instructions with relocations masked, shared by matcher and scorer | masked_diff.py |
Shared relocation-masked instruction comparison used by the matcher and the permuter scorer | delever_oracle.py, delever_search.py, diff_regions.py, masked_scorer.py (+10) | MIPS relocation encodings | LIVE |
| compile one function standalone and compare its masked bytes to the target | match_one.py |
Compiles one function standalone with the pinned toolchain, masks relocations, compares to target bytes | ab_score.py, api_draft.py, aprop_autodraft.py, asm_verbatim.py (+23) | compiler triple, repo build flags | LIVE |
| dump every compiler pass file for a self-contained draft | cc1_dumps.sh |
Dumps every compiler pass file for a self-contained draft into a private directory | cc1_dumps_tu.sh, ghost_census.py | compiler triple, repo scratch paths | LIVE |
| dump every compiler pass file for the spliced real translation unit | cc1_dumps_tu.sh |
Same pass dumps for the spliced real translation unit, the faithful compile | alloc_table.py, localalloc_sim.py | absolute repo path, compiler triple | LIVE |
| re-judge standalone compile failures against their real translation unit before dropping | rtu_second_chance.py |
Re-judges standalone compile-failures against their real translation unit before dropping them | maintenance.sh | repo scratch paths | LIVE |
| reproduce an external reference toolchain locally and compare its words to target | decompme_replica.sh |
Runs a function through an external reference toolchain build and compares words against the target | verbatim_target_s.py | pinned toolchain versions, network fetch | LIVE |
| skip a draft doomed to fail before any compile is spent | draft_prechecks.py |
Static pre-checks that skip a draft doomed to fail before any compile is spent | api_agent.py, aprop_autodraft.py, blocker_probe.py, gate_main.py (+3) | repo symbol/config sources | LIVE |
| splice a candidate into a copy of its real translation unit and compare bytes | rtu_match.py |
Splices a candidate into a copy of the real translation unit and checks the same bytes | blocker_probe.py, decl_from_use.py, integration_resolver.py, rtu_second_chance.py (+1) | repo src layout, compiler triple | LIVE |
| turn one function's disassembly into a C scaffold to start a match | decompile.py |
Wrapper locating a function's disassembly and running the C-scaffold generator on it | — | repo asm paths, decompiler target name | REFERENCED |
P5 — the census, the harness, the reports
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| answer from one derived model whether each function is open, matched or shared | corpus.py |
The single derived model of the source tree: open, matched or shared, per function | Makefile, api_agent.py, aprop_autodraft.py, aprop_symfix.py (+68) | repo src/config layout | LIVE |
| assert every consumer knows about each newly onboarded binary | audit_binaries.py |
Gate asserting every consumer knows about each newly onboarded binary | Makefile | repo config/registry paths | LIVE |
| assert every tracked source is plain text so text searches never skip it | audit_text_sources.py |
Every tracked C source must be plain text, or text searches silently skip it | .github/workflows/no-rom.yml, Makefile | repo src paths | LIVE |
| check that the independent what-remains views agree with the corpus oracle | audit_frontier.py |
Checks that the independent "what remains" views agree with the corpus oracle | Makefile | repo paths | LIVE |
| check the symbol identity the masked comparison deliberately hides | reloc_identity.py |
Disagreeing oracle checking the symbol identity the masked comparison deliberately hides | decl_from_use.py, integration_resolver.py, maintenance.sh, sibling_lane.sh (+2) | repo build paths | LIVE |
| check whether an open target already has a draft on disk | strand_census.py |
Lists every draft already on disk whose function is still open, with its blocker | — | repo scratch paths | ORPHAN |
| decide whether a near-miss residual is a source defect or an assembler artifact | oracle_reorder.py |
Decides whether a near-miss residual is a source defect or an assembler artifact | Makefile, docs/wave-playbook.md, match_one.py, reorder_passthrough.py (+1) | pinned assembler flags | LIVE |
| derive the tool census, the need-keyed index, the kit manifest and the verbatim corpora from one dictionary | tool_census.py |
Derives the tool census, the need-keyed tool index, the kit manifest and the verbatim corpora from one dictionary, coverage-asserted both ways | Makefile | repo layout (tools/, docs/SETUP.md rows, the kit paths) | LIVE |
| enumerate fleet-wide every instance of one known assembler-level blocker class | wall_sweep.py |
Enumerates fleet-wide instances of one known assembler-level blocker class | docs/wave-playbook.md, residual_rules_b.py, triage_ladder.py | repo asm layout, toolchain quirk | LIVE |
| explain with two oracles why a byte-correct draft fails the whole-binary gate | blocker_probe.py |
Read-only two-oracle explanation of why a byte-correct draft fails the whole-binary gate | recover_integration.py | repo build paths | LIVE |
| extract one deterministic feature record per function across every registered binary | atlas_features.py |
Extracts one deterministic feature record per function across all registered binaries | Makefile, atlas.py, len_tells.py | repo signature files | LIVE |
| join the target pool and near-miss ledger into one byte-weighted queue | worklist.py |
Joins the target pool and the near-miss ledger into one byte-weighted ranked queue | build_fuel_manifest.py | repo scratch paths | LIVE |
| keep a ranked ledger of every close-but-not-matching attempt | backlog.py |
Near-miss ledger: every close-but-not-matching attempt, ranked for hand sessions | Makefile, atlas.py, auto_status.sh, autopsy.py (+11) | repo scratch/doc paths | LIVE |
| name the true blocker of every remaining open function, deterministically | frontier_classify.py |
Classifies every remaining open function by its true blocker, deterministically | — | repo paths | REFERENCED |
| negative-control the comparer: every stub's built object must equal its target | stub_invariant_audit.py |
Negative control: for every stub the built object must equal the target assembly exactly | — | repo build paths | REFERENCED |
| negative-control the detector that decides a function's optimization level | test_o0_detect.py |
Negative control for the matcher's optimization-level auto-detection | — | repo paths | ORPHAN |
| partition every open function into exactly one lever-labelled work group | atlas.py |
Partitions all open functions into exactly one lever-labelled work group | Makefile, atlas_features.py, build_wave_atlas.py, main_lane.py (+2) | repo scratch paths | LIVE |
| rank unmatched functions easiest-first by size, control flow and call count | difficulty.py |
Ranks unmatched functions easiest-first by size, control flow, table presence and call count | Makefile | repo asm layout | LIVE |
| re-score both arms of an experiment with the standalone matcher as ground truth | ab_score.py |
Re-scores every draft of two experiment arms with the standalone matcher as ground truth | api_draft.py, train_lora.py | repo scratch paths | LIVE |
| recompute headline metrics and fail if the committed digest disagrees | audit_digest.py |
Recomputes headline metrics from the current tree and fails if the committed digest disagrees | Makefile | repo docs paths | LIVE |
| regression-test the table-carve configuration parser with a negative control | test_jtbl_parse_config.py |
Regression plus negative control for the table-carve configuration parser | jtbl_carve.py | repo config fixtures | LIVE |
| report byte-identical and structurally identical function groups within and across binaries | dup_report.py |
Reports byte-identical and structurally identical function groups within and across binaries | Makefile, atlas.py, atlas_features.py, audit_binaries.py (+4) | repo signature files | LIVE |
| resolve every relocation in a draft and compare the resolved words to target | reloc_verify.py |
Resolves every relocation in a draft and compares the resolved words to the target | — | repo build paths | ORPHAN |
| revert known answers to stubs and categorize every harness failure it exposes | p16_improve.py |
Known-answer loop: reverts matched functions to stubs and measures the real pipeline | — | repo src/build paths | ORPHAN |
| track per-session yield and velocity so a diminishing-returns close is visible | burndown.py |
Tracks per-session yield and velocity so a diminishing-returns close is visible | — | repo ledger paths | ORPHAN |
| unit-test a residual classifier on hand-encoded words, not its own decoder | test_residual_class.py |
Synthetic hand-encoded unit tests for the deterministic residual classifier | — | MIPS encodings | REFERENCED |
P6 — the multipliers: signatures, dedup, families, the reconcile ladder, the carve chain
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| answer from a prologue whether a function was built unoptimized | o0_detect.py |
The single place that answers whether a function was built unoptimized, from its prologue | match_one.py, neighbor_ref.py, o0_boundary.py, residual_rules_b.py (+2) | compiler prologue shape | LIVE |
| apply one proven codegen lever everywhere the bytes say it belongs | weave_sweep.py |
Applies one known prologue-scheduling lever everywhere the bytes say it belongs | — | repo src layout, compiler behaviour | REFERENCED |
| assert a read-only-data carve's interleave order equals the segment sequence | interleave_check.py |
Asserts the carve interleave order equals the segment sequence, position by position | — | repo config layout | REFERENCED |
| bank a matched jump-table exemplar across its siblings, reverting on failure | jtbl_family_bank.py |
Banks a matched jump-table exemplar across its structural siblings, revert-on-fail | family_sweep.py, reloc_verify.py | repo config/src layout | LIVE |
| bank a refused draft by copying the destination unit's own declarations into it — the declaration-conflict class a canonical type layer prevents (Phase 6) | sync_tu_decls.py |
Banks a refused draft by copying the destination unit's own declarations into it | docs/wave-playbook.md, recover_route.py | repo src layout | LIVE |
| bank every open stub that already has a banked structural twin | twin_sweep.py |
Banks every open stub that has an already-banked structural twin, for near-zero tokens | docs/wave-playbook.md | repo signature files | LIVE |
| bind a void definition to a symbol the destination declares as returning a value | fix_decl_mirror.py |
Binds a void definition to its symbol when the destination declares a value return | — | repo src layout | ORPHAN |
| classify drifted structural siblings by aligned words and expand their constants | family_align.py |
Length-tolerant aligned classifier plus the mechanical constant-expansion engine for drifted members | len_tells.py | repo scratch paths | LIVE |
| classify every exclude-list entry by its current blocker and regenerate the list | exclude_audit.py |
Classifies every exclude-list entry by its current blocker and regenerates the list | docs/wave-playbook.md, draw_waves.py | repo config path | LIVE |
| cluster the open frontier one tier looser than exact skeleton hashing | family_cousins.py |
Similarity clustering one tier looser than exact skeleton hashing over the open frontier | Makefile, aprop_autodraft.py, atlas.py, atlas_features.py (+3) | repo signature files | LIVE |
| compute the fleet's consensus declaration for every symbol, as card fuel — the seed of a canonical type layer (Phase 6) | decl_prior.py |
Computes the fleet's consensus declaration for every symbol, as card fuel | build_wave_atlas.py, family_remap.py, t5_cards.py | repo src layout | LIVE |
| conform a draft's data declarations to what its destination unit can see | reconcile_tu.py |
Conforms a draft's data declarations to what the destination translation unit can actually see | gate_stage.py, harvest_verify.py, integration_resolver.py, jtbl_family_bank.py | repo src layout | LIVE |
| conform every declaration of a function fleet-wide to its byte-true definition — width and signedness proven by the bytes at bank time (Phase 6) | conform_decls.py |
Conforms every declaration of a function fleet-wide to its byte-true definition | family_sweep.py | repo src/shared-header layout | LIVE |
| demote declaration scope as one rung of the recovery ladder | scope_demote_drafts.py |
The scope-demote step, wired as a rung of the recovery ladder | gate_stage.py, recover_route.py | repo src layout | LIVE |
| derive an object's inter-table padding spec from the bytes instead of searching | pads_audit.py |
Derives each object's padding spec from the bytes instead of searching for it | — | repo build/config layout | REFERENCED |
| draft a family member mechanically from a seed body and symbol rebase | aprop_autodraft.py |
Mechanically drafts a family member from the seed body plus a positional symbol rebase | decl_from_use.py, maintenance.sh, sibling_lane.sh | repo scratch paths | LIVE |
| escape a shared-header declaration conflict locally by unmacroizing one body | demacroize.py |
Per-binary local escape from a shared-header declaration conflict by unmacroizing one body | recover_integration.py | repo shared-header layout | LIVE |
| find and bank unoptimized functions stranded at an optimized region's boundary | o0_boundary.py |
Finds and banks unoptimized functions stranded at the end of an unoptimized region | — | repo config layout | REFERENCED |
| free duplicate matches a share propagation skips as not self-contained | inject_capped_externs.py |
Frees high-reach inline matches skipped as not self-contained by injecting their file-scope externs | — | repo shared-header layout | REFERENCED |
| infer a minimal extern for a data symbol the destination unit does not declare | decl_from_use.py |
Infers a minimal extern for a data symbol a draft uses but its destination does not declare | aprop_autodraft.py, integration_resolver.py, residual_rules_b.py | repo src layout | LIVE |
| isolate every switch function in a binary in one multi-cut resegment | jr_isolate_all.py |
One-shot multi-cut resegment isolating every switch function in a binary | harvest_verify.py, jtbl_carve.py, jtbl_family_bank.py, o0_subsplit.py (+1) | repo config/src layout | LIVE |
| join two related builds' signature dumps into a function correspondence | match_protos.py |
Joins per-function signature dumps of two related builds into a function correspondence | dup_report.py | repo signature files | LIVE |
| let a unit keep calling, through per-site casts, the function it now defines | cast_self_callers.py |
Lets a unit keep calling, through a per-site cast, the function it is about to define | docs/wave-playbook.md, recover_integration.py, recover_route.py | repo src layout | LIVE |
| lift a named list of types fleet-wide into the shared type header — the canonical type layer from the first bank (Phase 6, the multiplier); again at readability (Phase 10) | lift_types.py |
Lifts a named list of types fleet-wide into the shared type header | build_engine_types.py, uniquify_type.py | repo shared-header path | LIVE |
| move a unit's file-scope data externs down into their consumers | scope_tu_externs.py |
Moves a unit's own file-scope data externs down into their consumers to legalize a block-scope type | family_sweep.py, jtbl_family_bank.py, recover_integration.py | repo src layout | LIVE |
| name the one exemplar to draft per structural family, ranked | family_manifest.py |
Ranked structural-family target manifest naming the one exemplar to draft per family | family_hseq.py | repo signature files | LIVE |
| normalize a function's own declaration when a templated definition lands in a new unit | normalize_self_decls.py |
Normalizes a function's own declaration when a templated definition lands in a new unit | family_sweep.py | repo src layout | LIVE |
| parse C declarators once, for every declaration tool to share | cdecl.py |
The single recursive-descent C declarator parser every declaration tool shares | Makefile, blocker_probe.py, canon_sig_reconcile.py, cast_call_sites.py (+21) | C89 grammar only | LIVE |
| partition a source file at object boundaries, aware of comment state | overlay_src_split.py |
Comment-state-aware partition of a source file, the oracle for the split chain | jr_isolate_all.py, neighbor_ref.py, o0_subsplit.py, share_census.py (+2) | repo src layout | LIVE |
| place a templated body's data externs at a scope the destination accepts | scope_data_externs.py |
Places a templated body's data externs at the scope the destination unit can accept | family_sweep.py, jtbl_family_bank.py, scope_demote_drafts.py, scope_tu_externs.py | repo src layout | LIVE |
| property-test the signature tool on committed fixtures, needing no compiler | xsig/tests/test_xsig.py |
Property tests for the signature tool on committed fixtures, needing no compiler | .github/workflows/no-rom.yml, Makefile | fixture paths | LIVE |
| rank clusters of the unmatched frontier by mnemonic-skeleton hash | family_hseq.py |
Ranked clustering of the unmatched frontier by mnemonic-skeleton hash | Makefile, audit_binaries.py, audit_frontier.py, build_wave_atlas.py (+5) | repo signature files | LIVE |
| rebase a remapped draft's stale seed symbols onto the target's own | aprop_symfix.py |
Rebases stale seed symbols in a mechanically adapted draft onto the target's own symbols | aprop_autodraft.py, family_cousins.py, integration_resolver.py, recover_rejects.py | repo symbol/config sources | LIVE |
| reconcile a definition's typed signature with what its destination unit declares — part of banking against a canonical type layer from Phase 6; again at readability (Phase 10) | canon_sig_reconcile.py |
Reconciles a definition's typed signature with what its destination unit already declares | family_sweep.py, jtbl_family_bank.py | repo src layout | LIVE |
| regenerate the signature tool's fixtures with the pinned toolchain | xsig/tests/make_fixtures.sh |
Regenerates the signature-tool fixtures with the pinned toolchain | test_xsig.py | compiler triple, repo tool paths | LIVE |
| remap a matched exemplar's source onto a structural sibling by positional symbol pairing | family_remap.py |
Mechanically remaps a matched exemplar's C onto a structural sibling by positional symbol pairing | aprop_autodraft.py, atlas.py, atlas_features.py, diff_regions.py (+16) | repo src layout | LIVE |
| repair a shared caller's argument-count conflict for the no-prototype failure class | fix_arity_callers.py |
Repairs the shared-caller argument-count conflict for the no-prototype failure class | docs/wave-playbook.md, cdecl.py, gate_stage.py, recover_integration.py (+1) | repo shared-header layout | LIVE |
| repair a stale padding spec by search plus byte proof, never by guessing | jtbl_pads_fix.py |
Repairs a stale padding spec by search plus byte proof, never by guessing | maintenance.sh | repo config layout | LIVE |
| report which open stubs became mechanical remaps the moment one was banked | twin_rescan.py |
After a bank, reports which open stubs just became mechanical remaps instead of drafts | — | repo signature files | REFERENCED |
| reproduce the original inter-table padding in a multi-table carve | jtbl_rodata_pads.py |
Post-assembler filter reproducing the original inter-table padding in a multi-table carve | Makefile, compile_only.py, gate_main.py, jtbl_carve.py | compiler/assembler behaviour, repo build paths | LIVE |
| restore file-scope declarations a share propagation deleted with the body | restore_dropped_decls.py |
Puts back file-scope declarations a share propagation deleted with the body | — | repo src layout | ORPHAN |
| retype a unit's stale forward declarations to a draft's byte-true return, reverting on failure | fix_tu_ret_decls.py |
Retypes a binary's own stale forward declarations to a draft's byte-true return, revert-on-fail | maintenance.sh | repo src layout | LIVE |
| rewrite address-named calls in a draft to their curated symbol names | canon_resident_calls.py |
Rewrites address-named calls in a draft to the curated symbol name when one exists | gate_stage.py, integration_resolver.py | repo symbol file path | LIVE |
| roll an unoptimized definition atomically across every binary carrying it | rollout_o0.py |
Generalized two-file atomic rollout of an unoptimized definition across every binary carrying it | Makefile, match_one.py | repo src/config layout | LIVE |
| route an unoptimized address range sitting inside an otherwise optimized object | o0_subsplit.py |
Routes an unoptimized address range that sits inside an otherwise optimized object | match_one.py | repo config layout | LIVE |
| set up the read-only-data carve for a binary's matched jump-table functions | jtbl_carve.py |
Sets up the read-only-data carve for a binary's matched jump-table functions | Makefile, config/overlays.mk, build_wave_atlas.py, harvest_verify.py (+7) | repo config/build layout | LIVE |
| sign every function of a flat image at a known base, without a disassembler | sig_image.py |
Disassembler-free per-function signer for a flat image at a known base, field-identical to the dumper | Makefile, atlas_features.py, corpus.py, disc_audit.py (+5) | MIPS encodings, repo scratch paths | LIVE |
| sign functions with relocations masked for cross-project code identification | xsig/xsig.py |
Relocation-masked per-function signatures for cross-project code identification | .github/workflows/no-rom.yml, Makefile, test_xsig.py | MIPS/relocation model only | LIVE |
| sweep a matched exemplar across every same-structure sibling, gate-arbitrated | family_sweep.py |
Sweeps a matched exemplar across every same-structure sibling, gate-arbitrated | frozen.py, recover_integration.py, twin_sweep.py | repo src/config layout | LIVE |
| unify a draft's callee externs and its own signature to the banked-canonical set | sig_unify.py |
Unifies a draft's callee externs and its own definition signature to the banked-canonical set | auto_driver.py, cast_call_sites.py, gate_stage.py, p16_improve.py | repo shared-header paths | LIVE |
| validate a code-share registry byte-honestly, failing closed on signature drift | dedup_integrate.py |
Byte-honesty validator for the code-share registry; fails closed on signature drift | Makefile, macro_to_header.py, progress.py, share_body.py (+1) | repo config registry path | LIVE |
P7 — the codegen map, the dumps, the permuter
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| classify a length-drift near-miss against its own target and build its routing card | len_tells.py |
Classifies a length-drift near-miss against its own target and builds the routing card | atlas_features.py | repo scratch paths | LIVE |
| classify a residual's shape to its documented lever, as an independent implementation | residual_rules_b.py |
Independent second implementation of residual-shape to rule classification, for head-to-head | triage_ladder.py | repo doc paths | LIVE |
| classify where a remapped sibling's compiled bytes diverge from its target | diff_regions.py |
Classifies where a remapped member's compiled bytes diverge from its target | — | repo build paths | ORPHAN |
| compile a permuter candidate exactly as the build rule does | permuter/compile.sh |
The permuter's compile command, mirroring the build rule exactly so objects are build-faithful | delever_permute.py, p16_permute.py, compile_o0.sh | compiler triple, repo build flags | LIVE |
| compile a permuter candidate unoptimized, exactly as the build rule does | permuter/compile_o0.sh |
Unoptimized variant of the same permuter compile command | p16_permute.py | compiler triple, repo build flags | LIVE |
| decide whether a residual reorder is scheduling or a register-grant consequence | oracle/reg_renumber_swap.sh |
Mechanized oracle separating a register-allocation swap from a scheduling reorder | — | compiler triple, repo scratch paths | ORPHAN |
| drive the permuter per function, building base, target and settings | p16_permute.py |
Per-function permuter driver building base, target and settings, then reporting closeness | auto_driver.py, delever_permute.py, grinder.py, permuter_ils.py | repo scratch paths, permuter layout | LIVE |
| find pseudo-registers with references but no remaining occurrences, and their frame slots | ghost_census.py |
Frame-residue oracle: finds pseudos with references but no remaining occurrences, and their slots | cc1_dumps.sh | compiler pass-dump format | LIVE |
| find which words diverge when the whole-binary gate says different but not where | diff_autopsy.sh |
Reproduces exactly what the gate saw, then decodes the diverging words and restores the tree | — | repo src/build paths | REFERENCED |
| grind the closest near-misses with the permuter and bank through the gate | grinder.py |
Token-free permuter daemon grinding the closest near-misses and banking through the gate | auto_status.sh, auto_supervisor.sh, autopsy.py, gate_stage.py (+4) | repo scratch paths | LIVE |
| hand a batch's near-misses to the permuter, only the ones worth CPU | permuter_sweep.py |
Hands a batch's near-misses to the permuter, but only the ones worth the CPU | docs/wave-playbook.md | repo scratch paths | LIVE |
| list each pseudo-register's refs, live length and allocation priority from compiler dumps | alloc_table.py |
Prints each pseudo's refs, live length, block and allocation priority from compiler pass dumps | cc1_dumps_tu.sh, delever.py, localalloc_sim.py | compiler pass-dump format, repo dump root | LIVE |
| map a residual to a named codegen class by decoding its words | residual_class.py |
Deterministic decoder-based classifier mapping a residual to a named codegen class | autopsy.py, match_one.py, permuter_weights.py, residual_rules_b.py (+1) | MIPS encodings | LIVE |
| recompile every open draft and classify its failure into a residual corpus | autopsy.py |
Materializes the residual corpus by recompiling every open draft and classifying its failure | grinder.py | repo scratch/build paths | LIVE |
| run the permuter with a masked scorer rebound, without patching it | permuter/run_masked.py |
Runs the permuter with the masked scorer rebound before its entry point, without patching it | masked_scorer.py, p16_permute.py | permuter internals, repo module paths | LIVE |
| score permuter candidates on true masked code closeness, not mnemonic diff | masked_scorer.py |
Drop-in permuter scorer scoring true relocation-masked code closeness instead of mnemonic diff | masked_diff.py, run_masked.py | permuter internals, repo module paths | LIVE |
| steer permuter mutation toward the lever family the residual class implies | permuter_weights.py |
Directs permuter mutation toward the lever family the residual class implies | autopsy.py, p16_permute.py | permuter settings format | LIVE |
| tag every compiler-source citation with the source tree it refers to | gccmap_cites.py |
Tags every compiler-source citation in the codegen-map docs with the tree it refers to | .github/workflows/no-rom.yml, Makefile, tool_census.py | repo doc/reference paths | LIVE |
| turn a red whole-binary result into a named list of divergent symbols | main_diff_locate.py |
Turns a red whole-binary result into a named list of divergent symbols | gate_main.py | repo build/config layout | LIVE |
| warm-restart the permuter from its best waypoint each cycle | permuter_ils.py |
Iterated-local-search wrapper warm-restarting the permuter from the best waypoint each cycle | delever_permute.py, grinder.py, permuter_sweep.py | permuter layout, repo scratch paths | LIVE |
P8 — the campaign: cards, lanes, gates, recovery, harvest
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| assert that a tool actually did the work it reports | work_evidence.py |
Assertions that a tool actually did the work it reports | .github/workflows/no-rom.yml, Makefile, gate_stage.py, parallel_gate.py | repo scratch paths | LIVE |
| block until a background lane raises its next batch, without polling | lanes/wait_distill.sh |
Blocks until the distillation lane raises the next batch, then exits | — | repo scratch paths | ORPHAN |
| build a wave from the frontier atlas, optimized for gate throughput | build_wave_atlas.py |
Builds a wave from the frontier atlas, optimized for gate throughput | main_lane.py, ox_campaign.py, wave_card_fuel.py | repo scratch paths | LIVE |
| build the card fuel for one wave's own targets, keyed per binary | t5_cards.py |
Builds the card fuel for one wave's own targets, keyed correctly per binary | docs/wave-playbook.md, build_wave_atlas.py, draw_waves.py, seed_ref.py (+2) | repo scratch paths | LIVE |
| build the per-function prompt packs a drafting agent wave works from | claude_wave_packs.py |
Builds the per-function prompt packs an agent wave drafts from | docs/wave-playbook.md, draw_waves.py, journal_notes.py, t5_cards.py | repo scratch paths, agent harness | LIVE |
| carve, draft and bank jump-table functions as their own lane | jtbl_lane.py |
Carve, draft and bank lane for jump-table functions, with the carve deliberately outside it | idiom_serial.py | repo config/src layout | LIVE |
| check a commit out into its own worktree and verify it there | verify_worktree.py |
Checks a commit into its own worktree, provisions build deps, and verifies it there | jr_isolate_all.py, hash_dict.py, resolve_tokens.py | repo worktree/build layout | LIVE |
| compute in one library the per-target card fuel a prompt pack carries | wave_card_fuel.py |
The single library computing the per-target card fuel a pack carries | build_wave_atlas.py, t5_cards.py | repo scratch paths | LIVE |
| condense a session transcript into readable text for a successor session | transcript_dump.py |
Condenses a session transcript into readable text for a successor session | docs/wave-playbook.md | agent transcript paths | LIVE |
| decide before and after drafting whether a target needs an agent at all | triage_ladder.py |
Zero-token pass deciding whether a target needs an agent at all, before and after drafting | docs/wave-playbook.md | repo scratch paths | LIVE |
| decide which harvested waves still need mining into the technique document | distill_scan.py |
One pass of the distillation lane deciding which harvested waves still need mining | distill.sh | repo scratch paths | LIVE |
| detect and repair lane stalls automatically on measured conditions | lanes/stallguard.sh |
Detects and repairs lane stalls on measured conditions every minute, logging each action | — | lane names, repo paths | ORPHAN |
| discover an executable slate's bankable drafts concurrently, then bank once serially | gate_main_parallel.py |
Discovers the executable's bankable drafts concurrently, then banks them once, serially | — | repo build/make targets | REFERENCED |
| discover new compiler idioms from grouped near-misses with a reasoning model | idiom_hunt.py |
Uses a reasoning model on grouped near-misses to discover new compiler idioms | gate_stage.py | provider endpoint, repo paths | LIVE |
| draft one function against any chat-completions endpoint, provider-agnostic | api_draft.py |
Provider-agnostic single-shot drafting worker against any chat completions endpoint | api_agent.py, eval_lora.py, format_finetune.py, lora_grind.py (+2) | provider endpoint, repo doc paths | LIVE |
| drain finished drafts into the gate continuously while drafting still streams | gater_lane.py |
Continuous gater draining a wave's finished drafts into the parallel gate, grouped by binary | — | repo scratch paths | REFERENCED |
| draw several drafting waves off the open frontier, cheapest-first | draw_waves.py |
Draws several drafting waves off the open frontier, cheapest-first | docs/wave-playbook.md, seed_ref.py, strand_census.py | repo scratch paths | LIVE |
| drive a wave's gate accepting either result shape and an explicit draft path | gate_lane.py |
The wave gate driver, accepting either result shape and an explicit draft path | aprop_autodraft.py, aprop_symfix.py | repo scratch paths | LIVE |
| drive batch integration recovery over a directory of correct-but-rejected drafts | recover_integration.py |
Batch integration recovery driver over a wave directory of correct-but-rejected drafts | docs/wave-playbook.md, claude_wave_packs.py | repo scratch/src layout | LIVE |
| drive structural sibling sweeps with synthesized declarations, free of model tokens | lanes/sibling_lane.sh |
The free sibling lane driving structural sweeps with synthesized declarations | — | repo paths | ORPHAN |
| emit the exact drafting-workflow arguments, asserting every target is still open | wave_args.py |
Emits the exact workflow arguments for a wave, asserting every target is open | docs/wave-playbook.md, draw_waves.py, gater_lane.py, launch_check.py | repo scratch paths | LIVE |
| evaluate a fine-tuned matching model gate-truthfully on held-out banked functions | eval_lora.py |
Gate-true evaluation of a fine-tuned model on held-out banked functions | — | dataset paths, repo corpus | ORPHAN |
| find an already-banked body that matches an open stub, near and contained tiers | seed_ref.py |
For an open stub, finds the already-banked body that matches it, including near and contained tiers | docs/wave-playbook.md, t5_cards.py, twin_rescan.py | repo signature files | LIVE |
| fine-tune a code model into a matching specialist on a mined corpus | train_lora.py |
Fine-tunes a code model into a matching specialist and saves the adapter | — | dataset paths, training venv | ORPHAN |
| gate a whole wave by splitting table-bearing drafts off and running lanes concurrently | gate_wave.py |
Gates a whole wave by splitting table-bearing drafts off and running both lanes concurrently | docs/wave-playbook.md | repo scratch/config layout | LIVE |
| gate each arm on the whole binary with a tree reset between arms | wave_judge.py |
Per-arm whole-binary gate with tree reset between arms, then gates the best-of union | claude_wave_packs.py | repo scratch/src layout | LIVE |
| gate every target list for validity before agents are spawned | validate_targets.py |
The validity gate every target list must pass before agents are spawned | build_wave_atlas.py, wave_snapshot.py | repo scratch paths | LIVE |
| gate many binaries concurrently in isolated worktrees and merge only passers | parallel_gate.py |
Gates many binaries concurrently in isolated worktrees and merges only the passers | docs/wave-playbook.md, gate_main_parallel.py, gate_wave.py, gater_lane.py (+1) | repo worktree/build layout | LIVE |
| gate pre-staged draft directories across distinct binaries in parallel | sweep_parallel.py |
Gates pre-staged draft directories across distinct binaries in parallel | family_sweep.py, idiom_serial.py, integration_resolver.py, maintenance.sh (+2) | repo scratch paths | LIVE |
| gate the executable's drafts the only trustworthy way: a clean rebuild with bisect | gate_main.py |
Gates a batch of executable drafts the only trustworthy way: a clean rebuild with bisect | Makefile, docs/wave-playbook.md, build_wave_atlas.py, decl_prior.py (+12) | repo build/make targets | LIVE |
| generate a callee-signature-aware target manifest with per-function fleet reach | gen_harvest_targets.py |
Generates a callee-signature-aware target manifest with per-function fleet reach | cast_call_sites.py, sig_unify.py | canonical source binary, repo paths | LIVE |
| give a wave its own immutable copy of the disassembly its agents read | wave_snapshot.py |
Gives a wave its own immutable copy of the disassembly files its agents read | build_wave_atlas.py | repo asm paths | LIVE |
| give an external chat model the same multi-turn tool harness an agent gets | api_agent.py |
Gives an external chat model the same multi-turn tool harness an agent gets | claude_wave_packs.py, idiom_serial.py, jtbl_lane.py, ox_campaign.py | provider endpoint, repo doc paths | LIVE |
| hold one reader/writer lock over the shared source state for concurrent lanes | shared_lock.py |
One reader/writer lock over the shared source state for concurrent lanes | bulk_harvest.py, fix_arity_callers.py, gate_stage.py | repo lock paths | LIVE |
| keep an unattended campaign loop alive across run caps and crashes | lanes/forever.sh |
Keeps the wave campaign running indefinitely across caps and crashes | — | repo scratch paths | ORPHAN |
| keep an unattended driver alive across crashes until a clean exit | auto_supervisor.sh |
Keeps an unattended driver alive across crashes until a clean or requested exit | grinder.py, lora_grind.py | repo scratch paths | LIVE |
| keep drafting running continuously, touching only scratch state | lanes/drafter.sh |
The drafting lane that must never stop; touches only scratch state | relaunch_drafter_shell.sh | repo scratch paths, provider config | LIVE |
| know authoritatively which drafting agents are currently live | lane_inflight.py |
The authoritative ledger of which drafting agents are currently live | parallel_gate.py, r22_verify.sh, triage_ladder.py | repo scratch paths | LIVE |
| learn idioms serially so each target inherits what the previous one taught | idiom_serial.py |
The serial idiom-learning lane where each step inherits what the previous learned | build_wave_atlas.py, campaign.sh, elastic.sh, ox_campaign.py | repo scratch paths | LIVE |
| loop a stub worklist through scaffold, draft and gate without any model | auto_driver.py |
Autonomous model-free driver looping a stub worklist through scaffold, draft and gate | auto_supervisor.sh | canonical source binary, repo paths | LIVE |
| loop draw, draft, pre-filter, gate, commit and ledger unattended | ox_campaign.py |
The unattended wave loop: draw, draft, pre-filter, gate, commit, ledger, repeat | idiom_serial.py, campaign.sh, drafter.sh, gater.sh (+4) | repo scratch paths, provider config | LIVE |
| mass-draft small stubs with a served model and gate them in parallel | bulk_harvest.py |
Phase-separated bulk drafting plus a parallel gate farm, for throughput | — | repo scratch paths, GPU endpoint | REFERENCED |
| measure a change's write set and name the verification it actually requires | blast_radius.py |
Measures a change's write set and names the verification it actually requires | sweep_parallel.py | repo tree layout | LIVE |
| measure a drafting provider's real request rate and rate-limit attribution | api_rate.py |
Reports measured request rate and rate-limit attribution from append-only telemetry | — | repo telemetry path | ORPHAN |
| mine each function's own past-attempt history out of agent journals | journal_notes.py |
Mines per-function past-attempt notes out of the agent journals into card fuel | docs/wave-playbook.md, claude_wave_packs.py, draw_waves.py, frontier_classify.py (+1) | agent transcript paths | LIVE |
| mine gate-verified assembly-to-source pairs into a fine-tuning corpus | export_pairs.py |
Mines gate-verified assembly-to-source pairs into a fine-tuning corpus | — | repo src/build layout | REFERENCED |
| name the one recovery tool that actually applies to a drop verdict | recover_route.py |
Given a drop verdict, names the one recovery tool that actually applies | docs/wave-playbook.md, gate_main.py | repo scratch paths | LIVE |
| pick the pool, emit the batch and record the cycle, deterministically | orchestrator.py |
The deterministic half of the unattended loop: pick the pool, emit the batch, record the cycle | gate_stage.py | repo scratch paths | LIVE |
| pre-filter agents' knowledge-gap reports against the existing technique document | gap_triage.py |
Pre-filters a wave's knowledge-gap reports against the existing documentation | — | repo doc paths | ORPHAN |
| print an unattended run's heartbeats and recent progress for a remote check-in | auto_status.sh |
Prints the unattended run's heartbeats and recent progress for a remote check-in | auto_supervisor.sh | repo scratch paths | LIVE |
| pull newly learned idioms out of a wave's logs into candidate notes | idiom_harvest.py |
Pulls the newly learned idioms out of a wave's shard logs into candidate notes | distill.sh, ox_campaign.py | repo log paths | LIVE |
| pull the final structured verdict out of each subagent transcript | agent_verdicts.py |
Pulls the final structured verdict out of subagent transcripts | docs/wave-playbook.md, agent_reports.py, transcript_dump.py | agent transcript paths | LIVE |
| rank already-matched functions worth reading as worked examples for an open stub | neighbor_ref.py |
For an open stub, ranks already-matched functions worth reading as worked examples | docs/wave-playbook.md, claude_wave_packs.py | repo signature files | LIVE |
| re-judge already byte-correct drafts and bank them for zero model tokens | integration_resolver.py |
Zero-token lane re-judging drafts that are already byte-correct and banking them | decl_from_use.py, resolver_lane.sh | repo scratch paths | LIVE |
| re-judge, verify twice, stage and gate correct drafts for zero tokens | lanes/resolver_lane.sh |
The zero-token resolver lane: re-judge, verify twice, stage, gate, commit | — | repo scratch paths | REFERENCED |
| re-stage only drafts that match in their real unit so one failure is isolated | restage_matching.py |
Re-stages only the drafts that compile and match in their real unit, so one failure is isolated | — | repo src layout | REFERENCED |
| rebuild an agent's final draft by replaying its transcript writes | agent_drafts_restore.py |
Replays an agent's writes from its transcript to rebuild its final deliverable | docs/wave-playbook.md, transcript_dump.py | agent transcript paths | LIVE |
| rebuild the executable lane's queue from the tree, never from a stale list | main_queue_rebuild.py |
Rebuilds the executable lane's queue from the tree, never from a stale list | claude_wave_packs.py | repo src layout | LIVE |
| recover a large draft rejected only on declaration plumbing, with canonical externs | recover_giant.py |
Canonical-extern recovery for a large draft rejected only on declaration plumbing | canon_sig_reconcile.py | repo shared-header layout | LIVE |
| refuse a draft that swallows a neighbouring symbol inside one function's range | fragment_check.py |
Refuses drafts that subsume a neighbouring symbol, the enclosing-function trap | — | repo asm layout | ORPHAN |
| refuse to launch an agent at a target that is already banked | launch_check.py |
Refuses to launch an agent at a target that is already banked | docs/wave-playbook.md | repo src layout | LIVE |
| report every concurrent lane with its own metrics, not only the loud one | campaign_status.py |
One status view covering every lane, not only the loud one | — | lane names, repo scratch paths | ORPHAN |
| request a safe exit of an unattended run through a stop sentinel | auto_stop.sh |
Requests a safe exit of the unattended run via a stop sentinel | auto_driver.py, auto_supervisor.sh, grinder.py, lora_grind.py (+1) | repo scratch paths | LIVE |
| restart the drafting lane's shell at a queue boundary so new arguments apply | lanes/relaunch_drafter_shell.sh |
Waits for a wave to queue, then restarts the drafting lane's shell so new arguments apply | — | lane script paths | REFERENCED |
| restart the executable lane's shell at its one safe boundary | lanes/restart_main_lane_when_idle.sh |
Restarts the executable lane's shell at its one safe boundary | — | lane script paths | REFERENCED |
| restart the gating lane's shell between gates so a jobs change lands | lanes/restart_gater_when_idle.sh |
Restarts the gating lane's shell once the current gate finishes | — | lane script paths | ORPHAN |
| rotate binaries drafting small stubs with a served model, gating and propagating | lora_grind.py |
Mass-run driver rotating binaries, drafting small stubs with a served model, gating, propagating | bulk_harvest.py, serve_local.py | repo scratch paths, model endpoint | LIVE |
| route a gate result set to the repair tool its own verdict names | gate_triage.py |
Routes a gate result set to the repair tool its own verdict names | docs/wave-playbook.md | repo scratch paths | LIVE |
| run a restartable gating lane that is safe to kill at any time | lanes/gater.sh |
The restartable gating lane, safe to kill and relaunch at any time | restart_gater_when_idle.sh | job count, repo paths | LIVE |
| run distillation beside drafting so learned idioms reach the next wave | lanes/distill.sh |
The distillation lane, running beside drafting and never in front of it | — | repo scratch paths | REFERENCED |
| run the executable's own draft, gate and commit cadence beside other lanes | main_lane.py |
The executable's own draft, gate and commit cadence beside the other lanes | main.sh | repo build/make targets | LIVE |
| run the executable's own lane loop on its clean-rebuild cadence | lanes/main.sh |
The executable's own lane loop, on its clean-rebuild cadence | gate_stage.py, restart_main_lane_when_idle.sh | repo make targets | LIVE |
| run the free recovery and re-judgement passes whenever the gate is idle | lanes/maintenance.sh |
The maintenance lane running the free recovery and re-judgement passes | — | repo scratch paths | ORPHAN |
| run the one shared recovery, byte-gate and log ladder every producer calls | gate_stage.py |
The shared deterministic recovery, gate and log ladder every producer calls | docs/wave-playbook.md, api_agent.py, bulk_harvest.py, fix_tu_ret_decls.py (+11) | repo src/config layout | LIVE |
| run the token-free permuter grinder beside a saturated gate | lanes/grinder_lane.sh |
Runs the model-free permuter grinder beside a saturated gater | — | repo scratch paths | ORPHAN |
| run two drafting pools against one serial gate | lanes/campaign.sh |
Dual-pool campaign lane: two drafting pools, one serial gate | forever.sh | provider config, repo paths | LIVE |
| save each subagent's full final report to one file per target | agent_reports.py |
Saves each subagent's full final prose report to one file per target | docs/wave-playbook.md, transcript_dump.py | agent transcript paths | LIVE |
| select a worker wave's target batch from the manifest with cache filters | wave_targets.py |
Selects a worker-wave target batch from the target manifest with cache filters | build_fuel_manifest.py, gate_stage.py, orchestrator.py | repo scratch paths | LIVE |
| serve a fine-tuned model locally behind a chat-completions endpoint | serve_local.py |
Serves the fine-tuned model locally behind a chat-completions endpoint | bulk_harvest.py | training venv, GPU assumptions | LIVE |
| spend spare provider capacity on other work when the gate is the constraint | lanes/elastic.sh |
Spends spare provider capacity on extra work when the main lane cannot | — | provider config, repo paths | ORPHAN |
| substitute, build, keep only if byte-identical, else revert | harvest_verify.py |
The whole-binary byte gate: substitute, build, keep only if identical, else revert | auto_driver.py, family_sweep.py, gate_stage.py, gater_lane.py (+4) | repo src/build layout | LIVE |
| turn mined pairs into a chat-template instruction dataset | format_finetune.py |
Turns the mined pairs into a chat-template instruction dataset | api_draft.py, train_lora.py | dataset paths, model chat template | LIVE |
| turn pre-gate rejects back into bankable drafts for zero model tokens | recover_rejects.py |
Turns pre-gate rejects back into bankable drafts for zero model tokens | maintenance.sh | repo scratch paths | LIVE |
| unify live stubs into one ranked, class-tagged, cache-annotated target pool | build_fuel_manifest.py |
Unifies live stubs into one ranked, class-tagged, cache-annotated target pool | orchestrator.py, worklist.py | canonical source binary, repo scratch paths | LIVE |
| validate a batch's declaration compatibility in seconds without building it | pregate_check.py |
Validates a batch without building it, in seconds instead of minutes | gate_main.py | repo src layout | LIVE |
| verify the whole fleet exclusively on a clean tree and clear deferred debt | r22_verify.sh |
Exclusive clean-tree fleet verification that also clears deferred-check debt | parallel_gate.py | repo make targets | LIVE |
P9 — publish
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| acquire and checksum-verify vendor SDK pieces for a linked build | fetch_psyq.sh |
Optional acquisition and checksum verification of vendor SDK pieces for the linked build | Makefile, psyq_libs_from_disc.py | PS1 SDK sources, repo paths | LIVE |
| assert a documented ignore-file template equals the shipped template byte for byte | gitignore_template_check.py |
Asserts the ignore-file template in the docs equals the kit's template byte for byte | Makefile, kit_lint.py | repo doc and template paths | LIVE |
| assert nothing purged remains in any object, message or ref | public_rewrite/absent_scan.py |
Asserts nothing purged remains in any object, message or ref | — | repo scratch paths | ORPHAN |
| assert that the distilled kit cites or dispositions every rule and every hindsight entry of the source project (no silent gap in the distillation) | kit_coverage.py |
Derives the rule and accelerator populations from the digest and the ledger, matches them against the kit's provenance lines, refuses an uncovered entry unless config/kit_coverage_map.tsv dispositions it | Makefile | repo digest/ledger/kit paths + the provenance citation forms | LIVE |
| build a progress timeline from the repository's own committed digests | timeline.py |
Builds a progress timeline from the repository's own committed digests, with a self-check | Makefile | repo doc paths | LIVE |
| check that every relative link in the public docs resolves | doc_links.py |
Checks that every relative link in the public docs resolves and the link policy holds | Makefile, wiki_render.py, wiki_sync.sh | repo doc paths | LIVE |
| compile every eligible translation unit with the pinned toolchain, using no derived bytes | compile_only.py |
Compiles every eligible translation unit with the pinned toolchain, without any game bytes | .github/workflows/no-rom.yml, delever_oracle.py, lever_census.py, macro_to_header.py (+1) | compiler triple, repo makefile parsing | LIVE |
| compute and publish progress metrics as report, machine data and per-binary breakdowns | progress.py |
Computes and publishes the progress metrics as report, JSON and per-binary breakdowns | Makefile, docs/wave-playbook.md, api_agent.py, atlas.py (+37) | repo src/config layout | LIVE |
| convert progress metrics into an external progress-report schema | objdiff_report.py |
Converts the progress JSON into the external progress-report schema | .github/workflows/progress.yml | external report schema | LIVE |
| emit the public ordinal-to-hash map and the private old-to-new map | public_rewrite/build_commit_map.py |
Emits the public ordinal-to-new-hash map and the private old-to-new map | probe_github.sh, resolve_tokens.py | repo doc/scratch paths | LIVE |
| gate a first push: prove no derived bytes among tracked files | audit_public.py |
The first-push gate: no derived bytes among tracked files, four independent checks | .github/workflows/no-rom.yml, gate_scan.py | repo purge-set and path lists (the kit's template reads config/firewall.txt instead) |
LIVE |
| gather every recorded hindsight into one document with file and line anchors | mine_hindsight.py |
Gathers every recorded hindsight with file and line anchors into one document | — | repo doc paths | REFERENCED |
| generate a symptom-keyed index of a large technique document | cookbook_index.py |
Generates a symptom-keyed index of the large technique document | .github/workflows/no-rom.yml, Makefile, docs/wave-playbook.md, api_agent.py | repo doc paths | LIVE |
| keep a portable starter kit free of one project's names, paths and numbers | kit_lint.py |
Keeps the day-one kit free of the source project's names, paths, addresses and rule numbers, honours its placeholder contract, and syntax-checks its scripts | Makefile | the kit path and the source project's leak pattern | LIVE |
| map every old commit hash to an inert token, privately | public_rewrite/hash_dict.py |
Builds the private dictionary mapping every old commit hash to an inert token | common.py, run_filter.py | repo scratch paths | LIVE |
| probe whether old commit hashes still resolve on the hosting service | public_rewrite/probe_github.sh |
Probes whether old commit hashes still resolve on the hosting service after a purge | build_commit_map.py | hosting service API, repo name | LIVE |
| prove no derived blob is reachable from the refs about to be pushed | public_rewrite/gate_scan.py |
History gate: no derived blob reachable from the given refs, four derived checks | audit_public.py | repo declaration files | LIVE |
| prove pairwise that a rewrite changed only what it was told to | public_rewrite/verify_rewrite.py |
Pairwise proof that the rewrite changed only what it was told to change | build_commit_map.py | repo scratch paths | LIVE |
| prove the whole byte-identity contract end to end, step by step | verify_contract.sh |
The recorded end-to-end verification run of the byte-identity contract, step by step | — | repo make targets, output dir | REFERENCED |
| publish progress metrics to a hosted progress service | frogress_upload.py |
Posts the progress JSON to a hosted progress service, dry-run by default | — | service URL, project/version names | REFERENCED |
| render and publish the docs to a hosted wiki, replacing its pages | wiki_sync.sh |
Renders and publishes the docs to the hosted wiki, replacing its pages | wiki_render.py | wiki remote URL, repo paths | LIVE |
| render doc trees into wiki page names, rewriting every relative link | wiki_render.py |
Renders the doc trees into wiki page names with every relative link rewritten deterministically | Makefile, wiki_sync.sh | repo doc paths | LIVE |
| run a history rewrite inside a bare clone, refusing to run elsewhere | public_rewrite/run_filter.py |
Composes and runs the history rewrite inside a bare clone, refusing to run elsewhere | — | rewrite tool version, repo scratch paths | ORPHAN |
| scrub one text with the rewrite's rules, with a sample and self-test | public_rewrite/scrub.py |
The single scrub function of the history rewrite, plus its sample and self-test | build_commit_map.py, run_filter.py, verify_rewrite.py | purge rules, repo scratch paths | LIVE |
| set up a fresh clone idempotently: packages, environments, pinned tools | bootstrap.sh |
Idempotent fresh-clone setup: check packages, create environments, fetch pinned tools | Makefile, compile_only.py, decompme_replica.sh, make_fixtures.sh | repo layout, package names | LIVE |
| share the purge rules and derived hash sets across the rewrite package | public_rewrite/common.py |
Shared purge rules, derived hash sets and helpers for the history-rewrite package | absent_scan.py, build_commit_map.py, gate_scan.py, hash_dict.py (+4) | repo scratch paths | LIVE |
| turn ordinal tokens back into shortest-unique hashes at the rewritten tip | public_rewrite/resolve_tokens.py |
Turns ordinal tokens back into shortest-unique hashes at the rewritten tip | build_commit_map.py | repo tracked text files | LIVE |
P10 — readability
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| add per-site function-pointer casts so a draft can call a differently typed callee | cast_call_sites.py |
Adds per-site function-pointer casts so a draft can call a differently typed callee | canon_sig_reconcile.py, cast_self_callers.py, family_sweep.py, gate_stage.py (+4) | repo src layout | LIVE |
| apply curated names and signatures inside the analysis tool and save | ghidra_scripts/ApplySymbols.java |
The in-tool half of that mirror: apply curated names and signatures, save on exit | ghidra_apply_symbols.sh, ghidra_export_annotations.sh, ghidra_rebuild.sh, ExportAnnotations.java (+1) | none | LIVE |
| build the pack one agent needs to read and crack one residue exemplar, without touching the tree | delever_pack.py |
The Phase-36 T7 pack builder (one agent at a time): per residue exemplar of ≥N copies a directory under .run/P36/agents/ with the TU path, the body as the tree has it, the lever-free body (the seed), the residual as mnemonic blocks from delever_search --try (a scratch compile, no tree write), the ledger's NEEDED sites, and every engine attempt with its best moves; ORDER.tsv ranks the exemplars by the best distance reached, then copies. PROMPT.md beside them is the agent's brief. | — | repo scratch paths; the engine's outcomes and traces | REFERENCED |
| census every compiler-forcing construct in the C and gate the levers-off phase | lever_census.py |
The Phase-36 census of lever sites (register pins, asm statements by kind, volatile levers, bare register, asm-label aliases, builtins, attributes; the whole-body hand-asm routines and the GTE ops set apart) derived from the shared-body scanner with a per-token coverage assertion against the raw text, four known-true controls, the !FAKE marker split, --check (0 unmarked pins/asm, 0 orphan markers) and --strict (0 pins, 0 asm) gates, --sites for the delever ledger, a fixture self-test | Makefile, argcheck.py, delever.py, delever_cycle.sh (+8) | repo paths, the shared-body scanner | LIVE |
| census every struct definition, raw pointer-cast dereference and function declaration in the C, and cluster the cast sites into the types the tree needs (the struct map) | type_census.py |
The Phase-37 type census: struct/union/typedef definitions fleet-wide with o32 layouts (duplicate classes by layout+member evidence, VARIANT camps, dead and shadowed canonical names), every cast site in six forms (P (T)(…), I (T)ident, X ((T*)e)[i], M M2C_FIELD, A address-of, C typed cast-member) with base class/offset/width/sign/access and a per-form coverage assertion against an independent raw regex, the declaration layer (definitions K&R-read, extern spellings per name, multi-body names, asm-label aliases, builtins, attributes, argcheck's lying set), global blocks (runs of adjacent scalar D_ symbols), four known-true controls, and the struct map — union-find over evidence edges only (same global, argument flow into a parameter the callee dereferences with shared offsets, single-source assignment/return flow, pointer-field flow, body-hash identity) with a width-conflict veto; writes type_census.json/txt, struct_map(.top).json, sites.jsonl (--sites), parked.tsv (the P36 parked classes with reasons) and docs/struct-map.md; --check is the T8 gate; --selftest | progress.py, readability_progress.py, restruct.py, restruct_cycle.sh (+1) | repo paths, the shared-body scanner, argcheck, the P36 ledger (parked.tsv) | LIVE |
| compute a struct definition's o32 layout, map its fields by offset, write a canonical definition in the final style and assert the naming invariant (unk/pad at offset HEX, leading offset comments, the size trailer) | struct_layout.py |
The Phase-37 layout library factored out of type_census.py (T3): SCALARS/SDK_SIZES, parse_struct_body, Resolver (o32 sizes/aligns/leaves incl. arrays, nesting, bit-fields, packed, aligned(N); cc1-validated on 5,283 definitions), layout_hash, field_offsets, field_map, leaf_at, render_struct + entries_from_layout (the WRITER: /* 0xNN */ comments, unk for accessed-unknown fields, u8 pad[n] for never-touched gaps, // size = 0x..; overlaps and misaligned widths refused/skipped), audit_definition (the SYNC_FIELD equivalent, derivable), mask_comments; --selftest | restruct.py, type_census.py | the o32 ABI's rules; the tree's scalar typedef names | LIVE |
| consolidate the GTE coprocessor inline-asm macros under Sony's names in one header and sweep dead lever macros | gte_consolidate.py |
The Phase-36 T5 tool: every asm-bearing macro definition and direct GTE statement SIGNED by the build's own maspsx→as tail (template bytes with operands bound to fixed registers, operand counts, clobbers); one canonical text per signature named by PsyQ's inline_c.h convention (Sony's file supplies names and clobber lists, never opcode words) written to include/gte_inline.h; per file the canonical duplicates deleted, private names renamed, a variant with extra clobbers tried as canonical and kept as a marked _m lever only when the object differs, direct statements rewritten into canonical calls (a concatenation of two included); every file judged through every recipe; --sweep deletes dead asm-bearing macros and drops a compound macro's inner asm when byte-neutral | delever.py, delever_cycle.sh, delever_permute.py, lever_census.py | Sony's inline_c.h path, the census sites, the oracle | LIVE |
| convert a shared-body macro header into per-function plain-C headers included at each site | macro_to_header.py |
The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | share_body.py, tool_census.py | the macro form is this project's; a kit-born project shares headers from its first bank | LIVE |
| emit a function's target assembly as an inline-assembly body | asm_verbatim.py |
Emits the file-scope inline-assembly body form from a disassembly file | docs/wave-playbook.md, draft_prechecks.py, gate_main.py, recover_route.py | repo asm layout | LIVE |
| extract inline-defined types and typedefs from a source file into a shared header | build_engine_types.py |
Extracts inline-defined named types and typedefs from a source file into a shared header | inject_capped_externs.py, lift_types.py, uniquify_type.py | repo shared-header path | LIVE |
| find a lever-free spelling of a body by a guided search on the byte distance, not a blind test | delever_search.py |
The Phase-36 rung G: the same shape generators as rung R (declaration order/move, initializer split, commutative swap, temp inlined/introduced/hoisted, block wrap/unwrap, adjacent swap) and the same per-TU oracle, but every candidate SCORED — the function's instructions read out of the scratch object and compared, reloc-masked, with the fleet run's baseline object, as an edit distance — the residual CLASSIFIED (REG caller/callee, COUNT, ORDER, MIXED) to choose the move families, and a beam search composing two and three moves under a compile budget; a score-0 verified on every recipe and banked through delever --apply-body, then --propagate to the class. Controls: the tree's own text must score 0 (per body), --positive-control perturbs a matching body and requires the way back, --selftest. | delever.py, delever_pack.py, delever_regen.py, restruct.py (+1) | repo scratch paths; the recipe oracle | LIVE |
| find every call site whose in-scope declaration is narrower than the callee real definition | argcheck.py |
The static filter for the missing-argument class: six T7 agents independently reached score 0 by restoring an argument the decompiled source had dropped (m2c drops them at unprototyped and indirect call sites), and no candidate generator can reach it because every family rewrites statements and declarations while this changes a call ARITY. Reads the real arity from the DEFINITION wherever it lives (a .c under src/ or a shared body header) and reports each narrower declaration with the scope that says which fix is available: the cast route is body-only at either scope, widening the declaration itself needs block scope. Known blind spot, stated in the docstring: it cannot see a definition that is uniformly wrong. | decl_repair.py, delever.py, readability_progress.py, restruct.py (+1) | repo paths; the census walk | LIVE |
| flag address-named references whose address now has a curated name | lint_symbol_refs.py |
Flags address-named references in committed sources whose address now has a curated name | .github/workflows/no-rom.yml, Makefile | repo symbol/src paths | LIVE |
| give each conflicting camp of a same-named type its own name | uniquify_type.py |
Gives each conflicting camp of a same-named type its own name so every camp becomes liftable | — | repo src layout | REFERENCED |
| guard that every inline-assembly body still reproduces its target bytes | verbatim_check.py |
Regression guard that every inline-assembly body still reproduces its target bytes | .github/workflows/no-rom.yml, Makefile, lever_census.py, progress.py (+2) | repo src layout | LIVE |
| judge one translation-unit edit by the bytes of its object in under a second | delever_oracle.py |
The Phase-36 fast byte oracle: every object's exact build command captured once via make -n -W (the Makefile's own recipe, pad stage and -O0 overrides included), a candidate compiled in place with -o/-MF redirected to scratch and compared with the fleet run's object; --calibrate proves 100 % equality untouched, twin == primary and a positive control before any verdict is trusted | delever.py, delever_cycle.sh, delever_permute.py, delever_search.py (+3) | the Makefile's object rules, the twin rule | LIVE |
| keep the lever count as a series a chart and a story can be drawn from | lever_progress.py |
The Phase-36 lever series: a milestone row appended per census snapshot (its totals by class with the tree's HEAD, since a census is a moment that cannot be recovered later) plus the campaign table derived from the de-lever ledger on every render — per batch the rungs used, the bodies first judged, the sites removed and rewritten, and, scored as a transition against what that body's previous row left, the sites a later rung closed and the bodies it made lever-free; renders both into docs/levers.md's generated block and --check refuses a series that is not this tree's | readability_progress.py | the census json, the delever ledger | LIVE |
| measure duplicate function bodies across the fleet and assert one source per unique function | share_census.py |
The census of byte-identical function classes across every binary with their source forms and verdicts, plus the S1 invariant check with its exception ledger and a fixture self-test | Makefile, audit_binaries.py, dedup_integrate.py, delever.py (+13) | repo paths, the registry and signature schemas | LIVE |
| mirror the curated symbol file into the analysis database with a real save | ghidra_apply_symbols.sh |
Mirrors the curated symbol file into the analysis program headlessly, with a real save | — | repo symbol path, project name | REFERENCED |
| re-run newly harvested generator families over the whole residue and bank what closes, without re-sweeping | delever_regen.py |
The Phase-36 regen pass (S103): for every residue class, the lever-free body and the engine's best text are fed to delever.recipe_candidates with ONLY the named generator families (the two newest by default) and every candidate is scored read-only through delever_search --try --body, one worker per class; a TSV under .run/P36/regen/ lists each class's best; --bank re-scores each score-0 row on the current tree, then apply_body_core + --propagate (the one writer). Built because no search ever revisits a residue class after a new generator lands. | — | repo scratch paths, the delever generator registry | ORPHAN |
| refuse, from one place, the command line of a tool the project has frozen | frozen.py |
The one refusal a FROZEN tool prints from its main(): the tool, the successor and why; imports never exit (libraries stay usable) | aprop_autodraft.py, blocker_probe.py, canon_sig_reconcile.py, conform_decls.py (+10) | nothing | LIVE |
| regenerate a splitter-format target disassembly for a function no longer stubbed | verbatim_target_s.py |
Regenerates a splitter-format target disassembly for a function that is no longer a stub; --gas emits the assemblable gas-syntax form ($-registers, .L labels, noreorder) that a web diff service accepts as a pasted target | decompme_replica.sh, delever_permute.py | repo build/asm layout | LIVE |
| rewrite raw pointer casts into struct members, canonicalise function declarations and fold duplicate struct definitions across a matched tree, every edit judged on the object (whole-object, then linked when only the relocation spelling moved); probe the struct, declaration and definition layers before the campaign | restruct.py |
The Phase-37 struct/declaration rewrite engine (T3): rung S (every typed base of a body -> ((Unkstruct_X *)base)->unkK, or base->unkK / D_x.unkK when the base is declared with the type; canonical types only under --apply, T2's local P37S_ type under --try), S2 (the minimal kept-cast set: leave-one-out, cumulative revert, minimise), S+A (delever's ladder on the struct-spelled text — the struct hypothesis; (P37 S+A …) markers, stale gte-lever markers scrubbed), X (the residual classified and named by the pass it resembles: SCHED-ALIAS / CSE-KILL / WIDTH / ADDRESS-FOLD / ALIGNMENT / REGALLOC), R (a recipe registry with fixtures: the pointer global as a struct member, extern T X[], the walked pointer), D (every declaration of a callee -> the definition's ANSI signature > the width-promoted form > all-() marked // K&R: n of m args; the definitions index keyed by the TU's visible files and REFUSING disagreeing definitions; --callee/--signature for a definition-side change judged on every declaring TU), L (definition folds with member renames by the offset map, REFUSED on an ambiguous member name); --plan/--apply --rung S | D | L --batch --label [--headers] [--only] [--redraw], the ledger .run/P37/restruct/ledger.jsonl keyed (rung, tu, unit, hash), --restore from inflight.json, --status, --check-ledger (every MEMBER site still a leaf of its canonical type), --audit-types (struct_layout's naming invariant over the canonical files), --write-types (the writer's preview from the struct map), --try-file (a real-oracle dry run, nothing written), --selftest [--real]; the T2 probes kept (--try, --probe, --probe-decls, --probe-defs, --audit-layouts, --fanout-cost) | restruct_cycle.sh, struct_layout.py, type_census.py |
| run the de-lever batch cycle unattended: batch, verify by exit code, clean fleet gate, census, log, commit | delever_cycle.sh |
The Phase-36 T3/T4 driver: per batch a clean-tree check, the oracle recalibrated when stale, delever --apply read by exit code and its final X/X line, the clean fleet run as the outer gate (218/218), the census rerun, the phase-log entry and the checkpoint headline, one commit per batch; stops on the first red with the files in place for --restore | delever.py, gte_consolidate.py, restruct_cycle.sh | the batch size, the aliases, the fleet count | LIVE |
| run the share-body batch cycle unattended: batch, verify by exit code, log, commit, periodic clean fleet check | share_body_cycle.sh |
The Phase-35 T5 driver for bucket new: per batch share_body --apply --bucket new --batches 1 --label new, the gated N/N line read, the phase log entry appended, the bank committed the moment it is green, the clean fleet run every N batches — stops on the first red | — | repo paths, the phase-log format, the fleet count from config/check.*.sha | ORPHAN |
| run the struct/declaration rewrite batch cycle unattended: batch, verify by exit code, clean fleet gate, census, log, commit | restruct_cycle.sh |
The Phase-37 T3 driver cloned from delever_cycle.sh: per batch a clean-tree check, the oracle's snapshot refreshed (the guard) and recalibrated when stale, restruct --apply --rung R read by exit code and its final X/X identical, the clean fleet run (the clean fleet gate), the type census + the readability snapshot, the phase-log entry + the 🛑 headline, one commit; stops on the first red with the batch's files in place for --restore; RUN DETACHED (setsid nohup) |
restruct.py | the fleet size (config/check.*.sha), the phase log's checkpoint marker | LIVE |
| search the compiler's own shape space for a lever-free body that keeps the bytes | delever_permute.py |
The Phase-36 rung D: one exemplar per residue text class from the delever ledger (largest class first — a match banks every copy), each prepared as a single-function translation unit (delever's rung-A rewrite of every removable site, every other definition reduced to a prototype, shared-header includes to their prototypes, INCLUDE_ASM and file-scope asm dropped, the build's own CPPFLAGS through cpp -P) against a target regenerated from the ROM image in both the assemblable and the splat form; every attempt calibrates itself first (the LEVERED body must be MATCH, or the harness is not measuring that function) and records the lever-free body's starting distance; decomp-permuter through permuter_ils with the weight profile chosen from the NEEDED kinds; a score-0 winner is banked only through delever --apply-body and the GTE re-fold; scratch, winners and the outcome ledger keyed by alias+fn | — | the ledger, the permuter harness, the target regenerator | REFERENCED |
| see which register local-alloc gives each value inside one basic block, and why, before trying a register move | localalloc_sim.py |
Simulates gcc 2.7.2's block_alloc for the block containing a given insn from a .lreg dump: quantity births/deaths, ties (combine_regs), copy suggestions, qty_compare_1 priority, find_free_reg — and prints the simulated hard register beside the one the dump records (0 mismatches over 150 validated block simulations, S103). Complements alloc_table.py, which shows global allocation only. | — | the cc1 dump format | ORPHAN |
| share one byte-identical function class across its binaries through an include-at-site header, gated per binary | share_body.py |
The Phase-35 successor of dedup_propagate + dedup_extend for the include-at-site form: exemplar by majority text, the header written once, every private copy replaced by the include at its position, per-binary byte gate with object comparison, bisect on red, the registry appended or extended by text, the exception ledger on refusal; --plan / --apply --bucket extend | new | aprop_autodraft.py, audit_binaries.py, auto_driver.py, blocker_probe.py (+18) | repo paths, the registry and signature schemas |
| take register pins, asm statements, volatile and register levers out of matched C, byte-gated per site | delever.py |
The Phase-36 de-lever engine and campaign tool: positional rewrites per lever class (pin -> plain declaration, barrier/keep-alive deleted, a launder deleted or turned into the assignment it is, a hand-placed instruction -> its C, the zero-register variable -> 0, a macro-carried site deleted/valued/refused by its macro's shape, volatile/register dropped); per body replay -> rung A strip-all -> rung B greedy through delever_oracle; the file is the write unit and its final compile through every recipe the proof; --plan/--apply batches (TUs parallel, exemplar files first; headers serial, includers parallel), the ledger keyed by tu+fn+addr with the body's nhash before/after, !FAKE markers on class A/B survivors, --redraw for bodies refused by an older tool, --restore from inflight.json, --scrub for orphan markers, --apply-body for T6/T7, --recipes (rung R: the byte-neutral shape recipes — the formerly-pinned declarations permuted, one moved through the declaration run, an initializer split — each judged by the oracle, with an identity control on both the splice and the oracle), --selftest with a stub oracle, --probe (T2) | delever_cycle.sh, delever_pack.py, delever_permute.py, delever_regen.py (+4) | the census site records, the oracle | LIVE |
| track how honest and how readable the matched C is over time, as a generated series | readability_progress.py |
The Gen3 companion to docs/levers.md: levers are only one way the source is untrue. Counts lying call declarations (a call site whose in-scope declaration names fewer parameters than the callee definition, split by the K&R-empty and (void) forms, and how many sit in a body that still holds an argument-register pin) and raw cast dereferences against struct member reads, which is the struct debt. Appends a dated row carrying its commit to docs/readability-progress.tsv and renders docs/readability.md; --check asserts the last row is this tree. | restruct_cycle.sh, type_census.py | repo paths | LIVE |
| turn an inline-assembly body back into a stub the toolchain can reach | verbatim_to_stub.py |
Turns an inline-assembly body back into an include-assembly stub | — | repo src/asm layout | REFERENCED |
| widen every call declaration that lies, and measure on the bytes which repairs are free | decl_repair.py |
The free-correctness half of the missing-argument class: a declaration is repaired only when every call to that function in the unit ALREADY passes the arguments, so the code is right and only the promise is wrong. Each candidate is compiled from a scratch copy through the unit own recipe and compared on .text/.rodata/.data (never whole-object: the object records its own source path, which made the first fleet run return 0 free of 3,634 units). Every unit is negative-controlled by compiling it UNCHANGED first, and a unit whose control fails is reported as a harness failure rather than a result. --apply writes only the units this run judged identical. | — | repo paths; the recipe oracle | ORPHAN |
PROJECT-ONLY — project-only in code (the shape is a task; the code does not transfer)
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| account for every byte of the medium, leaving zero unexplained residue | disc_audit.py |
Byte partition over one disc, importing the game-specific container and compression modules — the partition itself (every byte of the medium accounted for, residue zero) is a Phase-1 task | Makefile | project-only | LIVE |
| assemble a vendor graphics library's object list and address blocks for linking | make_libgs.sh |
Hard-codes one executable's exact vendor object list and address blocks | Makefile, fetch_psyq.sh | project-only | LIVE |
| cross-validate an extraction against an independent third-party tool | bfm_extract/crosscheck.py |
Cross-validates against a third-party tool written for that specific game | test_lzss.py | project-only | LIVE |
| decode a bespoke compression format, cross-checked against its own length field | bfm_extract/lzss.py |
Decoder for one game's non-generic compression semantics, verified against its own decompressor | .github/workflows/no-rom.yml, extract.py, test_lzss.py | project-only | LIVE |
| decode an on-disc index table into a payload-to-binary naming map | idxtab_map.py |
Decodes one game's on-disc index table and its payload-to-binary naming convention — the load map itself is a Phase-2 task | find_addr_refs.py | project-only | LIVE |
| expose a disc extraction pipeline's stages as one package | bfm_extract/__init__.py |
Package entry for one title's disc pipeline; names its own container stages | jtbl_rodata_pads.py, oracle_reorder.py | project-only | LIVE |
| extract a prototype build's executable, allowing for its known deviations | bfm_extract/extract_proto_exe.py |
Companion for one title's prototype discs and their specific deviations | ghidra_rebuild.sh | project-only | LIVE |
| extract the console executable and hard-validate its name, size and header | bfm_extract/extract_exe.py |
Hard-validates one executable's exact name, size, hash and header field values | Makefile, audit_public.py, extract.py, extract_proto_exe.py (+1) | project-only | LIVE |
| list a sound library's address window and per-address exclusions | make_snd_used.py |
Hard-codes one executable's sound-library address window and per-address exclusions | Makefile, fetch_psyq.sh | project-only | LIVE |
| list the interface library's objects and address window the executable actually links | make_apicard_used.py |
Hard-codes one executable's interface-library address window and object roster | Makefile, fetch_psyq.sh | project-only | LIVE |
| observe a live loader's requests to learn which payload loads where | cdtrace.py |
Reads one game's loader request structures at fixed RAM addresses | — | project-only | ORPHAN |
| onboard one payload by its container and file-index naming | new_overlay.sh |
Takes one game's container and file-index naming as its command-line contract | Makefile, config/overlays.mk, dup_report.py, family_remap.py (+2) | project-only | LIVE |
| parse a bespoke archive-chain header format | bfm_extract/pac.py |
Parser for one game's bespoke archive-chain header format | crosscheck.py, extract.py | project-only | LIVE |
| read a bespoke container's table of contents to locate its files | bfm_extract/cd_archive.py |
Reader for one game's bespoke container table-of-contents format | crosscheck.py, extract.py | project-only | LIVE |
| unit-test a bespoke compression decoder against known cases | bfm_extract/test_lzss.py |
Unit tests for that game-specific compression variant | .github/workflows/no-rom.yml | project-only | LIVE |
| walk the whole medium and extract every file deterministically | bfm_extract/extract.py |
Full-disc extractor bound to one disc's root file list and audio-track handling | Makefile, extract_exe.py, verify_worktree.py | project-only | LIVE |
Retired (tools/sunset/) — superseded by a named successor, or a one-off whose product exists
| Tool | Verdict | Successor or product | What it did |
|---|---|---|---|
audit_header_sigs.py |
SUPERSEDED | tools/conform_decls.py | Finds shared-header declarations that contradict the banked definition |
bank_exemplar.py |
SUPERSEDED | tools/gate_stage.py | Banks one cracked exemplar through the carve, splice and staged-recovery ladder |
bisect_slate.py |
SUPERSEDED | tools/gate_main_parallel.py | Isolates the byte-wrong drafts in a batch, with a null control first |
build_wave.py |
SUPERSEDED | tools/draw_waves.py | Builds the next wave from a card pool, ranked by fleet leverage |
build_wave_args.py |
SUPERSEDED | tools/wave_args.py | Emits workflow arguments for a wave from the target manifest, resolving each path |
canon_draft_decls.py |
SUPERSEDED | tools/sig_unify.py | Canonicalizes a draft's extern and data declarations to the banked-consistent set |
dedup_extend.py |
SUPERSEDED | tools/share_body.py | Extends the existing share registry to newly onboarded binaries |
dedup_propagate.py |
SUPERSEDED | tools/share_body.py | Lifts one matched body into a shared macro and instantiates it at every duplicate site |
exemplar_miner.py |
SUPERSEDED | tools/atlas.py | Routes every residual stub to its lever and ranks the highest-reach work |
fix_header_decl.py |
SUPERSEDED | tools/conform_decls.py | Rewrites a shared-header caller declaration to a draft's byte-true signature |
gen_engine_decls.py |
SUPERSEDED | tools/conform_decls.py | Declares every shared function and data symbol once, canonically, in a generated header |
glm_parallel.sh |
SUPERSEDED | tools/ox_campaign.py | Splits a target list into slices and runs concurrent drafting workers against one endpoint |
glm_reconcile.py |
ONE-OFF | the measured verdict that the declaration wall is a reconciliation problem, plus the captured reasoning distilled into the cookbook (Phase 23 T10.7 A/B) | Aims a reasoning model at the declaration wall and captures its reasoning for reuse |
idiom_loop.py |
SUPERSEDED | tools/idiom_serial.py | Never-ending meta-loop: drain the easy fuel, learn the next idiom, hand off |
jr_isolate.py |
SUPERSEDED | tools/jr_isolate_all.py | Isolates one switch function into its own code segment for an independent table carve |
lanes/bounce_drafter_on_queue.sh |
SUPERSEDED | tools/lanes/relaunch_drafter_shell.sh | Waits for the in-flight wave to queue, then restarts the drafting process |
lanes/launch_ox.sh |
ONE-OFF | the sharded overnight campaign run it launched (its key file, endpoint and model are that campaign's) | Launcher for a sharded campaign run with a tag and shard count |
lanes/toolwork.sh |
ONE-OFF | the tooling-design briefs it ran against an external model (its key, endpoint and model are that era's) | Runs tooling-design briefs against an external model with build config as context |
lenmiss_route.py |
ONE-OFF | the routed outcome of one length-drift near-miss pile (it consumes that audit's classified ledger) | Routes the length-drift near-miss pile through the documented lenses, re-verified against the tree |
macro_draft.py |
ONE-OFF | the per-function headers under src/shared/ (Phase 35 T4; the macro form is gone) | Materializes a shared macro body back into a compilable standalone draft |
p16_known_answer.py |
SUPERSEDED | tools/p16_improve.py | Graduated known-answer validation of the scaffold pipeline across difficulty bands |
plumbing_groups.py |
SUPERSEDED | tools/gate_triage.py | Groups recorded declaration-conflict failures into sweepable work groups from the ledgers |
reconcile_slate.py |
SUPERSEDED | tools/pregate_check.py | Drives a whole batch to declaration-compatible before any rebuild is spent |
recover_drafts.py |
SUPERSEDED | tools/agent_drafts_restore.py | Recovers agent-written draft files from a run's transcripts after they were deleted |
residual_rules.py |
SUPERSEDED | tools/residual_rules_b.py | Turns a measured residual into the specific documented lever that addresses it |
rtu_shadow.py |
ONE-OFF | the measured gate-inversion decision (whether the cheap real-unit check should become the gate's stage 0) | Runs the real-translation-unit check in shadow beside the gate to measure gate inversion |
scan_leftovers.py |
SUPERSEDED | tools/integration_resolver.py | Re-verifies every draft already on disk and banks the free wins |
sweep_citations.py |
SUPERSEDED | tools/gccmap_cites.py | Deterministically localizes every compiler-source citation in a document against the pinned sources |
symcheck.py |
SUPERSEDED | tools/reloc_verify.py | Pre-gate guard diffing the symbol set a draft references against the target's |
t5_bank.sh |
SUPERSEDED | tools/gate_wave.py | Post-draft half of an agent wave: refuse if unsafe, judge each arm, bank the union |
t5_distill_args.py |
SUPERSEDED | tools/distill_scan.py | Builds the post-wave distillation slate from a wave's directories |
t5_targets.py |
SUPERSEDED | tools/draw_waves.py | Draws one routed slate from the frontier classes |
t7_bank.py |
SUPERSEDED | tools/gate_stage.py | Batch banking driver applying reconcile-at-bank-time plus the whole-binary gate |
test_reconcile_ledger.py |
ONE-OFF | the S45p7 reconcile-ledger proof, retired with its subject dedup_propagate | Targeted proof of the propagation ledger guard the full control never exercised |
treelock.sh |
SUPERSEDED | tools/shared_lock.py | The mutex wrapper for tree-writing campaigns, with status and stale detection |
verify_map_findings.py |
ONE-OFF | the machine-checked verdicts of one codegen-map audit (docs/gcc-2.7.2-map/regalloc.md) | Machine-checks a codegen-map audit's findings against the actual compiler sources |
wall_taxonomy.py |
SUPERSEDED | tools/frontier_classify.py | Census-classifies every unmatched residual by blocker class to size each avenue |
warmstart.py |
SUPERSEDED | tools/permuter_sweep.py | Feeds the permuter warm-start drafts built from banked exemplars and routed fuel |