Commit Graph

4025 Commits

Author SHA1 Message Date
Drew T 1e3ce6c1c8 chore(phase-33): A5 prep — tools/verify_contract.sh (the recorded contract run: per-step logs ending EXIT=rc, abort on first red, contract-line asserts, SUMMARY.md), .run/P33/verify/ allowlisted, audit_frontier's denominator lines DERIVED (1,258 stubs = main's LINKED regions, 0 game-code; disc UNCLAIMED from the ledger; the typed '39 modules / missing oracle' caveat was stale since P30/P31) 2026-09-06 20:56:04 -06:00
Drew T b2fb392ada docs(phase-33): B8 — docs/verification.md (the public verify-it-yourself page: redump SHA1s, the R22 recipe with every expected last line, what is not our C, the recorded-run table pending A5, what CI proves) + SETUP as-built pointers (§4.4 disc-extract, §4.6 bootstrap, §4.8 fetch_psyq, §6.3 make help + the R22 line) + the backup-posture P33 update (R20's new home: config/ghidra + --proof; never git clean -x); checkpoint -> NEXT = P6 check, A5 2026-09-06 20:52:07 -06:00
Drew T 6732771fe0 feat(phase-33): B7 the ROM-free CI — no-rom.yml (audits + compile-only), tools/audit_public.py (the first-push gate), tools/compile_only.py, tools/public_rewrite/purge_set.txt
- audit_public: purge paths from purge_set.txt (the C1 rewrite's own input) + a DERIVED ROM-hash set (1,801 manifest
  rows + 218 check.*.sha + redump Track 1) + 50 MiB cap; controls: the current tree FAILS naming exactly the purge set
  (255 rows), a clean subset OK, a renamed EXE copy caught by content; zero-length files exempt (the empty-file SHA1 is
  also the zero-length SC04/SC05 FILE_029/1.6 payloads')
- compile_only: Makefile flags parsed at run time; TUs from <alias>_SRC_DIR with nested-binary pruning; skips derived
  (70 LINKED tiles, 47 INCLUDE_ASM TUs), -O0 TUs compiled at -O0; PR scope 54/54 in 1.6 s; fleet 4,170/4,170 in 123 s
  at -j32, failed 0; unknown alias refused (R43)
- no-rom.yml: audits (8 commands, each re-run under the system python without the venv -> rc 0) + compile-only (apt
  binutils-mipsel + cpp-mipsel-linux-gnu, cc1 from the sha256-checked tarball, maspsx submodule; PR scope on push/PR,
  --all weekly + dispatch); the audits job is RED until C3 by design
- SETUP P33 B7 section + 4 inventory rows (R21); CURRENT_PHASE log + checkpoint -> NEXT = B8
2026-09-06 20:50:11 -06:00
Drew T d379537322 docs(phase-33): B6 dumps — dumps/CHECKSUMS.sha1 (28 rows, --check 28/28) committed before the .bin leave git; INDEX.md status rewritten (LOCAL-ONLY from the flip, archive repo holds the copy, a re-capture is a new snapshot never byte-identical); memory-map Source-index row for the corpus; checkpoint -> NEXT = B7 2026-09-06 20:33:29 -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 bc37b257ee docs(phase-33): decision-log — the in-place flip pivot (why not the two-repo mirror; the fixed-point rule for hashes) and the build-derived main denominator (R31) 2026-09-06 19:32:10 -06:00
Drew T cabab00c0e wip(phase-33): B5 Ghidra regenerability — ExportAnnotations.java + ghidra_export_annotations.sh PROVEN (all 129 programs exported to byte-stable JSONL in 18.5 s), ghidra_annotations_delta.py (live − baseline), ImportAnnotations.java + ghidra_rebuild.sh WRITTEN but unproven (the resident rebuild hit an OSGi script-bundle load error — a compile error in the new importer breaks every script in the dir; the known bad LocalVariableImpl ctor is named in CURRENT_PHASE); Makefile print-% + GHIDRA_PROJ repo-relative; the six ghidra_*.sh repo-relative (BFM_GHIDRA_PROJ); DefineFunctions arg path; ImportPsyqGdt install-dir default; ExportSymbols R15 fix; scratch project under build/ (Ghidra refuses '.'-prefixed path components); SETUP P33 B5 section; checkpoint refreshed for the next session (S86 paused at 87% context) 2026-09-06 19:31:34 -06:00
Drew T 707ec491e4 feat(phase-33): B4 tools/fetch_psyq.sh — the OPTIONAL PsyQ SDK objects, user-supplied and sha256-verified (parser tarball + binary, RTL 4.2 archive -> lib421, the 20 PsyQ 4.0 LIBs off the DTL-S2002 redump disc via tools/psyq_libs_from_disc.py or --from), then the existing builders + make sdk-dual; tools/psyq/CHECKSUMS.sha256 -> tools/psyq_CHECKSUMS.sha256 with 22 new rows; controls: refuse without a 4.0 source, die on a corrupted LIB; the disc-path run rebuilt every SDK dir and proved sdk-dual in 37 s; SETUP P33 B4 (R21) 2026-09-06 19:19:06 -06:00
Drew T 89e087f52a feat(phase-33): B3 tools/bootstrap.sh + make bootstrap (apt presence printed, venv from requirements, submodules, cc1 tarballs sha256-checked + extracted, check-env) + check-env gains submodule/preset-header/payload-census lines; PROVEN on a fresh clone: bootstrap from nothing -> check-env OK -> disc-extract OK -> extract-all 217/217 -> check-all 218/218 in 4m18s with no SDK objects (the public user's path); SETUP P33 B3 (R21) 2026-09-06 19:14:11 -06:00
Drew T 9be6364a5b feat(phase-33): B2 portable includes — 34 absolute #include lines in 19 overlay sources (15 binaries) respelled to ../shared/ (30 engine_core.h + 4 engine_types.h); audit_text_sources.py gains the portable-include class (absolute / angle-bracket / unresolvable / outside-repo), controls 34 offenders before -> 0 after over 4,299 sources; the 15 binaries re-gated byte-identical (15/15 OK, 29 s wall); SETUP P33 B2 (R21) 2026-09-06 19:06:03 -06:00
Drew T 0265712916 feat(phase-33): B1 make disc-extract — the rom->decoder step in the build: extract.py --expect-manifest (compare against the committed oracle, never write it; mismatch -> .run/extract/ + diffs, exit 1) + --allow-missing-audio (explicit PARTIAL for Track-1-only dumps); disc-extract = probe (0.7 s no-op) -> disc presence -> redump SHA1/CRC32 -> extract+compare -> verify (15.7 s full); extract/extract-all call it; check-env WARN-on-absent EXE + oracle self-consistency; help rewritten; the 4 splat preset headers TRACKED (clean keeps them); .gitignore re-tightened to H1 (dumps/*.bin, ghidra/, tools/psyq/, session archive/, ghidra-ext zips, brave.exe; EXE re-include dropped); controls: no-disc exit 2, truncated disc FAILs with the oracle untouched, regenerated tree byte-identical to the previous (1,801 files) 2026-09-06 19:02:34 -06:00
Drew T 62854caca0 fix(phase-33): A4 family map carries its own coverage — family_hseq.json records the 217 scanned binaries + open_instances (0), audit_binaries CHECK 4 reads that denominator instead of inferring it from (now empty) families; regenerating the map had turned the P32-close 6-binary warn into 217 'missing' from a COMPLETE map (R35); controls: 0 [warn] now, the old format warns 'predates the coverage field'; docs/family-hseq.md regenerated (0 families); SETUP P33 A4 (R21) 2026-09-06 18:55:21 -06:00
Drew T 4bb29544a2 feat(phase-33): A3 the with/without-SDK dual — NO_SDK=1 knob (skips the eleven psyq_integrate rewrites AND the -T externals fragments), make sdk-dual (refuses without all 11 SDK object dirs; WITH → extract → rm build/psyq → NO_SDK=1 → extract → WITH restore; map assertions; both legs == config/check.us.sha), wired into tools-health with a [skip] when the SDK is absent; proven: main 143dbb89… byte-identical WITH (1,288 psyq objects) and WITHOUT (12 libcd1 stub tiles), 28 s wall; SETUP P33 A3 (R21) 2026-09-06 18:51:19 -06:00
Drew T b23300fc21 feat(phase-33): A2 reporting instruments — make sig-main rewritten (tools/main_seed_ends.py: main's game-code boundaries DERIVED from the link map + objects, tiling asserted; 809 fns / 45,150 ins), progress.py weighs main by the build-derived sig and EXITS with no sig (R32), the digest's oracle clause derived live (0 phantom / 0 truncated / 0 pad-tail), backlog.linked_closed retires the LINKED-range legacy row (0 open), dup_report on the derived sig; CORRECTED main denominator 45,150 (Ghidra's flow boundaries left 3,628 words of game code unowned) — fleet instr 13,492,113 / distinct 5,820,205, all 100%; make report BINARY=main EXIT=0, audit-digest OK; SETUP §6.8 + P33 A2 rows (R21) 2026-09-06 18:46:52 -06:00
Drew T 73068f39f0 docs(phase-33): A1 governance — R65–R73 ratified at gate 1 (DIGEST §3), CURRENT_PHASE.md opened with the approved plan (verbatim) + the first 🛑 checkpoint; harness task list built (41 items, R28) 2026-09-06 18:30:30 -06:00
Drew T b5b79b3ac1 chore(phase-32): CLOSE — the frontier is empty: 0 stubs across 218 binaries, fleet 100.00 / 100.0 / 100.0, main 2,091/2,091 (v1.31.0)
- PhaseEnd_Phase32.md written; CURRENT_PHASE.md archived to phase-ends/logs/Phase32.md (R19); DIGEST.md §0/§2/§3 appended (step 3b)
- 5 sessions (S81–S85): the parked 5 onboarded (fleet 213 -> 218, UNCLAIMED 0 of 220); 77 functions banked (T1 3, T2c 20,
  T3 39, T4b 13, T4c 2) incl. the §474 PROVED wall, six candidate walls and the two S84 verdicts; every final bank pin-free
- fleet R22 after the last bank: 218 passed / 0 failed (exits 0/0/0, 16:13:17 MDT); make report 363,214/363,214 ·
  13,488,497/13,488,497 · 5,816,589/5,816,589; main REAL 789 · LINKED 1,256 · VERBATIM 3 · stubs 0 · 143dbb89;
  verbatim 5==5; wave_exclude 0; make tools-health OK (EXIT=0, .run/P32/t4e/tools_health.log)
- cookbook §496–§501-R (§501-Q the combine self-update ghost slot; §501-R the three-times-read hoisted invariant);
  accelerators (8)–(16); tools payload_base_evidence / ghost_census / agent_drafts_restore / cc1_dumps_tu / alloc_table
- rules: R64 ratified (the session-start digest); candidates (i)–(ix) recorded for Drew
- Roadmap delta: P32 consumed; P33 = verify + public flip + Gen2 exit
- v1.30.0 -> v1.31.0; committed by Claude at Drew's request (gate 2 confirmed 2026-09-06); Drew pushes (R6)
2026-09-06 16:29:00 -06:00
Drew T ea27bceb1e docs(phase-32): T4c CLOSE — fleet R22 after the last banks 218 passed / 0 failed (exits 0/0/0, 16:13:17 MDT); make report: 100.00% / 100.0% / 100.0%, INCLUDE_ASM 0, main 2,091/2,091 (143dbb89); gate 2 confirmed by Drew 2026-09-06 16:20:59 -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 ffb1949a1b feat(phase-32): T4c hand pass — main:func_80039308 (518 ins) BANKED byte-identical with ZERO pins: the phantom frame slot is a combine ghost (a self-update chain on the s0[1] load), the hoisted volume base is three inline (b2 * 0x100) temps merged by loop.c's combine_movables with a u16 vol accumulator so cse leaves the arms on the hoisted register, and the else head reuses the note-on arm's s17/s18 (S85) — main has NO INCLUDE_ASM stubs left
- gate_main .run/P32/t4e/slate_39308.json --apply: "slate 1 -> 1 compatible … BANKED 1 main functions -- 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL" (clean main rebuild)
- draft .run/P32/t4e/bank/func_80039308.c = b56 (no register pins, no fences, no asm bodies); the 56-variant route is in .run/P32/t4e/NOTES.md
- the S84 PLATEAU's two causes were both compiler mechanisms missing from the censuses: combine.c:2306 (i2dest_in_i2src skips the ref decrement → reload1.c:658 slot) and loop.c:695-700 (a named variable set after a jump is never a movable; cse.c make_regs_eqv folds the arms onto the later-mentioned copy target unless the copy is a subreg move)
- fleet: INCLUDE_ASM stubs 2 -> 0; every game-code function of every binary is C
2026-09-06 16:02:03 -06:00
Drew T f9a90affbd feat(phase-32): T4c hand pass — main:func_80032A74 (422 ins) BANKED byte-identical: the "PROVED" 8-byte orphan slot was a missed producer — a combine ghost minted by a self-update whose deleted insn re-mentions its own dest (combine.c:2306 skips the ref decrement); a three-statement chain on the dd->unk07 compare buys the slot at zero instruction cost (S85)
- gate_main .run/P32/t4e/slate_32a74.json --apply: "slate 1 -> 1 compatible … BANKED 1 main functions -- 143dbb89f34491258bbc27810d0a12ec8b43a8dd BYTE-IDENTICAL" (clean main rebuild)
- draft .run/P32/t4e/bank/func_80032A74.c = the S84 u16 TU-clean body (422/422 code) + `gx = dd->unk07; gx -= 0x100; flag = (u32)sub < (u32)(u8)gx;`
- mechanism + 18 isolated reproducers: .run/P32/t4e/ghost/ (k4/k5/k7/k14/k16/k17 mint the slot; byte-store hosts do not); cookbook §501-Q to follow
- main: stubs 2 -> 1 (func_80039308 remains, now DIFF 2 in the real TU via the same ghost + the s17/s18 variable reuse)
2026-09-06 15:03:24 -06:00
Drew T fe2f34b9f4 docs(phase-32): T4b CLOSE — hand pass complete (13/15 banked + 2 final verdicts); fleet R22 after the last bank 218 passed / 0 failed (exits 0/0/0, 13:21:49 MDT); make report: instr 13,487,557/13,488,497 = 100.0% · distinct 100.0% · fn-count 100.00% · INCLUDE_ASM 2; main 2,089/2,091 = 99.90% (143dbb89); tools-health OK; audit-disc UNCLAIMED 0; 🛑 checkpoint refreshed as the T5 seed
- .run/P32/t4d/: r22_{clean,extract,check}.log, report_close.log, report_main_close.log, tools_health.log, audit_disc.log, exclude_audit.log
- docs/progress.fleet.md + .run/backlog.jsonl regenerated by make report (backlog prune)
- CURRENT_PHASE.md: T4b ticked, the close log entry, the 🛑 block rewritten for the T5 successor (numbers, ledger, procedure, gotchas)
- NEXT = T5: milestone demo → WAIT for gate 2 → PhaseEnd_Phase32.md + DIGEST step 3b → git mv → R23 → uncommitted for Drew (R6) → HARD STOP
2026-09-06 13:38:01 -06:00
Drew T 0ab474ed5d docs(phase-32): T4b hand pass — row (d) harvest: cookbook §501-P (the atlas's 0.55 "weak cousin" was the same-shape sibling; its natural spelling ported with ZERO pins/fences; the 12-variant element census), accelerators (14), decision-log P32 S85, NOTES + 12 measured variants + rtu logs; backlog 3 open; census 2 stubs / 940 ins; T4b hand pass COMPLETE (13/15 banked + 2 verdicts)
- ov_SC03_105:func_80185810 banked in commit:4004 (bank.sh: rtu MATCH 489/489, build rc 0, sha d305ff6d… == config)
- §501-P: shape-grep the idiom's constants (`'0x200) << 2'`) and objdump the sibling's window before any dial; a pin/fence a draft
  "needs" is a property of its other dials — remove every pin after a sibling port (d9 = no pins = MATCH); census: F2 polarity 42,
  2-set uu 63, ot16 pin load-bearing only next to 2-set neighbours (d3 = 4); the S83 "hard reg hides nonzero_bits" guess refuted (d5)
- post-bank: twin_rescan 2 open / 0 free; verbatim_check --strict 5==5; backlog.py render 3 open; frontier_t4b_final.json 2 / 940
- .gitignore allowlist for .run/P32/t4d/ (variants, logs, notes, the banked body; rtu/ compile dirs stay ignored)
- fleet R22 running in the background (.run/P32/t4d/r22_*.log) — recorded at the T4b close
2026-09-06 13:21:29 -06:00
Drew T cdd9a2cb8e feat(phase-32): T4b hand pass — ov_SC03_105:func_80185810 (489 ins) BANKED byte-identical: the banked cousin ov_SC02_027:func_80180B3C's packet-window spelling ported (cookbook §501-P); zero pins, zero fences, zero asm dials (S85)
- func_80185810: draft .run/P32/t4d/bank/func_80185810.c (hand agent, agent MATCH re-verified by coordinator rtu_match in the real TU)
- one build for the same-TU batch: make build BINARY=ov_SC03_105 -j8 rc 0; sha1 d305ff6da199b52d0d44023766643a8b661ed524 == config/check.ov_SC03_105.sha (BYTE-IDENTICAL)
- src/ov_SC03_105/ov_SC03_105_jr_80181C84.c: 1 INCLUDE_ASM left
2026-09-06 13:12:18 -06:00
Drew T e7679b51ff docs(phase-32): T4b hand pass — row (c) func_80039308 PLATEAU at 4 (§501-O phantom-slot census for a leaf; ledger row); 🛑 CHECKPOINT refreshed for the pause: (a) PROVED · (b) BANKED commit:4001 · (c) PLATEAU 4 · (d) NEXT (sibling search first), then T4b close and T5
- (c): cnt's slot is spill_stack_slot[23] (evicted from $s7), so the phantom @0x8 must be an initial-loop no-traffic slot; every producer refuted on dump facts (leaf: no save area; LO spilled after GR and products alternate to GR_REGS — C3 measured; no unallocated single-block equiv pseudo; expand-time locals precede; 13 lh single-use, no lb). Rows 49/50 = two move_movables hoists in body order.
- row (d) read only (rtu DIFF 13 re-verified); brief + step 0 (§501-N banked-sibling search on its symbol set) in the checkpoint
- no src/ change in this commit; fleet R22 owed at the T4b close (last check-all 218/218 before the (b) bank)
2026-09-06 12:31:08 -06:00
Drew T 3e90db193f docs(phase-32): T4b hand pass — row (b) harvest: cookbook §501-N (port the banked sibling's spelling; the asm-label u32 array alias unlocks cse's OT base binding), accelerators (13), NOTES + 7 measured variants; ledger 4 open; bank.sh session trailer from $CLAUDE_SESSION
- func_800CF408 banked in commit:4001 (rtu MATCH 178/178 in the real TU; make build BINARY=md_MAIN_007 -j8 rc 0; sha 2ff702b6… == config/check.md_MAIN_007.sha)
- post-bank: twin_rescan 3 open / 0 newly free; verbatim_check --strict 5==5; backlog render 4 open (row pruned)
- CURRENT_PHASE.md: S84 log entry + checkpoint refreshed (rows (c)(d) next; fleet R22 owed at the T4b close)
2026-09-06 12:08:11 -06:00
Drew T 8fa12bc226 feat(phase-32): T4b hand pass — md_MAIN_007:func_800CF408 (178 ins) BANKED byte-identical: the banked sibling func_800CD92C's spelling ported (libgpu P_TAG shape, u32 array view of the OT symbol via the fleet's asm-label alias); zero pins, zero asm bodies (S84)
- func_800CF408: draft .run/P32/t4c/bank/func_800CF408.c (hand agent, agent MATCH re-verified by coordinator rtu_match in the real TU)
- one build for the same-TU batch: make build BINARY=md_MAIN_007 -j8 rc 0; sha1 2ff702b605ab5cfc18474c464c4c07e5f8ffd48c == config/check.md_MAIN_007.sha (BYTE-IDENTICAL)
- src/md_MAIN_007/md_MAIN_007.c: 0 INCLUDE_ASM left
2026-09-06 12:06:00 -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 bfeef0c3a1 docs(phase-32): backlog ledger rows from the T4b close (render-time pruning of the banked rows) 2026-09-05 23:56:32 -06:00
Drew T f1f3346cdf docs(phase-32): T4b close — make tools-health OK quoted in the 🛑 checkpoint; log kept 2026-09-05 23:56:17 -06:00
Drew T efdb4c12a2 docs(phase-32): 🛑 CHECKPOINT — T4b first pass complete (11 of 15 banked, 4 carried with hand-crack briefs; Drew: hand-crack next session, no agents); fleet R22 218/218 at 23:36; make report instr 100.0% / distinct 100.0% (90,982/90,984) / fn 100.00% / 4 stubs; census 4 / 1,607 ins 2026-09-05 23:52:36 -06:00
Drew T fcec654163 docs(phase-32): cookbook §501-L — when two dials share a slot they couple (func_800CF408's floater cure vs the qty_compare contest; the decoupling lever) 2026-09-05 23:34:08 -06:00
Drew T 77b63f0bb5 docs(phase-32): T4b — func_800CF408 49 -> 3 NEAR, zero pins (Fable, 499k tokens): §501-H closers; residual = §501-H's floater mechanism coupled to the $t2/$t3 qty_compare contest; backlog row with the decoupling lever; all 15 first-pass rows complete (11 MATCH / 4 NEAR) 2026-09-05 23:33:33 -06:00
Drew T 90b2425ee0 docs(phase-32): cookbook §501-J (a proved tree wall is not an RTL wall — §474's floor built at RTL level via EXPAND_SUM, func_80011380) + §501-K (sched2's /s-store exemption and a pseudo's own slot vs a hand pad, func_800CF6D0); checkpoint §1b: 11 banked, 1 in flight, 1 pin left 2026-09-05 23:23:31 -06:00
Drew T 6f2731f0db docs(phase-32): T4b (11) ledger — func_800CF6D0 banked, backlog re-rendered, the Fable draft + report + verdict kept 2026-09-05 23:22:56 -06:00
Drew T 228928dbec feat(phase-32): T4b (11) — md_MAIN_007: func_800CF6D0 (249 ins) BANKED byte-identical 2ff702b6 — the 137-row plateau falls with zero pins: the QI/HI store split was sched2's true_dependence exemption for /s varying stores (cast field stores restore it), ob assigned before block 1 wins the $t2/$t3 flow ref-count tie, and the folded-sum pseudo's own 4-byte slot IS the 0x18 frame (Fable agent)
- func_800CF6D0: draft .run/P32/t5x/fable/func_800CF6D0.c (fable agent, agent MATCH re-verified by coordinator rtu_match in the real TU)
- one build for the same-TU batch: make build BINARY=md_MAIN_007 -j8 rc 0; sha1 2ff702b605ab5cfc18474c464c4c07e5f8ffd48c == config/check.md_MAIN_007.sha (BYTE-IDENTICAL)
- src/md_MAIN_007/md_MAIN_007.c: 1 INCLUDE_ASM left
2026-09-05 23:22:46 -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 35fa116741 feat(phase-32): T4b (10) — main: func_80011380 (192 ins, boot -O0) BANKED byte-identical 143dbb89 via gate_main — the §474 "PROVED C-level floor" falls: a proved TREE wall is not an RTL wall — (D_80074784 * 2 + 1) * 2 - 2 keeps MULT(PLUS(MULT(i,2),1),2) past fold and the expander's distributive law rebuilds the nested multiply (Fable agent)
- pinned since S76/S79 as PROVED (§474: fold-const.c:882 split_tree merges MULT(MULT(i,2),2) in every C spelling; the two escapes
  each cost one instruction — stupid.c adjacency / expand_decl use-brackets); 20 spellings + statement-expression + register
  temp forms measured; the S83 hand pass measured four block-scoped forms at 193/131
- the mechanism (dumps + source): split_tree only decomposes MULT/PLUS/MINUS and never distributes MULT over PLUS, so
  MULT(PLUS(MULT(i,2),1),2) survives fold; expr.c:5368's EXPAND_SUM distributive law returns (plus (mult (mult X 2) 2) 2);
  both_summands (expr.c:5248) + plus_constant cancel the +2 against the -2 into the bare symbol; memory_address -> force_operand
  expands the two expand_mult copy;sll pairs adjacent (expmed.c:2227/2244) with no note or variable, so stupid.c's born+2
  rule 2-colours v1/a0 exactly as the target and expand_binop's late copy_to_mode_reg(sym) gives la $a0 / addu / lbu 0()
- ruled out from source: a hard-reg pin + shift outer form (191, LENGTH-DRIFT — a REG index makes (plus sym reg) a legitimate
  MIPS address so la/addu vanish: the target's la;addu;lbu shape REQUIRES the index to reach memory_address as a MULT rtx),
  COMPOUND_EXPR shield (fold distributes), SAVE_EXPR via ?:, COND shields, builtin pseudo-constants, pin+MULT
- draft .run/P32/t5x/fable/func_80011380.c; report .run/P32/t5x/reports/func_80011380.md; coordinator rtu_match MATCH 192/192
  in src/boot.c (--o0); gate_main slate_11380: BANKED, 143dbb89 BYTE-IDENTICAL; all 15 jal callees + data-symbol counts equal
- main open 3 -> 2 (func_80032A74 pinned NEAR 1; func_80039308 NEAR 4)
2026-09-05 23:21:54 -06:00
Drew T 395333f233 docs(phase-32): decision-log P32 S83 T4b (R31) — the final-15 directive: hand pass 0 banks, Fable agents 9 of 12 (six former walls), costs and outages; accelerators (10) Fable on the compiler-internals class, (11) attribute the residual to a pass before sweeping 2026-09-05 23:16:50 -06:00
Drew T d7d484abab docs(phase-32): T4b — Drew: no second round this session; close order after the three in-flight rows (R22, report, census, decision-log, accelerators, checkpoint) 2026-09-05 23:14:51 -06:00
Drew T 5e8e22a93c docs(phase-32): 🛑 checkpoint §1b — T4b state: 9 banked (commits listed), 3 NEAR improved with next levers, 3 agents in flight, queue empty; fleet R22 pending before any close 2026-09-05 19:26:57 -06:00
Drew T 9189a7caed docs(phase-32): T4b — func_80039308 17 -> 4 NEAR (Fable, 655k tokens): the alias block + rows 390/391 closed; residual = a phantom 8-byte spill slot at sp+8 (reload's $s7 spill register) + the hoisted constant's preheader order; corrected law: equal-priority load/store ties go to the store via potential_hazard; backlog row + draft + report kept 2026-09-05 19:26:19 -06:00
Drew T da90d3fc28 docs(phase-32): cookbook §501-I — manufacturing §172 producer-2 orphans (an s16 read from memory at each use), the shared-scratch store dependence, the laundered first-statement address (func_8017DC80); T4b row (9 banked) 2026-09-05 19:19:42 -06:00
Drew T d753c44172 docs(phase-32): T4b (9) ledger — func_8017DC80 banked (ov_SC07_002), backlog re-rendered, the Fable draft + report + verdict kept; queue updated 2026-09-05 19:19:06 -06:00
Drew T 825da37bc0 feat(phase-32): T4b (9) — ov_SC07_002: func_8017DC80 (346 ins) BANKED byte-identical — the historic -33 LENGTH wall's last 46 rows: two combine USE-orphans from reading the s16 mode from memory at each use (§172 producer 2), ONE scratch variable carrying the len byte and the tpage word (the sb's anti-dependence), and a laundered first-statement arg = &D_800AF648 (Fable agent)
- func_8017DC80: draft .run/P32/t5x/fable/func_8017DC80.c (fable agent, agent MATCH re-verified by coordinator rtu_match in the real TU)
- one build for the same-TU batch: make build BINARY=ov_SC07_002 -j8 rc 0; sha1 fad71342019704d1dd6ec25f2f3934c97e322624 == config/check.ov_SC07_002.sha (BYTE-IDENTICAL)
- src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c: 2 INCLUDE_ASM left
2026-09-05 19:18:45 -06:00
Drew T 99b65ef94a docs(phase-32): T4b — func_80185810 35 -> 13 NEAR (Fable, 471k tokens): 3 of 4 windows closed (P_TAG bitfield qty priorities, sched1 flush_pending_lists load order, hard-reg dests not boosted); residual = the cl second-set fence; backlog row + draft + report kept 2026-09-05 19:09:36 -06:00
Drew T 066a2f1cce docs(phase-32): cookbook §501-H — large constants are unboosted floaters; the prologue weave is decided by which ready-list stalls eat them (func_800CD92C, zero pins); T4b row (8 banked) 2026-09-05 18:55:38 -06:00
Drew T 511afcf75c docs(phase-32): T4b (8) ledger — func_800CD92C banked (md_MAIN_009 100% C), backlog re-rendered, the Fable draft + report + verdict kept; queue updated 2026-09-05 18:55:02 -06:00
Drew T 4a9a67c59e feat(phase-32): T4b (8) — md_MAIN_009: func_800CD92C (247 ins) BANKED byte-identical d270f695 — the prologue-weave NEAR falls with ZERO pins: m24 wins $t1 by flow ref count (the P_TAG bitfield's foldable re-mask), and the tpage constants float to the top because a multi-set tag load (bitfield RMW shape) fills the RMW latency stalls instead of being birthing-boosted (Fable agent); md_MAIN_009 is 100% C
- func_800CD92C: draft .run/P32/t5x/fable/func_800CD92C.c (fable agent, agent MATCH re-verified by coordinator rtu_match in the real TU)
- one build for the same-TU batch: make build BINARY=md_MAIN_009 -j8 rc 0; sha1 d270f695b793b5c03db159b7aabcc066daa87eda == config/check.md_MAIN_009.sha (BYTE-IDENTICAL)
- src/md_MAIN_009/md_MAIN_009.c: 0 INCLUDE_ASM left
2026-09-05 18:54:50 -06:00
Drew T d7561f2680 docs(phase-32): cookbook §501-G — three passes, three dials (sched1 birthing boost / a phantom USE nop in sched2's model / a local-alloc tie broken by the P_TAG bitfield's flow ref count; func_800CF3E8); T4b row (7 banked, 1 near-proved) 2026-09-05 18:43:53 -06:00
Drew T 5d8b8478fa docs(phase-32): T4b (7) ledger — func_800CF3E8 banked (md_MAIN_003 100% C), backlog re-rendered, the Fable draft + report + verdict kept; queue updated 2026-09-05 18:43:11 -06:00