Судья — внешняя команда: читает промпт со stdin, печатает только JSON
{"cls": "SUPPORTED|CONTRADICTED|INSUFFICIENT", "span": "<дословная цитата>"} в stdout.
Главное правило — декорреляция: судья из ДРУГОГО семейства моделей, чем то, что пишет вики. Вики пишет Claude → судья OpenAI/Gemini/локальная модель, не Claude.
judge-codex.sh— OpenAI codex CLI. Проверена в бою. Грабли: без--output-last-message(-o) codex эхает промпт в stdout, и жадный regex-парсер notary.py ловит{скобки}из промпта вместо ответа.
export TL_JUDGE_CMD=/полный/путь/к/scripts/judges/judge-codex.sh
export TL_JUDGE_K=5 # голосов на утверждение (дефолт 5; 3 — быстрее и дешевле)
python notary.py verify-allecho 'Фрагмент: "дважды два - четыре". Утверждение: "2*2=4". Ответь JSON {"cls":...,"span":...}' | $TL_JUDGE_CMDПустой вывод или не-JSON = судья мёртв (квота провайдера, слетевший логин, сломанная
обёртка). verify-all сам делает такой смоук-тест перед прогоном и откажется стартовать
с мёртвым судьёй — иначе весь прогон уходит в бессмысленный INSUFFICIENT.
Контракт минимальный: stdin → stdout-JSON, ничего лишнего в stdout. Всё остальное (таймауты, ретраи, модель) — внутри обёртки. Сбойный голос (таймаут, мусор) notary.py не кэширует: временный сбой сети не застынет как вердикт.