Learn (Almost) Anything
КаталогСкачать курс

От промптов к спекам с AI-агентами

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

ruМини-курс6 уроков1 модуль8
Spec Driven DevelopmentAI-агентамиSpec Driven Development на выходныхот спеки до приёмкиspecdrivendevelopmentпромптовспекамагентами

Приёмка результата против спеки

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

Приёмка результата против спеки

В четвёртом подмодуле мы ввели правило: после каждой задачи — две минуты на сверку с «Критериями готовности». Этот подмодуль разворачивает эти две минуты в полноценный процесс — как именно убедиться, что агент сделал то, что в спеке, а не «что-то похожее».

Ловушка «примерно работает»

Агент сообщает «готово» — и код действительно что-то делает. Логин проходит, токен возвращается, тесты зелёные. Но «работает» и «соответствует спеке» — разные утверждения.

Типичный пример: спека говорила «блокировка после 5 ошибок *подряд*». Агент реализовал блокировку после 5 ошибок суммарно за всё время аккаунта. Технически — «что-то похожее». На практике — другое поведение. Если не проверять явно, такой дрейф живёт в продакшене до первого инцидента.

Счётчик «подряд» сбрасывается после каждого успешного входа — суммарный не сбрасывается никогда.

Три шага приёмочного чека

Шаг 1. Пройдите по «Критериям готовности» буквально. Возьмите спеку, откройте раздел «Критерии готовности» — тот, который заполняли в подмодуле 2. Каждый пункт — это утверждение. Проверьте его явно: запросом к API, тестом, ручным прогоном.

# Каждый критерий — конкретная проверка, не «по ощущениям»
POST /auth/login {"email":"test@example.com","password":"wrong"} → ожидаем 401
POST /auth/login {"email":"test@example.com","password":"correct"} → ожидаем 200 + token

Шаг 2. Прогоните граничные случаи. Раздел «Граничные случаи» в спеке был написан именно для этого момента. Каждый пункт — отдельная проверка. Именно их агент чаще всего реализует «с точностью до своей интерпретации».

Шаг 3. Посмотрите, что агент добавил помимо задачи. Иногда агент «помогает» — добавляет что-то, чего в задаче не было. Это не всегда плохо, но нужно знать, что именно лежит в коде.

Хороший способ ускорить все три шага — попросить агента сверить результат самостоятельно:

Прочитай specs/auth-login.md, разделы «Требования» и «Критерии готовности».
Сверь с тем, что реализовано в auth.controller.ts.
Перечисли расхождения: где код отличается от спеки или делает что-то, чего в спеке нет.
Не предлагай правок — только список расхождений.

Агент нередко замечает то, что вы пропустили при ручной проверке.

Три исхода: принять, доработать, обновить спеку

После проверки у вас три варианта — не «принять или нет».

flowchart TD A[Задача готова] --> B[Проверяем критерии готовности] B --> C{Все пункты прошли?} C -- Нет --> D{Спека была однозначной?} D -- Да --> E[Доработать — вернуть агенту] D -- Нет --> F[Обновить спеку — вернуть агенту] C -- Да --> G[Проверяем граничные случаи] G --> H{Всё покрыто?} H -- Нет --> I{Случай был в спеке?} I -- Да --> E I -- Нет --> F H -- Да --> J[Принять ✓]
flowchart TD
    A[Задача готова] --> B[Проверяем критерии готовности]
    B --> C{Все пункты прошли?}
    C -- Нет --> D{Спека была однозначной?}
    D -- Да --> E[Доработать — вернуть агенту]
    D -- Нет --> F[Обновить спеку — вернуть агенту]
    C -- Да --> G[Проверяем граничные случаи]
    G --> H{Всё покрыто?}
    H -- Нет --> I{Случай был в спеке?}
    I -- Да --> E
    I -- Нет --> F
    H -- Да --> J[Принять ✓]
Три исхода приёмки: принять, вернуть агенту или обновить спеку

Принять. Все критерии выполнены, граничные случаи покрыты, агент не добавил ничего неожиданного. Ставите чекбокс в tasks.md и двигаетесь дальше.

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

В specs/auth-login.md критерий: «Блокировка после 5 ошибок подряд».
Сейчас счётчик считает суммарно, а не подряд.
Исправь: счётчик сбрасывается после каждого успешного логина.

Обновить спеку → новая задача. Проверка выявила что-то, чего в спеке не было. Агент сделал разумный выбор, но этот выбор нужно зафиксировать явно — или пересмотреть. В любом случае: сначала обновляете спеку, потом принимаете или ставите новую задачу в tasks.md.

Дрейф спека–код: три сигнала

Молчаливые допущения — агент сделал выбор, которого в спеке не было. Например, нормализовал email (trim + lowercase) молча, хотя в «Требованиях» это не прописано. Выглядит правильно, но теперь есть поведение без документации.

Расширение скоупа — агент реализовал что-то из «Не-целей». Добавил refresh-токен «потому что так обычно делают». Соблазнительно оставить — не делайте этого без обновления спеки: такой код становится «тёмным» поведением, про которое никто не знает.

Смещение семантики — требование выполнено формально, но не по смыслу. «Возвращать сообщение об ошибке» — агент вернул {error: true}, а не {error: "Invalid credentials"}.

Когда обновлять спеку, а когда — код

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

Агент нормализовал email, спека молчала об этом → добавьте в «Требования»: «Email при сохранении приводится к lowercase и trim».

Спека говорила «блокировка на 15 минут», агент сделал на 30 → ошибка реализации, исправляйте код, не спеку.

Обновлённая спека — не признак плохого планирования. Требования уточняются в ходе работы, это нормально. Главное — фиксировать изменения в тексте, а не только в голове.

ИнтерактивПриёмочный чек: выберите решение
Два реальных сценария приёмки. Посмотрите на результаты проверки и выберите правильное решение: принять, доработать или обновить спеку.

Упражнение

Возьмите задачу, которую реализовали в прошлом подмодуле. Запустите три шага:

1. Откройте спеку, раздел «Критерии готовности» — проверьте каждый пункт явно.

2. Прогоните каждый граничный случай из раздела «Граничные случаи».

3. Запустите авто-аудит: попросите агента сверить код со спекой, только расхождения.

Примите одно из трёх решений и запишите его в tasks.md рядом с задачей — одной строкой: «Принято», «Возвращено: [причина]» или «Спека обновлена: [что добавлено]».

В следующем и последнем подмодуле разберём, как встроить весь цикл SDD в работу с продактом или аналитиком — чтобы спека стала общим артефактом команды, а не личным файлом разработчика.

Самопроверка

  1. Статья приводит пример с блокировкой (спека: «подряд», реализация: «суммарно») чтобы объяснить проблему подхода «примерно работает». Что здесь главное?
  2. Первый шаг приёмочного чека - это «пройтись по критериям готовности буквально». Что имеется в виду?
  3. После проверки результата против спеки у вас три варианта. Какой из них правильный, если спека была однозначной, но агент реализовал что-то другое?
  4. Агент нормализовал email (trim + lowercase), хотя в спеке это не было упомянуто. По логике статьи, что нужно сделать?
  5. Спека фичи «login» не упоминала ничего про refresh-токен. Агент добавил его, решив, что «так обычно делают». Статья даёт этому примеру какого типа дрейфа?
  6. По логике статьи, почему обновление спеки в ходе работы — это нормально, а не признак плохого планирования?
  7. Вы проверили результат и обнаружили, что агент добавил функцию, которой не было в спеке, но это разумный выбор. Какой из трёх исходов здесь применим?
  8. Почему первый шаг приёмки — именно «пройти по критериям буквально», проверив каждый явно, а не просто убедиться, что «работает»?

Домашние задания

Проверка фичи по спекеtext

В приложении спека и описание реализации фичи 'Восстановление пароля по email'. Проведите аудит приёмки: 1. Выпишите все критерии готовности. Для каждого напишите, выполнен ли он, и где в коде это видно. 2. Проверьте каждый граничный случай: невалидный email, много ошибок подряд, истекшая ссылка. Как их обрабатывает реализация? 3. Найдите, что сделано сверх спеки. Если находка — то что и почему это добавлено. Напишите вывод: какие критерии пройдены, какие нет, что ещё. Выберите одно решение и обоснуйте: • Принято — все критерии выполнены, никаких проблем • Возвращено: [какой критерий не выполнен, почему] • Спека обновлена: [что нужно добавить и почему]

Все критерии готовности перечислены и проверены явно. Для каждого указано выполнено/не выполнено с объяснением. Проверены граничные случаи из спеки. Определены расширения функциональности и их типы. Выбрано одно из трёх решений, которое логично следует из найденных расхождений.

Самопроверка своей фичиdocument

Найдите фичу, которую вы сами писали — в этом курсе, в учебном проекте или на работе. Нужна спека с критериями и рабочий код. Сделайте полный аудит: 1. Проверьте критерии готовности из спеки. Для каждого — выполнен ли он в коде. 2. Прогоните граничные случаи. Как их обрабатывает ваш код? 3. Есть ли в коде функциональность, которой нет в спеке? Если да — что это и какой это тип дрейфа (допущение, расширение скоупа, смысловой сдвиг)? Оформите отчёт (файл, markdown, PDF): Критерии: для каждого — статус (выполнено / нет) и почему Граничные случаи: описание, как они обрабатываются Что сверх спеки: если есть, то что и какой тип Решение: Принято / Возвращено (что править) / Спека обновлена (что добавить) Решение должно опираться на реальные находки, не на впечатление.

Спека фичи полная (требования, критерии, граничные случаи). Все три шага аудита выполнены. Результаты проверки каждого критерия документированы. Граничные случаи проверены (минимум три). Выявлены или исключены расширения функциональности. Определены типы дрейфа. Выбрано одно решение, подкреплённое конкретными находками. Если требуется действие (доработка или обновление спеки), оно описано конкретно.

Сдача и проверка заданий — в приложении Learn (Almost) Anything.