Files
dev-skills/decisions/78-tail-reflection-silent-new-by-word.md
T
av a4bc9191e7 хвост задачи: отражение молча, новое — по слову человека
Синк документации делил правки по документам, а делить их надо по роду.
Отражение сделанного (вливание дельт, миграция, компонент в обзоре) пишется
молча: без правки документ станет ложным. Новая запись и новая норма — ADR,
конвенция, записка разведки, инвариант, периметр, дефект в журнале — только
предлагаются, а пишет их третий такт шага 6 после слова человека.

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

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

Журнал — тема 78.
2026-08-23 19:06:06 +03:00

113 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. Хвост подорожал только на задачах, где что-то заводится.** Второй запуск
агента идёт лишь после непустой реплики; задача без нового кончается первым
тактом, и по цене хвост у неё прежний.