Гид SENAR: Чеклист ревью AI-вывода
ПРИМЕЧАНИЕ — Соотношение с SENAR Core
SENAR Core содержит обновлённый Чеклист верификации (28 пунктов, 3 уровня: Standard / High / Critical), который заменяет данный чеклист для команд, использующих Core.
Соответствие уровней: Tier 1 (этот гид) ≈ Standard (Базовая) (Core) | Tier 2 ≈ High | Tier 3 ≈ Critical
Данный чеклист Гида сохраняется для команд, осваивающих SENAR через Standard (командная точка входа) и ещё не перешедших на Core. Если ваша команда использует SENAR Core — применяйте Чеклист верификации из Core.
ПРИМЕЧАНИЕ — Статус этого чеклиста относительно Стандарта
Настоящий чеклист информативен. Он не является нормативным требованием на QG-3, и никакое заявление о соответствии на нём не держится.
Нормативный пол — Standard 8.4, Минимальные критерии проверки AI-вывода: пять проверок, которые ОБЯЗАНЫ выполняться на QG-3. Standard 8.4 прямо говорит, что эти критерии заменяют зависимость от настоящего чеклиста: от организации требуется выполнить пять проверок, а не принять этот документ. Само это различие нигде не было сказано там, где его увидел бы читатель этой главы, и глава читалась так, будто обязанностью является проставить галочки.
Пять критериев здесь покрыты, и вот соответствие:
Standard 8.4 (ОБЯЗАТЕЛЬНО на QG-3) Пункты настоящего чеклиста a) Проверка галлюцинаций — нет несуществующих API, методов, флагов CLI 24 b) Проверка зависимостей — импорты присутствуют в манифесте 3, 4 c) Соответствие паттернам — следование архитектуре и конвенциям проекта 6, 7, 12, 20 d) Состоятельность тестов — тесты проверяют критерии приёмки, а не только покрытие 8, 9 e) Проверка секретов — нет захардкоженных учётных данных, ключей, секретов 5, 10 Всё остальное здесь лежит выше пола и предлагается как подспорье, а не как требование. Два следствия стоит назвать прямо: прогон всех 24 пунктов сам по себе не удовлетворяет 8.4, если каждая из пяти проверок не была фактически выполнена и зафиксирована; и команда, которой этот список длинен, вправе свести его к пяти, не опустившись ниже Стандарта.
При ревью AI-сгенерированного вывода проверяйте эти специфичные для AI проблемы.
Чеклист
| # | Проверка | На что обращать внимание |
|---|---|---|
| 1 | Область изменений | AI изменил файлы за пределами области задачи? (самая частая ошибка AI) |
| 2 | Удаления | AI молча удалил или подменил существующий рабочий код? |
| 3 | Фантомные импорты | Все импортированные пакеты указаны в файле зависимостей? |
| 4 | Версии зависимостей | Указанные версии реально существуют и опубликованы? |
| 5 | Захардкоженные значения | Магические числа, URL-адреса, учётные данные, API-ключи в коде? |
| 6 | Переусложнение | Ненужные абстракции, паттерны или обобщения? |
| 7 | Дублирование | Новый код дублирует существующие утилиты? |
| 8 | Качество тестов | Тесты проверяют поведение или просто зеркалят реализацию? |
| 9 | Подмена тестов | AI изменил тесты, чтобы они прошли, вместо исправления кода? |
| 10 | Безопасность | Открытый CORS, захардкоженные токены, SQL без параметризации? |
| 11 | Крайние случаи | Основной сценарий работает — а что с null, пустым значением, граничными условиями, конкурентным доступом? |
| 12 | Именование | AI следует конвенциям именования проекта? |
| 13 | Область коммита | Коммит атомарный и сфокусированный, или свалка всего подряд? |
| 14 | Null-guard перед сравнением | None == None — это True в Python (JS: null === null — true; в большинстве языков есть аналогичные ловушки null-равенства) — проверки доступа обходятся, когда обе стороны null? |
| 15 | Обход через пустой конфиг | Проверка безопасности пропускается, когда значение конфига — пустая строка? (if secret and ... проваливается в открытое состояние) |
| 16 | Доверие заголовкам | X-Forwarded-For, X-Partner-ID, Content-Length используются для безопасности без валидации прокси? |
| 17 | IDOR | Ресурс доступен по ID без проверки прав пользователя на этот ресурс? Аутентификация != авторизация. |
| 18 | Шорткат return True | Функция контроля доступа возвращает True / предоставляет доступ без явной проверки владения? |
| 19 | Инъекция через форматирование строк | str.format(**untrusted_dict) — Python format поддерживает доступ к атрибутам, что позволяет инъекцию (JS: шаблонные литералы с eval(); C/C++: форматные строки printf; любой язык: строковая интерполяция с непроверенными данными) |
| 20 | God-функции/файлы | Функции >50 строк, файлы >400 строк — главный признак нерефакторенного AI-вывода |
| 21 | Недостижимый защитный код | return False после исчерпывающей обработки исключений — AI добавил «на всякий случай», но код никогда не выполнится |
| 22 | Проглоченные исключения | Блоки catch/except, которые отбрасывают ошибки (except Exception: pass, catch(e) {}, или логирование на уровне debug) — скрывают реальные сбои. Проверяйте возврат null/None/nil, маскирующий ошибочные состояния |
| 23 | Небезопасная десериализация | pickle.loads, yaml.load без SafeLoader, eval/exec на непроверенных данных, JSON prototype pollution? (Java: ObjectInputStream; JS: eval(JSON); любой язык: десериализация непроверенных данных без валидации) |
| 24 | Фантомные API | Существуют ли вызываемые функции, методы, поля и флаги CLI в той версии библиотеки, фреймворка или инструмента, которая используется? Отличается от пункта 3: пакет может быть в манифесте, а вызов в него — выдуман. Сигнатуры галлюцинируются охотнее, чем имена пакетов, и правдоподобная проходит ревью именно потому, что выглядит правильно, — сверяйте с документацией установленной версии или выполнением, а не с памятью |
Уровни приоритета
Уровни ниже говорят, сколько пунктов списка прогонять и когда. Они не управляют Standard 8.4: пять критериев из соответствия выше выполняются на QG-3 для каждой задачи, к какому бы уровню она ни относилась. Часть пунктов, на которых эти критерии держатся, лежит здесь на уровнях 2 и 3 — 8.4(b) на пункте 4, 8.4(c) на 6, 7, 12 и 20, 8.4(e) на 5 и 10, — и уровень говорит, когда настоящий Гид предлагает читать пункт, а не то, применяется ли критерий Стандарта.
Уровень 1 — Проверять всегда (каждая задача): Пункты 1–3 (область изменений, удаления, фантомные импорты), 24 (фантомные API) и 8–9 (качество тестов, подмена тестов). Они отлавливают самые частые и самые опасные дефекты AI. Проверка 6 пунктов занимает пару минут.
Уровень 2 — Задачи, связанные с безопасностью (авторизация, платежи, данные, API): Пункты 10 (безопасность), 14–18 (null-guard, пустой конфиг, доверие заголовкам, IDOR, return True). Они отлавливают латентные дефекты — AI-вывод, который выглядит корректно, но ломается при враждебных условиях. Выявлены через состязательный аудит продакшен-кода, сгенерированного AI.
Уровень 3 — Глубокое ревью (сложные задачи, вывод агентов): Все оставшиеся пункты (4–7, 11–13, 19–23). Применяйте при ревью сложных фич, рефакторингов или любого вывода от диспетчеризованных агентов (Rule 15 L3).
Использование
Распечатайте этот список. Используйте его на QG-2 (шлюз реализации) для каждой задачи. Со временем часть проверок станет автоматической привычкой — но держите список на виду для новых Супервайзеров.