Проверка качества живой выдачи аналогов

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 разрешён только если одновременно выполнено:

  1. complete=true;
  2. в замороженной выдаче rejected=0 и no_data=0;
  3. версия ранкера, текст контракта, JSONL и CSV сохранены рядом с итоговым отчётом.

Пустая выдача допустима: это отказ от недоказанной замены, а не способ улучшить метрику. Измерение включает только реально возвращённых кандидатов и не пересобирает их после разметки.