qvib.pro
EN

~4 мин чтения · всем

Призмы: многоугловое независимое ревью (и когда оно вредит)

Что это

Призма (lens) — это угол независимой оценки одного артефакта от лица конкретной роли: безопасность, изоляция арендаторов, регрессии, доступность, перф, локализация, дизайн-ремесло и т.д. Ключевое: призма — не агент-исполнитель, который что-то делает, и не «стиль-персона». Её контракт узкий и проверяемый: посмотреть на готовый артефакт со своего угла и вернуть вердикт pass | warn | block плюс находки с уровнем серьёзности (info/minor/major/critical) и одно «что бы я изменил».

Артефакткод / API / UIУглы судятнезависимоСинтезвето + весаЧинится классне один инстансСдачанет criticalпере-суд · максимум 2 круга
Многоугловое ревью: независимые углы → синтез → чинится класс проблемы

В базовом движке Quest таких призм 13. Каждая несёт:

  • вопросы-линзы — чек-лист угла (у безопасности: «есть ли конкатенация ввода в SQL/шелл/HTML?», «утёк ли секрет в код/лог?», «достижим ли защищённый путь без auth?»);
  • красные линии (blockIf) — что делает вердикт block;
  • вес голоса (по умолчанию 1) и право вето.

Зачем так

Один агент, который сам написал код и сам его одобрил за один проход, — это конфликт интересов. Многоугловое ревью — встроенное недоверие: разные углы бьют по артефакту независимо (fan-out), а потом синтез сводит их голоса. Пять углов подняты в ранг вето-судей, потому что это инварианты, чья поломка дороже всего: security, tenancy (cross-tenant), gating (утечка выручки), regression, data-integrity. У них вес 2 и право вето.

Правило синтеза зашито детерминированно (и рендерится буквальным текстом в пакет, чтобы даже слабая модель его исполнила):

Любой critical у вето-призмы → общий BLOCK независимо от остальных голосов. Иначе BLOCK, если сумма весов block-голосов ≥ порога. Ничья → BLOCK (в пользу безопасности).

Worked-пример: как ловится дыра

Вход. Инженер-агент добавил роут GET /api/reports/:id, читающий отчёт по id из URL. Артефакт (code + api) уходит на фазу Review.

Что делает движок:

  1. По триггерам включаются призмы для артефактов code/api: security, tenancy, gating, regression, perf, maintainability, business. Каждая смотрит независимо, не видя вердикта соседа.
  2. Призма tenancy (роль «Архитектор данных», вес 2, вето) проходит по своим вопросам и ловит: id ресурса берётся из ввода клиента без проверки принадлежности к организации — классический IDOR, cross-tenant чтение достижимо. Её вердикт: block, severity critical.
  3. Остальные призмы вернули pass/warn.
  4. Синтез: есть critical у вето-призмы → общий вердикт BLOCK, независимо от того, что шесть других углов сказали «ок».
  5. Запускается цикл loopUntilDry: чинится класс проблемы (не только этот роут — grep всех мест, где id берётся из ввода без скоупа), затем пере-суд только затронутыми углами. Повторяется до «сухо» (нет critical/block), максимум 2 круга «ревью→фикс» (3-й деградирует — Anthropic/Cloudflare), потом стоп и отчёт владельцу с открытыми пунктами.

Результат. IDOR, который один самодовольный проход пропустил бы, пойман до прода одним независимым углом с правом вето — а не «средним мнением» команды, где голос безопасности растворился бы среди семи «в целом норм».

Когда многоугловое ревью ВРЕДИТ (честно)

Больше судей — не всегда лучше. Это подтверждает и исследовательская литература, и здравый смысл:

  • Коррелированные ошибки. Модели из одного семейства обучены на похожих данных и ошибаются одинаково. Добавить ещё один похожий угол на той же модели — часто не новая информация, а усиление общей ошибки («ловушка популярности»: консенсус закрепляет правдоподобный, но неверный ответ). Ценность призм — в разных ролях и разных вопросах, а не в количестве голосов одной модели.
  • Стоимость и задержка. Каждый угол — это токены и время. Гонять 13 призм на переименование переменной — расточительство. Поэтому призмы скоупятся по фазам и типам артефактов (a11y — только на UI, data-integrity — только на миграции), а мелкие задачи идут лёгким циклом.
  • Self-enhancement и прочие biases. LLM-судьи склонны хвалить многословное, авторитетное и «своё». Узкие проверяемые вопросы-линзы и модель серьёзности снижают это, но не убирают полностью.
  • Шум топит сигнал. Если каждый угол сыплет minor-замечаниями, критичное вето теряется. Отсюда — уровни серьёзности и порог качества: полируем не бесконечно, а до заданной планки.

Вывод: призмы сильны там, где углы действительно независимы и различны по роли, а веса/вето отражают реальную цену ошибки. На тривиальной правке или при семи одинаковых углах овчинка не стоит выделки — движок это учитывает пропорциональностью.

Честная граница

Вердикты призм сегодня — ADVISORY: модели предписано подчиниться синтезу, но нет кода возврата, который физически заблокирует сдачу при BLOCK (кроме Claude-хука на опасные команды). Сам текст призм (вопросы, красные линии, веса) сейчас поставляется plaintext и даже виден до оплаты — это осознанно. Настоящий moat — серверный per-license эндпоинт, возвращающий вердикт вместо рубрики и обновляемый централизованно, — построен: в server-bound-режиме judge/gate выносят вердикт по рубрике из призм на сервере (LLM-вердикт включается серверным ключом модели; без него — детерминированная базовая проверка с честной пометкой deterministic-fallback). Сегодня вы покупаете собранную и работающую из коробки вето-модель как дисциплину, а не секретность её текста.

Sources: