Часть 1 · ~7 мин
Зачем нужна спецификация
Требования, которых нет
В команде «Синтез» шесть инженеров, семь микросервисов и один общий способ работать с ИИ-агентами: каждый по-своему. Олег пишет агенту длинные промпты и держит их в заметках. Даша объясняет задачу голосом в чате, а потом копирует переписку в задачу. Настя, владелица общих библиотек, узнаёт о новых требованиях к Syn.Contracts, когда чужой сервис ломается на её пакете.
Общее у всех одно: требования нигде не записаны так, чтобы их мог прочитать и человек, и агент. Они размазаны по чатам, головам и истории диалогов. Когда агент «уверенно строит не то», виноват не агент — ему честно дали неявное знание и попросили явный результат.
Промпт — пунктир, спецификация — сплошная линия
На архитектурных схемах есть полезная конвенция: сплошная линия — явный контракт (API, схема сообщения), пунктир — неявное знание («все знают, что эти сервисы связаны»). Пунктир — это то, что ломается молча.
Промпт — пунктирная линия между вами и агентом. Он существует один раз, в одном чате, в одной голове. Его нельзя отревьюить, нельзя переиспользовать, нельзя предъявить через месяц на вопрос «а почему сделано так?».
Спецификация — та же самая информация, превращённая в сплошную линию:
- она лежит в git рядом с кодом — у неё есть история, автор и ревью;
- она написана до кода — команда договаривается о поведении, пока менять его дёшево;
- её читает агент — не как контекст одного чата, а как источник истины для любого следующего изменения.
Spec-driven development (SDD) — подход, при котором изменение системы начинается с короткой спецификации: что меняем, зачем, какие требования и сценарии должны стать правдой. Код — производная от спеки, а не наоборот.
«Это же waterfall»
Первое возражение Олега — и оно по делу: аналитики уже писали многостраничные ТЗ, которые устаревали до конца спринта.
Разница — в размере и цикле жизни. SDD в исполнении OpenSpec (инструмент разберём в части 2) работает не с «документом на проект», а с дельтой на одно изменение:
proposal ──► specs ──► design ──► tasks ──► реализация
▲ ▲ ▲ │
└───────────┴──────────┴────────────────────┘
уточняем по мере того, как узнаём новое
proposal.md— зачем и что меняем: 15 строк, а не 15 страниц;specs/— требования и сценарии в формате «GIVEN — WHEN — THEN»;design.md— техническое решение, если оно неочевидно;tasks.md— чек-лист реализации, по которому идёт агент.
Артефакты можно править в любой момент, в любом порядке — фазовых ворот нет. Узнали новое во время реализации — вернулись и поправили спеку. Waterfall запрещал возвращаться; SDD на этом построен.
А когда изменение готово, его дельта вливается в общие спеки системы — и у команды появляется то, чего у «Синтеза» не было никогда: актуальное описание того, как система ведёт себя сейчас. Не вики, которая врёт, а файлы в git, которые обновляются тем же процессом, что и код.
Что это даёт именно команде с агентами
Без агентов SDD был бы просто дисциплиной документирования — полезной, но дорогой. Агенты меняют экономику:
- Спеку пишет агент, человек ревьюит. Стоимость создания упала на порядок; стоимость непроверенного кода осталась прежней. Выгодно сместить внимание человека с ревью кода на ревью намерения.
- Спека — это контекст, который не протухает. Новый чат, другой агент, другая модель — источник истины тот же. Прекращается «у меня в том диалоге он всё понимал».
- Ревью намерения дешевле ревью реализации. Поймать «не то поведение» в пяти строках сценария дешевле, чем в пятистах строках диффа.
Кейс «Синтез». Последний инцидент: агент Олега «починил» возврат платежа, разрешив рефанд в любом статусе заказа — в промпте про статусы не было ни слова, а в чате три недели назад было. Спецификация из шести строк со сценарием «GIVEN заказ отгружен WHEN запрошен рефанд THEN отказ» стоила бы две минуты ревью.
Что дальше
В части 2 поставим инструменты: Qwen Code CLI как агента и OpenSpec как каркас спецификаций — и посмотрим, что именно они генерируют в репозитории.