Files
dev-skills/decisions/39-sprint-without-goal.md
T
av bf6a173115 журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
2026-08-13 12:40:56 +03:00

4.7 KiB

39. Спринт без цели — законный случай (2026-08-07)

Цель была обязательной: sprint start --goal требовал слаг, check считал ошибкой набор без названной цели, sprint take отказывал задаче под чужой целью. Модель описывала только спринт развития — а спринт бывает под багфикс, под техдолг, под здоровье проекта. Такой набор собран по работоспособности, а не по направлению, и цели у него нет не по недосмотру.

Обходной путь существовал и был хуже прямого: завести цель-пустышку («Здоровье проекта») и вешать под неё fix-и. Тогда ROADMAP.md — документ про то, что приложение умеет, — обрастает строками про то, что оно не ломается, а тег goal: перестаёт значить направление.

Р159. Цель у спринта необязательна, но её отсутствие — ответ, а не молчание. sprint start принимает --goal <слаг> или --no-goal, и голое отсутствие обоих — отказ с объяснением. Причина в стимуле: цель называет человек, и это единственный продуктовый вопрос всей сессии. Разреши мы заводить спринт просто без флага — забытый флаг, лень спросить и осознанное решение стали бы неотличимы на выходе, а дешевле всего из трёх агенту именно не спрашивать.

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

Р161. Признак «спринт идёт» — слаг, а не цель. Прежде код спрашивал цель и получал заодно ответ про то, открыт ли спринт; теперь эти вопросы разошлись. Слаг подходит на роль признака лучше цели по существу: он есть у любого спринта, потому что без него нечем проставить sprint:<слаг>, то есть нечем собрать урожай. Поле «Цель» в шапке остаётся на месте и у бесцельного набора — пишется прозой без ссылки: «цели нет» и «цель потерялась» обязаны различаться.

Что из этого следует

С145. Необязательное поле, которое всё же решают, заводится парой «значение или явный отказ». Умолчанием тут был бы не выбор, а его отсутствие — и отличить его от забывчивости уже не смог бы никто, включая автора.

С146. Признак «сущность существует» нельзя вешать на её необязательное поле. Пока цель была обязательной, sprint_goal() отвечал сразу на два вопроса, и это работало ровно до тех пор, пока второй ответ не понадобился отдельно.

С147. Снятая проверка называет, что осталось вместо неё. Цель не проверяется — значит, за состав отвечают показ человеку и строка доклада; иначе послабление читается как «здесь можно не думать».