← Spec-driven development: the spec is the prompt
02 / 07 · 50 min

Writing an executable spec

The three layers of a spec — intent, constraints, acceptance criteria: Given/When/Then and EARS templates, the spec-as-novel antipattern, and language an agent understands.

Lesson content is currently available in Russian.

What you will learn

  • →Структурировать спеку в три слоя: намерение, ограничения, критерии приёмки.
  • →Писать проверяемые критерии по шаблонам Given/When/Then и EARS.
  • →Распознавать антипаттерны: спеку-роман, детали реализации и непроверяемые прилагательные.

Три слоя: намерение, ограничения, критерии приёмки

Рабочая спека состоит из трёх слоёв, и у каждого своя функция. Скелет выглядит так:

# spec: экспорт отчёта в CSV

## Намерение
Бухгалтерия выгружает месячный отчёт в свою систему.
Сегодня данные копируют руками из таблицы — 40 минут и ошибки.

## Ограничения
- Не менять существующий эндпоинт /api/reports — им пользуется мобильное приложение.
- Экспорт доступен только ролям accountant и admin.
- Кодировка UTF-8 with BOM: файл должны открывать в Excel.

## Критерии приёмки
- AC-1: ...

Намерение отвечает на вопрос «зачем» и даёт агенту рамку для тысяч микрорешений, которые вы не опишете явно: зная, что файл открывают бухгалтеры в Excel, агент сам выберет разумный формат дат. Без намерения агент оптимизирует буквальный текст задачи, а не проблему.

Ограничения — это инварианты: что нельзя трогать, какие роли, лимиты и совместимости обязательны. Именно ограничения чаще всего теряются в ad-hoc промптинге, потому что они «очевидны» автору. Критерии приёмки — проверяемые утверждения, по которым фича принимается. Три слоя не пересекаются: «зачем», «что нельзя», «как проверим». Если абзац не попадает ни в один слой — вероятно, это деталь реализации, и ей место в плане, а не в спеке.

Шаблоны проверяемых критериев

Критерий приёмки хорош, если два разных человека, прочитав его, одинаково ответят «выполнен или нет». Два рабочих шаблона. Первый — Given/When/Then из BDD:

- AC-1. Дано: отчёт за март содержит 10 000 строк.
  Когда: пользователь с ролью accountant нажимает «Экспорт в CSV».
  Тогда: файл скачивается не дольше 5 секунд
  и открывается в Excel без ошибок кодировки.

- AC-2. Дано: пользователь с ролью viewer.
  Когда: он запрашивает POST /api/reports/export.
  Тогда: ответ 403, кнопка экспорта в UI не отображается.

Второй — EARS (Easy Approach to Requirements Syntax), удобный для системных требований: «КОГДА <триггер>, СИСТЕМА ДОЛЖНА <реакция>». Например: «КОГДА экспорт длится дольше 30 секунд, СИСТЕМА ДОЛЖНА прервать задачу и показать ошибку с идентификатором для поддержки».

Сравните с типичным непроверяемым критерием: «экспорт должен быть быстрым и удобным». Быстрым — это сколько? Удобным — по чьей оценке? Каждое прилагательное без числа превращается в спор на приёмке. Правило: скорость — в секундах и перцентилях, объём — в строках и мегабайтах, доступ — в ролях, ошибки — в кодах и текстах. И обязательно включайте негативные сценарии: пустой отчёт, нет прав, обрыв соединения. Агенты генерируют happy path сами, а вот граничные случаи — только если они названы.

Антипаттерн «спека-роман»

Противоположная крайность недоспецификации — спека-роман: двадцать страниц, где намерение повторено пять раз разными словами, критерии перемешаны с пожеланиями, а посередине — рассуждение о том, какую библиотеку CSV выбрать. Такой документ не читает никто: человек устаёт, а у агента важное ограничение с двенадцатой страницы проигрывает конкуренцию за внимание случайным деталям.

Три верных признака романа. Первый — детали реализации в спеке: названия переменных, схемы таблиц, выбор библиотек. Это ответы на вопрос «как», их место в плане, который сгенерирует и предложит агент; спека отвечает «что» и «зачем». Второй — повторы и пересказы: если ограничение сформулировано один раз точно, второй пересказ только создаёт риск противоречия. Третий — непроверяемые пожелания «система должна быть надёжной», которые не превращаются ни в код, ни в тест.

Отдельная дисциплина — честность про неизвестное. Если вы не знаете, нужна ли поддержка отчётов больше 100 тысяч строк, не угадывайте — пометьте: [NEEDS CLARIFICATION: максимальный размер отчёта?]. Spec Kit использует ровно такие маркеры: агент на шаге clarify задаст вопросы по каждому, и решение примет человек, а не генератор. Ориентир размера: спека фичи — одна-две страницы. Всё, что длиннее, обычно означает, что фичу пора резать на несколько.

Язык для агента: однозначность и структура

Спеку читают два потребителя с разными слабостями. Человек прощает неоднозначность, потому что достраивает контекст, но пропускает детали. Агент читает буквально: каждое размытое место он молча заполнит самым статистически вероятным решением — и вы узнаете об этом на приёмке.

Практические правила. Одна сущность — одно имя: если в спеке «отчёт», «выгрузка» и «документ» означают одно и то же, договоритесь об одном термине; агент может решить, что это три разные вещи. Один критерий — одно проверяемое утверждение: «файл скачивается быстро и содержит все колонки» — это два критерия, и на приёмке они могут разойтись. Списки вместо прозы: ограничения и критерии — маркированными пунктами с идентификаторами (AC-1, AC-2), чтобы на них можно было ссылаться в тестах, коммитах и ревью.

Структура тоже несёт смысл: заголовки разделов — это якоря, по которым агент навигирует. Стандартный порядок «намерение → ограничения → критерии» работает лучше произвольного, потому что агент видит рамку до деталей. Полезная финальная проверка — прогон спеки через самого агента: «прочитай спеку и перечисли все места, где тебе пришлось бы угадывать». Пять минут такого аудита дешевле, чем итерация переделки после implement.

Practice

Спека на экспорт в CSV

Напишите полную спеку фичи «экспорт отчёта в CSV» по трёхслойной структуре: намерение (2–4 предложения), ограничения (4–6 пунктов), критерии приёмки (минимум 6, из них не меньше двух негативных сценариев — нет прав, пустой отчёт, обрыв). Используйте Given/When/Then или EARS, каждому критерию — идентификатор AC-N. Затем попросите агента найти в спеке места, где ему пришлось бы угадывать, и устраните их.

Deliverable

Файл spec.md не длиннее 60 строк: три слоя, 6+ проверяемых критериев с идентификаторами, список исправлений после аудита агентом.

Checkpoint

Возьмите критерий «экспорт должен работать быстро и не падать» и перепишите его в два-три проверяемых критерия по шаблонам урока.

  • ✓ Каждый переписанный критерий содержит измеримую величину: секунды, строки, код ответа.
  • ✓ Есть хотя бы один негативный сценарий с ожидаемым поведением системы.
  • ✓ Ни один критерий не содержит непроверяемых прилагательных и деталей реализации.

Check yourself

Какой из критериев приёмки проверяем?

01Какой из критериев приёмки проверяем?

Что из перечисленного — деталь реализации, которой не место в спеке?

02Что из перечисленного — деталь реализации, которой не место в спеке?

Зачем нужен маркер [NEEDS CLARIFICATION] вместо «разумного допущения»?

03Зачем нужен маркер [NEEDS CLARIFICATION] вместо «разумного допущения»?

Почему негативные сценарии нужно писать в спеке явно?

04Почему негативные сценарии нужно писать в спеке явно?

Какой ориентир размера для спеки одной фичи?

05Какой ориентир размера для спеки одной фичи?

Sources

Writing an executable spec · Spec-driven development: the spec is the prompt · VORCL