diff --git a/.run/P35/baseline/kit_corpus_t6b.log b/.run/P35/baseline/kit_corpus_t6b.log new file mode 100644 index 0000000000..3ccf705b17 --- /dev/null +++ b/.run/P35/baseline/kit_corpus_t6b.log @@ -0,0 +1,5 @@ +.venv/bin/python tools/tool_census.py --all +tool_census: 295 tool files (find == git ls-files) + 38 retired; classes {'LIVE': 236, 'ORPHAN': 30, 'REFERENCED': 29, 'RETIRED': 38}; dictionary rows 333 +tool_census: wrote docs/tool-index.md +tool_census: wrote decomp-architect/tools/MANIFEST.md +tool_census: corpus materialised — 361 verbatim copies, 30 pointers, INDEX.md diff --git a/.run/P35/baseline/kit_corpus_t6c.log b/.run/P35/baseline/kit_corpus_t6c.log new file mode 100644 index 0000000000..3ccf705b17 --- /dev/null +++ b/.run/P35/baseline/kit_corpus_t6c.log @@ -0,0 +1,5 @@ +.venv/bin/python tools/tool_census.py --all +tool_census: 295 tool files (find == git ls-files) + 38 retired; classes {'LIVE': 236, 'ORPHAN': 30, 'REFERENCED': 29, 'RETIRED': 38}; dictionary rows 333 +tool_census: wrote docs/tool-index.md +tool_census: wrote decomp-architect/tools/MANIFEST.md +tool_census: corpus materialised — 361 verbatim copies, 30 pointers, INDEX.md diff --git a/.run/P35/baseline/tools_health_t6.log b/.run/P35/baseline/tools_health_t6.log new file mode 100644 index 0000000000..e9eaa15139 --- /dev/null +++ b/.run/P35/baseline/tools_health_t6.log @@ -0,0 +1,3611 @@ +# Regenerate the byte-derived boundary oracles FIRST (they're gitignored/regenerable), so the +# audit checks CURRENT sigs and never crashes on an absent one — the resident audit (T10) needs +# the sig_image resident sig, and a fresh clone has neither it nor the overlay sigs. +make --no-print-directory sig-overlays +make --no-print-directory sig-resident +make --no-print-directory sig-modules +# main's independent oracle (P31 S77, contract §1.3). Regenerated here for the same reason as +# the others: it is derived and gitignored, and an oracle wired into nothing runs for nobody — +# neighbor_ref sat MANUAL from S68 to S77 while the playbook called it the biggest cost lever +# in the wave. Without this line sig_is_independent("main") silently reverts to False on a +# fresh clone and main's boundary blind spot comes back with the audit still green. +make --no-print-directory sig-main-oracle +# P33 A2: main's build-derived game-code sig — the one the fleet digest weighs main by. Regenerated +# here for the R51 reason: progress.py prefers it, so a stale copy would be a stale denominator. +make --no-print-directory sig-main +# P33 A3: the with/without-SDK dual (contract §1.2). Skipped, loudly, on a machine without the SDK +# objects — there every build already IS the without leg, and running it twice would prove nothing. +if [ -d ".run/obj40/libcd" ] && [ -d ".run/obj42/libpad421" ]; then +make --no-print-directory sdk-dual +else +echo "[skip] sdk-dual: no SDK objects on this machine — the default build IS the no-SDK leg" +fi +make --no-print-directory audit-corpus +make --no-print-directory audit-cdecl +make --no-print-directory audit-binaries +make --no-print-directory audit-text-sources +make --no-print-directory report BINARY=main +# AFTER report (which regenerates the digest), so this asserts the freshly-written digest agrees +# with the tree — and, on a tree whose digest was committed stale, says so instead of staying green. +make --no-print-directory audit-digest +# The cookbook index is DERIVED (R33) and self-asserts its coverage (R32). Stale = agents can't +# find documented idioms and re-derive them at full token cost (measured, P30 wave 1). +.venv/bin/python tools/cookbook_index.py --check +.venv/bin/python tools/gccmap_cites.py --check +# P33 B5: the Ghidra roster is DERIVED from config/ghidra/*.jsonl (R33); a stale roster misreports +# which programs' RE work is tracked as text. Pure text check, no Ghidra needed. +.venv/bin/python tools/ghidra_roster.py --check +# P33 D5 (+ P33.5 task 7): every relative link in the public-facing docs resolves (pending pages are listed, and must be +# gone by gate 2); nothing links into docs/sunset/; a wiki page links into docs/ only at a Reference-index/README target; +# every docs/ file is covered by one; a wiki page cites only TRACKED paths. The render selftest also asserts every page +# is reachable from the sidebar. +.venv/bin/python tools/doc_links.py +.venv/bin/python tools/wiki_render.py --selftest +# P33.5 task 7: the ROM-firewall page's ```gitignore fence IS the kit's template (one source, two copies). Skips loudly +# until the kit's template exists (task 11); exit 2 from the tool = "nothing to compare", never a pass (R43). +if [ -f decomp-architect/templates/gitignore.decomp ]; then +.venv/bin/python tools/gitignore_template_check.py +else +echo "[skip] gitignore-template: decomp-architect/templates/gitignore.decomp does not exist yet (Phase 33.5 task 11)" +fi +# P33.5 task 11: the day-one decomp kit stays free of this project's names/paths/addresses/rule numbers (fence-aware), +# honours its placeholder contract, and its scripts parse; the selftest is the R39 control (a planted leak MUST fail). +.venv/bin/python tools/kit_lint.py --selftest +.venv/bin/python tools/kit_lint.py +# P33.5 task 13.5: the tool census — the two enumerations agree (find == git ls-files), every tool has a dictionary row and +# every row a file, the need-keyed docs/tool-index.md and the kit's MANIFEST are fresh, the three verbatim corpora under +# decomp-architect/corpus/ are byte-equal to their sources (regenerate with `make kit-corpus`). +.venv/bin/python tools/tool_census.py --check +# P33.5 task 14.5 (Drew: "the whole of our experience?"): the kit's distillation cites or dispositions EVERY rule (R1..RN from +# the digest) and EVERY accelerator entry; an uncovered one fails here unless config/kit_coverage_map.tsv says where it went. +.venv/bin/python tools/kit_coverage.py +.venv/bin/python tools/xsig/tests/test_xsig.py 2>&1 | tail -1 | grep -q '^OK' && echo 'xsig tests: OK (8)' || { echo 'xsig tests: FAIL'; exit 1; } +# Behavioural guards (P31 S70): tools-health audits DATA integrity; these assert that a tool +# ACTUALLY DID the work it reports. A guard that is not running is not a guard (R54). +.venv/bin/python tools/work_evidence.py --selftest +# P31 S72: a code subseg owning raw jump tables in >1 non-adjacent span makes every switch +# function outside the one carveable span UNBANKABLE — `main` sat in that state from Phase 7 to +# Phase 31 and eleven functions were written off as "PROVEN gate-rejects" because of it. The +# evidence is derivable from the raw image on day one; nothing was comparing it. 3.7s fleet-wide. +.venv/bin/python tools/split_indicator.py --self-test +# P31 S74: A HARD GATE NOW, exactly as the informational form said it would become. The four +# violations it was waiting on (ov_SC01_084, ov_SC02_005, ov_SC02_011, ov_SC03_105 — 16 open +# fns / 3,613 ins) are split, so the fleet is 213/213 OK and any NEW subseg owning raw tables +# in >1 non-adjacent span is a regression that must fail here rather than be echoed past. +.venv/bin/python tools/split_indicator.py --quiet +echo "tools-health: OK — sigs fresh; corpus(+resident) + cdecl + binaries + report(lint+dedup) + cookbook-index all green." +# PARALLEL (P31 S70). 211 independent per-overlay invocations that each write ONLY their own +# .run/sig..jsonl (sig_image has exactly one write path, verified) — embarrassingly +# parallel, and it was a serial `for` loop on a 32-core box while extract-all/check-all in this +# same file already fan out. MEASURED, correcting my first claim: this was only ~52s of +# tools-health, NOT the bulk — audit-cdecl's pure-Python collection pass (~787s) is the real cost. +# Still worth it (52s -> 3.9s, 141/141 outputs byte-identical) and it is Drew's standing bar: +# a slow gate is a BUG, nothing serial. +mkdir -p .run; : > .run/sig-overlays.txt +echo "ov_SC01_077:extracted/retail/SC01.CD.dir/FILE_077.dir/0.4.dec ov_SC01_005:extracted/retail/SC01.CD.dir/FILE_005.dir/0.4.dec ov_SC01_006:extracted/retail/SC01.CD.dir/FILE_006.dir/0.4.dec ov_SC03_001:extracted/retail/SC03.CD.dir/FILE_001.dir/0.4.dec ov_SC01_000:extracted/retail/SC01.CD.dir/FILE_000.dir/0.4.dec ov_SC01_001:extracted/retail/SC01.CD.dir/FILE_001.dir/0.4.dec ov_SC02_000:extracted/retail/SC02.CD.dir/FILE_000.dir/0.4.dec ov_SC02_003:extracted/retail/SC02.CD.dir/FILE_003.dir/0.4.dec ov_SC03_002:extracted/retail/SC03.CD.dir/FILE_002.dir/0.4.dec ov_SC03_006:extracted/retail/SC03.CD.dir/FILE_006.dir/0.4.dec ov_SC04_000:extracted/retail/SC04.CD.dir/FILE_000.dir/0.4.dec ov_SC04_018:extracted/retail/SC04.CD.dir/FILE_018.dir/0.4.dec ov_SC04_019:extracted/retail/SC04.CD.dir/FILE_019.dir/0.4.dec ov_SC05_000:extracted/retail/SC05.CD.dir/FILE_000.dir/0.4.dec ov_SC06_000:extracted/retail/SC06.CD.dir/FILE_000.dir/0.4.dec ov_SC07_000:extracted/retail/SC07.CD.dir/FILE_000.dir/0.4.dec ov_SC01_004:extracted/retail/SC01.CD.dir/FILE_004.dir/0.4.dec ov_SC01_008:extracted/retail/SC01.CD.dir/FILE_008.dir/0.4.dec ov_SC01_009:extracted/retail/SC01.CD.dir/FILE_009.dir/0.4.dec ov_SC01_074:extracted/retail/SC01.CD.dir/FILE_074.dir/0.4.dec ov_SC01_080:extracted/retail/SC01.CD.dir/FILE_080.dir/0.4.dec ov_SC01_084:extracted/retail/SC01.CD.dir/FILE_084.dir/0.4.dec ov_SC02_004:extracted/retail/SC02.CD.dir/FILE_004.dir/0.4.dec ov_SC02_005:extracted/retail/SC02.CD.dir/FILE_005.dir/0.4.dec ov_SC02_011:extracted/retail/SC02.CD.dir/FILE_011.dir/0.4.dec ov_SC02_015:extracted/retail/SC02.CD.dir/FILE_015.dir/0.4.dec ov_SC02_016:extracted/retail/SC02.CD.dir/FILE_016.dir/0.4.dec ov_SC02_017:extracted/retail/SC02.CD.dir/FILE_017.dir/0.4.dec ov_SC02_021:extracted/retail/SC02.CD.dir/FILE_021.dir/0.4.dec ov_SC02_026:extracted/retail/SC02.CD.dir/FILE_026.dir/0.4.dec ov_SC02_027:extracted/retail/SC02.CD.dir/FILE_027.dir/0.4.dec ov_SC02_028:extracted/retail/SC02.CD.dir/FILE_028.dir/0.4.dec ov_SC02_031:extracted/retail/SC02.CD.dir/FILE_031.dir/0.4.dec ov_SC02_035:extracted/retail/SC02.CD.dir/FILE_035.dir/0.4.dec ov_SC02_039:extracted/retail/SC02.CD.dir/FILE_039.dir/0.4.dec ov_SC02_041:extracted/retail/SC02.CD.dir/FILE_041.dir/0.4.dec ov_SC03_003:extracted/retail/SC03.CD.dir/FILE_003.dir/0.4.dec ov_SC03_007:extracted/retail/SC03.CD.dir/FILE_007.dir/0.4.dec ov_SC03_010:extracted/retail/SC03.CD.dir/FILE_010.dir/0.4.dec ov_SC03_011:extracted/retail/SC03.CD.dir/FILE_011.dir/0.4.dec ov_SC03_012:extracted/retail/SC03.CD.dir/FILE_012.dir/0.4.dec ov_SC03_013:extracted/retail/SC03.CD.dir/FILE_013.dir/0.4.dec ov_SC03_014:extracted/retail/SC03.CD.dir/FILE_014.dir/0.4.dec ov_SC03_015:extracted/retail/SC03.CD.dir/FILE_015.dir/0.4.dec ov_SC03_023:extracted/retail/SC03.CD.dir/FILE_023.dir/0.4.dec ov_SC03_024:extracted/retail/SC03.CD.dir/FILE_024.dir/0.4.dec ov_SC03_028:extracted/retail/SC03.CD.dir/FILE_028.dir/0.4.dec ov_SC03_029:extracted/retail/SC03.CD.dir/FILE_029.dir/0.4.dec ov_SC03_030:extracted/retail/SC03.CD.dir/FILE_030.dir/0.4.dec ov_SC03_031:extracted/retail/SC03.CD.dir/FILE_031.dir/0.4.dec ov_SC03_089:extracted/retail/SC03.CD.dir/FILE_089.dir/0.4.dec ov_SC03_090:extracted/retail/SC03.CD.dir/FILE_090.dir/0.4.dec ov_SC03_091:extracted/retail/SC03.CD.dir/FILE_091.dir/0.4.dec ov_SC03_092:extracted/retail/SC03.CD.dir/FILE_092.dir/0.4.dec ov_SC03_093:extracted/retail/SC03.CD.dir/FILE_093.dir/0.4.dec ov_SC03_094:extracted/retail/SC03.CD.dir/FILE_094.dir/0.4.dec ov_SC03_095:extracted/retail/SC03.CD.dir/FILE_095.dir/0.4.dec ov_SC03_096:extracted/retail/SC03.CD.dir/FILE_096.dir/0.4.dec ov_SC03_097:extracted/retail/SC03.CD.dir/FILE_097.dir/0.4.dec ov_SC03_098:extracted/retail/SC03.CD.dir/FILE_098.dir/0.4.dec ov_SC03_099:extracted/retail/SC03.CD.dir/FILE_099.dir/0.4.dec ov_SC03_100:extracted/retail/SC03.CD.dir/FILE_100.dir/0.4.dec ov_SC03_101:extracted/retail/SC03.CD.dir/FILE_101.dir/0.4.dec ov_SC03_102:extracted/retail/SC03.CD.dir/FILE_102.dir/0.4.dec ov_SC03_103:extracted/retail/SC03.CD.dir/FILE_103.dir/0.4.dec ov_SC03_104:extracted/retail/SC03.CD.dir/FILE_104.dir/0.4.dec ov_SC03_105:extracted/retail/SC03.CD.dir/FILE_105.dir/0.4.dec ov_SC03_108:extracted/retail/SC03.CD.dir/FILE_108.dir/0.4.dec ov_SC03_109:extracted/retail/SC03.CD.dir/FILE_109.dir/0.4.dec ov_SC03_110:extracted/retail/SC03.CD.dir/FILE_110.dir/0.4.dec ov_SC03_111:extracted/retail/SC03.CD.dir/FILE_111.dir/0.4.dec ov_SC03_112:extracted/retail/SC03.CD.dir/FILE_112.dir/0.4.dec ov_SC03_113:extracted/retail/SC03.CD.dir/FILE_113.dir/0.4.dec ov_SC03_114:extracted/retail/SC03.CD.dir/FILE_114.dir/0.4.dec ov_SC03_115:extracted/retail/SC03.CD.dir/FILE_115.dir/0.4.dec ov_SC03_116:extracted/retail/SC03.CD.dir/FILE_116.dir/0.4.dec ov_SC03_117:extracted/retail/SC03.CD.dir/FILE_117.dir/0.4.dec ov_SC03_118:extracted/retail/SC03.CD.dir/FILE_118.dir/0.4.dec ov_SC03_119:extracted/retail/SC03.CD.dir/FILE_119.dir/0.4.dec ov_SC03_121:extracted/retail/SC03.CD.dir/FILE_121.dir/0.4.dec ov_SC03_124:extracted/retail/SC03.CD.dir/FILE_124.dir/0.4.dec ov_SC03_125:extracted/retail/SC03.CD.dir/FILE_125.dir/0.4.dec ov_SC03_126:extracted/retail/SC03.CD.dir/FILE_126.dir/0.4.dec ov_SC04_002:extracted/retail/SC04.CD.dir/FILE_002.dir/0.4.dec ov_SC04_003:extracted/retail/SC04.CD.dir/FILE_003.dir/0.4.dec ov_SC04_004:extracted/retail/SC04.CD.dir/FILE_004.dir/0.4.dec ov_SC04_005:extracted/retail/SC04.CD.dir/FILE_005.dir/0.4.dec ov_SC04_006:extracted/retail/SC04.CD.dir/FILE_006.dir/0.4.dec ov_SC04_007:extracted/retail/SC04.CD.dir/FILE_007.dir/0.4.dec ov_SC04_008:extracted/retail/SC04.CD.dir/FILE_008.dir/0.4.dec ov_SC04_009:extracted/retail/SC04.CD.dir/FILE_009.dir/0.4.dec ov_SC04_010:extracted/retail/SC04.CD.dir/FILE_010.dir/0.4.dec ov_SC04_011:extracted/retail/SC04.CD.dir/FILE_011.dir/0.4.dec ov_SC04_012:extracted/retail/SC04.CD.dir/FILE_012.dir/0.4.dec ov_SC04_015:extracted/retail/SC04.CD.dir/FILE_015.dir/0.4.dec ov_SC04_016:extracted/retail/SC04.CD.dir/FILE_016.dir/0.4.dec ov_SC04_020:extracted/retail/SC04.CD.dir/FILE_020.dir/0.4.dec ov_SC04_021:extracted/retail/SC04.CD.dir/FILE_021.dir/0.4.dec ov_SC05_001:extracted/retail/SC05.CD.dir/FILE_001.dir/0.4.dec ov_SC05_002:extracted/retail/SC05.CD.dir/FILE_002.dir/0.4.dec ov_SC05_003:extracted/retail/SC05.CD.dir/FILE_003.dir/0.4.dec ov_SC05_004:extracted/retail/SC05.CD.dir/FILE_004.dir/0.4.dec ov_SC05_005:extracted/retail/SC05.CD.dir/FILE_005.dir/0.4.dec ov_SC05_006:extracted/retail/SC05.CD.dir/FILE_006.dir/0.4.dec ov_SC05_007:extracted/retail/SC05.CD.dir/FILE_007.dir/0.4.dec ov_SC05_008:extracted/retail/SC05.CD.dir/FILE_008.dir/0.4.dec ov_SC05_009:extracted/retail/SC05.CD.dir/FILE_009.dir/0.4.dec ov_SC05_010:extracted/retail/SC05.CD.dir/FILE_010.dir/0.4.dec ov_SC05_011:extracted/retail/SC05.CD.dir/FILE_011.dir/0.4.dec ov_SC05_017:extracted/retail/SC05.CD.dir/FILE_017.dir/0.4.dec ov_SC05_018:extracted/retail/SC05.CD.dir/FILE_018.dir/0.4.dec ov_SC05_019:extracted/retail/SC05.CD.dir/FILE_019.dir/0.4.dec ov_SC06_006:extracted/retail/SC06.CD.dir/FILE_006.dir/0.4.dec ov_SC06_008:extracted/retail/SC06.CD.dir/FILE_008.dir/0.4.dec ov_SC06_010:extracted/retail/SC06.CD.dir/FILE_010.dir/0.4.dec ov_SC06_011:extracted/retail/SC06.CD.dir/FILE_011.dir/0.4.dec ov_SC06_013:extracted/retail/SC06.CD.dir/FILE_013.dir/0.4.dec ov_SC06_014:extracted/retail/SC06.CD.dir/FILE_014.dir/0.4.dec ov_SC06_015:extracted/retail/SC06.CD.dir/FILE_015.dir/0.4.dec ov_SC06_016:extracted/retail/SC06.CD.dir/FILE_016.dir/0.4.dec ov_SC06_018:extracted/retail/SC06.CD.dir/FILE_018.dir/0.4.dec ov_SC06_020:extracted/retail/SC06.CD.dir/FILE_020.dir/0.4.dec ov_SC06_022:extracted/retail/SC06.CD.dir/FILE_022.dir/0.4.dec ov_SC06_024:extracted/retail/SC06.CD.dir/FILE_024.dir/0.4.dec ov_SC06_025:extracted/retail/SC06.CD.dir/FILE_025.dir/0.4.dec ov_SC06_027:extracted/retail/SC06.CD.dir/FILE_027.dir/0.4.dec ov_SC06_029:extracted/retail/SC06.CD.dir/FILE_029.dir/0.4.dec ov_SC06_030:extracted/retail/SC06.CD.dir/FILE_030.dir/0.4.dec ov_SC06_032:extracted/retail/SC06.CD.dir/FILE_032.dir/0.4.dec ov_SC06_033:extracted/retail/SC06.CD.dir/FILE_033.dir/0.4.dec ov_SC07_001:extracted/retail/SC07.CD.dir/FILE_001.dir/0.4.dec ov_SC07_002:extracted/retail/SC07.CD.dir/FILE_002.dir/0.4.dec ov_SC07_008:extracted/retail/SC07.CD.dir/FILE_008.dir/0.4.dec ov_SC07_009:extracted/retail/SC07.CD.dir/FILE_009.dir/0.4.dec ov_SC07_006:extracted/retail/SC07.CD.dir/FILE_006.dir/1.4.dec ov_SC07_007:extracted/retail/SC07.CD.dir/FILE_007.dir/1.4.dec ov_SC07_010:extracted/retail/SC07.CD.dir/FILE_010.dir/1.4.dec ov_SC07_011:extracted/retail/SC07.CD.dir/FILE_011.dir/1.4.dec ov_MAIN_012:extracted/retail/MAIN.CD.dir/FILE_012.dir/1.1 ov_SC02_037:extracted/retail/SC02.CD.dir/FILE_037.dir/0.1 ov_SC03_107:extracted/retail/SC03.CD.dir/FILE_107.dir/0.1" | tr ' ' '\n' | sed '/^$/d' | xargs -P16 -I{} sh -c '\ + job="{}"; alias=${job%%:*}; f=${job#*:}; \ + if [ ! -f "$f" ]; then echo "[WARN no payload] $alias ($f)"; \ + elif .venv/bin/python tools/sig_image.py --image "$f" --vram-base 0x80128158 --bootstrap --name "$alias" >/dev/null 2>&1; \ + then echo "[ OK ] $alias"; else echo "[SIG FAIL] $alias"; fi' | tee .run/sig-overlays.txt +n=$(grep -c "^\[ OK \]" .run/sig-overlays.txt || true) +bad=$(grep -c "^\[SIG FAIL\]" .run/sig-overlays.txt || true) +echo "sig-overlays: signed $n overlays -> .run/sig.ov_*.jsonl (of 141 onboarded)" +# The serial form had NO failure detection at all — a sig_image crash just vanished (R32). +if [ "$bad" -ne 0 ]; then echo "[FAIL] sig-overlays: $bad overlay(s) failed to sign"; exit 1; fi +[ OK ] ov_SC05_000 +[ OK ] ov_SC01_005 +[ OK ] ov_SC04_000 +[ OK ] ov_SC04_019 +[ OK ] ov_SC07_000 +[ OK ] ov_SC01_000 +[ OK ] ov_SC01_077 +[ OK ] ov_SC01_001 +[ OK ] ov_SC03_002 +[ OK ] ov_SC01_006 +[ OK ] ov_SC02_003 +[ OK ] ov_SC02_000 +[ OK ] ov_SC04_018 +[ OK ] ov_SC03_006 +[ OK ] ov_SC03_001 +[ OK ] ov_SC06_000 +[ OK ] ov_SC01_004 +[ OK ] ov_SC01_074 +[ OK ] ov_SC01_080 +[ OK ] ov_SC01_084 +[ OK ] ov_SC01_008 +[ OK ] ov_SC02_004 +[ OK ] ov_SC01_009 +[ OK ] ov_SC02_005 +[ OK ] ov_SC02_028 +[ OK ] ov_SC02_021 +[ OK ] ov_SC02_015 +[ OK ] ov_SC02_017 +[ OK ] ov_SC02_027 +[ OK ] ov_SC02_026 +[ OK ] ov_SC02_011 +[ OK ] ov_SC02_016 +[ OK ] ov_SC02_031 +[ OK ] ov_SC02_035 +[ OK ] ov_SC02_039 +[ OK ] ov_SC03_011 +[ OK ] ov_SC03_007 +[ OK ] ov_SC03_010 +[ OK ] ov_SC03_013 +[ OK ] ov_SC03_023 +[ OK ] ov_SC03_024 +[ OK ] ov_SC03_014 +[ OK ] ov_SC03_015 +[ OK ] ov_SC03_028 +[ OK ] ov_SC02_041 +[ OK ] ov_SC03_012 +[ OK ] ov_SC03_003 +[ OK ] ov_SC03_031 +[ OK ] ov_SC03_029 +[ OK ] ov_SC03_030 +[ OK ] ov_SC03_089 +[ OK ] ov_SC03_090 +[ OK ] ov_SC03_091 +[ OK ] ov_SC03_092 +[ OK ] ov_SC03_094 +[ OK ] ov_SC03_093 +[ OK ] ov_SC03_095 +[ OK ] ov_SC03_096 +[ OK ] ov_SC03_098 +[ OK ] ov_SC03_099 +[ OK ] ov_SC03_100 +[ OK ] ov_SC03_097 +[ OK ] ov_SC03_101 +[ OK ] ov_SC03_102 +[ OK ] ov_SC03_104 +[ OK ] ov_SC03_103 +[ OK ] ov_SC03_108 +[ OK ] ov_SC03_109 +[ OK ] ov_SC03_110 +[ OK ] ov_SC03_105 +[ OK ] ov_SC03_111 +[ OK ] ov_SC03_114 +[ OK ] ov_SC03_113 +[ OK ] ov_SC03_116 +[ OK ] ov_SC03_115 +[ OK ] ov_SC03_117 +[ OK ] ov_SC03_121 +[ OK ] ov_SC03_118 +[ OK ] ov_SC03_119 +[ OK ] ov_SC03_112 +[ OK ] ov_SC03_126 +[ OK ] ov_SC03_124 +[ OK ] ov_SC04_003 +[ OK ] ov_SC04_002 +[ OK ] ov_SC03_125 +[ OK ] ov_SC04_004 +[ OK ] ov_SC04_005 +[ OK ] ov_SC04_007 +[ OK ] ov_SC04_009 +[ OK ] ov_SC04_008 +[ OK ] ov_SC04_010 +[ OK ] ov_SC04_012 +[ OK ] ov_SC04_011 +[ OK ] ov_SC04_006 +[ OK ] ov_SC04_015 +[ OK ] ov_SC05_003 +[ OK ] ov_SC04_020 +[ OK ] ov_SC05_001 +[ OK ] ov_SC04_021 +[ OK ] ov_SC04_016 +[ OK ] ov_SC05_002 +[ OK ] ov_SC05_004 +[ OK ] ov_SC05_007 +[ OK ] ov_SC05_006 +[ OK ] ov_SC05_009 +[ OK ] ov_SC05_005 +[ OK ] ov_SC05_008 +[ OK ] ov_SC05_011 +[ OK ] ov_SC05_017 +[ OK ] ov_SC05_010 +[ OK ] ov_SC05_018 +[ OK ] ov_SC05_019 +[ OK ] ov_SC06_011 +[ OK ] ov_SC06_006 +[ OK ] ov_SC06_010 +[ OK ] ov_SC06_008 +[ OK ] ov_SC06_013 +[ OK ] ov_SC06_015 +[ OK ] ov_SC06_014 +[ OK ] ov_SC06_022 +[ OK ] ov_SC06_016 +[ OK ] ov_SC06_024 +[ OK ] ov_SC06_027 +[ OK ] ov_SC06_025 +[ OK ] ov_SC06_018 +[ OK ] ov_SC06_029 +[ OK ] ov_SC06_030 +[ OK ] ov_SC06_032 +[ OK ] ov_SC06_033 +[ OK ] ov_SC07_008 +[ OK ] ov_SC07_009 +[ OK ] ov_SC06_020 +[ OK ] ov_SC07_001 +[ OK ] ov_SC07_002 +[ OK ] ov_SC07_006 +[ OK ] ov_SC07_007 +[ OK ] ov_SC07_010 +[ OK ] ov_SC07_011 +[ OK ] ov_MAIN_012 +[ OK ] ov_SC02_037 +[ OK ] ov_SC03_107 +sig-overlays: signed 141 overlays -> .run/sig.ov_*.jsonl (of 141 onboarded) +elf="build/resident/resident.elf" +if [ -f "$elf" ]; then +mipsel-linux-gnu-nm "$elf" | awk ' +$2=="T" { a=strtonum("0x" $1); sym[$3]=a; if (a%4==0) addr[a]=1 } +END { lo=sym["resident_TEXT_START"]; hi=sym["resident_TEXT_END"]; +for (a in addr) if (a>=lo && a .run/seeds.resident.txt +.venv/bin/python tools/sig_image.py --image extracted/retail/MAIN.CD.dir/FILE_010.dir/1.1 --vram-base 0x800CEDF8 \ + --seeds .run/seeds.resident.txt --name resident +echo "sig-resident: signed the resident (ELF-seeded, $(wc -l < .run/seeds.resident.txt) fns) -> .run/sig.resident.jsonl" +else +.venv/bin/python tools/sig_image.py --image extracted/retail/MAIN.CD.dir/FILE_010.dir/1.1 --vram-base 0x800CEDF8 --bootstrap --name resident +echo "sig-resident: signed the resident (bootstrap fallback — re-run after a build for seeded boundaries)" +fi +sig_image: 145 functions [0x800cedf8..0x80128154) -> .run/sig.resident.jsonl +sig-resident: signed the resident (ELF-seeded, 145 fns) -> .run/sig.resident.jsonl +# PARALLEL (P31 S70) — same rationale as sig-overlays. Each job writes only its own +# .run/seeds..txt and .run/sig..jsonl, so the fan-out is safe. +mkdir -p .run; : > .run/sig-modules.txt +echo "md_MAIN_013:extracted/retail/MAIN.CD.dir/FILE_013.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_014:extracted/retail/MAIN.CD.dir/FILE_014.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_015:extracted/retail/MAIN.CD.dir/FILE_015.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_016:extracted/retail/MAIN.CD.dir/FILE_016.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_017:extracted/retail/MAIN.CD.dir/FILE_017.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_018:extracted/retail/MAIN.CD.dir/FILE_018.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_019:extracted/retail/MAIN.CD.dir/FILE_019.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_020:extracted/retail/MAIN.CD.dir/FILE_020.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_021:extracted/retail/MAIN.CD.dir/FILE_021.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_022:extracted/retail/MAIN.CD.dir/FILE_022.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_023:extracted/retail/MAIN.CD.dir/FILE_023.dir/0.1:0x800CAE08:0x800CAE0C md_MAIN_024:extracted/retail/MAIN.CD.dir/FILE_024.dir/0.1:0x800CAE08:0x800CAE0C md_MAIN_025:extracted/retail/MAIN.CD.dir/FILE_025.dir/1.1:0x800CAE08:0x800CAE14 md_MAIN_026:extracted/retail/MAIN.CD.dir/FILE_026.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_027:extracted/retail/MAIN.CD.dir/FILE_027.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_028:extracted/retail/MAIN.CD.dir/FILE_028.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_029:extracted/retail/MAIN.CD.dir/FILE_029.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_030:extracted/retail/MAIN.CD.dir/FILE_030.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_031:extracted/retail/MAIN.CD.dir/FILE_031.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_032:extracted/retail/MAIN.CD.dir/FILE_032.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_033:extracted/retail/MAIN.CD.dir/FILE_033.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_034:extracted/retail/MAIN.CD.dir/FILE_034.dir/1.1:0x800CAE08:0x800CAE88 md_MAIN_035:extracted/retail/MAIN.CD.dir/FILE_035.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_036:extracted/retail/MAIN.CD.dir/FILE_036.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_037:extracted/retail/MAIN.CD.dir/FILE_037.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_038:extracted/retail/MAIN.CD.dir/FILE_038.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_039:extracted/retail/MAIN.CD.dir/FILE_039.dir/1.1:0x800CAE08:0x800CAE14 md_MAIN_040:extracted/retail/MAIN.CD.dir/FILE_040.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_041:extracted/retail/MAIN.CD.dir/FILE_041.dir/1.1:0x800CAE08:0x800CAE0C md_MAIN_042:extracted/retail/MAIN.CD.dir/FILE_042.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_043:extracted/retail/MAIN.CD.dir/FILE_043.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_044:extracted/retail/MAIN.CD.dir/FILE_044.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_045:extracted/retail/MAIN.CD.dir/FILE_045.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_046:extracted/retail/MAIN.CD.dir/FILE_046.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_047:extracted/retail/MAIN.CD.dir/FILE_047.dir/0.1:0x800CCB1C:0x800CCB20 md_MAIN_001:extracted/retail/MAIN.CD.dir/FILE_001.dir/1.1:0x800CEDF8:0x800CEDFC md_MAIN_008:extracted/retail/MAIN.CD.dir/FILE_008.dir/1.1:0x800CEDF8:0x800CEDFC md_MAIN_011:extracted/retail/MAIN.CD.dir/FILE_011.dir/1.1:0x800CEDF8:0x800CEE74 md_SC07_003:extracted/retail/SC07.CD.dir/FILE_003.dir/1.1:0x801A00D8:0x801A01D4 md_SC07_004:extracted/retail/SC07.CD.dir/FILE_004.dir/1.1:0x801A00D8:0x801A0230 md_MAIN_003:extracted/retail/MAIN.CD.dir/FILE_003.dir/1.1:0x800CEDF8:0x800CEED0 md_SC03_073:extracted/retail/SC03.CD.dir/FILE_073.dir/2.1:0x801EF468:0x801EF47C md_SC03_074:extracted/retail/SC03.CD.dir/FILE_074.dir/2.1:0x801EF468:0x801EF47C md_SC03_075:extracted/retail/SC03.CD.dir/FILE_075.dir/2.1:0x801EF468:0x801EF47C md_SC03_076:extracted/retail/SC03.CD.dir/FILE_076.dir/2.1:0x801EF468:0x801EF6E4 md_SC03_077:extracted/retail/SC03.CD.dir/FILE_077.dir/2.1:0x801EF468:0x801EF490 md_SC03_078:extracted/retail/SC03.CD.dir/FILE_078.dir/2.1:0x801EF468:0x801EF47C md_SC03_079:extracted/retail/SC03.CD.dir/FILE_079.dir/2.1:0x801EF468:0x801EF48C md_SC03_132:extracted/retail/SC03.CD.dir/FILE_132.dir/2.1:0x801E25E8:0x801E25F4 md_SC03_133:extracted/retail/SC03.CD.dir/FILE_133.dir/2.1:0x801E25E8:0x801E25FC md_SC03_134:extracted/retail/SC03.CD.dir/FILE_134.dir/2.1:0x801E25E8:0x801E25FC md_SC03_135:extracted/retail/SC03.CD.dir/FILE_135.dir/2.1:0x801E25E8:0x801E2864 md_SC03_136:extracted/retail/SC03.CD.dir/FILE_136.dir/2.1:0x801E25E8:0x801E2610 md_SC03_137:extracted/retail/SC03.CD.dir/FILE_137.dir/2.1:0x801E25E8:0x801E25FC md_SC03_138:extracted/retail/SC03.CD.dir/FILE_138.dir/2.1:0x801E25E8:0x801E25FC md_SC04_024:extracted/retail/SC04.CD.dir/FILE_024.dir/2.1:0x801E7B28:0x801E7B34 md_SC04_025:extracted/retail/SC04.CD.dir/FILE_025.dir/2.1:0x801E7B28:0x801E7B3C md_SC04_026:extracted/retail/SC04.CD.dir/FILE_026.dir/2.1:0x801E7B28:0x801E7B3C md_SC04_027:extracted/retail/SC04.CD.dir/FILE_027.dir/2.1:0x801E7B28:0x801E7DA4 md_SC04_028:extracted/retail/SC04.CD.dir/FILE_028.dir/2.1:0x801E7B28:0x801E7B50 md_SC04_029:extracted/retail/SC04.CD.dir/FILE_029.dir/2.1:0x801E7B28:0x801E7B3C md_SC04_030:extracted/retail/SC04.CD.dir/FILE_030.dir/2.1:0x801E7B28:0x801E7B3C md_SC05_023:extracted/retail/SC05.CD.dir/FILE_023.dir/2.1:0x801ED988:0x801ED99C md_SC05_024:extracted/retail/SC05.CD.dir/FILE_024.dir/2.1:0x801ED988:0x801ED99C md_SC05_025:extracted/retail/SC05.CD.dir/FILE_025.dir/2.1:0x801ED988:0x801ED99C md_SC05_026:extracted/retail/SC05.CD.dir/FILE_026.dir/2.1:0x801ED988:0x801EDC04 md_SC05_027:extracted/retail/SC05.CD.dir/FILE_027.dir/2.1:0x801ED988:0x801ED9B0 md_SC05_028:extracted/retail/SC05.CD.dir/FILE_028.dir/2.1:0x801ED988:0x801ED99C md_SC05_029:extracted/retail/SC05.CD.dir/FILE_029.dir/2.1:0x801ED988:0x801ED99C md_SC02_009:extracted/retail/SC02.CD.dir/FILE_009.dir/0.1:0x801E4C60:0x801E4C64 md_MAIN_007:extracted/retail/MAIN.CD.dir/FILE_007:0x800CEDF8:0x800CEE2C md_MAIN_009:extracted/retail/MAIN.CD.dir/FILE_009.dir/0.1:0x800CD348:0x800CD384 md_SC03_053:extracted/retail/SC03.CD.dir/FILE_053.dir/0.1:0x801EF468:0x801EF46C md_SC03_054:extracted/retail/SC03.CD.dir/FILE_054.dir/0.1:0x801EF468:0x801EF558 md_SC03_056:extracted/retail/SC03.CD.dir/FILE_056.dir/0.1:0x801CBB50:0x801CBB54" | tr ' ' '\n' | sed '/^$/d' | xargs -P16 -I{} sh -c '\ + job="{}"; alias=${job%%:*}; rest=${job#*:}; f=${rest%%:*}; rest=${rest#*:}; \ + vram=${rest%%:*}; tlo=${rest#*:}; \ + if [ ! -f "$f" ]; then echo "[WARN no payload] $alias ($f)"; exit 0; fi; \ + elf="build/$alias/$alias.elf"; \ + if [ -f "$elf" ]; then \ + mipsel-linux-gnu-nm "$elf" | awk -v lo=$(($tlo)) '"'"'$2=="T" && $3~"^func_" { a=strtonum("0x" $1); if (a>=lo && a%4==0) printf "0x%X\n", a }'"'"' | sort -u > ".run/seeds.$alias.txt"; \ + .venv/bin/python tools/sig_image.py --image "$f" --vram-base "$vram" --seeds ".run/seeds.$alias.txt" --name "$alias" ${tlo:+--text-lo "$tlo"} >/dev/null 2>&1 \ + && echo "[ OK ] $alias" || echo "[SIG FAIL] $alias"; \ + else \ + .venv/bin/python tools/sig_image.py --image "$f" --vram-base "$vram" --bootstrap --name "$alias" ${tlo:+--text-lo "$tlo"} >/dev/null 2>&1 \ + && echo "[ OK ] $alias" || echo "[SIG FAIL] $alias"; \ + fi' | tee .run/sig-modules.txt +n=$(grep -c "^\[ OK \]" .run/sig-modules.txt || true) +bad=$(grep -c "^\[SIG FAIL\]" .run/sig-modules.txt || true) +echo "sig-modules: signed $n modules (of 75 onboarded)" +if [ "$bad" -ne 0 ]; then echo "[FAIL] sig-modules: $bad module(s) failed to sign"; exit 1; fi +[ OK ] md_MAIN_021 +[ OK ] md_MAIN_018 +[ OK ] md_MAIN_020 +[ OK ] md_MAIN_015 +[ OK ] md_MAIN_019 +[ OK ] md_MAIN_017 +[ OK ] md_MAIN_028 +[ OK ] md_MAIN_013 +[ OK ] md_MAIN_016 +[ OK ] md_MAIN_014 +[ OK ] md_MAIN_024 +[ OK ] md_MAIN_022 +[ OK ] md_MAIN_023 +[ OK ] md_MAIN_026 +[ OK ] md_MAIN_027 +[ OK ] md_MAIN_025 +[ OK ] md_MAIN_029 +[ OK ] md_MAIN_036 +[ OK ] md_MAIN_033 +[ OK ] md_MAIN_032 +[ OK ] md_MAIN_034 +[ OK ] md_MAIN_038 +[ OK ] md_MAIN_041 +[ OK ] md_MAIN_030 +[ OK ] md_MAIN_035 +[ OK ] md_MAIN_031 +[ OK ] md_MAIN_039 +[ OK ] md_MAIN_037 +[ OK ] md_MAIN_040 +[ OK ] md_MAIN_042 +[ OK ] md_MAIN_044 +[ OK ] md_MAIN_043 +[ OK ] md_MAIN_008 +[ OK ] md_MAIN_001 +[ OK ] md_MAIN_045 +[ OK ] md_MAIN_047 +[ OK ] md_SC03_073 +[ OK ] md_MAIN_011 +[ OK ] md_MAIN_046 +[ OK ] md_SC07_003 +[ OK ] md_MAIN_003 +[ OK ] md_SC03_074 +[ OK ] md_SC03_077 +[ OK ] md_SC03_076 +[ OK ] md_SC03_075 +[ OK ] md_SC03_078 +[ OK ] md_SC03_079 +[ OK ] md_SC07_004 +[ OK ] md_SC03_132 +[ OK ] md_SC03_134 +[ OK ] md_SC03_133 +[ OK ] md_SC03_138 +[ OK ] md_SC03_136 +[ OK ] md_SC04_028 +[ OK ] md_SC03_135 +[ OK ] md_SC03_137 +[ OK ] md_SC04_025 +[ OK ] md_SC04_024 +[ OK ] md_SC04_030 +[ OK ] md_SC04_026 +[ OK ] md_SC05_023 +[ OK ] md_SC04_029 +[ OK ] md_SC04_027 +[ OK ] md_SC05_025 +[ OK ] md_SC05_024 +[ OK ] md_MAIN_007 +[ OK ] md_SC05_029 +[ OK ] md_SC05_028 +[ OK ] md_SC05_026 +[ OK ] md_SC05_027 +[ OK ] md_SC02_009 +[ OK ] md_SC03_053 +[ OK ] md_SC03_054 +[ OK ] md_MAIN_009 +[ OK ] md_SC03_056 +sig-modules: signed 75 modules (of 75 onboarded) +sig_image: 10 code range(s), 798 functions +sig_image: 798 functions across 10 range(s) -> .run/sig.main.oracle.jsonl +sig-main-oracle: main is now INDEPENDENT — 0 in-domain stubs, 0 PHANTOM, 0 TRUNCATED, 0 PAD-TAIL +if [ -f "build/us/SLUS_007.26.map" ]; then +.venv/bin/python tools/main_seed_ends.py --map build/us/SLUS_007.26.map --out .run/seeds.main.txt +.venv/bin/python tools/sig_image.py --image extracted/retail/SLUS_007.26 --vram-base 0x8000F800 --seeds .run/seeds.main.txt --name main +echo "sig-main: signed $(wc -l < .run/seeds.main.txt) main game-code fns (build-true lengths, from the link map + objects) -> .run/sig.main.jsonl" +else +echo "sig-main: no main build (build/us/SLUS_007.26.map absent) — run 'make check BINARY=main' first; .run/sig.main.jsonl left as is" +fi +main_seed_ends: 809 functions / 45150 ins from 15 game-code objects (skipped 0 LINKED subseg objects + 268 build/psyq objects) +sig_image: 809 functions [0x8000f800..0x80074800) -> .run/sig.main.jsonl +sig-main: signed 809 main game-code fns (build-true lengths, from the link map + objects) -> .run/sig.main.jsonl +sdk-dual: leg 1 — WITH the PsyQ objects +splat 0.41.0 (powered by spimdisasm 1.41.0) + 0%| | 0/1096 [00:00 stubs ['libcd1', 'libcd2']; 18 NOLOAD sections; 45 externals -> build/psyq/libcd_externals.ld + .. GS_001.o: .bss split ×6: .bss [0x0000,0x0028) @0x80078810 · .bss2 [0x0028,0x0030) @0x800a4f3c (cut at `PSDBASEX`) · .bss3 [0x0030,0x0038) @0x800ae820 (cut at `CLIP2`) · .bss4 [0x0038,0x003c) @0x800a4f40 (cut at `PSDBASEY`) · .bss5 [0x003c,0x0048) @0x800a5e50 (cut at `POSITION`) · .bss6 [0x0048,0x00c2) @0x800a6438 (cut at `GsDRAWENV`) — scattered commons tiled at link-prepare +integrate libgs_used: 34 objects in 8 block(s) -> stubs ['libgs1', 'libgs2', 'libgs3', 'libgs4', 'libgs5', 'libgs6', 'libgs7', 'libgs8']; 18 NOLOAD sections; 179 externals -> build/psyq/libgs_externals.ld +integrate libetc: 5 objects in 1 block(s) -> stubs ['libetc']; 8 NOLOAD sections; 7 externals -> build/psyq/libetc_externals.ld + .. SYS.o: .bss split ×2: .bss [0x0000,0x0144) @0x80078830 · .bss2 [0x0144,0x1944) @0x800c5510 (cut at `_que`) — scattered commons tiled at link-prepare +integrate libgpu: 3 objects in 2 block(s) -> stubs ['libgpu', 'libgpu2']; 5 NOLOAD sections; 23 externals -> build/psyq/libgpu_externals.ld +integrate libmcrd: 2 objects in 2 block(s) -> stubs ['libmcrd1', 'libmcrd2']; 6 NOLOAD sections; 37 externals -> build/psyq/libmcrd_externals.ld +integrate libc2: 17 objects in 2 block(s) -> stubs ['libc2_1', 'libc2_2']; 6 NOLOAD sections; 32 externals -> build/psyq/libc2_externals.ld + .. SMP_06.o @0x80049600 (4 ins) is NESTED inside SMP_05.o — sub-pattern, not wired +integrate libgte: 70 objects in 30 block(s) -> stubs ['libgte1', 'libgte2', 'libgte3', 'libgte4', 'libgte5', 'libgte6', 'libgte7', 'libgte8', 'libgte9', 'libgte10', 'libgte11', 'libgte12', 'libgte13', 'libgte14', 'libgte15', 'libgte16', 'libgte17', 'libgte18', 'libgte19', 'libgte20', 'libgte21', 'libgte22', 'libgte23', 'libgte24', 'libgte25', 'libgte26', 'libgte27', 'libgte28', 'libgte29', 'libgte30']; 6 NOLOAD sections; 24 externals -> build/psyq/libgte_externals.ld + .. VM_F.o: .bss split ×2: .bss [0x0000,0x0508) @0x80079580 · .bss2 [0x0508,0x06d8) @0x800b9b58 (cut at `_svm_sreg_buf`) — scattered commons tiled at link-prepare +integrate snd_used: 63 objects in 12 block(s) -> stubs ['snd1', 'snd2', 'snd3', 'snd4', 'snd5', 'snd6', 'snd7', 'snd8', 'snd9', 'snd10', 'snd11', 'snd12']; 13 NOLOAD sections; 106 externals -> build/psyq/snd_externals.ld +integrate apicard_used: 26 objects in 7 block(s) -> stubs ['apicard1', 'apicard2', 'apicard3', 'apicard4', 'apicard5', 'apicard6', 'apicard7']; 7 NOLOAD sections; 0 externals -> build/psyq/apicard_externals.ld +integrate libapi42: 23 objects in 2 block(s) -> stubs ['libapi1', 'libapi2']; 1 NOLOAD sections; 2 externals -> build/psyq/libapi42_externals.ld +integrate libpad421: 7 objects in 2 block(s) -> stubs ['libpad1', 'libpad2']; 7 NOLOAD sections; 7 externals -> build/psyq/libpad_externals.ld + LD build/us/SLUS_007.26.elf + OBJCOPY build/us/SLUS_007.26 +[ OK ] build/us/SLUS_007.26 + sha1 143dbb89f34491258bbc27810d0a12ec8b43a8dd == config/check.us.sha (BYTE-IDENTICAL) +sdk-dual: leg 2 — WITHOUT (NO_SDK=1, build/psyq removed) +splat 0.41.0 (powered by spimdisasm 1.41.0) + 0%| | 0/1096 [00:00 stubs ['libcd1', 'libcd2']; 18 NOLOAD sections; 45 externals -> build/psyq/libcd_externals.ld + .. GS_001.o: .bss split ×6: .bss [0x0000,0x0028) @0x80078810 · .bss2 [0x0028,0x0030) @0x800a4f3c (cut at `PSDBASEX`) · .bss3 [0x0030,0x0038) @0x800ae820 (cut at `CLIP2`) · .bss4 [0x0038,0x003c) @0x800a4f40 (cut at `PSDBASEY`) · .bss5 [0x003c,0x0048) @0x800a5e50 (cut at `POSITION`) · .bss6 [0x0048,0x00c2) @0x800a6438 (cut at `GsDRAWENV`) — scattered commons tiled at link-prepare +integrate libgs_used: 34 objects in 8 block(s) -> stubs ['libgs1', 'libgs2', 'libgs3', 'libgs4', 'libgs5', 'libgs6', 'libgs7', 'libgs8']; 18 NOLOAD sections; 179 externals -> build/psyq/libgs_externals.ld +integrate libetc: 5 objects in 1 block(s) -> stubs ['libetc']; 8 NOLOAD sections; 7 externals -> build/psyq/libetc_externals.ld + .. SYS.o: .bss split ×2: .bss [0x0000,0x0144) @0x80078830 · .bss2 [0x0144,0x1944) @0x800c5510 (cut at `_que`) — scattered commons tiled at link-prepare +integrate libgpu: 3 objects in 2 block(s) -> stubs ['libgpu', 'libgpu2']; 5 NOLOAD sections; 23 externals -> build/psyq/libgpu_externals.ld +integrate libmcrd: 2 objects in 2 block(s) -> stubs ['libmcrd1', 'libmcrd2']; 6 NOLOAD sections; 37 externals -> build/psyq/libmcrd_externals.ld +integrate libc2: 17 objects in 2 block(s) -> stubs ['libc2_1', 'libc2_2']; 6 NOLOAD sections; 32 externals -> build/psyq/libc2_externals.ld + .. SMP_06.o @0x80049600 (4 ins) is NESTED inside SMP_05.o — sub-pattern, not wired +integrate libgte: 70 objects in 30 block(s) -> stubs ['libgte1', 'libgte2', 'libgte3', 'libgte4', 'libgte5', 'libgte6', 'libgte7', 'libgte8', 'libgte9', 'libgte10', 'libgte11', 'libgte12', 'libgte13', 'libgte14', 'libgte15', 'libgte16', 'libgte17', 'libgte18', 'libgte19', 'libgte20', 'libgte21', 'libgte22', 'libgte23', 'libgte24', 'libgte25', 'libgte26', 'libgte27', 'libgte28', 'libgte29', 'libgte30']; 6 NOLOAD sections; 24 externals -> build/psyq/libgte_externals.ld + .. VM_F.o: .bss split ×2: .bss [0x0000,0x0508) @0x80079580 · .bss2 [0x0508,0x06d8) @0x800b9b58 (cut at `_svm_sreg_buf`) — scattered commons tiled at link-prepare +integrate snd_used: 63 objects in 12 block(s) -> stubs ['snd1', 'snd2', 'snd3', 'snd4', 'snd5', 'snd6', 'snd7', 'snd8', 'snd9', 'snd10', 'snd11', 'snd12']; 13 NOLOAD sections; 106 externals -> build/psyq/snd_externals.ld +integrate apicard_used: 26 objects in 7 block(s) -> stubs ['apicard1', 'apicard2', 'apicard3', 'apicard4', 'apicard5', 'apicard6', 'apicard7']; 7 NOLOAD sections; 0 externals -> build/psyq/apicard_externals.ld +integrate libapi42: 23 objects in 2 block(s) -> stubs ['libapi1', 'libapi2']; 1 NOLOAD sections; 2 externals -> build/psyq/libapi42_externals.ld +integrate libpad421: 7 objects in 2 block(s) -> stubs ['libpad1', 'libpad2']; 7 NOLOAD sections; 7 externals -> build/psyq/libpad_externals.ld + LD build/us/SLUS_007.26.elf + OBJCOPY build/us/SLUS_007.26 +[ OK ] build/us/SLUS_007.26 + sha1 143dbb89f34491258bbc27810d0a12ec8b43a8dd == config/check.us.sha (BYTE-IDENTICAL) +sdk-dual: OK — main 143dbb89f34491258bbc27810d0a12ec8b43a8dd byte-identical WITH and WITHOUT the PsyQ objects (maps: .run/P33/verify/main_with_sdk.map, main_no_sdk.map) +.venv/bin/python tools/corpus.py --all --audit +main files=85 stubs= 1258 matched= 809 +md_MAIN_001 files= 1 stubs= 0 matched= 11 +md_MAIN_003 files= 5 stubs= 0 matched= 60 +md_MAIN_007 files= 1 stubs= 0 matched= 19 +md_MAIN_008 files= 1 stubs= 0 matched= 6 +md_MAIN_009 files= 1 stubs= 0 matched= 12 +md_MAIN_011 files= 1 stubs= 0 matched= 21 +md_MAIN_013 files= 1 stubs= 0 matched= 16 +md_MAIN_014 files= 1 stubs= 0 matched= 13 +md_MAIN_015 files= 1 stubs= 0 matched= 20 +md_MAIN_016 files= 1 stubs= 0 matched= 13 +md_MAIN_017 files= 1 stubs= 0 matched= 10 +md_MAIN_018 files= 1 stubs= 0 matched= 11 +md_MAIN_019 files= 1 stubs= 0 matched= 22 +md_MAIN_020 files= 1 stubs= 0 matched= 14 +md_MAIN_021 files= 1 stubs= 0 matched= 11 +md_MAIN_022 files= 1 stubs= 0 matched= 33 +md_MAIN_023 files= 1 stubs= 0 matched= 6 +md_MAIN_024 files= 1 stubs= 0 matched= 6 +md_MAIN_025 files= 1 stubs= 0 matched= 30 +md_MAIN_026 files= 1 stubs= 0 matched= 24 +md_MAIN_027 files= 1 stubs= 0 matched= 29 +md_MAIN_028 files= 1 stubs= 0 matched= 22 +md_MAIN_029 files= 1 stubs= 0 matched= 11 +md_MAIN_030 files= 1 stubs= 0 matched= 10 +md_MAIN_031 files= 1 stubs= 0 matched= 18 +md_MAIN_032 files= 1 stubs= 0 matched= 10 +md_MAIN_033 files= 1 stubs= 0 matched= 19 +md_MAIN_034 files= 1 stubs= 0 matched= 28 +md_MAIN_035 files= 1 stubs= 0 matched= 16 +md_MAIN_036 files= 1 stubs= 0 matched= 28 +md_MAIN_037 files= 1 stubs= 0 matched= 17 +md_MAIN_038 files= 1 stubs= 0 matched= 20 +md_MAIN_039 files= 1 stubs= 0 matched= 26 +md_MAIN_040 files= 1 stubs= 0 matched= 19 +md_MAIN_041 files= 1 stubs= 0 matched= 15 +md_MAIN_042 files= 1 stubs= 0 matched= 4 +md_MAIN_043 files= 1 stubs= 0 matched= 23 +md_MAIN_044 files= 1 stubs= 0 matched= 44 +md_MAIN_045 files= 1 stubs= 0 matched= 21 +md_MAIN_046 files= 1 stubs= 0 matched= 39 +md_MAIN_047 files= 1 stubs= 0 matched= 12 +md_SC02_009 files= 1 stubs= 0 matched= 40 +md_SC03_053 files= 1 stubs= 0 matched= 15 +md_SC03_054 files= 1 stubs= 0 matched= 7 +md_SC03_056 files= 1 stubs= 0 matched= 4 +md_SC03_073 files= 1 stubs= 0 matched= 28 +md_SC03_074 files= 1 stubs= 0 matched= 29 +md_SC03_075 files= 1 stubs= 0 matched= 41 +md_SC03_076 files= 2 stubs= 0 matched= 66 +md_SC03_077 files= 2 stubs= 0 matched= 35 +md_SC03_078 files= 1 stubs= 0 matched= 27 +md_SC03_079 files= 1 stubs= 0 matched= 29 +md_SC03_132 files= 1 stubs= 0 matched= 28 +md_SC03_133 files= 1 stubs= 0 matched= 29 +md_SC03_134 files= 1 stubs= 0 matched= 41 +md_SC03_135 files= 2 stubs= 0 matched= 66 +md_SC03_136 files= 2 stubs= 0 matched= 35 +md_SC03_137 files= 1 stubs= 0 matched= 27 +md_SC03_138 files= 1 stubs= 0 matched= 37 +md_SC04_024 files= 1 stubs= 0 matched= 28 +md_SC04_025 files= 1 stubs= 0 matched= 29 +md_SC04_026 files= 1 stubs= 0 matched= 41 +md_SC04_027 files= 2 stubs= 0 matched= 66 +md_SC04_028 files= 2 stubs= 0 matched= 35 +md_SC04_029 files= 1 stubs= 0 matched= 27 +md_SC04_030 files= 1 stubs= 0 matched= 31 +md_SC05_023 files= 1 stubs= 0 matched= 28 +md_SC05_024 files= 1 stubs= 0 matched= 29 +md_SC05_025 files= 1 stubs= 0 matched= 41 +md_SC05_026 files= 2 stubs= 0 matched= 66 +md_SC05_027 files= 2 stubs= 0 matched= 35 +md_SC05_028 files= 1 stubs= 0 matched= 27 +md_SC05_029 files= 1 stubs= 0 matched= 31 +md_SC07_003 files= 1 stubs= 0 matched= 100 +md_SC07_004 files= 1 stubs= 0 matched= 315 +ov_MAIN_012 files=23 stubs= 0 matched= 2403 +ov_SC01_000 files=28 stubs= 0 matched= 2403 +ov_SC01_001 files=29 stubs= 0 matched= 2466 +ov_SC01_004 files=30 stubs= 0 matched= 2416 +ov_SC01_005 files=30 stubs= 0 matched= 2503 +ov_SC01_006 files=30 stubs= 0 matched= 2503 +ov_SC01_008 files=30 stubs= 0 matched= 2428 +ov_SC01_009 files=31 stubs= 0 matched= 2509 +ov_SC01_074 files=28 stubs= 0 matched= 2427 +ov_SC01_077 files=35 stubs= 0 matched= 2585 +ov_SC01_080 files=27 stubs= 0 matched= 2514 +ov_SC01_084 files=30 stubs= 0 matched= 2581 +ov_SC02_000 files=37 stubs= 0 matched= 2683 +ov_SC02_003 files=37 stubs= 0 matched= 2683 +ov_SC02_004 files=27 stubs= 0 matched= 2403 +ov_SC02_005 files=33 stubs= 0 matched= 2929 +ov_SC02_011 files=29 stubs= 0 matched= 2895 +ov_SC02_015 files=27 stubs= 0 matched= 2416 +ov_SC02_016 files=29 stubs= 0 matched= 2547 +ov_SC02_017 files=29 stubs= 0 matched= 2734 +ov_SC02_021 files=30 stubs= 0 matched= 2439 +ov_SC02_026 files=29 stubs= 0 matched= 2574 +ov_SC02_027 files=29 stubs= 0 matched= 2694 +ov_SC02_028 files=30 stubs= 0 matched= 2703 +ov_SC02_031 files=27 stubs= 0 matched= 2564 +ov_SC02_035 files=29 stubs= 0 matched= 2522 +ov_SC02_037 files=21 stubs= 0 matched= 2516 +ov_SC02_039 files=28 stubs= 0 matched= 2418 +ov_SC02_041 files=28 stubs= 0 matched= 2563 +ov_SC03_001 files=35 stubs= 0 matched= 2869 +ov_SC03_002 files=32 stubs= 0 matched= 2631 +ov_SC03_003 files=28 stubs= 0 matched= 2425 +ov_SC03_006 files=27 stubs= 0 matched= 2767 +ov_SC03_007 files=29 stubs= 0 matched= 2625 +ov_SC03_010 files=29 stubs= 0 matched= 2472 +ov_SC03_011 files=29 stubs= 0 matched= 2529 +ov_SC03_012 files=27 stubs= 0 matched= 2408 +ov_SC03_013 files=30 stubs= 0 matched= 2494 +ov_SC03_014 files=32 stubs= 0 matched= 2687 +ov_SC03_015 files=32 stubs= 0 matched= 2687 +ov_SC03_023 files=27 stubs= 0 matched= 2437 +ov_SC03_024 files=30 stubs= 0 matched= 2643 +ov_SC03_028 files=34 stubs= 0 matched= 2666 +ov_SC03_029 files=30 stubs= 0 matched= 2646 +ov_SC03_030 files=27 stubs= 0 matched= 2497 +ov_SC03_031 files=28 stubs= 0 matched= 2516 +ov_SC03_089 files=30 stubs= 0 matched= 2583 +ov_SC03_090 files=30 stubs= 0 matched= 2627 +ov_SC03_091 files=32 stubs= 0 matched= 2642 +ov_SC03_092 files=29 stubs= 0 matched= 2589 +ov_SC03_093 files=30 stubs= 0 matched= 2565 +ov_SC03_094 files=30 stubs= 0 matched= 2579 +ov_SC03_095 files=29 stubs= 0 matched= 2476 +ov_SC03_096 files=29 stubs= 0 matched= 2467 +ov_SC03_097 files=30 stubs= 0 matched= 2605 +ov_SC03_098 files=29 stubs= 0 matched= 2543 +ov_SC03_099 files=29 stubs= 0 matched= 2506 +ov_SC03_100 files=29 stubs= 0 matched= 2541 +ov_SC03_101 files=29 stubs= 0 matched= 2530 +ov_SC03_102 files=29 stubs= 0 matched= 2494 +ov_SC03_103 files=29 stubs= 0 matched= 2512 +ov_SC03_104 files=31 stubs= 0 matched= 2618 +ov_SC03_105 files=34 stubs= 0 matched= 2599 +ov_SC03_107 files=20 stubs= 0 matched= 2497 +ov_SC03_108 files=29 stubs= 0 matched= 2445 +ov_SC03_109 files=28 stubs= 0 matched= 2426 +ov_SC03_110 files=29 stubs= 0 matched= 2470 +ov_SC03_111 files=28 stubs= 0 matched= 2512 +ov_SC03_112 files=32 stubs= 0 matched= 2528 +ov_SC03_113 files=28 stubs= 0 matched= 2470 +ov_SC03_114 files=28 stubs= 0 matched= 2417 +ov_SC03_115 files=28 stubs= 0 matched= 2474 +ov_SC03_116 files=27 stubs= 0 matched= 2440 +ov_SC03_117 files=30 stubs= 0 matched= 2559 +ov_SC03_118 files=31 stubs= 0 matched= 2687 +ov_SC03_119 files=31 stubs= 0 matched= 2687 +ov_SC03_121 files=30 stubs= 0 matched= 2461 +ov_SC03_124 files=32 stubs= 0 matched= 2743 +ov_SC03_125 files=29 stubs= 0 matched= 2590 +ov_SC03_126 files=28 stubs= 0 matched= 2425 +ov_SC04_000 files=29 stubs= 0 matched= 2546 +ov_SC04_002 files=28 stubs= 0 matched= 2638 +ov_SC04_003 files=28 stubs= 0 matched= 2504 +ov_SC04_004 files=27 stubs= 0 matched= 2560 +ov_SC04_005 files=28 stubs= 0 matched= 2614 +ov_SC04_006 files=28 stubs= 0 matched= 2456 +ov_SC04_007 files=28 stubs= 0 matched= 2571 +ov_SC04_008 files=26 stubs= 0 matched= 2417 +ov_SC04_009 files=28 stubs= 0 matched= 2443 +ov_SC04_010 files=28 stubs= 0 matched= 2421 +ov_SC04_011 files=28 stubs= 0 matched= 2805 +ov_SC04_012 files=27 stubs= 0 matched= 2422 +ov_SC04_015 files=28 stubs= 0 matched= 2613 +ov_SC04_016 files=29 stubs= 0 matched= 2442 +ov_SC04_018 files=33 stubs= 0 matched= 2857 +ov_SC04_019 files=33 stubs= 0 matched= 2857 +ov_SC04_020 files=29 stubs= 0 matched= 2569 +ov_SC04_021 files=28 stubs= 0 matched= 2425 +ov_SC05_000 files=28 stubs= 0 matched= 2422 +ov_SC05_001 files=29 stubs= 0 matched= 2576 +ov_SC05_002 files=28 stubs= 0 matched= 2444 +ov_SC05_003 files=28 stubs= 0 matched= 2483 +ov_SC05_004 files=29 stubs= 0 matched= 2466 +ov_SC05_005 files=28 stubs= 0 matched= 2493 +ov_SC05_006 files=28 stubs= 0 matched= 2432 +ov_SC05_007 files=28 stubs= 0 matched= 2484 +ov_SC05_008 files=27 stubs= 0 matched= 2545 +ov_SC05_009 files=27 stubs= 0 matched= 2440 +ov_SC05_010 files=31 stubs= 0 matched= 2590 +ov_SC05_011 files=28 stubs= 0 matched= 2411 +ov_SC05_017 files=35 stubs= 0 matched= 2844 +ov_SC05_018 files=29 stubs= 0 matched= 2675 +ov_SC05_019 files=28 stubs= 0 matched= 2425 +ov_SC06_000 files=27 stubs= 0 matched= 2691 +ov_SC06_006 files=29 stubs= 0 matched= 2513 +ov_SC06_008 files=28 stubs= 0 matched= 2544 +ov_SC06_010 files=26 stubs= 0 matched= 2519 +ov_SC06_011 files=29 stubs= 0 matched= 2470 +ov_SC06_013 files=28 stubs= 0 matched= 2427 +ov_SC06_014 files=28 stubs= 0 matched= 2455 +ov_SC06_015 files=28 stubs= 0 matched= 2423 +ov_SC06_016 files=30 stubs= 0 matched= 2551 +ov_SC06_018 files=33 stubs= 0 matched= 2667 +ov_SC06_020 files=30 stubs= 0 matched= 2520 +ov_SC06_022 files=32 stubs= 0 matched= 2644 +ov_SC06_024 files=33 stubs= 0 matched= 2669 +ov_SC06_025 files=29 stubs= 0 matched= 2574 +ov_SC06_027 files=28 stubs= 0 matched= 2410 +ov_SC06_029 files=30 stubs= 0 matched= 2664 +ov_SC06_030 files=29 stubs= 0 matched= 2458 +ov_SC06_032 files=33 stubs= 0 matched= 2660 +ov_SC06_033 files=34 stubs= 0 matched= 2633 +ov_SC07_000 files=30 stubs= 0 matched= 2521 +ov_SC07_001 files=28 stubs= 0 matched= 2456 +ov_SC07_002 files=28 stubs= 0 matched= 2581 +ov_SC07_006 files=28 stubs= 0 matched= 2456 +ov_SC07_007 files=27 stubs= 0 matched= 2614 +ov_SC07_008 files=28 stubs= 0 matched= 2388 +ov_SC07_009 files=27 stubs= 0 matched= 2432 +ov_SC07_010 files=26 stubs= 0 matched= 2526 +ov_SC07_011 files=27 stubs= 0 matched= 2450 +resident files= 3 stubs= 0 matched= 145 + +corpus audit: 0 PHANTOM + 0 TRUNCATED = 0 unmatchable slices +.venv/bin/python tools/cdecl.py --audit --gcc --limit 60 +[coverage] 60 TUs (cpp-derived) + 600 drafts (raw) +[coverage] depth-0 statements: 175346 declarators parsed: 166938 +[coverage] unparsed: 4 -> PARSER DEFECTS (gcc accepts, cdecl does not): 0 NOT-C (gcc rejects it too — corrupt input): 4 + NOT-C in 1 dir(s) (all scratch, none in src/): ['.run/drafts-T6-recanon'] + e.g. 'extern if ((func_80029178(0x119) & 0xFF) != 0);' -> expected ')', got '!=' in 'extern if ((func_800 + +[differential] the macro-era shared header is gone (Phase 35): the macro-era differential no longer applies — OK + +[gcc] 4781 distinct declarations -> the real cross-compiler +[gcc] adjudicated: 4781 env-skipped (gcc cannot compile the original out of its TU): 0 +[gcc] accepted: 4781 REJECTED (my reconstruction is a DIFFERENT TYPE): 0 + +cdecl: ALL ORACLES GREEN +.venv/bin/python tools/audit_binaries.py +audit-binaries: 218 onboarded (main + resident + 141 overlays + 75 modules) +audit-binaries: OK — every onboarded binary is a full citizen of every enumerating consumer. +.venv/bin/python tools/audit_text_sources.py +audit-text-sources: scanned 7267 tracked .c/.h file(s) under src/include +audit-text-sources: OK — every source is TEXT (grep can see all of them) and every #include is PORTABLE (resolves inside the repo). +.venv/bin/python tools/progress.py --binary main --audit +.venv/bin/python tools/difficulty.py --binary main +.venv/bin/python tools/dup_report.py --binary main +# P33 A2: refresh main's build-derived sig before anything weighs main by it (a no-op message when +# main is not built; progress.py then falls back to the legacy Ghidra sig or fails loudly — R32). +make --no-print-directory sig-main +.venv/bin/python tools/dup_report.py --cross +# Fleet roll-up (Phase 15): deterministic per-binary table + fleet totals -> docs/progress.fleet.md. +.venv/bin/python tools/progress.py --fleet +# P33 D1/D3: the same numbers as DATA — docs/progress.json + the README block (never typed by hand) +.venv/bin/python tools/progress.py --json --readme +# P33.5 task 7: the dated timeline is generated from the committed digests (R75) — regenerated here, after +# progress.json, so its self-check against the last row sees the fresh data; audit-digest asserts it is fresh +.venv/bin/python tools/timeline.py +# Backlog compaction (Phase 29): the near-miss log is append-only, so it fills with already-banked +# noise (measured 6,867 rows, 98% banked). prune rewrites .run/backlog.jsonl to the open near-misses +# (drop-now-matched P9 + best-per-addr) so the ledger tracks reality instead of drifting stale. +.venv/bin/python tools/backlog.py prune +# Rename-drift gate (Phase 26-A): fail-closed if a symbols.us.txt rename left a func_ +# ref dangling in committed src/ or src/shared/*.h — the R22 failure mode an incremental build +# masks (stale .o) but a genuinely-clean rebuild fails on. The ONLY detector for it. +.venv/bin/python tools/lint_symbol_refs.py +# Byte-honesty gate (Phase 11): fail-closed if any registered code-share drifted from its +# recorded signature hash. Last in the recipe, so a stale share fails `make report` (P9). +.venv/bin/python tools/dedup_integrate.py --check +# BFM matching progress (generated by tools/progress.py — authoritative) + +REAL substantive matches : 789 <- the Gen1-exit >=25 bar counts THIS + (of which dedup-shared : 2 one body -> N sites, config/dedup.us.yaml) +LINKED real PsyQ objects : 1256 <- byte-identical via linked SDK objects +VERBATIM __asm__ bodies : 3 <- §265: BYTES, NOT A DECOMPILE (byte-identical by construction, unexplained; NOT counted in REAL) +NON_MATCHING (near-miss) : 0 +splat-auto empty no-ops : 43 +INCLUDE_ASM stubs : 0 +data blobs (excluded) : 2 +---------------------------------------- +matchable functions : 2091 +REAL / matchable : 789 / 2091 = 37.73% +byte-identical/ matchable: 2091 / 2091 = 100.00% (REAL+LINKED+empties+VERBATIM) + +LINKED subsegs: apicard1 apicard2 apicard3 apicard4 apicard5 apicard6 apicard7 libapi1 libapi2 libc2_1 libc2_2 libcd1 libcd2 libetc libgpu libgpu2 libgs1 libgs2 libgs3 libgs4 libgs5 libgs6 libgs7 libgs8 libgte1 libgte10 libgte11 libgte12 libgte13 libgte14 libgte15 libgte16 libgte17 libgte18 libgte19 libgte2 libgte20 libgte21 libgte22 libgte23 libgte24 libgte25 libgte26 libgte27 libgte28 libgte29 libgte3 libgte30 libgte4 libgte5 libgte6 libgte7 libgte8 libgte9 libmcrd1 libmcrd2 libpad1 libpad2 snd1 snd10 snd11 snd12 snd2 snd3 snd4 snd5 snd6 snd7 snd8 snd9 (1256 fns) +REAL matches: CdQueueBusy CdReadRequest CdReadSectorReadyCB CdReadStateMachine DebugMenuHandler DsDataCallback DsReadyCallback DsSyncCallback GameModeDispatch GsTMDfastF3GL GsTMDfastF3GNL GsTMDfastF4GL GsTMDfastF4GNL GsTMDfastG3GL GsTMDfastG3GNL GsTMDfastG4GL GsTMDfastG4GNL LoaderInitFileTable LoaderResetReadState LzssDecodeSector ResourceGetCdLoc ResourceLoadStateMachine SpuWrite SsGetMute SsUtReverbOff StreamLoadStateMachine _SsSndPlay aF800301A4 func_8001096C func_8001099C func_80010A08 func_80010A98 func_80010AE0 func_80010B10 func_80010BB4 func_80010C7C func_80010CEC func_80010D60 func_80010DA0 func_80010DE0 func_80010E14 func_80010E48 func_80010E7C func_80010ED4 func_80010F80 func_800110CC func_800111BC func_80011220 func_8001125C func_800112C8 func_80011320 func_80011350 func_80011380 func_80011680 func_800116E0 func_80011778 func_80011818 func_800118AC func_80011928 func_80011998 func_800119F0 func_80011A3C func_80011ADC func_80011B7C func_80011C10 func_80011C8C func_80011CFC func_80011D54 func_80011DA0 func_80011DCC func_80011DF4 func_80011E24 func_80011E84 func_80011EB4 func_800120DC func_8001212C func_800123F0 func_80012558 func_800126C4 func_8001282C func_800128B4 func_800128EC func_800129CC func_80012A60 func_80012AB0 func_80012ABC func_80012B04 func_80012B58 func_80012C6C func_80012CB8 func_80012D0C func_80012DBC func_80012E0C func_80012E6C func_80012F74 func_80012FC8 func_80013028 func_800130D0 func_8001311C func_80013154 func_80013200 func_80013228 func_80013294 func_800132BC func_80013328 func_80013350 func_800133BC func_800133E4 func_80013450 func_80013478 func_800134FC func_80013694 func_8001382C func_800139C8 func_80013B64 func_80013CFC func_80013E94 func_80013ED0 func_80013F3C func_80013F68 func_80013F98 func_80013FBC func_80013FE0 func_80014004 func_80014028 func_8001404C func_80014070 func_80014094 func_800140B8 func_80014128 func_80014148 func_80014168 func_800141AC func_800141F0 func_80014238 func_800142C8 func_80014338 func_80014390 func_800143AC func_80014444 func_800144D4 func_80014564 func_80014588 func_800145EC func_800146B0 func_80014774 func_800147B8 func_80014928 func_80014960 func_80014998 func_800149E0 func_80014B10 func_80014BFC func_80014C28 func_80014C54 func_80014CAC func_80014CF8 func_80014D30 func_80014D68 func_80014D94 func_80014DC0 func_80014DEC func_80014E24 func_80014E80 func_80014ED4 func_80015018 func_80015118 func_80015144 func_80015208 func_800152F4 func_80015310 func_8001534C func_800153A4 func_800153CC func_80015424 func_8001544C func_80015498 func_80015608 func_80015760 func_80015908 func_80015954 func_80015978 func_8001599C func_800159C0 func_800159E4 func_80015A08 func_80015A2C func_80015A50 func_80015A74 func_80015AD0 func_80015B6C func_80015D4C func_80015F04 func_80016110 func_80016224 func_80016450 func_80016638 func_800166E8 func_80016714 func_800167B8 func_800167F0 func_800168B4 func_800168C4 func_80016940 func_80016978 func_80016A3C func_80016A5C func_80016A7C func_80016B60 func_80016C28 func_80016D78 func_80016EB0 func_80016ED4 func_80016EF8 func_80016F18 func_80017168 func_80017254 func_80017274 func_80017294 func_8001739C func_800173BC func_800173DC func_800174DC func_800174FC func_8001751C func_800176F0 func_80017714 func_80017738 func_80017758 func_80017778 func_800178C8 func_800178EC func_80017910 func_80017930 func_80017B98 func_80017D98 func_80017DC4 func_80017DF8 func_80017E30 func_80017E68 func_80017E8C func_80017F14 func_80018094 func_80018194 func_8001820C func_80018384 func_800183E0 func_80018450 func_800184F0 func_80018918 func_800189A8 func_80018A20 func_80018C64 func_80018CE8 func_80018E78 func_80018E9C func_80018F20 func_80018F88 func_80018FC8 func_80019018 func_80019028 func_8001903C func_80019064 func_800190AC func_80019198 func_800191A8 func_800191BC func_800191D4 func_8001923C func_8001931C func_80019378 func_80019388 func_80019398 func_800193A8 func_800193B8 func_80019930 func_80019A10 func_8001A0FC func_8001A114 func_8001A9D8 func_8001A9F8 func_8001AA78 func_8001AA88 func_8001AAA0 func_8001AAD0 func_8001ABBC func_8001ACF0 func_8001AE90 func_8001AF04 func_8001AF34 func_8001B0D4 func_8001B22C func_8001B23C func_8001B26C func_8001B324 func_8001B34C func_8001B374 func_8001B384 func_8001B394 func_8001B710 func_8001B7C4 func_8001B85C func_8001B86C func_8001BA84 func_8001BADC func_8001BB60 func_8001BBBC func_8001BC6C func_8001BDA0 func_8001BE20 func_8001BE30 func_8001BFA0 func_8001BFB0 func_8001BFD0 func_8001BFE8 func_8001BFF8 func_8001C00C func_8001C044 func_8001C0C8 func_8001C14C func_8001C1E4 func_8001C214 func_8001C2C4 func_8001C320 func_8001C448 func_8001C4A4 func_8001C558 func_8001C5B8 func_8001C6E4 func_8001C744 func_8001C7B0 func_8001C810 func_8001C8C4 func_8001C924 func_8001C97C func_8001C9D0 func_8001CA1C func_8001CA88 func_8001CB00 func_8001CB6C func_8001CBDC func_8001CC3C func_8001CCA0 func_8001CD04 func_8001CD50 func_8001CD9C func_8001CDE8 func_8001CE28 func_8001CE68 func_8001CEC0 func_8001CF00 func_8001CF30 func_8001CF48 func_8001CFB8 func_8001CFDC_impl func_8001D050 func_8001D074_impl func_8001D0E8 func_8001D0F4 func_8001D130 func_8001D150 func_8001D16C func_8001D1C4 func_8001D388 func_8001D3FC func_8001D70C func_8001D8C4 func_8001DA34 func_8001E094 func_8001E378 func_8001E668 func_8001E7E0 func_8001EA14 func_8001EFE0 func_8001F730 func_8001F97C func_8001F9F8 func_8001FB8C func_8001FC08 func_80020248 func_80020598 func_80020A28 func_80020DA4 func_80020F34 func_80021008 func_80021050 func_8002109C func_80021120 func_80021174 func_80021284 func_800215F4 func_80021D38 func_800221A8 func_800226C0 func_80023138 func_800233CC func_800234E4 func_80023570 func_8002374C func_80023BF0 func_80024054 func_800241C0 func_800242D0 func_800243EC func_80024448 func_800249F0 func_80024BC0 func_80024DE8 func_80025000 func_8002528C func_80025504 func_80025818 func_80025A30 func_80025CBC func_80025EB8 func_80026128 func_800262D8 func_80026514 func_800268D0 func_80026D64 func_80027058 func_80027200 func_800273F4 func_800275BC func_800277DC func_800279AC func_80027BF0 func_80027C10 func_80027D20 func_80027F4C func_80028200 func_8002823C func_80028304 func_80028394 func_80028428 func_80028488 func_80028558 func_800285CC func_80028620 func_80028694 func_80028A48 func_80028C50 func_80028D58 func_80028D78 func_80028D9C func_80028DBC func_80028DE0 func_80028E00 func_80028E24 func_80028E44 func_80028E68 func_80028E88 func_80028EAC func_80028ECC func_80028EF0 func_80028F10 func_80028F34 func_80028F54 func_80028F78 func_80028F98 func_80028FBC func_80028FDC func_80029000 func_80029020 func_80029044 func_8002906C func_80029094 func_800290BC func_800290E0 func_80029104 func_80029124 func_80029178 func_800291A0 func_800291B4 func_800291C8 func_800291DC func_800291F0 func_80029204 func_80029218 func_80029240 func_80029254 func_80029264 func_80029274 func_8002931C func_80029344 func_8002941C func_80029444 func_80029504 func_80029514 func_80029524 func_8002953C func_8002954C func_8002955C func_8002957C func_8002958C func_8002959C func_800295D4 func_80029664 func_80029690 func_800296F8 func_80029774 func_800298BC func_8002992C func_80029A58 func_80029A94 func_80029AAC func_80029AF4 func_80029B4C func_80029BC8 func_80029C44 func_80029CD4 func_80029D3C func_80029DB4 func_80029E30 func_80029E94 func_80029EC0 func_80029ED4 func_80029FD4 func_80029FE4 func_8002A04C func_8002A088 func_8002A108 func_8002A1B4 func_8002A200 func_8002A234 func_8002A26C func_8002A27C func_8002A28C func_8002A2B0 func_8002A2D4 func_8002A354 func_8002A400 func_8002A44C func_8002A480 func_8002A4B8 func_8002A4C8 func_8002A4D8 func_8002A4FC func_8002A520 func_8002A544 func_8002A5C4 func_8002A670 func_8002A6BC func_8002A6F0 func_8002A728 func_8002A738 func_8002A748 func_8002A76C func_8002A790 func_8002A7B4 func_8002A834 func_8002A8E0 func_8002A92C func_8002A960 func_8002A998 func_8002A9A8 func_8002A9B8 func_8002A9DC func_8002AA00 func_8002AA3C func_8002AAB4 func_8002AB64 func_8002AC00 func_8002AC98 func_8002AE60 func_8002AED0 func_8002AEE4 func_8002AEF8 func_8002AF08 func_8002AF18 func_8002AF48 func_8002AF60 func_8002AF70 func_8002B00C func_8002B064 func_8002B08C func_8002B0B4 func_8002C320 func_8002C3B0 func_8002C410 func_8002C8BC func_8002C8F4 func_8002CC4C func_8002CCB4 func_8002CCD8 func_8002CDD8 func_8002CFE4 func_8002D034 func_8002D1F0 func_8002D240 func_8002D29C func_8002D320 func_8002D4B8 func_8002D4C8 func_8002D59C func_8002D678 func_8002D6D8 func_8002D7FC func_8002D80C func_8002D834 func_8002D844 func_8002D858 func_8002D8A8 func_8002D8D4 func_8002D904 func_8002DC68 func_8002DF80 func_8002E138 func_8002E5BC func_8002E5F8 func_8002E638 func_8002E700 func_8002E79C func_8002E818 func_8002E8DC func_8002E94C func_8002EA10 func_8002EAB0 func_8002EB10 func_8002EBAC func_8002EC10 func_8002ED90 func_8002EDE4 func_8002EE64 func_8002EE90 func_8002EEB8 func_8002EED8 func_8002EFD0 func_8002EFF8 func_8002F064 func_8002F0D0 func_8002F0F4 func_8002F12C func_8002F150 func_8002F1CC func_8002F248 func_8002F4E4 func_8002F5C8 func_8002F620 func_8002F648 func_8002F658 func_8002F67C func_8002F714 func_8002F80C func_8002FA3C func_8002FAE0 func_8002FB08 func_8002FC64 func_8002FD14 func_8002FDC8 func_8002FDE8 func_8002FF0C func_800301C8 func_80030470 func_800304C8 func_80030538 func_80030634 func_80030730 func_80030A14 func_80030CA4 func_80030D80 func_80030F80 func_800314DC func_800316F8 func_80031988 func_80031A98 func_80031B7C func_80031BE0 func_80031CC8 func_80031D70 func_80031DEC func_80031E94 func_80031F14 func_80031FC8 func_80032048 func_800322A8 func_800324A4 func_80032774 func_80032A74 func_8003310C func_800331D4 func_8003324C func_80033324 func_80033398 func_8003350C func_800335B8 func_800336A8 func_8003388C func_800342E8 func_80034314 func_80034650 func_800346D0 func_800347C8 func_80034844 func_800348A8 func_8003491C func_80034A54 func_80034A9C func_80034AE0 func_80034B0C func_80034B3C func_80034C24 func_80034CF0 func_80034DFC func_8003500C func_800351E8 func_80035210 func_80035270 func_800359B0 func_80035C4C func_8003602C func_80036130 func_800361CC func_8003621C func_80036260 func_80036AF8 func_80036D24 func_80036D58 func_80036EB4 func_80036EE8 func_80036F18 func_80036F98 func_80036FB0 func_80037004 func_80037028 func_80037144 func_80037334 func_80037358 func_80037368 func_800373D0 func_800374CC func_8003750C func_8003775C func_800377D8 func_80037CC8 func_80037CD8 func_80037D74 func_80037D98 func_80037EA0 func_80037F3C func_80037FC4 func_8003819C func_800381E4 func_80038210 func_80038308 func_8003834C func_8003836C func_800383A4 func_800384A8 func_800385C0 func_80038638 func_80038668 func_80038698 func_800387C0 func_80038838 func_800388E8 func_80038908 func_80038958 func_80038A00 func_80038A58 func_80038FC4 func_80038FFC func_8003916C func_800391D4 func_80039308 func_80039B20 func_80039C5C func_80039C70 func_80039DEC func_80039F14 func_80039F50 func_8003A098 func_8003A0D0 func_8003A0E4 func_8003A234 func_8003A3D8 func_8003A404 func_8003A424 func_8003D424 func_8003D630 func_8003DC90 func_8003DF8C func_8003FA54 func_80040DE8 func_80041354 func_800413B8 func_80041400 func_80041448 main +NON_MATCHING: + +build SHA1: 143dbb89f34491258bbc27810d0a12ec8b43a8dd (byte-identical) + +empties audit: 43/43 genuine jr;nop (all clean) +# Unmatched difficulty inventory (generated by tools/difficulty.py — harvest queue) + +unmatched functions : 1256 +trivial (<=5 ins) : 267 +non-jtbl leaves : 834 (best harvest targets) +jump-table funcs : 58 (deferred — need the rodata-island workflow, Task 2') + +## Easiest 120 unmatched (score asc) — the work queue +| score | name | nins | br | calls | jtbl | leaf | +... full table -> docs/difficulty.md (top 120), CSV -> .run/difficulty.csv +# EXE-wide duplicate function groups (generated by tools/dup_report.py) +# sig: .run/sig.main.jsonl sha1=8bcb8eb2f6e3dc4562b39a6be9a0721bf0215fb3 (809 funcs, 718 with nins>=8) +# Match the representative once -> share the body to the duplicates (h_exact = guaranteed +# byte-match; h_norm = same source, re-point any single address constant). +## h_exact (byte-identical) — nins>=8: 8 groups, 8 redundant (collapsible) +## h_norm (structural) — nins>=8: 42 groups, 68 redundant (collapsible) +if [ -f "build/us/SLUS_007.26.map" ]; then +.venv/bin/python tools/main_seed_ends.py --map build/us/SLUS_007.26.map --out .run/seeds.main.txt +.venv/bin/python tools/sig_image.py --image extracted/retail/SLUS_007.26 --vram-base 0x8000F800 --seeds .run/seeds.main.txt --name main +echo "sig-main: signed $(wc -l < .run/seeds.main.txt) main game-code fns (build-true lengths, from the link map + objects) -> .run/sig.main.jsonl" +else +echo "sig-main: no main build (build/us/SLUS_007.26.map absent) — run 'make check BINARY=main' first; .run/sig.main.jsonl left as is" +fi +main_seed_ends: 809 functions / 45150 ins from 15 game-code objects (skipped 0 LINKED subseg objects + 268 build/psyq objects) +sig_image: 809 functions [0x8000f800..0x80074800) -> .run/sig.main.jsonl +sig-main: signed 809 main game-code fns (build-true lengths, from the link map + objects) -> .run/sig.main.jsonl +# Cross-binary duplicate function groups (generated by tools/dup_report.py --cross) +# sources: +# main .run/sig.main.jsonl sha1=8bcb8eb2f6e3dc4562b39a6be9a0721bf0215fb3 +# resident .run/sig.resident.jsonl sha1=76556f34476524f1c8160139f5993ad6d66d5f52 +# md_MAIN_013 .run/sig.md_MAIN_013.jsonl sha1=7ef0aab887b13304929d00a324e50f883c30a903 +# md_MAIN_014 .run/sig.md_MAIN_014.jsonl sha1=d67de8a37cbdb814e14360689965c68c8888ff97 +# md_MAIN_015 .run/sig.md_MAIN_015.jsonl sha1=6630706504c43c403d20e71756d42f47004eb229 +# md_MAIN_016 .run/sig.md_MAIN_016.jsonl sha1=0b94374d67397804d3086f8eb5e3b5ff8243c641 +# md_MAIN_017 .run/sig.md_MAIN_017.jsonl sha1=4459498b5214040466bd80856d0fd4985cd37f52 +# md_MAIN_018 .run/sig.md_MAIN_018.jsonl sha1=e898d3758ed5a3106fb9ec87521efe07d539d5ac +# md_MAIN_019 .run/sig.md_MAIN_019.jsonl sha1=ab97580aa15d72368f050fad2469231168b1f872 +# md_MAIN_020 .run/sig.md_MAIN_020.jsonl sha1=c763c31db7d3616870d91c9cfedfadaebe2cbb0f +# md_MAIN_021 .run/sig.md_MAIN_021.jsonl sha1=f5148cf1822b7eddd1dcebaa295f35d6681d5154 +# md_MAIN_022 .run/sig.md_MAIN_022.jsonl sha1=06553bc99d5f478d96f1be673df5cfabdffe1c57 +# md_MAIN_023 .run/sig.md_MAIN_023.jsonl sha1=bbb6319e2a29c15f471964c2943380a6c6bf7202 +# md_MAIN_024 .run/sig.md_MAIN_024.jsonl sha1=30e78b3a9bcd4b5a56f3c41d193a8869c997debf +# md_MAIN_025 .run/sig.md_MAIN_025.jsonl sha1=87bfd50e702289c99b0d139706510baa9b85b61c +# md_MAIN_026 .run/sig.md_MAIN_026.jsonl sha1=225a2fd20375ced7a83f17faa5de76c8ad291ab0 +# md_MAIN_027 .run/sig.md_MAIN_027.jsonl sha1=cb4ae91b55d4aa4b4b07178c66fb60380281164a +# md_MAIN_028 .run/sig.md_MAIN_028.jsonl sha1=056dd72e871d1944b25cd0c74f1e376a43f1b6e8 +# md_MAIN_029 .run/sig.md_MAIN_029.jsonl sha1=fe61c0e82a087c4ea79c2c63606ae471e9c52ca4 +# md_MAIN_030 .run/sig.md_MAIN_030.jsonl sha1=ced3202a34dcf8bfe15b8dd6613eb6b975219f24 +# md_MAIN_031 .run/sig.md_MAIN_031.jsonl sha1=01a4ea9a9f20a407f76b536394db5f00a791c2e1 +# md_MAIN_032 .run/sig.md_MAIN_032.jsonl sha1=725e13cf872f740119ca3d673613dee278180887 +# md_MAIN_033 .run/sig.md_MAIN_033.jsonl sha1=2fe65fcd8761b19612969a38043456f7dfd58c58 +# md_MAIN_034 .run/sig.md_MAIN_034.jsonl sha1=06d2b217ffa58bce4c197edaa370f1b7e08ffde3 +# md_MAIN_035 .run/sig.md_MAIN_035.jsonl sha1=abe999e11a37d2f866525b14855f768bc8232d53 +# md_MAIN_036 .run/sig.md_MAIN_036.jsonl sha1=875193c8605f7ead21668e238df09fd640d28b28 +# md_MAIN_037 .run/sig.md_MAIN_037.jsonl sha1=e149bac4d5d8049cc51f2fa664c298feac2e888b +# md_MAIN_038 .run/sig.md_MAIN_038.jsonl sha1=16c9ab7c00879c6005a190221df1abf8f9097b28 +# md_MAIN_039 .run/sig.md_MAIN_039.jsonl sha1=97a562d238491f890250cf69589a7d7b6b8e0dd9 +# md_MAIN_040 .run/sig.md_MAIN_040.jsonl sha1=395cc9b0ad96f7fc81bac808cd450980a9ca223a +# md_MAIN_041 .run/sig.md_MAIN_041.jsonl sha1=43cd6e6eee8a96c97f727293eca2db5da258dbbe +# md_MAIN_042 .run/sig.md_MAIN_042.jsonl sha1=2bb0f14bc0aee2e281322cc1793435248738c4ef +# md_MAIN_043 .run/sig.md_MAIN_043.jsonl sha1=90eb3ee32bc468db31c8c323c50e9ec77eb5186e +# md_MAIN_044 .run/sig.md_MAIN_044.jsonl sha1=ff79d95fc95d836ffe9fb432ee4f7b6805fce532 +# md_MAIN_045 .run/sig.md_MAIN_045.jsonl sha1=97e499655a040ac0923488fe06240153c24790d7 +# md_MAIN_046 .run/sig.md_MAIN_046.jsonl sha1=63b4821ee0960645ee402302bb9d1d553a7cb876 +# md_MAIN_047 .run/sig.md_MAIN_047.jsonl sha1=63f8bfb5af126957574c0c3108a2885348989236 +# md_MAIN_001 .run/sig.md_MAIN_001.jsonl sha1=3fcf391554345b10d22eed03f812bbcf3ede7dbd +# md_MAIN_008 .run/sig.md_MAIN_008.jsonl sha1=2a35ee2d5729265387e42abc7393999473f2c0a4 +# md_MAIN_011 .run/sig.md_MAIN_011.jsonl sha1=5c7f07d04ecfb33a45070298018e2ca3b63eeb80 +# md_SC07_003 .run/sig.md_SC07_003.jsonl sha1=8257c06af37b03c91c530b4a282483a13cd9a358 +# md_SC07_004 .run/sig.md_SC07_004.jsonl sha1=52e4802e51f3d553b6fe66a1b8dbba81c87eb606 +# md_MAIN_003 .run/sig.md_MAIN_003.jsonl sha1=ad8046e1c845a7083d07e5e1f7e0af03af2ed427 +# md_SC03_073 .run/sig.md_SC03_073.jsonl sha1=aad07403b4a03004ba65d66960d47eb62821459a +# md_SC03_074 .run/sig.md_SC03_074.jsonl sha1=3c1972e1d6b2cf697009a17b36804793ed5be83c +# md_SC03_075 .run/sig.md_SC03_075.jsonl sha1=3c62c70ce633f253a6ed2b084dcca550d54ed8d9 +# md_SC03_076 .run/sig.md_SC03_076.jsonl sha1=e742bd5654d8edd77013377a30487be1d43f2a4a +# md_SC03_077 .run/sig.md_SC03_077.jsonl sha1=c69bbe63121a108854f30e57fc7b668e5cc86ad0 +# md_SC03_078 .run/sig.md_SC03_078.jsonl sha1=6de8ca98160b25b61f4fde45085b3f73e22ae365 +# md_SC03_079 .run/sig.md_SC03_079.jsonl sha1=231a4686ee34c3ec7d0db9abddee71de1757a930 +# md_SC03_132 .run/sig.md_SC03_132.jsonl sha1=b0cc41cb2c8c785de578ffa53b70e34d094b38d0 +# md_SC03_133 .run/sig.md_SC03_133.jsonl sha1=93ca95b61ea0f5ab6a1e77e36df555a291cdd23e +# md_SC03_134 .run/sig.md_SC03_134.jsonl sha1=28e91f8c865a89e8da0289dd3a31135d05c83dde +# md_SC03_135 .run/sig.md_SC03_135.jsonl sha1=3cba00fe2706165faeaa71b496de5fbd73328e04 +# md_SC03_136 .run/sig.md_SC03_136.jsonl sha1=17529813f89346c732f69a52a14d1a27591d7374 +# md_SC03_137 .run/sig.md_SC03_137.jsonl sha1=7021ffbd1bd7fdeb08a3f567759d76ed77735d45 +# md_SC03_138 .run/sig.md_SC03_138.jsonl sha1=9c0e7ac9e4eb3e3c30d493a52a0cd6ad419966ba +# md_SC04_024 .run/sig.md_SC04_024.jsonl sha1=3225fc7764cc164adaf31eb39ec6a12102278814 +# md_SC04_025 .run/sig.md_SC04_025.jsonl sha1=e103dca8eeff608cde2bef8a54c67d6a64cb5108 +# md_SC04_026 .run/sig.md_SC04_026.jsonl sha1=5b96c3f0f229ebbe1a25e858e914e0a4d1fb145e +# md_SC04_027 .run/sig.md_SC04_027.jsonl sha1=641fa59c5472f43af4bd5ae2e6e00cb6f1684a81 +# md_SC04_028 .run/sig.md_SC04_028.jsonl sha1=da8059a0038c9434a6c1cf598a6fd8a2a8b8ffdd +# md_SC04_029 .run/sig.md_SC04_029.jsonl sha1=e13ba2db43e5209f743a8d6551fb039d643b63d2 +# md_SC04_030 .run/sig.md_SC04_030.jsonl sha1=23ba483c07fd1963bb205ace84ea4146145debac +# md_SC05_023 .run/sig.md_SC05_023.jsonl sha1=b3d1437dd5dc54a6d64b50fb6256c5a2b1228dc5 +# md_SC05_024 .run/sig.md_SC05_024.jsonl sha1=9d86259be19b54db8d1c3874dab5c7bff9716058 +# md_SC05_025 .run/sig.md_SC05_025.jsonl sha1=c5fb5e5c6ad162602ccf785a18324774de8cee2f +# md_SC05_026 .run/sig.md_SC05_026.jsonl sha1=a85005e8663c338e76fad16d84294453188e2851 +# md_SC05_027 .run/sig.md_SC05_027.jsonl sha1=d2fbd149b154b68e9d789ee648e8d4f22937d4a7 +# md_SC05_028 .run/sig.md_SC05_028.jsonl sha1=76b99a3ffc7c9e3c942b65b1408b0a9081ed874c +# md_SC05_029 .run/sig.md_SC05_029.jsonl sha1=b0b01a503cb8e6ae34c7d8214b547011303024aa +# md_SC02_009 .run/sig.md_SC02_009.jsonl sha1=bcd1074efc742a78d2de5fda08887f9d91b719ea +# md_MAIN_007 .run/sig.md_MAIN_007.jsonl sha1=8b0afc8200b05fcf9b8c3e1000fe5fd0150ba439 +# md_MAIN_009 .run/sig.md_MAIN_009.jsonl sha1=ebdd93ab0f5761b7538d6fa8ad534fc631074c8d +# md_SC03_053 .run/sig.md_SC03_053.jsonl sha1=2a1932d9d28dadf733a6198fbd490bf3bba66483 +# md_SC03_054 .run/sig.md_SC03_054.jsonl sha1=fc092d8184734c34b5dfb1b0659fa26a13d81ec0 +# md_SC03_056 .run/sig.md_SC03_056.jsonl sha1=7bb093a65a46b5c3b3e4287cef8817b38f9bdaf5 +# overlays 141x (named+sig_image, deduped, nins>=8) set-sha1=17474a5aae730987d8cf2edd2816ddf598b6e4b8 +# Collapsible bytes = (count-1)*nins*4 (bytes saved; one member stays the source). +# A cross-binary group (binaries>1) is the Phase-12/13 work queue; lead with h_exact +# (guaranteed byte-match), h_norm is candidate-only (byte-confirm via dedup_integrate). +# Overlay sigs are sig_image (Ghidra-free): h_exact is exact; h_norm is self-consistent. +# Each subsection lists the top 200 groups by collapsible bytes; totals are stated. +## h_exact (byte-identical) +### cross-binary (binaries > 1) — 9658 groups, 30043444 collapsible bytes (top 200 of 9658 shown) +### intra-binary — 181 groups, 28800 collapsible bytes +## h_norm (structural) +### cross-binary (binaries > 1) — 9341 groups, 40286720 collapsible bytes (top 200 of 9341 shown) +### intra-binary — 403 groups, 75116 collapsible bytes (top 200 of 403 shown) +# BFM FLEET matching progress (generated by tools/progress.py --fleet — authoritative) +# 218 binaries: main + resident + 216 location overlays. DETERMINISTIC, +# source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; +# cross-binary collapsible-byte leverage: docs/duplicates.cross.md. + +# THREE progress metrics (all matter — see the labels): +FLEET fn-count byte-ident: 363680 / 363680 = 100.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 13492113 / 13492113 = 100.0% (shipped .text across main + resident + 216 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 5820205 / 5820205 = 100.0% (90984/90984 unique fns; the DISTINCT-RE number) +MAIN game-code weighted : 45150 / 45150 = 100.0% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; build-derived sig (make sig-main) dated 2026-09-08; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 0 pad-tail) + (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13446963 / 13446963 = 100.0%) + +FLEET REAL substantive : 350533 (of which dedup-shared 249873 via 3135 groups / 260543 instances) +FLEET LINKED PsyQ objs : 1256 +FLEET NON_MATCHING : 0 (0 in any default build — G4) +FLEET INCLUDE_ASM stubs : 0 +FLEET matchable : 363680 +# BFM FLEET matching progress (generated by tools/progress.py --fleet — authoritative) +# 218 binaries: main + resident + 216 location overlays. DETERMINISTIC, +# source-derived (committed src/*.c + config/dedup.us.yaml). Live byte gate: `make check-all`; +# cross-binary collapsible-byte leverage: docs/duplicates.cross.md. + +# THREE progress metrics (all matter — see the labels): +FLEET fn-count byte-ident: 363680 / 363680 = 100.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET instr-weighted : 13492113 / 13492113 = 100.0% (shipped .text across main + resident + 216 overlays; the decomp.dev-DISPLAY number) +FLEET distinct-code(uniq): 5820205 / 5820205 = 100.0% (90984/90984 unique fns; the DISTINCT-RE number) +MAIN game-code weighted : 45150 / 45150 = 100.0% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; build-derived sig (make sig-main) dated 2026-09-08; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 0 pad-tail) + (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13446963 / 13446963 = 100.0%) + +FLEET REAL substantive : 350533 (of which dedup-shared 249873 via 3135 groups / 260543 instances) +FLEET LINKED PsyQ objs : 1256 +FLEET NON_MATCHING : 0 (0 in any default build — G4) +FLEET INCLUDE_ASM stubs : 0 +FLEET matchable : 363680 +progress.py: docs/progress.json written; README block updated +timeline: the last row (2026-09-08) disagrees with docs/progress.json: {'fn': ((363221, 363221), (363680, 363680))} +make[1]: *** [Makefile:348: report] Error 1 +make: *** [Makefile:270: tools-health] Error 2 +Command exited with non-zero status 2 +wall=272.87 s +exit=2 diff --git a/README.md b/README.md index fb829a835e..9d06c2de9b 100644 --- a/README.md +++ b/README.md @@ -18,12 +18,12 @@ originals; nothing "functionally equivalent" counts. What the repository claims | Metric | Matched | Of | % | |---|---:|---:|---:| -| Functions byte-identical (all binaries) | 363,221 | 363,221 | 100.00% | +| Functions byte-identical (all binaries) | 363,680 | 363,680 | 100.00% | | Instructions byte-identical (instruction-weighted) | 13,492,113 | 13,492,113 | 100.0% | | Distinct code byte-identical (each body once) | 5,820,205 | 5,820,205 | 100.0% | | Main executable game code (excl. Sony objects) | 45,150 | 45,150 | 100.0% | -218 binaries rebuild byte-identical from source · 360,744 functions in C (255,632 of them shared bodies via 2,220 dedup groups) · 1,256 Sony PsyQ library functions linked from the SDK objects, not our C · 5 hand-written-assembly bodies kept verbatim · 0 assembly stubs left · 0 non-matching functions. +218 binaries rebuild byte-identical from source · 350,533 functions in C (249,873 of them shared bodies via 3,135 dedup groups) · 1,256 Sony PsyQ library functions linked from the SDK objects, not our C · 5 hand-written-assembly bodies kept verbatim · 0 assembly stubs left · 0 non-matching functions. _Generated by `tools/progress.py --readme` from `docs/progress.json` — numbers are never typed by hand._ diff --git a/decomp-architect/corpus/tools/P10/build_engine_types.py b/decomp-architect/corpus/tools/P10/build_engine_types.py index 39aac06eb5..bff38537f5 100644 --- a/decomp-architect/corpus/tools/P10/build_engine_types.py +++ b/decomp-architect/corpus/tools/P10/build_engine_types.py @@ -339,7 +339,7 @@ def main(): '/* src/shared/engine_types.h — shared engine struct/union types + typedefs (Phase 15 §14c,', ' * Phase 20 typedef lift). Generated by tools/build_engine_types.py from the matched bodies', ' * in the source overlay. Defined ONCE here (0 same-name-different-layout collisions) so the', - ' * struct/typedef-using shared functions propagate fleet-wide via engine_core.h. Included by', + ' * struct/typedef-using shared functions share fleet-wide through the per-function headers under src/shared/ (Phase 35). Included by', ' * common.h consumers. */', '#include "common.h"', ''] # forward decls first (lets pointer-only references resolve regardless of order) diff --git a/decomp-architect/corpus/tools/P5/audit_binaries.py b/decomp-architect/corpus/tools/P5/audit_binaries.py index 9a188e9094..e14acc7267 100644 --- a/decomp-architect/corpus/tools/P5/audit_binaries.py +++ b/decomp-architect/corpus/tools/P5/audit_binaries.py @@ -33,7 +33,7 @@ import dup_report import corpus REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -SHARED_INCLUDES = ("shared/engine_core.h", "shared/engine_prelude.h") # the macro-era header, then the Phase-35 prelude +SHARED_INCLUDES = ("shared/engine_prelude.h",) # the Phase-35 prelude (the macro-era header is gone, P35 T4/T6) def onboarded(): diff --git a/decomp-architect/corpus/tools/P5/tool_census.py b/decomp-architect/corpus/tools/P5/tool_census.py index 53fe1fabe3..8a7185b1c4 100644 --- a/decomp-architect/corpus/tools/P5/tool_census.py +++ b/decomp-architect/corpus/tools/P5/tool_census.py @@ -377,6 +377,59 @@ def check_corpus(recs, files): return gaps, len(copies), len(pointers) +# ---------------------------------------------------------------------------------------------------------------------------- +# The macro-form guard (Phase 35 T6). The dedup macro form (`DEFINE_func_X()` sites expanding bodies from src/shared/engine_core.h) +# is retired: every shared body is a plain-C header included at its site. A LIVE tool that still names the form in CODE (a +# non-docstring string constant — a regex, a path, a message) is a tool that would parse or write the retired form; it must be +# fixed, FROZEN (status FROZEN: its command line refuses) or retired. Comments and docstrings are the record and may say anything. +# The detectors that name the form in order to REFUSE or CENSUS it are whitelisted by name — the list is the guard's own record. +GUARD_TOKENS = ("DEFINE_func_", "engine_core.h") +GUARD_WHITELIST = { + "tools/share_census.py": "the S1 census: counts macro sites so the invariant can assert 0 (and its selftest fixture uses the form)", + "tools/macro_to_header.py": "the T4 converter, kept as share_body's library (naming, banner, alias binding) and for the record", + "tools/share_body.py": "names the form in its refusal texts", + "tools/overlay_src_split.py": "detects a macro site only to REFUSE it (R43)", + "tools/gccmap_cites.py": "a citation datum (`engine_core.h:24926`) in the codegen map's cite table", + "tools/tool_census.py": "this guard", +} + + +def macro_form_guard(files, by_path, root=REPO): + """(gaps, counts): every LIVE/STILL-NEEDED tool under `root` (FROZEN and retired excluded, the whitelist excluded) is parsed + with `ast`; a non-docstring string constant carrying a guard token is a gap. `root` is a parameter so the negative control can + point the guard at a worktree of the pre-conversion tree (R39).""" + import ast + gaps, counts = [], {"scanned": 0, "frozen": 0, "whitelisted": 0, "flagged": 0} + for f in files: + if not f.endswith(".py"): + continue + status = by_path.get(f, {}).get("status", "") + if status == "FROZEN": + counts["frozen"] += 1 + continue + if f in GUARD_WHITELIST: + counts["whitelisted"] += 1 + continue + p = root / f + if not p.exists(): + continue + try: + tree = ast.parse(p.read_text(encoding="utf-8", errors="replace")) + except SyntaxError: + continue + counts["scanned"] += 1 + docs = {ast.get_docstring(n, clean=False) for n in ast.walk(tree) + if isinstance(n, (ast.Module, ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef))} + hits = sorted({n.lineno for n in ast.walk(tree) + if isinstance(n, ast.Constant) and isinstance(n.value, str) and n.value not in docs + and any(tok in n.value for tok in GUARD_TOKENS)}) + if hits: + counts["flagged"] += 1 + gaps.append(f"macro-form guard: LIVE tool {f} names the retired macro form in code at line(s) {hits[:6]} — fix it, " + f"freeze it (status FROZEN) or retire it") + return gaps, counts + + def main(): ap = argparse.ArgumentParser() ap.add_argument("--check", action="store_true") @@ -384,7 +437,18 @@ def main(): ap.add_argument("--corpus", action="store_true") ap.add_argument("--all", action="store_true") ap.add_argument("--consumers", metavar="FILE") + ap.add_argument("--guard-root", metavar="DIR", help="run ONLY the macro-form guard against the tools/ under DIR (the R39 negative control)") a = ap.parse_args() + if a.guard_root: + by_path = {r["path"]: r for r in read_dict()} + root = pathlib.Path(a.guard_root).resolve() + files = sorted(p.relative_to(root).as_posix() for p in (root / "tools").glob("*.py")) + g, c = macro_form_guard(files, by_path, root=root) + for x in g: + print(" GAP", x) + print(f"macro-form guard ({root}): {c['flagged']} LIVE tools reference the retired form ({c['scanned']} scanned, " + f"{c['frozen']} frozen, {c['whitelisted']} whitelisted)") + return 1 if g else 0 recs, files, retired, gaps = census() if a.consumers: rec = next((r for r in recs if r["path"] == a.consumers or r["path"].endswith("/" + a.consumers) or pathlib.Path(r["path"]).name == a.consumers), None) @@ -408,6 +472,12 @@ def main(): gaps += cg for g in cg: print(" GAP", g) + gg, gc = macro_form_guard(files, {r["path"]: r for r in read_dict()}) + gaps += gg + for g in gg: + print(" GAP", g) + print(f"macro-form guard: {gc['flagged']} LIVE tools reference the retired form ({gc['scanned']} scanned, {gc['frozen']} frozen, " + f"{gc['whitelisted']} whitelisted detectors, {len(retired)} retired)") print(f"tool_census --check: corpus {nc} copies + {npt} pointers checked; {len(gaps)} gap(s)") print("tool_census --check: OK" if not gaps else "tool_census --check: FAIL") return 1 if gaps else 0 diff --git a/decomp-architect/corpus/tools/P6/cdecl.py b/decomp-architect/corpus/tools/P6/cdecl.py index 6821888ebb..f971ad03e2 100644 --- a/decomp-architect/corpus/tools/P6/cdecl.py +++ b/decomp-architect/corpus/tools/P6/cdecl.py @@ -106,7 +106,7 @@ GNU = {'__asm__', 'asm', '__attribute__', '__extension__', '__inline__'} # Macro invocations that are NOT declarations in RAW draft/source text (they become declarations # only after cpp). An EXPLICIT, NAMED exclusion list — the audit's rule: never let the exclusion set # be "whatever the parser happened to choke on". -MACRO_STMT = re.compile(r'^\s*(INCLUDE_ASM|DEFINE_func_[0-9A-Fa-f]+|SETTER|RETCONST|CLEAR_TBL40)\b') +MACRO_STMT = re.compile(r'^\s*(INCLUDE_ASM)\b') # P35 T6: the dedup macro forms are gone; INCLUDE_ASM is the one macro statement left class CDeclError(Exception): @@ -1294,81 +1294,15 @@ def audit_differential(): scanner it replaces: any symbol an incumbent sees and this one does not is a defect in THIS tool. The reverse (symbols only this one sees) is the measured size of the hole.""" sys.path.insert(0, os.path.join(REPO, 'tools')) - import gen_harvest_targets as ght # reconcile_decls RETIRED (S45, R33): its DATA_DECL_LINE_RE row proved the superset for # 26-A..S44; the incumbent is deleted, so the differential now compares the survivors only. - import sig_unify as su - - ec = os.path.join(REPO, 'src/shared/engine_core.h') - if not os.path.exists(ec): + # P35 T6: the macro header is gone for good; the differential's only honest result is the statement below. + if True: # Phase 35: the macro header is gone (per-function headers under src/shared// hold plain C that tu_scope reads # like any TU). The fifteen-incumbent differential was a comparison OVER MACRO TEXT; without that text it has nothing # to compare against, and saying so is the honest result (R43 — never fabricate a synthetic TU from the new form). - print('[differential] src/shared/engine_core.h is absent (Phase 35): the macro-era differential no longer applies — OK') + print('[differential] the macro-era shared header is gone (Phase 35): the macro-era differential no longer applies — OK') return True - text = open(ec).read() - - # The incumbents scan engine_core.h's RAW TEXT — i.e. the bodies of 1,801 #define macros. A - # declaration in a macro body declares nothing until the macro is INVOKED (the §8c law), so the - # honest like-for-like comparison is against what cpp produces when every macro IS invoked. - # That synthetic TU is exactly "everything engine_core.h is capable of declaring". - d = os.path.join(REPO, 'src/shared') - tmp = os.path.join(d, '.cdecl_allmacros.c') - macros = re.findall(r'^#define\s+(DEFINE_func_[0-9A-Fa-f]+)\(\)', text, re.M) - with open(tmp, 'w') as f: - f.write('#include "../../include/common.h"\n#include "engine_types.h"\n' - '#include "engine_core.h"\n') - for mac in macros: - f.write(f'{mac}()\n') - try: - stmts = tu_statements(tmp) - mine = scope(stmts, tmp) - expanded = '\n'.join(stmts) - finally: - os.path.exists(tmp) and os.remove(tmp) - print(f'[differential] expanded {len(macros)} DEFINE_ macros through cpp -> {len(mine)} names') - - mine_d = {n for n in mine if n.startswith('D_')} - rows = [] - for name, rx in (('gen_harvest_targets.DATA_DECL_RE', ght.DATA_DECL_RE), - ('sig_unify.DATA_DECL_RE', su.DATA_DECL_RE)): - theirs = set() - for m in rx.finditer(text): - theirs |= set(re.findall(r'\bD_[0-9A-Fa-f]+\b', m.group(0))) - # A symbol I do not report is only MY defect if it is genuinely at FILE scope. A - # block-scope `extern` is private to its function and is NOT part of the TU's namespace — - # reporting it as an authoritative canonical is what produced the §8d - # `conflicting types for D_801812A4` wall. So separate the two, and never let a real defect - # hide behind the excuse. - lost = theirs - mine_d - block = {s for s in lost if re.search(r'\bextern\b[^;]*\b' + s + r'\b', expanded)} - defect = lost - block - rows.append((name, len(theirs), len(mine_d), len(mine_d - theirs), sorted(defect), - sorted(block))) - - print('[differential] engine_core.h — D_ symbols (raw-text scan vs cpp-expanded file scope)') - print(f' {"incumbent":<36} {"theirs":>7} {"cdecl":>7} {"cdecl-only":>11} {"MY DEFECT":>10} ' - f'{"their block-scope error":>24}') - ok = True - for name, t, m, g, defect, block in rows: - print(f' {name:<36} {t:>7} {m:>7} {g:>11} {len(defect):>10} {len(block):>24}') - if defect: - print(f' DEFECT (file-scope, invisible to cdecl): {defect[:8]}') - if block: - print(f' they count BLOCK-scope externs as file-scope canonicals: {block[:4]}') - ok &= not defect - - named = {'D_80127530': 'array', 'D_80127088': 'fnptr', 'D_8011DB28': 'fnptr', - 'D_801274D0': 'fnptr', 'D_8018E858': 'fnptr_array'} - print(' the audit\'s named blind symbols (engine_core.h), now resolved WITH THEIR KIND:') - for n, want in named.items(): - d = mine.get(n) - got = d.kind if d else 'MISSING' - flag = 'ok' if got == want else 'WRONG' - ok &= (got == want) - print(f' {n:<14} kind={got:<12} (expected {want}) [{flag}]' - + (f' {d.type}' if d else '')) - return ok def main(): diff --git a/decomp-architect/corpus/tools/P6/dedup_integrate.py b/decomp-architect/corpus/tools/P6/dedup_integrate.py index e23bd6ebdb..a7caa58641 100644 --- a/decomp-architect/corpus/tools/P6/dedup_integrate.py +++ b/decomp-architect/corpus/tools/P6/dedup_integrate.py @@ -55,7 +55,7 @@ TIERS = ("h_exact", "h_norm") # OVER-APPROXIMATING by design (R32): any C identifier, not just func_ — a curated symbol # (e.g. listCdBuffer) is a stub too, and a `func_`-only pattern silently misses it. INCLUDE_ASM_RE = re.compile(r'INCLUDE_ASM\([^)]*,\s*([A-Za-z_]\w*)\s*\)') -MACRO_FUNC_RE = re.compile(r'^(DEFINE_func_[0-9A-Fa-f]+|SETTER|RETCONST|CLEAR_TBL40)$') # the macro-form `func` tokens +PARAM_FUNC_RE = re.compile(r'^SHARED_FN$') # the parameterized include form's `func` token (P35; the macro forms are gone) SYMBOL_LINE_RE = re.compile(r'^\s*([A-Za-z_]\w*)\s*=\s*(0x[0-9A-Fa-f]+)\s*;') @@ -193,9 +193,9 @@ def check(groups, binary_filter=None, allow_unsigned=False): f"body that was never written (the share was registered but never propagated)") failures += 1; continue # ---- C2a′ (Phase 35 T2): a PLAIN-C header source must DEFINE `func` (a token occurrence is not a body) -------- - # The macro forms (DEFINE_func_*, SETTER/RETCONST/CLEAR_TBL40) define through cpp and keep the token check above; - # the include form is read by share_census.header_defs — the one reader of that form (R33). - if not MACRO_FUNC_RE.match(fn): + # The parameterized form (SHARED_FN) defines through cpp and keeps the token check above; every other source is a + # plain-C header read by share_census.header_defs — the one reader of that form (R33). + if not PARAM_FUNC_RE.match(fn): sys.path.insert(0, str(ROOT / "tools")) import share_census defined = {n for n, _ in share_census.header_defs(ROOT / src)} diff --git a/decomp-architect/corpus/tools/P6/family_cousins.py b/decomp-architect/corpus/tools/P6/family_cousins.py index 01e072af79..dd293a662d 100644 --- a/decomp-architect/corpus/tools/P6/family_cousins.py +++ b/decomp-architect/corpus/tools/P6/family_cousins.py @@ -280,11 +280,10 @@ def write_digest(out): # ---------------------------------------------------------------- wave slate def seed_body_ref(bin_, addr): - """Where the seed's C body lives: engine_core.h DEFINE_ macro, or the inline def's src file.""" + """Where the seed's C body lives: a shared per-function header under src/shared/ (Phase 35), or the inline def's src file.""" name = f"func_{addr:08X}" - core = "src/shared/engine_core.h" - if os.path.exists(core) and f"DEFINE_{name}(" in open(core).read(): - return dict(kind="macro", path=core, name=name) + for hp in sorted(glob.glob(f"src/shared/*/{name}.h")) + sorted(glob.glob(f"src/shared/*/{name}__*.h")): + return dict(kind="header", path=hp, name=name) for p in sorted(glob.glob(f"src/{bin_}/*.c")): txt = open(p).read() if re.search(rf"^[A-Za-z_][^\n=;]*\b{name}\s*\(", txt, re.M) and f"INCLUDE_ASM" not in \ diff --git a/decomp-architect/corpus/tools/P6/fix_arity_callers.py b/decomp-architect/corpus/tools/P6/fix_arity_callers.py index 3bbad3bf33..8039800b65 100644 --- a/decomp-architect/corpus/tools/P6/fix_arity_callers.py +++ b/decomp-architect/corpus/tools/P6/fix_arity_callers.py @@ -38,7 +38,6 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import shared_lock # Stage 1: --apply/--undo-journal write the fleet-shared header REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -EC = os.path.join(REPO, 'src/shared/engine_core.h') NARROW = re.compile(r'\b(char|short|signed\s+char|unsigned\s+char|unsigned\s+short|s8|u8|s16|u16|float|f32)\b') @@ -157,7 +156,7 @@ def main(): 'reconciliation for non-(void) conflicting forward-decls; byte-gate filters (G3/P9)') ap.add_argument('--binary', help='ALSO scan+rewrite this overlay\'s own inline caller decls in ' 'src//*.c (a conflicting extern is often in the overlay src, not just ' - 'engine_core.h — the T6 integration-recovery gap). Default: engine_core.h only.') + 'the shared headers under src/shared/ — the T6 integration-recovery gap). Default: the shared headers under src/shared/ only.') ap.add_argument('--journal', metavar='PATH', help='(apply) record each substitution\'s literal before/after to this JSON for ' 'exact --undo-journal restore; written even when no edits were made') @@ -177,7 +176,7 @@ def main(): sys.exit('no funcs given') # target files: engine_core.h always; + the overlay's own src (inline callers) when --binary given. - files = sorted(set(([EC] if os.path.exists(EC) else []) + glob.glob(os.path.join(REPO, 'src/shared/**/*.h'), recursive=True))) # Phase 35: every shared header carries externs + files = sorted(set(glob.glob(os.path.join(REPO, 'src/shared/**/*.h'), recursive=True))) # Phase 35: every shared header carries externs if a.binary: # MAIN'S SOURCES DO NOT LIVE IN src/main/ (P31 S69). They are src/*.c — src/800.c, … — so the # overlay-shaped glob matched NOTHING for --binary main and the tool reported success over an diff --git a/decomp-architect/corpus/tools/P6/jr_isolate_all.py b/decomp-architect/corpus/tools/P6/jr_isolate_all.py index 6283015e87..7da9013ecf 100644 --- a/decomp-architect/corpus/tools/P6/jr_isolate_all.py +++ b/decomp-architect/corpus/tools/P6/jr_isolate_all.py @@ -641,10 +641,9 @@ def _provided_types(header): paths = [] for inc in incs: b = os.path.basename(inc) - if b == "engine_core.h": - # engine_core.h itself is NOT scanned: its typedefs live INSIDE `DEFINE_func_*()` macro - # bodies and reach a region only where that macro is invoked. What every includer gets at - # file scope is what engine_core.h #includes — engine_types.h + common.h (the legacy set). + if b == "engine_prelude.h": + # the Phase-35 prelude: what every overlay/module TU gets at file scope from the shared tree — engine_types.h + + # common.h (the legacy set; the per-function headers are included at their sites, not here) paths += ["src/shared/engine_types.h", "include/common.h"] elif b == "engine_types.h": paths += ["src/shared/engine_types.h", "include/common.h"] diff --git a/decomp-architect/corpus/tools/P6/sig_unify.py b/decomp-architect/corpus/tools/P6/sig_unify.py index 4b7266fcc4..2f00a5ac1f 100644 --- a/decomp-architect/corpus/tools/P6/sig_unify.py +++ b/decomp-architect/corpus/tools/P6/sig_unify.py @@ -199,7 +199,7 @@ def main(): help='overlay SPLIT .c the drafts target (e.g. ov_SC01_077_a.c / _o0.c); default = ' 'the main .c. Reads cur_stubs + inline/extern canonical sigs from THIS file so ' 'split-file drafts are NOT dropped (they are stubs in the split, not the main .c) ' - 'and get the def-side arity-adopt recovery. engine_core.h is always included.') + 'and get the def-side arity-adopt recovery. engine_prelude.h is always included.') ap.add_argument('--in', dest='indir', required=True) ap.add_argument('--out', dest='outdir', required=True) args = ap.parse_args() diff --git a/decomp-architect/corpus/tools/P8/auto_driver.py b/decomp-architect/corpus/tools/P8/auto_driver.py index 6d62f12708..8a79294e27 100644 --- a/decomp-architect/corpus/tools/P8/auto_driver.py +++ b/decomp-architect/corpus/tools/P8/auto_driver.py @@ -111,7 +111,7 @@ def fleet_pct(): def git_commit(msg): - sh(["git", "add", SRC, "src/shared/engine_core.h", "config/dedup.us.yaml"]) + sh(["git", "add", SRC, "src/shared", "config/dedup.us.yaml"]) # P35 T6: the share writes headers under src/shared/ sh(["git", "commit", "-q", "-m", msg]) return sh(["git", "rev-parse", "--short", "HEAD"]).stdout.strip() diff --git a/decomp-architect/corpus/tools/P8/bulk_harvest.py b/decomp-architect/corpus/tools/P8/bulk_harvest.py index 18e23a1b40..b5a124d8f3 100644 --- a/decomp-architect/corpus/tools/P8/bulk_harvest.py +++ b/decomp-architect/corpus/tools/P8/bulk_harvest.py @@ -207,7 +207,7 @@ def fleet_pct(): def git_commit(banked_by_bin, propagated, fp): - add = ["src/shared/engine_core.h", "src/shared/engine_types.h", "config/dedup.us.yaml"] + add = ["src/shared", "config/dedup.us.yaml"] # P35 T6: the per-function headers live under src/shared/ for b in banked_by_bin: add += [os.path.relpath(p, REPO) for p in glob.glob(os.path.join(REPO, "src/%s/%s*.c" % (b, b)))] add += [os.path.relpath(p, REPO) for p in glob.glob(os.path.join(REPO, "src/ov_*/*.c"))] # propagation diff --git a/decomp-architect/corpus/tools/P8/export_pairs.py b/decomp-architect/corpus/tools/P8/export_pairs.py index 6b306f88a9..ed7628d28a 100644 --- a/decomp-architect/corpus/tools/P8/export_pairs.py +++ b/decomp-architect/corpus/tools/P8/export_pairs.py @@ -150,14 +150,13 @@ def main(): region = os.path.relpath(os.path.join(root, f), os.path.join(REPO, 'src'))[:-2] for fn, body in extract_defs(open(os.path.join(root, f)).read()).items(): defs.setdefault(fn, (body, region)) - # corpus-v3: ALSO mine the shared DEFINE_func macro bodies (engine_core.h) — the setters/return-const/ - # dispatchers the model is blind to (extract_defs sees only inline col-0 defs, not macro instantiations). + # corpus-v3 mined the shared macro bodies here; since Phase 35 the shared bodies are plain-C headers under src/shared/ — + # (a header body is one definition in one file; mine the headers directly). n_inline = len(defs) - ec = os.path.join(REPO, 'src/shared/engine_core.h') - if os.path.exists(ec): - for fn, body in extract_macro_defs(open(ec).read()).items(): + for hp in sorted(glob.glob(os.path.join(REPO, 'src/shared/*/func_*.h'))): + for fn, (body, _region) in extract_defs(open(hp).read()).items(): defs.setdefault(fn, (body, 'shared')) - print(' %d func defs in src (%d inline + %d shared macros)' % ( + print(' %d func defs in src (%d inline + %d shared headers)' % ( len(defs), n_inline, len(defs) - n_inline), file=sys.stderr) pairs, skipped = [], {'no_asm': 0} diff --git a/decomp-architect/corpus/tools/P8/recover_integration.py b/decomp-architect/corpus/tools/P8/recover_integration.py index 8d36023e82..713e9fbf39 100644 --- a/decomp-architect/corpus/tools/P8/recover_integration.py +++ b/decomp-architect/corpus/tools/P8/recover_integration.py @@ -233,7 +233,7 @@ def main(): if propagate: if a.max_tier != "fleet" or not a.r22: raise SystemExit( - "propagation is a FLEET-tier write (src/shared/engine_core.h + up to 138 overlay .c): " + "propagation is a FLEET-tier write (the shared headers under src/shared/ + up to 138 overlay .c): " "it requires --max-tier fleet AND --r22, or pass --no-propagate (§65a).") if "demacroize" in stages: raise SystemExit( @@ -313,8 +313,7 @@ def main(): # passes — `fix_arity_callers --revert` is LOSSY for --any-proto (it rewrites `()`->`(void)`, not # back to the original `(a,b,c)`), which corrupts a non-bank whose caller passed args. So we # snapshot/restore verbatim instead. (Bug caught by the clean-rebuild verify, R22.) - tu_files = [os.path.join(REPO, "src/shared/engine_core.h")] + \ - sorted(glob.glob(os.path.join(REPO, f"src/{a.binary}/{a.binary}*.c"))) + tu_files = sorted(glob.glob(os.path.join(REPO, f"src/{a.binary}/{a.binary}*.c"))) # P35 T6: no macro header to snapshot snapshot = {f: open(f).read() for f in tu_files} def restore(): diff --git a/decomp-architect/corpus/tools/P9/progress.py b/decomp-architect/corpus/tools/P9/progress.py index 87ffc57a15..386d111bdd 100644 --- a/decomp-architect/corpus/tools/P9/progress.py +++ b/decomp-architect/corpus/tools/P9/progress.py @@ -819,7 +819,10 @@ def report(binary, audit=False, write=True): # _INCLUDED); it is still a shared body, so it counts in `shared`. A member parsed as a PRIVATE definition is not shared # (a demacroized copy) — the registry is advisory, the source authoritative, as before. members = dedup_members(BINARY) - shared = sorted((members - set(real) - set(stubs)) | (_INCLUDED & members)) + # Phase 35 T6: an included member whose header body is EMPTY is classified `empty` by the include rule above and must NOT be + # folded into `real` as "shared" (pre-T4 the macro site was invisible and an empty shared body counted as real through this + # fold; the T6 health run put func_801EF790/func_801EF85C in BOTH buckets — the R32 assertion below caught it). + shared = sorted(((members - set(real) - set(stubs)) | (_INCLUDED & members)) - set(empty)) real = sorted(set(real) | set(shared)) # ---- COVERAGE ASSERTION (the rule ratified 2026-07-14: a scanner over the corpus must assert its diff --git a/docs/SETUP.md b/docs/SETUP.md index 4e9ba0d9eb..d9419ff2b4 100644 --- a/docs/SETUP.md +++ b/docs/SETUP.md @@ -1539,6 +1539,18 @@ fills fast). Nothing is leaking — but the host does not get the memory back on `gated N/N` line read, the phase-log entry appended, the bank committed (R42), the clean fleet run every N batches (R22, `218 passed, 0 failed of 218` required); stops on the first red; refuses a dirty `src/`/`config/`. Size a call under the 10-minute foreground cap (a batch 40–100 s, a fleet run ≈ 90 s). +- **T6 (S96): the macro-era tools frozen or retired; the guard.** `tools/frozen.py` — the one refusal a FROZEN tool prints from its + `main()` (never at import: libraries stay importable — cdecl imports gen_harvest_targets, 18 tools import family_remap). Dictionary + status **FROZEN** (`tool_census` accepts it; the tool stays in `tools/`, its successor in the last column): family_sweep, + gen_harvest_targets, p16_improve, recover_giant, restore_dropped_decls, normalize_self_decls, o0_subsplit, inject_capped_externs, + aprop_autodraft, canon_sig_reconcile, conform_decls, blocker_probe, demacroize, family_remap (its command line; the library is live). + Retired to `tools/sunset/`: dedup_propagate + dedup_extend (→ share_body.py, which absorbed add_members_surgical and the load_sig + library surface verbatim), macro_draft, test_reconcile_ledger. **The macro-form guard** in `tool_census.py --check`: every LIVE + `.py` under tools/ (FROZEN, retired and the six whitelisted detectors excluded) is parsed with `ast`; a non-docstring string constant + carrying `DEFINE_func_` or `engine_core.h` is a gap — comments and docstrings are the record and may say anything. Its line reads + `macro-form guard: 0 LIVE tools reference the retired form (N scanned, 14 frozen, 6 whitelisted detectors, M retired)`. + `--guard-root DIR` runs only the guard against another tree's tools/ — the R39 negative control (a worktree of the pre-T4 commit + `0e38b51a3` flags exactly 15 tools: the twelve whose dead macro branches T6 removed and the three retired; none frozen or whitelisted). - **Twin binaries (T3).** Five overlay pairs are one payload (equal `config/check.*.sha`): SC01_005/006, SC03_118/119, SC02_000/003, SC04_018/019, SC03_014/015. The twin has NO source directory: `config/overlays.mk` declares `_TWIN_OF := ` and diff --git a/docs/progress.fleet.md b/docs/progress.fleet.md index e19d2926ad..6bb79ec640 100644 --- a/docs/progress.fleet.md +++ b/docs/progress.fleet.md @@ -4,17 +4,17 @@ # cross-binary collapsible-byte leverage: docs/duplicates.cross.md. # THREE progress metrics (all matter — see the labels): -FLEET fn-count byte-ident: 363221 / 363221 = 100.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) +FLEET fn-count byte-ident: 363680 / 363680 = 100.00% (REAL+LINKED+empties; FUNCTION-count, ×134-inflated — one crack counts per overlay) FLEET instr-weighted : 13492113 / 13492113 = 100.0% (shipped .text across main + resident + 216 overlays; the decomp.dev-DISPLAY number) FLEET distinct-code(uniq): 5820205 / 5820205 = 100.0% (90984/90984 unique fns; the DISTINCT-RE number) MAIN game-code weighted : 45150 / 45150 = 100.0% (INCLUDED in the fleet numbers above since 2026-07-22 — roadmap §1 metrics contract; build-derived sig (make sig-main) dated 2026-09-08; boundaries INDEPENDENTLY VERIFIED since P31 S77 — `make sig-main-oracle` + `make audit-corpus`: 0 phantom, 0 truncated, 0 pad-tail) (fleet EXCLUDING main, for continuity with pre-2026-07-22 readings: 13446963 / 13446963 = 100.0%) -FLEET REAL substantive : 360744 (of which dedup-shared 255632 via 2220 groups / 255708 instances) +FLEET REAL substantive : 350533 (of which dedup-shared 249873 via 3135 groups / 260543 instances) FLEET LINKED PsyQ objs : 1256 FLEET NON_MATCHING : 0 (0 in any default build — G4) FLEET INCLUDE_ASM stubs : 0 -FLEET matchable : 363221 +FLEET matchable : 363680 | binary | REAL | shared | LINKED | byte-ident | matchable | byte-ident % | |---|---:|---:|---:|---:|---:|---:| @@ -26,34 +26,34 @@ FLEET matchable : 363221 | md_MAIN_008 | 6 | 0 | 0 | 6 | 6 | 100.0% | | md_MAIN_009 | 11 | 0 | 0 | 12 | 12 | 100.0% | | md_MAIN_011 | 20 | 0 | 0 | 21 | 21 | 100.0% | -| md_MAIN_013 | 16 | 0 | 0 | 16 | 16 | 100.0% | -| md_MAIN_014 | 12 | 0 | 0 | 13 | 13 | 100.0% | +| md_MAIN_013 | 16 | 1 | 0 | 16 | 16 | 100.0% | +| md_MAIN_014 | 12 | 1 | 0 | 13 | 13 | 100.0% | | md_MAIN_015 | 20 | 1 | 0 | 20 | 20 | 100.0% | | md_MAIN_016 | 11 | 0 | 0 | 12 | 12 | 100.0% | -| md_MAIN_017 | 10 | 0 | 0 | 10 | 10 | 100.0% | +| md_MAIN_017 | 10 | 1 | 0 | 10 | 10 | 100.0% | | md_MAIN_018 | 10 | 0 | 0 | 11 | 11 | 100.0% | -| md_MAIN_019 | 22 | 0 | 0 | 22 | 22 | 100.0% | -| md_MAIN_020 | 13 | 0 | 0 | 14 | 14 | 100.0% | -| md_MAIN_021 | 10 | 0 | 0 | 11 | 11 | 100.0% | -| md_MAIN_022 | 31 | 0 | 0 | 33 | 33 | 100.0% | +| md_MAIN_019 | 22 | 1 | 0 | 22 | 22 | 100.0% | +| md_MAIN_020 | 13 | 1 | 0 | 14 | 14 | 100.0% | +| md_MAIN_021 | 10 | 1 | 0 | 11 | 11 | 100.0% | +| md_MAIN_022 | 31 | 1 | 0 | 33 | 33 | 100.0% | | md_MAIN_023 | 5 | 1 | 0 | 6 | 6 | 100.0% | -| md_MAIN_024 | 4 | 0 | 0 | 6 | 6 | 100.0% | +| md_MAIN_024 | 4 | 1 | 0 | 6 | 6 | 100.0% | | md_MAIN_025 | 30 | 0 | 0 | 30 | 30 | 100.0% | -| md_MAIN_026 | 24 | 0 | 0 | 24 | 24 | 100.0% | -| md_MAIN_027 | 27 | 0 | 0 | 29 | 29 | 100.0% | -| md_MAIN_028 | 22 | 0 | 0 | 22 | 22 | 100.0% | +| md_MAIN_026 | 24 | 1 | 0 | 24 | 24 | 100.0% | +| md_MAIN_027 | 27 | 1 | 0 | 29 | 29 | 100.0% | +| md_MAIN_028 | 22 | 1 | 0 | 22 | 22 | 100.0% | | md_MAIN_029 | 10 | 0 | 0 | 11 | 11 | 100.0% | -| md_MAIN_030 | 10 | 0 | 0 | 10 | 10 | 100.0% | +| md_MAIN_030 | 10 | 1 | 0 | 10 | 10 | 100.0% | | md_MAIN_031 | 18 | 0 | 0 | 18 | 18 | 100.0% | | md_MAIN_032 | 10 | 1 | 0 | 10 | 10 | 100.0% | -| md_MAIN_033 | 19 | 0 | 0 | 19 | 19 | 100.0% | +| md_MAIN_033 | 19 | 1 | 0 | 19 | 19 | 100.0% | | md_MAIN_034 | 27 | 0 | 0 | 28 | 28 | 100.0% | -| md_MAIN_035 | 15 | 0 | 0 | 16 | 16 | 100.0% | -| md_MAIN_036 | 27 | 0 | 0 | 28 | 28 | 100.0% | +| md_MAIN_035 | 15 | 1 | 0 | 16 | 16 | 100.0% | +| md_MAIN_036 | 27 | 1 | 0 | 28 | 28 | 100.0% | | md_MAIN_037 | 17 | 0 | 0 | 17 | 17 | 100.0% | -| md_MAIN_038 | 20 | 0 | 0 | 20 | 20 | 100.0% | +| md_MAIN_038 | 20 | 1 | 0 | 20 | 20 | 100.0% | | md_MAIN_039 | 26 | 0 | 0 | 26 | 26 | 100.0% | -| md_MAIN_040 | 19 | 0 | 0 | 19 | 19 | 100.0% | +| md_MAIN_040 | 19 | 1 | 0 | 19 | 19 | 100.0% | | md_MAIN_041 | 15 | 1 | 0 | 15 | 15 | 100.0% | | md_MAIN_042 | 4 | 0 | 0 | 4 | 4 | 100.0% | | md_MAIN_043 | 22 | 0 | 0 | 23 | 23 | 100.0% | @@ -65,174 +65,174 @@ FLEET matchable : 363221 | md_SC03_053 | 15 | 0 | 0 | 15 | 15 | 100.0% | | md_SC03_054 | 7 | 0 | 0 | 7 | 7 | 100.0% | | md_SC03_056 | 4 | 0 | 0 | 4 | 4 | 100.0% | -| md_SC03_073 | 28 | 10 | 0 | 28 | 28 | 100.0% | -| md_SC03_074 | 29 | 10 | 0 | 29 | 29 | 100.0% | -| md_SC03_075 | 41 | 10 | 0 | 41 | 41 | 100.0% | +| md_SC03_073 | 26 | 8 | 0 | 28 | 28 | 100.0% | +| md_SC03_074 | 27 | 8 | 0 | 29 | 29 | 100.0% | +| md_SC03_075 | 39 | 8 | 0 | 41 | 41 | 100.0% | | md_SC03_076 | 64 | 0 | 0 | 66 | 66 | 100.0% | | md_SC03_077 | 33 | 0 | 0 | 35 | 35 | 100.0% | -| md_SC03_078 | 27 | 9 | 0 | 27 | 27 | 100.0% | +| md_SC03_078 | 25 | 7 | 0 | 27 | 27 | 100.0% | | md_SC03_079 | 27 | 0 | 0 | 29 | 29 | 100.0% | | md_SC03_132 | 26 | 0 | 0 | 28 | 28 | 100.0% | -| md_SC03_133 | 27 | 1 | 0 | 29 | 29 | 100.0% | -| md_SC03_134 | 39 | 1 | 0 | 41 | 41 | 100.0% | +| md_SC03_133 | 27 | 3 | 0 | 29 | 29 | 100.0% | +| md_SC03_134 | 39 | 3 | 0 | 41 | 41 | 100.0% | | md_SC03_135 | 64 | 0 | 0 | 66 | 66 | 100.0% | | md_SC03_136 | 33 | 0 | 0 | 35 | 35 | 100.0% | -| md_SC03_137 | 25 | 1 | 0 | 27 | 27 | 100.0% | -| md_SC03_138 | 33 | 1 | 0 | 37 | 37 | 100.0% | +| md_SC03_137 | 25 | 3 | 0 | 27 | 27 | 100.0% | +| md_SC03_138 | 33 | 3 | 0 | 37 | 37 | 100.0% | | md_SC04_024 | 26 | 0 | 0 | 28 | 28 | 100.0% | -| md_SC04_025 | 27 | 0 | 0 | 29 | 29 | 100.0% | -| md_SC04_026 | 39 | 0 | 0 | 41 | 41 | 100.0% | +| md_SC04_025 | 27 | 4 | 0 | 29 | 29 | 100.0% | +| md_SC04_026 | 39 | 4 | 0 | 41 | 41 | 100.0% | | md_SC04_027 | 64 | 0 | 0 | 66 | 66 | 100.0% | | md_SC04_028 | 33 | 0 | 0 | 35 | 35 | 100.0% | -| md_SC04_029 | 25 | 0 | 0 | 27 | 27 | 100.0% | -| md_SC04_030 | 27 | 0 | 0 | 31 | 31 | 100.0% | -| md_SC05_023 | 26 | 0 | 0 | 28 | 28 | 100.0% | -| md_SC05_024 | 27 | 0 | 0 | 29 | 29 | 100.0% | -| md_SC05_025 | 39 | 0 | 0 | 41 | 41 | 100.0% | +| md_SC04_029 | 25 | 3 | 0 | 27 | 27 | 100.0% | +| md_SC04_030 | 27 | 3 | 0 | 31 | 31 | 100.0% | +| md_SC05_023 | 26 | 3 | 0 | 28 | 28 | 100.0% | +| md_SC05_024 | 27 | 4 | 0 | 29 | 29 | 100.0% | +| md_SC05_025 | 39 | 4 | 0 | 41 | 41 | 100.0% | | md_SC05_026 | 64 | 0 | 0 | 66 | 66 | 100.0% | | md_SC05_027 | 33 | 0 | 0 | 35 | 35 | 100.0% | -| md_SC05_028 | 25 | 0 | 0 | 27 | 27 | 100.0% | -| md_SC05_029 | 27 | 0 | 0 | 31 | 31 | 100.0% | +| md_SC05_028 | 25 | 3 | 0 | 27 | 27 | 100.0% | +| md_SC05_029 | 27 | 3 | 0 | 31 | 31 | 100.0% | | md_SC07_003 | 100 | 0 | 0 | 100 | 100 | 100.0% | | md_SC07_004 | 315 | 0 | 0 | 315 | 315 | 100.0% | -| ov_MAIN_012 | 2323 | 1693 | 0 | 2402 | 2402 | 100.0% | -| ov_SC01_000 | 2403 | 1814 | 0 | 2403 | 2403 | 100.0% | -| ov_SC01_001 | 2464 | 1816 | 0 | 2466 | 2466 | 100.0% | -| ov_SC01_004 | 2413 | 1807 | 0 | 2414 | 2414 | 100.0% | -| ov_SC01_005 | 2503 | 1838 | 0 | 2503 | 2503 | 100.0% | -| ov_SC01_006 | 2503 | 1838 | 0 | 2503 | 2503 | 100.0% | -| ov_SC01_008 | 2424 | 1808 | 0 | 2426 | 2426 | 100.0% | -| ov_SC01_009 | 2506 | 1808 | 0 | 2507 | 2507 | 100.0% | -| ov_SC01_074 | 2424 | 1808 | 0 | 2426 | 2426 | 100.0% | -| ov_SC01_077 | 2584 | 1769 | 0 | 2586 | 2586 | 100.0% | -| ov_SC01_080 | 2512 | 1813 | 0 | 2512 | 2512 | 100.0% | -| ov_SC01_084 | 2574 | 1824 | 0 | 2579 | 2579 | 100.0% | -| ov_SC02_000 | 2683 | 1902 | 0 | 2683 | 2683 | 100.0% | -| ov_SC02_003 | 2683 | 1902 | 0 | 2683 | 2683 | 100.0% | -| ov_SC02_004 | 2401 | 1813 | 0 | 2401 | 2401 | 100.0% | -| ov_SC02_005 | 2916 | 1807 | 0 | 2926 | 2926 | 100.0% | -| ov_SC02_011 | 2883 | 1815 | 0 | 2893 | 2893 | 100.0% | -| ov_SC02_015 | 2414 | 1819 | 0 | 2414 | 2414 | 100.0% | -| ov_SC02_016 | 2542 | 1815 | 0 | 2545 | 2545 | 100.0% | -| ov_SC02_017 | 2724 | 1815 | 0 | 2732 | 2732 | 100.0% | -| ov_SC02_021 | 2437 | 1819 | 0 | 2437 | 2437 | 100.0% | -| ov_SC02_026 | 2566 | 1812 | 0 | 2572 | 2572 | 100.0% | -| ov_SC02_027 | 2683 | 1833 | 0 | 2692 | 2692 | 100.0% | -| ov_SC02_028 | 2691 | 1832 | 0 | 2701 | 2701 | 100.0% | -| ov_SC02_031 | 2557 | 1814 | 0 | 2562 | 2562 | 100.0% | -| ov_SC02_035 | 2517 | 1811 | 0 | 2520 | 2520 | 100.0% | -| ov_SC02_037 | 2434 | 1708 | 0 | 2516 | 2516 | 100.0% | -| ov_SC02_039 | 2416 | 1819 | 0 | 2416 | 2416 | 100.0% | -| ov_SC02_041 | 2558 | 1811 | 0 | 2561 | 2561 | 100.0% | -| ov_SC03_001 | 2852 | 1812 | 0 | 2869 | 2869 | 100.0% | -| ov_SC03_002 | 2616 | 1820 | 0 | 2631 | 2631 | 100.0% | -| ov_SC03_003 | 2422 | 1811 | 0 | 2423 | 2423 | 100.0% | -| ov_SC03_006 | 2758 | 1819 | 0 | 2767 | 2767 | 100.0% | -| ov_SC03_007 | 2619 | 1813 | 0 | 2623 | 2623 | 100.0% | -| ov_SC03_010 | 2471 | 1812 | 0 | 2471 | 2471 | 100.0% | -| ov_SC03_011 | 2521 | 1812 | 0 | 2527 | 2527 | 100.0% | -| ov_SC03_012 | 2405 | 1813 | 0 | 2406 | 2406 | 100.0% | -| ov_SC03_013 | 2493 | 1812 | 0 | 2493 | 2493 | 100.0% | -| ov_SC03_014 | 2685 | 1879 | 0 | 2685 | 2685 | 100.0% | -| ov_SC03_015 | 2468 | 1879 | 0 | 2468 | 2468 | 100.0% | -| ov_SC03_023 | 2434 | 1813 | 0 | 2435 | 2435 | 100.0% | -| ov_SC03_024 | 2634 | 1837 | 0 | 2641 | 2641 | 100.0% | -| ov_SC03_028 | 2660 | 1816 | 0 | 2664 | 2664 | 100.0% | -| ov_SC03_029 | 2634 | 1815 | 0 | 2644 | 2644 | 100.0% | -| ov_SC03_030 | 2493 | 1816 | 0 | 2495 | 2495 | 100.0% | -| ov_SC03_031 | 2511 | 1813 | 0 | 2514 | 2514 | 100.0% | -| ov_SC03_089 | 2574 | 1824 | 0 | 2581 | 2581 | 100.0% | -| ov_SC03_090 | 2617 | 1824 | 0 | 2625 | 2625 | 100.0% | -| ov_SC03_091 | 2632 | 1833 | 0 | 2640 | 2640 | 100.0% | -| ov_SC03_092 | 2576 | 1824 | 0 | 2588 | 2588 | 100.0% | -| ov_SC03_093 | 2560 | 1834 | 0 | 2563 | 2563 | 100.0% | -| ov_SC03_094 | 2571 | 1811 | 0 | 2577 | 2577 | 100.0% | -| ov_SC03_095 | 2471 | 1811 | 0 | 2474 | 2474 | 100.0% | -| ov_SC03_096 | 2462 | 1811 | 0 | 2465 | 2465 | 100.0% | -| ov_SC03_097 | 2596 | 1832 | 0 | 2603 | 2603 | 100.0% | -| ov_SC03_098 | 2538 | 1833 | 0 | 2541 | 2541 | 100.0% | -| ov_SC03_099 | 2501 | 1811 | 0 | 2504 | 2504 | 100.0% | -| ov_SC03_100 | 2535 | 1833 | 0 | 2539 | 2539 | 100.0% | -| ov_SC03_101 | 2524 | 1824 | 0 | 2528 | 2528 | 100.0% | -| ov_SC03_102 | 2489 | 1811 | 0 | 2492 | 2492 | 100.0% | -| ov_SC03_103 | 2507 | 1813 | 0 | 2510 | 2510 | 100.0% | -| ov_SC03_104 | 2609 | 1824 | 0 | 2616 | 2616 | 100.0% | -| ov_SC03_105 | 2590 | 1816 | 0 | 2597 | 2597 | 100.0% | -| ov_SC03_107 | 2414 | 1693 | 0 | 2497 | 2497 | 100.0% | -| ov_SC03_108 | 2443 | 1819 | 0 | 2443 | 2443 | 100.0% | -| ov_SC03_109 | 2422 | 1812 | 0 | 2424 | 2424 | 100.0% | -| ov_SC03_110 | 2468 | 1835 | 0 | 2468 | 2468 | 100.0% | -| ov_SC03_111 | 2507 | 1811 | 0 | 2510 | 2510 | 100.0% | -| ov_SC03_112 | 2524 | 1813 | 0 | 2526 | 2526 | 100.0% | -| ov_SC03_113 | 2465 | 1813 | 0 | 2468 | 2468 | 100.0% | -| ov_SC03_114 | 2413 | 1812 | 0 | 2415 | 2415 | 100.0% | -| ov_SC03_115 | 2470 | 1812 | 0 | 2472 | 2472 | 100.0% | -| ov_SC03_116 | 2435 | 1811 | 0 | 2438 | 2438 | 100.0% | -| ov_SC03_117 | 2551 | 1811 | 0 | 2557 | 2557 | 100.0% | -| ov_SC03_118 | 2683 | 1869 | 0 | 2684 | 2684 | 100.0% | -| ov_SC03_119 | 2684 | 1869 | 0 | 2685 | 2685 | 100.0% | -| ov_SC03_121 | 2457 | 1812 | 0 | 2459 | 2459 | 100.0% | -| ov_SC03_124 | 2721 | 1807 | 0 | 2741 | 2741 | 100.0% | -| ov_SC03_125 | 2576 | 1820 | 0 | 2588 | 2588 | 100.0% | -| ov_SC03_126 | 2423 | 1815 | 0 | 2423 | 2423 | 100.0% | -| ov_SC04_000 | 2537 | 1816 | 0 | 2546 | 2546 | 100.0% | -| ov_SC04_002 | 2632 | 1811 | 0 | 2636 | 2636 | 100.0% | -| ov_SC04_003 | 2499 | 1818 | 0 | 2502 | 2502 | 100.0% | -| ov_SC04_004 | 2556 | 1812 | 0 | 2558 | 2558 | 100.0% | -| ov_SC04_005 | 2606 | 1811 | 0 | 2612 | 2612 | 100.0% | -| ov_SC04_006 | 2452 | 1817 | 0 | 2454 | 2454 | 100.0% | -| ov_SC04_007 | 2565 | 1812 | 0 | 2569 | 2569 | 100.0% | -| ov_SC04_008 | 2415 | 1811 | 0 | 2415 | 2415 | 100.0% | -| ov_SC04_009 | 2438 | 1811 | 0 | 2441 | 2441 | 100.0% | -| ov_SC04_010 | 2418 | 1811 | 0 | 2419 | 2419 | 100.0% | -| ov_SC04_011 | 2798 | 1824 | 0 | 2804 | 2804 | 100.0% | -| ov_SC04_012 | 2419 | 1811 | 0 | 2420 | 2420 | 100.0% | -| ov_SC04_015 | 2600 | 1812 | 0 | 2611 | 2611 | 100.0% | -| ov_SC04_016 | 2438 | 1812 | 0 | 2440 | 2440 | 100.0% | -| ov_SC04_018 | 2857 | 1896 | 0 | 2857 | 2857 | 100.0% | -| ov_SC04_019 | 2857 | 1899 | 0 | 2857 | 2857 | 100.0% | -| ov_SC04_020 | 2555 | 1820 | 0 | 2567 | 2567 | 100.0% | -| ov_SC04_021 | 2423 | 1815 | 0 | 2423 | 2423 | 100.0% | -| ov_SC05_000 | 2419 | 1815 | 0 | 2422 | 2422 | 100.0% | -| ov_SC05_001 | 2569 | 1813 | 0 | 2574 | 2574 | 100.0% | -| ov_SC05_002 | 2439 | 1811 | 0 | 2442 | 2442 | 100.0% | -| ov_SC05_003 | 2480 | 1811 | 0 | 2481 | 2481 | 100.0% | -| ov_SC05_004 | 2462 | 1811 | 0 | 2464 | 2464 | 100.0% | -| ov_SC05_005 | 2490 | 1825 | 0 | 2491 | 2491 | 100.0% | -| ov_SC05_006 | 2430 | 1813 | 0 | 2430 | 2430 | 100.0% | -| ov_SC05_007 | 2477 | 1812 | 0 | 2482 | 2482 | 100.0% | -| ov_SC05_008 | 2541 | 1812 | 0 | 2543 | 2543 | 100.0% | -| ov_SC05_009 | 2434 | 1811 | 0 | 2438 | 2438 | 100.0% | -| ov_SC05_010 | 2584 | 1816 | 0 | 2588 | 2588 | 100.0% | -| ov_SC05_011 | 2408 | 1812 | 0 | 2409 | 2409 | 100.0% | -| ov_SC05_017 | 2831 | 1811 | 0 | 2842 | 2842 | 100.0% | -| ov_SC05_018 | 2660 | 1819 | 0 | 2673 | 2673 | 100.0% | -| ov_SC05_019 | 2423 | 1815 | 0 | 2423 | 2423 | 100.0% | -| ov_SC06_000 | 2688 | 1841 | 0 | 2691 | 2691 | 100.0% | -| ov_SC06_006 | 2510 | 1813 | 0 | 2511 | 2511 | 100.0% | -| ov_SC06_008 | 2536 | 1813 | 0 | 2542 | 2542 | 100.0% | -| ov_SC06_010 | 2512 | 1811 | 0 | 2517 | 2517 | 100.0% | -| ov_SC06_011 | 2464 | 1811 | 0 | 2468 | 2468 | 100.0% | -| ov_SC06_013 | 2424 | 1811 | 0 | 2425 | 2425 | 100.0% | -| ov_SC06_014 | 2451 | 1811 | 0 | 2453 | 2453 | 100.0% | -| ov_SC06_015 | 2421 | 1811 | 0 | 2421 | 2421 | 100.0% | -| ov_SC06_016 | 2547 | 1816 | 0 | 2549 | 2549 | 100.0% | -| ov_SC06_018 | 2658 | 1812 | 0 | 2665 | 2665 | 100.0% | -| ov_SC06_020 | 2517 | 1813 | 0 | 2518 | 2518 | 100.0% | -| ov_SC06_022 | 2634 | 1811 | 0 | 2642 | 2642 | 100.0% | -| ov_SC06_024 | 2661 | 1811 | 0 | 2667 | 2667 | 100.0% | -| ov_SC06_025 | 2567 | 1811 | 0 | 2572 | 2572 | 100.0% | -| ov_SC06_027 | 2407 | 1811 | 0 | 2408 | 2408 | 100.0% | -| ov_SC06_029 | 2651 | 1816 | 0 | 2663 | 2663 | 100.0% | -| ov_SC06_030 | 2456 | 1816 | 0 | 2456 | 2456 | 100.0% | -| ov_SC06_032 | 2651 | 1812 | 0 | 2658 | 2658 | 100.0% | -| ov_SC06_033 | 2623 | 1812 | 0 | 2630 | 2630 | 100.0% | -| ov_SC07_000 | 2519 | 1816 | 0 | 2521 | 2521 | 100.0% | -| ov_SC07_001 | 2452 | 1812 | 0 | 2454 | 2454 | 100.0% | -| ov_SC07_002 | 2575 | 1816 | 0 | 2579 | 2579 | 100.0% | -| ov_SC07_006 | 2378 | 1630 | 0 | 2458 | 2458 | 100.0% | -| ov_SC07_007 | 2530 | 1666 | 0 | 2613 | 2613 | 100.0% | -| ov_SC07_008 | 2386 | 1812 | 0 | 2386 | 2386 | 100.0% | -| ov_SC07_009 | 2428 | 1811 | 0 | 2430 | 2430 | 100.0% | -| ov_SC07_010 | 2442 | 1689 | 0 | 2524 | 2524 | 100.0% | -| ov_SC07_011 | 2369 | 1664 | 0 | 2449 | 2449 | 100.0% | +| ov_MAIN_012 | 2323 | 1720 | 0 | 2402 | 2402 | 100.0% | +| ov_SC01_000 | 2324 | 1747 | 0 | 2403 | 2403 | 100.0% | +| ov_SC01_001 | 2385 | 1749 | 0 | 2466 | 2466 | 100.0% | +| ov_SC01_004 | 2340 | 1748 | 0 | 2416 | 2416 | 100.0% | +| ov_SC01_005 | 2421 | 1767 | 0 | 2503 | 2503 | 100.0% | +| ov_SC01_006 | 2421 | 1767 | 0 | 2503 | 2503 | 100.0% | +| ov_SC01_008 | 2351 | 1749 | 0 | 2428 | 2428 | 100.0% | +| ov_SC01_009 | 2433 | 1749 | 0 | 2509 | 2509 | 100.0% | +| ov_SC01_074 | 2351 | 1749 | 0 | 2428 | 2428 | 100.0% | +| ov_SC01_077 | 2505 | 1748 | 0 | 2586 | 2586 | 100.0% | +| ov_SC01_080 | 2435 | 1752 | 0 | 2514 | 2514 | 100.0% | +| ov_SC01_084 | 2497 | 1761 | 0 | 2581 | 2581 | 100.0% | +| ov_SC02_000 | 2597 | 1830 | 0 | 2683 | 2683 | 100.0% | +| ov_SC02_003 | 2597 | 1830 | 0 | 2683 | 2683 | 100.0% | +| ov_SC02_004 | 2324 | 1752 | 0 | 2403 | 2403 | 100.0% | +| ov_SC02_005 | 2843 | 1748 | 0 | 2928 | 2928 | 100.0% | +| ov_SC02_011 | 2804 | 1750 | 0 | 2895 | 2895 | 100.0% | +| ov_SC02_015 | 2337 | 1756 | 0 | 2416 | 2416 | 100.0% | +| ov_SC02_016 | 2465 | 1764 | 0 | 2547 | 2547 | 100.0% | +| ov_SC02_017 | 2647 | 1764 | 0 | 2734 | 2734 | 100.0% | +| ov_SC02_021 | 2360 | 1756 | 0 | 2439 | 2439 | 100.0% | +| ov_SC02_026 | 2489 | 1750 | 0 | 2574 | 2574 | 100.0% | +| ov_SC02_027 | 2606 | 1770 | 0 | 2694 | 2694 | 100.0% | +| ov_SC02_028 | 2614 | 1769 | 0 | 2703 | 2703 | 100.0% | +| ov_SC02_031 | 2479 | 1764 | 0 | 2564 | 2564 | 100.0% | +| ov_SC02_035 | 2440 | 1750 | 0 | 2522 | 2522 | 100.0% | +| ov_SC02_037 | 2434 | 1741 | 0 | 2516 | 2516 | 100.0% | +| ov_SC02_039 | 2339 | 1756 | 0 | 2418 | 2418 | 100.0% | +| ov_SC02_041 | 2481 | 1750 | 0 | 2563 | 2563 | 100.0% | +| ov_SC03_001 | 2776 | 1750 | 0 | 2869 | 2869 | 100.0% | +| ov_SC03_002 | 2536 | 1753 | 0 | 2631 | 2631 | 100.0% | +| ov_SC03_003 | 2345 | 1756 | 0 | 2425 | 2425 | 100.0% | +| ov_SC03_006 | 2679 | 1764 | 0 | 2767 | 2767 | 100.0% | +| ov_SC03_007 | 2542 | 1752 | 0 | 2625 | 2625 | 100.0% | +| ov_SC03_010 | 2394 | 1759 | 0 | 2473 | 2473 | 100.0% | +| ov_SC03_011 | 2444 | 1757 | 0 | 2529 | 2529 | 100.0% | +| ov_SC03_012 | 2328 | 1752 | 0 | 2408 | 2408 | 100.0% | +| ov_SC03_013 | 2416 | 1759 | 0 | 2495 | 2495 | 100.0% | +| ov_SC03_014 | 2598 | 1808 | 0 | 2687 | 2687 | 100.0% | +| ov_SC03_015 | 2598 | 1808 | 0 | 2687 | 2687 | 100.0% | +| ov_SC03_023 | 2357 | 1752 | 0 | 2437 | 2437 | 100.0% | +| ov_SC03_024 | 2552 | 1771 | 0 | 2643 | 2643 | 100.0% | +| ov_SC03_028 | 2583 | 1754 | 0 | 2666 | 2666 | 100.0% | +| ov_SC03_029 | 2557 | 1764 | 0 | 2646 | 2646 | 100.0% | +| ov_SC03_030 | 2416 | 1754 | 0 | 2497 | 2497 | 100.0% | +| ov_SC03_031 | 2434 | 1764 | 0 | 2516 | 2516 | 100.0% | +| ov_SC03_089 | 2497 | 1761 | 0 | 2583 | 2583 | 100.0% | +| ov_SC03_090 | 2540 | 1761 | 0 | 2627 | 2627 | 100.0% | +| ov_SC03_091 | 2555 | 1770 | 0 | 2642 | 2642 | 100.0% | +| ov_SC03_092 | 2499 | 1763 | 0 | 2590 | 2590 | 100.0% | +| ov_SC03_093 | 2482 | 1770 | 0 | 2565 | 2565 | 100.0% | +| ov_SC03_094 | 2494 | 1748 | 0 | 2579 | 2579 | 100.0% | +| ov_SC03_095 | 2394 | 1750 | 0 | 2476 | 2476 | 100.0% | +| ov_SC03_096 | 2385 | 1750 | 0 | 2467 | 2467 | 100.0% | +| ov_SC03_097 | 2519 | 1769 | 0 | 2605 | 2605 | 100.0% | +| ov_SC03_098 | 2461 | 1770 | 0 | 2543 | 2543 | 100.0% | +| ov_SC03_099 | 2424 | 1750 | 0 | 2506 | 2506 | 100.0% | +| ov_SC03_100 | 2458 | 1770 | 0 | 2541 | 2541 | 100.0% | +| ov_SC03_101 | 2447 | 1761 | 0 | 2530 | 2530 | 100.0% | +| ov_SC03_102 | 2412 | 1748 | 0 | 2494 | 2494 | 100.0% | +| ov_SC03_103 | 2430 | 1750 | 0 | 2512 | 2512 | 100.0% | +| ov_SC03_104 | 2532 | 1761 | 0 | 2618 | 2618 | 100.0% | +| ov_SC03_105 | 2513 | 1754 | 0 | 2599 | 2599 | 100.0% | +| ov_SC03_107 | 2414 | 1720 | 0 | 2497 | 2497 | 100.0% | +| ov_SC03_108 | 2366 | 1756 | 0 | 2445 | 2445 | 100.0% | +| ov_SC03_109 | 2345 | 1750 | 0 | 2426 | 2426 | 100.0% | +| ov_SC03_110 | 2391 | 1772 | 0 | 2470 | 2470 | 100.0% | +| ov_SC03_111 | 2430 | 1748 | 0 | 2512 | 2512 | 100.0% | +| ov_SC03_112 | 2447 | 1750 | 0 | 2528 | 2528 | 100.0% | +| ov_SC03_113 | 2388 | 1750 | 0 | 2470 | 2470 | 100.0% | +| ov_SC03_114 | 2336 | 1751 | 0 | 2417 | 2417 | 100.0% | +| ov_SC03_115 | 2393 | 1751 | 0 | 2474 | 2474 | 100.0% | +| ov_SC03_116 | 2358 | 1748 | 0 | 2440 | 2440 | 100.0% | +| ov_SC03_117 | 2474 | 1748 | 0 | 2559 | 2559 | 100.0% | +| ov_SC03_118 | 2595 | 1796 | 0 | 2687 | 2687 | 100.0% | +| ov_SC03_119 | 2595 | 1796 | 0 | 2687 | 2687 | 100.0% | +| ov_SC03_121 | 2379 | 1749 | 0 | 2461 | 2461 | 100.0% | +| ov_SC03_124 | 2648 | 1750 | 0 | 2743 | 2743 | 100.0% | +| ov_SC03_125 | 2499 | 1758 | 0 | 2590 | 2590 | 100.0% | +| ov_SC03_126 | 2345 | 2252 | 0 | 2425 | 2425 | 100.0% | +| ov_SC04_000 | 2458 | 1761 | 0 | 2546 | 2546 | 100.0% | +| ov_SC04_002 | 2555 | 1763 | 0 | 2638 | 2638 | 100.0% | +| ov_SC04_003 | 2421 | 1754 | 0 | 2504 | 2504 | 100.0% | +| ov_SC04_004 | 2479 | 1763 | 0 | 2560 | 2560 | 100.0% | +| ov_SC04_005 | 2529 | 1763 | 0 | 2614 | 2614 | 100.0% | +| ov_SC04_006 | 2375 | 1754 | 0 | 2456 | 2456 | 100.0% | +| ov_SC04_007 | 2488 | 1763 | 0 | 2571 | 2571 | 100.0% | +| ov_SC04_008 | 2338 | 2031 | 0 | 2417 | 2417 | 100.0% | +| ov_SC04_009 | 2361 | 1748 | 0 | 2443 | 2443 | 100.0% | +| ov_SC04_010 | 2341 | 1749 | 0 | 2421 | 2421 | 100.0% | +| ov_SC04_011 | 2721 | 1761 | 0 | 2806 | 2806 | 100.0% | +| ov_SC04_012 | 2342 | 1748 | 0 | 2422 | 2422 | 100.0% | +| ov_SC04_015 | 2522 | 1748 | 0 | 2613 | 2613 | 100.0% | +| ov_SC04_016 | 2361 | 1752 | 0 | 2442 | 2442 | 100.0% | +| ov_SC04_018 | 2769 | 1825 | 0 | 2857 | 2857 | 100.0% | +| ov_SC04_019 | 2769 | 1825 | 0 | 2857 | 2857 | 100.0% | +| ov_SC04_020 | 2478 | 1758 | 0 | 2569 | 2569 | 100.0% | +| ov_SC04_021 | 2345 | 2253 | 0 | 2425 | 2425 | 100.0% | +| ov_SC05_000 | 2340 | 1749 | 0 | 2422 | 2422 | 100.0% | +| ov_SC05_001 | 2492 | 1764 | 0 | 2576 | 2576 | 100.0% | +| ov_SC05_002 | 2362 | 1750 | 0 | 2444 | 2444 | 100.0% | +| ov_SC05_003 | 2403 | 1750 | 0 | 2483 | 2483 | 100.0% | +| ov_SC05_004 | 2385 | 1749 | 0 | 2466 | 2466 | 100.0% | +| ov_SC05_005 | 2413 | 1764 | 0 | 2493 | 2493 | 100.0% | +| ov_SC05_006 | 2353 | 1762 | 0 | 2432 | 2432 | 100.0% | +| ov_SC05_007 | 2400 | 1751 | 0 | 2484 | 2484 | 100.0% | +| ov_SC05_008 | 2464 | 1749 | 0 | 2545 | 2545 | 100.0% | +| ov_SC05_009 | 2357 | 2030 | 0 | 2440 | 2440 | 100.0% | +| ov_SC05_010 | 2507 | 1754 | 0 | 2590 | 2590 | 100.0% | +| ov_SC05_011 | 2331 | 1752 | 0 | 2411 | 2411 | 100.0% | +| ov_SC05_017 | 2757 | 1753 | 0 | 2844 | 2844 | 100.0% | +| ov_SC05_018 | 2583 | 1757 | 0 | 2675 | 2675 | 100.0% | +| ov_SC05_019 | 2345 | 2253 | 0 | 2425 | 2425 | 100.0% | +| ov_SC06_000 | 2604 | 1771 | 0 | 2691 | 2691 | 100.0% | +| ov_SC06_006 | 2433 | 1750 | 0 | 2513 | 2513 | 100.0% | +| ov_SC06_008 | 2459 | 1750 | 0 | 2544 | 2544 | 100.0% | +| ov_SC06_010 | 2435 | 1748 | 0 | 2519 | 2519 | 100.0% | +| ov_SC06_011 | 2387 | 1748 | 0 | 2470 | 2470 | 100.0% | +| ov_SC06_013 | 2347 | 1748 | 0 | 2427 | 2427 | 100.0% | +| ov_SC06_014 | 2374 | 1750 | 0 | 2455 | 2455 | 100.0% | +| ov_SC06_015 | 2344 | 1750 | 0 | 2423 | 2423 | 100.0% | +| ov_SC06_016 | 2470 | 1754 | 0 | 2551 | 2551 | 100.0% | +| ov_SC06_018 | 2580 | 1750 | 0 | 2667 | 2667 | 100.0% | +| ov_SC06_020 | 2440 | 1754 | 0 | 2520 | 2520 | 100.0% | +| ov_SC06_022 | 2557 | 1748 | 0 | 2644 | 2644 | 100.0% | +| ov_SC06_024 | 2584 | 1748 | 0 | 2669 | 2669 | 100.0% | +| ov_SC06_025 | 2490 | 1748 | 0 | 2574 | 2574 | 100.0% | +| ov_SC06_027 | 2330 | 1748 | 0 | 2410 | 2410 | 100.0% | +| ov_SC06_029 | 2574 | 1754 | 0 | 2665 | 2665 | 100.0% | +| ov_SC06_030 | 2379 | 1754 | 0 | 2458 | 2458 | 100.0% | +| ov_SC06_032 | 2574 | 1753 | 0 | 2660 | 2660 | 100.0% | +| ov_SC06_033 | 2546 | 1751 | 0 | 2632 | 2632 | 100.0% | +| ov_SC07_000 | 2440 | 1750 | 0 | 2521 | 2521 | 100.0% | +| ov_SC07_001 | 2375 | 1750 | 0 | 2456 | 2456 | 100.0% | +| ov_SC07_002 | 2498 | 1754 | 0 | 2581 | 2581 | 100.0% | +| ov_SC07_006 | 2379 | 1714 | 0 | 2459 | 2459 | 100.0% | +| ov_SC07_007 | 2530 | 1728 | 0 | 2614 | 2614 | 100.0% | +| ov_SC07_008 | 2309 | 1749 | 0 | 2388 | 2388 | 100.0% | +| ov_SC07_009 | 2351 | 1748 | 0 | 2432 | 2432 | 100.0% | +| ov_SC07_010 | 2443 | 1739 | 0 | 2526 | 2526 | 100.0% | +| ov_SC07_011 | 2370 | 1727 | 0 | 2450 | 2450 | 100.0% | diff --git a/docs/progress.json b/docs/progress.json index 69fd7e7b79..c4a9c1578f 100644 --- a/docs/progress.json +++ b/docs/progress.json @@ -4,8 +4,8 @@ "binaries": 218, "fleet": { "fn_count": { - "matched": 363221, - "total": 363221, + "matched": 363680, + "total": 363680, "pct": 100.0, "what": "functions byte-identical / matchable, every binary (one shared body counts once per overlay it is instantiated in)" }, @@ -31,15 +31,15 @@ } }, "counts": { - "real_c_functions": 360744, - "dedup_shared_of_real": 255632, + "real_c_functions": 350533, + "dedup_shared_of_real": 249873, "linked_psyq_objects": 1256, "verbatim_asm_bodies": 5, "include_asm_stubs": 0, "non_matching": 0, - "matchable": 363221, - "dedup_groups": 2220, - "dedup_instances": 255708 + "matchable": 363680, + "dedup_groups": 3135, + "dedup_instances": 260543 }, "per_binary": [ { @@ -125,7 +125,7 @@ { "binary": "md_MAIN_013", "real": 16, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 16, "matchable": 16, @@ -135,7 +135,7 @@ { "binary": "md_MAIN_014", "real": 12, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 13, "matchable": 13, @@ -165,7 +165,7 @@ { "binary": "md_MAIN_017", "real": 10, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 10, "matchable": 10, @@ -185,7 +185,7 @@ { "binary": "md_MAIN_019", "real": 22, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 22, "matchable": 22, @@ -195,7 +195,7 @@ { "binary": "md_MAIN_020", "real": 13, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 14, "matchable": 14, @@ -205,7 +205,7 @@ { "binary": "md_MAIN_021", "real": 10, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 11, "matchable": 11, @@ -215,7 +215,7 @@ { "binary": "md_MAIN_022", "real": 31, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 33, "matchable": 33, @@ -235,7 +235,7 @@ { "binary": "md_MAIN_024", "real": 4, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 6, "matchable": 6, @@ -255,7 +255,7 @@ { "binary": "md_MAIN_026", "real": 24, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 24, "matchable": 24, @@ -265,7 +265,7 @@ { "binary": "md_MAIN_027", "real": 27, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 29, "matchable": 29, @@ -275,7 +275,7 @@ { "binary": "md_MAIN_028", "real": 22, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 22, "matchable": 22, @@ -295,7 +295,7 @@ { "binary": "md_MAIN_030", "real": 10, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 10, "matchable": 10, @@ -325,7 +325,7 @@ { "binary": "md_MAIN_033", "real": 19, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 19, "matchable": 19, @@ -345,7 +345,7 @@ { "binary": "md_MAIN_035", "real": 15, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 16, "matchable": 16, @@ -355,7 +355,7 @@ { "binary": "md_MAIN_036", "real": 27, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 28, "matchable": 28, @@ -375,7 +375,7 @@ { "binary": "md_MAIN_038", "real": 20, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 20, "matchable": 20, @@ -395,7 +395,7 @@ { "binary": "md_MAIN_040", "real": 19, - "shared": 0, + "shared": 1, "linked": 0, "byte_identical": 19, "matchable": 19, @@ -514,8 +514,8 @@ }, { "binary": "md_SC03_073", - "real": 28, - "shared": 10, + "real": 26, + "shared": 8, "linked": 0, "byte_identical": 28, "matchable": 28, @@ -524,8 +524,8 @@ }, { "binary": "md_SC03_074", - "real": 29, - "shared": 10, + "real": 27, + "shared": 8, "linked": 0, "byte_identical": 29, "matchable": 29, @@ -534,8 +534,8 @@ }, { "binary": "md_SC03_075", - "real": 41, - "shared": 10, + "real": 39, + "shared": 8, "linked": 0, "byte_identical": 41, "matchable": 41, @@ -564,8 +564,8 @@ }, { "binary": "md_SC03_078", - "real": 27, - "shared": 9, + "real": 25, + "shared": 7, "linked": 0, "byte_identical": 27, "matchable": 27, @@ -595,7 +595,7 @@ { "binary": "md_SC03_133", "real": 27, - "shared": 1, + "shared": 3, "linked": 0, "byte_identical": 29, "matchable": 29, @@ -605,7 +605,7 @@ { "binary": "md_SC03_134", "real": 39, - "shared": 1, + "shared": 3, "linked": 0, "byte_identical": 41, "matchable": 41, @@ -635,7 +635,7 @@ { "binary": "md_SC03_137", "real": 25, - "shared": 1, + "shared": 3, "linked": 0, "byte_identical": 27, "matchable": 27, @@ -645,7 +645,7 @@ { "binary": "md_SC03_138", "real": 33, - "shared": 1, + "shared": 3, "linked": 0, "byte_identical": 37, "matchable": 37, @@ -665,7 +665,7 @@ { "binary": "md_SC04_025", "real": 27, - "shared": 0, + "shared": 4, "linked": 0, "byte_identical": 29, "matchable": 29, @@ -675,7 +675,7 @@ { "binary": "md_SC04_026", "real": 39, - "shared": 0, + "shared": 4, "linked": 0, "byte_identical": 41, "matchable": 41, @@ -705,7 +705,7 @@ { "binary": "md_SC04_029", "real": 25, - "shared": 0, + "shared": 3, "linked": 0, "byte_identical": 27, "matchable": 27, @@ -715,7 +715,7 @@ { "binary": "md_SC04_030", "real": 27, - "shared": 0, + "shared": 3, "linked": 0, "byte_identical": 31, "matchable": 31, @@ -725,7 +725,7 @@ { "binary": "md_SC05_023", "real": 26, - "shared": 0, + "shared": 3, "linked": 0, "byte_identical": 28, "matchable": 28, @@ -735,7 +735,7 @@ { "binary": "md_SC05_024", "real": 27, - "shared": 0, + "shared": 4, "linked": 0, "byte_identical": 29, "matchable": 29, @@ -745,7 +745,7 @@ { "binary": "md_SC05_025", "real": 39, - "shared": 0, + "shared": 4, "linked": 0, "byte_identical": 41, "matchable": 41, @@ -775,7 +775,7 @@ { "binary": "md_SC05_028", "real": 25, - "shared": 0, + "shared": 3, "linked": 0, "byte_identical": 27, "matchable": 27, @@ -785,7 +785,7 @@ { "binary": "md_SC05_029", "real": 27, - "shared": 0, + "shared": 3, "linked": 0, "byte_identical": 31, "matchable": 31, @@ -815,7 +815,7 @@ { "binary": "ov_MAIN_012", "real": 2323, - "shared": 1693, + "shared": 1720, "linked": 0, "byte_identical": 2402, "matchable": 2402, @@ -824,8 +824,8 @@ }, { "binary": "ov_SC01_000", - "real": 2403, - "shared": 1814, + "real": 2324, + "shared": 1747, "linked": 0, "byte_identical": 2403, "matchable": 2403, @@ -834,8 +834,8 @@ }, { "binary": "ov_SC01_001", - "real": 2464, - "shared": 1816, + "real": 2385, + "shared": 1749, "linked": 0, "byte_identical": 2466, "matchable": 2466, @@ -844,18 +844,18 @@ }, { "binary": "ov_SC01_004", - "real": 2413, - "shared": 1807, + "real": 2340, + "shared": 1748, "linked": 0, - "byte_identical": 2414, - "matchable": 2414, + "byte_identical": 2416, + "matchable": 2416, "instr_matched": 89118, "instr_total": 89118 }, { "binary": "ov_SC01_005", - "real": 2503, - "shared": 1838, + "real": 2421, + "shared": 1767, "linked": 0, "byte_identical": 2503, "matchable": 2503, @@ -864,8 +864,8 @@ }, { "binary": "ov_SC01_006", - "real": 2503, - "shared": 1838, + "real": 2421, + "shared": 1767, "linked": 0, "byte_identical": 2503, "matchable": 2503, @@ -874,38 +874,38 @@ }, { "binary": "ov_SC01_008", - "real": 2424, - "shared": 1808, + "real": 2351, + "shared": 1749, "linked": 0, - "byte_identical": 2426, - "matchable": 2426, + "byte_identical": 2428, + "matchable": 2428, "instr_matched": 89467, "instr_total": 89467 }, { "binary": "ov_SC01_009", - "real": 2506, - "shared": 1808, + "real": 2433, + "shared": 1749, "linked": 0, - "byte_identical": 2507, - "matchable": 2507, + "byte_identical": 2509, + "matchable": 2509, "instr_matched": 92661, "instr_total": 92661 }, { "binary": "ov_SC01_074", - "real": 2424, - "shared": 1808, + "real": 2351, + "shared": 1749, "linked": 0, - "byte_identical": 2426, - "matchable": 2426, + "byte_identical": 2428, + "matchable": 2428, "instr_matched": 88341, "instr_total": 88341 }, { "binary": "ov_SC01_077", - "real": 2584, - "shared": 1769, + "real": 2505, + "shared": 1748, "linked": 0, "byte_identical": 2586, "matchable": 2586, @@ -914,28 +914,28 @@ }, { "binary": "ov_SC01_080", - "real": 2512, - "shared": 1813, + "real": 2435, + "shared": 1752, "linked": 0, - "byte_identical": 2512, - "matchable": 2512, + "byte_identical": 2514, + "matchable": 2514, "instr_matched": 93421, "instr_total": 93421 }, { "binary": "ov_SC01_084", - "real": 2574, - "shared": 1824, + "real": 2497, + "shared": 1761, "linked": 0, - "byte_identical": 2579, - "matchable": 2579, + "byte_identical": 2581, + "matchable": 2581, "instr_matched": 96682, "instr_total": 96682 }, { "binary": "ov_SC02_000", - "real": 2683, - "shared": 1902, + "real": 2597, + "shared": 1830, "linked": 0, "byte_identical": 2683, "matchable": 2683, @@ -944,8 +944,8 @@ }, { "binary": "ov_SC02_003", - "real": 2683, - "shared": 1902, + "real": 2597, + "shared": 1830, "linked": 0, "byte_identical": 2683, "matchable": 2683, @@ -954,128 +954,128 @@ }, { "binary": "ov_SC02_004", - "real": 2401, - "shared": 1813, + "real": 2324, + "shared": 1752, "linked": 0, - "byte_identical": 2401, - "matchable": 2401, + "byte_identical": 2403, + "matchable": 2403, "instr_matched": 87758, "instr_total": 87758 }, { "binary": "ov_SC02_005", - "real": 2916, - "shared": 1807, + "real": 2843, + "shared": 1748, "linked": 0, - "byte_identical": 2926, - "matchable": 2926, + "byte_identical": 2928, + "matchable": 2928, "instr_matched": 106959, "instr_total": 106959 }, { "binary": "ov_SC02_011", - "real": 2883, - "shared": 1815, + "real": 2804, + "shared": 1750, "linked": 0, - "byte_identical": 2893, - "matchable": 2893, + "byte_identical": 2895, + "matchable": 2895, "instr_matched": 107235, "instr_total": 107235 }, { "binary": "ov_SC02_015", - "real": 2414, - "shared": 1819, + "real": 2337, + "shared": 1756, "linked": 0, - "byte_identical": 2414, - "matchable": 2414, + "byte_identical": 2416, + "matchable": 2416, "instr_matched": 88104, "instr_total": 88104 }, { "binary": "ov_SC02_016", - "real": 2542, - "shared": 1815, + "real": 2465, + "shared": 1764, "linked": 0, - "byte_identical": 2545, - "matchable": 2545, + "byte_identical": 2547, + "matchable": 2547, "instr_matched": 94390, "instr_total": 94390 }, { "binary": "ov_SC02_017", - "real": 2724, - "shared": 1815, + "real": 2647, + "shared": 1764, "linked": 0, - "byte_identical": 2732, - "matchable": 2732, + "byte_identical": 2734, + "matchable": 2734, "instr_matched": 100556, "instr_total": 100556 }, { "binary": "ov_SC02_021", - "real": 2437, - "shared": 1819, + "real": 2360, + "shared": 1756, "linked": 0, - "byte_identical": 2437, - "matchable": 2437, + "byte_identical": 2439, + "matchable": 2439, "instr_matched": 89673, "instr_total": 89673 }, { "binary": "ov_SC02_026", - "real": 2566, - "shared": 1812, + "real": 2489, + "shared": 1750, "linked": 0, - "byte_identical": 2572, - "matchable": 2572, + "byte_identical": 2574, + "matchable": 2574, "instr_matched": 96222, "instr_total": 96222 }, { "binary": "ov_SC02_027", - "real": 2683, - "shared": 1833, + "real": 2606, + "shared": 1770, "linked": 0, - "byte_identical": 2692, - "matchable": 2692, + "byte_identical": 2694, + "matchable": 2694, "instr_matched": 101415, "instr_total": 101415 }, { "binary": "ov_SC02_028", - "real": 2691, - "shared": 1832, + "real": 2614, + "shared": 1769, "linked": 0, - "byte_identical": 2701, - "matchable": 2701, + "byte_identical": 2703, + "matchable": 2703, "instr_matched": 101544, "instr_total": 101544 }, { "binary": "ov_SC02_031", - "real": 2557, - "shared": 1814, + "real": 2479, + "shared": 1764, "linked": 0, - "byte_identical": 2562, - "matchable": 2562, + "byte_identical": 2564, + "matchable": 2564, "instr_matched": 94899, "instr_total": 94899 }, { "binary": "ov_SC02_035", - "real": 2517, - "shared": 1811, + "real": 2440, + "shared": 1750, "linked": 0, - "byte_identical": 2520, - "matchable": 2520, + "byte_identical": 2522, + "matchable": 2522, "instr_matched": 94411, "instr_total": 94411 }, { "binary": "ov_SC02_037", "real": 2434, - "shared": 1708, + "shared": 1741, "linked": 0, "byte_identical": 2516, "matchable": 2516, @@ -1084,28 +1084,28 @@ }, { "binary": "ov_SC02_039", - "real": 2416, - "shared": 1819, + "real": 2339, + "shared": 1756, "linked": 0, - "byte_identical": 2416, - "matchable": 2416, + "byte_identical": 2418, + "matchable": 2418, "instr_matched": 89046, "instr_total": 89046 }, { "binary": "ov_SC02_041", - "real": 2558, - "shared": 1811, + "real": 2481, + "shared": 1750, "linked": 0, - "byte_identical": 2561, - "matchable": 2561, + "byte_identical": 2563, + "matchable": 2563, "instr_matched": 94986, "instr_total": 94986 }, { "binary": "ov_SC03_001", - "real": 2852, - "shared": 1812, + "real": 2776, + "shared": 1750, "linked": 0, "byte_identical": 2869, "matchable": 2869, @@ -1114,8 +1114,8 @@ }, { "binary": "ov_SC03_002", - "real": 2616, - "shared": 1820, + "real": 2536, + "shared": 1753, "linked": 0, "byte_identical": 2631, "matchable": 2631, @@ -1124,18 +1124,18 @@ }, { "binary": "ov_SC03_003", - "real": 2422, - "shared": 1811, + "real": 2345, + "shared": 1756, "linked": 0, - "byte_identical": 2423, - "matchable": 2423, + "byte_identical": 2425, + "matchable": 2425, "instr_matched": 89160, "instr_total": 89160 }, { "binary": "ov_SC03_006", - "real": 2758, - "shared": 1819, + "real": 2679, + "shared": 1764, "linked": 0, "byte_identical": 2767, "matchable": 2767, @@ -1144,308 +1144,308 @@ }, { "binary": "ov_SC03_007", - "real": 2619, - "shared": 1813, + "real": 2542, + "shared": 1752, "linked": 0, - "byte_identical": 2623, - "matchable": 2623, + "byte_identical": 2625, + "matchable": 2625, "instr_matched": 97421, "instr_total": 97421 }, { "binary": "ov_SC03_010", - "real": 2471, - "shared": 1812, + "real": 2394, + "shared": 1759, "linked": 0, - "byte_identical": 2471, - "matchable": 2471, + "byte_identical": 2473, + "matchable": 2473, "instr_matched": 89941, "instr_total": 89941 }, { "binary": "ov_SC03_011", - "real": 2521, - "shared": 1812, + "real": 2444, + "shared": 1757, "linked": 0, - "byte_identical": 2527, - "matchable": 2527, + "byte_identical": 2529, + "matchable": 2529, "instr_matched": 91185, "instr_total": 91185 }, { "binary": "ov_SC03_012", - "real": 2405, - "shared": 1813, + "real": 2328, + "shared": 1752, "linked": 0, - "byte_identical": 2406, - "matchable": 2406, + "byte_identical": 2408, + "matchable": 2408, "instr_matched": 88041, "instr_total": 88041 }, { "binary": "ov_SC03_013", - "real": 2493, - "shared": 1812, + "real": 2416, + "shared": 1759, "linked": 0, - "byte_identical": 2493, - "matchable": 2493, + "byte_identical": 2495, + "matchable": 2495, "instr_matched": 90979, "instr_total": 90979 }, { "binary": "ov_SC03_014", - "real": 2685, - "shared": 1879, + "real": 2598, + "shared": 1808, "linked": 0, - "byte_identical": 2685, - "matchable": 2685, + "byte_identical": 2687, + "matchable": 2687, "instr_matched": 101618, "instr_total": 101618 }, { "binary": "ov_SC03_015", - "real": 2468, - "shared": 1879, + "real": 2598, + "shared": 1808, "linked": 0, - "byte_identical": 2468, - "matchable": 2468, + "byte_identical": 2687, + "matchable": 2687, "instr_matched": 101618, "instr_total": 101618 }, { "binary": "ov_SC03_023", - "real": 2434, - "shared": 1813, + "real": 2357, + "shared": 1752, "linked": 0, - "byte_identical": 2435, - "matchable": 2435, + "byte_identical": 2437, + "matchable": 2437, "instr_matched": 88913, "instr_total": 88913 }, { "binary": "ov_SC03_024", - "real": 2634, - "shared": 1837, + "real": 2552, + "shared": 1771, "linked": 0, - "byte_identical": 2641, - "matchable": 2641, + "byte_identical": 2643, + "matchable": 2643, "instr_matched": 97114, "instr_total": 97114 }, { "binary": "ov_SC03_028", - "real": 2660, - "shared": 1816, + "real": 2583, + "shared": 1754, "linked": 0, - "byte_identical": 2664, - "matchable": 2664, + "byte_identical": 2666, + "matchable": 2666, "instr_matched": 101901, "instr_total": 101901 }, { "binary": "ov_SC03_029", - "real": 2634, - "shared": 1815, + "real": 2557, + "shared": 1764, "linked": 0, - "byte_identical": 2644, - "matchable": 2644, + "byte_identical": 2646, + "matchable": 2646, "instr_matched": 97691, "instr_total": 97691 }, { "binary": "ov_SC03_030", - "real": 2493, - "shared": 1816, + "real": 2416, + "shared": 1754, "linked": 0, - "byte_identical": 2495, - "matchable": 2495, + "byte_identical": 2497, + "matchable": 2497, "instr_matched": 91946, "instr_total": 91946 }, { "binary": "ov_SC03_031", - "real": 2511, - "shared": 1813, + "real": 2434, + "shared": 1764, "linked": 0, - "byte_identical": 2514, - "matchable": 2514, + "byte_identical": 2516, + "matchable": 2516, "instr_matched": 92273, "instr_total": 92273 }, { "binary": "ov_SC03_089", - "real": 2574, - "shared": 1824, + "real": 2497, + "shared": 1761, "linked": 0, - "byte_identical": 2581, - "matchable": 2581, + "byte_identical": 2583, + "matchable": 2583, "instr_matched": 99632, "instr_total": 99632 }, { "binary": "ov_SC03_090", - "real": 2617, - "shared": 1824, + "real": 2540, + "shared": 1761, "linked": 0, - "byte_identical": 2625, - "matchable": 2625, + "byte_identical": 2627, + "matchable": 2627, "instr_matched": 101945, "instr_total": 101945 }, { "binary": "ov_SC03_091", - "real": 2632, - "shared": 1833, + "real": 2555, + "shared": 1770, "linked": 0, - "byte_identical": 2640, - "matchable": 2640, + "byte_identical": 2642, + "matchable": 2642, "instr_matched": 102883, "instr_total": 102883 }, { "binary": "ov_SC03_092", - "real": 2576, - "shared": 1824, + "real": 2499, + "shared": 1763, "linked": 0, - "byte_identical": 2588, - "matchable": 2588, + "byte_identical": 2590, + "matchable": 2590, "instr_matched": 94935, "instr_total": 94935 }, { "binary": "ov_SC03_093", - "real": 2560, - "shared": 1834, + "real": 2482, + "shared": 1770, "linked": 0, - "byte_identical": 2563, - "matchable": 2563, + "byte_identical": 2565, + "matchable": 2565, "instr_matched": 96077, "instr_total": 96077 }, { "binary": "ov_SC03_094", - "real": 2571, - "shared": 1811, + "real": 2494, + "shared": 1748, "linked": 0, - "byte_identical": 2577, - "matchable": 2577, + "byte_identical": 2579, + "matchable": 2579, "instr_matched": 97740, "instr_total": 97740 }, { "binary": "ov_SC03_095", - "real": 2471, - "shared": 1811, + "real": 2394, + "shared": 1750, "linked": 0, - "byte_identical": 2474, - "matchable": 2474, + "byte_identical": 2476, + "matchable": 2476, "instr_matched": 90980, "instr_total": 90980 }, { "binary": "ov_SC03_096", - "real": 2462, - "shared": 1811, + "real": 2385, + "shared": 1750, "linked": 0, - "byte_identical": 2465, - "matchable": 2465, + "byte_identical": 2467, + "matchable": 2467, "instr_matched": 90692, "instr_total": 90692 }, { "binary": "ov_SC03_097", - "real": 2596, - "shared": 1832, + "real": 2519, + "shared": 1769, "linked": 0, - "byte_identical": 2603, - "matchable": 2603, + "byte_identical": 2605, + "matchable": 2605, "instr_matched": 96060, "instr_total": 96060 }, { "binary": "ov_SC03_098", - "real": 2538, - "shared": 1833, + "real": 2461, + "shared": 1770, "linked": 0, - "byte_identical": 2541, - "matchable": 2541, + "byte_identical": 2543, + "matchable": 2543, "instr_matched": 95327, "instr_total": 95327 }, { "binary": "ov_SC03_099", - "real": 2501, - "shared": 1811, + "real": 2424, + "shared": 1750, "linked": 0, - "byte_identical": 2504, - "matchable": 2504, + "byte_identical": 2506, + "matchable": 2506, "instr_matched": 93343, "instr_total": 93343 }, { "binary": "ov_SC03_100", - "real": 2535, - "shared": 1833, + "real": 2458, + "shared": 1770, "linked": 0, - "byte_identical": 2539, - "matchable": 2539, + "byte_identical": 2541, + "matchable": 2541, "instr_matched": 94674, "instr_total": 94674 }, { "binary": "ov_SC03_101", - "real": 2524, - "shared": 1824, + "real": 2447, + "shared": 1761, "linked": 0, - "byte_identical": 2528, - "matchable": 2528, + "byte_identical": 2530, + "matchable": 2530, "instr_matched": 93641, "instr_total": 93641 }, { "binary": "ov_SC03_102", - "real": 2489, - "shared": 1811, + "real": 2412, + "shared": 1748, "linked": 0, - "byte_identical": 2492, - "matchable": 2492, + "byte_identical": 2494, + "matchable": 2494, "instr_matched": 96247, "instr_total": 96247 }, { "binary": "ov_SC03_103", - "real": 2507, - "shared": 1813, + "real": 2430, + "shared": 1750, "linked": 0, - "byte_identical": 2510, - "matchable": 2510, + "byte_identical": 2512, + "matchable": 2512, "instr_matched": 94179, "instr_total": 94179 }, { "binary": "ov_SC03_104", - "real": 2609, - "shared": 1824, + "real": 2532, + "shared": 1761, "linked": 0, - "byte_identical": 2616, - "matchable": 2616, + "byte_identical": 2618, + "matchable": 2618, "instr_matched": 101063, "instr_total": 101063 }, { "binary": "ov_SC03_105", - "real": 2590, - "shared": 1816, + "real": 2513, + "shared": 1754, "linked": 0, - "byte_identical": 2597, - "matchable": 2597, + "byte_identical": 2599, + "matchable": 2599, "instr_matched": 100457, "instr_total": 100457 }, { "binary": "ov_SC03_107", "real": 2414, - "shared": 1693, + "shared": 1720, "linked": 0, "byte_identical": 2497, "matchable": 2497, @@ -1454,168 +1454,168 @@ }, { "binary": "ov_SC03_108", - "real": 2443, - "shared": 1819, + "real": 2366, + "shared": 1756, "linked": 0, - "byte_identical": 2443, - "matchable": 2443, + "byte_identical": 2445, + "matchable": 2445, "instr_matched": 90815, "instr_total": 90815 }, { "binary": "ov_SC03_109", - "real": 2422, - "shared": 1812, + "real": 2345, + "shared": 1750, "linked": 0, - "byte_identical": 2424, - "matchable": 2424, + "byte_identical": 2426, + "matchable": 2426, "instr_matched": 88170, "instr_total": 88170 }, { "binary": "ov_SC03_110", - "real": 2468, - "shared": 1835, + "real": 2391, + "shared": 1772, "linked": 0, - "byte_identical": 2468, - "matchable": 2468, + "byte_identical": 2470, + "matchable": 2470, "instr_matched": 91890, "instr_total": 91890 }, { "binary": "ov_SC03_111", - "real": 2507, - "shared": 1811, + "real": 2430, + "shared": 1748, "linked": 0, - "byte_identical": 2510, - "matchable": 2510, + "byte_identical": 2512, + "matchable": 2512, "instr_matched": 94687, "instr_total": 94687 }, { "binary": "ov_SC03_112", - "real": 2524, - "shared": 1813, + "real": 2447, + "shared": 1750, "linked": 0, - "byte_identical": 2526, - "matchable": 2526, + "byte_identical": 2528, + "matchable": 2528, "instr_matched": 95585, "instr_total": 95585 }, { "binary": "ov_SC03_113", - "real": 2465, - "shared": 1813, + "real": 2388, + "shared": 1750, "linked": 0, - "byte_identical": 2468, - "matchable": 2468, + "byte_identical": 2470, + "matchable": 2470, "instr_matched": 92941, "instr_total": 92941 }, { "binary": "ov_SC03_114", - "real": 2413, - "shared": 1812, + "real": 2336, + "shared": 1751, "linked": 0, - "byte_identical": 2415, - "matchable": 2415, + "byte_identical": 2417, + "matchable": 2417, "instr_matched": 88615, "instr_total": 88615 }, { "binary": "ov_SC03_115", - "real": 2470, - "shared": 1812, + "real": 2393, + "shared": 1751, "linked": 0, - "byte_identical": 2472, - "matchable": 2472, + "byte_identical": 2474, + "matchable": 2474, "instr_matched": 90306, "instr_total": 90306 }, { "binary": "ov_SC03_116", - "real": 2435, - "shared": 1811, + "real": 2358, + "shared": 1748, "linked": 0, - "byte_identical": 2438, - "matchable": 2438, + "byte_identical": 2440, + "matchable": 2440, "instr_matched": 92611, "instr_total": 92611 }, { "binary": "ov_SC03_117", - "real": 2551, - "shared": 1811, + "real": 2474, + "shared": 1748, "linked": 0, - "byte_identical": 2557, - "matchable": 2557, + "byte_identical": 2559, + "matchable": 2559, "instr_matched": 94662, "instr_total": 94662 }, { "binary": "ov_SC03_118", - "real": 2683, - "shared": 1869, + "real": 2595, + "shared": 1796, "linked": 0, - "byte_identical": 2684, - "matchable": 2684, + "byte_identical": 2687, + "matchable": 2687, "instr_matched": 99825, "instr_total": 99825 }, { "binary": "ov_SC03_119", - "real": 2684, - "shared": 1869, + "real": 2595, + "shared": 1796, "linked": 0, - "byte_identical": 2685, - "matchable": 2685, + "byte_identical": 2687, + "matchable": 2687, "instr_matched": 99825, "instr_total": 99825 }, { "binary": "ov_SC03_121", - "real": 2457, - "shared": 1812, + "real": 2379, + "shared": 1749, "linked": 0, - "byte_identical": 2459, - "matchable": 2459, + "byte_identical": 2461, + "matchable": 2461, "instr_matched": 92152, "instr_total": 92152 }, { "binary": "ov_SC03_124", - "real": 2721, - "shared": 1807, + "real": 2648, + "shared": 1750, "linked": 0, - "byte_identical": 2741, - "matchable": 2741, + "byte_identical": 2743, + "matchable": 2743, "instr_matched": 100827, "instr_total": 100827 }, { "binary": "ov_SC03_125", - "real": 2576, - "shared": 1820, + "real": 2499, + "shared": 1758, "linked": 0, - "byte_identical": 2588, - "matchable": 2588, + "byte_identical": 2590, + "matchable": 2590, "instr_matched": 93943, "instr_total": 93943 }, { "binary": "ov_SC03_126", - "real": 2423, - "shared": 1815, + "real": 2345, + "shared": 2252, "linked": 0, - "byte_identical": 2423, - "matchable": 2423, + "byte_identical": 2425, + "matchable": 2425, "instr_matched": 89141, "instr_total": 89141 }, { "binary": "ov_SC04_000", - "real": 2537, - "shared": 1816, + "real": 2458, + "shared": 1761, "linked": 0, "byte_identical": 2546, "matchable": 2546, @@ -1624,138 +1624,138 @@ }, { "binary": "ov_SC04_002", - "real": 2632, - "shared": 1811, + "real": 2555, + "shared": 1763, "linked": 0, - "byte_identical": 2636, - "matchable": 2636, + "byte_identical": 2638, + "matchable": 2638, "instr_matched": 98451, "instr_total": 98451 }, { "binary": "ov_SC04_003", - "real": 2499, - "shared": 1818, + "real": 2421, + "shared": 1754, "linked": 0, - "byte_identical": 2502, - "matchable": 2502, + "byte_identical": 2504, + "matchable": 2504, "instr_matched": 92154, "instr_total": 92154 }, { "binary": "ov_SC04_004", - "real": 2556, - "shared": 1812, + "real": 2479, + "shared": 1763, "linked": 0, - "byte_identical": 2558, - "matchable": 2558, + "byte_identical": 2560, + "matchable": 2560, "instr_matched": 94535, "instr_total": 94535 }, { "binary": "ov_SC04_005", - "real": 2606, - "shared": 1811, + "real": 2529, + "shared": 1763, "linked": 0, - "byte_identical": 2612, - "matchable": 2612, + "byte_identical": 2614, + "matchable": 2614, "instr_matched": 97876, "instr_total": 97876 }, { "binary": "ov_SC04_006", - "real": 2452, - "shared": 1817, + "real": 2375, + "shared": 1754, "linked": 0, - "byte_identical": 2454, - "matchable": 2454, + "byte_identical": 2456, + "matchable": 2456, "instr_matched": 89740, "instr_total": 89740 }, { "binary": "ov_SC04_007", - "real": 2565, - "shared": 1812, + "real": 2488, + "shared": 1763, "linked": 0, - "byte_identical": 2569, - "matchable": 2569, + "byte_identical": 2571, + "matchable": 2571, "instr_matched": 95866, "instr_total": 95866 }, { "binary": "ov_SC04_008", - "real": 2415, - "shared": 1811, + "real": 2338, + "shared": 2031, "linked": 0, - "byte_identical": 2415, - "matchable": 2415, + "byte_identical": 2417, + "matchable": 2417, "instr_matched": 88648, "instr_total": 88648 }, { "binary": "ov_SC04_009", - "real": 2438, - "shared": 1811, + "real": 2361, + "shared": 1748, "linked": 0, - "byte_identical": 2441, - "matchable": 2441, + "byte_identical": 2443, + "matchable": 2443, "instr_matched": 88659, "instr_total": 88659 }, { "binary": "ov_SC04_010", - "real": 2418, - "shared": 1811, + "real": 2341, + "shared": 1749, "linked": 0, - "byte_identical": 2419, - "matchable": 2419, + "byte_identical": 2421, + "matchable": 2421, "instr_matched": 88062, "instr_total": 88062 }, { "binary": "ov_SC04_011", - "real": 2798, - "shared": 1824, + "real": 2721, + "shared": 1761, "linked": 0, - "byte_identical": 2804, - "matchable": 2804, + "byte_identical": 2806, + "matchable": 2806, "instr_matched": 106658, "instr_total": 106658 }, { "binary": "ov_SC04_012", - "real": 2419, - "shared": 1811, + "real": 2342, + "shared": 1748, "linked": 0, - "byte_identical": 2420, - "matchable": 2420, + "byte_identical": 2422, + "matchable": 2422, "instr_matched": 88343, "instr_total": 88343 }, { "binary": "ov_SC04_015", - "real": 2600, - "shared": 1812, + "real": 2522, + "shared": 1748, "linked": 0, - "byte_identical": 2611, - "matchable": 2611, + "byte_identical": 2613, + "matchable": 2613, "instr_matched": 94435, "instr_total": 94435 }, { "binary": "ov_SC04_016", - "real": 2438, - "shared": 1812, + "real": 2361, + "shared": 1752, "linked": 0, - "byte_identical": 2440, - "matchable": 2440, + "byte_identical": 2442, + "matchable": 2442, "instr_matched": 90006, "instr_total": 90006 }, { "binary": "ov_SC04_018", - "real": 2857, - "shared": 1896, + "real": 2769, + "shared": 1825, "linked": 0, "byte_identical": 2857, "matchable": 2857, @@ -1764,8 +1764,8 @@ }, { "binary": "ov_SC04_019", - "real": 2857, - "shared": 1899, + "real": 2769, + "shared": 1825, "linked": 0, "byte_identical": 2857, "matchable": 2857, @@ -1774,28 +1774,28 @@ }, { "binary": "ov_SC04_020", - "real": 2555, - "shared": 1820, + "real": 2478, + "shared": 1758, "linked": 0, - "byte_identical": 2567, - "matchable": 2567, + "byte_identical": 2569, + "matchable": 2569, "instr_matched": 93290, "instr_total": 93290 }, { "binary": "ov_SC04_021", - "real": 2423, - "shared": 1815, + "real": 2345, + "shared": 2253, "linked": 0, - "byte_identical": 2423, - "matchable": 2423, + "byte_identical": 2425, + "matchable": 2425, "instr_matched": 89141, "instr_total": 89141 }, { "binary": "ov_SC05_000", - "real": 2419, - "shared": 1815, + "real": 2340, + "shared": 1749, "linked": 0, "byte_identical": 2422, "matchable": 2422, @@ -1804,148 +1804,148 @@ }, { "binary": "ov_SC05_001", - "real": 2569, - "shared": 1813, + "real": 2492, + "shared": 1764, "linked": 0, - "byte_identical": 2574, - "matchable": 2574, + "byte_identical": 2576, + "matchable": 2576, "instr_matched": 95793, "instr_total": 95793 }, { "binary": "ov_SC05_002", - "real": 2439, - "shared": 1811, + "real": 2362, + "shared": 1750, "linked": 0, - "byte_identical": 2442, - "matchable": 2442, + "byte_identical": 2444, + "matchable": 2444, "instr_matched": 90145, "instr_total": 90145 }, { "binary": "ov_SC05_003", - "real": 2480, - "shared": 1811, + "real": 2403, + "shared": 1750, "linked": 0, - "byte_identical": 2481, - "matchable": 2481, + "byte_identical": 2483, + "matchable": 2483, "instr_matched": 92399, "instr_total": 92399 }, { "binary": "ov_SC05_004", - "real": 2462, - "shared": 1811, + "real": 2385, + "shared": 1749, "linked": 0, - "byte_identical": 2464, - "matchable": 2464, + "byte_identical": 2466, + "matchable": 2466, "instr_matched": 91442, "instr_total": 91442 }, { "binary": "ov_SC05_005", - "real": 2490, - "shared": 1825, + "real": 2413, + "shared": 1764, "linked": 0, - "byte_identical": 2491, - "matchable": 2491, + "byte_identical": 2493, + "matchable": 2493, "instr_matched": 92327, "instr_total": 92327 }, { "binary": "ov_SC05_006", - "real": 2430, - "shared": 1813, + "real": 2353, + "shared": 1762, "linked": 0, - "byte_identical": 2430, - "matchable": 2430, + "byte_identical": 2432, + "matchable": 2432, "instr_matched": 89263, "instr_total": 89263 }, { "binary": "ov_SC05_007", - "real": 2477, - "shared": 1812, + "real": 2400, + "shared": 1751, "linked": 0, - "byte_identical": 2482, - "matchable": 2482, + "byte_identical": 2484, + "matchable": 2484, "instr_matched": 90670, "instr_total": 90670 }, { "binary": "ov_SC05_008", - "real": 2541, - "shared": 1812, + "real": 2464, + "shared": 1749, "linked": 0, - "byte_identical": 2543, - "matchable": 2543, + "byte_identical": 2545, + "matchable": 2545, "instr_matched": 92676, "instr_total": 92676 }, { "binary": "ov_SC05_009", - "real": 2434, - "shared": 1811, + "real": 2357, + "shared": 2030, "linked": 0, - "byte_identical": 2438, - "matchable": 2438, + "byte_identical": 2440, + "matchable": 2440, "instr_matched": 88648, "instr_total": 88648 }, { "binary": "ov_SC05_010", - "real": 2584, - "shared": 1816, + "real": 2507, + "shared": 1754, "linked": 0, - "byte_identical": 2588, - "matchable": 2588, + "byte_identical": 2590, + "matchable": 2590, "instr_matched": 98815, "instr_total": 98815 }, { "binary": "ov_SC05_011", - "real": 2408, - "shared": 1812, + "real": 2331, + "shared": 1752, "linked": 0, - "byte_identical": 2409, - "matchable": 2409, + "byte_identical": 2411, + "matchable": 2411, "instr_matched": 87773, "instr_total": 87773 }, { "binary": "ov_SC05_017", - "real": 2831, - "shared": 1811, + "real": 2757, + "shared": 1753, "linked": 0, - "byte_identical": 2842, - "matchable": 2842, + "byte_identical": 2844, + "matchable": 2844, "instr_matched": 103269, "instr_total": 103269 }, { "binary": "ov_SC05_018", - "real": 2660, - "shared": 1819, + "real": 2583, + "shared": 1757, "linked": 0, - "byte_identical": 2673, - "matchable": 2673, + "byte_identical": 2675, + "matchable": 2675, "instr_matched": 96740, "instr_total": 96740 }, { "binary": "ov_SC05_019", - "real": 2423, - "shared": 1815, + "real": 2345, + "shared": 2253, "linked": 0, - "byte_identical": 2423, - "matchable": 2423, + "byte_identical": 2425, + "matchable": 2425, "instr_matched": 89141, "instr_total": 89141 }, { "binary": "ov_SC06_000", - "real": 2688, - "shared": 1841, + "real": 2604, + "shared": 1771, "linked": 0, "byte_identical": 2691, "matchable": 2691, @@ -1954,188 +1954,188 @@ }, { "binary": "ov_SC06_006", - "real": 2510, - "shared": 1813, + "real": 2433, + "shared": 1750, "linked": 0, - "byte_identical": 2511, - "matchable": 2511, + "byte_identical": 2513, + "matchable": 2513, "instr_matched": 91906, "instr_total": 91906 }, { "binary": "ov_SC06_008", - "real": 2536, - "shared": 1813, + "real": 2459, + "shared": 1750, "linked": 0, - "byte_identical": 2542, - "matchable": 2542, + "byte_identical": 2544, + "matchable": 2544, "instr_matched": 95644, "instr_total": 95644 }, { "binary": "ov_SC06_010", - "real": 2512, - "shared": 1811, + "real": 2435, + "shared": 1748, "linked": 0, - "byte_identical": 2517, - "matchable": 2517, + "byte_identical": 2519, + "matchable": 2519, "instr_matched": 96787, "instr_total": 96787 }, { "binary": "ov_SC06_011", - "real": 2464, - "shared": 1811, + "real": 2387, + "shared": 1748, "linked": 0, - "byte_identical": 2468, - "matchable": 2468, + "byte_identical": 2470, + "matchable": 2470, "instr_matched": 90283, "instr_total": 90283 }, { "binary": "ov_SC06_013", - "real": 2424, - "shared": 1811, + "real": 2347, + "shared": 1748, "linked": 0, - "byte_identical": 2425, - "matchable": 2425, + "byte_identical": 2427, + "matchable": 2427, "instr_matched": 88714, "instr_total": 88714 }, { "binary": "ov_SC06_014", - "real": 2451, - "shared": 1811, + "real": 2374, + "shared": 1750, "linked": 0, - "byte_identical": 2453, - "matchable": 2453, + "byte_identical": 2455, + "matchable": 2455, "instr_matched": 89955, "instr_total": 89955 }, { "binary": "ov_SC06_015", - "real": 2421, - "shared": 1811, + "real": 2344, + "shared": 1750, "linked": 0, - "byte_identical": 2421, - "matchable": 2421, + "byte_identical": 2423, + "matchable": 2423, "instr_matched": 88633, "instr_total": 88633 }, { "binary": "ov_SC06_016", - "real": 2547, - "shared": 1816, + "real": 2470, + "shared": 1754, "linked": 0, - "byte_identical": 2549, - "matchable": 2549, + "byte_identical": 2551, + "matchable": 2551, "instr_matched": 95037, "instr_total": 95037 }, { "binary": "ov_SC06_018", - "real": 2658, - "shared": 1812, + "real": 2580, + "shared": 1750, "linked": 0, - "byte_identical": 2665, - "matchable": 2665, + "byte_identical": 2667, + "matchable": 2667, "instr_matched": 109836, "instr_total": 109836 }, { "binary": "ov_SC06_020", - "real": 2517, - "shared": 1813, + "real": 2440, + "shared": 1754, "linked": 0, - "byte_identical": 2518, - "matchable": 2518, + "byte_identical": 2520, + "matchable": 2520, "instr_matched": 95150, "instr_total": 95150 }, { "binary": "ov_SC06_022", - "real": 2634, - "shared": 1811, + "real": 2557, + "shared": 1748, "linked": 0, - "byte_identical": 2642, - "matchable": 2642, + "byte_identical": 2644, + "matchable": 2644, "instr_matched": 103517, "instr_total": 103517 }, { "binary": "ov_SC06_024", - "real": 2661, - "shared": 1811, + "real": 2584, + "shared": 1748, "linked": 0, - "byte_identical": 2667, - "matchable": 2667, + "byte_identical": 2669, + "matchable": 2669, "instr_matched": 105875, "instr_total": 105875 }, { "binary": "ov_SC06_025", - "real": 2567, - "shared": 1811, + "real": 2490, + "shared": 1748, "linked": 0, - "byte_identical": 2572, - "matchable": 2572, + "byte_identical": 2574, + "matchable": 2574, "instr_matched": 94908, "instr_total": 94908 }, { "binary": "ov_SC06_027", - "real": 2407, - "shared": 1811, + "real": 2330, + "shared": 1748, "linked": 0, - "byte_identical": 2408, - "matchable": 2408, + "byte_identical": 2410, + "matchable": 2410, "instr_matched": 87948, "instr_total": 87948 }, { "binary": "ov_SC06_029", - "real": 2651, - "shared": 1816, + "real": 2574, + "shared": 1754, "linked": 0, - "byte_identical": 2663, - "matchable": 2663, + "byte_identical": 2665, + "matchable": 2665, "instr_matched": 102640, "instr_total": 102640 }, { "binary": "ov_SC06_030", - "real": 2456, - "shared": 1816, + "real": 2379, + "shared": 1754, "linked": 0, - "byte_identical": 2456, - "matchable": 2456, + "byte_identical": 2458, + "matchable": 2458, "instr_matched": 91949, "instr_total": 91949 }, { "binary": "ov_SC06_032", - "real": 2651, - "shared": 1812, + "real": 2574, + "shared": 1753, "linked": 0, - "byte_identical": 2658, - "matchable": 2658, + "byte_identical": 2660, + "matchable": 2660, "instr_matched": 109664, "instr_total": 109664 }, { "binary": "ov_SC06_033", - "real": 2623, - "shared": 1812, + "real": 2546, + "shared": 1751, "linked": 0, - "byte_identical": 2630, - "matchable": 2630, + "byte_identical": 2632, + "matchable": 2632, "instr_matched": 107940, "instr_total": 107940 }, { "binary": "ov_SC07_000", - "real": 2519, - "shared": 1816, + "real": 2440, + "shared": 1750, "linked": 0, "byte_identical": 2521, "matchable": 2521, @@ -2144,81 +2144,81 @@ }, { "binary": "ov_SC07_001", - "real": 2452, - "shared": 1812, + "real": 2375, + "shared": 1750, "linked": 0, - "byte_identical": 2454, - "matchable": 2454, + "byte_identical": 2456, + "matchable": 2456, "instr_matched": 91362, "instr_total": 91362 }, { "binary": "ov_SC07_002", - "real": 2575, - "shared": 1816, + "real": 2498, + "shared": 1754, "linked": 0, - "byte_identical": 2579, - "matchable": 2579, + "byte_identical": 2581, + "matchable": 2581, "instr_matched": 96657, "instr_total": 96657 }, { "binary": "ov_SC07_006", - "real": 2378, - "shared": 1630, + "real": 2379, + "shared": 1714, "linked": 0, - "byte_identical": 2458, - "matchable": 2458, + "byte_identical": 2459, + "matchable": 2459, "instr_matched": 100506, "instr_total": 100506 }, { "binary": "ov_SC07_007", "real": 2530, - "shared": 1666, + "shared": 1728, "linked": 0, - "byte_identical": 2613, - "matchable": 2613, + "byte_identical": 2614, + "matchable": 2614, "instr_matched": 93027, "instr_total": 93027 }, { "binary": "ov_SC07_008", - "real": 2386, - "shared": 1812, + "real": 2309, + "shared": 1749, "linked": 0, - "byte_identical": 2386, - "matchable": 2386, + "byte_identical": 2388, + "matchable": 2388, "instr_matched": 87127, "instr_total": 87127 }, { "binary": "ov_SC07_009", - "real": 2428, - "shared": 1811, + "real": 2351, + "shared": 1748, "linked": 0, - "byte_identical": 2430, - "matchable": 2430, + "byte_identical": 2432, + "matchable": 2432, "instr_matched": 87808, "instr_total": 87808 }, { "binary": "ov_SC07_010", - "real": 2442, - "shared": 1689, + "real": 2443, + "shared": 1739, "linked": 0, - "byte_identical": 2524, - "matchable": 2524, + "byte_identical": 2526, + "matchable": 2526, "instr_matched": 92039, "instr_total": 92039 }, { "binary": "ov_SC07_011", - "real": 2369, - "shared": 1664, + "real": 2370, + "shared": 1727, "linked": 0, - "byte_identical": 2449, - "matchable": 2449, + "byte_identical": 2450, + "matchable": 2450, "instr_matched": 88375, "instr_total": 88375 } diff --git a/docs/tool-index.md b/docs/tool-index.md index 3f1684e25e..38c66bb721 100644 --- a/docs/tool-index.md +++ b/docs/tool-index.md @@ -144,7 +144,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | name the one exemplar to draft per structural family, ranked | `family_manifest.py` | Ranked structural-family target manifest naming the one exemplar to draft per family | family_hseq.py | repo signature files | LIVE | | normalize a function's own declaration when a templated definition lands in a new unit | `normalize_self_decls.py` | Normalizes a function's own declaration when a templated definition lands in a new unit | family_sweep.py | repo src layout | LIVE | | parse C declarators once, for every declaration tool to share | `cdecl.py` | The single recursive-descent C declarator parser every declaration tool shares | Makefile, blocker_probe.py, canon_sig_reconcile.py, cast_call_sites.py (+20) | C89 grammar only | LIVE | -| partition a source file at object boundaries, aware of comment state | `overlay_src_split.py` | Comment-state-aware partition of a source file, the oracle for the split chain | jr_isolate_all.py, neighbor_ref.py, o0_subsplit.py, share_census.py (+1) | repo src layout | LIVE | +| partition a source file at object boundaries, aware of comment state | `overlay_src_split.py` | Comment-state-aware partition of a source file, the oracle for the split chain | jr_isolate_all.py, neighbor_ref.py, o0_subsplit.py, share_census.py (+2) | repo src layout | LIVE | | place a templated body's data externs at a scope the destination accepts | `scope_data_externs.py` | Places a templated body's data externs at the scope the destination unit can accept | family_sweep.py, jtbl_family_bank.py, scope_demote_drafts.py, scope_tu_externs.py | repo src layout | LIVE | | property-test the signature tool on committed fixtures, needing no compiler | `xsig/tests/test_xsig.py` | Property tests for the signature tool on committed fixtures, needing no compiler | .github/workflows/no-rom.yml, Makefile | fixture paths | LIVE | | rank clusters of the unmatched frontier by mnemonic-skeleton hash | `family_hseq.py` | Ranked clustering of the unmatched frontier by mnemonic-skeleton hash | Makefile, audit_binaries.py, audit_frontier.py, build_wave_atlas.py (+5) | repo signature files | LIVE | @@ -165,7 +165,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | sign every function of a flat image at a known base, without a disassembler | `sig_image.py` | Disassembler-free per-function signer for a flat image at a known base, field-identical to the dumper | Makefile, atlas_features.py, corpus.py, disc_audit.py (+5) | MIPS encodings, repo scratch paths | LIVE | | sign functions with relocations masked for cross-project code identification | `xsig/xsig.py` | Relocation-masked per-function signatures for cross-project code identification | .github/workflows/no-rom.yml, Makefile, test_xsig.py | MIPS/relocation model only | LIVE | | sweep a matched exemplar across every same-structure sibling, gate-arbitrated | `family_sweep.py` | Sweeps a matched exemplar across every same-structure sibling, gate-arbitrated | frozen.py, recover_integration.py, twin_sweep.py | repo src/config layout | LIVE | -| unify a draft's callee externs and its own signature to the banked-canonical set | `sig_unify.py` | Unifies a draft's callee externs and its own definition signature to the banked-canonical set | auto_driver.py, cast_call_sites.py, cdecl.py, gate_stage.py (+1) | repo shared-header paths | LIVE | +| unify a draft's callee externs and its own signature to the banked-canonical set | `sig_unify.py` | Unifies a draft's callee externs and its own definition signature to the banked-canonical set | auto_driver.py, cast_call_sites.py, gate_stage.py, p16_improve.py | repo shared-header paths | LIVE | | validate a code-share registry byte-honestly, failing closed on signature drift | `dedup_integrate.py` | Byte-honesty validator for the code-share registry; fails closed on signature drift | Makefile, macro_to_header.py, progress.py, share_body.py (+1) | repo config registry path | LIVE | ## P7 — the codegen map, the dumps, the permuter @@ -189,7 +189,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | run the permuter with a masked scorer rebound, without patching it | `permuter/run_masked.py` | Runs the permuter with the masked scorer rebound before its entry point, without patching it | masked_scorer.py, p16_permute.py | permuter internals, repo module paths | LIVE | | score permuter candidates on true masked code closeness, not mnemonic diff | `masked_scorer.py` | Drop-in permuter scorer scoring true relocation-masked code closeness instead of mnemonic diff | masked_diff.py, run_masked.py | permuter internals, repo module paths | LIVE | | steer permuter mutation toward the lever family the residual class implies | `permuter_weights.py` | Directs permuter mutation toward the lever family the residual class implies | autopsy.py, p16_permute.py | permuter settings format | LIVE | -| tag every compiler-source citation with the source tree it refers to | `gccmap_cites.py` | Tags every compiler-source citation in the codegen-map docs with the tree it refers to | .github/workflows/no-rom.yml, Makefile | repo doc/reference paths | LIVE | +| tag every compiler-source citation with the source tree it refers to | `gccmap_cites.py` | Tags every compiler-source citation in the codegen-map docs with the tree it refers to | .github/workflows/no-rom.yml, Makefile, tool_census.py | repo doc/reference paths | LIVE | | turn a red whole-binary result into a named list of divergent symbols | `main_diff_locate.py` | Turns a red whole-binary result into a named list of divergent symbols | gate_main.py | repo build/config layout | LIVE | | warm-restart the permuter from its best waypoint each cycle | `permuter_ils.py` | Iterated-local-search wrapper warm-restarting the permuter from the best waypoint each cycle | grinder.py, permuter_sweep.py | permuter layout, repo scratch paths | LIVE | @@ -227,7 +227,7 @@ then what proved it. The same data generates the day-one kit's manifest and its | gate many binaries concurrently in isolated worktrees and merge only passers | `parallel_gate.py` | Gates many binaries concurrently in isolated worktrees and merges only the passers | docs/wave-playbook.md, gate_main_parallel.py, gate_wave.py, gater_lane.py (+1) | repo worktree/build layout | LIVE | | gate pre-staged draft directories across distinct binaries in parallel | `sweep_parallel.py` | Gates pre-staged draft directories across distinct binaries in parallel | family_sweep.py, idiom_serial.py, integration_resolver.py, maintenance.sh (+2) | repo scratch paths | LIVE | | gate the executable's drafts the only trustworthy way: a clean rebuild with bisect | `gate_main.py` | Gates a batch of executable drafts the only trustworthy way: a clean rebuild with bisect | Makefile, docs/wave-playbook.md, build_wave_atlas.py, decl_prior.py (+12) | repo build/make targets | LIVE | -| generate a callee-signature-aware target manifest with per-function fleet reach | `gen_harvest_targets.py` | Generates a callee-signature-aware target manifest with per-function fleet reach | cast_call_sites.py, cdecl.py, sig_unify.py | canonical source binary, repo paths | LIVE | +| generate a callee-signature-aware target manifest with per-function fleet reach | `gen_harvest_targets.py` | Generates a callee-signature-aware target manifest with per-function fleet reach | cast_call_sites.py, sig_unify.py | canonical source binary, repo paths | LIVE | | give a wave its own immutable copy of the disassembly its agents read | `wave_snapshot.py` | Gives a wave its own immutable copy of the disassembly files its agents read | build_wave_atlas.py | repo asm paths | LIVE | | give an external chat model the same multi-turn tool harness an agent gets | `api_agent.py` | Gives an external chat model the same multi-turn tool harness an agent gets | claude_wave_packs.py, idiom_serial.py, jtbl_lane.py, ox_campaign.py | provider endpoint, repo doc paths | LIVE | | hold one reader/writer lock over the shared source state for concurrent lanes | `shared_lock.py` | One reader/writer lock over the shared source state for concurrent lanes | bulk_harvest.py, fix_arity_callers.py, gate_stage.py | repo lock paths | LIVE | @@ -322,18 +322,18 @@ then what proved it. The same data generates the day-one kit's manifest and its |---|---|---|---|---|---| | add per-site function-pointer casts so a draft can call a differently typed callee | `cast_call_sites.py` | Adds per-site function-pointer casts so a draft can call a differently typed callee | canon_sig_reconcile.py, cast_self_callers.py, family_sweep.py, gate_stage.py (+4) | repo src layout | LIVE | | apply curated names and signatures inside the analysis tool and save | `ghidra_scripts/ApplySymbols.java` | The in-tool half of that mirror: apply curated names and signatures, save on exit | ghidra_apply_symbols.sh, ghidra_export_annotations.sh, ghidra_rebuild.sh, ExportAnnotations.java (+1) | none | LIVE | -| convert a shared-body macro header into per-function plain-C headers included at each site | `macro_to_header.py` | The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | share_body.py | the macro form is this project's; a kit-born project shares headers from its first bank | LIVE | +| convert a shared-body macro header into per-function plain-C headers included at each site | `macro_to_header.py` | The Phase-35 converter: every DEFINE_ macro body becomes a plain-C header under src/shared// included at its site, the legacy name-parameterized headers converted, the registry text-edited, the macro header deleted; --plan / --apply / --finalize / --verify | share_body.py, tool_census.py | the macro form is this project's; a kit-born project shares headers from its first bank | LIVE | | emit a function's target assembly as an inline-assembly body | `asm_verbatim.py` | Emits the file-scope inline-assembly body form from a disassembly file | docs/wave-playbook.md, draft_prechecks.py, gate_main.py, recover_route.py | repo asm layout | LIVE | | extract inline-defined types and typedefs from a source file into a shared header | `build_engine_types.py` | Extracts inline-defined named types and typedefs from a source file into a shared header | inject_capped_externs.py, lift_types.py, uniquify_type.py | repo shared-header path | LIVE | | flag address-named references whose address now has a curated name | `lint_symbol_refs.py` | Flags address-named references in committed sources whose address now has a curated name | .github/workflows/no-rom.yml, Makefile | repo symbol/src paths | LIVE | | give each conflicting camp of a same-named type its own name | `uniquify_type.py` | Gives each conflicting camp of a same-named type its own name so every camp becomes liftable | — | repo src layout | REFERENCED | | guard that every inline-assembly body still reproduces its target bytes | `verbatim_check.py` | Regression guard that every inline-assembly body still reproduces its target bytes | .github/workflows/no-rom.yml, verbatim_target_s.py, verbatim_to_stub.py | repo src layout | LIVE | -| measure duplicate function bodies across the fleet and assert one source per unique function | `share_census.py` | The census of byte-identical function classes across every binary with their source forms and verdicts, plus the S1 invariant check with its exception ledger and a fixture self-test | audit_binaries.py, dedup_integrate.py, gen_harvest_targets.py, macro_to_header.py (+3) | repo paths, the registry and signature schemas | LIVE | +| measure duplicate function bodies across the fleet and assert one source per unique function | `share_census.py` | The census of byte-identical function classes across every binary with their source forms and verdicts, plus the S1 invariant check with its exception ledger and a fixture self-test | audit_binaries.py, dedup_integrate.py, gen_harvest_targets.py, macro_to_header.py (+4) | repo paths, the registry and signature schemas | LIVE | | mirror the curated symbol file into the analysis database with a real save | `ghidra_apply_symbols.sh` | Mirrors the curated symbol file into the analysis program headlessly, with a real save | — | repo symbol path, project name | REFERENCED | | refuse, from one place, the command line of a tool the project has frozen | `frozen.py` | The one refusal a FROZEN tool prints from its main(): the tool, the successor and why; imports never exit (libraries stay usable) | aprop_autodraft.py, blocker_probe.py, canon_sig_reconcile.py, conform_decls.py (+10) | nothing | LIVE | | regenerate a splitter-format target disassembly for a function no longer stubbed | `verbatim_target_s.py` | Regenerates a splitter-format target disassembly for a function that is no longer a stub; --gas emits the assemblable gas-syntax form ($-registers, .L labels, noreorder) that a web diff service accepts as a pasted target | decompme_replica.sh | repo build/asm layout | LIVE | | run the share-body batch cycle unattended: batch, verify by exit code, log, commit, periodic clean fleet check | `share_body_cycle.sh` | The Phase-35 T5 driver for bucket new: per batch share_body --apply --bucket new --batches 1 --label new, the gated N/N line read, the phase log entry appended, the bank committed (R42), the clean fleet run every N batches (R22) — stops on the first red | — | repo paths, the phase-log format, the fleet count from config/check.*.sha | ORPHAN | -| share one byte-identical function class across its binaries through an include-at-site header, gated per binary | `share_body.py` | The Phase-35 successor of dedup_propagate + dedup_extend for the include-at-site form: exemplar by majority text, the header written once, every private copy replaced by the include at its position, per-binary byte gate with object comparison, bisect on red, the registry appended or extended by text, the exception ledger on refusal; --plan / --apply --bucket extend|new | aprop_autodraft.py, audit_binaries.py, auto_driver.py, blocker_probe.py (+17) | repo paths, the registry and signature schemas | LIVE | +| share one byte-identical function class across its binaries through an include-at-site header, gated per binary | `share_body.py` | The Phase-35 successor of dedup_propagate + dedup_extend for the include-at-site form: exemplar by majority text, the header written once, every private copy replaced by the include at its position, per-binary byte gate with object comparison, bisect on red, the registry appended or extended by text, the exception ledger on refusal; --plan / --apply --bucket extend|new | aprop_autodraft.py, audit_binaries.py, auto_driver.py, blocker_probe.py (+18) | repo paths, the registry and signature schemas | LIVE | | turn an inline-assembly body back into a stub the toolchain can reach | `verbatim_to_stub.py` | Turns an inline-assembly body back into an include-assembly stub | — | repo src/asm layout | REFERENCED | ## PROJECT-ONLY — project-only in code (the shape is a task; the code does not transfer) diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index d464063b03..e52165307f 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -474,6 +474,30 @@ validate_targets` OK; no live tool names a retired file; `tool_census --check: OK` after `make kit-corpus` (the first chain checked BEFORE regenerating and a `;` let a partial commit through — R97 again; amended into one commit). +- **S96 — T6 part 2: the dead macro branches dropped + the guard.** Twelve live tools lost their macro-form code: audit_binaries + (`SHARED_INCLUDES` = the prelude only), auto_driver + bulk_harvest (`git add src/shared`), build_engine_types (the generated comment), + cdecl (`MACRO_STMT` = INCLUDE_ASM only; the fifteen-incumbent differential reduced to its honest statement — the macro header is gone — + and its dead body deleted, the gen_harvest_targets import with it), dedup_integrate (`PARAM_FUNC_RE` = SHARED_FN), export_pairs (mines + the shared headers under src/shared/ instead of macro bodies), family_cousins (`seed_body_ref` finds the shared header), fix_arity_callers + (the shared-header glob only), jr_isolate_all (the prelude include maps to engine_types.h + common.h), recover_integration (message + + snapshot list), sig_unify (help text). **The guard** (`tool_census.py --check`, `macro_form_guard`): every LIVE `.py` parsed with `ast`; + a non-docstring string constant carrying `DEFINE_func_` or `engine_core.h` is a gap; FROZEN, retired and six whitelisted detectors + (share_census, macro_to_header, share_body, overlay_src_split, gccmap_cites, tool_census) excluded; `--guard-root DIR` runs it against + another tree. **Verify:** `macro-form guard: 0 LIVE tools reference the retired form (217 scanned, 14 frozen, 6 whitelisted detectors, 38 + retired)` · `tool_census --check: OK`. **Negative control (R39):** a worktree of the pre-T4 commit `0e38b51a3` → `15 LIVE tools reference + the retired form (197 scanned, 14 frozen, 4 whitelisted)` — exactly the twelve fixed here + the three retired, none frozen or whitelisted. + **`make tools-health` went red twice, both instrument findings fixed at the cause:** (1) `progress.py`'s R32 bucket assertion — + `func_801EF790`/`func_801EF85C` (md_SC03_073/074/075/078, empty-bodied shared headers) in BOTH `real` and `empty`: the include rule + classifies an empty header body as EMPTY while `report()`'s fold `real ∪= shared` re-added every included member; under the macro + form an empty shared body had been invisible to the classifier and counted as REAL through that fold. Fix: the fold excludes `empty`. + **Two published-number corrections follow (R14/R75; stated here, carried to T7/T8):** the fleet denominator **363,221 → 363,680 + (+459)** = ov_SC03_015 +219 (its single-site macros, the plan's expected correction) + ov_SC03_118 +3 + 2 in each of ~118 overlays + (the never-extended members of the five under-listed groups — macro sites invisible until T4 made them includes); and **FLEET REAL + substantive 360,744 → 350,533 (−10,211)** with EMPTY up by the same — empty-bodied shared functions were REAL under the macro form's + fold and are EMPTY now, honestly; the instruction-weighted metrics (13,492,113 / 5,820,205 / 45,150) are unchanged. (2) `timeline.py`'s + self-check: its last row follows the COMMITTED digest (T2's lesson) — this commit carries the corrected `docs/progress.json` + README + block + `progress.fleet.md`; the timeline is regenerated in the next commit and the chain re-run for T6's verify line. + ## Approved plan (verbatim, gate 1 — 2026-09-08) # Phase 35 — Gen3 opens: the dedup phase, "one source per unique function" (v2.0.0 → v2.1.0) diff --git a/tools/audit_binaries.py b/tools/audit_binaries.py index 9a188e9094..e14acc7267 100644 --- a/tools/audit_binaries.py +++ b/tools/audit_binaries.py @@ -33,7 +33,7 @@ import dup_report import corpus REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -SHARED_INCLUDES = ("shared/engine_core.h", "shared/engine_prelude.h") # the macro-era header, then the Phase-35 prelude +SHARED_INCLUDES = ("shared/engine_prelude.h",) # the Phase-35 prelude (the macro-era header is gone, P35 T4/T6) def onboarded(): diff --git a/tools/auto_driver.py b/tools/auto_driver.py index 6d62f12708..8a79294e27 100644 --- a/tools/auto_driver.py +++ b/tools/auto_driver.py @@ -111,7 +111,7 @@ def fleet_pct(): def git_commit(msg): - sh(["git", "add", SRC, "src/shared/engine_core.h", "config/dedup.us.yaml"]) + sh(["git", "add", SRC, "src/shared", "config/dedup.us.yaml"]) # P35 T6: the share writes headers under src/shared/ sh(["git", "commit", "-q", "-m", msg]) return sh(["git", "rev-parse", "--short", "HEAD"]).stdout.strip() diff --git a/tools/build_engine_types.py b/tools/build_engine_types.py index 39aac06eb5..bff38537f5 100644 --- a/tools/build_engine_types.py +++ b/tools/build_engine_types.py @@ -339,7 +339,7 @@ def main(): '/* src/shared/engine_types.h — shared engine struct/union types + typedefs (Phase 15 §14c,', ' * Phase 20 typedef lift). Generated by tools/build_engine_types.py from the matched bodies', ' * in the source overlay. Defined ONCE here (0 same-name-different-layout collisions) so the', - ' * struct/typedef-using shared functions propagate fleet-wide via engine_core.h. Included by', + ' * struct/typedef-using shared functions share fleet-wide through the per-function headers under src/shared/ (Phase 35). Included by', ' * common.h consumers. */', '#include "common.h"', ''] # forward decls first (lets pointer-only references resolve regardless of order) diff --git a/tools/bulk_harvest.py b/tools/bulk_harvest.py index 18e23a1b40..b5a124d8f3 100644 --- a/tools/bulk_harvest.py +++ b/tools/bulk_harvest.py @@ -207,7 +207,7 @@ def fleet_pct(): def git_commit(banked_by_bin, propagated, fp): - add = ["src/shared/engine_core.h", "src/shared/engine_types.h", "config/dedup.us.yaml"] + add = ["src/shared", "config/dedup.us.yaml"] # P35 T6: the per-function headers live under src/shared/ for b in banked_by_bin: add += [os.path.relpath(p, REPO) for p in glob.glob(os.path.join(REPO, "src/%s/%s*.c" % (b, b)))] add += [os.path.relpath(p, REPO) for p in glob.glob(os.path.join(REPO, "src/ov_*/*.c"))] # propagation diff --git a/tools/cdecl.py b/tools/cdecl.py index 6821888ebb..f971ad03e2 100644 --- a/tools/cdecl.py +++ b/tools/cdecl.py @@ -106,7 +106,7 @@ GNU = {'__asm__', 'asm', '__attribute__', '__extension__', '__inline__'} # Macro invocations that are NOT declarations in RAW draft/source text (they become declarations # only after cpp). An EXPLICIT, NAMED exclusion list — the audit's rule: never let the exclusion set # be "whatever the parser happened to choke on". -MACRO_STMT = re.compile(r'^\s*(INCLUDE_ASM|DEFINE_func_[0-9A-Fa-f]+|SETTER|RETCONST|CLEAR_TBL40)\b') +MACRO_STMT = re.compile(r'^\s*(INCLUDE_ASM)\b') # P35 T6: the dedup macro forms are gone; INCLUDE_ASM is the one macro statement left class CDeclError(Exception): @@ -1294,81 +1294,15 @@ def audit_differential(): scanner it replaces: any symbol an incumbent sees and this one does not is a defect in THIS tool. The reverse (symbols only this one sees) is the measured size of the hole.""" sys.path.insert(0, os.path.join(REPO, 'tools')) - import gen_harvest_targets as ght # reconcile_decls RETIRED (S45, R33): its DATA_DECL_LINE_RE row proved the superset for # 26-A..S44; the incumbent is deleted, so the differential now compares the survivors only. - import sig_unify as su - - ec = os.path.join(REPO, 'src/shared/engine_core.h') - if not os.path.exists(ec): + # P35 T6: the macro header is gone for good; the differential's only honest result is the statement below. + if True: # Phase 35: the macro header is gone (per-function headers under src/shared// hold plain C that tu_scope reads # like any TU). The fifteen-incumbent differential was a comparison OVER MACRO TEXT; without that text it has nothing # to compare against, and saying so is the honest result (R43 — never fabricate a synthetic TU from the new form). - print('[differential] src/shared/engine_core.h is absent (Phase 35): the macro-era differential no longer applies — OK') + print('[differential] the macro-era shared header is gone (Phase 35): the macro-era differential no longer applies — OK') return True - text = open(ec).read() - - # The incumbents scan engine_core.h's RAW TEXT — i.e. the bodies of 1,801 #define macros. A - # declaration in a macro body declares nothing until the macro is INVOKED (the §8c law), so the - # honest like-for-like comparison is against what cpp produces when every macro IS invoked. - # That synthetic TU is exactly "everything engine_core.h is capable of declaring". - d = os.path.join(REPO, 'src/shared') - tmp = os.path.join(d, '.cdecl_allmacros.c') - macros = re.findall(r'^#define\s+(DEFINE_func_[0-9A-Fa-f]+)\(\)', text, re.M) - with open(tmp, 'w') as f: - f.write('#include "../../include/common.h"\n#include "engine_types.h"\n' - '#include "engine_core.h"\n') - for mac in macros: - f.write(f'{mac}()\n') - try: - stmts = tu_statements(tmp) - mine = scope(stmts, tmp) - expanded = '\n'.join(stmts) - finally: - os.path.exists(tmp) and os.remove(tmp) - print(f'[differential] expanded {len(macros)} DEFINE_ macros through cpp -> {len(mine)} names') - - mine_d = {n for n in mine if n.startswith('D_')} - rows = [] - for name, rx in (('gen_harvest_targets.DATA_DECL_RE', ght.DATA_DECL_RE), - ('sig_unify.DATA_DECL_RE', su.DATA_DECL_RE)): - theirs = set() - for m in rx.finditer(text): - theirs |= set(re.findall(r'\bD_[0-9A-Fa-f]+\b', m.group(0))) - # A symbol I do not report is only MY defect if it is genuinely at FILE scope. A - # block-scope `extern` is private to its function and is NOT part of the TU's namespace — - # reporting it as an authoritative canonical is what produced the §8d - # `conflicting types for D_801812A4` wall. So separate the two, and never let a real defect - # hide behind the excuse. - lost = theirs - mine_d - block = {s for s in lost if re.search(r'\bextern\b[^;]*\b' + s + r'\b', expanded)} - defect = lost - block - rows.append((name, len(theirs), len(mine_d), len(mine_d - theirs), sorted(defect), - sorted(block))) - - print('[differential] engine_core.h — D_ symbols (raw-text scan vs cpp-expanded file scope)') - print(f' {"incumbent":<36} {"theirs":>7} {"cdecl":>7} {"cdecl-only":>11} {"MY DEFECT":>10} ' - f'{"their block-scope error":>24}') - ok = True - for name, t, m, g, defect, block in rows: - print(f' {name:<36} {t:>7} {m:>7} {g:>11} {len(defect):>10} {len(block):>24}') - if defect: - print(f' DEFECT (file-scope, invisible to cdecl): {defect[:8]}') - if block: - print(f' they count BLOCK-scope externs as file-scope canonicals: {block[:4]}') - ok &= not defect - - named = {'D_80127530': 'array', 'D_80127088': 'fnptr', 'D_8011DB28': 'fnptr', - 'D_801274D0': 'fnptr', 'D_8018E858': 'fnptr_array'} - print(' the audit\'s named blind symbols (engine_core.h), now resolved WITH THEIR KIND:') - for n, want in named.items(): - d = mine.get(n) - got = d.kind if d else 'MISSING' - flag = 'ok' if got == want else 'WRONG' - ok &= (got == want) - print(f' {n:<14} kind={got:<12} (expected {want}) [{flag}]' - + (f' {d.type}' if d else '')) - return ok def main(): diff --git a/tools/dedup_integrate.py b/tools/dedup_integrate.py index e23bd6ebdb..a7caa58641 100644 --- a/tools/dedup_integrate.py +++ b/tools/dedup_integrate.py @@ -55,7 +55,7 @@ TIERS = ("h_exact", "h_norm") # OVER-APPROXIMATING by design (R32): any C identifier, not just func_ — a curated symbol # (e.g. listCdBuffer) is a stub too, and a `func_`-only pattern silently misses it. INCLUDE_ASM_RE = re.compile(r'INCLUDE_ASM\([^)]*,\s*([A-Za-z_]\w*)\s*\)') -MACRO_FUNC_RE = re.compile(r'^(DEFINE_func_[0-9A-Fa-f]+|SETTER|RETCONST|CLEAR_TBL40)$') # the macro-form `func` tokens +PARAM_FUNC_RE = re.compile(r'^SHARED_FN$') # the parameterized include form's `func` token (P35; the macro forms are gone) SYMBOL_LINE_RE = re.compile(r'^\s*([A-Za-z_]\w*)\s*=\s*(0x[0-9A-Fa-f]+)\s*;') @@ -193,9 +193,9 @@ def check(groups, binary_filter=None, allow_unsigned=False): f"body that was never written (the share was registered but never propagated)") failures += 1; continue # ---- C2a′ (Phase 35 T2): a PLAIN-C header source must DEFINE `func` (a token occurrence is not a body) -------- - # The macro forms (DEFINE_func_*, SETTER/RETCONST/CLEAR_TBL40) define through cpp and keep the token check above; - # the include form is read by share_census.header_defs — the one reader of that form (R33). - if not MACRO_FUNC_RE.match(fn): + # The parameterized form (SHARED_FN) defines through cpp and keeps the token check above; every other source is a + # plain-C header read by share_census.header_defs — the one reader of that form (R33). + if not PARAM_FUNC_RE.match(fn): sys.path.insert(0, str(ROOT / "tools")) import share_census defined = {n for n, _ in share_census.header_defs(ROOT / src)} diff --git a/tools/export_pairs.py b/tools/export_pairs.py index 6b306f88a9..ed7628d28a 100644 --- a/tools/export_pairs.py +++ b/tools/export_pairs.py @@ -150,14 +150,13 @@ def main(): region = os.path.relpath(os.path.join(root, f), os.path.join(REPO, 'src'))[:-2] for fn, body in extract_defs(open(os.path.join(root, f)).read()).items(): defs.setdefault(fn, (body, region)) - # corpus-v3: ALSO mine the shared DEFINE_func macro bodies (engine_core.h) — the setters/return-const/ - # dispatchers the model is blind to (extract_defs sees only inline col-0 defs, not macro instantiations). + # corpus-v3 mined the shared macro bodies here; since Phase 35 the shared bodies are plain-C headers under src/shared/ — + # (a header body is one definition in one file; mine the headers directly). n_inline = len(defs) - ec = os.path.join(REPO, 'src/shared/engine_core.h') - if os.path.exists(ec): - for fn, body in extract_macro_defs(open(ec).read()).items(): + for hp in sorted(glob.glob(os.path.join(REPO, 'src/shared/*/func_*.h'))): + for fn, (body, _region) in extract_defs(open(hp).read()).items(): defs.setdefault(fn, (body, 'shared')) - print(' %d func defs in src (%d inline + %d shared macros)' % ( + print(' %d func defs in src (%d inline + %d shared headers)' % ( len(defs), n_inline, len(defs) - n_inline), file=sys.stderr) pairs, skipped = [], {'no_asm': 0} diff --git a/tools/family_cousins.py b/tools/family_cousins.py index 01e072af79..dd293a662d 100644 --- a/tools/family_cousins.py +++ b/tools/family_cousins.py @@ -280,11 +280,10 @@ def write_digest(out): # ---------------------------------------------------------------- wave slate def seed_body_ref(bin_, addr): - """Where the seed's C body lives: engine_core.h DEFINE_ macro, or the inline def's src file.""" + """Where the seed's C body lives: a shared per-function header under src/shared/ (Phase 35), or the inline def's src file.""" name = f"func_{addr:08X}" - core = "src/shared/engine_core.h" - if os.path.exists(core) and f"DEFINE_{name}(" in open(core).read(): - return dict(kind="macro", path=core, name=name) + for hp in sorted(glob.glob(f"src/shared/*/{name}.h")) + sorted(glob.glob(f"src/shared/*/{name}__*.h")): + return dict(kind="header", path=hp, name=name) for p in sorted(glob.glob(f"src/{bin_}/*.c")): txt = open(p).read() if re.search(rf"^[A-Za-z_][^\n=;]*\b{name}\s*\(", txt, re.M) and f"INCLUDE_ASM" not in \ diff --git a/tools/fix_arity_callers.py b/tools/fix_arity_callers.py index 3bbad3bf33..8039800b65 100644 --- a/tools/fix_arity_callers.py +++ b/tools/fix_arity_callers.py @@ -38,7 +38,6 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import shared_lock # Stage 1: --apply/--undo-journal write the fleet-shared header REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) -EC = os.path.join(REPO, 'src/shared/engine_core.h') NARROW = re.compile(r'\b(char|short|signed\s+char|unsigned\s+char|unsigned\s+short|s8|u8|s16|u16|float|f32)\b') @@ -157,7 +156,7 @@ def main(): 'reconciliation for non-(void) conflicting forward-decls; byte-gate filters (G3/P9)') ap.add_argument('--binary', help='ALSO scan+rewrite this overlay\'s own inline caller decls in ' 'src//*.c (a conflicting extern is often in the overlay src, not just ' - 'engine_core.h — the T6 integration-recovery gap). Default: engine_core.h only.') + 'the shared headers under src/shared/ — the T6 integration-recovery gap). Default: the shared headers under src/shared/ only.') ap.add_argument('--journal', metavar='PATH', help='(apply) record each substitution\'s literal before/after to this JSON for ' 'exact --undo-journal restore; written even when no edits were made') @@ -177,7 +176,7 @@ def main(): sys.exit('no funcs given') # target files: engine_core.h always; + the overlay's own src (inline callers) when --binary given. - files = sorted(set(([EC] if os.path.exists(EC) else []) + glob.glob(os.path.join(REPO, 'src/shared/**/*.h'), recursive=True))) # Phase 35: every shared header carries externs + files = sorted(set(glob.glob(os.path.join(REPO, 'src/shared/**/*.h'), recursive=True))) # Phase 35: every shared header carries externs if a.binary: # MAIN'S SOURCES DO NOT LIVE IN src/main/ (P31 S69). They are src/*.c — src/800.c, … — so the # overlay-shaped glob matched NOTHING for --binary main and the tool reported success over an diff --git a/tools/jr_isolate_all.py b/tools/jr_isolate_all.py index 6283015e87..7da9013ecf 100644 --- a/tools/jr_isolate_all.py +++ b/tools/jr_isolate_all.py @@ -641,10 +641,9 @@ def _provided_types(header): paths = [] for inc in incs: b = os.path.basename(inc) - if b == "engine_core.h": - # engine_core.h itself is NOT scanned: its typedefs live INSIDE `DEFINE_func_*()` macro - # bodies and reach a region only where that macro is invoked. What every includer gets at - # file scope is what engine_core.h #includes — engine_types.h + common.h (the legacy set). + if b == "engine_prelude.h": + # the Phase-35 prelude: what every overlay/module TU gets at file scope from the shared tree — engine_types.h + + # common.h (the legacy set; the per-function headers are included at their sites, not here) paths += ["src/shared/engine_types.h", "include/common.h"] elif b == "engine_types.h": paths += ["src/shared/engine_types.h", "include/common.h"] diff --git a/tools/progress.py b/tools/progress.py index 87ffc57a15..386d111bdd 100644 --- a/tools/progress.py +++ b/tools/progress.py @@ -819,7 +819,10 @@ def report(binary, audit=False, write=True): # _INCLUDED); it is still a shared body, so it counts in `shared`. A member parsed as a PRIVATE definition is not shared # (a demacroized copy) — the registry is advisory, the source authoritative, as before. members = dedup_members(BINARY) - shared = sorted((members - set(real) - set(stubs)) | (_INCLUDED & members)) + # Phase 35 T6: an included member whose header body is EMPTY is classified `empty` by the include rule above and must NOT be + # folded into `real` as "shared" (pre-T4 the macro site was invisible and an empty shared body counted as real through this + # fold; the T6 health run put func_801EF790/func_801EF85C in BOTH buckets — the R32 assertion below caught it). + shared = sorted(((members - set(real) - set(stubs)) | (_INCLUDED & members)) - set(empty)) real = sorted(set(real) | set(shared)) # ---- COVERAGE ASSERTION (the rule ratified 2026-07-14: a scanner over the corpus must assert its diff --git a/tools/recover_integration.py b/tools/recover_integration.py index 8d36023e82..713e9fbf39 100644 --- a/tools/recover_integration.py +++ b/tools/recover_integration.py @@ -233,7 +233,7 @@ def main(): if propagate: if a.max_tier != "fleet" or not a.r22: raise SystemExit( - "propagation is a FLEET-tier write (src/shared/engine_core.h + up to 138 overlay .c): " + "propagation is a FLEET-tier write (the shared headers under src/shared/ + up to 138 overlay .c): " "it requires --max-tier fleet AND --r22, or pass --no-propagate (§65a).") if "demacroize" in stages: raise SystemExit( @@ -313,8 +313,7 @@ def main(): # passes — `fix_arity_callers --revert` is LOSSY for --any-proto (it rewrites `()`->`(void)`, not # back to the original `(a,b,c)`), which corrupts a non-bank whose caller passed args. So we # snapshot/restore verbatim instead. (Bug caught by the clean-rebuild verify, R22.) - tu_files = [os.path.join(REPO, "src/shared/engine_core.h")] + \ - sorted(glob.glob(os.path.join(REPO, f"src/{a.binary}/{a.binary}*.c"))) + tu_files = sorted(glob.glob(os.path.join(REPO, f"src/{a.binary}/{a.binary}*.c"))) # P35 T6: no macro header to snapshot snapshot = {f: open(f).read() for f in tu_files} def restore(): diff --git a/tools/sig_unify.py b/tools/sig_unify.py index 4b7266fcc4..2f00a5ac1f 100644 --- a/tools/sig_unify.py +++ b/tools/sig_unify.py @@ -199,7 +199,7 @@ def main(): help='overlay SPLIT .c the drafts target (e.g. ov_SC01_077_a.c / _o0.c); default = ' 'the main .c. Reads cur_stubs + inline/extern canonical sigs from THIS file so ' 'split-file drafts are NOT dropped (they are stubs in the split, not the main .c) ' - 'and get the def-side arity-adopt recovery. engine_core.h is always included.') + 'and get the def-side arity-adopt recovery. engine_prelude.h is always included.') ap.add_argument('--in', dest='indir', required=True) ap.add_argument('--out', dest='outdir', required=True) args = ap.parse_args() diff --git a/tools/tool_census.py b/tools/tool_census.py index 53fe1fabe3..8a7185b1c4 100644 --- a/tools/tool_census.py +++ b/tools/tool_census.py @@ -377,6 +377,59 @@ def check_corpus(recs, files): return gaps, len(copies), len(pointers) +# ---------------------------------------------------------------------------------------------------------------------------- +# The macro-form guard (Phase 35 T6). The dedup macro form (`DEFINE_func_X()` sites expanding bodies from src/shared/engine_core.h) +# is retired: every shared body is a plain-C header included at its site. A LIVE tool that still names the form in CODE (a +# non-docstring string constant — a regex, a path, a message) is a tool that would parse or write the retired form; it must be +# fixed, FROZEN (status FROZEN: its command line refuses) or retired. Comments and docstrings are the record and may say anything. +# The detectors that name the form in order to REFUSE or CENSUS it are whitelisted by name — the list is the guard's own record. +GUARD_TOKENS = ("DEFINE_func_", "engine_core.h") +GUARD_WHITELIST = { + "tools/share_census.py": "the S1 census: counts macro sites so the invariant can assert 0 (and its selftest fixture uses the form)", + "tools/macro_to_header.py": "the T4 converter, kept as share_body's library (naming, banner, alias binding) and for the record", + "tools/share_body.py": "names the form in its refusal texts", + "tools/overlay_src_split.py": "detects a macro site only to REFUSE it (R43)", + "tools/gccmap_cites.py": "a citation datum (`engine_core.h:24926`) in the codegen map's cite table", + "tools/tool_census.py": "this guard", +} + + +def macro_form_guard(files, by_path, root=REPO): + """(gaps, counts): every LIVE/STILL-NEEDED tool under `root` (FROZEN and retired excluded, the whitelist excluded) is parsed + with `ast`; a non-docstring string constant carrying a guard token is a gap. `root` is a parameter so the negative control can + point the guard at a worktree of the pre-conversion tree (R39).""" + import ast + gaps, counts = [], {"scanned": 0, "frozen": 0, "whitelisted": 0, "flagged": 0} + for f in files: + if not f.endswith(".py"): + continue + status = by_path.get(f, {}).get("status", "") + if status == "FROZEN": + counts["frozen"] += 1 + continue + if f in GUARD_WHITELIST: + counts["whitelisted"] += 1 + continue + p = root / f + if not p.exists(): + continue + try: + tree = ast.parse(p.read_text(encoding="utf-8", errors="replace")) + except SyntaxError: + continue + counts["scanned"] += 1 + docs = {ast.get_docstring(n, clean=False) for n in ast.walk(tree) + if isinstance(n, (ast.Module, ast.FunctionDef, ast.AsyncFunctionDef, ast.ClassDef))} + hits = sorted({n.lineno for n in ast.walk(tree) + if isinstance(n, ast.Constant) and isinstance(n.value, str) and n.value not in docs + and any(tok in n.value for tok in GUARD_TOKENS)}) + if hits: + counts["flagged"] += 1 + gaps.append(f"macro-form guard: LIVE tool {f} names the retired macro form in code at line(s) {hits[:6]} — fix it, " + f"freeze it (status FROZEN) or retire it") + return gaps, counts + + def main(): ap = argparse.ArgumentParser() ap.add_argument("--check", action="store_true") @@ -384,7 +437,18 @@ def main(): ap.add_argument("--corpus", action="store_true") ap.add_argument("--all", action="store_true") ap.add_argument("--consumers", metavar="FILE") + ap.add_argument("--guard-root", metavar="DIR", help="run ONLY the macro-form guard against the tools/ under DIR (the R39 negative control)") a = ap.parse_args() + if a.guard_root: + by_path = {r["path"]: r for r in read_dict()} + root = pathlib.Path(a.guard_root).resolve() + files = sorted(p.relative_to(root).as_posix() for p in (root / "tools").glob("*.py")) + g, c = macro_form_guard(files, by_path, root=root) + for x in g: + print(" GAP", x) + print(f"macro-form guard ({root}): {c['flagged']} LIVE tools reference the retired form ({c['scanned']} scanned, " + f"{c['frozen']} frozen, {c['whitelisted']} whitelisted)") + return 1 if g else 0 recs, files, retired, gaps = census() if a.consumers: rec = next((r for r in recs if r["path"] == a.consumers or r["path"].endswith("/" + a.consumers) or pathlib.Path(r["path"]).name == a.consumers), None) @@ -408,6 +472,12 @@ def main(): gaps += cg for g in cg: print(" GAP", g) + gg, gc = macro_form_guard(files, {r["path"]: r for r in read_dict()}) + gaps += gg + for g in gg: + print(" GAP", g) + print(f"macro-form guard: {gc['flagged']} LIVE tools reference the retired form ({gc['scanned']} scanned, {gc['frozen']} frozen, " + f"{gc['whitelisted']} whitelisted detectors, {len(retired)} retired)") print(f"tool_census --check: corpus {nc} copies + {npt} pointers checked; {len(gaps)} gap(s)") print("tool_census --check: OK" if not gaps else "tool_census --check: FAIL") return 1 if gaps else 0