resolve: третий сценарий — обслуживание, у цикла SDD там нет входа

Задача, не меняющая поведения (тулчейн, зависимости, сборка, гит-хуки, перенос,
чистка), шла полным циклом решения. Все его шаги стоят на дельта-спеках, а у
chore их нет по построению: цикл не урезан ради дешевизны, он остаётся без входа.

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

Ревью идёт фиксированным планом без метки и без разметчика — autotests и
operations, плюс conventions с техническим разбором, когда дифф трогает код.
Конвейер получил раздел «Прогон без change»: он написан вокруг change, и без
этой строки вызов упирался бы в предпосылку OpenSpec. Главный шаг сценария —
синк документации, а триггеры ADR работают стоп-признаком: своего источника у
обслуживания нет, и решение с ценой уходит в разведку.
This commit is contained in:
av
2026-08-13 09:22:50 +03:00
parent f22e7ed829
commit 42849c13eb
10 changed files with 579 additions and 47 deletions
+90 -32
View File
@@ -1,6 +1,6 @@
---
name: resolve
description: "Взять одну задачу и довести её до закрытия. Одна точка входа, два сценария, и выбирает сценарий сам скилл, прочитав постановку. Способ решения известен — сценарий решения: цикл Spec Driven Development (opsx propose → разметка → ревью дизайна → чекпоинт с объяснением человеческим языком → opsx apply → ревью кода → archive → синк документации → коммит → закрытие). Способа нет, постановка мутная, тип research — сценарий разведки: вопрос и рамки → чтение документов, кода и внешних источников (можно opsx:explore) → чекпоинт вариантов: 2–4 способа решить, цена каждого, что становится невозможным, рекомендация → ответ уезжает в документы канона, исход — в задачи → вычитка написанного → коммит → закрытие. Разведка кода не пишет и change не заводит, а выбранный способ реализуется следующим прогоном. На входе путь к файлу задачи, её слаг или просто текст. Использовать, когда просят взять, сделать или решить задачу, разобраться, изучить, сравнить подходы, проработать сырую идею, ответить на вопрос из беклога."
description: "Взять одну задачу и довести её до закрытия. Одна точка входа, три сценария, и выбирает сценарий сам скилл, прочитав постановку. Способ известен и меняется поведение — сценарий решения: цикл Spec Driven Development (opsx propose → разметка → ревью дизайна → чекпоинт с объяснением человеческим языком → opsx apply → ревью кода → archive → синк документации → коммит → закрытие). Способ известен, а спека не меняется (тип chore: тулчейн, зависимости, сборка, гит-хуки, перенос, чистка) — сценарий обслуживания: правка → гейт со сверкой состава проверок → ревью фиксированным планом без change (autotests, operations, плюс conventions, если тронут код) → синк документации → коммит → закрытие; планового стопа нет, change не заводится. Способа нет, постановка мутная, тип research — сценарий разведки: вопрос и рамки → чтение документов, кода и внешних источников (можно opsx:explore) → чекпоинт вариантов: 2–4 способа решить, цена каждого, что становится невозможным, рекомендация → ответ уезжает в документы канона, исход — в задачи → вычитка написанного → коммит → закрытие. Разведка кода не пишет и change не заводит, а выбранный способ реализуется следующим прогоном. На входе путь к файлу задачи, её слаг или просто текст. Использовать, когда просят взять, сделать или решить задачу, обновить зависимости или сборку, разобраться, изучить, сравнить подходы, проработать сырую идею, ответить на вопрос из беклога."
---
# Работа над одной задачей
@@ -8,22 +8,25 @@ description: "Взять одну задачу и довести её до за
Проводит **одну** задачу от постановки до закрытия. Вокруг планового стопа — без
согласований: механику не обсуждаем, делаем.
**Сценария два, а точка входа одна.** Какой из них идёт, решает **скилл**,
**Сценария три, а точка входа одна.** Какой из них идёт, решает **скилл**,
прочитав постановку, а не человек до вызова: «есть ли у задачи очевидный способ
решения» видно после чтения записи, и требовать этого суждения от вызывающего
значит требовать его раньше, чем оно возможно.
решения» и «меняется ли то, что записано в спеке» видно после чтения записи, и
требовать этих суждений от вызывающего значит требовать их раньше, чем они
возможны.
| Сценарий | Когда | Чем кончается |
| --- | --- | --- |
| **решение** | способ известен, спорно только как | код, ревью, архив, коммит, закрытие |
| **решение** | способ известен, меняется поведение | код, ревью, архив, коммит, закрытие |
| **обслуживание** | способ известен, спека не меняется: тип `chore` | правка, ревью, синк, коммит, закрытие |
| **разведка** | способа нет: тип `research`, сырая идея, мутная постановка | ответ в документах, задачи, коммит, закрытие |
Ход каждого сценария живёт своим справочником: **решение**
[references/solve.md](references/solve.md), **разведка**
[references/solve.md](references/solve.md), **обслуживание**
[references/maintain.md](references/maintain.md), **разведка**
[references/research.md](references/research.md). Здесь только общее: вход,
развилка, правила, которые не зависят от сценария. Сценарии лежат порознь и
одинаково, потому что привилегированного среди них нет: тот, что жил бы прямо
здесь, читался бы как основной, а второй — как оговорка.
здесь, читался бы как основной, а прочие — как оговорка.
## Предпосылки
@@ -35,8 +38,9 @@ description: "Взять одну задачу и довести её до за
не
пишется, сказано в `av-dev-code:review`, раздел «Предпосылки», и дом у этого
довода там. Заводить руками не надо: каталог и настройку в `config.yaml`
делает скилл `av-dev-code:openspec`. **Сценарию разведки OpenSpec не нужен**
она не заводит change; `opsx:explore` берётся, если плагин есть.
делает скилл `av-dev-code:openspec`. **Сценариям разведки и обслуживания
OpenSpec не нужен** — они не заводят change; `opsx:explore` берётся разведкой,
если плагин есть.
- **Проектные копии этих скиллов и агентов удаляются при установке плагина**
(`.claude/skills/` — голые имена `resolve`, `review`, а у проектов прошлого
поколения ещё `task-pipeline`, `review-pipeline`, `task-batch`, и с префиксом
@@ -116,18 +120,37 @@ description: "Взять одну задачу и довести её до за
## Развилка: какой сценарий
Она одна, и стоит до всякой работы: **есть ли у задачи один очевидный способ
решения?**
Она в два вопроса, и оба стоят до всякой работы.
**Первый: есть ли у задачи один очевидный способ решения?**
- **есть** — что делать, понятно; спорно только как. **Сценарий решения**
[references/solve.md](references/solve.md);
- **нет** — тип `research`, сырая идея, новое и незнакомое, мутная постановка,
два подхода с разной ценой. **Сценарий разведки**
[references/research.md](references/research.md).
[references/research.md](references/research.md);
- **есть** — что делать, понятно; спорно только как. Тогда второй вопрос.
Признак не в объёме работы. Крупная задача с очевидным способом идёт в решение;
маленькая, но незнакомая — в разведку. Тип `research` в разведку идёт всегда: её
исход знание, а не изменение системы.
**Второй: меняется ли то, что записано в `openspec/specs/`?**
- **меняется** — появляется или правится поведение. **Сценарий решения**
[references/solve.md](references/solve.md);
- **не меняется** — тулчейн и сборка, зависимости, гит-хуки и шаги гейта,
перенос, чистка. **Сценарий обслуживания**
[references/maintain.md](references/maintain.md).
**Второй вопрос решается связкой из двух признаков, и оба обязательны:** тип
записи предлагает (`chore`, реже `fix`, возвращающий поведение к уже
записанному), а отсутствие дельт подтверждает. Тип объявляет автор и может
ошибиться; отсутствие дельт — твоё суждение и принимается только вместе с типом.
Признаки разошлись — это стоп, а не выбор: скажи, что тип и предмет работы не
сходятся, и остановись. Подробно — [maintain.md](references/maintain.md), раздел
«Признак — связка, а не одно условие».
**Признак не в объёме работы, и это относится к обоим вопросам.** Крупная задача
с очевидным способом идёт в решение; маленькая, но незнакомая — в разведку;
однострочная правка, меняющая поведение, идёт полным циклом решения, а не
обслуживанием. Путь, выбираемый по самооценке размера, — самый дешёвый способ
«ускориться» и самый дорогой по последствиям. Тип `research` в разведку идёт
всегда: её исход знание, а не изменение системы.
**Назови выбранный сценарий вслух первой репликой** — одной строкой, с причиной.
Молча выбранный сценарий человек обнаруживает по тому, что работа пошла не туда,
@@ -135,15 +158,27 @@ description: "Взять одну задачу и довести её до за
### Сценарий выбирается один раз
**Смена сценария по ходу — событие, а не тихий поворот**, и каждая из двух смен
**Смена сценария по ходу — событие, а не тихий поворот**, и каждая смена
устроена по-своему:
- **решение → разведка**: обнаружилось, что очевидного способа нет. Это **стоп**
с исходом «нужна разведка»: назови, что именно неясно, и не продолжай.
Кода к этому моменту не написано, и писать его «пока разбираемся» нельзя;
- **разведка → решение**: способ выбран на чекпоинте вариантов. Разведка **всё
равно доводится до конца** — ответ записан, задачи уточнены, коммит сделан, —
и решение идёт **следующим прогоном**, который запускает человек.
- **обслуживание → решение**: нашлась дельта-спека, то есть поведение всё-таки
меняется. **Стоп** с исходом «меняется спека». Сделанное не выбрасывается, но
и не коммитится: оно уезжает в change следующим прогоном. Коммит обслуживания
заявляет «поведение не менялось» — под ним поведение меняется молча;
- **обслуживание → разведка**: форма правки неизвестна (мажорное обновление,
смена сборщика). **Стоп** с исходом «нужна разведка», по тому же основанию,
что и у решения;
- **разведка → решение или обслуживание**: способ выбран на чекпоинте вариантов.
Разведка **всё равно доводится до конца** — ответ записан, задачи уточнены,
коммит сделан, — и работа идёт **следующим прогоном**, который запускает
человек.
Обратной смены «решение → обслуживание» нет: задача, заведшая change, доводится
циклом решения. Дельта-спеки, оказавшиеся пустыми, — находка ревью дизайна о
самой постановке, а не повод свернуть на короткий путь из середины длинного.
**Соблазн «разведаю по ходу» живёт именно здесь**, и он дорог тем, что выглядит
экономией одного прогона. Разведка внутри решения не имеет своего чекпоинта:
@@ -156,13 +191,19 @@ flowchart TD
in["вход: файл, слаг или текст"]
ready["ready: готовность записи<br/>av-dev-tasks:tasks"]
fork{"есть очевидный<br/>способ решения?"}
fork2{"меняется ли<br/>спека?"}
solve["сценарий решения<br/>references/solve.md<br/>код, ревью, архив, коммит"]
main["сценарий обслуживания<br/>references/maintain.md<br/>правка, ревью, синк, коммит"]
res["сценарий разведки<br/>references/research.md<br/>ответ в документы и задачи"]
in --> ready --> fork
fork -->|"да"| solve
fork -->|"да"| fork2
fork -->|"нет"| res
fork2 -->|"да"| solve
fork2 -->|"нет: тип chore"| main
solve -.->|"способа всё же нет:<br/>стоп, кода не написано"| res
main -.->|"нашлась дельта:<br/>стоп, следующим прогоном"| solve
main -.->|"форма неизвестна:<br/>стоп"| res
res -.->|"способ выбран:<br/>следующим прогоном,<br/>зовёт человек"| solve
```
@@ -171,10 +212,18 @@ flowchart TD
## Автономность и плановый стоп
**У каждого сценария ровно один плановый стоп**, и стоят они в разных местах:
**У двух сценариев ровно один плановый стоп**, и стоят они в разных местах:
у решения — объяснение после ревью дизайна, у разведки — варианты до первого
написанного требования. Правило вокруг них общее.
**У обслуживания планового стопа нет вовсе, и это следствие, а не поблажка.**
Чекпоинт объясняет человеку **выбор**, а у обслуживания выбора нет по
построению: что делать, сказано в записи, и объяснение свелось бы к пересказу
задачи её же автору. Стоп, на котором нечего решать, вырождается в обряд
одобрения и обесценивает те стопы, где решать есть что. Правило необратимого
(ниже) действует там полностью и срабатывает чаще, чем в двух других сценариях:
выкладка, токены, хуки и чужие данные — обычное содержимое задач обслуживания.
**Вокруг чекпоинта умолчание прежнее — делать, а не спрашивать.** Чекпоинт не
отменяет автономность, он даёт развилкам плановое место, куда копиться.
@@ -247,25 +296,30 @@ flowchart TD
ли решаем», чекпоинт разведки — «каким из способов», но не «надо ли».
Что не принадлежит **отдельному сценарию**, названо у него же: урожай ревью и
выбор способа — в [solve.md](references/solve.md), код и приоритет — в
выбор способа — в [solve.md](references/solve.md), изменение поведения и нарезка
пачки — в [maintain.md](references/maintain.md), код и приоритет — в
[research.md](references/research.md).
## Наблюдаемые исходы
**У каждого сценария их четыре**, и живут они у сценария:
[решение](references/solve.md) — сделана, не доведена, оказалась крупнее задачи,
нужна разведка; [разведка](references/research.md) — способ выбран, знание
записано, отказ, не доведена.
нужна разведка; [обслуживание](references/maintain.md) — сделана, не доведена,
меняется спека, нужна разведка; [разведка](references/research.md) — способ
выбран, знание записано, отказ, не доведена.
Общего исхода нет намеренно. «Сделана» у решения и «знание записано» у разведки —
разные вещи с разной приёмкой, и слово, накрывающее оба, скрывало бы именно то,
чем прогон кончился.
чем прогон кончился. «Сделана» у решения и у обслуживания совпадает словом, но не
определением: у первого в него входит пройденный чекпоинт и заархивированный
change, у второго — сверенный состав гейта и синк.
## Доклад
Ядро общее, и в нём обязательно:
- **какой сценарий шёл** — решение или разведка, — и почему выбран он;
- **какой сценарий шёл** — решение, обслуживание или разведка, — и почему выбран
он;
- **исход** одним из четырёх слов своего сценария и, если он не благополучный,
чем ограничен результат;
- что сделано, какие вопросы записаны и куда;
@@ -273,6 +327,8 @@ flowchart TD
Сверх ядра каждый сценарий добавляет своё: [solve.md](references/solve.md) —
чекпоинт, change, критерии приёмки, урожай и границы покрытия;
[maintain.md](references/maintain.md) — чем подтверждён признак, состав гейта до
и после, критерии приёмки, урожай и границы покрытия;
[research.md](references/research.md) — вопрос и ответ, адреса записи, заведённые
задачи, рамки.
@@ -281,11 +337,13 @@ flowchart TD
- **Не завязывайся на основную ветку и корень репозитория.** Скилл работает в
текущем worktree и на текущей ветке: не делай `git checkout`/`switch`, не
создавай веток, не пушь.
- Прогон проходит **один** чекпоинт, и это норма, а не упрощение. Два стопа за
одну задачу — цена незнания способа, и платится она двумя прогонами, а не одним
длинным.
- Прогон проходит **не больше одного** чекпоинта, и это норма, а не упрощение.
Два стопа за одну задачу — цена незнания способа, и платится она двумя
прогонами, а не одним длинным. У обслуживания чекпоинта нет ни одного, и это
тоже норма: там нечего решать.
- Держи вызывающего в цикле короткими репликами на переходах фаз, но не проси
подтверждать механику: чекпоинт — единственное место, где ждут ответа.
подтверждать механику: чекпоинт — единственное место, где ждут ответа, а в
обслуживании такого места нет вовсе.
- **Сценарий назван вслух — значит, его можно оспорить.** Человек, увидевший в
первой реплике «иду разведкой, потому что способа не видно», поправит выбор
одной фразой; молча выбранный сценарий он поправит через полчаса работы.