хвост задачи: отражение молча, новое — по слову человека
Синк документации делил правки по документам, а делить их надо по роду. Отражение сделанного (вливание дельт, миграция, компонент в обзоре) пишется молча: без правки документ станет ложным. Новая запись и новая норма — ADR, конвенция, записка разведки, инвариант, периметр, дефект в журнале — только предлагаются, а пишет их третий такт шага 6 после слова человека. Реплика при этом одна на весь хвост: вопрос про урожай ревью переехал с шага 5 на шаг 6 и слился с предложениями синка — решение одно, «что из найденного переживёт задачу». Плановых стопов в сценарии решения стало ровно два, и оба про решения человека. Сверка документов получила счётчик: doc-healthcheck оставляет след ключом [healthcheck] last в .av-dev.toml, синк считает по нему задачи с прошлого прогона и говорит строкой. Прежде признак «десяток задач» держался в памяти, то есть не срабатывал. Журнал — тема 78.
This commit is contained in:
+139
-23
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: doc-sync
|
||||
description: Вести содержимое документов канона по ходу разработки — синк после сделанной задачи с построчным отчётом по каждому документу, заведение ADR промоутом из архивного design.md или из записки разведки, запись наблюдения в research, запись дефекта и настройки конвейера в review.md, чистка architecture.md от поведения с маркерами долга. Использовать, когда задача сделана и надо обновить документацию, когда просят завести ADR или записать решение, занести находку о внешних данных, записать проскочивший дефект, разгрузить разросшуюся архитектуру. Раскладку и соответствие канону проверяет скилл av-dev:canon.
|
||||
description: "Вести содержимое документов канона по ходу разработки. Правки двух родов, и спрашивается один: отражение сделанного (вливание дельт, миграция в database.md, компонент в architecture.md) пишется молча, а новая запись и новая норма (ADR, правило в conventions, записка в research, инвариант CLAUDE.md, периметр security.md, граница passport.md, дефект в review.md) только предлагается — пишет её второй запуск после слова человека. Построчный отчёт по каждому документу остаётся: каждый назван либо правкой, либо предложением, либо отрицанием с причиной. ADR и записка разведки — промоут цитатой из архивного design.md или записки, а не второе сочинение. Синк же считает и выдаёт строкой сигнал сверки: сколько задач сделано с прошлого прогона av-dev:doc-healthcheck. Использовать, когда задача сделана и надо обновить документацию, когда просят завести ADR или записать решение, занести находку о внешних данных, записать проскочивший дефект, разгрузить разросшуюся архитектуру. Раскладку и соответствие канону проверяет скилл av-dev:canon."
|
||||
---
|
||||
|
||||
# Ведение содержимого канона
|
||||
@@ -27,32 +27,84 @@ description: Вести содержимое документов канона
|
||||
Это тот же приём, что «границы покрытия» в отчёте ревью и «пустое называется
|
||||
пустым» в каноне.
|
||||
|
||||
## Два рода правок, и спрашивается один
|
||||
|
||||
Второе правило, поперёк первого: **пройти по всем документам обязан ты, а
|
||||
завести новое — человек**. Признак проверяемый и читается одним вопросом: **что
|
||||
станет с документом, если правку не сделать**.
|
||||
|
||||
<!-- дом: синк-род-правки -->
|
||||
|
||||
- **Отражение** — документ уже описывает эту вещь, и без правки он **станет
|
||||
ложным**: миграция написана, а `database.md` её не знает; компонент заведён, а
|
||||
`architecture.md` перечисляет прежние. Такая правка ничего не решает, она
|
||||
договаривает решённое на чекпоинте и уже стоящее в коде. **Пишется молча.**
|
||||
- **Новое** — в каноне заводится запись или норма, которой не было: ADR, правило
|
||||
в конвенциях, записка в `research/`, инвариант в `CLAUDE.md`, сдвиг периметра в
|
||||
`security.md`, граница в `passport.md`, дефект в журнале `review.md`. Такая
|
||||
запись переживёт задачу и свяжет следующие. **Пишется только по слову
|
||||
человека.**
|
||||
|
||||
<!-- /дом: синк-род-правки -->
|
||||
|
||||
**Показывается новое одной репликой и одним списком.** Каждый пункт — строкой:
|
||||
что заведём, куда и на каком основании. Человек отвечает разом, и одобренное
|
||||
пишет **следующий заход синка** — в цикле задачи это третий такт шага 6
|
||||
(`av-dev:code-resolve`, `references/solve.md`). **Нового нет — реплики нет**, и
|
||||
это обычный исход: у большинства задач хвост состоит из одного отражения.
|
||||
|
||||
**«По слову» — это по слову, а не вторым вопросом.** Человек уже сказал в этом
|
||||
прогоне «заведи ADR», сам решил сузить проверки, сам одобрил формулировку
|
||||
конвенции — слово сказано, и переспрашивать нечего: запись идёт как одобренная, а
|
||||
в докладе стоит, чьим решением. Предложение существует ради нового, которое
|
||||
заметил ты, а не ради ритуала.
|
||||
|
||||
**Отказ человека — строка доклада и всё.** В документы он не пишется: журнала
|
||||
отвергнутых ADR и снятых конвенций канон не держит, и заведение такого журнала
|
||||
здесь было бы ровно тем новым, которого никто не заказывал.
|
||||
|
||||
**Отрицание от этого не ослабло.** Документ, по которому нечего предложить,
|
||||
по-прежнему обязан быть назван — просто раньше отрицание читал отчёт, а теперь
|
||||
человек, и читает он его **до** того, как что-то написано. Обязанность та же:
|
||||
пропуск неотличим от «не требуется», пока отрицание не сказано вслух.
|
||||
|
||||
## Чек-лист синка
|
||||
|
||||
Идёт сверху вниз; каждая строка попадает в доклад.
|
||||
|
||||
| Документ | Обновляется, когда | Проверка |
|
||||
| --- | --- | --- |
|
||||
| `openspec/specs/` | всегда при изменении поведения | вливает `opsx:archive` |
|
||||
| `database.md` | тронуты миграции | `docs.py check --base` |
|
||||
| `architecture.md` | новый компонент, граница, внешняя зависимость, изменилось окружение | `docs.py`: capability без упоминания |
|
||||
| `adr/` | сработал триггер канона (перечень — [canon.md](../canon/references/canon.md#adr)) | нет — только этот чек-лист |
|
||||
| `research/` | узнали новое о внешнем формате или данных | нет |
|
||||
| `security.md` | новый недоверенный вход, токен, путь наружу, сдвиг периметра | нет |
|
||||
| `conventions/` | находка принята и не специфична для одного места | промоут |
|
||||
| `review.md` | дефект воспроизведён; сузили или расширили проверку | нет |
|
||||
| `passport.md` | новый потребитель, сдвиг границы «чем не является» | нет |
|
||||
| `CLAUDE.md` | изменился инвариант, гейт, запрет, необратимое | нет |
|
||||
| Документ | Род | Обновляется, когда | Проверка |
|
||||
| --- | --- | --- | --- |
|
||||
| `openspec/specs/` | отражение | всегда при изменении поведения | вливает `opsx:archive` |
|
||||
| `database.md` | отражение | тронуты миграции | `docs.py check --base` |
|
||||
| `architecture.md` | отражение | новый компонент, граница, внешняя зависимость, изменилось окружение | `docs.py`: capability без упоминания |
|
||||
| `adr/` | новое | сработал триггер канона (перечень — [canon.md](../canon/references/canon.md#adr)) | нет — только этот чек-лист |
|
||||
| `research/` | новое | узнали новое о внешнем формате или данных | нет |
|
||||
| `security.md` | новое | новый недоверенный вход, токен, путь наружу, сдвиг периметра | нет |
|
||||
| `conventions/` | новое | находка принята и не специфична для одного места | промоут |
|
||||
| `review.md` | новое | дефект воспроизведён; сузили или расширили проверку | нет |
|
||||
| `passport.md` | новое | новый потребитель, сдвиг границы «чем не является» | нет |
|
||||
| `CLAUDE.md` | новое | изменился инвариант, гейт, запрет, необратимое | нет |
|
||||
|
||||
**Разрез в таблице не произволен.** Ложным без правки становится ровно тот
|
||||
документ, который описывает **состояние системы**, — потому отражений в чек-листе
|
||||
и мало. Остальные задают норму или хранят память: им не с чем разойтись, пока в
|
||||
них не написано новое.
|
||||
|
||||
Пример доклада:
|
||||
|
||||
```
|
||||
Синк документации:
|
||||
Синк документации.
|
||||
Отражено, записано:
|
||||
- openspec/specs/ — влиты дельты change add-bucket-reindex
|
||||
- architecture.md — добавлен воркер свёртки, ссылка на capability reindex
|
||||
- database.md — миграция 00006, таблица bucket
|
||||
- adr/ — заведён ADR-2026-08-03-queue-as-table: отказ от внешней очереди
|
||||
- research/ — новое о формате не узнано
|
||||
- passport, security, conventions, review — не требуется: изменение внутреннее
|
||||
Предложено, жду слова:
|
||||
- adr/ — отказ от внешней очереди в пользу таблицы; источник: архивный
|
||||
design.md; триггер: намеренный отказ от очевидного подхода
|
||||
Не требуется: research, security, conventions, review, passport, CLAUDE.md —
|
||||
периметр не двигался, инварианты те же, новое о внешних данных не узнано.
|
||||
Сверка документов: с прошлой (a1b2c3d, 2026-07-30) сделано 11 задач — пора
|
||||
звать av-dev:doc-healthcheck.
|
||||
```
|
||||
|
||||
## Сверка — не здесь, а в `av-dev:doc-healthcheck`
|
||||
@@ -118,9 +170,16 @@ description: Вести содержимое документов канона
|
||||
нет**. Строка «adr/ — не требуется: решение рутинное» и есть то, ради чего
|
||||
чек-лист существует; её отсутствие неотличимо от «забыл посмотреть».
|
||||
|
||||
Порядок работы: открой источник — архивный `design.md` change либо записку
|
||||
разведки, — найди в нём решение, проходящее триггер, процитируй его и причину,
|
||||
сошлись на источник, добавь строку в индекс `docs/adr/README.md` сверху.
|
||||
**Запись — новое, и заводится она по слову** (раздел «Два рода правок»).
|
||||
Сработавший триггер даёт не файл, а строку предложения: какое решение, из какого
|
||||
источника, каким из трёх триггеров прошло. Своей записи ADR не стоит ничего, а
|
||||
каталог решений читают как список того, что в проекте всерьёз, — и разбавленный
|
||||
рутиной он перестаёт им быть.
|
||||
|
||||
Порядок работы после «да»: открой источник — архивный `design.md` change либо
|
||||
записку разведки, — найди в нём решение, проходящее триггер, процитируй его и
|
||||
причину, сошлись на источник, добавь строку в индекс `docs/adr/README.md`
|
||||
сверху.
|
||||
|
||||
## Чистка `architecture.md`
|
||||
|
||||
@@ -197,9 +256,16 @@ av-dev:code-review`, его `references/review-journal.md`.
|
||||
|
||||
Твоя часть на синке: **дефект пишется сразу**, а не «потом, когда починим».
|
||||
Со временем теряется не факт, а то, почему дефект не поймали, — единственное,
|
||||
ради чего журнал есть. И решение сузить проверки (перестали звать проход,
|
||||
переселили его в другой скилл) обязано попасть в раздел настройки, а не остаться
|
||||
в отчёте ревью.
|
||||
ради чего журнал есть.
|
||||
|
||||
«Сразу» и «по слову» здесь не спорят: запись — новое, и она идёт предложением, но
|
||||
**предложением этого прогона**, а не следующего. Отложить её до «когда починим»
|
||||
нельзя ни с чьего согласия: чинится дефект, а теряется причина промаха.
|
||||
|
||||
**Решение сузить проверки** (перестали звать проход, переселили его в другой
|
||||
скилл) обязано попасть в раздел настройки, а не остаться в отчёте ревью. Второй
|
||||
раз оно не спрашивается: такое решение принимает человек по определению, и слово
|
||||
по нему уже сказано — сказано тогда, когда проверку сузили.
|
||||
|
||||
## Промоут в конвенции
|
||||
|
||||
@@ -216,6 +282,53 @@ av-dev:code-review`, его `references/review-journal.md`.
|
||||
На синке это отдельная строка: «conventions/ — правило X механизировано,
|
||||
формулировка удалена» либо «не требуется».
|
||||
|
||||
**Конвенция — самое дорогое из нового, и на синке она только предлагается.**
|
||||
Одна её строка становится входом каждого следующего прогона ревью и критерием
|
||||
для всех будущих задач; находка, доехавшая до конвенции по инерции хвоста, потом
|
||||
годами разменивается на внимание прохода. Предложение называет **проверяемое
|
||||
свойство и проход, который его нашёл**, — по этой паре человек и решает.
|
||||
|
||||
**Шаг 2 в хвост задачи не помещается.** Механизация правила — конфиг линтера или
|
||||
сканер, плюс приведение кода к зелёному — это работа размером с задачу, и делать
|
||||
её попутно значит удваивать чужой прогон. Согласованный промоут даёт строку
|
||||
конвенции сейчас и **задачу типа `chore`** на механизацию — заводит её
|
||||
`av-dev:task-track`, и заводится она тем же словом человека, что и сама
|
||||
конвенция.
|
||||
|
||||
## Сигнал сверки — строка, а не вызов
|
||||
|
||||
Сверку документов (`av-dev:doc-healthcheck`) зовёт человек по признаку **«с
|
||||
прошлой сверки сделан десяток задач»**. Признак наблюдаемый, но считать его было
|
||||
нечем: следа у сверки не оставалось, и «десяток» держался в чьей-то памяти. Это
|
||||
ровно тот прозаический триггер, который дал 6 записей ADR на 43 изменения, — и
|
||||
здесь он не срабатывал по той же причине.
|
||||
|
||||
**След оставляет сама сверка** — ключ `[healthcheck] last` в `.av-dev.toml`
|
||||
(состав ключей — [canon.md](../canon/references/canon.md), раздел
|
||||
`.av-dev.toml`). **Считает синк**, и вот чем:
|
||||
|
||||
```sh
|
||||
git rev-list --count <last>..HEAD -- openspec/changes/archive
|
||||
```
|
||||
|
||||
Коммит, тронувший архив, — это доехавшая до конца задача, так что счёт идёт в
|
||||
задачах, а не в правках. `openspec` в проекте нет — считай коммиты
|
||||
(`git rev-list --count <last>..HEAD`) и **скажи, что считал коммиты**: число
|
||||
другого рода, и молчаливая подмена сделала бы признак вдвое чувствительнее.
|
||||
|
||||
Строка доклада обязательна всегда, и вариантов у неё три:
|
||||
|
||||
- **счёт меньше десятка** — «с прошлой сверки N задач, звать рано»;
|
||||
- **счёт от десятка** — «с прошлой сверки N задач, пора звать
|
||||
`av-dev:doc-healthcheck`»;
|
||||
- **ключа нет** — «сверка документов не проводилась ни разу», и это самый
|
||||
сильный из трёх сигналов, а не отсутствие данных.
|
||||
|
||||
**Сам не зовёшь.** Прогон сверки идёт по всему канону и держит `opus`; решение о
|
||||
таких часах принимает тот, кто их оплачивает. Синк, позвавший её сам, превратил
|
||||
бы самую дорогую проверку процесса в церемонию хвоста задачи — против чего она и
|
||||
вынесена в отдельный скилл.
|
||||
|
||||
## Чего этот скилл не делает
|
||||
|
||||
- **Не проверяет раскладку** — это `canon`.
|
||||
@@ -223,3 +336,6 @@ av-dev:code-review`, его `references/review-journal.md`.
|
||||
`doc-init`.
|
||||
- **Не сочиняет содержание.** Нечего записать — так и пишется, честной строкой.
|
||||
- **Не переоформляет документы «заодно»**: правится то, чего коснулась работа.
|
||||
- **Не заводит новое молча** — ни ADR, ни конвенцию, ни записку. Молча идёт
|
||||
только отражение, и признак у него один: без правки документ станет ложным.
|
||||
- **Не зовёт сверку документов** — считает и говорит строкой; зовёт человек.
|
||||
|
||||
Reference in New Issue
Block a user