The recipe with the most moving parts was the only one with no standing
check, and it spent a month delivering its digest onto branches nobody
merged. Six assertions, ordered by what they would have caught:
1. analysis.md is on the vault's DEFAULT branch — the defect itself
2. harvest.jsonl carries the triage fields on every line
3. evidence scores span more than patterns::SATURATED_BELOW — the
saturation guard, live on a real harvest rather than a fixture
4. analysis.md names every harvested paper id
5. episode.json has a title and highlights within 10-70 chars — the
recipe's own done_when, checked independently of the judge
6. audio rendered, distinguishing three outcomes a single boolean would
have collapsed: no row at all, an `unrenderable` tombstone, and a
real episode with a non-zero duration
CLAWMATES_SKIP_AUDIO=1 skips 6, because it spends ElevenLabs credits and
a run about the merge should not have to.
Both blobs go to disk before comparison rather than through nested
quoting — the rolepolicy assertion already reported an empty record for a
correct one that way.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01WZb5A2kfVfjpdwSochkuHz