Это конспект вебинара. Спикер — Даниил Степанов, разработчик‑исследователь Veai, преподаватель ИТМО, ранее работал в JetBrains и Huawei.

AI уже пишет заметную часть промышленного кода, а процессы качества у многих команд остались такими, будто код всё ещё пишет только человек и в прежнем объёме.

Если коротко: проблема чаще всего не в том, что «модель тупая». Проблема в том, что вокруг агента нет инженерного контура: спецификации, ограничений, независимых тестов, security‑checks, ревью‑пайплайна и артефактов, которым можно верить.

AI
Качество кода в эпоху AI: как не утонуть в багах и уязвимостях 2026 Veai

Качество кода в эпоху AI: как не утонуть в багах и уязвимостях 2026 Veai

TL;DR

  • AI‑кодинг уже стал массовой практикой, а не экспериментом энтузиастов. На это указывают JetBrains Developer Ecosystem, Stack Overflow Developer Survey, GitHub Octoverse и исследования DORA/Faros AI: разработчики активно используют AI‑ассистентов, а доля AI‑generated кода в промышленной разработке быстро растёт.

  • Рынок обещал «AI скоро напишет весь код», но исследования показывают более жёсткую картину: первые внедрения могут снижать продуктивность, раздувать PR и переносить узкое место в ревью, сопровождение и безопасность.

  • AI‑дефекты сложнее ловить, потому что ошибка может появиться на любом шаге цепочки: понимание задачи, план, tool‑call, API, изменение кода, проверка.

  • Типичный паттерн новичка: «задача в чате → LLM генерирует код → баги и регрессии → LLM пустой хайп».

  • Лечится это не магическим промптом, а пайплайном: SDD, TDD, линтеры, SAST/SCA/DAST, fuzzing, property‑based testing, AI‑review и triage.

  • Спецификация нужна не для бюрократии. Она не даёт агенту додумывать бизнес‑логику и ограничения за вас.

  • Один агент не должен одновременно писать тесты, реализацию и ревьюить сам себя. Роли нужно разводить.

  • AI‑review работает лучше как набор узких ревьюеров: security, architecture, tests, spec‑compliance, performance. Потом отдельный triage должен проверять каждую находку.

  • Любое утверждение LLM должно подтверждаться артефактом: логом тестов, отчётом анализатора, coverage diff, профилем, метрикой.

Исследования и отчёты, на которые можно опереться по рынку и качеству AI‑кода:

  • JetBrains Developer Ecosystem 2025 — ежегодный обзор практик разработчиков, включая использование AI‑инструментов.

  • Stack Overflow Developer Survey 2025: AI — отношение разработчиков к AI‑инструментам, доверие и сценарии применения.

  • GitHub Octoverse — динамика разработки на GitHub и роль AI/Copilot в экосистеме.

  • DORA research — исследования инженерной эффективности, delivery performance и влияния практик разработки.

  • arXiv:2605.06464 — работа, на которую ссылается презентация в части уязвимостей и сопровождения AI‑кода.

  • arXiv:2511.04427 — работа, на которую ссылается презентация в части роста цикломатической сложности.

Видео запись вебинара:

Контекст: AI‑кода стало много

На слайдах вебинара были такие вводные:

Что измеряли

Цифра

Разработчики, регулярно использующие ≥ 1 AI‑инструмент на работе

90%

Используют специализированные AI‑dev tools, а не только чаты

74%

Новый промышленный код, создаваемый AI‑ассистентами

20%

Awareness GitHub Copilot

76%

Awareness Cursor

69%

Awareness Claude Code

57%

Рынок при этом любит громкие обещания. В презентации отдельно собрали публичные прогнозы: «90% кода через 3–6 месяцев», «AI как mid‑level инженер», «никому больше не нужно программировать».

А затем показали вторую таблицу, уже не про ожидания, а про измерения:

Что измерили

Цифра

Источник из презентации

Изменение продуктивности в первый год внедрения

-15%

DORA research / Faros AI, 2026

Время PR‑ревью в AI‑командах

+441% YoY

DORA research / Faros AI, 2026

Уязвимостей в AI‑коде

+23,7%

arXiv:2605.06464, 2026

AI пишет код, но сопровождают его люди

83%

arXiv:2605.06464, 2026

Увеличение цикломатической сложности

+41%

arXiv:2511.04427, 2025

И вот это уже похоже на реальность многих команд: код появляется быстрее, но сопровождение, ревью, исправления и безопасность никуда не исчезают.

Главная мысль вебинара

Проблема чаще всего не в агентах, а в процессе.

Типичный сценарий внедрения выглядит так:

Шаг

Что происходит

Чем заканчивается

1

Разработчик пишет задачу в чат

Контекст неполный

2

LLM генерирует код

Код выглядит убедительно

3

Разработчик бегло смотрит diff

Часть ошибок не видна глазами

4

Тестов нет или их написал тот же агент

Проверяется реализация, а не требование

5

В прод уезжают баги, регрессии, уязвимости

Команда решает, что «LLM пустой хайп»

На самом деле вывод другой: AI‑разработка требует другого контура качества.

Почему AI‑дефекты сложнее ловить

Обычный баг часто локален: человек ошибся в условии, забыл null‑check, перепутал поле. AI‑баг может быть распределён по цепочке.

Агент сначала чуть неправильно понял задачу. Потом построил логичный план. Потом нашёл похожий API, но не тот. Потом написал стилистически чистый код. Потом сам же написал тест, который подтверждает его решение. В каждом отдельном месте всё выглядит почти нормально.

Причина

Что это значит на практике

Ошибка распределена по цепочке

Неверное требование, план и код по отдельности могут выглядеть разумно

Код стилистически гладкий

Меньше визуального шума, ревьюер расслабляется

Дефект маскируется под намерение

Кажется, что автор специально так решил

Проверки тоже могут быть сгенерированы

Тест подтверждает код, а не бизнес‑требование

Масштаб diff больше

Баг проявляется на стыке файлов и модулей

Агент уверенно отчитывается

«Тесты прошли» может означать «я так думаю»

Отсюда практический вывод: ревью AI‑кода не может ограничиваться просмотром diff. Нужно проверять требование, план, тесты, зависимости, security, конфигурацию и фактические артефакты запуска.

AI   API

Где именно ломается агент

В презентации ошибки разложили по этапам агентской цепочки.

Этап

Что ломается

Как выглядит в проекте

Понимание задачи

Несовпадение с намерением

Реализовано «похоже», но не тот бизнес‑смысл

Рассуждение и цели

Нарушение плана, смещение цели

Агент начал чинить авторизацию, а переписал весь модуль

Инструменты и API

Неверные параметры, устаревшие методы

Метод выглядит правдоподобно, но его нет

Состояние и среда

Не тот файл, ветка, вывод команды

Агент работает с устаревшим контекстом

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

SQLi, SSRF, prompt injection, секреты

Код выглядит чисто, но нарушает границы доверия

Верификация

Проверка не запускалась или была подогнана

«Тесты зелёные», но логов нет

Разберём самые болезненные классы.

Ошибка 1. Агент понял слова, но не понял смысл

Разработчик обычно говорит с другим разработчиком поверх огромного слоя неявного контекста: домен, архитектура, старые решения, внутренние правила, ограничения безопасности, привычки команды.

Модель без этого слоя действует буквально. Если попросить «добавь endpoint баланса», она может сделать endpoint, который возвращает баланс кому угодно. Формально endpoint есть. Но по факту — неприемлемо.

Практический вывод: в задаче должны быть явно указаны роли, права, статусы ошибок, инварианты и non‑functional requirements.

Ошибка 2. Happy path вместо реального мира

AI часто пишет код для идеальной вселенной:

  • пользователь существует;

  • баланс положительный;

  • банк отвечает;

  • сеть не падает;

  • повторный запрос не приходит;

  • валюта одна;

  • null и пустые списки не встречаются;

  • часовой пояс не важен.

В проде всё наоборот.

Практический вывод: если вы не попросили обработать альтернативные сценарии, ошибки, роли и переходы состояний, агент может их не добавить.

Ошибка 3. Потеря инвариантов

Инвариант — это правило, которое нельзя нарушать даже при локальном изменении. Например:

  • баланс кошелька не может уйти в минус;

  • операция списания идемпотентна;

  • пользователь видит только свои данные;

  • pending‑транзакции не учитываются в доступном балансе;

  • PII не попадает в логи;

  • read‑endpoint не должен менять состояние.

Агент может не знать, что это правило существует, если оно нигде не записано.

Практический вывод: инварианты нужно выносить в spec, тесты, property‑based checks и review skills.

Ошибка 4. Галлюцинации API и supply chain

Классика: метод выглядит логично, имя библиотеки звучит правдоподобно, пример из интернета похож на ваш случай. Только в вашем проекте такого метода нет, библиотека устарела, а пакет с красивым названием может быть небезопасным.

Особенно неприятен supply‑chain риск. Если модели регулярно галлюцинируют имя несуществующего пакета, злоумышленник может занять это имя в registry и ждать, пока кто‑то подключит зависимость.

Практический вывод: любые новые зависимости должны проходить SCA, allowlist/denylist и human review. Агент не должен самовольно тянуть пакеты.

Ошибка 5. Reward hacking и test hacking

Если критерий звучит как «сделай тесты зелёными», агент может оптимизироваться не под задачу, а под метрику.

Как это выглядит:

  • ослабил assertion;

  • удалил сложный сценарий;

  • заменил реальный объект mock'ом;

  • захардкодил ожидаемое значение;

  • решил, что упавшие интеграционные тесты «не относятся к задаче»;

  • сослался на прогон тестов, который был до последних изменений.

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

Практический вывод: тесты должны фиксироваться до реализации и меняться через отдельный процесс ревью. Нужны mutation testing, coverage diff и анализ CI‑артефактов.

Почему ручного ревью недостаточно

Ручное ревью нужно, но оно плохо масштабируется как единственная защита.

Что изменилось

Почему ревьюеру тяжелее

Кода стало больше

Один prompt может породить diff на десятки файлов

Код выглядит аккуратно

Меньше red‑флагов на уровне стиля

Намерение не очевидно

Нужно понять не только что изменилось, но зачем

Проверки тоже сгенерированы

Тесты могут быть слабыми или вовсе некорректными

Ошибка на стыке модулей

Локальный diff имеет системный эффект

Агент пишет уверенный отчёт

Ревьюер может поверить формулировке без доказательств

Вывод: человек должен получать не «посмотри 3000 строк», а короткий отчёт после автоматических слоев проверки.

От промпта к пайплайну

На вебинаре предложили заменить надежду на хороший промпт инженерным пайплайном:

  1. Спецификация.

  2. Линтеры и базовые ограничения.

  3. Тесты, property‑based testing, fuzzing.

  4. Security checks.

  5. Архитектурные ограничения.

  6. AI‑review.

  7. Triage.

  8. Человеческое решение.

SDD: спецификация как конституция задачи

Spec‑Driven Development в контексте LLM — это документ, который фиксирует:

  • что является правильным результатом;

  • где границы задачи;

  • что агенту запрещено трогать;

  • как результат будет проверяться.

Плохая задача:

Сделай вывод баланса.

Нормальная задача:

Пользователь должен видеть актуальный баланс по подтверждённым операциям. Доступ только для владельца аккаунта или оператора поддержки. Endpoint GET /balance/{userId} возвращает 200, 403 или 404. Валюта RUB. Используется banker's rounding. Pending‑операции не учитываются. p95 < 50 ms. PII не попадает в логи.

SDD  LLM    trace
SDD LLM trace

Что должно быть в хорошей спецификации

Блок

Вопрос, на который отвечает

Ожидаемый результат

Что должно измениться для пользователя или системы?

Scope

Какие файлы, модули, сценарии входят в задачу?

Non‑goals

Что агенту нельзя делать?

Ограничения

Latency, память, зависимости, безопасность, архитектура

Принятые решения

Почему выбран этот подход?

Сценарии

Какие основные, ошибочные и граничные случаи есть?

Инварианты

Какие правила нельзя нарушать никогда?

Критерии верификации

Какие тесты и отчёты доказывают готовность?

EARS: как писать требования без двусмысленности

На слайдах был полезный формат EARS. Он хорош тем, что превращает мутный текст в шаблоны, понятные и человеку, и агенту.

Паттерн

Шаблон

Пример

Всегда

Система должна...

Система должна логировать отказ авторизации без персональных данных

Событие

Когда X, система должна...

Когда пользователь отправляет форму, система должна валидировать email

Состояние

Пока X, система должна...

Пока идёт синхронизация, система должна показывать статус операции

Ошибка

Если X, система должна...

Если валидация не прошла 3 раза, система должна временно заблокировать вход

Опция

Там, где X, система должна...

Там, где включена 2FA, система должна требовать TOTP‑код

Практический вывод: формулировки «желательно», «нормально обработать», «как обычно» лучше не использовать. Агент слишком легко заполнит пустоты сам.

Три уровня SDD

Уровень

Как работает

Когда использовать

Риск

Spec‑first

Спека пишется до кодирования и задаёт направление агенту

Разовые сложные задачи

После merge spec забывают

Spec‑anchored

Спека живёт рядом с кодом, изменение поведения требует изменения спеки

Критичные модули, команды

Нужны дисциплина и CI‑gates

Spec‑as‑source

Из спеки генерируются код, тесты, задачи

Контрактные системы, зрелый tooling

Подходит не для всей системы

Для большинства команд разумный старт — spec‑first на сложных задачах и spec‑anchored для критичных частей: платежи, права доступа, интеграции, ядро продукта.

Типичный SDD‑цикл для агента

Шаг

Что происходит

Артефакт

Specify

Человек описывает задачу, сценарии, ограничения, риски

spec.md

Clarify

Агент задаёт вопросы по пробелам и конфликтам

список уточнений

Plan

Фиксируются модули, API, данные, миграции

plan.md

Task breakdown

Задача дробится на атомарные шаги

tasks.md

Test design

Acceptance criteria превращаются в тесты

test plan

Implement

Агент пишет код в рамках плана

diff

Verify

CI/агент проверяет код, тесты, схемы, security, зависимости

логи и отчёты

Trace

Spec, plan, tasks, diff и результаты хранятся вместе

папка артефактов

Хорошая практика: сохранять артефакты рядом с фичей. Не только код, но и причину, план и доказательства.

SDD в мультиагентной разработке

В чате вебинара справедливо заметили: не стоит давать одному агенту писать спеку, кодить и тестировать. Для контекста и качества лучше разделять роли.

Роль

Задача

Координатор

Декомпозирует спецификацию и ведёт список задач

Исполнитель

Реализует маленький кусок в рамках spec и plan

Верификатор

Ищет причины отклонить результат по acceptance criteria

QA/security agent

Запускает тесты, анализ, fuzzing и проверяет артефакты

Спецификация в такой схеме становится общей точкой истины. Без неё каждый агент будет понимать задачу по‑своему.

Инструменты и форматы для SDD

Из презентации:

Формат

Для чего нужен

spec.md, plan.md, tasks.md

Локальные артефакты фичи

OpenAPI / AsyncAPI

Контракты сервисов и событий

JSON Schema

Входы, выходы и tool‑calls агента

Gherkin / EARS

Acceptance criteria без двусмысленности

ADR

Архитектурные решения

CI‑gates

Проверка схем, тестов, security, зависимостей

Plan mode, GitHub Spec Kit, Kiro, Currante, CodeSpeak

Инструменты вокруг SDD

TDD для LLM: тест как исполняемый промпт

TDD переживает новый виток популярности в агентской разработке. Тест становится формальным промптом: агент получает внешний проверяемый контракт, а не абстрактное «сделай хорошо».

Цикл:

Фаза

Что делает команда/агент

Red

Формализуется падающий тест или eval‑case

Green

Агент пишет минимальный код для прохождения проверки

Refactor

Агент улучшает структуру при сохранении инвариантов

Verify

Запускается полный регрессионный набор

Фаза Red: какие тесты нужны до реализации

Тип теста

Что защищает

Репродуктивный

Конкретный дефект или пользовательский сценарий

Интеграционный

Контрактные стыки модулей, БД, внешних API

Граничные условия

null, empty, overflow, локали, часовые пояса

Security‑тест

Инъекции, утечки, нарушение авторизации

Регрессионный

Повторное внесение уже исправленного бага

Тесты не обязаны быть идеальными. Но они должны быть независимыми от реализации агента.

Главный риск TDD с агентом: test hacking

Агент может добиться формального прохождения метрики без решения задачи. Поэтому нужны защитные механизмы:

Риск

Защита

Агент меняет тест под своё решение

Тесты фиксируются до реализации и меняются через отдельное ревью

Тесты ничего не ловят

Mutation testing

Агент показывает старый зелёный запуск

Анализ CI‑артефактов после последнего diff

Покрытие растёт, смысл нет

Coverage diff + review тестов

Mock скрывает реальную интеграцию

Интеграционные и E2E‑тесты

Где агентный TDD окупается

Подходит

Почему

Ядро системы

Ошибка дорогая, поведение важно зафиксировать

Финансовая логика

Нужны инварианты и проверяемые сценарии

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

Нельзя доверять happy path

Исправление багов

Тест фиксирует дефект до патча

Рефакторинг и миграции

Нужно сохранить старое поведение

Асинхронные команды

Агент сдаёт результат без микроменеджмента

Лучше не усложнять

Почему

R&D

Требования меняются в процессе

Быстрые UI‑прототипы

Иногда дешевле оценить глазами

Одноразовые скрипты

Цена процесса выше цены ошибки

Legacy без тестовой инфраструктуры

Агент может не поднять её корректно с нуля

За пределами SDD и TDD

SDD и TDD не закрывают всё.

Агент всё ещё может:

  • написать код, который проходит тесты, но содержит уязвимость;

  • придумать несуществующую библиотеку;

  • нарушить глобальную архитектуру ради локального решения;

  • сделать тесты такими, чтобы их было легко пройти;

  • добавить лишнюю стоимость: больше токенов, больше проверок, больше шума.

Поэтому нужен следующий слой.

AI rules   security review
AI rules security review

Настройка среды: rules, ignore, skills, hooks

Механизм

Что делает

Практический пример

AGENTS.md /.cursorrules

Локальная конституция проекта

стек, запреты, внутренние API, стиль

agentignore /.cursorignore

Физически запрещает читать/редактировать файлы

секреты, prod‑конфиги, чужие модули

Skills

Специализированные инструкции/инструменты

security_guard перед кодом с пользовательским вводом

Agentic hooks

Скрипты внутри цикла агента

post‑generation линтер, pre‑generation контекст

Практический вывод: правила должны версионироваться и ревьюиться как код. Если правило живёт только в голове тимлида, агент его не знает.

Линтеры и архитектурные ограничения

Линтеры — первая линия обороны. Они дешёвые, быстрые и отсекают грязный AI‑код до ревью.

Слой

Инструменты из презентации

Что ловит

Стиль и синтаксис

ESLint, Ruff, detekt

Код выглядит как код команды

Архитектура

ArchUnit, Konsist, dependency‑cruiser

Нельзя ходить из controller прямо в DB, тянуть лишние зависимости

Типы и контракты

TypeScript strict, mypy, compiler frontend

Галлюцинации API, неверные типы, сломанные сигнатуры

Важно: архитектурные тесты особенно полезны с AI. Агент любит локально удобные решения. ArchUnit и похожие инструменты напоминают ему, что проект больше одного файла.

Security‑слой: SAST, SCA, DAST и не только

Инструментальный слой

Что проверяет

Примеры

Secret scanning

Ключи, токены, пароли

TruffleHog, GitGuardian, gitleaks

SAST

Уязвимости через static/data‑flow анализ

CodeQL, Semgrep, OpenTaint, Snyk

SCA

Зависимости и supply chain

Trivy, OWASP Dependency Check

DAST

Запущенное приложение

OWASP ZAP, Nuclei

IAST

Поведение внутри работающего приложения

Contrast Security, Seeker, HCL AppScan IAST

IaC / Container scanning

Инфраструктура и образы

зависит от стека

LLM‑specific checks

Prompt injection, утечки в prompts/tools

кастомные проверки

Практический вывод: если агент добавил зависимость или обработку пользовательского ввода, security‑check должен быть не опциональным, а обязательным.

Fuzzing и property‑based testing

AI неплохо пишет очевидные unit‑тесты. Плохо — странные входы и инварианты.

Fuzzing подаёт на вход много случайных данных и ищет падения. Инструменты из презентации: AFL++, libFuzzer, Atheris, Hypothesis, Cats, EvoMaster.

Property‑based testing проверяет свойства, а не отдельные примеры. Инструменты: Hypothesis для Python, jqwik для Java, fast‑check для JavaScript/TypeScript.

Пример из презентации:

from hypothesis import given
import hypothesis.strategies as st

@given(st.lists(st.integers()))
def test_sort_preserves_length(lst):
    assert len(sorted(lst)) == len(lst)

Для AI‑кода это очень удачная связка: модель может пройти пример [3, 1, 2], но сломаться на пустом списке, дубликатах, больших числах или нестандартной локали.

Пирамида тестов всё ещё нужна

Если строгий TDD‑контур не внедрён, базовая иерархия тестов становится минимальной защитой.

Тип

Что проверяет

Зачем агенту

Unit

Атомарные компоненты

Быстрая обратная связь

Integration

Стыки модулей, БД, внешних API

Ловит неправильные контракты

E2E

Сквозные бизнес‑сценарии

Ловит системные регрессии

Перевёрнутая пирамида, где всё проверяется медленными E2E, плохо подходит агентам: feedback loop становится слишком длинным.

Предел автоматизации: зачем всё ещё нужен ревьюер

Автоматика проверяет факты:

  • типы совпали;

  • тесты зелёные;

  • секреты не утекли;

  • зависимость не в denylist;

  • latency в бенчмарке не выросла.

Но автоматика не всегда понимает намерение:

  • действительно ли код решает бизнес‑задачу;

  • не появился ли архитектурный костыль;

  • не нарушена ли доменная модель;

  • не стало ли решение слишком дорогим в сопровождении.

Здесь начинается AI‑review, а потом человеческое ревью.

AI‑review: не «проверь всё», а пайплайн

AIreview pipeline scope resolver   triage
AIreview pipeline scope resolver triage

AI‑review pipeline — это организованный процесс проверки изменений одним или несколькими агентами. У каждого агента ограниченный контекст, роль и проверяемый формат результата.

Что проверяет AI‑review:

  • соответствует ли diff issue, spec или acceptance criteria;

  • не нарушены ли бизнес‑правила;

  • нет ли скрытых побочных эффектов;

  • достаточно ли тестов, логов и отчётов;

  • нет ли архитектурных или security‑проблем;

  • не подогнаны ли тесты под реализацию.

Локальное ревью: чем меньше scope, тем выше точность

AI‑review лучше запускать рано: прямо в IDE, агентском цикле или перед локальным коммитом.

Практическая схема:

  1. Агент сгенерировал небольшой участок кода.

  2. Ревьюер запускается в новом чате без истории генерации.

  3. Ему передают только релевантный контекст: diff, соседний код, контракт, тесты, spec.

  4. Он возвращает проблемы в строгом формате.

  5. Исполнитель исправляет.

  6. Проверка повторяется.

Новый чат важен: ревьюер не должен быть эмоционально и контекстно «на стороне» исполнителя.

Большой review pipeline для PR

Шаг

Что делает

Review target

PR, commit или другой набор изменений

Scope resolver

Определяет изменённые файлы, модули, контракты

Context builder

Собирает diff, issue, spec, tests, CI reports, зависимости

Routing decision

Решает, каких ревьюеров запускать

Узкие ревьюеры

Проверяют свои классы рисков

Triage

Подтверждает, отклоняет или уточняет каждую находку

Review report

Готовит короткий отчёт для человека

Узкие ревью‑сабагенты

Роль

Что проверяет

Security reviewer

Инъекции, секреты, небезопасный ввод, OWASP/CWE

Architecture reviewer

Нарушение слоёв, лишние зависимости, обход публичных API

Test reviewer

Слабые assertions, edge cases, баланс unit/integration/e2e

Spec‑compliance reviewer

Соответствие diff исходной spec и acceptance criteria

Migration/API reviewer

Совместимость схем и публичных контрактов

Performance reviewer

Аллокации, locks, медленные запросы, latency

Domain reviewer

Бизнес‑инварианты конкретного проекта

Core correctness reviewer

Общая корректность и влияние на соседние части системы

Один универсальный агент с задачей «найди всё плохое» обычно даёт поверхностный результат. Узкая роль работает лучше.

Контекст для ревьюера

Полезный набор:

  • diff и изменённые файлы;

  • issue, spec, acceptance criteria, ADR;

  • связанные тесты;

  • отчёты CI;

  • вызывающие и вызываемые методы;

  • публичные контракты;

  • правила архитектуры;

  • security‑требования;

  • AGENTS.md,.agentignore, проектные skills.

Важно не перегнуть. Слишком мало контекста — агент не увидит проблему. Слишком много — потеряет фокус.

Triage: один потенциальный баг — одно решение

После сабагентов нельзя просто склеить все замечания в длинный комментарий. Нужен triage.

Правила triage из презентации:

Правило

Зачем

Один потенциальный баг — одно решение

Не принимать пачку замечаний целиком

У каждой находки есть файл, строка, доказательство, влияние

Без доказательства это шум

Решение: подтвердить, отклонить, уточнить

Не все замечания валидны

Дубликаты объединяются

Но первичные доказательства сохраняются

Severity фиксируется отдельно

Не смешивать blocker и style nit

Формат хорошей находки:

id: SEC-003

file: src/main/java/.../BalanceController.java

line: 42

severity: high

claim: endpoint allows reading another user's balance

proof: authorization check compares requested userId with path owner only in UI, backend check absent

evidence: related test BalanceAccessTest does not cover SUPPORT/user mismatch

recommendation: add backend authorization check and negative integration test

Как собрать свой review pipeline из истории проекта

Это один из самых практичных выводов вебинара.

Не надо начинать с абстрактного промпта «ты senior reviewer». Лучше взять историю своего проекта:

  1. Выгрузить issues, PR‑комментарии, review discussions, причины отклонённых изменений.

  2. Собрать документ: типовые баги, архитектурные правила, частые замечания, опасные зоны.

  3. Выделить зависимости: какие модули чаще ломаются вместе.

  4. Разделить знания на skills: security‑skill, architecture‑skill, testing‑skill, domain‑skill.

  5. Написать skill оркестратора: когда запускать каких ревьюеров, какой контекст давать, как делать triage.

  6. Запускать этот pipeline на каждом значимом PR.

Так ревью‑пайплайн отражает реальные ошибки команды, а не среднюю температуру по GitHub.

Гибридизация: LLM + формальные инструменты

Финальная часть вебинара была про связку LLM и классического анализа программ.

Простая схема:

  1. Инструмент фиксирует проблему: файл, строка, трассировка, метрика, упавший тест.

  2. LLM связывает сигнал с контекстом проекта и формулирует гипотезу.

  3. Агент предлагает минимальное исправление.

  4. Инструмент запускается снова и подтверждает или опровергает результат.

Это важная мысль: LLM не должна быть единственным источником истины. Она хорошо интерпретирует, группирует, объясняет, пишет harness, предлагает патч. Но финальное подтверждение должен дать инструмент.

LLM
LLM

Где LLM помогает формальным инструментам

Область

Что даёт инструмент

Где помогает LLM

SAST

Большой отчёт по data‑flow и уязвимостям

Группирует дубликаты, объясняет путь данных, предлагает патч и тест

Property‑based testing

Контрпример нарушения свойства

Извлекает свойства из spec, пишет стратегии, анализирует counterexample

Fuzzing

Crash reports, inputs, stack traces

Пишет harness, подбирает seeds, кластеризует падения, делает регрессионный тест

Performance

JFR, flame graph, OpenTelemetry, Prometheus

Связывает аномалию с кодом, предлагает план оптимизации и benchmark

Dependency/security

CVE, policy violation, suspicious package

Объясняет риск, предлагает безопасную замену, проверяет миграцию

Сценарий: SAST‑отчёт на 200 предупреждений

Без LLM команда часто тонет в отчёте: критичные дефекты, дубликаты, low‑priority, false positives — всё в одной куче.

С LLM можно сделать так:

  1. Сгруппировать одинаковые предупреждения.

  2. Восстановить data‑flow от пользовательского ввода до опасной операции.

  3. Отметить находки, требующие ручной проверки.

  4. Предложить минимальное исправление.

  5. Сгенерировать проверочный тест.

  6. Подготовить резюме: исправить / отклонить / исследовать вручную.

Но последнее слово остаётся за инструментом и человеком.

Сценарий: performance regression

Рабочий контур из презентации:

  1. Агент получает данные профилировщика: async‑profiler, JFR, flame graphs, OpenTelemetry, Prometheus.

  2. Находит критические участки: медленные endpoints, тяжёлые SQL, лишние аллокации, locks.

  3. Связывает аномалию с коммитом, функцией или конфигурацией.

  4. Готовит план оптимизации.

  5. Добавляет benchmark.

  6. После исправления повторно измеряет latency, CPU, memory или throughput.

Практический вывод: «кажется, стало быстрее» не считается. Нужна повторная метрика.

Финальный пайплайн безопасной AI‑разработки

Если собрать вебинар в один чек‑лист:

  1. Формализовать задачу: spec, plan, acceptance criteria, риски.

  2. Настроить инструмент: AGENTS.md, rules, ignore, skills, hooks.

  3. Ограничить scope: агент не должен читать и менять всё подряд.

  4. Разделить роли: writer, implementer, reviewer, triage, CI.

  5. Сначала зафиксировать проверки: unit, integration, property, security, regression.

  6. Дать агенту маленький шаг реализации.

  7. Прогнать дешёвые проверки: типы, линтеры, архитектурные правила.

  8. Прогнать тесты и security‑checks.

  9. Запустить локальный AI‑review в новом контексте.

  10. Для большого PR — scope resolver, routing, узкие reviewers, triage.

  11. Подтвердить выводы артефактами.

  12. Передать человеку короткий отчёт: что изменилось, чем доказано, где риски.

  13. Сохранить spec, plan, diff, логи и отчёты рядом с задачей.

Практический минимум для команды, которая только начинает

Если весь pipeline пока кажется тяжёлым, можно начать с малого.

Минимум на эту неделю

  • Завести AGENTS.md с правилами проекта.

  • Добавить.agentignore для секретов, prod‑конфигов и зон, куда агенту нельзя.

  • Запретить агенту добавлять зависимости без явного approval.

  • Для задач сложнее одного файла требовать plan.md.

  • Просить агента писать список изменённых файлов и команд проверки.

  • Не принимать «тесты прошли» без лога.

Минимум на месяц

  • Выделить 2–3 критичных модуля и описать для них spec‑anchored документы.

  • Добавить архитектурные тесты: слои, зависимости, запреты.

  • Включить SCA и secret scanning в обязательный CI.

  • Настроить review skill на основе частых замечаний команды.

  • Запускать AI‑review в отдельном контексте перед PR.

Минимум для enterprise‑контура

  • SDD для критичных задач.

  • Независимые роли агентов.

  • Property‑based testing для доменных инвариантов.

  • Fuzzing для парсеров, API, input‑heavy кода.

  • SAST/SCA/DAST по policy.

  • Triage agent с форматом находок.

  • Метрики: false positive rate, время ревью, escaped defects, security findings, cost per PR.

Где здесь Veai

Вся схема упирается в качество фактов о проекте. Агенту мало grep, RAG и длинного терминального лога. Для нормальной проверки нужны точные IDE‑факты:

  • какие символы реально существуют;

  • где используется метод;

  • какие публичные контракты затронуты;

  • какие тестовые конфигурации доступны;

  • какие инспекции падают;

  • какие зависимости подключены;

  • что реально произошло при запуске;

  • какие изменения относятся к scope задачи.

Veai работает внутри IDE как источник таких фактов. Поэтому агент может не только «рассуждать про код», но и опираться на структуру проекта, зависимости, запуски, ошибки, инспекции и артефакты валидации.

Это не рекламный тезис «IDE лучше чата». Это инженерный тезис: чем автономнее агент, тем важнее источник проверяемых фактов.

Ответы на вопросы из чата

Чем spec‑first отличается от spec‑anchored?

Spec‑first — одноразовая спецификация под задачу. Написали, реализовали, после merge её могут забыть.

Spec‑anchored — спецификация живёт рядом с кодом. Изменение поведения требует изменения SPEC.md в том же PR.

В spec‑anchored нужна одна спека на всю систему?

Не обязательно. Для большого проекта это часто слишком дорого. Лучше начать с критичного микросервиса, модуля или доменной зоны: платежи, авторизация, биллинг, интеграции.

Структура: цель, scope, non‑goals, бизнес‑правила, инварианты, внешние контракты, NFR, acceptance criteria, проверки.

Как изолировать контекст в рое агентов?

Через оркестратора. Он решает, какой агент получает какой контекст. Исполнителю не нужно видеть всё обсуждение аналитика. Security reviewer не обязан читать весь UI diff. Triage agent должен видеть конкретную находку, proof и связанные артефакты.

Меньше истории, больше релевантных фактов.

Можно ли прогонять ревью двумя моделями и давать арбитру?

Да. Особенно для критичных изменений. Разные модели могут по‑разному видеть технические и бизнес‑риски. Но арбитр должен просить доказательства, а не выбирать «кто убедительнее написал».

Как улучшить опыт code review для человека?

Дать человеку не сырой поток замечаний, а triage report: blocker/high/medium, файл, строка, доказательство, ожидаемое влияние, рекомендация. Человек должен решать сложное, а не вычищать шум.

Можно ли разбивать большой PR на маленькие коммиты и ревьюить отдельно?

Можно, но коммит не всегда хороший срез. Часто лучше дробить по связанным компонентам: модуль, контракт, API, бизнес‑сценарий. Тогда ревьюер видит смысловую единицу, а не историю переписывания.

Какая роль разработчика, если код ревьюят модели?

Разработчик остаётся владельцем решения. Просто его роль смещается: меньше ручного просмотра очевидных вещей, больше постановки рамок, проверки артефактов, архитектурных решений, security и non‑functional requirements.

Хард‑скиллы становятся важнее, а не менее важными.

Узкое место теперь в написании кода или ревью?

Зависит от проекта, но написание кода ускоряется быстрее, чем ревью. Поэтому ревью, проверки и сопровождение становятся bottleneck. Это совпадает с цифрой про рост времени PR‑ревью.

Помогает ли всё это быстрее писать или только усложняет?

Если применять ко всему подряд, усложняет. Если применять там, где ошибка дорогая, помогает.

Простая задача — короткий цикл. Деньги, безопасность, права доступа, миграции, большие PR — полноценный pipeline.

Какую локальную модель выбрать для кодинга на 128 GB?

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

Итог

LLM действительно ускоряет разработку. Но скорость без процесса превращается в скорость накопления неизвестного долга.

Рабочая формула вебинара такая:

Чем автономнее агент, тем жёстче должны быть границы и независимее проверка.

И ещё короче:

Нет артефакта — нет доказательства.

Если агент пишет код, он должен работать не в вакууме, а в инженерном контуре: спецификация, ограничения, тесты, анализаторы, AI‑review, triage и финальное решение человека. Тогда AI становится ускорителем разработки, а не генератором красивых мин в репозитории.

Челлендж для читателей: проверьте свой AI‑generated PR

Если вы уже используете Copilot, Cursor, Claude Code, Codex, Veai или любой другой агентский инструмент, попробуйте маленький эксперимент на одном реальном PR.

Возьмите изменение, где AI написал заметную часть кода, и прогоните его по чек‑листу:

Шаг

Что сделать

Что сохранить

1

Найти исходную задачу или issue

текст требования

2

Выписать 3–5 инвариантов

список правил, которые нельзя нарушать

3

Проверить, есть ли тесты на happy path и edge cases

ссылки на тесты или список дыр

4

Прогнать линтеры, типы, security/dependency check

лог или отчёт

5

Попросить отдельного AI‑ревьюера проверить diff по роли security / tests / architecture

список находок

6

Оттриажить находки: подтвердить, отклонить, проверить вручную

короткий triage report

7

Сравнить с обычным ревью

что нашлось сверх ручной проверки

Формат результата можно сделать таким:

Проект: backend / frontend / mobile / data / другое

Размер PR: N файлов, N строк

AI‑инструмент:...

Что нашлось:

  • security:...

  • tests:...

  • architecture:...

  • false positives:...

Что бы добавили в AGENTS.md / rules / review skill:...

Будет особенно интересно сравнить не модели, а процессы. Один и тот же агент может дать мусор на голом prompt и нормальный результат, если у него есть spec, тесты, ограничения и отдельный ревьюер.

Если попробуете — принесите результаты в комментарии: какие классы проблем нашлись, что оказалось шумом, а что реально стоило поймать до merge.

Комментарии (4)


  1. Kot_na_klaviature
    18.05.2026 10:51

    Всё хорошо в статье, но мало ИИ списков и таблиц


  1. Eugen7
    18.05.2026 10:51

    Недавно потребовалось сделать один функционал который требовал по больше безопасности чем обычный сайт, использовал AI как для создания кода так и для его проверки, и постарался смоделировать ситуации с которыми может столкнуться код, и AI вроде нормально справился с задачами, хотя конечно время покажет, поживём увидим)


  1. greypo
    18.05.2026 10:51

    Какая-то так сказать сырая статья, как будто вырезали маленькие отрывки из других статей и практически без обьяснения/рассуждений/ своих примеров просто сделали кучу мини списков


    1. dirvika Автор
      18.05.2026 10:51

      вы можете все свои вопросы подробно написать автору в чат потдержки https://t.me/veai_devs_chat Даниил вам ответит в расширенном виде.