Files
BFM-decomp/tools
Drew T 161d36cf36 phase-36: argcheck (the missing-argument census), a10's verdict downgraded on Drew's challenge, and R14's documented premise corrected on bytes
- tools/argcheck.py: every call site whose in-scope declaration is narrower than the callee's real definition. 15,626
  definitions read; 110,478 narrower declarations over 1,912 callees (86,701 K&R-empty, 23,777 positively narrow);
  471 of them sit in a body that still holds a NEEDED $4-$7 pin — 323 bodies, the targeted draw, written to
  .run/P36/engine/argcheck_draw.tsv.
  Checked against the six agent cracks it was built from: it finds a7, a12 and a25, and it CANNOT find a13, whose
  function is declared (void) in 131 of 138 sites AND defined (void) — a declaration comparison is blind to a definition
  that is uniformly wrong. The census is a lower bound and the residual stays the oracle; the docstring says so.
  Corrected before use: the scope column says which FIX is available, not whether the body can be banked — the cast route
  is body-only at either scope (a7 closed a file-scope case that way).

- Drew challenged a10's 'needed by construction' verdict: nobody wrote the pin, so a plain-C spelling must exist. He is
  right and the verdict is downgraded to its real scope — no spelling reaches the bytes in that TU's CURRENT declaration
  environment. That environment is demonstrably wrong there: the file declares extern s32 func_801789AC(s32 arg0) while
  the body calls it through a cast that drops the argument, the same class six agents cracked today. Restoring it was
  tested at once and scores 3, not 0, so it is not the whole answer — but a verdict taken inside a distorted environment
  is not a property of the function. func_80178970 moves to the structs/types phase list rather than being marked
  permanent, with its reading attached.

- R14's documented premise corrected on bytes (agent a15): MIPS defines only PROMOTE_PROTOTYPES, not PROMOTE_MODE
  (config/mips/mips.h:1153), so a narrowed parameter stays HImode and the extension still happens at the use. R14's
  banked closes stand on their bytes, not on that rationale.
2026-09-10 10:53:20 -06:00
..
tools+docs(phase-33.5): task 13.5 — the tools audit + the two dictionaries: tools/tool_census.py (two agreeing enumerations of 327 tool files; docstring/SETUP row/consumers/class derived from the tree; the authored half in config/tool_dictionary.tsv — phase · portability · the NEED each tool answers · what · adapts · verdict — with coverage asserted both ways) → docs/tool-index.md (need-keyed, KEEP-GEN, Reference-index row, wiki + how-to pointers), the kit's tools/MANIFEST.md regenerated (header states live 293 + superseded 28 = 321 rows), and the two verbatim corpora in-tree (Drew, confirmed S91): decomp-architect/corpus/tools/<phase>/ (302 copies + 28 superseded pointers + INDEX) and corpus/cookbook/ (the cookbook, its symptom index, the codegen map, a front page stating what transfers per compiler) — sha1-equal to their sources by tool_census --check in tools-health, regenerated by make kit-corpus; kit_lint exempts the corpus dirs (verbatim evidence) but syntax-checks them; G66 (consult the tool dictionary first) + G67 (translate an inherited idiom through its pass) + two memory seeds (34 at install); SETUP Step 6 installs docs/knowledge-corpus.md and checks the manifest against its own stated total; the ops-setup dictionary rows; the intake's Phase 7 cites G66/G67 and Phase 10 + Part C name the raw-cast → declared-symbol step; templates/layout-contract.md (the five-tool probe, a draft for the split). The review under Drew's criterion: 93 no-consumer tools (one Opus agent's draft, verified: 0 defects, every successor live, 0 live consumers, 0 collisions; four one-off verdicts overturned to STILL-NEEDED) → 34 retired by git mv to tools/sunset/ (28 superseded, 6 one-offs; README review table; SETUP rows moved; Archive-index group). Run 4 (fresh throwaway, the final kit): stopped on my Step-6 check (321 vs the live 293) → both sides derived → resumed → PASS 10/10, manifest 56 == 56, 4 commits, guardrails held (the one foreign path was the timeline regenerated by the detached tools-health). tools-health OK; doc_links --strict rc 0; audit_public OK over 6,842 paths; the purge probe PASSED (Phase 34's gate open). decision-log "P33.5 S91" + accelerators "P33.5 S91" banked; log + checkpoint (NEXT = task 14, xHigh, fresh session)
2026-09-07 22:09:15 -06:00
…

tools/

Everything under tools/ that this project wrote — the extractor, the byte gate, the matching harness, the campaign machinery, the audits, the Ghidra scripts, the public-flip rewrite package — is licensed under the GNU Affero General Public License v3.0 (the repository's LICENSE). There are no per-file license headers; this statement covers them.

Third-party pieces under tools/ keep their own licenses and are listed in the top-level THIRD_PARTY.md: tools/brave-CUE/ (GPL-3.0, vendored source), the pinned submodules tools/maspsx (MIT), tools/decomp-permuter (MIT), tools/asm-differ (Unlicense) and tools/m2c (GPL-3.0), and the gcc-2.7.2 compiler tarballs under tools/bin/ (GCC, GPL). The Sony SDK directory tools/psyq/ is never part of the repository — it is user-supplied and gitignored.

Where each tool fits and how to run it: docs/SETUP.md ("Tooling inventory"), docs/wave-playbook.md (the matching procedure) and docs/public-flip-runbook.md (the publication procedure).