Вердикты качества
Каждый автономный прогон качества — миссия, которая сама тестирует продукт, —
заканчивается вердиктом: документом о том, что проверялось, что
подтвердилось, что нет и — не менее важно — что не проверялось и почему.
Эта страница объясняет, из чего состоит вердикт, как он принимается и что
человек может сделать с ним потом: отозвать или переопределить.
Что такое вердикт
Вердикт относится к одному прогону и идентифицируется его task id. Он несёт:
- Исход —
pass,failилиcould_not_verify. Последнее — настоящий
ответ, а не пожатие плечами: прогон не смог прийти к выводу (недоступный
продукт, исчерпанный бюджет) и говорит об этом вместо догадки. - Поверхности — каждая область, которую прогон должен был проверить, с
признакомran(проверялась ли вообще), покрытием, глубиной, уверенностью и
найденными аномалиями. Поверхность сran: falseне трогали; её молчание —
не «пройдено». Покрытие вида18/29означает 18 успешных проверок из 29
выполненных; неуспешные проверки попадают в аномалии, а непроведённые — в
непокрытые пробелы. - Аномалии — у каждой серьёзность, воспроизведение и
dedup_key, совпадающий
с дефектами из знаний о продукте, так что новую проблему можно отличить от
той, о которой уже сообщал прежний прогон. - Непокрытые пробелы — что не проверялось, с полем
remedy: что реально
поможет — починить продукт или его окружение, повторить (временное или
бюджетное ограничение), ничего (проверка недоступна) или решение человека. - Запись жюри — версии рубрики и промпта, голосовавшие модели, сколько
критериев решено, сколько оспорено, сколько присяжных воздержалось, плюс
калиброванная уверенность. - Привязка приёмки — остаётся ли этот вердикт текущим для своего прогона
или отозван.
Блок conformance содержит исход по каждому критерию из acceptance[].
Описание требований в product_context или перечисление объектов в
conformance_target не создаёт отдельных критериев; без acceptance[]
блока conformance нет.
Критерий, у которого target — эндпоинт ({"kind":"endpoint","ref":"POST /api/orders"}),
оценивается только по проверкам этого эндпоинта. Если его никто не проверял —
например, потому что запись в этом прогоне отключена, — критерий помечается как
невычисленный, с причиной и подсказкой, что объявить, чтобы его измерили.
Находки по другим эндпоинтам его не проваливают.
Приёмка автоматическая
Вердикт принимается в момент публикации. Шага одобрения нет: в автоматическом
потоке ответа ждёт внешняя система, и нажать кнопку некому — задержать вердикт
ради человека, который не придёт, значило бы никогда его не обработать. Вместо
этого человек получает решение постфактум — для тех прогонов, которые он
решил курировать.
Чтение вердиктов
# Последние вердикты вашего пространства имён — по одной строке-заголовку
curl -H "X-API-Key: $MOCKARTY_API_KEY" \
"http://localhost:5770/api/v1/quality/verdicts?limit=20"
# Один вердикт целиком
curl -H "X-API-Key: $MOCKARTY_API_KEY" \
"http://localhost:5770/api/v1/quality/verdicts/<taskId>"
Список отвечает {"verdicts": [...], "namespace": "...", "count": N}; в каждой
строке taskId, outcome, qualityScore, notEvaluated, current,
bindingStatus, заголовок jury и confidenceLowerBound. Если клиент прогона
объявил сборку, которую он тестировал, строка несёт ещё и
acceptedArtifactDigest — digest сборки, выведенный из коммита, чтобы
сравнить его с картиной деплоя (ниже), не открывая сам вердикт. Тел в списке
нет — читайте один вердикт, полный документ приходит под ключом verdict.
limit принимает 1–200 (по умолчанию 20); namespace по умолчанию —
пространство вызывающего.
Полный вердикт также содержит блок deployment — то же сравнение, что делает
отдельная ручка ниже, вычисленное на месте.
Этот вердикт — про то, что задеплоено?
Один запрос сравнивает сборку, за которую ручается вердикт, с кандидатом,
который сейчас задеплоен в окружение. Обе стороны — digest, выведенные из
исходного коммита, поэтому сравнение точное и не требует ручной работы:
curl -H "X-API-Key: $MOCKARTY_API_KEY" \
"http://localhost:5770/api/v1/quality/verdicts/<taskId>/deployment?environment=staging"
В ответе state, acceptedDigest (из вердикта), deployedDigest (из
принятого деплой-прогона) и deploymentRunId:
exact— задеплоенный кандидат и есть та сборка, за которую ручается
вердикт;different— задеплоено что-то другое; вердикт стоит читать как историю, а
не как описание живого окружения;unknown— последний деплой ещё выполняется или его откат не подтверждён,
принятый деплой неизвестен, вердикт не объявлял сборку либо деплой-прогоны
не журналируются на этой установке.
environment необязателен: без него сравнение опирается на последний прогон
пространства, который мог изменить окружение. Если этот прогон принят, ответ
указывает его окружение.
Отзыв вердикта (invalidate)
Отзыв фиксирует, что вердикту больше нельзя доверять. Привязка прогона
переходит в состояние «отозван», с причиной и тем, кто отозвал. Он не
отменяет то, что внешний потребитель уже получил.
curl -X POST -H "X-API-Key: $MOCKARTY_API_KEY" -H "Content-Type: application/json" \
-d '{"reason": "стенд был в середине деплоя во время прогона"}' \
"http://localhost:5770/api/v1/quality/verdicts/<taskId>/invalidate"
Причина необязательна, но записывается; ответ называет новый status и
повторяет предупреждение о том, что потребитель не уведомлён.
Переопределение вердикта (override)
Переопределение заменяет вывод решением человека. Создаётся новая ревизия
вердикта: машинная ревизия никогда не редактируется, доказательства (что
измерено) переносятся без изменений, а причина едет вместе с решением.
Проекция принятого вердикта продвигается в той же транзакции, поэтому
источник вердиктов и то, что читает остальная платформа, не могут разойтись
по одному прогону.
curl -X POST -H "X-API-Key: $MOCKARTY_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: review-2026-09-21-run-42" \
-d '{"reason": "падающая проверка бьёт по флагу, выключенному в проде", "outcome": "pass", "expectedRevision": 1}' \
"http://localhost:5770/api/v1/quality/verdicts/<taskId>/override"
reasonобязателен — переопределение без причины не является решением,
которое кто-то сможет проверить.outcomeнеобязателен (pass,fail,could_not_verify) и по умолчанию
равен текущему исходу вердикта, так что причину можно приложить, не меняя
вывод.expectedRevisionнеобязателен и по умолчанию равен текущей ревизии;
передайте его, если читали вердикт раньше и хотите получить409, когда
кто-то изменил его между делом.Idempotency-Keyделает повтор безопасным; без него ключ выводится
детерминированно. Ответ —{verdictId, namespace, revision, outcome, reason, replayed};replayed: trueзначит, что ровно это переопределение уже было
записано и ничего нового не создано.
Кто что может
Для чтения вердиктов нужна аутентифицированная сессия или API-токен с доступом
к пространству имён. Для отзыва и переопределения нужен доступ на запись в
пространство имён вердикта; любой другой вызывающий получает 403. Каждый
отзыв и каждое переопределение попадают в журнал аудита с актором и причиной.
Вердикты относятся к модулю «Автономные миссии» и следуют его лицензии.
Для агентов
Чтение и переопределение доступны и как MCP-инструменты, так что ИИ-агент
может прочитать результат прогона прежде, чем действовать, и записать
курируемое решение:
quality_verdicts_list— строки-заголовки (limit), включая
acceptedArtifactDigestкаждого прогона, объявившего сборку.quality_verdict_get— полный документ поtaskId, внутри — сравнение
deployment; читайтеsurfaces[].ranиuncovered[]раньше, чем балл.aqc_override_verdict—taskIdиreasonобязательны,outcomeи
expectedRevisionнеобязательны, семантика та же, что у REST-вызова.
Отзыв (invalidate) доступен только через REST.
Связанные страницы
- Автономные миссии
- Автономный агент
- Настройка администратора — журнал решений