Модуль 10
От идеи до готового приложения
Идея «программа лояльности» превращается в файл требований через интервью с агентом, режется на задачи с критериями и проходит цикл «сессия, план, правка, проверка, статус, коммит» до приёмки по сценариям. В конце: как этот подход называется и где готовые фреймворки.
Содержание модуля
Чему научишься
- собирать требования в docs/loyalty.md через интервью с агентом
- декомпозировать требования на задачи с проверяемыми критериями
- проводить задачу по циклу: сессия, план, правка, проверка критерия, статус, коммит
- принимать фичу прогоном сценариев из файла требований
До сих пор требование приходило готовым: TODO в pricing.ts, сломанная валидация, устаревший README. Реальный поток начинается словами «хочу программу лояльности», и качество приложения решается до первой правки кода. Модуль проходит весь цикл на фиче лояльности в orders-api, те же шаги работают и для нового проекта с нуля.
В цикле четыре шага: интервью и файл требований, декомпозиция на задачи, выполнение по одной, приёмка по сценариям. Поток держат два файла: docs/loyalty.md хранит требования, TASKS.md хранит задачи и статусы. Файлы переживают сессии, чат умирает вместе с задачей.
Шаг 1. Идея превращается в требования
Дай агенту роль интервьюера: пусть прежде чем предлагать решение задаёт вопросы. Вопросы находят дыры в идее до кода: начисление до или после скидки от 1000 ₽, сгорают ли баллы, что делать со старыми заказами. Отвечай фактами и числами, каждое решение фиксируй в файле требований.
Хочу программу лояльности в orders-api. Прежде чем что-то предлагать, задай уточняющие вопросы, ответы зафиксируй в docs/loyalty.md
Вопросы: 1. Сколько баллов начислять и от чего: процент от суммы или фикс за заказ? 2. Начисление до скидки от 1000 ₽ или после неё? 3. Округление при начислении? 4. Сгорают ли баллы и через сколько? 5. Можно ли списать часть баллов и какой максимум списания? 6. Что с заказами, сделанными до запуска программы?
1 балл за каждые полные 10 ₽ оплаченной суммы, после скидки. Списание частями, максимум 50% суммы заказа, передаётся полем loyalty.spend. Сгорают через 30 дней. Старые заказы не трогаем.
Создан docs/loyalty.md: правила, сценарии приёмки, границы
# Программа лояльности
Правила:
- 1 балл за каждые полные 10 ₽ оплаченной суммы (после скидки от 1000 ₽)
- 1 балл = 1 ₽ при списании, списание до 50% суммы заказа
- Списание передаётся в заказе полем loyalty.spend
- Баллы сгорают через 30 дней после начисления
- Профиль баллов заводится по полю customer, старые заказы баллов не начисляют
Сценарии приёмки:
1. Заказ cap×3 + chz×2 (1740 ₽) со скидкой: к оплате 1566 ₽, начислено 156 баллов
2. Следующий заказ chz×2 (840 ₽) с loyalty.spend 100: к оплате 740 ₽
3. Запрос списать 500 баллов за заказ 840 ₽ отклоняется: максимум 50%
4. Заказ с новым customer заводит профиль баллов с нуляШаг 2. Требования превращаются в задачи
План-агент режет файл требований на задачи. Правило размера: одна задача закрывается одним коммитом и имеет проверяемый критерий, тест или curl-сценарий. Критерий пишется рядом с задачей сразу, приёмка потом пойдёт по этим критериям.
@docs/loyalty.md Разбей требования на задачи: одна задача — один коммит, у каждой проверяемый критерий (тест или curl). Сохрани в TASKS.md со статусами
Пять задач: профиль баллов, начисление, списание, сгорание, README. Критерии взял из сценариев приёмки, порядок выстроен по зависимостям: списание опирается на профиль и начисление. Файл TASKS.md создан.
# TASKS: программа лояльности
- [ ] 1. Профиль баллов в data/db.json: чтение и запись
Критерий: заказ из сценария 1 заводит профиль с 156 баллами
- [ ] 2. Начисление: 1 балл за полные 10 ₽ оплаченной суммы
Критерий: тест сценария 1 зелёный
- [ ] 3. Списание до 50% суммы в POST /api/orders (поле loyalty.spend)
Критерий: тесты сценариев 2 и 3 зелёные
- [ ] 4. Сгорание через 30 дней после начисления
Критерий: тест с фиксированной датой зелёный
- [ ] 5. README: раздел «Лояльность» с правилами и сценариями
Критерий: правила и все 4 сценария описаныШаг 3. Цикл одной задачи
Задача живёт в своей сессии: /new перед началом, план в plan-агенте, правки в build (Shift+Tab из модуля 2). Критерий гоняешь на месте, статус в TASKS.md обновляет агент по твоей команде, коммит несёт номер задачи. Ревью субагентом из модуля 4 закрывает петлю.
/new
Сессия «Задача 2: начисление баллов»
Задача 2 из TASKS.md: начисление после оплаты. Составь план
План: сервис src/services/loyalty.ts с функцией начисления, вызов из POST /api/orders после подсчёта суммы, тест tests/loyalty-accrual.test.ts по сценарию 1 (156 баллов).
Делай по плану
Созданы src/services/loyalty.ts, tests/loyalty-accrual.test.ts; изменён src/routes/orders.ts
Прогони критерий задачи 2
npm test: все тесты зелёные, включая новый, начисление даёт 156 баллов. TASKS.md готов закрыть после твоей проверки.
Проверил. Закрой задачу и сделай коммит
TASKS.md: задача 2 [x]. Коммит feat(loyalty): задача 2 — начисление баллов.
Шаг 4. Приёмка по требованиям
Приёмка идёт по сценариям из docs/loyalty.md. Прогони каждый curl'ом, затем npm test целиком и обнови README задачей 5. Упавший сценарий означает дыру в требованиях: вопрос возвращается в docs/loyalty.md, задача в TASKS.md.
# сценарий 1: заказ 1740 ₽ -> 1566 к оплате, 156 баллов
curl -s localhost:3000/api/orders -H "Content-Type: application/json" \
-d '{"customer":"Аня","items":[{"menuId":"cap","quantity":3},{"menuId":"chz","quantity":2}]}'
# сценарий 2: заказ 840 ₽ со списанием 100 баллов -> 740 к оплате
curl -s localhost:3000/api/orders -H "Content-Type: application/json" \
-d '{"customer":"Аня","items":[{"menuId":"chz","quantity":2}],"loyalty":{"spend":100}}'
npm testПрактика модуля
Хочу программу лояльности. Прежде чем что-то предлагать, задай уточняющие вопросы, ответы зафиксируй в docs/loyalty.md@docs/loyalty.md Разбей на задачи: одна задача — один коммит, у каждой проверяемый критерий. Сохрани в TASKS.md со статусами/new@reviewer сделай ревью src/services/loyalty.ts перед закрытием задачиcurl -s localhost:3000/api/orders -H "Content-Type: application/json" \ -d '{"customer":"Аня","items":[{"menuId":"cap","quantity":3},{"menuId":"chz","quantity":2}]}'
Отмечено 0 из 9
Проверь себя
Вопрос 1 из 5
Шпаргалка модуля
Интервью
- Роль интервьюера
- «Прежде чем предлагать, задай вопросы»
- Ответы фактами
- числа и границы, решение сразу в файл требований
Декомпозиция
- Задача
- один коммит, один проверяемый критерий
- TASKS.md
- статусы [ ] / [x] рядом с критериями
Цикл задачи
- /new
- задача получает свою сессию
- План до правок
- plan-агент, потом build
- Статус после проверки
- человек проверил критерий, агент отметил
- Коммит
- номер задачи в сообщении
Название подхода
- SDD
- spec-driven development: спецификации в репозитории
- OpenSpec, Spec Kit, BMAD, Kiro
- готовые фреймворки цикла