Repo survey: litter, and a log nobody can read

Asked what else was worth rethinking. Four things, and only the last is architectural.

133 hidden files, half a megabyte, in src/shaders. .fuse_hidden* - what the VM's mount leaves behind when a file is deleted while still open, which is what regenerating the shaders does. Named with a leading dot, so ls never showed them and nothing in .gitignore covered them. Deleted and ignored.

A three-megabyte report in the repository root. obscene-report.txt, the only file in the root that nothing covered. Ignored now.

Credit where due: .gitignore already handled the rest - display.png, tool/target, reports/, and the _TempData/_Textures/_DownloadData litter loaders drop when run from here. The gaps were the two that were invisible.

DECISIONS.md is 155 entries over 5,337 lines with no index, and CLAUDE.md says to read it at the start of every session. Nobody reads that; they grep it, which only works if you already know the word - and the entries most worth finding are the ones you do not know exist. scripts/gen-decision-index.py now generates one from the entries themselves, so it cannot disagree with the log, and verify.sh fails when it drifts. Titles are read from whichever style an entry uses: the heading for the early ones, the first bold claim for the later ones.

Two things fell out of building it: