resolve: два сценария вместо одной цепочки — разведка и решение

Разведка была прологом к коду: три шага, чекпоинт вариантов — и вливание в
общую ветку. Своего исхода у неё не было, поэтому и писать в документы проекта
ей было незачем: ответ оседал в design.md будущего change.

- у разведки появился исход: ответ уезжает в документы канона, задачи заводятся
  и уточняются, написанное коммитится, запись закрывается. Кода сценарий не
  пишет вовсе, OpenSpec ему не нужен
- точка входа осталась одна, и сценарий выбирает скилл, прочитав постановку:
  «есть ли очевидный способ решения» видно после чтения записи, и требовать
  этого суждения от вызывающего значит требовать его раньше, чем оно возможно
- оба сценария лежат справочниками и одинаково — solve.md и research.md, — а в
  SKILL.md остались вход, развилка и правила, не зависящие от сценария.
  Асимметрия читалась бы как старшинство: сценарий в теле скилла выглядит
  основным, а в справочнике — оговоркой
- переход между сценариями — событие с названным исходом: решение, упёршееся в
  незнание способа, останавливается; разведка, выбравшая способ, доводится до
  конца, а код идёт следующим прогоном, который запускает человек
- канон 14: у ADR два законных источника. У решения, принятого разведкой,
  design.md нет по построению, и такое решение либо не попадало в adr/ вовсе,
  либо попадало сочинённым заново

Правки по своему же ревью, до коммита:

- версия 14 была неполной — разрез проверки, вход и устав doc-consistency,
  скелеты adr/README.md и template.md по-прежнему требовали ссылку на
  design.md. Агент краснел бы на законной записи; скелеты уезжают в проекты,
  поэтому запись журнала называет их поимённо
- canon.md объявлял себя двенадцатым, пережив версию 13. Литерал был третьим
  домом числа при двух исправных — убран, а не поправлен
- сценарий разведки был недостижим там, где обещал работать: ready требует у
  research оба раздела, включая «Куда ляжет ответ», а сценарий брался назначить
  адрес сам. Адрес назначает автор записи; сценарий — только когда записи нет
- разведка коммитила без гейта, хотя правит документы канона и индексы задач
- при переносе выпало предупреждение про закрытие разведки без записанного
  ответа — возвращено
This commit is contained in:
av
2026-08-11 11:36:37 +03:00
parent 863769406f
commit b8120d3271
15 changed files with 1073 additions and 526 deletions
+66
View File
@@ -3713,3 +3713,69 @@ change нет — берём источником актуальные спек
на вопрос «по какой записи повышать», а не «сделаны ли шаги по существу».
Машина, приписывающая недостающее число сама, объявляет проект приведённым
к формату, которого никто не проходил.
## 61. Разведка и решение — два сценария одного скилла, а не два скилла (2026-08-11)
Скилл `resolve` вёл обе работы одной цепочкой: у исследовательской задачи были
свои три шага и свой чекпоинт вариантов, после которого она **вливалась в общую
ветку** и продолжалась кодом. Разведка тем самым была не работой со своим
исходом, а прологом к коду: её ответ оседал в `design.md` будущего change, и
разведка, кончившаяся знанием, документов проекта не касалась вовсе.
Сперва я развёл их на два скилла — `resolve` и `research`, с исходом и стопом с
обеих сторон. Через час работы стало видно, чем это плохо: **классифицировать
задачу приходится человеку до вызова**, а «есть ли у неё очевидный способ
решения» видно только после чтения записи. Разделение переносило самое трудное
суждение туда, где для него меньше всего данных.
**Решено: точка входа одна, сценария два, выбирает сценарий скилл.** Оба сценария
живут справочниками — `references/solve.md` и `references/research.md`, — а в
`SKILL.md` остались вход, развилка и правила, не зависящие от сценария. Тем же
приёмом сложен скилл задач: общая часть в `SKILL.md`, алгоритм каждого типа в
`references/task-*.md`.
**Порознь и одинаково — это отдельное решение.** Сперва разведка уехала в
справочник, а решение осталось в теле скилла: так вышло само, потому что решение
там уже лежало. Асимметрия читается как старшинство — сценарий в теле выглядит
основным, а сценарий в справочнике оговоркой, — и удерживает шестисотстрочный
файл, который грузится целиком даже ради разведки.
**Что у разведки появилось своего.** Исход — знание, а не пролог: ответ уезжает в
документы канона (`av-dev-docs:docs`), задачи заводятся и уточняются
(`av-dev-tasks:tasks`), написанное коммитится, запись закрывается. Кода сценарий
не пишет вовсе. OpenSpec ему не нужен — это единственное место скилла, где тот не
предпосылка.
**Переход между сценариями — событие с названным исходом.** Решение, упёршееся в
незнание способа, останавливается; разведка, выбравшая способ, доводится до конца
и **не переходит в код тем же прогоном** — следующий запускает человек. Причина
не в церемонии: разведка только что переписала постановку, и брать её в работу
тем же заходом значит решать за человека, стоит ли делать это сейчас, — а это
приоритет.
**Канон пришлось тронуть, и это версия 14.** ADR цитировал только архивный
`design.md`. У решения, принятого разведкой, `design.md` нет по построению —
change по нему не будет никогда, — и такое решение либо не попадало в `adr/`
вовсе, либо попадало сочинённым заново. Теперь источников два, и оба называются в
записи.
### Что из этого следует
204. **Разделять работы стоит по моменту для человека, а не по роду работы.**
У разведки и решения он разный: варианты обсуждают до первого требования,
объяснение — после ревью дизайна. Всё остальное различие (пишем код или нет)
из этого уже следует.
205. **Точку входа не разделяют по признаку, который виден только внутри.**
Классификация, требующая прочитать запись, не может быть условием вызова:
человек либо ошибётся, либо прочитает запись сам — и тогда скилл ему не
нужен.
206. **Сценарий в справочнике дешевле скилла.** Скилл стоит описания, границ,
копии правил и своего места в графе вызовов; справочник наследует их у
хозяина. Заводить второй скилл имеет смысл, когда его зовут отдельно, а не
когда он просто длинный.
207. **Равные сценарии лежат одинаково.** Оставить один в теле скилла, а второй
вынести — значит назначить первому старшинство, которого в замысле нет.
Читатель это старшинство считывает, даже когда о нём не сказано ни слова.
208. **Работа без своего исхода вырождается в пролог.** Разведка, кончавшаяся
переходом к коду, не имела причины писать в документы: её ответ и так уезжал
в `design.md`. Дом для исхода — вот что делает работу работой.