Проверка качества живой выдачи аналогов
analog-quality-eval сверяет все пары из замороженного JSONL-ответа с
парной разметкой. Это read-only инструмент: он не ходит в базу, в LLM и в
внешние карточки.
cd backend
go run ./cmd/analog-quality-eval \
--responses ../docs/superpowers/handoffs/data/<snapshot>.jsonl \
--labels ../docs/superpowers/handoffs/data/<labels>.csv \
--require-release-readyОтчёт всегда содержит четыре разных величины:
allowed_among_labelled— доля допустимых только среди уже размеченных пар;allowed_lower_bound— допустимые среди всех возвращённых пар, пока неразмеченные считаются неизвестными;unlabelled— число пар, которые вернула система, но которых нет в эталоне;complete— все ли пары вообще размечены;critical_rejected— число опасных инженерных замен в живой выдаче;release_ready— одновременноcomplete=true,rejected=0иno_data=0.critical_rejectedостаётся отдельной диагностикой тяжести.
--require-complete завершает процесс с кодом 1, когда unlabelled > 0.
--require-release-ready дополнительно завершает процесс с кодом 1, когда
rejected > 0 либо no_data > 0: неизвестная инженерная совместимость и
вернувшийся не-аналог не являются допустимой заменой. В режиме выпуска ему нужна
колонка ТЯЖЕСТЬ: у каждого недопустим она обязана быть критично или
некритично. При неготовом исходе allowed_among_labelled запрещено называть
precision@5 или использовать для решения о выпуске: нужно разметить именно
отсутствующие пары и повторить запуск на том же снапшоте.
Ошибки чтения снапшота и разметки возвращаются как структурированные
validation.unclassified с безопасными деталями (например, номером строки или
именем отсутствующей колонки); это позволяет CI и оператору различать неверный
вход от сбоя самого гейта.
Выпуск MCB разрешён только если одновременно выполнено:
complete=true;- в замороженной выдаче
rejected=0иno_data=0; - версия ранкера, текст контракта, JSONL и CSV сохранены рядом с итоговым отчётом.
Пустая выдача допустима: это отказ от недоказанной замены, а не способ улучшить метрику. Измерение включает только реально возвращённых кандидатов и не пересобирает их после разметки.