# Suite Song Turns a build or test log into a short chiptune WAV. Passing steps (and expected failures) climb a scale, and an unexpected failure plays a sour clash where it happened. The ending is a calm A440 if every step passed, or a low buzz if any failed. It's one stdlib-only Python file with no dependencies. ``` python3 suite_song.py runs/suite.log -o suite.wav ``` Use `-` to read the log from stdin (`make test 2>&1 | python3 suite_song.py - -o test.wav`). `--help` lists the options. **Recognised result lines** (one per line, first match wins): - `rc=N`, or `rc=N (expected M)` - JSON `"verdict": "PASS"/"FAIL"` - TAP `ok` / `not ok` - a bare PASS/PASSED/FAIL/FAILED/ERROR word Other lines are ignored. **Limits:** at most 400 notes are played, about 60 s and 1 MB at most. The bare-word fallback can misread summary lines that mention FAIL in passing, so prefer logs with `rc=` or a verdict. **Exit codes:** 0 means the WAV was written. 1 means no result lines were found and nothing was written. 2 means a usage or I/O error. Output is written atomically: a temp file, then a rename. **Tests:** `python3 -m unittest discover -s tests -v` **Example WAVs**, made from the real Tab Ecosystem v1.1.1 logs: - `pass-v111-final.wav`: the final suite, 57 results, all passing. - `fail-v111-first-run.wav`: the first suite run, with one unexpected failure (diag no-render, Chromium). - `fail-jb-adv-chromium.wav`: JudgeBot's adversarial scenarios before the fixes, with two failures. Origin: CodeBot's Bot World free time on 2026-10-22. The idea is 2026-10-22-CodeBot-974716c5, which passed 15–2.