chore(exclude): promote the wave exclude list to config/wave_exclude.txt

There were NINE session-snapshot copies under .run/ and no way to tell which was
current — the accumulation smell behind the whole staleness problem. This is the one,
it is tracked, and it is regenerated rather than hand-edited.

.run/ is gitignored scratch, which is the wrong home for it: CARVE-BLOCKED entries are
derived and vanish when the subseg is split, but WALL entries are CURATED and cannot be
re-derived — that is precisely why the file needs to be tracked.
This commit is contained in:
Drew T
2026-09-02 14:39:09 -06:00
parent 983df054f2
commit 4f66709ade
2 changed files with 18 additions and 6 deletions
@@ -1,7 +1,19 @@
# regenerated by tools/exclude_audit.py from .run/S71_exclude.txt
# 19 still-valid of 107; 88 dropped as stale (banked / linked / blocker-since-fixed).
# An exclude list records what the TOOLING could not do — regenerate it as
# part of every tool fix, or it becomes a list of work you decided not to do.
# config/wave_exclude.txt — THE canonical wave exclude list. (P31 S72)
#
# There were NINE session-snapshot copies of this under .run/ and no way to tell which was current;
# this is the one, it is TRACKED, and it is regenerated rather than hand-edited:
#
# tools/exclude_audit.py config/wave_exclude.txt --write config/wave_exclude.txt.new
#
# `draw_waves --exclude-file config/wave_exclude.txt` AUDITS it first and REFUSES to draw if any
# entry is stale (--exclude-stale-ok overrides, loudly). Regenerate as part of every tool fix: an
# exclude list records what the TOOLING could not do, and becomes a list of work you decided not
# to do the moment the tooling improves. Measured on its predecessor one day after it was written:
# 88 of 107 entries stale, 46 of them open drawable functions totalling 12,750 instructions.
#
# CARVE-BLOCKED entries are DERIVED (tools/split_indicator.py) and disappear when the subseg is
# split. WALL entries are CURATED — they cannot be re-derived, so they are the reason this file is
# tracked; each should carry the refutation list that would have to be beaten to reopen it.
main:func_8005D9C4 # WALL: no jump table — curated compiler fact, not a tooling limit
main:func_8005ECC0 # WALL: no jump table — curated compiler fact, not a tooling limit
main:func_80062144 # WALL: no jump table — curated compiler fact, not a tooling limit
+2 -2
View File
@@ -34,7 +34,7 @@ python3 tools/draw_waves.py --only-main --prefix .run/<name>m_ --waves 1 --per-w
* **`--prefix` IS A RELATIVE PATH.** `--prefix s67o` writes `./s67o1/` into the repo root, not
`.run/`. Always pass `.run/<name>_`.
* **THE EXCLUDE LIST IS AUDITED BEFORE THE DRAW, AND A STALE ONE IS REFUSED (P31 S72).** Pass it as
`--exclude-file .run/<name>_exclude.txt`; `draw_waves` classifies every entry against the CURRENT
`--exclude-file config/wave_exclude.txt`; `draw_waves` classifies every entry against the CURRENT
tooling and **exits non-zero** if any is stale, naming the count and the regenerate command.
`--exclude-stale-ok` still draws, but prints what it is ignoring — skipping is possible, never
silent. Regenerate with `tools/exclude_audit.py <old> --write <new>`.
@@ -43,7 +43,7 @@ python3 tools/draw_waves.py --only-main --prefix .run/<name>m_ --waves 1 --per-w
> — 28 already banked, 14 linked PsyQ symbols that were never targets, and **46 whose blocker had
> since been fixed**. Those 46 are **12,750 instructions of open, drawable work**, including
> `main:SaveLoadRoutine` (1,165), the largest function left in main. A list that filters them out
> costs more than it saves. Current list: **`.run/S72_exclude.txt` (19 entries)**.
> costs more than it saves. Current list: **`config/wave_exclude.txt` (19 entries)**.
* **The exclude list is not optional.** It carries two populations that no model can bank:
* **96 jtbl functions whose carve plan `build_carve` REFUSES** (non-contiguous same-subseg