src(phase-36): T6 rung D banked — the four exemplars the permuter closed, tidied and byte-judged (R22 218/218)

- delever_permute --bank: 4 winners applied through delever --apply-body, each IDENTICAL on its own object; the winner is
  now TIDIED first (pycparser reprints a body it parsed: two-space indent and a corpse `;` where a statement was inlined
  away) and the tidy is judged like any other candidate, so the source keeps the tree's shape; parenthesisation and brace
  style are deliberately left to the formatting phase, over the whole tree at once
- a slip, named: --bank re-applied a permuter body over the ONE-LINE version rung R had already banked for
  func_80135D20; the clean text was restored through the oracle (label d1fix) and --bank now skips any body the ledger
  already calls LEVER-FREE
- --recipes is killable now: the oracle writes the candidate into the tree to compile it, so the original goes into
  inflight.json first (P35's rule: a tool restores from its own snapshot) — a killed run had left a candidate in src/
- rung R's R6 generalised from "assigned once, read once" to "dead after one read" (the lever rung D actually found:
  uVar5 is assigned in two branches and only one was inlined); it still does not reproduce that class's win, which is
  recorded as an open item rather than papered over
- lever_census: 33,953 sites (was 33,957), 0 UNMARKED; lever_progress snapshot "T6 d1"; R22 218 passed, 0 failed of 218
This commit is contained in:
Drew T
2026-09-09 12:21:42 -06:00
parent 8fac96651f
commit a2da99b130
13 changed files with 445 additions and 355 deletions
+24 -24
View File
@@ -72,15 +72,15 @@
"binaries": 218,
"classes": {
"A": {
"bodies": 10195,
"bodies": 10191,
"distinct_bodies": 1330,
"file_scope": 0,
"in_bodies": 20512,
"in_bodies": 20508,
"kinds": {
"pin": 20512
"pin": 20508
},
"marked": 20512,
"sites": 20512,
"marked": 20508,
"sites": 20508,
"tus": 2577,
"unmarked": 0
},
@@ -207,9 +207,9 @@
"coverage": {
"asm": {
"comment_dead": 6792,
"live": 43864,
"live": 43860,
"macro_block": 194,
"raw": 50850
"raw": 50846
},
"attribute": {
"comment_dead": 0,
@@ -225,9 +225,9 @@
},
"register": {
"comment_dead": 8587,
"live": 20562,
"live": 20558,
"macro_block": 18,
"raw": 29167
"raw": 29163
},
"volatile": {
"comment_dead": 2607,
@@ -237,7 +237,7 @@
}
},
"coverage_ok": true,
"elapsed_s": 35.5,
"elapsed_s": 36.4,
"generated": "2026-09-09",
"gte_levers": {
"direct": 362,
@@ -248,15 +248,15 @@
"via_macro": 100,
"what": "GTE ops whose clobbers exceed the canonical macro's (a scheduling steer): class-B levers INSIDE the headline number since T5 (2026-09-09), marked, 0 at the close"
},
"head": "1761a3125",
"head": "8fac96651",
"headers": 3181,
"levers_AB": {
"asm": 13445,
"bodies": 12578,
"bodies": 12574,
"distinct_bodies": 1758,
"marked": 33957,
"pins": 20512,
"sites": 33957,
"marked": 33953,
"pins": 20508,
"sites": 33953,
"unmarked": 0,
"what": "register pins + asm statements excluding GTE ops: the classes the phase drives to 0"
},
@@ -399,11 +399,11 @@
"$13": 6,
"$14": 139,
"$15": 1,
"$16": 1764,
"$17": 1358,
"$16": 1763,
"$17": 1357,
"$18": 464,
"$19": 588,
"$2": 3834,
"$2": 3832,
"$20": 286,
"$21": 408,
"$22": 7,
@@ -424,28 +424,28 @@
"v0": 2,
"v1": 5
},
"sites": 20512,
"sites": 20508,
"sp": 13,
"spelling": {
"__asm__": 20410,
"__asm__": 20406,
"asm": 102
},
"volatile_qualified": 134,
"zero": 1321
},
"src_stamp": "08cc85e727e5882a",
"src_stamp": "60ed465042fd2475",
"tus": 4121,
"unclassified": 0,
"union_AD": {
"bodies": 15827,
"bodies": 15823,
"by_kind": {
"main": 180,
"md": 182,
"ov": 15125,
"ov": 15121,
"resident": 12,
"shared": 328
},
"copies_in_multi": 14197,
"copies_in_multi": 14193,
"distinct_bodies": 2030,
"multi_copy_classes": 400
},
+12 -12
View File
@@ -1,31 +1,31 @@
lever_census: 218 binaries · 4,121 TUs + 3,181 headers · coverage OK · unclassified 0 · verbatim excluded 13 fn / 14 sites (manifest 13)
coverage asm raw 50850 = live 43864 + macro-block 194 + comment/dead 6792
coverage register raw 29167 = live 20562 + macro-block 18 + comment/dead 8587
coverage asm raw 50846 = live 43860 + macro-block 194 + comment/dead 6792
coverage register raw 29163 = live 20558 + macro-block 18 + comment/dead 8587
coverage volatile raw 4858 = live 2169 + macro-block 82 + comment/dead 2607
coverage builtin raw 599 = live 445 + macro-block 0 + comment/dead 154
coverage attribute raw 76 = live 76 + macro-block 0 + comment/dead 0
class sites in-bodies file-scope bodies distinct TUs marked unmarked kinds
A pins 20512 20512 0 10195 1330 2577 20512 0 {'pin': 20512}
B asm 22988 22975 13 9766 1063 2297 13711 9277 {'barrier': 4578, 'instruction': 1712, 'launder': 4680, 'keepalive': 2000, 'gte': 6858, 'gte-lever': 462, 'gte-unsigned': 3, 'asm-body': 13, 'verbatim-body': 2682}
C volatile 1722 1570 152 628 97 612 14 1708 {'decl-body': 58, 'decl-file': 152, 'cast': 1510, 'param': 2}
A pins 20508 20508 0 10191 1330 2577 20508 0 {'pin': 20508}
B asm 22988 22975 13 9766 1063 2297 13711 9277 {'barrier': 4578, 'launder': 4680, 'keepalive': 2000, 'instruction': 1712, 'gte': 6858, 'gte-lever': 462, 'gte-unsigned': 3, 'asm-body': 13, 'verbatim-body': 2682}
C volatile 1722 1570 152 628 97 612 14 1708 {'cast': 1510, 'decl-body': 58, 'decl-file': 152, 'param': 2}
D register 50 50 0 47 47 6 0 50 {'register': 50}
E asm-label 7428 1005 6423 737 117 2080 0 7428 {'asm-label': 7428}
F builtin 445 445 0 428 27 302 0 445 {'builtin': 445}
G attribute 76 1 75 1 1 40 0 76 {'attribute': 76}
UNION A–D: 15,827 bodies · 2,030 distinct (addresses normalized) · 400 multi-copy classes holding 14,197 bodies · by kind {'ov': 15125, 'main': 180, 'md': 182, 'shared': 328, 'resident': 12}
THE PHASE'S NUMBER (pins + asm statements, GTE excluded): 33,957 sites in 12,578 bodies (1,758 distinct) · marked !FAKE 33,957 · UNMARKED 0
UNION A–D: 15,823 bodies · 2,030 distinct (addresses normalized) · 400 multi-copy classes holding 14,193 bodies · by kind {'ov': 15121, 'main': 180, 'shared': 328, 'md': 182, 'resident': 12}
THE PHASE'S NUMBER (pins + asm statements, GTE excluded): 33,953 sites in 12,574 bodies (1,758 distinct) · marked !FAKE 33,953 · UNMARKED 0
orphan !FAKE markers (no pin/asm site on the line nor below): 0
GTE levers (clobbers beyond the canonical macro's): 462 sites (100 via a variant macro, 362 direct) · marked 462 · UNMARKED 0 · unsigned GTE statements 3
per-TU asm macro definitions outside the GTE header: 314 {'gte': 150, 'launder': 154, 'instruction': 9, 'barrier': 1} (GTE variants 64)
pins: 20,512 · $0 1,321 · $sp 13 · with initializer 2,776 · volatile-qualified 134 · bare-name 25 · spellings {'__asm__': 20410, 'asm': 102}
per-TU asm macro definitions outside the GTE header: 314 {'launder': 154, 'gte': 150, 'instruction': 9, 'barrier': 1} (GTE variants 64)
pins: 20,508 · $0 1,321 · $sp 13 · with initializer 2,776 · volatile-qualified 134 · bare-name 25 · spellings {'__asm__': 20406, 'asm': 102}
whole-body asm routines in C shells, manifest PERMANENT (hand asm, NOT levers): 22 routines · 2,682 sites (2,660 private copies + 22 shared headers); asm-bodies NOT permanent (levers): 13 site(s) ['func_8001E378:DECOMPILE-NOW', 'func_80020F34:DECOMPILE-NOW', 'func_800249F0:DECOMPILE-NOW', 'func_80025CBC:DECOMPILE-NOW', 'func_80026514:UNCERTAIN', 'func_800268D0:UNCERTAIN', 'func_80027058:DECOMPILE-NOW', 'func_80027200:DECOMPILE-NOW', 'func_800CBA44:DECOMPILE-NOW', 'func_8017D810:DECOMPILE-NOW', 'func_8017E26C:UNCERTAIN', 'func_80184440:DECOMPILE-NOW', 'func_801A3BCC:DECOMPILE-NOW']
asm kinds: {'asm-body/direct': 13, 'barrier/direct': 4576, 'barrier/via-macro': 2, 'gte/direct': 200, 'gte/via-macro': 6658, 'gte-lever/direct': 362, 'gte-lever/via-macro': 100, 'gte-unsigned/direct': 3, 'instruction/direct': 1690, 'instruction/via-macro': 22, 'keepalive/direct': 2000, 'launder/direct': 4236, 'launder/via-macro': 444, 'verbatim-body/direct': 2682}
instruction mnemonics: {'addu': 966, 'move': 406, 'la': 142, 'lh': 134, 'addiu': 22, 'RTP_SND': 22, '.section': 7, 'lui': 4, 'and': 2, 'mult': 1, 'mfhi': 1, 'sll': 1, 'li': 1, 'lw': 1, 'nop': 1, 'srl': 1}
gte mnemonics: {'gte_ldv0': 757, 'gte_stlvnl': 593, 'gte_stsxy': 447, 'gte_rtps': 437, 'gte_stflg': 415, 'gte_rtpt': 352, 'gte_SetRotMatrix': 246, 'gte_stsxy3': 236, 'gte_rtv0tr': 228, 'gte_SetTransMatrix': 226, 'gte_ldv3c': 184, 'gte_ldv3': 177, 'gte_ldrgb': 164, 'gte_stsv': 161, 'lwc2': 159, 'gte_stsz4': 149, 'gte_stsz3': 147, 'gte_stszotz': 134, 'gte_ldIR0z': 134, 'gte_ldIRGB': 134, 'gte_dpcl': 134, 'gte_stORGB': 134, 'gte_stsxy3_f3': 111, 'gte_stclmv': 108, 'gte_nclip': 108, 'gte_stopz': 108, 'gte_stsxy3c': 108, 'gte_stsxy3_ft3': 79, 'gte_rtir': 75, 'gte_ldclmv': 72}
asm-bearing macro definitions: 314 (20 names, 3 with >1 text) kinds {'gte': 150, 'launder': 154, 'instruction': 9, 'barrier': 1}
gte mnemonics: {'gte_ldv0': 757, 'gte_stlvnl': 593, 'gte_stsxy': 447, 'gte_rtps': 437, 'gte_stflg': 415, 'gte_rtpt': 352, 'gte_SetRotMatrix': 246, 'gte_stsxy3': 236, 'gte_rtv0tr': 228, 'gte_SetTransMatrix': 226, 'gte_ldv3c': 184, 'gte_ldv3': 177, 'gte_ldrgb': 164, 'gte_stsv': 161, 'lwc2': 159, 'gte_stsz4': 149, 'gte_stsz3': 147, 'gte_ldIR0z': 134, 'gte_ldIRGB': 134, 'gte_dpcl': 134, 'gte_stORGB': 134, 'gte_stszotz': 134, 'gte_stsxy3_f3': 111, 'gte_stclmv': 108, 'gte_nclip': 108, 'gte_stopz': 108, 'gte_stsxy3c': 108, 'gte_stsxy3_ft3': 79, 'gte_rtir': 75, 'gte_ldclmv': 72}
asm-bearing macro definitions: 314 (20 names, 3 with >1 text) kinds {'launder': 154, 'gte': 150, 'instruction': 9, 'barrier': 1}
controls (R39):
src/800.c func_800226C0 pins got 14 expected 45 N-A
src/shared/ov/func_80178004.h pins got 8 expected 26 N-A
ov_SC03_006 func_80184034 bare-name pins got 0 expected 3 N-A
engine_prelude.h asm sites (a macro definition only) got 0 expected 0 OK
elapsed 35.5 s
elapsed 36.4 s
+185 -185
View File
@@ -1,7 +1,7 @@
{
"head": "1761a3125",
"head": "8fac96651",
"stamp": "b44c5a8a3423",
"generated": "2026-09-09 11:47",
"generated": "2026-09-09 12:11",
"aliases": [
"main",
"ov_SC03_014",
@@ -21,207 +21,207 @@
"main": {
"objects": 85,
"identical": 85,
"seconds": 14.902999999999997,
"mean_s": 0.175
"seconds": 10.007000000000005,
"mean_s": 0.118
},
"ov_SC03_014": {
"objects": 32,
"identical": 32,
"seconds": 8.385,
"mean_s": 0.262
"seconds": 6.2040000000000015,
"mean_s": 0.194
},
"ov_SC03_015": {
"objects": 32,
"identical": 32,
"seconds": 8.013,
"mean_s": 0.25
"seconds": 6.201999999999998,
"mean_s": 0.194
},
"ov_SC04_011": {
"objects": 28,
"identical": 28,
"seconds": 7.434,
"mean_s": 0.266
"seconds": 5.154,
"mean_s": 0.184
}
},
"per_object_seconds": {
"build/src/800.o": 1.453,
"build/src/800_b.o": 0.227,
"build/src/800_b_2.o": 0.481,
"build/src/800_b_o0a.o": 0.155,
"build/src/800_c.o": 0.422,
"build/src/800b2.o": 0.178,
"build/src/apicard1.o": 0.134,
"build/src/apicard2.o": 0.282,
"build/src/apicard3.o": 0.147,
"build/src/apicard4.o": 0.15,
"build/src/apicard5.o": 0.155,
"build/src/apicard6.o": 0.175,
"build/src/apicard7.o": 0.14,
"build/src/boot.o": 0.174,
"build/src/gap.o": 0.175,
"build/src/libapi1.o": 0.133,
"build/src/libapi2.o": 0.078,
"build/src/libc2_1.o": 0.242,
"build/src/libc2_2.o": 0.084,
"build/src/libcd1.o": 0.109,
"build/src/libcd2.o": 0.244,
"build/src/libetc.o": 0.218,
"build/src/libgpu.o": 0.08,
"build/src/libgpu2.o": 0.213,
"build/src/libgs1.o": 0.088,
"build/src/libgs2.o": 0.086,
"build/src/libgs3.o": 0.096,
"build/src/libgs4.o": 0.088,
"build/src/libgs5.o": 0.152,
"build/src/libgs6.o": 0.14,
"build/src/libgs7.o": 0.082,
"build/src/libgs8.o": 0.11,
"build/src/libgte1.o": 0.11,
"build/src/libgte10.o": 0.131,
"build/src/libgte11.o": 0.129,
"build/src/libgte12.o": 0.107,
"build/src/libgte13.o": 0.1,
"build/src/libgte14.o": 0.119,
"build/src/libgte15.o": 0.08,
"build/src/libgte16.o": 0.174,
"build/src/libgte17.o": 0.132,
"build/src/libgte18.o": 0.151,
"build/src/libgte19.o": 0.084,
"build/src/libgte2.o": 0.287,
"build/src/libgte20.o": 0.102,
"build/src/libgte21.o": 0.12,
"build/src/libgte22.o": 0.091,
"build/src/libgte23.o": 0.279,
"build/src/libgte24.o": 0.142,
"build/src/libgte25.o": 0.204,
"build/src/libgte26.o": 0.121,
"build/src/libgte27.o": 0.112,
"build/src/libgte28.o": 0.089,
"build/src/libgte29.o": 0.132,
"build/src/libgte3.o": 0.145,
"build/src/libgte30.o": 0.114,
"build/src/libgte4.o": 0.123,
"build/src/libgte5.o": 0.09,
"build/src/libgte6.o": 0.218,
"build/src/libgte7.o": 0.09,
"build/src/libgte8.o": 0.278,
"build/src/libgte9.o": 0.104,
"build/src/libmcrd1.o": 0.201,
"build/src/libmcrd2.o": 0.101,
"build/src/libpad1.o": 0.134,
"build/src/libpad2.o": 0.187,
"build/src/sgap.o": 0.116,
"build/src/sgap_2.o": 0.105,
"build/src/sgap_3.o": 0.298,
"build/src/sgap_4.o": 0.277,
"build/src/sgap_5.o": 0.11,
"build/src/sgap_6.o": 0.107,
"build/src/sgap_8.o": 0.161,
"build/src/snd1.o": 0.125,
"build/src/snd10.o": 0.185,
"build/src/snd11.o": 0.348,
"build/src/snd12.o": 0.177,
"build/src/snd2.o": 0.157,
"build/src/snd3.o": 0.245,
"build/src/snd4.o": 0.159,
"build/src/snd5.o": 0.2,
"build/src/snd6.o": 0.17,
"build/src/snd7.o": 0.138,
"build/src/snd8.o": 0.118,
"build/src/snd9.o": 0.235,
"build/src/ov_SC03_014/ov_SC03_014.o": 0.207,
"build/src/ov_SC03_014/ov_SC03_014_after.o": 1.037,
"build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 1.11,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.118,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.09,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.398,
"build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.355,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.247,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.184,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.18,
"build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.264,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.157,
"build/src/800.o": 0.93,
"build/src/800_b.o": 0.094,
"build/src/800_b_2.o": 0.49,
"build/src/800_b_o0a.o": 0.105,
"build/src/800_c.o": 0.239,
"build/src/800b2.o": 0.117,
"build/src/apicard1.o": 0.079,
"build/src/apicard2.o": 0.128,
"build/src/apicard3.o": 0.093,
"build/src/apicard4.o": 0.106,
"build/src/apicard5.o": 0.092,
"build/src/apicard6.o": 0.083,
"build/src/apicard7.o": 0.161,
"build/src/boot.o": 0.159,
"build/src/gap.o": 0.082,
"build/src/libapi1.o": 0.091,
"build/src/libapi2.o": 0.066,
"build/src/libc2_1.o": 0.076,
"build/src/libc2_2.o": 0.063,
"build/src/libcd1.o": 0.09,
"build/src/libcd2.o": 0.087,
"build/src/libetc.o": 0.11,
"build/src/libgpu.o": 0.111,
"build/src/libgpu2.o": 0.174,
"build/src/libgs1.o": 0.133,
"build/src/libgs2.o": 0.065,
"build/src/libgs3.o": 0.069,
"build/src/libgs4.o": 0.114,
"build/src/libgs5.o": 0.065,
"build/src/libgs6.o": 0.086,
"build/src/libgs7.o": 0.076,
"build/src/libgs8.o": 0.153,
"build/src/libgte1.o": 0.082,
"build/src/libgte10.o": 0.073,
"build/src/libgte11.o": 0.07,
"build/src/libgte12.o": 0.077,
"build/src/libgte13.o": 0.156,
"build/src/libgte14.o": 0.091,
"build/src/libgte15.o": 0.062,
"build/src/libgte16.o": 0.078,
"build/src/libgte17.o": 0.067,
"build/src/libgte18.o": 0.157,
"build/src/libgte19.o": 0.1,
"build/src/libgte2.o": 0.097,
"build/src/libgte20.o": 0.066,
"build/src/libgte21.o": 0.069,
"build/src/libgte22.o": 0.071,
"build/src/libgte23.o": 0.073,
"build/src/libgte24.o": 0.09,
"build/src/libgte25.o": 0.14,
"build/src/libgte26.o": 0.096,
"build/src/libgte27.o": 0.12,
"build/src/libgte28.o": 0.092,
"build/src/libgte29.o": 0.14,
"build/src/libgte3.o": 0.118,
"build/src/libgte30.o": 0.107,
"build/src/libgte4.o": 0.188,
"build/src/libgte5.o": 0.199,
"build/src/libgte6.o": 0.182,
"build/src/libgte7.o": 0.106,
"build/src/libgte8.o": 0.09,
"build/src/libgte9.o": 0.111,
"build/src/libmcrd1.o": 0.104,
"build/src/libmcrd2.o": 0.109,
"build/src/libpad1.o": 0.088,
"build/src/libpad2.o": 0.077,
"build/src/sgap.o": 0.065,
"build/src/sgap_2.o": 0.101,
"build/src/sgap_3.o": 0.105,
"build/src/sgap_4.o": 0.085,
"build/src/sgap_5.o": 0.085,
"build/src/sgap_6.o": 0.109,
"build/src/sgap_8.o": 0.115,
"build/src/snd1.o": 0.077,
"build/src/snd10.o": 0.083,
"build/src/snd11.o": 0.086,
"build/src/snd12.o": 0.08,
"build/src/snd2.o": 0.08,
"build/src/snd3.o": 0.07,
"build/src/snd4.o": 0.154,
"build/src/snd5.o": 0.125,
"build/src/snd6.o": 0.082,
"build/src/snd7.o": 0.076,
"build/src/snd8.o": 0.129,
"build/src/snd9.o": 0.167,
"build/src/ov_SC03_014/ov_SC03_014.o": 0.153,
"build/src/ov_SC03_014/ov_SC03_014_after.o": 0.606,
"build/src/ov_SC03_014/ov_SC03_014_jr_8012ACE0.o": 0.529,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135888.o": 0.124,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135A4C.o": 0.084,
"build/src/ov_SC03_014/ov_SC03_014_jr_80135D20.o": 0.141,
"build/src/ov_SC03_014/ov_SC03_014_jr_801380E0.o": 0.194,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013C98C.o": 0.13,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013F350.o": 0.101,
"build/src/ov_SC03_014/ov_SC03_014_jr_8013FFD8.o": 0.1,
"build/src/ov_SC03_014/ov_SC03_014_jr_80140608.o": 0.233,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015444C.o": 0.082,
"build/src/ov_SC03_014/ov_SC03_014_jr_80154C24.o": 0.22,
"build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.197,
"build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.121,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.265,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.117,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.573,
"build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.473,
"build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.17,
"build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.256,
"build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.075,
"build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.143,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.089,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.223,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.311,
"build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.068,
"build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.381,
"build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.073,
"build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.072,
"build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.122,
"build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.089,
"build/src/ov_SC03_014/ov_SC03_014_jr_801588CC.o": 0.151,
"build/src/ov_SC03_014/ov_SC03_014_jr_80159C84.o": 0.14,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015A3C8.o": 0.088,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015AE2C.o": 0.155,
"build/src/ov_SC03_014/ov_SC03_014_jr_8015C32C.o": 0.613,
"build/src/ov_SC03_014/ov_SC03_014_jr_8016AB6C.o": 0.388,
"build/src/ov_SC03_014/ov_SC03_014_jr_80171B4C.o": 0.187,
"build/src/ov_SC03_014/ov_SC03_014_jr_801734BC.o": 0.238,
"build/src/ov_SC03_014/ov_SC03_014_jr_801789AC.o": 0.096,
"build/src/ov_SC03_014/ov_SC03_014_jr_80178D40.o": 0.138,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017A4AC.o": 0.086,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.o": 0.208,
"build/src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.o": 0.219,
"build/src/ov_SC03_014/ov_SC03_014_jr_80184440.o": 0.085,
"build/src/ov_SC03_014/ov_SC03_014_jr_801848E4.o": 0.337,
"build/src/ov_SC03_014/ov_SC03_014_o0b.o": 0.078,
"build/src/ov_SC03_014/ov_SC03_014_o0c.o": 0.086,
"build/src/ov_SC03_014/ov_SC03_014_o0d.o": 0.117,
"build/src/ov_SC03_014/ov_SC03_014_o0e.o": 0.097,
"build/src/ov_SC03_015/ov_SC03_015.o": 0.195,
"build/src/ov_SC03_015/ov_SC03_015_after.o": 0.723,
"build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.563,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.068,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.076,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.151,
"build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.417,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.288,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.087,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.216,
"build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.309,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.138,
"build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.244,
"build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.117,
"build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.091,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.084,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.131,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.712,
"build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.617,
"build/src/ov_SC03_015/ov_SC03_015_after.o": 0.623,
"build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o": 0.47,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135888.o": 0.083,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135A4C.o": 0.074,
"build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o": 0.15,
"build/src/ov_SC03_015/ov_SC03_015_jr_801380E0.o": 0.194,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013C98C.o": 0.127,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013F350.o": 0.107,
"build/src/ov_SC03_015/ov_SC03_015_jr_8013FFD8.o": 0.107,
"build/src/ov_SC03_015/ov_SC03_015_jr_80140608.o": 0.203,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015444C.o": 0.088,
"build/src/ov_SC03_015/ov_SC03_015_jr_80154C24.o": 0.249,
"build/src/ov_SC03_015/ov_SC03_015_jr_801588CC.o": 0.129,
"build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o": 0.142,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015A3C8.o": 0.093,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o": 0.163,
"build/src/ov_SC03_015/ov_SC03_015_jr_8015C32C.o": 0.607,
"build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o": 0.484,
"build/src/ov_SC03_015/ov_SC03_015_jr_80171B4C.o": 0.135,
"build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.323,
"build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.161,
"build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.146,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.084,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.314,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.329,
"build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.137,
"build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.442,
"build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.135,
"build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.134,
"build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.115,
"build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.331,
"build/src/ov_SC04_011/ov_SC04_011.o": 0.248,
"build/src/ov_SC04_011/ov_SC04_011_after.o": 0.666,
"build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.559,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.109,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.077,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.171,
"build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.439,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.259,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.161,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.19,
"build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.256,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.166,
"build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.26,
"build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.155,
"build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.162,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.271,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.161,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.523,
"build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.358,
"build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.223,
"build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.291,
"build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.115,
"build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.229,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.198,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.194,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.803,
"build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.089,
"build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.101
"build/src/ov_SC03_015/ov_SC03_015_jr_801734BC.o": 0.228,
"build/src/ov_SC03_015/ov_SC03_015_jr_801789AC.o": 0.07,
"build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o": 0.115,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017A4AC.o": 0.076,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o": 0.233,
"build/src/ov_SC03_015/ov_SC03_015_jr_8017EB7C.o": 0.225,
"build/src/ov_SC03_015/ov_SC03_015_jr_80184440.o": 0.09,
"build/src/ov_SC03_015/ov_SC03_015_jr_801848E4.o": 0.361,
"build/src/ov_SC03_015/ov_SC03_015_o0b.o": 0.09,
"build/src/ov_SC03_015/ov_SC03_015_o0c.o": 0.084,
"build/src/ov_SC03_015/ov_SC03_015_o0d.o": 0.098,
"build/src/ov_SC03_015/ov_SC03_015_o0e.o": 0.109,
"build/src/ov_SC04_011/ov_SC04_011.o": 0.139,
"build/src/ov_SC04_011/ov_SC04_011_after.o": 0.511,
"build/src/ov_SC04_011/ov_SC04_011_jr_8012ACE0.o": 0.437,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135888.o": 0.058,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135A4C.o": 0.073,
"build/src/ov_SC04_011/ov_SC04_011_jr_80135D20.o": 0.131,
"build/src/ov_SC04_011/ov_SC04_011_jr_801380E0.o": 0.177,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013C98C.o": 0.184,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013F350.o": 0.135,
"build/src/ov_SC04_011/ov_SC04_011_jr_8013FFD8.o": 0.092,
"build/src/ov_SC04_011/ov_SC04_011_jr_80140608.o": 0.247,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015444C.o": 0.097,
"build/src/ov_SC04_011/ov_SC04_011_jr_80154C24.o": 0.185,
"build/src/ov_SC04_011/ov_SC04_011_jr_801588CC.o": 0.179,
"build/src/ov_SC04_011/ov_SC04_011_jr_80159C84.o": 0.095,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015A3C8.o": 0.098,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015AE2C.o": 0.101,
"build/src/ov_SC04_011/ov_SC04_011_jr_8015C32C.o": 0.439,
"build/src/ov_SC04_011/ov_SC04_011_jr_8016AB6C.o": 0.29,
"build/src/ov_SC04_011/ov_SC04_011_jr_80171B4C.o": 0.121,
"build/src/ov_SC04_011/ov_SC04_011_jr_801734BC.o": 0.235,
"build/src/ov_SC04_011/ov_SC04_011_jr_801789AC.o": 0.08,
"build/src/ov_SC04_011/ov_SC04_011_jr_80178D40.o": 0.107,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017A4AC.o": 0.098,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017AE2C.o": 0.121,
"build/src/ov_SC04_011/ov_SC04_011_jr_8017D494.o": 0.569,
"build/src/ov_SC04_011/ov_SC04_011_o0b.o": 0.077,
"build/src/ov_SC04_011/ov_SC04_011_o0c.o": 0.078
},
"ok": true,
"seconds": 4.4
"seconds": 3.3
}
File diff suppressed because one or more lines are too long
+2
View File
@@ -0,0 +1,2 @@
delever --recipes: control 2/2 — the identity splice reproduces its text and the untouched file its object
delever --recipes: 533 RESIDUE bodies
+5
View File
@@ -14,3 +14,8 @@
{"kind": "attempt", "ts": "2026-09-09 11:30:22", "nhash": "fd0a0a6776804081a0e67021650cf9edae8d224d", "tu": "src/ov_SC04_011/ov_SC04_011_after.c", "fn": "func_80148D44", "alias": "ov_SC04_011", "copies": 132, "needed": 2, "kinds": ["keepalive", "pin"], "regs": ["$4"], "secs": 240, "cycles": 3, "j": 4, "levered": 0, "free": 52, "levered_line": "MATCH (68 ins) func_80148D44", "free_line": "DIFF func_80148D44 mine=67 ins, target=68 ins, 52 mismatched", "klass": "cse", "cmd": "/home/musashi/bfm-decomp/.venv/bin/python tools/permuter_ils.py func_80148D44 --draft .run/P36/permuter/ov_SC04_011__func_80148D44/draft.c --asm-subdir .run/P36/permuter/ov_SC04_011__func_80148D44/gas --klass cse --cycles 3 --secs 240 --j 4 --winners .run/P36/permuter/ov_SC04_011__func_80148D44 --pd .run/P36/permuter/ov_SC04_011__func_80148D44/pd --target-o .run/P36/permuter/ov_SC04_011__func_80148D44/target.o", "best": 3, "seconds": 721.9, "rc": 0, "winner": null, "verdict": "NO-MATCH"}
{"kind": "attempt", "ts": "2026-09-09 11:30:25", "nhash": "c7541dad40d8b360d4733a5ebe605d560bd28f07", "tu": "src/ov_SC04_011/ov_SC04_011_after.c", "fn": "func_80148E54", "alias": "ov_SC04_011", "copies": 132, "needed": 2, "kinds": ["launder", "pin"], "regs": ["$4"], "secs": 240, "cycles": 3, "j": 4, "levered": 0, "free": 50, "levered_line": "MATCH (67 ins) func_80148E54", "free_line": "DIFF func_80148E54 mine=66 ins, target=67 ins, 50 mismatched", "klass": "cse", "cmd": "/home/musashi/bfm-decomp/.venv/bin/python tools/permuter_ils.py func_80148E54 --draft .run/P36/permuter/ov_SC04_011__func_80148E54/draft.c --asm-subdir .run/P36/permuter/ov_SC04_011__func_80148E54/gas --klass cse --cycles 3 --secs 240 --j 4 --winners .run/P36/permuter/ov_SC04_011__func_80148E54 --pd .run/P36/permuter/ov_SC04_011__func_80148E54/pd --target-o .run/P36/permuter/ov_SC04_011__func_80148E54/target.o", "best": 3, "seconds": 722.0, "rc": 0, "winner": null, "verdict": "NO-MATCH"}
{"kind": "attempt", "ts": "2026-09-09 11:35:29", "nhash": "baf2a68c3d1443c2c17776905597b6f64e8f853e", "tu": "src/ov_SC04_011/ov_SC04_011_jr_80140608.c", "fn": "func_801424E4", "alias": "ov_SC04_011", "copies": 132, "needed": 2, "kinds": ["cast", "keepalive"], "regs": [], "secs": 240, "cycles": 3, "j": 4, "levered": 0, "free": 37, "levered_line": "MATCH (58 ins) func_801424E4", "free_line": "DIFF func_801424E4 mine=62 ins, target=58 ins, 37 mismatched", "klass": "regalloc", "cmd": "/home/musashi/bfm-decomp/.venv/bin/python tools/permuter_ils.py func_801424E4 --draft .run/P36/permuter/ov_SC04_011__func_801424E4/draft.c --asm-subdir .run/P36/permuter/ov_SC04_011__func_801424E4/gas --klass regalloc --cycles 3 --secs 240 --j 4 --winners .run/P36/permuter/ov_SC04_011__func_801424E4 --pd .run/P36/permuter/ov_SC04_011__func_801424E4/pd --target-o .run/P36/permuter/ov_SC04_011__func_801424E4/target.o", "best": 2, "seconds": 721.6, "rc": 0, "winner": null, "verdict": "NO-MATCH"}
{"kind": "bank", "ts": "2026-09-09 12:16:21", "nhash": "f291a077544a77707d70d488891fbed3b1d7d6b4", "tu": "src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c", "fn": "func_80163EC8", "alias": "ov_SC04_011", "label": "d1", "applied": true, "apply_out": "delever --apply-body: src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c:func_80163EC8 IDENTICAL on 1 object(s) (0.43 s) \u2014 KEPT, ledgered (rung D, d1)", "gte_refold": "gte_consolidate --apply: src/ is dirty \u2014 commit or tools/delever.py --restore first:\n M src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c"}
{"kind": "bank", "ts": "2026-09-09 12:17:42", "nhash": "716cc05fc1252ab66107d25423410f6a2a0d167e", "tu": "src/ov_SC04_011/ov_SC04_011_jr_80135D20.c", "fn": "func_80135D20", "alias": "ov_SC04_011", "label": "d1", "applied": true, "apply_out": "delever --apply-body: src/ov_SC04_011/ov_SC04_011_jr_80135D20.c:func_80135D20 IDENTICAL on 1 object(s) (0.10 s) \u2014 KEPT, ledgered (rung D, d1)", "gte_refold": "gte_consolidate --apply: src/ is dirty \u2014 commit or tools/delever.py --restore first:\n M src/ov_SC04_011/ov_SC04_011_jr_80135D20.c\n M src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c"}
{"kind": "bank", "ts": "2026-09-09 12:17:44", "nhash": "4ea6e9f0cbcdd496c2fa7dcf4e6f501660f64ad5", "tu": "src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c", "fn": "func_8015D01C", "alias": "ov_SC04_011", "label": "d1", "applied": true, "apply_out": "delever --apply-body: src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c:func_8015D01C IDENTICAL on 1 object(s) (0.39 s) \u2014 KEPT, ledgered (rung D, d1)", "gte_refold": "gte_consolidate --apply: src/ is dirty \u2014 commit or tools/delever.py --restore first:\n M src/ov_SC04_011/ov_SC04_011_jr_80135D20.c\n M src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c"}
{"kind": "bank", "ts": "2026-09-09 12:17:45", "nhash": "f30b00e65b50254377a932e5191337cb4d5242b0", "tu": "src/ov_SC04_011/ov_SC04_011_jr_8013C98C.c", "fn": "func_8013E5E8", "alias": "ov_SC04_011", "label": "d1", "applied": true, "apply_out": "delever --apply-body: src/ov_SC04_011/ov_SC04_011_jr_8013C98C.c:func_8013E5E8 IDENTICAL on 1 object(s) (0.10 s) \u2014 KEPT, ledgered (rung D, d1)", "gte_refold": "gte_consolidate --apply: src/ is dirty \u2014 commit or tools/delever.py --restore first:\n M src/ov_SC04_011/ov_SC04_011_jr_80135D20.c\n M src/ov_SC04_011/ov_SC04_011_jr_8013C98C.c\n M src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c"}
{"kind": "bank", "ts": "2026-09-09 12:17:46", "nhash": "e2e0dc0103e0b8dca1527caa55e9e47dc0ceac01", "tu": "src/ov_SC04_011/ov_SC04_011_jr_801734BC.c", "fn": "func_80178840", "alias": "ov_SC04_011", "label": "d1", "applied": true, "apply_out": "delever --apply-body: src/ov_SC04_011/ov_SC04_011_jr_801734BC.c:func_80178840 IDENTICAL on 1 object(s) (0.18 s) \u2014 KEPT, ledgered (rung D, d1)", "gte_refold": "gte_consolidate --apply: src/ is dirty \u2014 commit or tools/delever.py --restore first:\n M src/ov_SC04_011/ov_SC04_011_jr_80135D20.c\n M src/ov_SC04_011/ov_SC04_011_jr_8013C98C.c\n M src/ov_SC04_011/ov_SC04_011_jr_8015C32C.c\n M src/ov_SC04_011/ov_SC04_011_jr_801734BC.c"}
+1
View File
@@ -1,2 +1,3 @@
date milestone head sites_AB pins asm bodies_AB distinct_AB marked unmarked gte_levers per_tu_asm_macros class_C class_D class_E class_F class_G
2026-09-09 T6 r1 (rung R's first class) 1761a3125 33957 20512 13445 12578 1758 33957 0 462 314 1722 50 7428 445 76
2026-09-09 T6 d1 (rung D's four exemplars) 8fac96651 33953 20508 13445 12574 1758 33953 0 462 314 1722 50 7428 445 76
1 date milestone head sites_AB pins asm bodies_AB distinct_AB marked unmarked gte_levers per_tu_asm_macros class_C class_D class_E class_F class_G
2 2026-09-09 T6 r1 (rung R's first class) 1761a3125 33957 20512 13445 12578 1758 33957 0 462 314 1722 50 7428 445 76
3 2026-09-09 T6 d1 (rung D's four exemplars) 8fac96651 33953 20508 13445 12574 1758 33953 0 462 314 1722 50 7428 445 76
+3 -1
View File
@@ -46,6 +46,7 @@ counted, not marked). E, F and G belong to the canonical type layer and are the
| date | milestone | pins | asm | **class A+B sites** | bodies | distinct | GTE levers | per-TU asm macros | C | D | E | F | G | HEAD |
|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---|
| 2026-09-09 | T6 r1 (rung R's first class) | 20512 | 13445 | **33957** | 12578 | 1758 | 462 | 314 | 1722 | 50 | 7428 | 445 | 76 | `1761a3125` |
| 2026-09-09 | T6 d1 (rung D's four exemplars) | 20508 | 13445 | **33953** | 12574 | 1758 | 462 | 314 | 1722 | 50 | 7428 | 445 | 76 | `8fac96651` |
### The campaign — every batch, from the ledger (derived on every render)
@@ -71,7 +72,8 @@ counted, not marked). E, F and G belong to the canonical type layer and are the
| `sweep2` | 2026-09-09 | sweep | 3 | 0 | 0 | 0 | 0 |
| `sweep3` | 2026-09-09 | sweep | 134 | 0 | 0 | 0 | 0 |
| `r1` | 2026-09-09 | R | 0 | 0 | 0 | 134 | 134 |
| **total** | | | **17,119** | **20,778** | **283** | **134** | **134** |
| `d1` | 2026-09-09 | D | 0 | 0 | 0 | 4 | 4 |
| **total** | | | **17,119** | **20,778** | **283** | **138** | **138** |
*Generated by `tools/lever_progress.py --render` from `.run/P36/census/lever_census.json` and `.run/P36/delever/ledger.jsonl`; the series lives in `docs/lever-progress.tsv` (R75: published numbers are generated, never typed).*
+4 -3
View File
@@ -1796,18 +1796,19 @@ extern void func_80141C04(void);
void func_8013E5E8(void)
{
extern u16 D_8011511E;
extern u16 D_8011511C;
extern unsigned short D_80115112;
extern u16 D_80115116;
extern void (*D_801917E0[])(void);
register void (*fp)(void) __asm__("$2"); /* pin fn-ptr to $v0 -> store retires early */ // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B t3_tus1)
void (**new_var)(void);
void (*fp)(void);
func_80029444();
func_801754A8();
D_8011511E = func_80014ED4(0);
D_8011511C = func_80015018(0);
fp = D_801917E0[D_80115112];
new_var = &D_801917E0[D_80115112];
fp = *new_var;
fp();
func_800190AC();
func_80141C04();
+116 -100
View File
@@ -1636,32 +1636,38 @@ void func_8015CFC0(s32 *a0) {
// @stuck: none — MATCH (uVar1 pinned $s3, uVar5 pinned $s1; param_1->s2, iVar4->s0 fall out)
void func_8015D01C(int param_1) {
void func_8015D01C(int param_1)
{
extern s32 func_801725F4(u8 *a0);
extern int D_800D550C;
short new_var2;
unsigned short new_var;
extern int D_80192C8C;
short sVar2;
int iVar4;
unsigned short uVar1;
register unsigned short uVar5 __asm__("$17"); // !FAKE: pin $17 — NEEDED DIFFERS (P36 rung B t3_tus1)
short sVar2;
unsigned short uVar5;
short sVar3;
((void (*)(int, void *))func_80154274)(param_1, &D_800D550C);
*(short *)(*(int *)(param_1 + 0x20) + 0x10) = 0;
iVar4 = *(short *)(*(int *)(param_1 + 0x20) + 0x12);
uVar1 = *(unsigned short *)(*(int *)(*(int *)(param_1 + 0x180) + 0x20) + 0x12);
((void (*)(int, void *)) func_80154274)(param_1, &D_800D550C);
*((short *) ((*((int *) (param_1 + 0x20))) + 0x10)) = 0;
iVar4 = *((short *) ((*((int *) (param_1 + 0x20))) + 0x12));
uVar1 = *((unsigned short *) ((*((int *) ((*((int *) (param_1 + 0x180))) + 0x20))) + 0x12));
uVar5 = (uVar1 + 0x800) & 0xfff;
sVar2 = func_80012A60(iVar4, (short)uVar1);
sVar3 = func_80012A60(iVar4, uVar5);
if (sVar2 < sVar3) {
*(short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar1;
} else {
*(unsigned short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar5;
new_var = uVar5;
new_var2 = new_var;
sVar2 = func_80012A60(iVar4, (short) uVar1);
sVar3 = func_80012A60(iVar4, new_var2);
if (sVar2 < sVar3)
{
*((short *) ((*((int *) (param_1 + 0x20))) + 0x12)) = uVar1;
}
*(int *)(param_1 + 0x38) = (int)&D_80192C8C | 0x40000000;
((void (*)(int))func_801725F4)(param_1);
((void (*)(int))func_80146CA0)(param_1);
else
{
*((unsigned short *) ((*((int *) (param_1 + 0x20))) + 0x12)) = new_var;
}
*((int *) (param_1 + 0x38)) = ((int) (&D_80192C8C)) | 0x40000000;
((void (*)(int)) func_801725F4)(param_1);
((void (*)(int)) func_80146CA0)(param_1);
}
@@ -4097,129 +4103,139 @@ void func_80163A58(void *a0) {
#include "../shared/ov/func_80163C2C.h"
void func_80163EC8(s32 param_1) {
void func_80163EC8(s32 param_1)
{
extern Blk8 D_801ED2B0;
extern u16 D_800B99DA;
extern u8 func_801656D0(s32 a0, s32 a1);
extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3);
extern void func_80015978(s32 a0, s32 *a1);
extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4);
Blk8 in;
u16 out[4];
s16 buf[4];
s32 psVar6;
s32 iVar8;
s32 iVar7;
register s32 uVar5 __asm__("$2"); /* PIN (flagged): uVar5 -> $v0 */ // !FAKE: pin $2 — NEEDED DIFFERS (P36 rung B t3_tus1)
s32 uVar5;
u16 uVar4;
u8 uVar3;
in = D_801ED2B0;
psVar6 = *(s32 *)(param_1 + 0x4c);
iVar8 = *(s32 *)(param_1 + 0x20);
func_80162D88((s32 *)param_1);
if (*(s32 *)(psVar6 + 0x184) == 0) {
uVar5 = *(s32 *)(psVar6 + 0x44);
*(s16 *)(psVar6 + 0x18a) = 0;
*(s16 *)(psVar6 + 0x188) = 0;
*(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20;
func_80146CA0((void *)param_1);
func_80146CA0((void *)param_1);
psVar6 = *((s32 *) (param_1 + 0x4c));
iVar8 = *((s32 *) (param_1 + 0x20));
func_80162D88((s32 *) param_1);
if ((*((s32 *) (psVar6 + 0x184))) == 0)
{
*((s16 *) (psVar6 + 0x18a)) = 0;
*((s16 *) (psVar6 + 0x188)) = 0;
*((s32 *) (psVar6 + 0x44)) = (*((s32 *) (psVar6 + 0x44))) & (~0x20);
func_80146CA0((void *) param_1);
func_80146CA0((void *) param_1);
return;
}
if (*(s16 *)(*(s32 *)(psVar6 + 0x184) + 0x36) == *(u16 *)(psVar6 + 0x194)) {
if ((*((s16 *) ((*((s32 *) (psVar6 + 0x184))) + 0x36))) == (*((u16 *) (psVar6 + 0x194))))
{
goto LAB_matched;
}
*(s32 *)(psVar6 + 0x184) = 0;
uVar5 = *(s32 *)(psVar6 + 0x44);
*(s16 *)(psVar6 + 0x18a) = 0;
*(s16 *)(psVar6 + 0x188) = 0;
*(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20;
func_80146CA0((void *)param_1);
func_80146CA0((void *)param_1);
*((s32 *) (psVar6 + 0x184)) = 0;
*((s16 *) (psVar6 + 0x18a)) = 0;
*((s16 *) (psVar6 + 0x188)) = 0;
*((s32 *) (psVar6 + 0x44)) = (*((s32 *) (psVar6 + 0x44))) & (~0x20);
func_80146CA0((void *) param_1);
func_80146CA0((void *) param_1);
return;
LAB_matched:
*((s16 *) (psVar6 + 0x18a)) = (*((u16 *) (psVar6 + 0x18a))) + 1;
LAB_matched:
*(s16 *)(psVar6 + 0x18a) = *(u16 *)(psVar6 + 0x18a) + 1;
if ((D_800B99DA & 3) == 0) {
if (*(s16 *)(psVar6 + 0x188) >= *(u8 *)(param_1 + 0x67)) {
*(s16 *)(psVar6 + 0x188) = *(s16 *)(psVar6 + 0x188) - *(u8 *)(param_1 + 0x67);
} else {
*(s16 *)(psVar6 + 0x188) = 0;
if ((D_800B99DA & 3) == 0)
{
if ((*((s16 *) (psVar6 + 0x188))) >= (*((u8 *) (param_1 + 0x67))))
{
*((s16 *) (psVar6 + 0x188)) = (*((s16 *) (psVar6 + 0x188))) - (*((u8 *) (param_1 + 0x67)));
}
if (*(s16 *)(psVar6 + 0x188) < 0) {
*(s16 *)(psVar6 + 0x188) = 0;
else
{
*((s16 *) (psVar6 + 0x188)) = 0;
}
if ((*((s16 *) (psVar6 + 0x188))) < 0)
{
*((s16 *) (psVar6 + 0x188)) = 0;
}
}
*(s16 *)(param_1 + 0x66) = *(u16 *)(param_1 + 0x66) + 0x40;
uVar5 = func_80148800((s32 *)psVar6);
if ((uVar5 & 0x80) != 0) {
*(s16 *)(param_1 + 0x66) = 0;
uVar3 = func_801656D0(psVar6, func_8014CA00(*(s32 *)(psVar6 + 0x184)) & 0xff);
*(s16 *)(psVar6 + 0x188) = *(u16 *)(psVar6 + 0x188) + uVar3;
*(s16 *)(iVar8 + 0x1a) = 0x4000;
*(s16 *)(iVar8 + 0x18) = 0x4000;
*(s32 *)(iVar8 + 0x48) = *(s16 *)(param_1 + 0x58);
*(s32 *)(iVar8 + 0x4c) = *(s16 *)(param_1 + 0x5a);
*(s32 *)(iVar8 + 0x50) = *(s16 *)(param_1 + 0x5c);
((void (*)(s32, s32, s32))func_80149350)(param_1, (s32)&in, (s32)out);
*(s16 *)(param_1 + 0x6) = out[0];
*(s16 *)(param_1 + 0xa) = out[1];
*(s16 *)(param_1 + 0xe) = out[2];
*((s16 *) (param_1 + 0x66)) = (*((u16 *) (param_1 + 0x66))) + 0x40;
uVar5 = func_80148800((s32 *) psVar6);
if ((uVar5 & 0x80) != 0)
{
*((s16 *) (param_1 + 0x66)) = 0;
uVar3 = func_801656D0(psVar6, func_8014CA00(*((s32 *) (psVar6 + 0x184))) & 0xff);
*((s16 *) (psVar6 + 0x188)) = (*((u16 *) (psVar6 + 0x188))) + uVar3;
*((s16 *) (iVar8 + 0x1a)) = 0x4000;
*((s16 *) (iVar8 + 0x18)) = 0x4000;
*((s32 *) (iVar8 + 0x48)) = *((s16 *) (param_1 + 0x58));
*((s32 *) (iVar8 + 0x4c)) = *((s16 *) (param_1 + 0x5a));
*((s32 *) (iVar8 + 0x50)) = *((s16 *) (param_1 + 0x5c));
((void (*)(s32, s32, s32)) func_80149350)(param_1, (s32) (&in), (s32) out);
*((s16 *) (param_1 + 0x6)) = out[0];
*((s16 *) (param_1 + 0xa)) = out[1];
*((s16 *) (param_1 + 0xe)) = out[2];
}
if (0x80 < *(s16 *)(psVar6 + 0x188)) {
*(s16 *)(psVar6 + 0x188) = 0x80;
if (0x80 < (*((s16 *) (psVar6 + 0x188))))
{
*((s16 *) (psVar6 + 0x188)) = 0x80;
}
if (*(s16 *)(psVar6 + 0x188) >= 0x80) {
iVar7 = *(s32 *)(psVar6 + 0x184);
if (iVar7 != 0) {
func_80015978(iVar7 + 4, (s32 *)buf);
if ((*((s16 *) (psVar6 + 0x188))) >= 0x80)
{
iVar7 = *((s32 *) (psVar6 + 0x184));
if (iVar7 != 0)
{
func_80015978(iVar7 + 4, (s32 *) buf);
buf[3] = 0;
uVar4 = func_80156370(0xe);
func_8014C4AC(iVar7, 0xe, uVar4, buf, *(s16 *)(iVar8 + 0x12));
func_8014C4AC(iVar7, 0xe, uVar4, buf, *((s16 *) (iVar8 + 0x12)));
func_80146994(0x33, param_1, 0, iVar7);
}
} else {
if (*(s16 *)(psVar6 + 0x18a) < 0x80 && *(u16 *)psVar6 != 0x19) {
}
else
{
if (((*((s16 *) (psVar6 + 0x18a))) < 0x80) && ((*((u16 *) psVar6)) != 0x19))
{
goto LAB_end;
}
iVar7 = *(s32 *)(psVar6 + 0x184);
if (iVar7 != 0) {
func_80015978(iVar7 + 4, (s32 *)buf);
iVar7 = *((s32 *) (psVar6 + 0x184));
if (iVar7 != 0)
{
func_80015978(iVar7 + 4, (s32 *) buf);
buf[3] = 0;
uVar4 = func_80156370(0x21);
func_8014C4AC(iVar7, 0x21, uVar4, buf, *(s16 *)(iVar8 + 0x12));
if ((*(s32 *)(iVar7 + 0xb4) & 0x40000) != 0) {
func_8014AD30(param_1, (u16 *)buf, 0, *(s16 *)(iVar7 + 0x60));
func_8014C4AC(iVar7, 0x21, uVar4, buf, *((s16 *) (iVar8 + 0x12)));
if (((*((s32 *) (iVar7 + 0xb4))) & 0x40000) != 0)
{
func_8014AD30(param_1, (u16 *) buf, 0, *((s16 *) (iVar7 + 0x60)));
}
}
}
uVar5 = func_8014CA00(iVar7);
*(s32 *)(psVar6 + 0x184) = uVar5;
if (0x1e < (u32)uVar5) {
*(s32 *)(psVar6 + 0x184) = 0;
*((s32 *) (psVar6 + 0x184)) = uVar5;
if (0x1e < ((u32) uVar5))
{
*((s32 *) (psVar6 + 0x184)) = 0;
}
func_80146E90((s32 *)param_1, 0x20);
*(s32 *)(psVar6 + 0x44) = *(s32 *)(psVar6 + 0x44) & ~0x20;
func_80146E90((s32 *) param_1, 0x20);
*((s32 *) (psVar6 + 0x44)) = (*((s32 *) (psVar6 + 0x44))) & (~0x20);
func_80147324(0x449);
func_80146CA0((void *)param_1);
func_80146CA0((void *)param_1);
func_80146CA0((void *) param_1);
func_80146CA0((void *) param_1);
LAB_end:
uVar4 = func_80012F74(*((s16 *) (iVar8 + 0x1a)), 0x1800, 3, 1);
LAB_end:
uVar4 = func_80012F74(*(s16 *)(iVar8 + 0x1a), 0x1800, 3, 1);
*(s16 *)(iVar8 + 0x1a) = uVar4;
*(s16 *)(iVar8 + 0x18) = uVar4;
uVar4 = func_80012F74(*(s16 *)(param_1 + 0x6), *(s16 *)(param_1 + 0x58), 8, 1);
*(s16 *)(param_1 + 0x6) = uVar4;
uVar4 = func_80012F74(*(s16 *)(param_1 + 0xa), *(s16 *)(param_1 + 0x5a), 8, 1);
*(s16 *)(param_1 + 0xa) = uVar4;
uVar4 = func_80012F74(*(s16 *)(param_1 + 0xe), *(s16 *)(param_1 + 0x5c), 8, 1);
*(s16 *)(param_1 + 0xe) = uVar4;
*((s16 *) (iVar8 + 0x1a)) = uVar4;
*((s16 *) (iVar8 + 0x18)) = uVar4;
uVar4 = func_80012F74(*((s16 *) (param_1 + 0x6)), *((s16 *) (param_1 + 0x58)), 8, 1);
*((s16 *) (param_1 + 0x6)) = uVar4;
uVar4 = func_80012F74(*((s16 *) (param_1 + 0xa)), *((s16 *) (param_1 + 0x5a)), 8, 1);
*((s16 *) (param_1 + 0xa)) = uVar4;
uVar4 = func_80012F74(*((s16 *) (param_1 + 0xe)), *((s16 *) (param_1 + 0x5c)), 8, 1);
*((s16 *) (param_1 + 0xe)) = uVar4;
}
+11 -8
View File
@@ -3856,19 +3856,22 @@ extern void func_80019064(void *a0);
extern void func_80131E00(struct S80131E00 *a0, s32 a1);
void func_80178840(int param_1) {
void func_80178840(int param_1)
{
extern int D_80193C70;
extern int D_80193C7C[];
register int p __asm__("$16"); // !FAKE: pin $16 — NEEDED DIFFERS (P36 rung B t3_tus1)
int p;
int s1byte;
p = param_1;
if ((*(unsigned short *)(p + 0x5c) & 1) != 0) {
s1byte = *(unsigned char *)(p + 0x5e);
if (s1byte == 0xc) {
((void (*)(int))func_80019064)((int)&D_80193C70);
if (((*((unsigned short *) (p + 0x5c))) & 1) != 0)
{
s1byte = *((unsigned char *) (p + 0x5e));
if (s1byte == 0xc)
{
((void (*)(int)) func_80019064)((int) (&D_80193C70));
}
((void (*)(int, int))func_80131E00)(p, D_80193C7C[s1byte]);
((void (*)(int, int)) func_80131E00)(p, D_80193C7C[s1byte]);
p = param_1;
}
}
+38 -17
View File
@@ -1406,23 +1406,34 @@ def inline_single_set_temps(text, tu, fn, d_):
decls.append(p)
else:
uses.append(p)
if len(asgs) != 1 or len(uses) != 1 or len(decls) > 1:
if not asgs or not uses or len(decls) > 1:
continue
ai = asgs[0][0]
ui, u0, u1 = uses[0]
if ai >= ui:
continue
mm = re.match(ASG % re.escape(v), masked[ai].strip())
raw_stripped = lines[ai].strip()
expr = raw_stripped[mm.start(1):mm.end(1)]
if not expr.strip():
continue
cand = list(lines)
cand[ui] = lines[ui][:u0] + f"({expr})" + lines[ui][u1:]
cand[ai] = None # the assignment goes (with its declaration when they are one)
if decls: # form B: the separate `T v;` is dead now
cand[decls[0][0]] = None
out.append((f"inline {v} @{ai + 1}", "\n".join(l for l in cand if l is not None)))
# ONE ASSIGNMENT AT A TIME, not one per variable. The single-set case is the easy half; the lever rung D actually
# found is narrower: `uVar5` is assigned in TWO branches of func_80163EC8, and the winning move inlined ONE of them.
# An assignment is inlinable when its value is read exactly once before the variable is written again — the classic
# def-with-one-use — so the assignment can go and the read can carry the expression.
order = sorted(places)
for ai, _, _ in asgs:
after = [p for p in order if p[0] > ai]
reads = [p for p in after if p not in [(x, y, z) for x, y, z in asgs] and not is_decl_line(masked[p[0]].strip())]
if not reads:
continue
ui, u0, u1 = reads[0]
nxt = [p for p in after if p[0] > ui]
if nxt and (nxt[0][0], nxt[0][1], nxt[0][2]) not in [(x, y, z) for x, y, z in asgs]:
continue # read again before it is rewritten: the assignment is not dead
mm = re.match(ASG % re.escape(v), masked[ai].strip())
if not mm:
continue
expr = lines[ai].strip()[mm.start(1):mm.end(1)]
if not expr.strip():
continue
cand = list(lines)
cand[ui] = lines[ui][:u0] + f"({expr})" + lines[ui][u1:]
cand[ai] = None # the assignment goes (with its declaration when they are one)
if decls and len(asgs) == 1: # the separate `T v;` is dead only when nothing else writes v
cand[decls[0][0]] = None
out.append((f"inline {v} @{ai + 1}", "\n".join(l for l in cand if l is not None)))
return out
@@ -1559,12 +1570,19 @@ def recipes(a):
return [r for t_ in inc.get(tu, []) for r in by_src.get(t_, [])] if tu.endswith(".h") else by_src.get(tu, [])
def judge(tu, cand):
"""judge one candidate, and be killable: the oracle writes the candidate into the tree to compile it, so a SIGTERM
between the write and the restore leaves a candidate in `src/`. The original text goes into inflight.json first, the
same file `--restore` reads (P35's rule: a tool restores from its OWN snapshot, never `git checkout`) — S99 killed a
run mid-judge and found exactly that leftover."""
path = REPO / tu
raw, st = path.read_text(errors="surrogateescape"), path.stat()
RUN.mkdir(parents=True, exist_ok=True)
INFLIGHT.write_text(json.dumps({tu: raw}))
try:
return oracle.judge_all(recs_for(tu), cand, tag="rec", write_path=(tu if tu.endswith(".h") else None))
finally:
restore_file(path, raw, st)
INFLIGHT.unlink(missing_ok=True)
def lever_free(tu, raw, fn):
m, ls = same_len_mask(raw), line_starts(raw)
@@ -1613,7 +1631,7 @@ def recipes(a):
print(f"delever --recipes: {len(todo)} RESIDUE bodies", flush=True)
rows, won, tried, compiles = [], 0, 0, 0
t0 = time.time()
for (tu, fn), r in todo:
for n_body, ((tu, fn), r) in enumerate(todo, 1):
path = REPO / tu
raw = path.read_text(errors="surrogateescape")
names = pin_names(sites_by[(tu, fn)]) # may be empty: R5 needs no pinned declaration
@@ -1632,6 +1650,9 @@ def recipes(a):
if v == "IDENTICAL":
hit = (rec, desc, cand)
break
if n_body % 10 == 0 or hit: # R55: a lane that runs unattended leaves evidence
print(f" [{n_body}/{len(todo)}] {won} closed · {compiles} compiles · {(time.time() - t0) / 60:.1f} min",
flush=True)
row = dict(ts=time.strftime("%Y-%m-%d %H:%M:%S"), label=a.label, rung="R", calib=dict(head=oracle.head(), stamp=oracle.config_stamp()),
tu=tu, fn=fn, addr=fn_addr(fn, tu), aliases=r.get("aliases"), header=tu.endswith(".h"),
nhash_before=r.get("nhash_after"), nhash_after=None, candidates=len(cands), pins=len(names),
+35 -5
View File
@@ -572,10 +572,34 @@ def winner_body(winner_c, fn, tu):
return None
def tidy_body(body):
"""the permuter's winner, made to read like the tree it lands in — or None when there is nothing to tidy.
pycparser reprints a body it has parsed: two-space indent where this tree uses four, and an empty statement `;` left
where a statement was inlined away. Neither generates code, and the object oracle judges the tidied text before it is
kept, so this can only ever improve the source. What it deliberately does NOT touch is the parenthesisation
(`*((s32 *) (p + 4))`) or the brace style — that is the formatting phase's job, with clang-format, over the whole tree
at once (`decomp-architect/templates/.clang-format`); a per-bank reformat would make this phase's diffs unreadable."""
lines = [l for l in body.split("\n") if l.strip() != ";"]
indents = [len(l) - len(l.lstrip(" ")) for l in lines if l.strip() and l.startswith(" ")]
if indents and min(indents) == 2: # a two-space body: double every leading run
lines = [(" " * (2 * (len(l) - len(l.lstrip(" ")))) + l.lstrip(" ")) if l.startswith(" ") else l for l in lines]
out = "\n".join(lines)
return out if out != body else None
def bank(a):
outs = load_outcomes()
banked = {(o["alias"], o["fn"], o["nhash"]) for o in outs if o.get("kind") == "bank" and o.get("applied")}
# a body ANOTHER rung already closed is not banked again (S99: --bank re-applied the permuter's reprinted body over the
# one-line version rung R had banked for the same function, and the tree lost a clean diff for a byte-identical one)
cur = {}
for r in dl.load_ledger():
if r.get("tu") and r.get("fn"):
cur[(r["tu"], r["fn"])] = r
already = {(k[0], k[1]) for k, r in cur.items() if r.get("verdict") == "LEVER-FREE"}
todo = [o for o in outs if o.get("kind") == "attempt" and o.get("verdict") == "MATCH"
and (o["tu"], o["fn"]) not in already
and (o["alias"], o["fn"], o["nhash"]) not in banked
and (not a.only or any(x in (o["fn"], o["tu"], o["alias"]) or o["nhash"].startswith(x) for x in a.only))]
if not todo:
@@ -590,11 +614,17 @@ def bank(a):
bad += 1
continue
bf = d / "body.c"
bf.write_text(body, errors="surrogateescape")
cmd = [PY, "tools/delever.py", "--apply-body", o["tu"], o["fn"], bf.relative_to(REPO).as_posix(),
"--label", a.label, "--rung", "D"] + (["--dirty-ok"] if a.dirty_ok else [])
r = subprocess.run(cmd, cwd=REPO, capture_output=True, text=True)
print(" " + (r.stdout or r.stderr).strip().splitlines()[-1][:220], flush=True)
# the tidied body FIRST (the oracle judges it like any other candidate); the winner verbatim only if it is refused
forms = [(t_, "tidied") for t_ in [tidy_body(body)] if t_] + [(body, "verbatim")]
r = None
for text_, how in forms:
bf.write_text(text_, errors="surrogateescape")
cmd = [PY, "tools/delever.py", "--apply-body", o["tu"], o["fn"], bf.relative_to(REPO).as_posix(),
"--label", a.label, "--rung", "D"] + (["--dirty-ok"] if a.dirty_ok else [])
r = subprocess.run(cmd, cwd=REPO, capture_output=True, text=True)
print(f" [{how}] " + (r.stdout or r.stderr).strip().splitlines()[-1][:210], flush=True)
if r.returncode == 0:
break
row = dict(kind="bank", ts=time.strftime("%Y-%m-%d %H:%M:%S"), nhash=o["nhash"], tu=o["tu"], fn=o["fn"],
alias=o["alias"], label=a.label, applied=(r.returncode == 0),
apply_out=(r.stdout or r.stderr).strip()[-400:])