task-pipeline переписан в resolve: два плановых стопа

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

Чекпоинтов два. «Варианты» — у исследовательской задачи, до первого
требования: 2-4 способа с ценой каждого и рекомендацией, выбор оседает
по адресу, который назвала сама запись. «Объяснение» — у всякой, после
ревью дизайна: человек читает просеянное машиной.

Объяснение не завело своего артефакта — оно собирается из proposal.md и
design.md, а требование к их форме уехало в openspec/config.yaml
(rules.proposal, rules.design), то есть применяется в момент написания.
Отдельный раздел был бы третьим домом одного объяснения.

Закрыт открытый вопрос: находка ревью, меняющая дельта-спеки, отменяет
одобрение — разметка пересчитывается, чекпоинт повторяется.
This commit is contained in:
av
2026-08-09 15:34:13 +03:00
parent c3828b3713
commit c5e6883461
10 changed files with 744 additions and 538 deletions
+68
View File
@@ -3392,3 +3392,71 @@ JJJ): у профиля обязан быть один правильный от
через месяц неотличимо от подогнанного под один случай. Обе стороны разрыва
названы (0.64 и 0.91) — и видно не только, что порог верен, но и насколько
он не на грани.
## 55. `task-pipeline` стал `resolve`: два плановых стопа вместо полной автономии (2026-08-09)
**АЕАКН. Автоматическое решение задач агентом признано утопией — «работает, но
работает плохо», — и хуже того, автор перестал ориентироваться в собственном
процессе.** Отсюда разворот: задачи решаются по одной, а в цикл возвращается
человек. `task-batch` удалён целиком; `task-pipeline` переписан в `resolve`.
**Прежняя доктрина звучала «умолчание — делать, а не спрашивать», и она не
отменена, а ограничена.** Полностью автономный прогон плох не тем, что ошибается,
а тем, что ошибку видно на готовом коде: развилка, стоившая бы абзаца до
`propose`, стоит переписывания после `apply`. Постоянное же согласование
возвращает ту цену, ради ухода от которой пайплайн и писался. Разрез поэтому по
**месту**, а не по важности решения: развилка, найденная до ближайшего чекпоинта,
копится в него; найденная после последнего — по-прежнему уходит вопросом в запись,
и задача доводится в объявленных границах.
**Чекпоинтов два, и второй обязателен всегда.**
- **«варианты»** — у исследовательской задачи, до первого требования. Признак
ветки не объём работы, а **отсутствие одного очевидного способа решения**:
обсуждать варианты после `propose` поздно, предложение уже воплотило один из
них, и разговор пойдёт не о выборе, а о переделке. Форма ограничена сверху —
2–4 варианта: больше четырёх человек не сравнивает, а признаёт неспособность
сравнить и просит рекомендацию.
- **«объяснение»** — у всякой задачи, **после** ревью дизайна. Порядок обоснован:
человек читает то, что уже просеяла машина, и не тратит внимание на выловимое
`review-specs`. Внимание здесь самый дорогой ресурс процесса.
**Объяснение не стало новым артефактом, и это главная правка первоначального
замысла.** Задумывалось отдельным разделом в `design.md`; при разборе оказалось,
что оно там было бы **третьим домом** одного и того же: в `proposal.md` уже есть
`## Why` («в чём проблема»), в `design.md` — рассмотренные варианты. Поэтому
объяснение **собирается из двух существующих артефактов**, а требование к их
форме уехало в `openspec/config.yaml``rules.proposal` и `rules.design`. Это
единственное место, применяющееся **в момент написания**, а не после.
Побочная выгода: `design.md` с названными причинами отказа — половина будущего
ADR, а промоут ADR читает именно архивный `design.md`.
**Закрыт вопрос, висевший в плане открытым: что делает автоматический участок,
когда ревью кода спорит с одобренным дизайном.** Признак проверяемый —
**меняются ли дельта-спеки**. Не меняются: находка внутри дизайна, дожимается
сама. Меняются: решение стало другим, а одобрено было прежнее — разметка
пересчитывается (правило уже было) и **чекпоинт повторяется**. Чекпоинт, который
можно обойти находкой ревью, не значит ничего, и хуже того — человек уверен, что
одобрил именно то, что уехало в коммит.
**Удаление `task-batch` обошлось дороже своего каталога.** На нём держались:
третий режим `review-specs` (стык после слияния) вместе с исключением «живого
change нет — берём источником актуальные спеки»; единственное исключение из
правила `review-triage` «плана нет — не запускаюсь»; и обоснование имени основной
ветки в каноне — «в неё вливает батч». Первые два — послабления, существовавшие
только ради батча, и с ним они исчезли, сделав оба правила строже.
### Что из этого следует
184. **Автономность ограничивается местом, а не важностью решения.** «Спрашивать
о важном» неисполнимо: важность оценивает тот же, кто хочет закончить.
«Копить до ближайшего планового стопа» проверяемо и не требует суждения.
185. **Чекпоинт ставится после машинной проверки, а не до неё.** Внимание
человека тратится только на то, чего машина не ловит; порядок наоборот
сжигает его на выловимом и обесценивает саму остановку.
186. **Объяснение для человека не заводит своего артефакта.** Если оно
собирается из уже существующих, оно не может с ними разойтись; отдельный
текст «то же, но понятнее» — третий дом, и расходится он молча.
187. **Послабление, введённое ради одного потребителя, уходит вместе с ним.**
Исключение переживает своего заказчика и выглядит общим правилом; удаляя
потребителя, ищи его исключения — они и есть настоящий хвост.