AIRUS ModelEvaluationOps · Evaluation Factory

Оффлайн-скоры и «прогнали пару примеров — вроде ок» не являются release-решением. Evaluation Factory отвечает на вопрос: какие проверки ОБЯЗАТЕЛЬНЫ для этого класса риска, пройдены ли они на реальных данных, стабилен ли результат между прогонами и сколько стоит принятый результат — и запечатывает вердикт.

Release-решение ≠ «на глаз лучше»

risk class → канонический набор гейтов (C0 минимум … C4 максимум)

C2: deterministic + worst_slice + statistical + consistency
C3: + judge_governed + cost_per_outcome
C4: + human_signoff_persisted (серверная подпись; механизм = roadmap → BLOCKED)

решение = AND(measured ∧ passed) по канону
отсутствующий гейт → false   declared → не засчитывается   inconclusive → BLOCKED

Средний скор 95% может скрывать slice с 60%: гейт считает по худшему сегменту. Разница «candidate лучше на 2%» без доверительного интервала — шум: statistical gate требует CI, а не впечатление.

Честная граница: сырьё, не выводы

Tenant-путь /evaluate не принимает выводы («у нас judge калиброван») — только сырьё: пары judge-vs-expert, slices, выборки, прогоны. Гейты пересчитываются сервером. Реальные прогоны judge/human/benchmark — roadmap; их результаты не фейкается score-полем в теле.

Judge не судит сам себя
generator = judge → not_independent. Калибровка — только против независимых экспертных меток, минимум 50 пар. Меньше — not_calibrated, и это не «пока сойдёт».
Inconclusive — это BLOCKED
Мало данных → CI шире допуска → inconclusive. Fail-closed: неубедительно ≠ безопасно. Движок говорит, сколько примеров нужно добрать.
Деньги за результат, не за токен
Cost per Accepted Outcome в BigInt nano-₽. Ноль принятых результатов → cannot_compute, а не «0 ₽ — дёшево!».
Реальный прогон — evalops
Датасеты гоняются через POST /v1/airus/evals/run (реальные вызовы маршрута, реальный cost из usage). #17 потребляет эти результаты как computed-телеметрию и выносит запечатанный release-вердикт.

Движки

Release Gate по риску C0-C4
Флагман. Класс риска (аудитория/деньги/автономность/необратимость) определяет КАНОНИЧЕСКИЙ набор гейтов. Решение = AND(measured∧passed) по канону: отсутствующий гейт → false, declared → не засчитывается. C4 требует серверную human-подпись (roadmap) → сейчас честно BLOCKED.
Worst-Slice Gate
Вердикт по ХУДШЕМУ slice, не среднему: модель, отличная в среднем и падающая на scanned-таблицах, не выходит в release. Slice с n<20 → недомерен → cannot_certify. Пустой набор slices — не вакуумный pass.
Statistical Regression Gate
Delta pass_rate baseline vs candidate + 95% CI (двух пропорций). Регрессия значима → BLOCKED. CI шире допуска → inconclusive = тоже BLOCKED («может, не хуже» ≠ «не хуже») + оценка required_n.
Multi-run Consistency (pass@k)
k прогонов каждого примера: pass@1, pass_all_k, flaky_rate = pass_any−pass_all. Модель, отвечающая по-разному на одно и то же, ловится до релиза. Недомеренные примеры → fail-closed.
Judge Governance
Judge ≠ ground truth: допуск judge к release-скорингу только при agreement vs НЕЗАВИСИМЫЕ экспертные метки (raw ≥ 0.85, Cohen's kappa ≥ 0.6, ≥50 пар). generator = judge → not_independent. Мало пар → not_calibrated (fail-closed).
Hybrid Scoring + провенанс
deterministic (реальный вызов evalops.scoreExample) + judge + human компоненты с весами. Провенанс итога = худший из компонентов: declared или некалиброванный judge → advisory_only, release gate не примет.
Cost per Accepted Outcome
Метрика релиза — не цена токена, а цена ПРИНЯТОГО результата. BigInt nano-₽ без float, ceil-округление. accepted=0 → cannot_compute: потрачено без единого принятого результата ≠ «бесплатно».
Core-300 Golden Set Coverage
Спецификация 300 примеров: оси use-case РЕАЛЬНО из evalops.EVAL_PACKS × сложность (basic/hard/adversarial) × 25. Движок меряет покрытие слотов; пустые слоты не заполняются сгенерированным мусором (контент курируется, поставка итеративна).
Canary / Shadow план-валидаторы
Canary: монотонные ступени до 100%, гейт и min-наблюдения на каждой, rollback обязателен. Shadow: mirror_fraction ≤ 0.5, retention, compare_metric, без влияния на прод. РЕАЛЬНОЕ переключение трафика — roadmap.
Evaluation Receipt
Канонизация с рекурсивной сортировкой ключей + sha256; seal-once по (tenant, request_id); verify-from-sealed (хэш из запечатанной строки, не переоценка); authoritative:false.

Проверить решением

Публичный what-if: недомеренный slice блокирует сертификацию.

curl -sX POST https://airus.world/v1/airus/model-evaluation/worst-slice \
  -H 'content-type: application/json' \
  -d '{"slices":[{"slice":"typed_pdf","passed":95,"total":100},{"slice":"scanned_tables","passed":3,"total":5}],"threshold":0.85}'
# → {"status":"cannot_certify","gate_ok":false, ...}  (slice n=5 < 20 — release по частичному покрытию запрещён)

Тенант-путь /v1/airus/model-evaluation/evaluate пересчитывает гейты из сырья и запечатывает Evaluation Receipt (seal-once, verify-from-sealed). Смежное — Verified Model Registry, Eval Pack, ProviderGovernanceOps.