хвост задачи: отражение молча, новое — по слову человека

Синк документации делил правки по документам, а делить их надо по роду.
Отражение сделанного (вливание дельт, миграция, компонент в обзоре) пишется
молча: без правки документ станет ложным. Новая запись и новая норма — ADR,
конвенция, записка разведки, инвариант, периметр, дефект в журнале — только
предлагаются, а пишет их третий такт шага 6 после слова человека.

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

Сверка документов получила счётчик: doc-healthcheck оставляет след ключом
[healthcheck] last в .av-dev.toml, синк считает по нему задачи с прошлого
прогона и говорит строкой. Прежде признак «десяток задач» держался в памяти,
то есть не срабатывал.

Журнал — тема 78.
This commit is contained in:
av
2026-08-23 19:06:06 +03:00
parent 3c89d7111d
commit a4bc9191e7
12 changed files with 462 additions and 62 deletions
@@ -0,0 +1,112 @@
# 78. Хвост задачи: отражение молча, новое — по слову (2026-08-23)
## Что было
Тема 77 привела ревью в соответствие с ролью агента: цикл проверяет корректность
и механику, а суждение о замысле стоит там, где решает человек. **Хвост задачи
остался прежним.**
Шаг 6 писал в документы сам. Синк шёл по чек-листу из десяти строк с
принуждённым отрицанием и по сработавшему триггеру заводил ADR, промоутил находку
в конвенцию, писал в `research/`, `security.md`, `CLAUDE.md`, журнал дефектов.
Человек узнавал об этом **постфактум** — строками чек-листа в докладе, который
читают последним и по диагонали. Задачи из урожая ревью к этому времени уже
заводились по слову (Р307), а документы — нет: одна и та же работа, «что из
найденного переживёт задачу», решалась в двух разных режимах.
Вопросов при этом выходило два — про урожай на шаге 5 и про документы на шаге 6,
— то есть два переключения человека там, где решение одно.
Отдельно стояла **сверка документов**. `av-dev:doc-healthcheck` зовут по
наблюдаемому признаку «с прошлой сверки сделан десяток задач», но следа сверка не
оставляла и задачи с тех пор не считал никто. Это ровно тот прозаический триггер,
измеренная цена которого записана в самом же синке: у ADR такой триггер дал **6
записей на 43 изменения**.
## Решено
**Р311. Правки в документы разделены по роду, и спрашивается один род.** Признак
проверяемый: **что станет с документом, если правку не сделать**. Станет ложным —
это **отражение**, и оно пишется молча. Появится запись или норма, которой не
было, — это **новое**, и оно пишется только по слову человека.
**Р312. Отражение — документы, описывающие состояние системы.** Это
`openspec/specs/`, `database.md` и `architecture.md`. Остальной чек-лист — новое:
`adr/`, `conventions/`, `research/`, `security.md`, `passport.md`, `CLAUDE.md` и
журнал `review.md` задают норму или хранят память, и разойтись им не с чем, пока
в них не написано новое.
**Р313. Реплика человеку одна на весь хвост.** В ней и предложения синка, и
урожай ревью; вопрос про урожай перенесён с шага 5 на шаг 6. Нового нет —
реплики нет, и у большинства задач так и выходит.
**Р314. Шаг 6 идёт в три такта, агент запускается в нём дважды.** Первый такт —
`opsx:archive` и отражение; второй — реплика; третий — письмо одобренного и
задачи из урожая. Вычитку `doc-wording` зовёт `av-dev:doc-sync` **последним
тактом, в котором писал**: вернул непустой список предложений — вычитка ждёт
третьего такта, список пуст — идёт в первом.
**Р315. Конвенция — самое дорогое из нового, и в хвосте она только
предлагается.** Её строка становится входом каждого следующего прогона ревью.
Механизация правила (шаг 2 промоута: конфиг, сканер, приведение кода к зелёному)
в хвост чужой задачи не помещается вовсе — это задача `chore`, заводимая тем же
словом, что и сама конвенция.
**Р316. Отвергнутое не пишется никуда.** Ни в один документ, ни отдельной
записью «от такого-то отказались»: журнала отвергнутого канон не держит, и
заведение его было бы ровно тем новым, которого человек только что не заказал.
Отказ идёт строкой доклада.
**Р317. «По слову» — это по слову, а не вторым вопросом.** Сказанное человеком в
этом же прогоне повторно не спрашивается: решение сузить проверки принимает он по
определению, ответ разведки одобрен чекпоинтом вариантов, прямая просьба «заведи
ADR» и есть слово. Предложение существует ради нового, которое заметил агент.
**Р318. Сверка документов оставляет след, а синк его считает.** След — ключ
`[healthcheck] last` в `.av-dev.toml`, хеш коммита прошлого прогона; ставит его
`av-dev:doc-healthcheck` последним шагом. Счёт — `git rev-list --count
<last>..HEAD -- openspec/changes/archive`, то есть в задачах, доехавших до архива;
без openspec считаются коммиты, и это говорится вслух. Строка доклада
обязательна всегда, вариантов три: рано, пора, не сверялись ни разу. **Синк
сверку не зовёт** — часы на неё тратит тот, кто их оплачивает.
## Следствия
**С275. Плановых стопов в сценарии решения два, и оба про решения человека.**
Чекпоинт шага 3 решает форму решения до кода, реплика шага 6 — что из найденного
переживёт задачу. Между ними прогон идёт сам: инлайн чинится молча, отражение
пишется молча. Третий стоп заводить нельзя — прогон, останавливающийся чаще,
теряет то время, ради которого выбраны короткие итерации.
**С276. Принуждённое отрицание сменило адресата, но не ослабло.** Каждый документ
канона по-прежнему назван — правкой, предложением или отрицанием с причиной;
изменилось то, что отрицание читает человек и читает его **до** того, как
что-нибудь написано.
**С277. Сценарий обслуживания почти не спрашивает.** Он двигает факты — команды,
шаги гейта, зависимости поимённо, пути, числа настроек, — а факт, разошедшийся с
кодом, это отражение по определению. Поводов для реплики у него два: новый запрет
в `CLAUDE.md` и сужение проверок в `review.*`, причём второе не спрашивается по
Р317.
**С278. Признак «десяток задач» стал числом.** Ключ `.av-dev.toml`
необязательный и заводится сам первым же прогоном сверки, поэтому версия
раскладки не двигается и `upgrade` проектам не нужен. Отсутствие ключа читается
однозначно: не сверялись ни разу.
**С279. Журнал дефектов теперь зависит от ответа человека.** Запись
воспроизведённого дефекта — новое, и молчаливого «да» у неё больше нет. Правило
«пишется сразу» сохранено в другом виде: предложение делается **этим** прогоном,
отложить его до «когда починим» нельзя ни с чьего согласия. Но человек вправе
отказать, и тогда калибровка конвейера по этому дефекту не состоится — цена
названа здесь, а не подразумевается.
**С280. Отказ нигде не хранится, и похожее предложение придёт снова.** Это прямое
следствие Р316 и сознательный размен: журнал отвергнутого сам стал бы каноном,
который никто не заказывал. В `av-dev:code-deep-review` разбор устроен иначе —
там отказ уезжает в `docs/review.md`, потому что прогон затевается ради разговора
и его исход и есть артефакт.
**С281. Хвост подорожал только на задачах, где что-то заводится.** Второй запуск
агента идёт лишь после непустой реплики; задача без нового кончается первым
тактом, и по цене хвост у неё прежний.