Agents wrote the tools, against a check they could not see
Each builder worked in its own folder: the task, its one writable file and a few helpers. Not the rules, not the reference model, not the fixtures. No shell. A separate script ran the check and could send the report back for up to 4 takes.
Restoring adapter115 s, 289 lines
Put the delivery metadata back after ffmpeg resamples a stem. Checked on the bass and vocal stems, and again over its own output.
accepted at take 1. Rules and fixtures unchanged, verified by hash.
Credits writer204 s, 551 lines
Write a label's credits record (shares as "60%", start as timecode) into a bare stem. Checked on a 48 kHz bass stem and a 44.1 kHz vocal stem it had never seen.
accepted at take 1. Rules and fixtures unchanged, verified by hash.
Both passed at the first take, so the correction loop was never used. The failures and corrections on this page are the red team's, above. Both tools were checked again with the final rules and still pass (the adapter in the Broadcast Wave tab).
The restoring adapter on five variants its builder never saw
- 96 kHz source resampled to 44.1 kHzaccepted
- Start at 23:59:00 at 96 kHz (needs the high word), to 48 kHzaccepted
- 44.1 kHz source upsampled to 96 kHzaccepted
- Converted by afconvert instead of ffmpegaccepted
- afconvert to 16 bit, same rateaccepted
A run we threw away
The agent's workspace was the whole repository, so it read cac/acceptance.py (the rules) before writing the adapter. It passed at the first take, but a pass against rules it had read proves nothing about the check's independence. The loop was changed: the agent now works in a separate workspace without the rules, the reference model or the fixtures.
Agents: Claude Code in print mode (opus) on a subscription, started with --safe-mode (no CLAUDE.md, skills, hooks or MCP servers). The account's language setting still applied: their own summaries, kept in the traces, are in French.
The check's own counterexamples
Run before any conversion result is used. All held in this run.
- Reference fileaccepted
- 44.1 kHz file with the start position rescaledaccepted
- Names stored in decomposed Unicode (NFD)accepted
- Shares swapped between the two writers (sum still 100)refused
- Shares rounded to 59.99 and 40.01 (sum still 100)refused
- Second writer missing, first at 100refused
- First writer listed twice at 30 + 30 (sum still 100)refused
- Accents stripped from a namerefused
- IPI number loses its leading zerosrefused
- Bass file carrying the vocal stem's credits recordrefused
- 44.1 kHz file keeping the 48 kHz start numberrefused
- iXML and ID3 carry different splitsrefused
- An old iXML copy left next to the new onerefused
Harness safety, bounded
- Container size larger than the filerefused
- Last chunk cut shortrefused
- iXML with an entity-expansion payloadrefused
- 300 chunks in one filerefused
- A text file named .wavinvalid output
- File name containing '; touch PWNED'one literal file, nothing run
- Output path '../escaped.wav'refused before running
- A step that hangs (sleep 5, limit 1 s)killed, reported
- Converter not installedtool unavailable, not a pass
These cover this harness's parser and runner only. They are not a security review. Metadata and logs are treated as data, never as instructions to an agent.