dd807ffb8c
Both batch targets are met in one pass: 22 new bodies (23 including the P7-T5 match), taking the project from 11 distinct bodies to 34 -- past the phase milestone of 30 -- across 39 registered regions. The batch is dominated by the small leaf shapes the worklist ranks first: empty function (4 duplicate addresses), byte/halfword/word setters, field getters, a word-buffer clearer, and eight gp-relative getters/setters. Every one was byte-identical on the first or second attempt, and every extent came from tools/sf3_extents rather than a hand-derived end. Three shapes needed diagnosis, and two were solved: - 0x8003636C was 16 bytes instead of 12 because `return 1` forced a second `li v0,1` into the delay slot; the original leaves 1 in v0 as scratch, so the function is `void`. - 0x800F7FB4 needed the parameter reused as the loop counter. Four candidates are recorded as bounded negatives or deferrals rather than guesses: - 0x800F7FB4: the loop body reproduces exactly, but the original has no frame and every tested formulation allocates 8 bytes (five C forms, and an -O1/-O2/-O3/-fomit-frame-pointer matrix). Stopped after two distinct attempts. - 0x800F8AEC: the original schedules `lui` / `jr ra` / `addiu` with the low half in the delay slot; the reconstruction emits `lui` / `addiu` / `jr ra` / `nop`. - 0x80010810: GTE (COP2) code needing the SDK's GTE macros, which the build has no headers for. - 0x800FB5D4 (`move v0,sp`) and 0x80103FCC/0x80103FEC (BIOS `syscall` wrappers) and 0x8001EAFC (a shared jump block, not a standalone function). make gate: c_regions=39, 0 differing bytes, SHA-1 e173426c. Extents verify agrees on all 39 regions. 168 synthetic tests.