Commit Graph

868 Commits

Author SHA1 Message Date
Drew T 3c14ee490a src(phase-35): T5 bucket new batch 3 — registered 120 groups, 358 sites in 59 TUs replaced by the include, gated 12/12 binaries green per binary, rejected classes 0 ledgered (share_body_cycle) 2026-09-08 19:55:15 -06:00
Drew T e4b25e5f70 tools(phase-35): T5 — share_body_cycle.sh, the unattended batch cycle for bucket new (batch → exit code + gated N/N → phase-log entry → commit → clean fleet run every N batches, stops on the first red); share_body --label; dictionary row + SETUP; kit corpus 2026-09-08 19:53:09 -06:00
Drew T a9353b4122 src(phase-35): T5 bucket new batch 2 — registered 120 groups, 360 sites in 69 TUs replaced by the include, gated 9/9 binaries green per binary, rejected classes 0 ledgered 2026-09-08 19:48:06 -06:00
Drew T 9aaa08391e src(phase-35): T5 bucket new batch 1 — 120 same-address classes given one source (120 headers under src/shared/ov/, 1,482 private copies in 535 TUs replaced by the include, 120 registry groups appended), 165/165 binaries green per binary; 1 class rejected (a body relying on a file-scope extern outside its definition), ledgered 2026-09-08 19:46:25 -06:00
Drew T a60340c6d4 src(phase-35): T5 — E_func_80168B70 re-exemplared from the majority text (share_body.py --reexemplar: header ← ov_SC01_000's copy, 7/7 includers green first, then 134 private copies → the include in 129 TUs, 141/141 binaries green, 0 rejected; the minority-header ledger row dropped); bucket 0 closed: 183 classes → 135 fully shared, 48 ledgered TU-CONFLICT (late-overlay declaration conflicts, for the types phase); SETUP paragraph (--batches, snapshot restore, the cause rule, --repair-registry, --reexemplar); kit corpus 2026-09-08 19:41:40 -06:00
Drew T 5325fd506b src(phase-35): T5 bucket 0 run 3 — 78 private copies in 24 TUs replaced by the shared include, 87 members extended (141/141 binaries green per binary); share_body: a twin's instance queued the same (tu, line) edit twice and the second replacement swallowed the next function (7 classes rejected in the five twin primaries on that artifact; now deduped), chained file:line: warning lines never a cause; the ledger re-judged by the fixed tool: 49 rows with real diagnostics (conflicting types / too few arguments in the late overlays), E_func_80168B70 kept with its cause pending the exemplar decision; kit corpus 2026-09-08 19:31:19 -06:00
Drew T 090f8fb428 config(phase-35): T5 — the registry repaired: 378 listed-but-private members removed from 79 groups (share_body.py --repair-registry, derived from the census on (binary, vram); the 317 ledgered rejected pairs + 61 sites the S94 bisects wiped); dedup-check 2221/0, C1 256,120/256,120; census A 1,812 · B 183, same-vram backlog 1,099 -> 999 classes; the first cut's name-only match (9,269 removed, 14 groups emptied) caught by dedup-check + a known-true control and reverted before commit 2026-09-08 19:20:48 -06:00
Drew T f4163518a2 tools(phase-35): T5 — share_body.py: the failure cause is the first non-warning file:line diagnostic (gcc 2.7.2 errors carry no 'error' token — 254 of 303 rejections had read 'Error 33'), reason codes SYMBOL-NAME / GATE-REJECT / PARSE-ERROR / TU-CONFLICT derived from it and recorded with the cause in every ledger note, the bisect restores from an in-memory pre-edit snapshot (never git checkout — it wiped the previous batch's uncommitted shares), one batch per invocation by default; controls on the real red cc1.err + six synthetic logs; ledger header + kit corpus 2026-09-08 19:14:45 -06:00
Drew T aacbd71eb9 src(phase-35): T5 bucket 0 (second run, finished after S94 died — banked by S96) — 170 private copies in 8 overlays replaced by the shared include (ov_SC07_006 49, ov_SC07_007 29, ov_SC07_011 29, ov_SC07_010 28, ov_SC01_077 19, ov_SC02_037 6, ov_MAIN_012 5, ov_SC03_107 5); 141/141 binaries green per binary (make check + object A/B); 55 classes rejected in 325 (class, binary) pairs, ledgered TU-CONFLICT in config/dedup_exceptions.tsv; run_extend2.log + the batch records; phase log + checkpoint headline 2026-09-08 19:11:16 -06:00
Drew T 571374b979 src(phase-35): T5 bucket 0 (first pass) — 788 members extended into their registry groups, private copies replaced by the include where the per-binary gate held (141/141 and 146/146 binaries green after bisect); share_body: the bisect now re-applies the kept classes in one bottom-up pass per TU (its per-class sequential re-application had shifted later classes' lines and rejected 125 of 183 classes on its own artifacts), the failure detail from error lines only, rejected extend classes ledgered, groups extended only with members that passed 2026-09-08 18:30:29 -06:00
Drew T 0bccef9016 tools(phase-35): T5 — share_body.py, the permanent share tool for the include-at-site form (exemplar by majority text, header written once, private copies → include at their position, per-binary gate with object comparison and bisect, registry appended by text, exception ledger); the R37 probe: func_801681FC shared by ov_SC04_008 + ov_SC05_009 (2/2 binaries green, group S_func_801681FC); the census exports per-instance line ranges; bind_alias_header factored out of macro_to_header; SETUP + dictionary rows; kit corpus 2026-09-08 18:12:41 -06:00
Drew T a8457663fc src(phase-35): T4 finalize — engine_core.h, ov_setters.h and clearTbl40.h deleted; the legacy sites converted (clearTbl40 as the SHARED_FN parameterized control in src/800_c.c; the three SC01_005 accessors as headers), the whale header moved under ov/ with every -O0 includer rewritten, 7 alias-form bodies given their own __asm__ binding, the registry's source/func lines text-edited by id, three non-shared headers rewritten; --verify OK (0 macro sites, no macro header); R22 clean fleet check-all: 218 passed, 0 failed of 218 in 145 s; dedup-check 2220/0; audit-binaries OK; the census 362,389/362,389 with 0 macro sites; SETUP + dictionary rows; kit corpus 2026-09-08 18:06:04 -06:00
Drew T 6ebb3dac33 build(phase-35): T3 — ov_SC03_015 TWIN_OF ov_SC03_014 with the primary's carve: yaml, JTBL_INTERLEAVE and the per-object JTBL_PADS lines regenerated from ov_SC03_014 by alias substitution (the twin's retired jump-table splits with them), create_c_files: False, src/ov_SC03_015/ deleted; twin + primary BYTE-IDENTICAL; interleave_check ALIGNED + pads_audit on the twin (R60; pads_audit now reads a twin's source through the oracle); dedup-check 0 failed; audit-binaries OK 2026-09-08 17:24:42 -06:00
Drew T 2648aa5a92 build(phase-35): T3 — ov_SC04_019 TWIN_OF ov_SC04_018 with the primary's carve: yaml, JTBL_INTERLEAVE and the per-object JTBL_PADS lines regenerated from ov_SC04_018 by alias substitution (the twin's retired jump-table splits with them), create_c_files: False, src/ov_SC04_019/ deleted; twin + primary BYTE-IDENTICAL; interleave_check ALIGNED + pads_audit on the twin (R60; pads_audit now reads a twin's source through the oracle); dedup-check 0 failed; audit-binaries OK 2026-09-08 17:21:44 -06:00
Drew T e79cfcc06d build(phase-35): T3 — ov_SC03_119 TWIN_OF ov_SC03_118 and ov_SC02_003 TWIN_OF ov_SC02_000 (equal carves): the twins' source dirs deleted, create_c_files: False, both twins and both primaries BYTE-IDENTICAL, audit-binaries OK, dedup-check per twin 0 failed 2026-09-08 17:15:01 -06:00
Drew T 9b0816e74a build(phase-35): T3 probe — ov_SC01_006 is a TWIN of ov_SC01_005: one source directory per payload. Makefile twin rules (build/src/<twin>/<twin>%.o <- src/<primary>/<primary>%.c, same recipe, -O0 objects kept), overlays.mk TWIN_OF + SRC_DIR, the twin's yaml create_c_files: False, src/ov_SC01_006/ (30 files) deleted; twin + primary BYTE-IDENTICAL (56760dbe), the concurrent race test green, every consumer sees the twin through the oracle; share_census: copies = distinct sites, TWIN-COVERED reported (575 classes for the pair) 2026-09-08 17:10:00 -06:00
Drew T 72a77e7d3c tools(phase-35): T1 fix — the census's dictionary row is kit-ladder P10, not the project phase; kit corpus regenerated; tool_census --check OK. The previous commit claimed the corpus regenerated while kit-corpus had exited 2 and the census had refused the row — its chain read an echo's status, not the check's (R97); this one chains on the checks' own exit codes 2026-09-08 16:26:00 -06:00
Drew T 1dbffee87d tools(phase-35): T1 — share_census.py, the fleet census of byte-identical function classes + the S1 'one source per unique function' checker with its exception ledger; 362,389/362,389 sig instances covered, 10,180 classes (A 1,712 · B 282 · C 6,107 · D 1,861 · M 218), self-test 7/7, four controls as measured; SETUP + dictionary rows, kit corpus regenerated 2026-09-08 16:24:08 -06:00
Drew T f811833394 chore(phase-35): OPEN — Gen3's dedup phase at gate 1 (R96–R99 ratified; the plan verbatim in CURRENT_PHASE.md); the R22 baseline 218/218 from clean in 157 s; tools-health OK after the kit corpus regen + the R96–R99 coverage rows; the ov_SC06_033 include-form probe: 34/34 objects byte-identical, build 1.12 s → 0.52 s, the 137 macro-redefinition warnings gone 2026-09-08 16:03:00 -06:00
Drew T 9f2aa46b52 kit(phase-34): coverage map — KIT: paths are relative to decomp-architect/ (three rows fixed); kit_coverage is green HERE (0 uncovered rules, 0 uncovered accelerators) — the previous commit's message claimed green while three rows were refused (a masked exit code) 2026-09-08 14:09:10 -06:00
Drew T 81ec819451 kit(phase-34): DK-81 (the flip day's lessons) + coverage-map dispositions for R84–R95 — kit_coverage green; the kernel range now DK-1…DK-81 2026-09-08 14:08:20 -06:00
Drew T c9a3d7b891 tools+docs(phase-34): task 2 part 1 — the decomp.me paste form: verbatim_target_s.py --gas (assemblable target), decompme_replica.sh steps D (the paste through decomp.me's as, 26/26) + E (the bundle), doc §5 step 2, SETUP rows, dictionary, kit corpus regenerated 2026-09-08 11:54:22 -06:00
Drew T 0c29c9e16b tools+kit(phase-33.5): task 14.5 part 1 — the record as the third dictionary + kit_coverage (every rule and every accelerator entry cited or dispositioned)
- decomp-architect/corpus/record/: the how-to (13), decision-log, accelerators, retrospective, story, wave-playbook, effort-map,
  gen3-standards, gen3-handoff, DIGEST and every PhaseEnd (34) verbatim behind an authored front page (what each is, how to
  read it, what is NOT there — the phase logs, R19 — and that the mining pass is their distillation); tool_census: RECORD_SOURCES
  + record_dest + the third corpus in plan/write/check (358 copies + 28 pointers, --check OK); kit_lint exempts corpus/record;
  SETUP Step 6 gains 2c docs/inherited-record.md (+ the verify line; expected-manifest +1); ops-setup/README/tree/methodology/
  wiki page/Home/Tools page/README bullet/SETUP row: "two dictionaries" → three
- tools/kit_coverage.py (+ config/kit_coverage_map.tsv): derives R1..R83 from DIGEST §3 (asserted contiguous) and the 58
  accelerator entries (headings + numbered items), asserts each is cited by a provenance line of the registry seed / the
  kernels or dispositioned (G / DK / FOLDED:G / ENV / PA / SEED: / KIT: / RECORD / COOKBOOK / NOT-PORTABLE; unknown ids
  refused); first run: 26 uncited rules + 21 uncited entries → DK-66 (a ledger's tie-break, a checker's widening and a blanket
  commit are part of the instrument — R70/R80/R52), DK-67 (the ignore file's directory-form wall — S91 (1)), DK-68 (a
  summarised signal is a claim, not ground truth — R14/R66) in a new kernels section 8 (the museum is 9; "In all" 68) + 41
  dispositions (15 PA, 3 ENV, folds into G6/G18/G38/G66/DK-12/19/20/22/25/26/31/35/44/45/46/57/61, 1 KIT template, 1 COOKBOOK);
  now 0 UNCOVERED on both populations; wired into tools-health after tool_census --check; SETUP row + dictionary row
- verify: tool_census --check OK; kit_coverage OK (rules 57 cited + 26 dispositioned / 83; accelerators 41 + 15 / 58);
  kit_lint OK; doc_links --strict OK; wiki_render --selftest 32 pages / 0 unlisted
2026-09-07 23:03:34 -06:00
Drew T 9937fd7e39 docs+kit(phase-33.5): task 14 — the S91-b types hindsight implemented in the kit + the wiki page Start-a-new-decomp-project.md + the rows
- kit: DK-65 "types are a banking lever and a width lever, not a byte lever" (kernel, when, cost, calibration fence, provenance;
  the kernels file now states its own total "In all: DK-1 … DK-65" and SETUP Step 6 compares grep -c against it instead of a typed
  64); intake row 6's milestone gains the canonical type layer (one definition per shape, widths proven by the bytes at bank time,
  a bank refused for a duplicate definition or a raw address cast) + the type tools moved forward + G62/DK-65 in its columns; row 10
  reads "short if Part C and Phase 6's type layer held"; G62 extended with the bank-time clause (G1–G67 kept); tool_dictionary:
  lift_types + canon_sig_reconcile P10 → P6 and the five type tools' need-keys name the type layer at Phase 6 (the phase column is
  one token — the corpus dir derives from it); the cookbook front page's type-verdict sentence (a NAME never moves a byte, a WIDTH
  or SIGNEDNESS is the one place a type does, the permuter cannot reach it); the methodology's "Types — the two-sided verdict"
  paragraph; the kit README's table + tree now name the two dictionaries and layout-contract.md; make kit-corpus regenerated the
  tool index, the MANIFEST and the corpora (302 copies + 28 pointers)
- wiki: docs/wiki/Start-a-new-decomp-project.md — the three steps, what it installs / does not (the two dictionaries), the ladder
  (11 rows), the five AI-use rules, the six inversions (raw casts → declared symbols; DK-65), the compiler question, the accelerators
  one line each (58 rows), the four dry-runs, how it is kept honest; sidebar + Home rows; Tools-from-this-project rows for the kit
  and the tool index; README bullets for both; SETUP row for decomp-architect/ (R21); Where-the-project-goes-next links the page and
  records the probe PASS (2026-09-07); phase34-seed: task 0 PASSED, the kit carried whole through the flip and split later
- verify: wiki_render --selftest 12/12 + reachability 32 pages / 0 unlisted; doc_links --strict 58 documents / 451 links / 0 pending /
  0 broken / coverage 65 of 65 (one BROKEN on the first draft — a foreign project's docs/ path cited in backticks — reworded);
  kit_lint OK (leak 0 / placeholders 22 == 22 / syntax 0 / gitignore 75 identical); tool_census --check OK; 65 DK ids cited, 0
  dangling; audit_public OK on the touched files; no build input changed
- log + checkpoint (NEXT = task 15, Max, Tier 1 — prompt Drew and wait for gate 2)
2026-09-07 22:40:17 -06:00
Drew T 827295e241 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
Drew T 936d7d741c feat(phase-33): B5 Ghidra regenerability PROVEN — the RE work as text (config/ghidra/*.jsonl + ROSTER.md), six programs rebuilt from disc + symbol files + that file with PROOF PASS
- ImportAnnotations.java: the S86 OSGi-bundle blocker was 3 javac errors (Long->int unboxing x2, a nonexistent
  LocalVariableImpl ctor -> VariableStorage); "/undefined" resolves to DataType.DEFAULT (it lives in neither type
  manager — main's first proof passed the cmp with failed=13 because the plate-comment rows had set the same function
  comments); ghidra_rebuild.sh now dies unless the import printed failed=0 (R49), writes .proof markers
- ghidra_annotations_delta.py: analysis drift measured and encoded as three counted classes — Error/Analysis bookmarks;
  auto-named DEFAULT functions the rebuild did not create (29 in main's LINKED regions); auto-named rows lagging the curated
  symbol file (10 sep8 + 5 aug31, R15). Result: main 38 hand-authored rows (13 annotated fns incl. 3 the ELF does not
  define, 22 comments, 3 labels); resident/overlays/protos container rows only; the DB holds no hand-authored types
- controls (R39): mutated block row -> PROOF FAIL; synthetic comment/bookmark/label/signature round-trip -> PROOF PASS
  twice (idempotent); the filter keeps the synthetic rows and a hand-renamed name-only diff; fake failed=2 refused,
  resident re-proven; roster --check controls both ways
- proofs, all PASS failed=0: resident 65s, ov_SC01_077 169s, ov_SC06_018 173s, SLUS_007.26 210s, sep8 202s, aug31 206s
- tools/ghidra_roster.py -> config/ghidra/ROSTER.md (--check in tools-health, ignores the per-machine proof column)
- .claude/settings.json hooks $CLAUDE_PROJECT_DIR-relative; ghidra_mcp_start.sh is a silent exit 0 without Ghidra or
  the project (both controlled); SETUP P33 B5 section + 5 inventory rows + §2.8 (R21); CURRENT_PHASE log + checkpoint
2026-09-06 20:32:35 -06:00
Drew T 6e37e8ec62 docs(phase-32): T4c harvest + checkpoint — the frontier is EMPTY (census 0 stubs / 0 ins); cookbook §501-Q (the combine self-update ghost slot) + §501-R (a hoisted invariant read three times: inline temps merged by combine_movables, u16 as a cse firewall, the allocation order IS the callee-saved bank; every pin came off), accelerators (15)(16), decision-log P32 S85 T4c, tools/cc1_dumps_tu.sh + tools/alloc_table.py promoted (+ SETUP rows, cc1_dumps.sh -dL), wave_exclude 0 entries, backlog 1 legacy row, .run/P32/t4e (56 variants, 18+8 reproducers, NOTES, banks, slates); 🛑 checkpoint refreshed as the T5 seed (the fleet R22 + report chain runs in the background — its logs are recorded by the next session) 2026-09-06 16:13:19 -06:00
Drew T b6fd3fff28 docs(phase-32): T4b hand pass — func_80032A74 PROVED at 1 by producer census (§501-M); ghost_census.py + cc1_dumps.sh repair; backlog tie-break repair
- main:func_80032A74 (422 ins, closeness 1): the residual is ONE reload-time slot at sp+0x48 (u16 draft = 422/422 code, DIFF 22 frame
  rows; s16 draft = DIFF 1 at idx 244 lh vs lhu). Every post-parameter slot producer enumerated from gcc-2.7.2 (reload1.c:658 ghost
  alter_reg / caller-save.c:249 area / reload1.c:879 invalid-equiv / reload1.c:3499 spill_stack_slot) and refuted on the bytes: combine's
  newi2pat ghosts re-derive a narrow load and the site is lhu (no lb, no double load); a save area without sw/lw needs sched.c:4962
  staleness and no register-only insn shares a block with a call; $t0 holds no pseudo; LO mult results retry into GR_REGS. Verdict
  PROVED at 1 (pin kept with the verdict; ledger WALL-PROVED).
- NEW mechanism measured: local-alloc.c optimize_reg_copy_2 (tmp = x; tmp op= c; x = tmp) mints a ghost with stale refs, but after
  regclass -> GR_REGS, allocated, no slot (P13/P14). 18 isolated reproducers, 0 draft variants; cookbook §501-M; accelerators (12).
- tools/ghost_census.py (new): ghosts in a .lreg dump with their class (ST_REGS => slot). tools/cc1_dumps.sh: prints the .frame line,
  ins count, spill lines and the census; the under-counting standalone-(use) grep is gone. SETUP rows (R21).
- tools/backlog.py: load_best kept the EARLIEST record at equal closeness (docstring said latest) — the S84 row never rendered; fixed.
- CURRENT_PHASE.md: S84 log + refreshed 🛑 checkpoint (rows (b)(c)(d) next, then T5). No src/config/carve change; fleet check-all
  218/218 rc 0 at the S84 preflight.
2026-09-06 11:44:40 -06:00
Drew T 444e8ab4b5 docs(phase-32): T4b (10) ledger — func_80011380 unpinned (1 wall remains: func_80032A74), backlog re-rendered, the Fable draft + report + verdict kept 2026-09-05 23:22:09 -06:00
Drew T 3c6d20991f docs(phase-32): T4b — func_80032A74 stays NEAR 1 (Fable, 402k tokens): the 0x48 slot is a GHOST pseudo (combine.c:2306-2313), the caller-save-area hypothesis REFUTED with citations, the only memory-value ghost species is the lh SIGN_EXTEND split; pin annotated, backlog row, draft + report kept 2026-09-05 18:35:27 -06:00
Drew T 1081b02b66 docs(phase-32): T4b (6) ledger — func_801834A4 unpinned (2 walls remain), backlog re-rendered, the Fable draft + report + verdict kept; queue updated 2026-09-05 18:25:29 -06:00
Drew T 9564314095 docs(phase-32): T4b (5) ledger — func_80020DA4 unpinned (3 walls remain), backlog 11 open, the Fable draft + report + verdict kept; resume queue (3-at-a-time) tracked 2026-09-05 18:16:50 -06:00
Drew T 32ff170bf3 docs(phase-32): T4b (4) ledger — func_8017DF28 unpinned (4 walls remain), backlog re-rendered, the Fable draft + report + verdict kept; bank.sh takes SPLIT for _jr_ TUs and prints rtu's tail when no verdict line appears 2026-09-05 13:28:35 -06:00
Drew T d913bca9b7 docs(phase-32): T4b (2) ledger — func_80039DEC unpinned (5 walls remain), backlog re-rendered, the Fable draft + report + verdict kept (R20) 2026-09-05 13:20:36 -06:00
Drew T 177f4a7dfd docs(phase-32): T4b (1) ledger — func_800391D4 unpinned (config/wave_exclude.txt 6 kept / 1 dropped by exclude_audit), backlog re-rendered (15 open), the Fable draft + report + verdict kept (R20) 2026-09-05 13:15:53 -06:00
Drew T 90acd6902f docs(phase-32): T4 DONE — the walls' FINAL ledger: 7 pinned rows re-probed in TU context (3 CC1 FAILs were plumbing, re-probed in a sandbox TU), 1 PROVED + 6 CANDIDATE, no verdict changed; pins annotated, backlog rows for all 7 (R62 paths fixed), cookbook §500-I, decision-log
- every wall's best draft re-run with rtu_match in its CURRENT real TU: func_80011380 DIFF 6 (--o0, §474 PROVED),
  func_80020DA4 DIFF 2, func_8017DF28 DIFF 2, func_801834A4 DIFF 6 ×3 variants; leaf match_one re-measured the CC1 rows
  (func_80032A74 1, func_80039DEC 2 permuter / 9 sonnet, func_800391D4 3)
- the three CC1-FAIL rows: func_80032A74 = 7 typedefs the TU provides via 800_shared.h + 4 decl spellings → synced copy
  (.run/P32/t4/drafts/func_80032A74_tuclean.c) DIFF 1 in the real TU (idx 244 lh vs lhu); func_80039DEC = the TU's narrow
  prototype (800_c.c:3496) vs the K&R def → sandbox TU (.run/P32/t4/tu/, no-proto decl) DIFF 2; func_800391D4 = the
  load-bearing `D_80073140[][1]` vs the TU's `[]` → sandbox TU DIFF 3 (TU-compatible spellings regress to 65 @ 76)
- config/wave_exclude.txt: each of the 7 lines carries its S83 re-probe verdict; exclude_audit --assert-fresh 7/7
- backlog: rows for all 7 walls (the path-less func_80011380/func_801834A4 given existing drafts, R62; two rows re-logged
  after a shell-quoting mangle); docs/backlog.md 16 open
- CURRENT_PHASE.md: T4 row DONE, the wall ledger table (row · ins · class · leaf/real-TU closeness · mechanism+citation ·
  attempt record · verdict · best draft; func_800CF3E8 listed as an unpinned candidate), the T4 log entry, 🛑 block → T5
  (R27 Max prompt + the gate-2 procedure)
- cookbook §500-I (the sandbox-TU re-probe method + the verdict table); accelerators (8); decision-log P32 S83 (R31)
2026-09-05 12:11:10 -06:00
Drew T 5ff842dfd3 feat(phase-32): T3 (3) — resident: func_800D06E8 (344 ins) BANKED byte-identical 8e17e02f — THE RESIDENT IS 100% C (145/145)
- the Opus drafter recovered the closeness-0 body the journals (attempts 1-3) pointed at (.run/S71b_1/fable/) — the
  pack's inline 292-draft was the wrong one — and found the real blocker: the TU defines Struct80078E78 AFTER the
  slot with a layout lacking bytes 0x36/0x37; only a BLOCK-scoped typedef under a distinct tag (Blk80078E78) + a
  block-scoped extern compiles (decl-hoisting resolver variants recreate the S7x 'conflicting types'). Idioms:
  §162k1 QImode (u8)(c-3)<2; explicit flag temp t=(u32)(r-0x64)<0x1E, s1=t^1; switch decision trees for both
  currentLocationId dispatches. reloc_identity AGREE 50/50; rtu_match MATCH 344/344 (verified by the coordinator)
- jtbl_carve --func: jtbl_80113FA4 (5 words, the old tail2) joins the resident_jr_800D00E4 .rodata piece
  (0x450e0..0x451c0, JTBL_PADS 0,0,0,0, tables +0x0/+0x3c/+0xb4/+0xcc); carve set 5 -> 4 pieces, --pre kept
- make extract + make build BINARY=resident -j8 rc 0; sha 8e17e02ff8954d07c979449198f7e1645046b353 == check;
  pads_audit ok/ok; interleave_check ALIGNED n=4
2026-09-05 01:03:07 -06:00
Drew T 1e843c607a feat(phase-32): T2b (4) — SC03/56 ONBOARDED as md_SC03_056 @0x801CBB50 (ov_SC03_002's DESTPTR), byte-identical bc768a6b; ALL FIVE parked payloads are now binaries (fleet 213 -> 218); evidence tool v2
- md_SC03_056 (TEXT_LO 0x4, 4 stubs / 61 ins): 15/17 pointers cluster inside at 0x801CBB50; one outward call
  (0x8018151C) hits a function only 3 overlays have, ov_SC03_002 among them; req_fit 9/9 for ov_SC03_002
- payload_base_evidence.py v2 (controls 7/7 throughout): (a) STRONG = internal jals + fn-ptr-table entries on the
  module's own starts >= 2 (SC03/53 STRONG); (b) OUTWARD-EXPLAINED — a pure jal-vote base whose "internal" targets
  are function starts of the fleet's overlays is downgraded: SC03/56's 0x80178C8C was two SHARED-engine functions
  spaced like two of its five starts (and nobody's DESTPTR), a false STRONG; (c) the requester cross-check is
  informational only — shared engine code makes every requester fit (an R39 control caught it scoring: 6/7)
- memory-map §S45 p7 amended: all five rows ONBOARDED + the two instrument findings (the first build is a NULL
  oracle for FINE base errors — +8 builds byte-identical, +0x1000 fails the link; outward-explained vote bases);
  SETUP row amended. The parked-for-L3 ledger is EMPTY pending `make audit-disc` (T2c).
2026-09-04 23:52:58 -06:00
Drew T b52d67be0b feat(phase-32): T2b (3) — SC03/53 + SC03/54 ONBOARDED as md_SC03_053 / md_SC03_054 @0x801EF468 (the script slot), byte-identical c0848f30 / 06bd73df
- md_SC03_053 (TEXT_LO 0x4, 15 stubs / 372 ins) and md_SC03_054 (TEXT_LO 0xF0 — a 19-entry fn-ptr header, 7 stubs
  / 764 ins) share ov_SC03_001's DESTPTR slot 0x801EF468, the slot the S45 tracer watched other SC03 scripts load into
- BASE EVIDENCE (memory-map §S45 p7, static-derived STRONG at 0x801EF468 and nowhere else): SC03/53 — 52/75 absolute
  pointers inside, 3 of them + its one internal jal exactly on its own function starts (0 at every rival); SC03/54 —
  106/115 pointers inside, 5 header-table entries exactly on starts (0 at every rival); lui 0x801F ×18 / ×46
- first builds byte-identical (base-lenient, R34 — the base rests on the alignment; the first internal-call C bank
  byte-proves it); the §S45 p6 "onboard at 0x801EF468, let the first build decide" step, finally run
2026-09-04 23:51:45 -06:00
Drew T 10aaf5c296 feat(phase-32): T2b (2) — MAIN/9 ONBOARDED as md_MAIN_009 @0x800CD348 (TEXT_LO 0x3C), byte-identical d270f695; the OPDEMO1 module leaves the parked ledger
- tools/new_binary.sh md_MAIN_009 extracted/retail/MAIN.CD.dir/FILE_009.dir/0.1 0x800CD348 0x3C -> first build
  BYTE-IDENTICAL sha d270f695b793b5c03db159b7aabcc066daa87eda; 11 stubs (609 ins); window 0x800CD348..0x800CDD38
  lies below the resident's symbol region, so the default symbol stack stands (no A4 edit)
- BASE EVIDENCE (memory-map §S45 p7, static-derived STRONG): 6/6 internal jals and 9/9 absolute pointers land
  on the module's own function starts at exactly ONE base, 0x800CD348 — inside slot B's region (+0x82C from
  0x800CCB1C), not a previously known slot; lui 0x800C/0x800D ×51. Same caveat as md_MAIN_007: the first build
  is base-lenient (R34), the base rests on the alignment and will be byte-proven by the first internal-call C bank.
2026-09-04 23:51:08 -06:00
Drew T 1a696a851a feat(phase-32): T2b (1) — MAIN/7 ONBOARDED as md_MAIN_007 @0x800CEDF8 (TEXT_LO 0x34), byte-identical 2ff702b6; the OPDEMO0 module leaves the parked ledger
- tools/new_binary.sh md_MAIN_007 extracted/retail/MAIN.CD.dir/FILE_007 0x800CEDF8 0x34 -> first build
  BYTE-IDENTICAL sha 2ff702b605ab5cfc18474c464c4c07e5f8ffd48c; A4 applied (symbols.resident.txt not stacked —
  the window lies inside the resident's symbol region), re-extract + rebuild byte-identical; 19 stubs (802 ins)
- BASE EVIDENCE (memory-map §S45 p7, static-derived): STRONG — 9/9 internal jals and 14/16 absolute pointers
  land on the module's own function starts at 0x800CEDF8 (the boot slot of md_MAIN_001/008/011); lui 0x800C/0x800D
- HONEST CAVEAT (R34, measured 2026-09-05): the all-INCLUDE_ASM first build is a NULL oracle for FINE base
  errors — the same payload builds byte-identical at 0x800CEE00 (+8) — and catches only GROSS ones (at +0x1000
  two internal jal targets leave the window: `undefined reference to func_800CEEA4/func_800CF3F4`, link fails).
  The base therefore rests on the static alignment, and will be byte-proven by the first C bank that calls an
  internal sibling. Controls: .run/P32/t2b/{control_full,control_fine}.log
- registered in modules.mk + the report/diff dicts (R36 citizenship asserted by tools-health at T2c)
2026-09-04 23:49:05 -06:00
Drew T 059266afca feat(phase-32): T1c — md_MAIN_034: func_800CB00C (123 ins) BANKED byte-identical 46153c06 from the stored S72 body; its S68 "compiler wall" pin dropped
- the census's best_draft (.run/wave_g0c/shard30, 174 ins, 7 pins) was a DIFFERENT, wrong body under the bare
  name (R48); the journal (R38) named the real one — .run/O21/opus/func_800CB00C.c (88 lines, 7 BLOCK-scope
  callee externs: gcc-2.7.2 demotes the later-definition type conflict to a warning at block scope). rtu_match
  MATCH 123/123 in the real TU (the S75 redraft too); the S72 resolver had gated only the wrong file, 3x.
- raw splice into src/md_MAIN_034/md_MAIN_034.c; module island pads derived at build (§303); make build
  BINARY=md_MAIN_034 -j8 rc 0, sha 46153c06bca859dec05aff59fb1a77d3add3d02b == check (R53); verbatim strict ok
- config/wave_exclude.txt regenerated (exclude_audit --write): the md_MAIN_034 WALL pin labelled a wrong draft,
  not a wall — 8 -> 7 entries; docs/backlog.md re-rendered (matched rows drop)
- 0 drafting tokens; no Sonnet agent needed (plan T1c adjusted: no redraft)
2026-09-04 23:38:03 -06:00
Drew T c7f5b498ac feat(phase-32): T1b (3) — ov_SC02_017: func_80186C64 (209 ins) BANKED byte-identical c0253499 — the d=2 RELOC-ONLY twin of ov_SC02_016:func_801810C8 via family_remap + four TU spellings
- family_remap --addr 0x801810C8 --from ov_SC02_016 --to ov_SC02_017 --to-addr 0x80186C64 (23 per-overlay
  symbols remapped); rtu_match then named four §376 TU spellings (func_8012A828 (s32, void *); D_801E0F44 s32
  — address-only use; func_80131E00 (); func_80185F88 (s32) — calls already fn-ptr cast) + one TU-provided
  typedef to strip (Prim_8016E7C8, §491 gap 2) -> MATCH 209/209 in the old TU and in the new region TU
- jtbl_carve --func: jtbl_801EE414 clamped to its `sltiu 6` (6 entries) into
  [.rodata, ov_SC02_017_jr_80186C64] + tail19; JTBL_PADS 0,0; carve set 45 -> 46 pieces
- make extract + make build BINARY=ov_SC02_017 -j8 rc 0, sha c0253499eed71309d731862ffc76766d183d031e ==
  check (R53); pads_audit all ok; interleave_check ALIGNED n=46; verbatim_check --strict no drift
- 0 drafting tokens (the journal's S69/S70 lever drafts carried the same body; R38)
2026-09-04 23:36:52 -06:00
Drew T 599dba3ba0 feat(phase-32): T1b (2) — ov_SC02_017: func_80186C64 isolated into its own code subseg [0x5eb0c, c, ov_SC02_017_jr_80186C64] (byte-identical c0253499)
- jr_isolate_all ov_SC02_017 --only func_80186C64 (CLEAN after the §497 carrier fix — no source rename);
  2 region files; make extract + make build BINARY=ov_SC02_017 -j8 rc 0, sha
  c0253499eed71309d731862ffc76766d183d031e == check (R53). Carve state only; the bank is the next commit.
2026-09-04 23:35:19 -06:00
Drew T c513e1fbbd feat(phase-32): T1a (2) — resident: func_800D128C (243 ins) BANKED byte-identical 8e17e02f via the raw splice + a 5-piece carve; three instrument fixes (§498)
- BANK: the stored S71 closeness-0 draft spliced into src/resident/resident_jr_800D128C.c; jtbl_carve --func
  carved jtbl_80113FB8 (119 entries, 1 pad word trimmed) + jtbl_80114198 into [0x451c0, .rodata,
  resident_jr_800D128C] + [0x453c4, data, tail3]; JTBL_PADS 0,4; make extract + make build BINARY=resident -j8
  rc 0, sha 8e17e02ff8954d07c979449198f7e1645046b353 == check (R53). pads_audit ok/ok; interleave_check
  ALIGNED n=5; verbatim_check --strict 5==5. Resident stubs 2 -> 1 (func_800D06E8 remains).
- WHY THE GATE SAID DIFF (parallel_gate banked 0/DIFF on an rtu_match MATCH): jtbl_carve.set_overlays_var
  regenerated resident_JTBL_INTERLEAVE from the carve set and DROPPED the resident's `--pre hdr.rodata.o`
  (§8f leading-rodata sandwich); make extract refused (ld_interleave: hdr.rodata.o would be parked with
  .text), the build linked the STALE script (249,252 differing bytes from file offset 0x4), and
  harvest_verify._jtbl_prep_one never read the post-carve extract's exit code (R49/R61).
- FIXES (R35/R40/R57): jtbl_carve._merge_pre carries an existing --pre forward (idempotent; overlays
  unchanged, 4-shape unit control); harvest_verify refuses loudly on a failed post-carve extract and
  restores the snapshot (CARVE refusal, NOT a draft verdict); interleave_check's anchor accepts a leading
  --pre (was a false DRIFT n=0 on the resident; control ov_SC02_017 ALIGNED n=44 unchanged).
- cookbook §498 (+ the stale-asm-after-a-failed-extract sequencing law); SETUP rows for all three
2026-09-04 23:28:59 -06:00
Drew T 380ccdc843 feat(phase-32): T1a (1) — resident code subseg split (3 regions, byte-identical 8e17e02f) + jr_isolate_all include-derived provided types (§496)
- jr_isolate_all resident --only func_800D128C: [0x4 c resident] [0x12ec c resident_jr_800D00E4]
  [0x2494 c resident_jr_800D128C]; the banked jr func_800D00E4's .rodata carve + JTBL_PADS + --order
  repointed to resident_jr_800D00E4.o (config/overlays.mk resident block only, R60); make extract +
  make build BINARY=resident -j8 rc 0, sha 8e17e02ff8954d07c979449198f7e1645046b353 == check (R53)
- TOOL FIX (R43/R33): the carried-type test consulted _engine_types() (engine_types.h + common.h) for
  every TU, assuming each region includes engine_core.h; the resident includes only common.h, so its
  file-local `typedef struct {...} CdFileLoc;` (a name engine_types.h also defines) was silently NOT
  carried -> `parse error before cdFileLocTable` in both region TUs, build rc 2 while the stale binary
  on disk read green. Now _provided_types(header) derives the set from the TU's own #include lines
  (engine_core.h => engine_types.h + common.h, never engine_core's macro-internal typedefs; common.h
  => common.h) and _file_scope_decls(items, provided) uses it at both decision points. R39 controls:
  overlay header == legacy set (1,197 names); resident set lacks CdFileLoc. cookbook §496; SETUP row
- rtu_match func_800D128C --split resident_jr_800D128C: MATCH (243 ins) on the stored S71 draft;
  the gate is the next commit
2026-09-04 23:20:04 -06:00
Drew T 452975e852 docs(phase-31): S80 #10 CLOSE — the verbatim end-state: manifest 6 → 5 rows (the five PERMANENT rows RATIFIED in _README; the GAME-C row decompiled), cookbook §495 (two def-side declaration walls, the S79 assembly "bank" P9 correction, the gate that dropped a bank on exit 0), decision-log S80 addendum (R31), SETUP rows; tools/parallel_gate.py: banked-but-not-merged now exits 2 with the worker's raw git status kept + per-run .run/pgate_runs/<ts>.json; CURRENT_PHASE #10 bullet + the S80 #10 CLOSE checkpoint (R22 213/213, tools-health OK, census 21 stubs / 4,554 ins, NEXT #11 = PhaseEnd, gate 2); regenerated digests 2026-09-04 22:07:35 -06:00
Drew T dd45617982 chore(phase-31): S80 #10 — verbatim end-state plumbing, byte-neutral: (1) ov_SC03_107:func_8017D878's file-scope __asm__ block (the manifest's one GAME-C row) converted back to an INCLUDE_ASM stub with tools/verbatim_to_stub.py --gate (87d02b57 byte-identical) and the TU's extern void func_8017D878(void) corrected to the real s32 (s32) signature (only its address is taken; ov_SC03_107 rebuilt byte-identical) — the void decl was the def-side wall that refused 37 drafts; (2) md_MAIN_020:func_800CB17C — S79 #7's "raw splice" had committed the function's ASSEMBLY as a verbatim __asm__ body (every stored 'draft' was the asm; verbatim_check --strict flagged it as a new verbatim) → converted back to a stub (0990e041 byte-identical): that bank was not a decompile (P9), the function is open again; (3) manifest _README: the five PERMANENT-VERBATIM rows RATIFIED 2026-09-04 21:45:31 -06:00
Drew T 09e0b27811 docs(phase-31): S80 #9c — the S79 drafting task's NEAR/WALL ledger: 15 rows logged to the backlog (each with the residual's gcc mechanism), the ≤3 residuals pinned as WALL candidates in config/wave_exclude.txt after an 8-seed permuter_ils sweep on the now-permutable pinned seeds (no score-0; func_80039DEC 9→2 = the K&R raw-preserve register, func_80023BF0 18→11 ADDRESSING, func_8017DF28's "1" was a divergent store rewrite — closeness stays 2, R14); cookbook §494 v2 (ten banks, the Opus verdicts' idioms: P_TAG bitfield store, inverted arms, sibling-reading, the 518-ins spelling laws, gdb-on-cc1 allocno arithmetic, K&R s16 params, true_dependence, field-boundary fences, extendhisi2 orphans, [][1] decls) + the final ledger; .run/S79w allowlisted (27 drafts + 3 permuter waypoints + verdict ledger + briefs, 264 KB — R20) 2026-09-04 21:21:05 -06:00
Drew T 96c0fc02a7 feat(phase-31): S79 #9 (7) — ov_SC05_010: func_8017FFA8 (88 ins, 6-way jtbl switch) banked from a Sonnet agent's fresh draft (loop index s32 not s16 — §241 fused sign-extend; the D_801922B8 lookup into its own temp before the found/zero stores); tail jtbl carve at gate time; worktree gate + in-tree byte-identical 2026-09-04 19:45:16 -06:00