mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-30 07:31:59 -04:00
feat(phase-31): wave D banked 45/48 + main link-blocker diagnosed; selector packs by gate group
- wave D (48 adapt cards): 47/48 standalone, 45 BANKED across two gates (40 + 5 late-repair). Operational lesson: build the gate slate AFTER the repair stage lands — the first slate was built early and 5 rescued drafts needed a second gate. - wave C (35: 11 tell + 24 weak): 32 banked, 91% gate. Weak lane proven 24/24 on haiku. - MAIN BLOCKER DIAGNOSED (the night's most valuable finding): main drafts are byte-correct yet gate 0/4. Byte-diff of the built EXE = exactly 2 bytes in 413,696, NOT in the drafted fn: a jal at 0x80060E74 retargets func_80061FA8 (game code, 800c2.o) -> firstfile (PsyQ libapi A66.o). Adding one C fn perturbs symbol resolution between game code and the LINKED PsyQ archives. main is an INTEGRATION wall, not a matching wall -> its own lane; excluded from build_wave_atlas by default. - build_wave_atlas.py now packs by (binary, TU) — the REAL gate-group key, since each group is one whole-binary rebuild (wave D: 42 drafts / 23 groups = the throughput ceiling). - 3 NEARs enqueued as grinder fuel incl. func_80183578 at close=1 DELAY-SLOT (§60a precedent).
This commit is contained in:
@@ -1721,3 +1721,10 @@
|
||||
{"ts": "2026-08-14 23:12:40", "addr": "0x80189680", "name": "func_80189680", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_80189680.c", "binary": "ov_SC03_014", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-14 23:23:38", "addr": "0x80181270", "name": "func_80181270", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_80181270.c", "binary": "ov_SC04_018", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-14 23:27:45", "addr": "0x801802bc", "name": "func_801802BC", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_801802BC.c", "binary": "ov_SC06_008", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-14 23:53:12", "addr": "0x80013228", "name": "func_80013228", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_80013228.c", "binary": "main", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-14 23:53:12", "addr": "0x800142c8", "name": "func_800142C8", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_800142C8.c", "binary": "main", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-14 23:53:12", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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-14 23:54:36", "addr": "0x8001099c", "name": "func_8001099C", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_8001099C.c", "binary": "main", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-15 00:03:07", "addr": "0x80181cf0", "name": "func_80181CF0", "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/<ov>/nonmatchings/<TU_stem>/<fn>.s => src/<ov>/<TU_stem>.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_80181CF0.c", "binary": "ov_SC02_041", "source": "worker", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-15 00:06:08", "addr": "0x80183578", "name": "func_80183578", "reach": null, "klass": "DELAY-SLOT", "nins": null, "status": "near", "closeness": 1, "where_stuck": "close=1: idx13 target has 'addu $a0,$s0,$zero' in the jal-to-func_801848DC delay slot, draft emits nop. Two-predecessor merge block (sched.md D1/D2/D3) so no in-block filler exists. Agent ruled out (byte-tested): explicit arg to func_801848DC (any prototype style) -> +3 ins; uninitialized-junk arg -> right shape but lands $a1 not $s0; De Morgan rewrite -> WIDTH blowup. \u00a760a precedent: func_80181F78 close=1 DELAY-SLOT banked by grinder in ~6min. PRIME PERMUTER SEED.", "best_draft": ".run/wave_p31d/ov_SC04_018/func_80183578.c", "binary": "ov_SC04_018", "source": "p31-waveD-adapt", "residual": null, "passes_tried": null}
|
||||
{"ts": "2026-08-15 00:09:32", "addr": "0x8017d698", "name": "func_8017D698", "reach": null, "klass": null, "nins": null, "status": "near", "closeness": 13, "where_stuck": "residual: 13 mismatch", "best_draft": ".run/backlog_drafts/func_8017D698.c", "binary": "ov_SC04_003", "source": "worker", "residual": [[8, "10400008 beqz\tv0,44 <func_8017D698+0x44>", "1040000b beqz $v0, .L8017D6E8"], [9, "00000000 nop", "00001021 addu $v0, $zero, $zero"], [12, "14400004 bnez\tv0,44 <func_8017D698+0x44>", "14400007 bnez $v0, .L8017D6E8"], [13, "24020002 li\tv0,2", "00001021 addu $v0, $zero, $zero"], [16, "a4620002 sh\tv0,2(v1)", "0c05e2fe jal func_80178BF8"], [17, "8fbf0014 lw\tra,20(sp)", "a4620002 sh $v0, 0x2($v1)"], [18, "8fb00010 lw\ts0,16(sp)", "3c028017 lui $v0, %hi(func_80172710)"], [19, "27bd0018 addiu\tsp,sp,24", "24422710 addiu $v0, $v0, %lo(func_80172710)"], [20, "03e00008 jr\tra", "8fbf0014 lw $ra, 0x14($sp)"], [21, "00000000 nop", "8fb00010 lw $s0, 0x10($sp)"], [22, "--", "27bd0018 addiu $sp, $sp, 0x18"], [23, "--", "03e00008 jr $ra"], [24, "--", "00000000 nop"]], "passes_tried": null}
|
||||
|
||||
+879
-876
File diff suppressed because it is too large
Load Diff
+39
-39
@@ -4,16 +4,16 @@
|
||||
# cross-binary collapsible-byte leverage: docs/duplicates.cross.md.
|
||||
|
||||
# THREE progress metrics (all matter — see the labels):
|
||||
FLEET fn-count byte-ident: 351202 / 363163 = 96.71% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
|
||||
FLEET instr-weighted : 12888121 / 13523865 = 95.3% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
|
||||
FLEET distinct-code(uniq): 5271237 / 5851972 = 90.1% (81461/90929 unique fns; the DISTINCT-RE number)
|
||||
FLEET fn-count byte-ident: 351278 / 363163 = 96.73% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay)
|
||||
FLEET instr-weighted : 12889884 / 13523865 = 95.3% (shipped .text across main + resident + 211 overlays; the decomp.dev-DISPLAY number)
|
||||
FLEET distinct-code(uniq): 5272213 / 5851972 = 90.1% (81506/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: 12887685 / 13444355 = 95.9%)
|
||||
(fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 12889448 / 13444355 = 95.9%)
|
||||
|
||||
FLEET REAL substantive : 349032 (of which dedup-shared 254465 via 2072 groups / 254541 instances)
|
||||
FLEET REAL substantive : 349108 (of which dedup-shared 254528 via 2102 groups / 254604 instances)
|
||||
FLEET LINKED PsyQ objs : 959
|
||||
FLEET NON_MATCHING : 7 (0 in any default build — G4)
|
||||
FLEET INCLUDE_ASM stubs : 11954
|
||||
FLEET INCLUDE_ASM stubs : 11878
|
||||
FLEET matchable : 363163
|
||||
|
||||
| binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % |
|
||||
@@ -91,25 +91,25 @@ FLEET matchable : 363163
|
||||
| md_SC07_003 | 18 | 0 | 0 | 18 | 100 | 18.0% |
|
||||
| md_SC07_004 | 43 | 0 | 0 | 43 | 315 | 13.7% |
|
||||
| ov_MAIN_012 | 2236 | 1689 | 0 | 2315 | 2403 | 96.3% |
|
||||
| ov_SC01_000 | 2390 | 1809 | 0 | 2390 | 2403 | 99.5% |
|
||||
| ov_SC01_000 | 2391 | 1809 | 0 | 2391 | 2403 | 99.5% |
|
||||
| ov_SC01_001 | 2401 | 1811 | 0 | 2403 | 2466 | 97.4% |
|
||||
| ov_SC01_004 | 2399 | 1802 | 0 | 2400 | 2414 | 99.4% |
|
||||
| ov_SC01_005 | 2439 | 1829 | 0 | 2439 | 2503 | 97.4% |
|
||||
| ov_SC01_006 | 2437 | 1829 | 0 | 2437 | 2503 | 97.4% |
|
||||
| ov_SC01_005 | 2441 | 1832 | 0 | 2441 | 2503 | 97.5% |
|
||||
| ov_SC01_006 | 2440 | 1832 | 0 | 2440 | 2503 | 97.5% |
|
||||
| ov_SC01_008 | 2400 | 1803 | 0 | 2402 | 2426 | 99.0% |
|
||||
| ov_SC01_009 | 2428 | 1803 | 0 | 2429 | 2507 | 96.9% |
|
||||
| ov_SC01_074 | 2400 | 1803 | 0 | 2402 | 2426 | 99.0% |
|
||||
| ov_SC01_077 | 2568 | 1764 | 0 | 2570 | 2586 | 99.4% |
|
||||
| ov_SC01_080 | 2426 | 1806 | 0 | 2426 | 2512 | 96.6% |
|
||||
| ov_SC01_084 | 2451 | 1811 | 0 | 2456 | 2579 | 95.2% |
|
||||
| ov_SC02_000 | 2534 | 1854 | 0 | 2534 | 2683 | 94.4% |
|
||||
| ov_SC02_003 | 2533 | 1854 | 0 | 2533 | 2683 | 94.4% |
|
||||
| ov_SC02_000 | 2536 | 1856 | 0 | 2536 | 2683 | 94.5% |
|
||||
| ov_SC02_003 | 2535 | 1856 | 0 | 2535 | 2683 | 94.5% |
|
||||
| ov_SC02_004 | 2391 | 1806 | 0 | 2391 | 2401 | 99.6% |
|
||||
| ov_SC02_005 | 2546 | 1802 | 0 | 2556 | 2927 | 87.3% |
|
||||
| ov_SC02_011 | 2647 | 1810 | 0 | 2657 | 2893 | 91.8% |
|
||||
| ov_SC02_005 | 2547 | 1802 | 0 | 2557 | 2927 | 87.4% |
|
||||
| ov_SC02_011 | 2648 | 1810 | 0 | 2658 | 2893 | 91.9% |
|
||||
| ov_SC02_015 | 2402 | 1808 | 0 | 2402 | 2414 | 99.5% |
|
||||
| ov_SC02_016 | 2485 | 1810 | 0 | 2488 | 2545 | 97.8% |
|
||||
| ov_SC02_017 | 2558 | 1810 | 0 | 2566 | 2732 | 93.9% |
|
||||
| ov_SC02_017 | 2559 | 1810 | 0 | 2567 | 2732 | 94.0% |
|
||||
| ov_SC02_021 | 2407 | 1808 | 0 | 2407 | 2437 | 98.8% |
|
||||
| ov_SC02_026 | 2513 | 1807 | 0 | 2519 | 2572 | 97.9% |
|
||||
| ov_SC02_027 | 2567 | 1828 | 0 | 2576 | 2692 | 95.7% |
|
||||
@@ -118,26 +118,26 @@ FLEET matchable : 363163
|
||||
| ov_SC02_035 | 2497 | 1806 | 0 | 2500 | 2520 | 99.2% |
|
||||
| ov_SC02_037 | 2339 | 1704 | 0 | 2421 | 2516 | 96.2% |
|
||||
| ov_SC02_039 | 2397 | 1806 | 0 | 2397 | 2416 | 99.2% |
|
||||
| ov_SC02_041 | 2493 | 1806 | 0 | 2496 | 2561 | 97.5% |
|
||||
| ov_SC03_001 | 2699 | 1807 | 0 | 2716 | 2869 | 94.7% |
|
||||
| ov_SC02_041 | 2495 | 1806 | 0 | 2498 | 2561 | 97.5% |
|
||||
| ov_SC03_001 | 2700 | 1807 | 0 | 2717 | 2869 | 94.7% |
|
||||
| ov_SC03_002 | 2551 | 1815 | 0 | 2566 | 2631 | 97.5% |
|
||||
| ov_SC03_003 | 2402 | 1806 | 0 | 2403 | 2423 | 99.2% |
|
||||
| ov_SC03_006 | 2571 | 1814 | 0 | 2580 | 2767 | 93.2% |
|
||||
| ov_SC03_006 | 2572 | 1814 | 0 | 2581 | 2767 | 93.3% |
|
||||
| ov_SC03_007 | 2470 | 1806 | 0 | 2474 | 2623 | 94.3% |
|
||||
| ov_SC03_010 | 2422 | 1807 | 0 | 2422 | 2471 | 98.0% |
|
||||
| ov_SC03_010 | 2423 | 1807 | 0 | 2423 | 2471 | 98.1% |
|
||||
| ov_SC03_011 | 2426 | 1807 | 0 | 2432 | 2527 | 96.2% |
|
||||
| ov_SC03_012 | 2391 | 1806 | 0 | 2392 | 2406 | 99.4% |
|
||||
| ov_SC03_013 | 2427 | 1807 | 0 | 2427 | 2493 | 97.4% |
|
||||
| ov_SC03_014 | 2598 | 1841 | 0 | 2598 | 2685 | 96.8% |
|
||||
| ov_SC03_015 | 2375 | 1841 | 0 | 2375 | 2468 | 96.2% |
|
||||
| ov_SC03_014 | 2598 | 1843 | 0 | 2598 | 2685 | 96.8% |
|
||||
| ov_SC03_015 | 2377 | 1843 | 0 | 2377 | 2468 | 96.3% |
|
||||
| ov_SC03_023 | 2404 | 1806 | 0 | 2405 | 2435 | 98.8% |
|
||||
| ov_SC03_024 | 2530 | 1813 | 0 | 2537 | 2641 | 96.1% |
|
||||
| ov_SC03_024 | 2531 | 1813 | 0 | 2538 | 2641 | 96.1% |
|
||||
| ov_SC03_028 | 2466 | 1807 | 0 | 2470 | 2664 | 92.7% |
|
||||
| ov_SC03_029 | 2505 | 1810 | 0 | 2515 | 2644 | 95.1% |
|
||||
| ov_SC03_030 | 2428 | 1811 | 0 | 2430 | 2495 | 97.4% |
|
||||
| ov_SC03_031 | 2449 | 1808 | 0 | 2452 | 2514 | 97.5% |
|
||||
| ov_SC03_089 | 2526 | 1811 | 0 | 2533 | 2581 | 98.1% |
|
||||
| ov_SC03_090 | 2542 | 1811 | 0 | 2550 | 2625 | 97.1% |
|
||||
| ov_SC03_090 | 2543 | 1811 | 0 | 2551 | 2625 | 97.2% |
|
||||
| ov_SC03_091 | 2557 | 1828 | 0 | 2565 | 2640 | 97.2% |
|
||||
| ov_SC03_092 | 2515 | 1811 | 0 | 2527 | 2588 | 97.6% |
|
||||
| ov_SC03_093 | 2530 | 1828 | 0 | 2534 | 2563 | 98.9% |
|
||||
@@ -164,16 +164,16 @@ FLEET matchable : 363163
|
||||
| ov_SC03_115 | 2437 | 1806 | 0 | 2439 | 2472 | 98.7% |
|
||||
| ov_SC03_116 | 2404 | 1806 | 0 | 2407 | 2438 | 98.7% |
|
||||
| ov_SC03_117 | 2484 | 1806 | 0 | 2490 | 2557 | 97.4% |
|
||||
| ov_SC03_118 | 2575 | 1840 | 0 | 2576 | 2684 | 96.0% |
|
||||
| ov_SC03_119 | 2569 | 1840 | 0 | 2570 | 2685 | 95.7% |
|
||||
| ov_SC03_118 | 2575 | 1843 | 0 | 2576 | 2684 | 96.0% |
|
||||
| ov_SC03_119 | 2572 | 1843 | 0 | 2573 | 2685 | 95.8% |
|
||||
| ov_SC03_121 | 2407 | 1807 | 0 | 2409 | 2459 | 98.0% |
|
||||
| ov_SC03_124 | 2597 | 1802 | 0 | 2617 | 2741 | 95.5% |
|
||||
| ov_SC03_125 | 2535 | 1815 | 0 | 2547 | 2588 | 98.4% |
|
||||
| ov_SC03_126 | 2405 | 1808 | 0 | 2405 | 2423 | 99.3% |
|
||||
| ov_SC03_126 | 2406 | 1809 | 0 | 2406 | 2423 | 99.3% |
|
||||
| ov_SC04_000 | 2479 | 1811 | 0 | 2488 | 2546 | 97.7% |
|
||||
| ov_SC04_002 | 2519 | 1806 | 0 | 2523 | 2636 | 95.7% |
|
||||
| ov_SC04_002 | 2520 | 1806 | 0 | 2524 | 2636 | 95.8% |
|
||||
| ov_SC04_003 | 2443 | 1813 | 0 | 2446 | 2502 | 97.8% |
|
||||
| ov_SC04_004 | 2475 | 1807 | 0 | 2477 | 2558 | 96.8% |
|
||||
| ov_SC04_004 | 2476 | 1807 | 0 | 2478 | 2558 | 96.9% |
|
||||
| ov_SC04_005 | 2512 | 1806 | 0 | 2518 | 2612 | 96.4% |
|
||||
| ov_SC04_006 | 2432 | 1812 | 0 | 2434 | 2454 | 99.2% |
|
||||
| ov_SC04_007 | 2503 | 1807 | 0 | 2507 | 2569 | 97.6% |
|
||||
@@ -184,10 +184,10 @@ FLEET matchable : 363163
|
||||
| ov_SC04_012 | 2402 | 1806 | 0 | 2403 | 2420 | 99.3% |
|
||||
| ov_SC04_015 | 2545 | 1807 | 0 | 2556 | 2611 | 97.9% |
|
||||
| ov_SC04_016 | 2403 | 1806 | 0 | 2405 | 2440 | 98.6% |
|
||||
| ov_SC04_018 | 2714 | 1861 | 0 | 2714 | 2857 | 95.0% |
|
||||
| ov_SC04_019 | 2706 | 1861 | 0 | 2706 | 2857 | 94.7% |
|
||||
| ov_SC04_018 | 2734 | 1880 | 0 | 2734 | 2857 | 95.7% |
|
||||
| ov_SC04_019 | 2723 | 1880 | 0 | 2723 | 2857 | 95.3% |
|
||||
| ov_SC04_020 | 2520 | 1815 | 0 | 2532 | 2567 | 98.6% |
|
||||
| ov_SC04_021 | 2403 | 1808 | 0 | 2403 | 2423 | 99.2% |
|
||||
| ov_SC04_021 | 2404 | 1809 | 0 | 2404 | 2423 | 99.2% |
|
||||
| ov_SC05_000 | 2407 | 1810 | 0 | 2410 | 2422 | 99.5% |
|
||||
| ov_SC05_001 | 2486 | 1807 | 0 | 2491 | 2574 | 96.8% |
|
||||
| ov_SC05_002 | 2431 | 1806 | 0 | 2434 | 2442 | 99.7% |
|
||||
@@ -196,13 +196,13 @@ FLEET matchable : 363163
|
||||
| ov_SC05_005 | 2439 | 1812 | 0 | 2440 | 2491 | 98.0% |
|
||||
| ov_SC05_006 | 2424 | 1807 | 0 | 2424 | 2430 | 99.8% |
|
||||
| ov_SC05_007 | 2436 | 1806 | 0 | 2441 | 2482 | 98.3% |
|
||||
| ov_SC05_008 | 2443 | 1806 | 0 | 2445 | 2543 | 96.1% |
|
||||
| ov_SC05_008 | 2444 | 1806 | 0 | 2446 | 2543 | 96.2% |
|
||||
| ov_SC05_009 | 2410 | 1806 | 0 | 2414 | 2438 | 99.0% |
|
||||
| ov_SC05_010 | 2454 | 1807 | 0 | 2458 | 2588 | 95.0% |
|
||||
| ov_SC05_011 | 2397 | 1806 | 0 | 2398 | 2409 | 99.5% |
|
||||
| ov_SC05_017 | 2672 | 1804 | 0 | 2683 | 2842 | 94.4% |
|
||||
| ov_SC05_017 | 2673 | 1806 | 0 | 2684 | 2842 | 94.4% |
|
||||
| ov_SC05_018 | 2553 | 1814 | 0 | 2566 | 2673 | 96.0% |
|
||||
| ov_SC05_019 | 2403 | 1808 | 0 | 2403 | 2423 | 99.2% |
|
||||
| ov_SC05_019 | 2404 | 1809 | 0 | 2404 | 2423 | 99.2% |
|
||||
| ov_SC06_000 | 2543 | 1817 | 0 | 2546 | 2691 | 94.6% |
|
||||
| ov_SC06_006 | 2433 | 1807 | 0 | 2434 | 2511 | 96.9% |
|
||||
| ov_SC06_008 | 2502 | 1808 | 0 | 2508 | 2542 | 98.7% |
|
||||
@@ -211,12 +211,12 @@ FLEET matchable : 363163
|
||||
| ov_SC06_013 | 2407 | 1806 | 0 | 2408 | 2425 | 99.3% |
|
||||
| ov_SC06_014 | 2418 | 1806 | 0 | 2420 | 2453 | 98.7% |
|
||||
| ov_SC06_015 | 2412 | 1806 | 0 | 2412 | 2421 | 99.6% |
|
||||
| ov_SC06_016 | 2455 | 1807 | 0 | 2457 | 2549 | 96.4% |
|
||||
| ov_SC06_016 | 2456 | 1807 | 0 | 2458 | 2549 | 96.4% |
|
||||
| ov_SC06_018 | 2551 | 1807 | 0 | 2558 | 2665 | 96.0% |
|
||||
| ov_SC06_020 | 2472 | 1808 | 0 | 2473 | 2518 | 98.2% |
|
||||
| ov_SC06_022 | 2523 | 1806 | 0 | 2531 | 2642 | 95.8% |
|
||||
| ov_SC06_024 | 2542 | 1806 | 0 | 2548 | 2667 | 95.5% |
|
||||
| ov_SC06_025 | 2454 | 1806 | 0 | 2459 | 2572 | 95.6% |
|
||||
| ov_SC06_025 | 2455 | 1806 | 0 | 2460 | 2572 | 95.6% |
|
||||
| ov_SC06_027 | 2392 | 1806 | 0 | 2393 | 2408 | 99.4% |
|
||||
| ov_SC06_029 | 2480 | 1807 | 0 | 2492 | 2662 | 93.6% |
|
||||
| ov_SC06_030 | 2415 | 1807 | 0 | 2415 | 2456 | 98.3% |
|
||||
@@ -224,10 +224,10 @@ FLEET matchable : 363163
|
||||
| ov_SC06_033 | 2531 | 1807 | 0 | 2538 | 2631 | 96.5% |
|
||||
| ov_SC07_000 | 2439 | 1811 | 0 | 2441 | 2521 | 96.8% |
|
||||
| ov_SC07_001 | 2407 | 1807 | 0 | 2409 | 2454 | 98.2% |
|
||||
| ov_SC07_002 | 2466 | 1807 | 0 | 2470 | 2579 | 95.8% |
|
||||
| ov_SC07_002 | 2467 | 1807 | 0 | 2471 | 2579 | 95.8% |
|
||||
| ov_SC07_006 | 2330 | 1625 | 0 | 2410 | 2456 | 98.1% |
|
||||
| ov_SC07_007 | 2352 | 1660 | 0 | 2436 | 2612 | 93.3% |
|
||||
| ov_SC07_007 | 2354 | 1660 | 0 | 2438 | 2612 | 93.3% |
|
||||
| ov_SC07_008 | 2386 | 1806 | 0 | 2386 | 2386 | 100.0% |
|
||||
| ov_SC07_009 | 2399 | 1806 | 0 | 2401 | 2430 | 98.8% |
|
||||
| ov_SC07_010 | 2323 | 1682 | 0 | 2405 | 2523 | 95.3% |
|
||||
| ov_SC07_009 | 2400 | 1806 | 0 | 2402 | 2430 | 98.8% |
|
||||
| ov_SC07_010 | 2324 | 1682 | 0 | 2406 | 2523 | 95.4% |
|
||||
| ov_SC07_011 | 2341 | 1659 | 0 | 2421 | 2448 | 98.9% |
|
||||
|
||||
@@ -65,6 +65,8 @@ R22 clean-fleet **213/213** after every banked batch · tools-health green · 0
|
||||
| grinder-1 | permuter | 10 | — | 0 | $0 | — | func_800CB4CC parked at best-1 (warmstart seed); queue enriched +59+6 records since |
|
||||
| C-probe | tell (3) | 3 | 1 (33%) | **1** | ~300k | ~300k | §174 **Law 4**: the TU's decl of YOUR OWN fn constrains the def sig — standalone MATCH gated 0/1 until canonical-sig + cast-at-use; tell attribution unreliable (2/3 residuals were a different class) |
|
||||
| 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 |
|
||||
|
||||
- 2026-08-14 — **CAMPAIGN OPEN (T10+, Ultracode).** Wave A: 24 adapt cards → 18/24 standalone (75%) → symfix-first (0 stale — the prompt-law worked) → gate **12 banked + 1 propagation** (~117k tok/bank e2e; stubs → 12,030). 6 NEARs (3 at close ≤3) enqueued to the grinder. Wave B (48 cards, all haiku, 29 binaries) launched with the decl-matching lesson. Grinder pass 1: 0/10 but func_800CB4CC at best-1.
|
||||
|
||||
@@ -75,10 +77,39 @@ R22 clean-fleet **213/213** after every banked batch · tools-health green · 0
|
||||
- **Pools are NOT spent (post-fix, honest): adapt 569 candidates, weak 890 candidates.**
|
||||
- **STRATEGIC (Drew's question "why are our waves so weak?" — he is right):** the card lanes I have been drawing from are the *mechanical leftovers* (12–42-ins cousins), ≈1,400 ins/wave against 612,325 open ins ≈ **0.23%/wave**. The Atlas already maps where the mass actually is: **head-crack 1,276 groups / 4,248 inst / 186,291 ins** (≈3.3 inst per group — a group head crack banks its members), **UNKNOWN 1,964 / 138,597**, extend-tell 575 / 76,730, redraft 280 / 46,769, jtbl-carve 190 / 45,673. And high-reach groups DO remain: gid `96f8b78ec8d3` = **265 instances / 6,084 ins** (integration lever, 31-ins exemplar), `75cec648ba15` = 116 inst / 3,002 ins, `152d63c1086d` = 64 inst / 1,559 ins. **Next: build the wave generator off `.run/atlas.json` groups (top instruction-mass first, routed by the group's measured lever) instead of the leftover card piles.**
|
||||
|
||||
## Blockers
|
||||
(none)
|
||||
- 2026-08-14 (resume session, cont. 2) — **THE TARGETING CORRECTION (Drew's "why are our waves so weak?" — he was right).** Measured the arithmetic: **635,744 ins open (4.7pp of fleet) across 11,994 fns**; the adapt/weak card piles I had been drawing are the 12–42-ins best-seeded tail ⇒ ~1,440 ins/wave = **0.011pp/wave ≈ 440 waves to finish**. The mass is elsewhere: cousin-multi 294k ins (avg 44), **cold 183k (avg 82, no seed)**, main-only 38k (avg 87). TWO fixes:
|
||||
1. **`tools/build_wave_atlas.py` (NEW)** — wave selection off `.run/atlas.json`, on two measured principles: **(a) gate cost scales with (binary,TU) GROUPS, not drafts** — each group is a whole-binary rebuild, and wave C was 35 drafts over 27 groups = 1.3 drafts/rebuild (~50 min of gate for 32 banks); the atlas selector concentrates a wave into few binaries (**96 drafts → 1 group**, ~70× the gate efficiency); **(b) mass beats count** for the instr-weighted metric. 7,430 draftable candidates available in the agent-lever bands.
|
||||
2. **`gate_lane` was STRUCTURALLY BLIND TO `main`** (R36/R33): it located a stub's home .c by `glob('src/<binary>/*.c')`, but main's sources live at `src/*.c` → every main draft grouped under `src=None`. Latent because **main has never been wave-gated** (main = 79,510 weighted ins at 0.5%, the largest coherent mass left). Fixed to derive from `corpus.stubs()[..].path`; NC'd 3 ways (still-open wave-C drafts 3/3 agree · overlay sample 96/96 agree · main now resolves `None`→`src/800.c`).
|
||||
- **MAIN PROBE (6 cards, R37 — never spend 96 agents on an unproven path): 4/6 standalone MATCH (67%)**, including the `-O0` boot-module fn `func_8001099C` (the main-specific trap: `asm/nonmatchings/boot` → `src/boot.c` is **-O0** per §6, so match_one needs `--o0`; flagged in the mass-lane prompt). **Main is agent-draftable.** Gate result pending.
|
||||
- **RULE VIOLATION CAUGHT (P9, recorded):** a wave-E agent wrote its body directly into `src/boot.c` instead of its draft dir — caught by `git status`, reverted, gate re-run clean. A dirty tree ABORTS the shared gate for the whole wave, so the wave prompt's HARD RULES were hardened (explicit "never write into the tree, not even to test; no state-changing git commands").
|
||||
- Wave D (48 adapt cards) drafted 47/48 concurrently — drafting and gating overlap safely (drafts land in `.run/`, the gate writes `src/`).
|
||||
|
||||
## 🛑 SESSION CHECKPOINT (FINAL for this session, 2026-08-14 — campaign mid-flight, resume in a fresh session)
|
||||
- 2026-08-14 (resume session, cont. 3) — **MAIN'S BLOCKER DIAGNOSED — it is LINK-LEVEL, not matching.** Main probe: 4/6 standalone MATCH (my independent re-verify; the workflow's own repair stage claimed 6/6 — the gate and my check disagree with the agents, R14), then **gate 0/4 banked, 4 near**. Reproduced one (`func_80013228`, a clean 27-ins `Square0` wrapper) through `harvest_verify` and byte-diffed the built EXE against the original: **exactly 2 bytes differ in 413,696**, and NOT inside the drafted function — a `jal` at **vaddr 0x80060E74** retargeted from **`func_80061FA8`** (game code, `build/src/800c2.o`) to **`firstfile`/`firstfile2`** (**PsyQ libapi object `build/psyq/apicard/A66.o`**, symbols.us.txt line: `firstfile2 = 0x80062248`). So adding ONE byte-correct C function to `src/800.c` perturbs **symbol resolution between game code and the LINKED PsyQ library objects** — the C is right; the link binds a call to a different definition. This is main-specific (main is the only binary with `psyq_integrate` archive objects, per the `ifeq ($(BINARY),main)` blocks) and explains why main has sat at 0.5%: it is an INTEGRATION wall, not a matching wall. **Main is NOT ready for bulk waves; it needs a named link-resolution investigation lane** (candidate leads: duplicate `.NON_MATCHING` symbol definitions visible in the map at both `Square0` and `func_80061FA8`; archive-member selection order when a new undefined ref appears in `src/800.o`). Recorded here + decision-log (R31). The 4 main drafts are preserved in `.run/wave_p31e/main/` as fuel for that lane.
|
||||
- 2026-08-14 — **Campaign returned to the lanes that bank.** Wave D (48 adapt cards) drafted; independent re-verify **42/48 MATCH (87.5%)**; 6 DIFF handed to the near/grinder path. Gating now.
|
||||
|
||||
## Blockers
|
||||
- **main (79,510 weighted ins @ 0.5%) is blocked on a LINK-RESOLUTION defect, not on matching** — see the 2-byte `jal` retarget above. Needs its own lane before any main wave is worth running. Overlay/md lanes are unaffected and continue to bank.
|
||||
|
||||
## 🛑 SESSION CHECKPOINT (REFRESHED 2026-08-15, overnight campaign mid-flight — do NOT close the phase)
|
||||
|
||||
**Phase 31 CONTINUES.** Overnight campaign running under Drew's "waves and banking all night long" directive (Opus 5, ultracode, 23-min cron heartbeat `be8fb48c` as the loop's safety net).
|
||||
|
||||
**This session's arc:** resume R22 213/213 → atlas regen (5,144 groups / 11,994 open) → wave-C probe (3 tell) → wave C (35: 11 tell + 24 weak) **32 banked** → main probe (6) **0 banked, blocker diagnosed** → wave D (48 adapt) **47/48 standalone, gating now**. Session banked ≈ **59+** (18 mechanical/probe + 32 wave C + wave D in flight).
|
||||
|
||||
**THE TWO STRATEGIC FINDINGS (read these first on resume):**
|
||||
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`.
|
||||
|
||||
**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).
|
||||
3. R22 (`make clean && make extract-all && make check-all` → 213/213), then commit (task + this log together).
|
||||
4. Next wave: `.venv/bin/python tools/build_wave_atlas.py .run/wave_p31f_cards.json 96 --max-bins 8` → convert to args (`{wavedir,cards_file,cards}`) → Workflow `scratchpad/p31_wave.js`. Lanes: `mass` (atlas), `adapt`/`weak` (`tools/build_wave.py <pool>`; adapt 569 + weak 890 candidates remain, both verified live after the predicate fix).
|
||||
5. Grinder queue has 3 fresh high-value seeds incl. **`func_80183578` close=1 DELAY-SLOT** (§60a precedent: a close=1 delay-slot banked in ~6 min) and `func_8017DAEC` count-exact 113=113.
|
||||
|
||||
**Watch-fors (all bit tonight):** agent self-reports run OPTIMISTIC — always re-verify with `match_one` yourself, then the gate (wave C claimed 35/35→32 banked; main probe claimed 6/6→I measured 4/6→0 banked). An agent once wrote its body straight into `src/boot.c` (reverted; prompt hardened) — a dirty tree ABORTS the shared gate. `pgrep -f` self-matches its own shell wrapper (invoke without `shell=True`). `corpus.stubs()` is **addr→Stub**, not names.
|
||||
|
||||
## (superseded) checkpoint — 2026-08-14 pre-overnight
|
||||
|
||||
**Phase 31 CONTINUES (campaign-to-ceiling; do NOT close).** Session totals: **65 banked** (17 mechanical @$0 + wave A 12+1prop @~117k tok/bank + wave B **35/37 gated, 95% conversion** @~88k tok/bank — the decl-matching lesson nearly eliminated integration failures). Stubs ≈ **11,995** (from 12,059). All banks byte-gated + committed; wave banks propagated where sharers existed.
|
||||
|
||||
|
||||
+30
-12
@@ -27,13 +27,18 @@ import corpus
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument('out')
|
||||
ap.add_argument('n', nargs='?', type=int, default=96)
|
||||
ap.add_argument('--max-bins', type=int, default=12, help='concentrate the wave in this many binaries')
|
||||
ap.add_argument("--max-bins", type=int, default=12, help="concentrate into this many GATE GROUPS (binary,TU)")
|
||||
ap.add_argument('--min-ins', type=int, default=0)
|
||||
ap.add_argument('--max-ins', type=int, default=120, help='above this the bulk ladder stops being honest')
|
||||
ap.add_argument('--levers', default='head-crack,seeded-crack,redraft,len-vein,integration,family-sweep,tiny-direct',
|
||||
help='agent-draftable levers; UNKNOWN/tell/jtbl/o0/cc1 need their own lanes')
|
||||
ap.add_argument('--atlas', default='.run/atlas.json')
|
||||
ap.add_argument('--exclude-bins', default='main',
|
||||
help='comma-separated binaries to skip. main is excluded BY DEFAULT: it is blocked '
|
||||
'on a link-resolution defect (a byte-correct C fn retargets a jal between game '
|
||||
'code and a linked PsyQ archive object), not on matching — see CURRENT_PHASE.md')
|
||||
a = ap.parse_args()
|
||||
EXCLUDE = {b for b in a.exclude_bins.split(',') if b}
|
||||
|
||||
busy = subprocess.run(['pgrep', '-f', 'tools/(gate_stage|dedup_propagate|gate_lane)'],
|
||||
capture_output=True, text=True)
|
||||
@@ -52,11 +57,19 @@ levers = set(a.levers.split(','))
|
||||
atlas = json.load(open(a.atlas))
|
||||
|
||||
_open = {}
|
||||
def is_open(binary, fn):
|
||||
def _stubmap(binary):
|
||||
if binary not in _open:
|
||||
# corpus.stubs() is addr -> Stub; the NAME lives on the record
|
||||
_open[binary] = {st.symbol for st in corpus.stubs(binary).values()}
|
||||
return fn in _open[binary]
|
||||
_open[binary] = {st.symbol: st for st in corpus.stubs(binary).values()}
|
||||
return _open[binary]
|
||||
|
||||
def is_open(binary, fn):
|
||||
return fn in _stubmap(binary)
|
||||
|
||||
def home_tu(binary, fn):
|
||||
"""The stub's home .c — this is the GATE GROUP KEY (gate_lane groups by (binary, src))."""
|
||||
st = _stubmap(binary).get(fn)
|
||||
return st.path if st else None
|
||||
|
||||
def model_for(nins):
|
||||
if nins <= 50: return 'haiku'
|
||||
@@ -72,12 +85,14 @@ for g in atlas['groups']:
|
||||
for m in g.get('members', []):
|
||||
fn, b, nins = m.get('name'), m.get('b'), m.get('nins') or 0
|
||||
if not fn or not b: skipped['no-name'] += 1; continue
|
||||
if b in EXCLUDE: skipped['excluded-binary'] += 1; continue
|
||||
if fn in taken: skipped['already-waved'] += 1; continue
|
||||
if not (a.min_ins <= nins <= a.max_ins): skipped['out-of-band'] += 1; continue
|
||||
if not is_open(b, fn): skipped['already-banked'] += 1; continue
|
||||
sub = corpus.asm_path(b, fn)
|
||||
if not sub: skipped['no-asm'] += 1; continue
|
||||
cands.append({
|
||||
'tu': home_tu(b, fn),
|
||||
'fn': fn, 'binary': b, 'lane': 'mass', 'model': model_for(nins), 'nins': nins,
|
||||
'addr': m.get('a'), 'sub': __import__('os').path.dirname(sub),
|
||||
'gid': g['gid'], 'lever': g['lever'], 'confidence': g.get('confidence'),
|
||||
@@ -86,24 +101,27 @@ for g in atlas['groups']:
|
||||
'seed_sim': seed.get('sim'),
|
||||
})
|
||||
|
||||
# principle 1: concentrate. rank binaries by how much draftable mass they hold, take the top K.
|
||||
by_bin = collections.defaultdict(list)
|
||||
# principle 1: CONCENTRATE ON GATE GROUPS. gate_lane groups by (binary, home .c) and each group
|
||||
# is one whole-binary rebuild, so drafts-per-GROUP is the throughput number that matters -- not
|
||||
# drafts per binary. Wave D was 42 drafts over 23 groups (1.8/group, ~40 min of gate).
|
||||
by_tu = collections.defaultdict(list)
|
||||
for c in cands:
|
||||
by_bin[c['binary']].append(c)
|
||||
ranked_bins = sorted(by_bin, key=lambda b: -sum(c['nins'] for c in by_bin[b]))[:a.max_bins]
|
||||
by_tu[(c['binary'], c['tu'])].append(c)
|
||||
ranked = sorted(by_tu, key=lambda k: -len(by_tu[k]))[:a.max_bins]
|
||||
|
||||
wave = []
|
||||
for b in ranked_bins: # principle 2: within a binary, mass first
|
||||
for c in sorted(by_bin[b], key=lambda c: -c['nins']):
|
||||
for k in ranked: # principle 2: within a group, mass first
|
||||
for c in sorted(by_tu[k], key=lambda c: -c['nins']):
|
||||
if len(wave) >= a.n: break
|
||||
wave.append(c)
|
||||
if len(wave) >= a.n: break
|
||||
|
||||
json.dump(wave, open(a.out, 'w'), indent=1)
|
||||
tot = sum(c['nins'] for c in wave)
|
||||
print(f"candidates {len(cands)} in {len(by_bin)} binaries (skipped {dict(skipped)})")
|
||||
print(f"candidates {len(cands)} in {len(by_tu)} gate groups (skipped {dict(skipped)})")
|
||||
ngroups = len({(c['binary'], c['tu']) for c in wave})
|
||||
print(f"-> wave {len(wave)} drafts / {tot} ins across {len({c['binary'] for c in wave})} binaries "
|
||||
f"= {len(wave)/max(len({c['binary'] for c in wave}),1):.1f} drafts per gate group")
|
||||
f"in {ngroups} GATE GROUPS = {len(wave)/max(ngroups,1):.1f} drafts per rebuild")
|
||||
if wave:
|
||||
print("models:", dict(collections.Counter(c['model'] for c in wave)))
|
||||
print("levers:", dict(collections.Counter(c['lever'] for c in wave)))
|
||||
|
||||
Reference in New Issue
Block a user