Commit Graph

775 Commits

Author SHA1 Message Date
Drew T 583ec85d6e docs(phase-33): G1 — docs/gen3-handoff.md: where Gen2 ends, the owner's next intent (casts -> structs, pins off, names), the starter census DERIVED from the tree with its commands (143 raw address casts, 61,898 D_ symbols, 16,335 func_ names — the plan's numbers reproduced — plus 44,243 register pins, 1,258 Sony tiles, 1,083 symbol-file entries, 1,232 struct defs, 2,220 dedup groups), the one invariant (every edit byte-gated; shared bodies change every member; types are comprehension not bytes), the inherited levers, shiftability honestly scoped, the parked Gen3 ideas, governance for a new generation; SETUP row + P33 G1 section; doc_links default; log + checkpoint (34 of 41: everything Claude can do before the flip is done — NEXT = the probe-gated chain on Drew's side, then C11, then G2); G1 pulled ahead of the plan's C11 -> G1 order (recorded) 2026-09-07 11:35:50 -06:00
Drew T 98e5846662 docs(phase-33): E6 — docs/matching-drafter-pipeline.md: the fine-tuned local matching drafter written up from the Phase 22–25 records (the toolchain-agnostic pipeline export_pairs → format_finetune → train_lora → eval_lora → serve_local → api_draft/lora_grind/bulk_harvest → the byte gate; the measured arc as one table — stock floor ~0, corpus-v2 85% on 6–15 ins, the 0/222 harness bugs, corpus-v3 57.5% held-out + ~352 production banks at $0, bulk_harvest 65% at 0.4 s/fn, GLM5.2 10/18 bodies but 3/18 banks = the def-side wall, v4 discarded; the portable lessons; hardware; a five-step recipe; what is NOT published — the ROM-derived pair dataset and the adapter weights, both gitignored); SETUP row + P33 E6 section; doc_links default; log + checkpoint (Block E complete; NEXT = G1, pulled ahead of the probe-gated items) 2026-09-07 11:32:42 -06:00
Drew T bf002f84d2 tools(phase-33): E5 — the permuter upstream PR branch (reloc-masked-scorer: src/reloc_scorer.py RelocMaskedScorer as a Scorer subclass, --score-mode {mnemonic,reloc-masked} + score_mode setting, -J refusal, docs, test/test_reloc_scorer.py 10/10 on an embedded gcc-2.7.2 listing; black clean, mypy at upstream's baseline; the real permuter: a swapped-operand base 4 -> 0 in 256 iterations where the default scorer read 3,585) tracked as tools/permuter/upstream/0001-reloc-masked-scorer.patch (git am clean onto upstream main 41bd0bfc); docs/permuter-ils.md (why the stock scorer floats, the scorer + PR, the symbol_regex issue text for PR-2, the ILS warm-restart recipe and its five guards); SETUP row + P33 E5 section; doc_links default; log + checkpoint (NEXT = E6); Drew pushes the branch to his fork and opens the PR + issue 2026-09-07 11:29:35 -06:00
Drew T 9c4d32d651 tools(phase-33): E4 — xsig packaged: tools/xsig/ (xsig.py library + CLI sign-s | sign-objdump | cross | verify | selftest, from the Phase-21 .run/xdedup probe; README with the recorded worked example — BFM × Xenogears + Vagrant Story 103 hits all PsyQ library/BIOS, BFM × Tomba 126 hits 124 library: the decision log's clean negative; MIT LICENSE; tests/ from a game-free fixture compiled with the pinned triple and linked at two addresses with --emit-relocs, relocation records merged into the listings, 8/8) in tools-health + CI + doc_links; SETUP row + P33 E4 section; the standalone copy at .run/P33/xsig-repo/ (one commit, noreply identity, system-python tests OK) for Drew to push as Druthulu/xsig; log + checkpoint (NEXT = E5, a cut candidate for Drew) 2026-09-07 02:51:02 -06:00
Drew T 50c1b69e4d docs(phase-33): E3 — docs/gcc-2.7.2-map/README.md (the five files by pass group, the condensed §31 triage table, the byte-proof method, the provenance legend: vanilla 2.7.2 subset from the GNU tarball sha256 7cd8bce5… vs pmret/gcc-papermario = gcc 2.8.1, the +611-line drift caveat, the S23 audit 119/40/7/4) + tools/gccmap_cites.py: every file.c:NNN cite in the map tagged [2.7.2]/[2.8.1 pm]/[repo] from the trees (quoted snippets → function extents → nearest occurrence → the author's cues → cite_overrides.tsv, 20 rows with reasons → a tie is a valid 2.7.2 line; a contradiction leaves [?]); 135 cites: 79/55/1, --verify 0 disagreements, --controls 6/6, idempotent; three tagger defects caught by its own controls before any tag landed (window span pairing, code fences, self-read cues); --check (textual) in tools-health + CI audits; doc_links default; SETUP row + P33 E3 section; log + checkpoint (NEXT = E4); 8 orphaned 49h permuter workers stopped 2026-09-07 02:32:57 -06:00
Drew T 954362c81e docs(phase-33): F3 the wiki + how-to-AI-decomp, authored in-repo — docs/wiki/ (Home, Build from your own disc, Toolchain setup, Repository layout, The matching workflow, The dedup engine, Overlays and modules, Ghidra rebuild from text, Verification and progress, Contributing and the no-ROM policy, How-to-AI-decomp index, _Sidebar) + docs/how-to-ai-decomp/ chapters 00–12 (governance, byte gate, bootstrap order, oracles and instruments, cards/lanes/waves, knowledge base, compiler source, models and budgets, economics, integration and propagation, publishing, failure museum); tools/wiki_render.py (link rewrite to GitHub-wiki page names, dead link = error, 12-case selftest) + tools/wiki_sync.sh (render → clone → replace → diff; --push is Drew's, R6; dry-run works before the wiki repo exists); doc_links checks both directories by default (DEFAULT_GLOBS); pending list EMPTY, --strict PASS: 40 documents / 290 links / 0 broken; 25 pages rendered, 264 links rewritten 2026-09-07 01:57:24 -06:00
Drew T 214d0dd15b fix(phase-33): probe_github.sh fetches into a throwaway scratch repo (R57) — the S87 baseline + first S88 probe runs had imported 5.97 GiB / 30 packs of the purged history into ~/bfm-decomp as unreachable objects (a successful git fetch of an old sha pulls its whole closure); now --filter=blob:none --depth=1 into .run/public_rewrite/probe_scratch.git (deleted on exit) + a self-check naming any sampled old commit the working repo still holds + the gc recipe (control: count-objects identical before/after, verdict unchanged 31/33 ALIVE); runbook §11 + SETUP row; S88 preflight logged (Drew pushed; no-rom + progress workflows GREEN on first run; F3 = FULL) 2026-09-07 01:41:08 -06:00
Drew T 5e57e88de2 docs(phase-33): F2 the retrospective — tools/mine_hindsight.py (19 hindsight items over 79 decision-log entries, 2 believed-sections, 237 deviation rows, file:line anchored) -> docs/retrospective.md (belief-vs-truth table, eight failures and why they looked right, costs with denominators, ten 'sooner' items, what stayed hard); doc_links pending list EMPTY (--strict PASS); SETUP row; S87 closes at 87% context — checkpoint rewritten for the successor: NEXT = F3 (scope = Drew's call) 2026-09-07 01:16:08 -06:00
Drew T c8c4e37f5a fix(phase-33): doc_links — a missing default document that is on the pending list counts as PENDING, not BROKEN (docs/retrospective.md until F2) 2026-09-07 01:11:04 -06:00
Drew T 5b03ae1d5a docs(phase-33): F1 the timeline + the story — tools/timeline.py (72 dated rows from the committed digests' history, keyed by date, PhaseEnd ticks, self-check == progress.json; the 07-22 denominator note computed from the rows, not asserted) -> docs/story-timeline.md + .svg; docs/story.md (the narrative from the first commit to the flip, every section citing its PhaseEnd / decision-log / timeline sources); pending list -> 1; SETUP row; checkpoint -> NEXT = F2 2026-09-07 01:10:48 -06:00
Drew T 2cbedf5878 docs(phase-33): D5 governing-docs consistency — CLAUDE.md fail-safe names every purged path (H1 in force), DIGEST §1 H1/R1/R20 + the Phase-14→P33 in-place flip, roadmap-to-100 'Status at Phase 33' block, gen2-roadmap Phase-14 SUPERSEDED banner; tools/doc_links.py (relative-link checker with a tracked pending list that gate 2 refuses; negative control rc 1) in tools-health; SETUP row; checkpoint -> NEXT = F1 (Block D done) 2026-09-07 01:05:53 -06:00
Drew T ecf67e6ff3 feat(phase-33): D3 progress publishing — per-binary instruction totals in docs/progress.json, docs/badges/*.json (shields endpoint), --check covers JSON + README block + badges (in make audit-digest), tools/objdiff_report.py (report.proto v2; validated with objdiff-cli 3.8.1 incl. a mutated-unit control), tools/frogress_upload.py (dry-run default), .github/workflows/progress.yml (artifact SLUS_007.26_report, no rebuild); SETUP rows + P33 D1–D3 section; checkpoint -> NEXT = D4 2026-09-07 01:01:28 -06:00
Drew T af482a02d4 docs(phase-33): D2 — LICENSE (AGPL-3.0 verbatim from gnu.org), src/NOTICE.md (reimplementation for study/preservation, © 1998 Square acknowledged, no license asserted, no 'clean-room'), THIRD_PARTY.md (17 rows, every license read from the upstream LICENSE file or the GitHub API; old-gcc and ghidra_psx_ldr publish none — download-only; the SDK never distributed), tools/README.md (the one AGPL statement); checkpoint -> NEXT = D3 2026-09-07 00:53:58 -06:00
Drew T 848f294fc8 docs(phase-33): D1 the README rewrite — the claim and the contract, a GENERATED numbers block (tools/progress.py --json -> docs/progress.json, --readme rewrites the marked block, --check asserts freshness; wired into make report), what is not our C, build-from-your-own-disc, layout, how it was made (ProjectArchitect), about the history (tokens + commit-map), license split, no-ROM policy, special thanks; forward references to D2/D3/F1/F2 files recorded in the checkpoint 2026-09-07 00:51:24 -06:00
Drew T 16ecca474d chore(phase-33): C9 — the rewritten history is on origin (force-pushed by Drew, 176,052 objects); local gc: archive remote removed, 12 stale campaign worktrees removed (they pinned 3,729 old commits: a linked worktree's HEAD is reachable), reflog expired, repacked to one 80 MB pack (.git 1.5 GB -> 93 MB), fresh commit-graph, fsck clean; absent_scan + gate_scan --all --worktree PASS; probe baseline 31 of 33 old hashes still alive on GitHub (422 now counts as gone); runbook §10/§12 measured; checkpoint -> C10 (Drew) in parallel with D1 2026-09-07 00:44:27 -06:00
Drew T 5bc4a5c0ab fix(phase-33): verify_contract step 00 ignores its own output directory — the per-step logs are tracked evidence since A5 and run_step writes 00_tree.log before the porcelain check (C8 failed on its own log twice) 2026-09-06 23:30:13 -06:00
Drew T 4f7c3b64a3 docs(phase-33): commit-map + citations resolved to the rewritten history (C4–C7 — the tip commit)
- docs/commit-map.tsv: 4,032 rows (ordinal of the ORIGINAL main -> rewritten hash, author/committer dates, subject);
  1 pruned row of zeros (ordinal 1712, "session archive update"); 0 old hashes asserted; ordinal 1 unchanged by the
  rewrite (byte-identical)
- resolve_tokens: 1,238 commit:NNNN tokens -> shortest-unique new hashes in 98 files (docs, phase-ends, logs, tool
  docstrings, 2 C comments, the A5 evidence logs); residue left as tokens: commit:1712 x4 (the pruned commit),
  commit:orphan-24 x2, commit:orphan-26, commit:orphan-35 (cited commits that exist in no lineage)
- the rewrite (C4): filter-repo 2.47.0 on a bare clone of the C2 tip, 311 s, exactly 1 pruned, main 4,032 -> 4,031;
  the pre-rewrite history is mirrored in the private archive repo and in the local bundle
- the proof (C5): verify_rewrite 4,031 pairs / 0 failures; absent_scan 0 offenders; gate_scan 0 offenders on the clone
- adoption (C6): 100 text files differ at the tip, 0 purge paths, 0 added/deleted; leftover refs dropped; no gc yet
- resolver skips tools/public_rewrite/ (its self-test fixtures are the token grammar, not citations); repo-local
  identity is the GitHub noreply address from here on; CURRENT_PHASE: C4–C7 logged, checkpoint -> NEXT = C8
2026-09-06 23:28:39 -06:00
Drew T 494fbd3c82 chore(phase-33): C2 the recorded controls on the final pre-rewrite tree — hash_dict 4,421 objects / 0 ambiguous / 0 collisions; scrub sample 732 tokens == git's own lookup; gate_scan --expect-fail PASS over 16.79 GB (every rule named, 0 strays, 268 ids, the shared empty blob excluded); audit_public OK; run_filter now refuses a stale dictionary (R43); checkpoint -> NEXT = C4 (waiting on Drew's archive mirror push) 2026-09-06 22:42:09 -06:00
Drew T fca3839049 feat(phase-33): C1 the history-rewrite tooling — tools/public_rewrite/ (git-filter-repo 2.47.0), PROVEN by two trial rewrites on a scratch bare clone
- hash_dict (4,420 commit objects -> commit:NNNN / twin / orphan; 150,280 prefixes; 0 ambiguous; 0 collisions with 1,480
  cited content hashes; scratch mailmap), scrub (12/12 self-test; HEAD sample 731 distinct tokens == git's own lookup),
  gate_scan (+ expected_offenders.txt fixture: the R39 negative control, PASS over 16.8 GB in 2 m 25 s; rom_blob_ids =
  content/signature hits U purge-path blobs not shared with any other path), run_filter (module API; --force only for the
  deleted tag), verify_rewrite (pairwise proof + no purge path survives + pruned set == derived purge-only set),
  build_commit_map (0 old hashes asserted; unchanged commits exempted), resolve_tokens, absent_scan (positive control on the
  current repo: FAIL 82,362), probe_github.sh (skips unchanged commits)
- trial #1 found two defects the plan had not foreseen: the EMPTY blob in the strip list (--strip-blobs-with-ids then
  undid every "file emptied" change in history and pruned a restore commit) and the byte-identical Initial commit keeping
  its hash; both fixed with controls
- trial #2: filter 269 s, exactly 1 pruned, verify 4,029 pairs / 0 failures, map 4,030 rows, absent_scan + gate PASS on
  the clone, 1,231 tokens resolved at a trial tip (residue 7: the pruned commit x3, orphans x4), aggressive repack 500 -> 80 MB
- SETUP P33 C1 section + rows (R21); runbook §3/§5/§6/§10 measured; requirements-python.txt; CURRENT_PHASE -> NEXT = C2
2026-09-06 22:37:10 -06:00
Drew T 3e0ecfaccf fix(phase-33): audit_frontier's LINKED-stub count reads the Stub records (the reference view holds addresses) — control: 1,258 total, 1,258 inside LINKED, 0 game-code; docs/family-hseq.md regenerated by the aborted run's step 02 2026-09-06 20:58:29 -06:00
Drew T 8845fdd994 fix(phase-33): audit_frontier keys main as SLUS_007.26 in the reference view (the derived LINKED-stub line read 0 — now 1,258 inside LINKED, 0 game-code); verify_contract step 00 checks tracked files only (-uno) so the run's own untracked logs cannot fail it 2026-09-06 20:56:40 -06:00
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 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 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 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 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 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 2fdcc4f120 docs(phase-32): T3 S83 CHECKPOINT — 28 banks (census 44 -> 16 stubs / 3,827 ins), fleet R22 218/218 twice, the 17-row Haiku queue 17/17 MATCH; cookbook §500-F; 🛑 block refreshed
- CURRENT_PHASE.md: T3 row (47/47 drafted, 38 banked, 9 NEAR ledgered, 0 FAIL), the S83 log entry, the 🛑 SESSION
  CHECKPOINT rewritten to the verbatim-replay standard (supersedes the 10:01 block): state, what S83 did, the 16-row
  census with draft paths, NEXT (step 8 permuter_ils ×2 + one Opus look, then the close), files/tools/gotchas, T4/T5 carry
- cookbook §500-F (the queue's yield + the four integration classes a per-draft rtu_match cannot see: same-TU spellings,
  §304 ×3, verdict-relative-to-TU-at-verification, the md_* jtbl route is §303); docs/cookbook-index.md regenerated (--check OK)
- .run/P32/t3/BRIEF.md: the §304 + exact-TU-spelling contract lines; harvest_notes.md; verdicts.jsonl +17 (session 491895ad);
  pending_launch.txt emptied (all 17 launched 10:57); the 17 Haiku drafts + 3 agent reports (R20)
- tools/jtbl_carve.py: the leading-island refusal now says §303 supersedes the §260 split for md_* modules (P32 S83 witness)
- backlog: the 9 NEAR rows logged (class · closeness · best draft · cost "1 Opus agent, 30–70 min", R41); docs/backlog.md 15 open
- .run/P32/t3s3/ (NEW, allowlisted): splice.py, bank.sh (verbatim grep -> rtu xN -> splice xN -> one build -> sha -> commit
  on green), backlog_near.sh, prompts/ (17), gate/slate_main2.json + log, r22/r22b/tools-health/build/bank/twin_rescan logs
- census jsons .run/P32/frontier_t3s3_{mid,haiku}.json; progress digests regenerated by tools-health (R22 218/218 at 10:46 and 11:09)
2026-09-05 11:11:03 -06:00
Drew T 11f79c1b0a docs(phase-32): T3 checkpoint — the 31 agents' FULL final reports saved to .run/P32/t3/reports/ (tools/agent_reports.py, NEW) + tools/transcript_dump.py (NEW, the dead-session reader); SETUP rows, playbook addendum-2, 🛑 block §3/§6 point at them 2026-09-05 10:11:43 -06:00
Drew T 9480c979a0 docs(phase-32): T3 CHECKPOINT — the launching coordinator overflowed after bank 9; 22 agent verdicts recovered (20 MATCH / 9 NEAR / 2 FAIL of 31), 11 swept Opus deliverables restored + re-verified, cookbook §500 harvest, playbook §S80 addendum-2, agent_drafts_restore.py
- verdict ledger .run/P32/t3/verdicts.jsonl rebuilt from the 31 T3 transcripts (agent_verdicts.py); every unbanked draft
  re-verified with rtu_match in its real TU: 10 MATCH awaiting the gate (main func_80015B6C 120 + func_8002FDE8 73;
  md_SC03_054 func_801EF6D8 604 + six jtbls; md_SC03_053 func_801EF734 44 + func_801EF7E4 72; md_MAIN_007
  func_800CF148/2BC/EEFC/EF94/068) + func_800CF3B0 leaf-exact behind the TU's void/3-arg decl; 9 NEAR at exact length
  (2/6/15/17/27/35/46/49/137), each with its class and inert-lever list
- R48 incident: one agent's `find .run/P32/t3/opus -maxdepth 1 -type f ! -name <mine> -exec mv {} _scratch/` swept 11
  sibling deliverables (two MATCHes among them); found in _scratch/, restored to the contract paths, byte-verified;
  tools/agent_drafts_restore.py (NEW: transcript replay) as the fallback; .gitignore allowlist for .run/P32/** so the
  drafts, ledger and census files are committed (R20)
- harvest (R16/R30): cookbook §500 (10 banked closers, 10 MATCH closers, 9 NEAR classes, two NEW mechanisms — the
  pinned-base-vs-pseudo-address alias basin and #line-equalised ASM_OPERANDS for cross_jump — and the wave-process
  defects); wave-playbook §S80 addendum-2 (per-function work dirs, JSON-only final message, the 20-agent cap, the
  recovery tools); accelerators P32 T3; decision-log P32 S82 (R31); SETUP tooling row (R21); cookbook-index
  regenerated; .run/P32/t3/BRIEF.md output contract amended for the 17 queued launches
- CURRENT_PHASE: T3 row IN PROGRESS, Log entry, 🛑 SESSION CHECKPOINT (census 44 stubs / 5,313 ins with every row's
  state and draft path, the 9-step resume order, the dead session's read-only T4 pre-read); harness task list rebuilt
- no src/ or config/ change in this commit; no fleet R22 has run since the 10 T3 banks — the resume order starts with one
2026-09-05 09:36:43 -06:00
Drew T 8b2bbff831 fix(phase-32): T2c (1) — split_indicator's population is derived from the yamls (was a stale stored 213-name list; tools-health said "213 OK of 213" over 218 binaries); R32 denominator assertion 2026-09-05 00:08:44 -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 848c7c50ab feat(phase-32): T2a — tools/payload_base_evidence.py (controls-gated static base evidence) + memory-map §S45 p7: the parked five get candidate bases
- the instrument: module-id word, TEXT_LO estimate, absolute-pointer set, lui hi-half histogram, and a
  jal->function-start VOTE (starts = prologues ∪ the word after every `jr $ra`+delay — leaf functions have no
  prologue, the recall killer of S45's vote_base 4/12); scores a BOUNDED candidate list (5 §S44 slots ∪ 134
  IDXTAB DESTPTRs ∪ vote bases): STRONG / CONSISTENT / INCONSISTENT / NO-EVIDENCE; AMBIGUOUS tie sets are
  printed, never picked; a payload with no self-reference is REFUSED as base-independent (R43)
- R39 controls run before any emission: md_MAIN_008/011/013/042, md_SC03_073, md_SC02_009, md_SC07_004
  re-derive their byte-proven bases top-ranked from their payloads alone (7/7); TEXT_LO estimates == yaml
  (incl. the header-table modules 0x7C/0x14/0x158). The first draft of the scorer FAILED 5/7 (prologue-only
  starts; a top-rank assertion on modules the bytes cannot discriminate) — fixed by the controls, not shipped
- the five (G5 static-derived, US): MAIN/7 STRONG 0x800CEDF8 (9/9 jals, 14/16 ptrs on starts); MAIN/9 STRONG
  0x800CD348 (6/6, 9/9); SC03/53 + SC03/54 CONSISTENT with 0x801EF468 top of a 12-way tie; SC03/56 SPLIT
  (jal vote 0x80178C8C vs pointers/lui ~0x801CBB50). T2b probes each with new_binary.sh — the byte gate decides
- SETUP row (R21); evidence rows .run/P32/t2a/evidence.json
2026-09-04 23:42:53 -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 c52190ca86 fix(phase-32): T1b (1) — jr_isolate_all keys a bodiless typedef struct Tag Alias; by the ALIAS (§497); ov_SC02_017 dry-run REFUSED -> CLEAN, no source rename
- _type_names returned the TAG for `typedef struct Rec801806C8_s Rec801806C8;`, so the typedef block and the
  tag's own packed struct definition collided under one key with different bodies and the R43 "CONFLICTING
  bodies — a rename is needed" refusal fired on legal C. Now keyed by the alias (_TYPEDEF_TAG_ALIAS); the
  `carried` set learns the alias; `typedef struct X X;` (alias == tag) keeps the old key so a second one
  still dedupes/refuses. Unit control on 7 block shapes PASS; ov_SC02_017 --only func_80186C64 --dry-run:
  2 region files, no carve repoints. cookbook §497; SETUP row.
2026-09-04 23:24:02 -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 7fbdb8fd63 fix(phase-31): S80 #9c — the permuter could not permute a PINNED seed, and it was our instrument: hide_asm carried only the __asm__ spelling (3 S79 seeds use asm("$7")), permuter_ils warm-restarted from the DECODED waypoint (raw pins back in base.c → cycles 2..N were silent parser refusals reported "(unchanged)"), and defines_fn refused K&R-style definitions (436 stored backlog drafts kept out of the lane for four phases). Fixed + R39-controlled over 5,311 drafts (the bare word asm in INCLUDE_ASM path strings was a caught false positive): re-hide every waypoint, assert the definition survived, abort exit-2 on a refusal (R61a), flushed logs (R55). Every S79 pinned seed now iterates; ov_SC06_022:func_8017DF28 (pinned WALL, closeness 2) reached 1 in its first cycle. cookbook §493 S80 correction + §494 v1 (S79 idioms); SETUP rows (p16_permute/permuter_ils, agent_verdicts.py) 2026-09-04 20:59:35 -06:00
Drew T 2709321082 docs(phase-31): S79 HANDOFF checkpoint mid-task #9 — 7 banks this task (open stubs 51 -> 25 this session), plateaus with residuals named, 11 drafting agents still running; tools/agent_verdicts.py extracts their final JSON verdicts from the subagent transcripts for the fresh session to aggregate (procedure + paths in the 🛑 block) 2026-09-04 19:50:01 -06:00
Drew T a0139c31c8 docs(phase-31): S79 #8 close — cookbook §493 (the permuter route end-to-end; the D-NEAR ledger), p16_permute surfaces the permuter's parser refusals, SETUP row, census 31, report, checkpoint (task #9 brief)
Stubs 32 -> 31 after the func_80015760 bank (commit:3877); R22 fleet 213/213 (.run/S79_check_all_8.log);
main game-code 93.5% (38,854 / 41,534). Permuter ILS plateaus recorded with their residual named:
func_80015608 best 1, func_80039B20 best 7, func_80038698 pinned seed refused (11). The ILS runner
had reported "no waypoint" for 8 cycles in 20 s on a seed the permuter's C parser rejects; it now
prints [permuter] REFUSED and leaves PERMUTER_REFUSED.txt (positive-controlled on func_80038698).
2026-09-04 18:50:20 -06:00
Drew T 595fc9fa49 docs(phase-31): S79 #6 close — cookbook §491 (the mechanical class: a phantom stub, two jtbl twins, one clone; three tool gaps), jtbl_pads_fix regex fix (+positive control), SETUP rows, census 35, checkpoint refreshed (task #7 brief)
Stubs 38 -> 35 after the #6 banks (commit:3868 commit:3869 commit:3870 commit:3871); R22 fleet 213/213
(.run/S79_check_all_6.log); frontier_classify 35 rows (main 16, md_MAIN_003 5, resident 2, ov 12).
jtbl_pads_fix's PAD_ERR_MORE regex carried jtbl_rodata_pads' old wording and reported "no
pad-count drift" over a red build; it now accepts both spellings and, positive-controlled with a
deliberately short spec, reports "emits >4 table(s), spec declares 4". The deferred carves and
their blockers are itemised in §491 and in the checkpoint's task #7 brief.
2026-09-04 18:19:57 -06:00