Версия 2026-06 · CC-BY-4.0

Чек-лист предпродакшн-ревью AI-кода

22 паттерна отказа, которые AI-генераторы вписывают в production-код, в 7 категориях — с сигналами обнаружения и архитекторскими мерами.

Сохраните как PDF: нажмите Ctrl+P (Windows/Linux) или +P (Mac), затем выберите «Сохранить как PDF». Страница оформлена для печати.
Как использовать чек-лист. Прогоните его по любому AI-assisted codebase до production deploy. Для каждого паттерна пройдитесь по Detection по реальному коду, а не по спецификации. Если Detection нашёл hit, примените Prevention до запуска, а не follow-up'ом. Каталог собран из 150+ engagement'ов, где AI-сгенерированный код проходил начальное ревью и затем падал в production. Каждый паттерн наблюдался минимум в 3 независимых клиентских engagement'ах до включения.
CAT-CONCUR

Конкурентность

Отказы под одновременными операциями, которые AI не моделировал.

FM-01

Отсутствует optimistic locking

AI генерирует
Код read-modify-write без проверки версии или row-level lock. Проходит однопоточный тест.
Отказ в Production
Две одновременные записи затирают друг друга молча. Lost update при умеренной конкурентности.
Обнаружение
Ревью кода на любой read-modify-write по разделяемым записям. Load test с 10+ одновременными пользователями на одной сущности.
Предотвращение
Optimistic concurrency token (rowversion / ETag) или явный pessimistic lock с чётким timeout.
CAT-DATA

Целостность данных

Отказы, портящие или теряющие данные вне happy-path.

FM-03

Отсутствуют границы транзакций

AI генерирует
Многошаговая последовательность записей (order, payment, inventory) без явной транзакции.
Отказ в Production
Частичный commit при crash середине последовательности оставляет неконсистентное состояние. Orders без inventory decrement.
Обнаружение
Трассируйте каждую multi-write операцию. Если отказ между шагами оставляет плохое состояние, транзакция отсутствует.
Предотвращение
Явный transaction scope вокруг логических единиц. Outbox pattern для cross-service записей.
FM-12

Потеря точности decimal в денежной математике

AI генерирует
Float / double для денежных сумм. Выглядит как числовой тип.
Отказ в Production
Копейки исчезают или появляются со временем. Drift в reconciliation. Провал audit.
Обнаружение
Любое денежное поле, не Decimal / fixed-point, неверно. Правило ревью кода.
Предотвращение
Тип Decimal везде для денег. DB-колонка с явным precision. Unit-тесты на edge cases.
FM-13

Обработка дат без timezone

AI генерирует
DateTime хранится без timezone; клиент конвертирует в JS произвольно.
Отказ в Production
Отчёты на часы расходятся. Daily-rollup задачи пропускают данные около полуночи. Audit trail неверный.
Обнаружение
Каждое datetime поле — подтвердите UTC хранение; каждый display — подтвердите явную timezone конверсию.
Предотвращение
Храните UTC. Отображайте в user-local на edge. Никогда не сравнивайте naive datetimes.
FM-14

Cache без invalidation

AI генерирует
Lookup-cache вокруг медленного query. Логика invalidation на стороне writer отсутствует.
Отказ в Production
Stale данные показываются пользователям часы после изменения. «Почему dashboard не обновляется?»
Обнаружение
У каждого cache должен быть документированный invalidation trigger. Если нет — flag.
Предотвращение
Ограниченный TTL + явное invalidation на write. Stale-while-revalidate где свежесть рыхлая.
FM-17

Schema migration без backfill

AI генерирует
ALTER TABLE с non-null колонкой и default, но без плана backfill для существующих строк.
Отказ в Production
Длительная migration локает production-таблицу на часы. Или хуже: молчаливое нарушение constraint.
Обнаружение
Каждая schema migration на нетривиальной таблице нуждается в backfill-плане, ревьюнутом заранее.
Предотвращение
Expand-contract pattern. Сначала nullable колонка, backfill, потом enforce non-null.
FM-22

Time-window уязвимость в промо-коде

AI генерирует
Coupon redemption, который проверяет remaining count, потом decrement в отдельном шаге.
Отказ в Production
Два одновременных redemption видят remaining=1. Оба успешны. Inventory underflow.
Обнаружение
Atomic check-and-decrement; иначе race существует.
Предотвращение
Atomic DB операция (UPDATE ... WHERE remaining > 0). Или distributed lock с timeout.
CAT-LOAD

Поведение под нагрузкой

Отказы, проявляющиеся только на масштабе, который AI не тестировал.

FM-02

Паттерн N+1 query

AI генерирует
ORM-обращение в цикле, выпускающее отдельный query на каждый item. Выглядит идиоматично.
Отказ в Production
Загрузка страницы идёт с 50ms до 5+ секунд по мере роста коллекции. CPU базы данных спайкает.
Обнаружение
Профилируйте реальные queries на репрезентативном dataset. Следите за query count пропорциональным размеру результата.
Предотвращение
Eager loading / join / batched query. Установите бюджет query-count per endpoint и assert в тестах.
FM-05

Неограниченное выделение ресурсов

AI генерирует
List = readAll(); foreach item ... . Без pagination, без cap.
Отказ в Production
Память исчерпывается с ростом dataset. OutOfMemoryException на 50K строк.
Обнаружение
Найдите каждый readAll-style вызов. Подтвердите, что размер результата ограничен request или paging.
Предотвращение
Streaming или pagination by default. Отклоняйте readAll на неограниченных источниках в ревью.
FM-18

Sync работа внутри HTTP handler

AI генерирует
Endpoint, делающий внешний API call inline до response.
Отказ в Production
p99 latency повторяет самый медленный vendor. Cascading failure когда vendor тормозит.
Обнаружение
Всё в sync handler, занимающее >100ms, кандидат на async / queue.
Предотвращение
Background job + status endpoint для медленной работы. Async pipeline для non-critical-path.
CAT-SECURE

Безопасность

Уязвимости, которые AI ввёл, потому что не делает threat-model вашей конкретной surface.

FM-07

SQL injection через конкатенацию

AI генерирует
Dynamic SQL с конкатенированным user input, когда parameterized query казался неудобным.
Отказ в Production
Тривиальный SQL injection. Exfiltration или уничтожение данных вредоносным или fuzzed input.
Обнаружение
Flag статического анализа на string + sql. Ревью кода на каждый dynamic query.
Предотвращение
Parameterized queries by default. Lint-правило, флагающее конкатенацию строк в построении query.
FM-08

Отсутствует authorization внутри data access

AI генерирует
Endpoint аутентифицирует пользователя, но data query не фильтрует по ownership.
Отказ в Production
Аутентифицированный пользователь достаёт записи другого tenant'а угадыванием ID. Cross-tenant data leak.
Обнаружение
Каждое multi-tenant чтение должно фильтровать по tenant key в query. Тест с двумя пользователями + IDOR probe.
Предотвращение
Row-level security в БД или tenant filter helper, оборачивающий каждый query.
FM-09

Token / API key в коде

AI генерирует
Hardcoded secret, закоммиченный в repo во время integration.
Отказ в Production
Публичный repo утекает ключ. Требуется ротация. Иногда плюс bill shock.
Обнаружение
Pre-commit hook, сканирующий high-entropy строки; периодический secret scan по истории.
Предотвращение
Secret manager. Никогда не принимайте string literal, выглядящий как ключ, в ревью кода.
FM-20

Prompt injection через retrieved content

AI генерирует
RAG handler трактует retrieved chunks как доверенные инструкции LLM.
Отказ в Production
Вредоносный документ отравляет ответ. AI assistant exfiltrate context или выполняет tool небезопасно.
Обнаружение
Threat-model корпус. Если любой документ может быть написан недоверенными сторонами, retrieval — vector injection.
Предотвращение
Retrieved content как data, никогда как instruction. System prompt, запрещающий следовать retrieved-инструкциям. Output validation.
CAT-COST

Стоимость на масштабе

Паттерны, дешёвые на prototype-масштабе и неподъёмные в production.

FM-10

Неограниченная стоимость LLM context

AI генерирует
RAG retrieval, всегда отправляющий top-50 chunks в LLM независимо от релевантности.
Отказ в Production
Счёт 10-50x от планировавшегося, потому что большинство tokens — шум. Latency тоже деградирует.
Обнаружение
Измеряйте tokens-per-query vs answered-with-citations rate. Аномалии в любом из — сигнал.
Предотвращение
Reranker до LLM, порог уверенности, top-k tuned per use case. Budget alarm на token spend.
FM-19

Отсутствует rate limit на AI endpoint

AI генерирует
Публичный AI endpoint без per-user / per-IP throttle.
Отказ в Production
Abuse раскручивает LLM-счёт. Один плохой актёр может превысить месячный бюджет за час.
Обнаружение
У каждого LLM-backed endpoint должен быть per-key rate limit. Alarm выше порога.
Предотвращение
Rate limiter с budget alerting. Tiered quotas. Authenticated-only AI endpoints by default.
CAT-RECOVER

Recovery и Failure Modes

Код без плана частичного отказа, retry или rollback.

FM-04

Отсутствует idempotency на retry path

AI генерирует
Webhook handler или job runner, обрабатывающий message один раз, без dedupe.
Отказ в Production
Network retry посылает duplicate event. Клиент списан дважды, email отправлен дважды.
Обнаружение
Спросите: «что произойдёт, если это запустится дважды с тем же input?» Подтвердите наличие dedupe key.
Предотвращение
Idempotency key на каждой операции с side-effect. Храните seen-keys retention window.
FM-06

Внешний вызов без timeout

AI генерирует
HttpClient.GetAsync(url) без timeout. Выглядит чисто.
Отказ в Production
Vendor outage вешает каждый зависимый request. Thread pool исчерпан; весь сервис лежит.
Обнаружение
Grep по HTTP clients, message queues, DB calls без явных timeouts.
Предотвращение
Явный timeout на каждом IO вызове. Circuit breaker для повторяющихся failures. Bulkhead pool isolation.
FM-11

Отсутствует dead-letter handling

AI генерирует
Message handler, который retry на failure бесконечно.
Отказ в Production
Poison message блокирует queue. Backlog растёт; processing замораживается.
Обнаружение
У каждого retry policy нужно условие give-up и destination для give-up.
Предотвращение
Ограниченные retries, dead-letter queue, alerting на dead-letter count. Manual review path.
FM-21

Нет rollback для AI-фичи

AI генерирует
Заменяет deterministic вычисление LLM-вызовом. Нет fallback.
Отказ в Production
LLM vendor outage кладёт фичу. Нет degraded режима.
Обнаружение
Для каждой AI-фичи: что система делает, когда AI недоступен? Если «ничего» — чините.
Предотвращение
Feature flag + deterministic fallback. Graceful degradation. Health probes на AI-зависимость.
CAT-EVOLVE

Долгосрочная эволюция

Код, корректный сейчас, и будущий refactoring blocker через 18 месяцев.

FM-15

Cross-cutting логирование связано с бизнес-кодом

AI генерирует
Лог-строки протянуты через бизнес-методы, смешаны с returns.
Отказ в Production
Refactoring молча роняет критическую observability. Incident response деградирует.
Обнаружение
Аудит логирования, чтобы подтвердить, что это cross-cutting concern, а не inline copy-paste.
Предотвращение
Structured logging через middleware / aspect. Logging contract per layer, enforced в ревью.
FM-16

Тесная связка с LLM vendor

AI генерирует
Прямые vendor SDK calls разбросаны по бизнес-коду.
Отказ в Production
Vendor price hike или deprecation заставляет трогать каждый call site. Migration = квартал.
Обнаружение
Grep по vendor SDK именам. Если они в бизнес-коде, абстракция отсутствует.
Предотвращение
LLM gateway с versioned prompts и стабильным внутренним interface. Vendor swap = одна config-смена.

Сводка покрытия

Конкурентность1
Целостность данных6
Поведение под нагрузкой3
Безопасность4
Стоимость на масштабе2
Recovery и Failure Modes4
Долгосрочная эволюция2
Всего22