Версия 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-RECOVERRecovery и 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