From 61806c8a31e51e055e8eac3c7d21986f1f8fe632 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sat, 15 Aug 2026 03:33:16 -0600 Subject: [PATCH] =?UTF-8?q?chore(phase-31):=20checkpoint=20=E2=80=94=20mai?= =?UTF-8?q?n=20open=20(4=20banked),=20wave=20I=2044/44,=20tooling=20debt?= =?UTF-8?q?=20logged;=20wave=20J=20(main)=20in=20flight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .run/backlog.jsonl | 11 +++++++++++ docs/progress.fleet.md | 18 +++++++++--------- phase-ends/CURRENT_PHASE.md | 9 +++++++++ 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/.run/backlog.jsonl b/.run/backlog.jsonl index 8bcb97d7e9..64388b7be2 100644 --- a/.run/backlog.jsonl +++ b/.run/backlog.jsonl @@ -1741,3 +1741,14 @@ {"ts": "2026-08-15 02:44:07", "addr": "0x80186178", "name": "func_80186178", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": ".run/backlog_drafts/func_80186178.c", "binary": "ov_SC02_005", "source": "worker", "residual": null, "passes_tried": null} {"ts": "2026-08-15 02:44:07", "addr": "0x8018d144", "name": "func_8018D144", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8018D144.c", "binary": "ov_SC02_005", "source": "worker", "residual": null, "passes_tried": null} {"ts": "2026-08-15 02:44:07", "addr": "0x8018fc38", "name": "func_8018FC38", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8018FC38.c", "binary": "ov_SC02_005", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 02:54:55", "addr": "0x8001cb00", "name": "func_8001CB00", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8001CB00.c", "binary": "main", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 02:57:31", "addr": "0x8001cb00", "name": "func_8001CB00", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8001CB00.c", "binary": "main", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:13:43", "addr": "0x8017d8e0", "name": "func_8017D8E0", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": ".run/backlog_drafts/func_8017D8E0.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:13:43", "addr": "0x8017eb34", "name": "func_8017EB34", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EB34.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:13:43", "addr": "0x8017ec68", "name": "func_8017EC68", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EC68.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:15:00", "addr": "0x8017d8e0", "name": "func_8017D8E0", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": ".run/backlog_drafts/func_8017D8E0.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:15:00", "addr": "0x8017eb34", "name": "func_8017EB34", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EB34.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:15:00", "addr": "0x8017ec68", "name": "func_8017EC68", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EC68.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:16:07", "addr": "0x8017d8e0", "name": "func_8017D8E0", "reach": null, "klass": null, "nins": null, "status": "failed", "closeness": null, "where_stuck": "won't compile standalone (loose-typing / missing decl)", "best_draft": ".run/backlog_drafts/func_8017D8E0.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:16:07", "addr": "0x8017eb34", "name": "func_8017EB34", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EB34.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} +{"ts": "2026-08-15 03:16:07", "addr": "0x8017ec68", "name": "func_8017EC68", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 0, "where_stuck": "match_one MATCH but the whole-binary gate rejected \u2014 CAUSE NOT DETERMINED. FIRST re-derive the destination TU from the asm subdir: asm//nonmatchings//.s => src//.c (the third path component IS the TU). Only then look for a decl conflict or a codegen residual.", "best_draft": ".run/backlog_drafts/func_8017EC68.c", "binary": "ov_SC07_007", "source": "worker", "residual": null, "passes_tried": null} diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index e67b23fd7e..8677e4936d 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -4,21 +4,21 @@ # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. # THREE progress metrics (all matter — see the labels): -FLEET fn-count byte-ident: 351405 / 363163 = 96.76% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) -FLEET instr-weighted : 12897344 / 13523865 = 95.4% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number) -FLEET distinct-code(uniq): 5279625 / 5851972 = 90.2% (81631/90929 unique fns; the DISTINCT-RE number) -MAIN game-code weighted : 436 / 79510 = 0.5% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift) - (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12896908 / 13444355 = 95.9%) +FLEET fn-count byte-ident: 351450 / 363163 = 96.77% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 12898935 / 13523865 = 95.4% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 5281141 / 5851972 = 90.2% (81670/90929 unique fns; the DISTINCT-RE number) +MAIN game-code weighted : 545 / 79510 = 0.7% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; LINKED-excluding Ghidra sig dated 2026-08-05; caveat is R34: no independent second oracle for a PS-X EXE, NOT drift) + (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12898390 / 13444355 = 95.9%) -FLEET REAL substantive : 349235 (of which dedup-shared 254534 via 2105 groups / 254610 instances) +FLEET REAL substantive : 349280 (of which dedup-shared 254534 via 2105 groups / 254610 instances) FLEET LINKED PsyQ objs : 959 FLEET NON_MATCHING : 7 (0 in any default build — G4) -FLEET INCLUDE_ASM stubs : 11751 +FLEET INCLUDE_ASM stubs : 11706 FLEET matchable : 363163 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | |---|---:|---:|---:|---:|---:|---:| -| main | 54 | 2 | 959 | 1055 | 2096 | 50.3% | +| main | 58 | 2 | 959 | 1059 | 2096 | 50.5% | | resident | 129 | 0 | 0 | 131 | 145 | 90.3% | | md_MAIN_001 | 1 | 0 | 0 | 1 | 11 | 9.1% | | md_MAIN_003 | 3 | 0 | 0 | 3 | 60 | 5.0% | @@ -226,7 +226,7 @@ FLEET matchable : 363163 | ov_SC07_001 | 2407 | 1807 | 0 | 2409 | 2454 | 98.2% | | ov_SC07_002 | 2467 | 1807 | 0 | 2471 | 2579 | 95.8% | | ov_SC07_006 | 2330 | 1625 | 0 | 2410 | 2456 | 98.1% | -| ov_SC07_007 | 2354 | 1660 | 0 | 2438 | 2612 | 93.3% | +| ov_SC07_007 | 2395 | 1660 | 0 | 2479 | 2612 | 94.9% | | ov_SC07_008 | 2386 | 1806 | 0 | 2386 | 2386 | 100.0% | | ov_SC07_009 | 2400 | 1806 | 0 | 2402 | 2430 | 98.8% | | ov_SC07_010 | 2324 | 1682 | 0 | 2406 | 2523 | 95.4% | diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index bb55c59647..5bcd34112a 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -67,6 +67,8 @@ R22 clean-fleet **213/213** after every banked batch · tools-health green · 0 | C | tell 11 + weak 24 | 35 | **35 (100%)** | **32** (8 propagated ×2) | ~2.39M | ~75k | Law 4 in-prompt → 0 symbol fails, 91% gate; **weak lane 24/24 on haiku — the 890-card vein is live**; 3 NEAR → grinder | | E-probe | mass/main (6) | 6 | 4 (67%) | **0** | ~474k | — | **main is agent-draftable but LINK-BLOCKED**: 1 byte-correct fn ⇒ 2-byte whole-EXE diff, a `jal` retargeted game-code→PsyQ-archive symbol. Not a matching wall. `gate_lane` main-blindness fixed en route | | D | adapt (48) | 48 | **47 (98%)** | **45** (40 main gate + 5 late-repair, 2 gates) | ~4.48M | **~100k** | repair stage rescued 5/6 first-pass DIFFs → gate them in a SECOND slate (the first slate is built before the repair stage lands); 23 gate groups for 42 drafts = the throughput ceiling → `build_wave_atlas.py` now packs by **(binary,TU)** = the real gate-group key; 1 NEAR at **close=1 DELAY-SLOT** → grinder | +| **MAIN** | **mass/atlas main probe (4 drafts, re-gated CLEAN)** | 4 | 4 | **4 BANKED — the first main-EXE functions of the campaign** | $0 (re-used the wave-E probe drafts) | — | `func_80013228`/`func_8001CB00`/`func_800142C8` (src/800.c) + `func_8001099C` (src/boot.c, -O0). `make clean && make extract BINARY=main && make build BINARY=main` → **143dbb89 BYTE-IDENTICAL**. These are the SAME drafts the incremental gate rejected 0/4 — the drafts were right, the gate path was wrong | +| I | mass/atlas (44) | 44 | **44/44 = 100%** / 1,602 ins, symfix clean ×44 | **44 BANKED**, ONE gate group | ~4.27M | ~97k | Second perfect sweep; 41 of 44 drawn by **haiku**. Gate reported `0/0/0` twice — an unreported `gate_stage` CRASH (`corpus.CorpusError`: 16 missing `.s`, fallout from MY `make clean`), not a result. Binary then built byte-identical with all 44 substituted; R22 213/213 confirmed (batch included a fleet-shared `engine_core.h` arity fix) | | H | mass/atlas (40) | 40 | **38 (95%)** / 1,820 of 1,902 ins | **34** of 38, ONE gate group | ~5.05M | ~149k | 2 NEARs banked as permuter fuel with strong diagnoses. **SAFETY FINDING: a `register __asm__("$2")` PIN CAN BE A CORRECTNESS BUG, not just a scheduling choice** — on `func_80182EB0` a value was written before a call and read after it; the hard-reg pin made gcc treat the pre-call store as dead across the call and **silently DROP** `addiu v0,zero,-1` (49 vs 50 ins), then read garbage. Dropping the pin + storing the constant directly before the call recovered it and closed 19/25. Pins are our most-used lever — this failure mode needs a cookbook note | | G | mass/atlas (36) | 36 | **36/36 = 100%** (independently re-verified) / 2,554 ins | **32** of 33 gated **in ONE gate group**; fleet 95.3→**95.4%** | ~3.16M | ~99k | **Best draft rate of the campaign, on FRESH CRACKS.** 3 held by the symfix audit for inventing symbol names where the target calls **PsyQ `RotTransSV`/`RotMatrixY`** — the just-fixed non-hex handling earned its keep immediately (pre-fix, one such name crashed the whole audit). Pattern: agents reconstruct the CODE reliably and guess PsyQ SYMBOL NAMES unreliably; the deterministic audit is what catches it | | F | **mass/atlas (60)** — the TU-packed experiment | 60 | **55 (91%)** pre-repair → **59/60** post-repair / 3,508 ins | **56** total (50 + 6 stragglers) of 60, **1 rebuild each** | ~7.16M | ~143k | **THE WAVE SHAPE FOR THE REST OF THE CAMPAIGN.** Fresh-crack lane (no proven body to edit) converts like the seeded lanes; ~3× mass/card (avg 48 ins vs 12–42); **1 rebuild for 50 banks** vs wave D's 23 rebuilds for 45. 2 genuine STALE (agents invented `S80131E00`/`Mat32_…` where the target calls **PsyQ `Square0`/`RotMatrixY`**) held back; 5 "local-only" flags are just local type names (harmless). Straggler batch pending: the repair stage rescued ~6 more AFTER the slate was built (same lesson as wave D — **build the slate after the repair stage lands**) | @@ -124,6 +126,13 @@ R22 clean-fleet **213/213** after every banked batch · tools-health green · 0 1. **Reach is spent: ~1.25×.** 32 wave-C exemplars → only 8 had a sharer, ×2 each. The ×134 era ended in P25/29/30. Fleet-% now moves ~1:1 with functions banked ⇒ **throughput is the lever**, and the throughput bottleneck is the GATE, whose cost scales with **(binary,TU) groups, not drafts** (wave C: 35 drafts/27 groups; wave D: 42/23). `tools/build_wave_atlas.py` (NEW) concentrates a wave into few binaries (96 drafts → 1 group) and weights by instruction mass — **use it for every future wave**; the adapt/weak card piles are the 12–42-ins tail (~0.011pp fleet per 48-card wave ≈ 440 waves to finish). 2. **main is BLOCKED on a LINK defect, not on matching** (see Blockers). `--exclude-bins main` is the default in `build_wave_atlas.py`. +**🔑 THE NIGHT'S HEADLINE — MAIN IS OPEN (2026-08-15).** main (79,510 weighted ins, was 0.5%) was NOT blocked by a linker defect; that was my misdiagnosis off an uncontrolled measurement. It needs a **CLEAN REBUILD** to gate (`make clean && make extract BINARY=main && make build BINARY=main`), because main's extract runs the EXE-only `psyq_integrate`/`ld_interleave` steps that rewrite the `.ld` — exactly the trap **R22's own rationale** describes. **4 main functions are banked** (byte-identical, full clean build), drafted by the ordinary mass lane. **NEXT SESSION'S HIGHEST-VALUE TASK: give the main gate path a clean-rebuild mode** (one clean build verifies a whole BATCH — that is how 4 banked at once), then run main waves as ordinary campaign fuel. main has ~1,030 open stubs. + +**⚠️ TOOLING DEBT FOUND TONIGHT (fix before the next long run):** +1. **`gate_lane` swallows `gate_stage`'s stderr** — it reported `banked 0, near 0, failed 0` twice while `gate_stage` was actually raising `corpus.CorpusError`. An unreported crash is indistinguishable from an honest empty result. It must surface stderr and distinguish CRASH from NOTHING-BANKED. (Running `gate_stage` directly gave the precise cause instantly.) +2. **`aprop_symfix` false-positives on LOCAL identifiers** (typedefs, inline-asm macro names) and its draft-symbol extraction misses some `extern` forms → it reported `STALE`/`AMBIGUOUS` for 3 drafts that were already correct. **Symfix is ADVISORY; the gate is the arbiter** — never withhold a standalone-MATCH draft on a flag alone. +3. **Never `make clean` mid-campaign** without immediately re-running `make extract-all` — it wipes every binary's `asm/` and every downstream tool then fails in confusing ways (cost 2 gate cycles tonight). + **RESUME STEPS:** 1. `pgrep -f tools/gate_lane` — never run two gates, and never run `build_wave*.py` during one (R35 guard: `corpus.stubs()` misreports substituted drafts). 2. Gate the late-repaired wave-D drafts: `.run/wave_p31d_late_slate.json` (5 verified MATCH, rescued by the repair stage after the main slate was built).