build(phase-35): T3 close — the five twin pairs collapsed onto one source directory each (10 aliases, 166 files deleted); R22 clean fleet run check-all: 218 passed, 0 failed of 218 (309 s); the census after the twins: same-vram backlog 4,667 -> 1,099 classes, 3,580 classes twin-covered, S1 9,081/10,180 satisfied; rules check (P6) done; kit corpus for pads_audit

This commit is contained in:
Drew T
2026-09-08 17:33:42 -06:00
parent 6ebb3dac33
commit 0e38b51a37
8 changed files with 560 additions and 42 deletions
+5
View File
@@ -0,0 +1,5 @@
.venv/bin/python tools/tool_census.py --all
tool_census: 295 tool files (find == git ls-files) + 34 retired; classes {'LIVE': 235, 'ORPHAN': 31, 'REFERENCED': 29, 'RETIRED': 34}; dictionary rows 329
tool_census: wrote docs/tool-index.md
tool_census: wrote decomp-architect/tools/MANIFEST.md
tool_census: corpus materialised — 361 verbatim copies, 28 pointers, INDEX.md
+5
View File
@@ -0,0 +1,5 @@
.venv/bin/python tools/tool_census.py --all
tool_census: 295 tool files (find == git ls-files) + 34 retired; classes {'LIVE': 235, 'ORPHAN': 31, 'REFERENCED': 29, 'RETIRED': 34}; dictionary rows 329
tool_census: wrote docs/tool-index.md
tool_census: wrote decomp-architect/tools/MANIFEST.md
tool_census: corpus materialised — 361 verbatim copies, 28 pointers, INDEX.md
+476
View File
@@ -0,0 +1,476 @@
clean: removed build/, expected/, and the regenerated splat tree (asm/, assets/, undefined_*_auto.txt).
disc-extract: up to date — extracted/retail/ matches the committed manifest (sha1 e5c6019249dec3c71bb2cf40658a78439dddb037)
splat 0.41.0 (powered by spimdisasm 1.41.0)
0%| | 0/1096 [00:00<?, ?it/s]
Loading symbols (symbols.us): 0%| | 0/1096 [00:00<?, ?it/s]
Loading symbols (symbols.us): 100%|██████████| 1096/1096 [00:00<00:00, 203946.64it/s]
0%| | 0/47 [00:00<?, ?it/s]
Loading symbols (symbols.us.ram): 0%| | 0/47 [00:00<?, ?it/s]
Loading symbols (symbols.us.ram): 100%|██████████| 47/47 [00:00<00:00, 617969.55it/s]
0%| | 0/2 [00:00<?, ?it/s]
Scanning header: 0%| | 0/2 [00:00<?, ?it/s]
Scanning main: 0%| | 0/2 [00:00<?, ?it/s]
Rodata segment '800' may belong to the text segment '800'
Based on the usage from the function LzssDecodeSector to the symbol jtbl_80072A38
The rodata segment '800' has jumptables that are not aligned properly file-wise, indicating one or more likely file split.
File split suggestions for this segment will follow in config yaml format:
- [0x6324C, .rodata]
- [0x63388, .rodata]
- [0x633FC, .rodata]
Rodata segment '800_b' may belong to the text segment '800_b'
Based on the usage from the function func_8002B0B4 to the symbol jtbl_80072E44
Rodata segment '800_b_2' may belong to the text segment '800_b_2'
Based on the usage from the function func_8002DC68 to the symbol jtbl_80072F3C
The rodata segment '800_b_2' has jumptables that are not aligned properly file-wise, indicating one or more likely file split.
File split suggestions for this segment will follow in config yaml format:
- [0x63920, .rodata]
Rodata segment '800_c' may belong to the text segment '800_c'
Based on the usage from the function func_80035270 to the symbol jtbl_800732A0
Scanning main: 100%|██████████| 2/2 [00:01<00:00, 1.03it/s]
Scanning main: 100%|██████████| 2/2 [00:01<00:00, 1.03it/s]
0%| | 0/2 [00:00<?, ?it/s]
Splitting header: 0%| | 0/2 [00:00<?, ?it/s]
Splitting main: 0%| | 0/2 [00:00<?, ?it/s]
Splitting main: 100%|██████████| 2/2 [00:02<00:00, 1.07s/it]
Splitting main: 100%|██████████| 2/2 [00:02<00:00, 1.07s/it]
0%| | 0/2 [00:00<?, ?it/s]
Linker script header: 0%| | 0/2 [00:00<?, ?it/s]
Linker script main: 0%| | 0/2 [00:00<?, ?it/s]
Linker script main: 100%|██████████| 2/2 [00:00<00:00, 64.64it/s]
Split 340 KB (82.28%) in defined segments
header: 2 KB (0.50%) 1 split, 0 cached
c: 338 KB (81.78%) 85 split, 0 cached
unknown: 0 B (0.00%) from unknown bin files
ld_interleave --order: .main island = 8 pieces [53198.data.o, 800.o, 63470.data.o, 800_b.o, 800_b_2.o, 63940.data.o, 800_c.o, 63C4C.data.o]; pre=0 text=85 empties=166 bss=85
[ OK ] resident
[ OK ] ov_SC01_000
[ OK ] ov_SC05_000
[ OK ] ov_SC06_000
[ OK ] ov_SC04_000
[ OK ] ov_SC01_006
[ OK ] ov_SC01_005
[ OK ] ov_SC02_003
[ OK ] ov_SC03_002
[ OK ] ov_SC01_077
[ OK ] ov_SC02_000
[ OK ] ov_SC04_019
[ OK ] ov_SC04_018
[ OK ] ov_SC03_006
[ OK ] ov_SC03_001
[ OK ] ov_SC01_001
[ OK ] ov_SC01_004
[ OK ] ov_SC01_008
[ OK ] ov_SC07_000
[ OK ] ov_SC01_074
[ OK ] ov_SC02_015
[ OK ] ov_SC02_004
[ OK ] ov_SC02_021
[ OK ] ov_SC01_080
[ OK ] ov_SC02_016
[ OK ] ov_SC01_009
[ OK ] ov_SC01_084
[ OK ] ov_SC02_026
[ OK ] ov_SC02_005
[ OK ] ov_SC02_011
[ OK ] ov_SC02_039
[ OK ] ov_SC02_017
[ OK ] ov_SC02_028
[ OK ] ov_SC02_031
[ OK ] ov_SC02_027
[ OK ] ov_SC02_035
[ OK ] ov_SC03_003
[ OK ] ov_SC02_041
[ OK ] ov_SC03_012
[ OK ] ov_SC03_011
[ OK ] ov_SC03_010
[ OK ] ov_SC03_023
[ OK ] ov_SC03_013
[ OK ] ov_SC03_007
[ OK ] ov_SC03_024
[ OK ] ov_SC03_014
[ OK ] ov_SC03_015
[ OK ] ov_SC03_029
[ OK ] ov_SC03_031
[ OK ] ov_SC03_089
[ OK ] ov_SC03_030
[ OK ] ov_SC03_092
[ OK ] ov_SC03_028
[ OK ] ov_SC03_090
[ OK ] ov_SC03_091
[ OK ] ov_SC03_093
[ OK ] ov_SC03_095
[ OK ] ov_SC03_096
[ OK ] ov_SC03_097
[ OK ] ov_SC03_094
[ OK ] ov_SC03_101
[ OK ] ov_SC03_099
[ OK ] ov_SC03_100
[ OK ] ov_SC03_098
[ OK ] ov_SC03_108
[ OK ] ov_SC03_109
[ OK ] ov_SC03_110
[ OK ] ov_SC03_103
[ OK ] ov_SC03_102
[ OK ] ov_SC03_112
[ OK ] ov_SC03_104
[ OK ] ov_SC03_111
[ OK ] ov_SC03_114
[ OK ] ov_SC03_113
[ OK ] ov_SC03_105
[ OK ] ov_SC03_115
[ OK ] ov_SC03_116
[ OK ] ov_SC03_126
[ OK ] ov_SC03_117
[ OK ] ov_SC04_003
[ OK ] ov_SC04_009
[ OK ] ov_SC04_008
[ OK ] ov_SC03_118
[ OK ] ov_SC03_121
[ OK ] ov_SC04_006
[ OK ] ov_SC03_119
[ OK ] ov_SC03_125
[ OK ] ov_SC04_004
[ OK ] ov_SC04_002
[ OK ] ov_SC04_007
[ OK ] ov_SC04_005
[ OK ] ov_SC04_010
[ OK ] ov_SC03_124
[ OK ] ov_SC04_012
[ OK ] ov_SC05_002
[ OK ] ov_SC04_021
[ OK ] ov_SC05_006
[ OK ] ov_SC05_007
[ OK ] ov_SC05_008
[ OK ] ov_SC05_004
[ OK ] ov_SC05_003
[ OK ] ov_SC05_005
[ OK ] ov_SC05_001
[ OK ] ov_SC04_016
[ OK ] ov_SC04_020
[ OK ] ov_SC04_015
[ OK ] ov_SC04_011
[ OK ] ov_SC05_009
[ OK ] ov_SC05_011
[ OK ] ov_SC05_010
[ OK ] ov_SC05_019
[ OK ] ov_SC06_015
[ OK ] ov_SC06_013
[ OK ] ov_SC06_011
[ OK ] ov_SC06_016
[ OK ] ov_SC06_014
[ OK ] ov_SC06_008
[ OK ] ov_SC05_018
[ OK ] ov_SC06_020
[ OK ] ov_SC06_010
[ OK ] ov_SC06_025
[ OK ] ov_SC06_018
[ OK ] ov_SC06_024
[ OK ] ov_SC05_017
[ OK ] ov_SC06_022
[ OK ] ov_SC06_027
[ OK ] ov_SC07_008
[ OK ] ov_SC06_006
[ OK ] md_MAIN_014
[ OK ] md_MAIN_013
[ OK ] ov_SC07_002
[ OK ] md_MAIN_016
[ OK ] md_MAIN_015
[ OK ] ov_SC07_001
[ OK ] md_MAIN_017
[ OK ] md_MAIN_018
[ OK ] md_MAIN_019
[ OK ] md_MAIN_020
[ OK ] ov_SC06_030
[ OK ] md_MAIN_021
[ OK ] ov_SC06_033
[ OK ] ov_SC06_032
[ OK ] md_MAIN_023
[ OK ] md_MAIN_022
[ OK ] md_MAIN_024
[ OK ] md_MAIN_025
[ OK ] md_MAIN_026
[ OK ] md_MAIN_027
[ OK ] md_MAIN_028
[ OK ] ov_SC07_009
[ OK ] md_MAIN_029
[ OK ] md_MAIN_030
[ OK ] md_MAIN_031
[ OK ] md_MAIN_032
[ OK ] md_MAIN_033
[ OK ] md_MAIN_035
[ OK ] md_MAIN_034
[ OK ] ov_MAIN_012
[ OK ] md_MAIN_036
[ OK ] ov_SC06_029
[ OK ] ov_SC07_011
[ OK ] md_MAIN_037
[ OK ] md_MAIN_042
[ OK ] md_MAIN_041
[ OK ] md_MAIN_043
[ OK ] md_MAIN_040
[ OK ] md_MAIN_038
[ OK ] md_MAIN_039
[ OK ] md_MAIN_045
[ OK ] md_MAIN_047
[ OK ] md_MAIN_046
[ OK ] md_MAIN_044
[ OK ] md_MAIN_008
[ OK ] md_MAIN_001
[ OK ] md_MAIN_011
[ OK ] md_SC03_073
[ OK ] md_SC03_074
[ OK ] md_SC03_075
[ OK ] md_SC03_078
[ OK ] md_SC03_077
[ OK ] md_SC03_076
[ OK ] md_SC03_132
[ OK ] md_SC03_079
[ OK ] md_SC03_133
[ OK ] ov_SC07_010
[ OK ] ov_SC07_006
[ OK ] ov_SC02_037
[ OK ] ov_SC07_007
[ OK ] md_SC03_134
[ OK ] md_MAIN_003
[ OK ] md_SC03_135
[ OK ] md_SC03_137
[ OK ] md_SC03_136
[ OK ] ov_SC03_107
[ OK ] md_SC03_138
[ OK ] md_SC04_024
[ OK ] md_SC04_025
[ OK ] md_SC04_029
[ OK ] md_SC04_026
[ OK ] md_SC05_023
[ OK ] md_SC04_028
[ OK ] md_SC04_030
[ OK ] md_SC05_025
[ OK ] md_SC04_027
[ OK ] md_MAIN_007
[ OK ] md_SC05_024
[ OK ] md_SC05_028
[ OK ] md_MAIN_009
[ OK ] md_SC05_027
[ OK ] md_SC03_053
[ OK ] md_SC05_026
[ OK ] md_SC05_029
[ OK ] md_SC03_056
[ OK ] md_SC03_054
[ OK ] md_SC02_009
[ OK ] md_SC07_004
[ OK ] md_SC07_003
extract-all: 217 extracted, 0 failed of 217 (+ main, serial)
[ OK ] resident
[ OK ] ov_SC03_006
[ OK ] ov_SC05_000
[ OK ] ov_SC01_006
[ OK ] ov_SC06_000
[ OK ] ov_SC01_005
[ OK ] ov_SC01_000
[ OK ] ov_SC01_001
[ OK ] ov_SC04_000
[ OK ] ov_SC03_002
[ OK ] ov_SC04_019
[ OK ] ov_SC01_077
[ OK ] ov_SC04_018
[ OK ] ov_SC02_003
[ OK ] ov_SC02_000
[ OK ] ov_SC03_001
[ OK ] main
[ OK ] ov_SC02_004
[ OK ] ov_SC01_074
[ OK ] ov_SC01_080
[ OK ] ov_SC01_004
[ OK ] ov_SC07_000
[ OK ] ov_SC01_008
[ OK ] ov_SC01_084
[ OK ] ov_SC02_015
[ OK ] ov_SC01_009
[ OK ] ov_SC02_016
[ OK ] ov_SC02_011
[ OK ] ov_SC02_021
[ OK ] ov_SC02_017
[ OK ] ov_SC02_026
[ OK ] ov_SC02_005
[ OK ] ov_SC02_027
[ OK ] ov_SC02_031
[ OK ] ov_SC02_039
[ OK ] ov_SC02_035
[ OK ] ov_SC03_003
[ OK ] ov_SC02_041
[ OK ] ov_SC02_028
[ OK ] ov_SC03_010
[ OK ] ov_SC03_007
[ OK ] ov_SC03_011
[ OK ] ov_SC03_012
[ OK ] ov_SC03_023
[ OK ] ov_SC03_013
[ OK ] ov_SC03_024
[ OK ] ov_SC03_015
[ OK ] ov_SC03_014
[ OK ] ov_SC03_028
[ OK ] ov_SC03_030
[ OK ] ov_SC03_031
[ OK ] ov_SC03_029
[ OK ] ov_SC03_089
[ OK ] ov_SC03_090
[ OK ] ov_SC03_095
[ OK ] ov_SC03_092
[ OK ] ov_SC03_093
[ OK ] ov_SC03_094
[ OK ] ov_SC03_091
[ OK ] ov_SC03_096
[ OK ] ov_SC03_097
[ OK ] ov_SC03_098
[ OK ] ov_SC03_099
[ OK ] ov_SC03_100
[ OK ] ov_SC03_101
[ OK ] ov_SC03_102
[ OK ] ov_SC03_103
[ OK ] ov_SC03_109
[ OK ] ov_SC03_104
[ OK ] ov_SC03_108
[ OK ] ov_SC03_110
[ OK ] ov_SC03_111
[ OK ] ov_SC03_113
[ OK ] ov_SC03_114
[ OK ] ov_SC03_115
[ OK ] ov_SC03_105
[ OK ] ov_SC03_112
[ OK ] ov_SC03_116
[ OK ] ov_SC03_117
[ OK ] ov_SC03_118
[ OK ] ov_SC03_119
[ OK ] ov_SC03_121
[ OK ] ov_SC03_126
[ OK ] ov_SC04_004
[ OK ] ov_SC04_002
[ OK ] ov_SC04_003
[ OK ] ov_SC03_125
[ OK ] ov_SC03_124
[ OK ] ov_SC04_005
[ OK ] ov_SC04_008
[ OK ] ov_SC04_006
[ OK ] ov_SC04_007
[ OK ] ov_SC04_009
[ OK ] ov_SC04_010
[ OK ] ov_SC04_011
[ OK ] ov_SC04_012
[ OK ] ov_SC04_015
[ OK ] ov_SC04_016
[ OK ] ov_SC04_021
[ OK ] ov_SC05_002
[ OK ] ov_SC05_003
[ OK ] ov_SC04_020
[ OK ] ov_SC05_001
[ OK ] ov_SC05_005
[ OK ] ov_SC05_004
[ OK ] ov_SC05_006
[ OK ] ov_SC05_007
[ OK ] ov_SC05_008
[ OK ] ov_SC05_009
[ OK ] ov_SC05_010
[ OK ] ov_SC05_011
[ OK ] ov_SC05_017
[ OK ] ov_SC05_018
[ OK ] ov_SC05_019
[ OK ] ov_SC06_010
[ OK ] ov_SC06_011
[ OK ] ov_SC06_008
[ OK ] ov_SC06_013
[ OK ] ov_SC06_006
[ OK ] ov_SC06_015
[ OK ] ov_SC06_014
[ OK ] ov_SC06_016
[ OK ] ov_SC06_020
[ OK ] ov_SC06_018
[ OK ] ov_SC06_022
[ OK ] ov_SC06_025
[ OK ] ov_SC06_024
[ OK ] ov_SC06_027
[ OK ] md_MAIN_013
[ OK ] md_MAIN_014
[ OK ] md_MAIN_015
[ OK ] md_MAIN_016
[ OK ] md_MAIN_017
[ OK ] md_MAIN_018
[ OK ] md_MAIN_019
[ OK ] md_MAIN_020
[ OK ] md_MAIN_021
[ OK ] md_MAIN_022
[ OK ] md_MAIN_023
[ OK ] md_MAIN_024
[ OK ] md_MAIN_025
[ OK ] md_MAIN_026
[ OK ] md_MAIN_027
[ OK ] md_MAIN_028
[ OK ] md_MAIN_029
[ OK ] md_MAIN_030
[ OK ] md_MAIN_031
[ OK ] md_MAIN_032
[ OK ] md_MAIN_033
[ OK ] md_MAIN_034
[ OK ] md_MAIN_035
[ OK ] md_MAIN_036
[ OK ] ov_SC06_030
[ OK ] md_MAIN_037
[ OK ] md_MAIN_038
[ OK ] md_MAIN_040
[ OK ] md_MAIN_039
[ OK ] ov_SC06_029
[ OK ] md_MAIN_042
[ OK ] ov_SC07_009
[ OK ] ov_SC07_001
[ OK ] md_MAIN_043
[ OK ] md_MAIN_044
[ OK ] md_MAIN_045
[ OK ] md_MAIN_047
[ OK ] md_MAIN_046
[ OK ] md_MAIN_001
[ OK ] ov_SC07_008
[ OK ] md_MAIN_008
[ OK ] md_MAIN_041
[ OK ] md_MAIN_011
[ OK ] ov_SC07_002
[ OK ] md_SC07_003
[ OK ] md_SC03_076
[ OK ] md_MAIN_003
[ OK ] md_SC03_077
[ OK ] md_SC07_004
[ OK ] md_SC03_073
[ OK ] md_SC03_074
[ OK ] md_SC03_075
[ OK ] ov_SC07_006
[ OK ] md_SC03_079
[ OK ] md_SC03_132
[ OK ] md_SC04_024
[ OK ] md_SC03_135
[ OK ] md_SC03_136
[ OK ] md_SC03_078
[ OK ] md_SC04_025
[ OK ] md_SC04_026
[ OK ] ov_SC07_007
[ OK ] md_SC03_133
[ OK ] md_SC04_027
[ OK ] md_SC04_029
[ OK ] md_SC03_134
[ OK ] md_SC03_137
[ OK ] md_SC04_030
[ OK ] md_SC03_138
[ OK ] md_SC05_023
[ OK ] md_SC04_028
[ OK ] md_SC05_024
[ OK ] md_SC05_025
+28 -29
View File
@@ -26,50 +26,49 @@
],
"cross_address_deferred": {
"classes": 3801,
"copies": 11600,
"copies": 11340,
"instances": 30347
},
"duplicate_text_classes": 6874,
"duplicate_text_sites": 23325,
"elapsed_s": 27.6,
"duplicate_text_classes": 7385,
"duplicate_text_sites": 24359,
"elapsed_s": 46.9,
"flags": {
"ALIAS": 44,
"ALIAS": 38,
"E": 3826,
"F": 54,
"PINS": 686,
"TWIN-COVERED": 575,
"TWIN-PENDING": 3173,
"TYPEDEF": 96
"PINS": 684,
"TWIN-COVERED": 3748,
"TYPEDEF": 93
},
"ins_by_verdict": {
"A": 6048041,
"B": 1175147,
"C": 667561,
"D": 160892,
"M": 28564
"C": 730731,
"D": 126236,
"M": 50
},
"instances_by_verdict": {
"A": 214478,
"B": 45226,
"C": 14895,
"D": 5740,
"M": 462
"C": 15917,
"D": 5178,
"M": 2
},
"macro_sites": 255947,
"macro_sites": 255728,
"multi_form": 0,
"same_vram_unregistered": {
"classes": 4105,
"collapsible": 6529,
"copies": 10632,
"ins": 1632227,
"instances": 34852,
"twin_pending": 3006,
"twin_pending_instances": 6012
"classes": 1099,
"collapsible": 3658,
"copies": 4755,
"ins": 1257027,
"instances": 28840,
"twin_pending": 0,
"twin_pending_instances": 0
},
"sig_instances": 362389,
"twin_covered": {
"classes": 565,
"instances": 1136
"classes": 3580,
"instances": 7186
},
"twin_sets": [
[
@@ -98,9 +97,9 @@
"verdicts": {
"A": 1712,
"B": 282,
"C": 6135,
"D": 1833,
"M": 218
"C": 6640,
"D": 1545,
"M": 1
},
"violations": 4105
"violations": 1099
}
+8 -8
View File
@@ -1,11 +1,11 @@
share_census: 218 binaries · 362,389 sig instances · 362,389 classified · 0 UNACCOUNTED · 10,180 h_exact classes with >=2 instances
verdicts (classes): A 1,712 · B 282 · C 6,135 · D 1,833 · M 218
instances by verdict: A 214,478 · B 45,226 · C 14,895 · D 5,740 · M 462
flags: ALIAS 44 · E 3,826 · F 54 · PINS 686 · TWIN-COVERED 575 · TWIN-PENDING 3,173 · TYPEDEF 96
SAME-VRAM UNREGISTERED (the phase's backlog): 4,105 classes · 34,852 instances · 10,632 private copies · 6,529 collapsible · 1,632,227 ins; of which twin-pending 3,006 classes / 6,012 instances
TWIN-COVERED (one source directory per payload, T3): 565 classes · 1,136 instances
CROSS-ADDRESS / CROSS-SPACE (deferred to the names phase): 3,801 classes · 30,347 instances · 11,600 private copies
S1 violations (scope as run): 4,105 · multi-form instances 0 · unresolved names 0
verdicts (classes): A 1,712 · B 282 · C 6,640 · D 1,545 · M 1
instances by verdict: A 214,478 · B 45,226 · C 15,917 · D 5,178 · M 2
flags: ALIAS 38 · E 3,826 · F 54 · PINS 684 · TWIN-COVERED 3,748 · TYPEDEF 93
SAME-VRAM UNREGISTERED (the phase's backlog): 1,099 classes · 28,840 instances · 4,755 private copies · 3,658 collapsible · 1,257,027 ins; of which twin-pending 0 classes / 0 instances
TWIN-COVERED (one source directory per payload, T3): 3,580 classes · 7,186 instances
CROSS-ADDRESS / CROSS-SPACE (deferred to the names phase): 3,801 classes · 30,347 instances · 11,340 private copies
S1 violations (scope as run): 1,099 · multi-form instances 0 · unresolved names 0
controls (R39):
func_80144B9C got B/141/{'include': 141}/missing 7 expected B/141/{'include': 141}/missing 7 (the registry lists 134; T5 bucket 0 extends it)
clearTbl40 got A+E/2 expected A+E/2
@@ -37,4 +37,4 @@ share_census: 218 binaries · 362,389 sig instances · 362,389 classified · 0 U
B E,F 11852 x 2 0x80014554,0x8001455C,0x8001513C func_80014554,func_8001455c
A - 141 x 167 0x80163C2C func_80163c2c
A - 141 x 165 0x80178004 func_80178004
macro sites 255,947 · duplicate-text classes 6,874 (23,325 sites) · elapsed 27.6 s
macro sites 255,728 · duplicate-text classes 7,385 (24,359 sites) · elapsed 46.9 s
@@ -22,7 +22,14 @@ def carves(tu):
out.append((a, end))
return out
def compiled_tables(tu):
cmd = subprocess.run(['make', '-n', '-W', 'src/%s/%s.c' % (b, tu), 'build/src/%s/%s.o' % (b, tu), 'BINARY=%s' % b], capture_output=True, text=True).stdout
# Phase 35 T3: the TU's source comes from the binary's source dir through the oracle — a twin's objects
# (build/src/<twin>/<twin>_x.o) are compiled from src/<primary>/<primary>_x.c (R33; a hand-built src/<b>/ path
# found no compile line for a twin and raised IndexError here).
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import corpus
prim = corpus.twin_of(b) or b
src = os.path.join(corpus.src_dir(b), tu.replace(b, prim, 1) + '.c')
cmd = subprocess.run(['make', '-n', '-W', src, 'build/src/%s/%s.o' % (b, tu), 'BINARY=%s' % b], capture_output=True, text=True).stdout
line = [l for l in cmd.splitlines() if 'cc1' in l][0]
line = re.sub(r'\|\s*\.venv/bin/python\s+tools/jtbl_rodata_pads\.py[^|]*', '', line)
line = re.sub(r'\|\s*[^|]*mipsel-linux-gnu-as.*$', '', line)
+1 -1
View File
@@ -85,7 +85,7 @@ then what proved it. The same data generates the day-one kit's manifest and its
| When you need to… | Tool | What it does | Proven by | Adapt | Class |
|---|---|---|---|---|---|
| answer from one derived model whether each function is open, matched or shared | `corpus.py` | The single derived model of the source tree: open, matched or shared, per function | Makefile, api_agent.py, aprop_autodraft.py, aprop_symfix.py (+66) | repo src/config layout | LIVE |
| answer from one derived model whether each function is open, matched or shared | `corpus.py` | The single derived model of the source tree: open, matched or shared, per function | Makefile, api_agent.py, aprop_autodraft.py, aprop_symfix.py (+67) | repo src/config layout | LIVE |
| assert every consumer knows about each newly onboarded binary | `audit_binaries.py` | Gate asserting every consumer knows about each newly onboarded binary | Makefile | repo config/registry paths | LIVE |
| assert every tracked source is plain text so text searches never skip it | `audit_text_sources.py` | Every tracked C source must be plain text, or text searches silently skip it | .github/workflows/no-rom.yml, Makefile | repo src paths | LIVE |
| check that the independent what-remains views agree with the corpus oracle | `audit_frontier.py` | Checks that the independent "what remains" views agree with the corpus oracle | Makefile | repo paths | LIVE |
+29 -3
View File
@@ -41,8 +41,10 @@
green (audit-binaries OK · dedup-check 2220/0 · cdecl · report + `progress.py --check` fresh · doc_links · wiki_render · kit_lint ·
cookbook-index · gccmap_cites · ghidra_roster), one red rung — the kit's verbatim copies of the edited tools — fixed by
`make kit-corpus` (17 copies) with the rungs after it re-run individually by exit code. The +7 count correction published.
- ☐ **T3** — twin binaries → one source directory: SC01_005/006 (probe), SC03_118/119, SC02_000/003, SC04_018/019, SC03_014/015 (carve
alignment, R60); one commit per pair; the clean fleet run after the last.
- ☑ **T3** (S94) — twin binaries → one source directory: the five pairs collapsed (probe SC01_005/006 with the race test; SC03_118/119 +
SC02_000/003 equal carves; SC04_018/019 + SC03_014/015 with the primary's carve, interleave + pads regenerated, R60 checks), each
twin and primary BYTE-IDENTICAL, 166 source files deleted; the census: same-vram backlog 4,667 → 1,099 classes; the clean fleet
run after the last pair (see the log).
- ☐ **T4** — `tools/macro_to_header.py`: the fleet converted in L0-gated batches; `engine_core.h`/`ov_setters.h`/`clearTbl40.h` deleted (clearTbl40
→ the parameterized control); `func_80144B9C.h` moved; the registry's `source:`/`func:` rewritten surgically; clean fleet 218/218.
- ☐ **T5** — `tools/share_body.py`: bucket 0 `--extend` (206 classes), then the same-vram buckets largest reach first (no trivial exception);
@@ -157,6 +159,30 @@
`TWIN_SRC_DIR` matched the `_SRC_DIR` oracle regex as a binary named `TWIN` → renamed `TWIN_SRCDIR`; after it the census shows
**TWIN-COVERED 575 classes** for the pair (twin-pending 3,748 → 3,173), twin symmetry 653/653 unchanged. The census's `copies` now
counts DISTINCT private sites (a twin's instance resolves to its primary's TU — one source), `collapsible` = copies − 1.
Commit `9b0816e74`.
- **S94 — T3 pairs 2–3 (equal carves, mechanical):** `ov_SC03_119` TWIN_OF `ov_SC03_118` (31 files removed; both `77ee78dd…`
BYTE-IDENTICAL), `ov_SC02_003` TWIN_OF `ov_SC02_000` (37 files; both `5ece4bca…`); `audit-binaries: OK`; dedup-check per twin
0 failed. Commit `e79cfcc06`.
- **S94 — T3 pairs 4–5 (carve alignment, R60):** the twin's yaml := the primary's with the alias and `FILE_nnn` substituted (+ the
twin note + `create_c_files: False`), its `_JTBL_INTERLEAVE` := the primary's substituted — and, found by the first build's
failure (`missing .end at end of assembly` on `ov_SC04_019_jr_8017AE2C.o`): the per-object **`JTBL_PADS` lines are keyed by
OBJECT PATH** (`build/src/<twin>/…`), which my alias-normalized block diff (lines starting with the alias) never compared, so the
twin still carried its retired carve's pads (4 differing lines for SC04, 2 for SC03; the three committed pairs re-checked: 0, 0, 0).
Regenerated from the primaries by substitution → 0 differing. `pads_audit.py` built `src/<b>/<tu>.c` by hand and raised
IndexError on a twin — now reads the source through the oracle (`corpus.src_dir` + `twin_of`). **Verify:** `ov_SC04_019` +
`ov_SC04_018` BYTE-IDENTICAL (`fe9b413f…`), `ov_SC03_015` + `ov_SC03_014` (`d84b01a2…`); `interleave_check` ALIGNED (n=51, n=46);
`pads_audit` ok on every carve object; dedup-check 0 failed; `audit-binaries: OK` (CHECK 3b incl. equal carves). Commits
`2648aa5a9`, `6ebb3dac3`.
- **S94 — T3 census after the five collapses:** TWIN-COVERED 3,748 classes (3,580 non-A, 7,186 instances); **same-vram unregistered
4,667 → 1,099 classes · 4,755 private sites · 3,658 collapsible · 28,840 instances** (twin-pending 0); `S1: … 10,180 classes, 9,081
satisfied (3,580 twin-covered, 0 excepted, 3,801 deferred cross-address), 1,099 VIOLATION(S)` — the backlog T5 shares. The controls
unchanged (twin symmetry 653/653). `make kit-corpus` for `pads_audit` + `share_census`; `tool_census --check: OK`.
- **S94 — Rules check (P6, after T3 = four tasks): re-read complete (CLAUDE.md's eight mandatory behaviours; PROJECT_CONTEXT's 23
P/G/H/X rules). Continuing with T4.**
- **S94 — T3 close, R22:** `make clean && make extract-all JOBS=16 && make check-all JOBS=16` → `extract-all: 217 extracted, 0 failed of
217 (+ main, serial)` · **`check-all: 218 passed, 0 failed of 218`** · `wall=308.78 s` (the census and the kit corpus ran beside it) ·
`exit=0` (`.run/P35/baseline/r22_t3.log`). Twins: 5 pairs / 10 aliases / 166 source files deleted; every twin builds from
its primary's directory. **T3 ☑.**
## Approved plan (verbatim, gate 1 — 2026-09-08)
@@ -450,7 +476,7 @@ same commit — history keeps it.
Candidate for the PhaseEnd: "a shared body has exactly one source; a duplicate copy is a defect the health chain asserts, and a
count of them is published with its rule" (this phase's invariant).
## 🛑 SESSION CHECKPOINT — S94 (2026-09-08): Phase 35 OPEN at gate 1; T0 ☑, T1 ☑ (the census), T2 ☑ (the health chain knows the include + twin forms; the +7 correction published); NEXT = T3 twin binaries → one source directory (probe pair SC01_005/006)
## 🛑 SESSION CHECKPOINT — S94 (2026-09-08): Phase 35 OPEN at gate 1; T0–T3 ☑ (the census; the health chain knows the include + twin forms; the five twin pairs collapsed, fleet 218/218 from clean); NEXT = T4 `tools/macro_to_header.py` (written, its --plan being shaken out)
### 0. How to use this block
A fresh session reads CLAUDE.md's load order, replays THIS block verbatim, and resumes at the first unchecked task in §Tasks above.