resolve: письмо вынесено агентам, журнал — тема 72

Спеки, код и правки по находкам ревью пишет отдельный агент: оркестратору
оставлены задание, возврат, чекпоинт, сверка плана с исходом и доклад.
Заведён раздел «Кто пишет» в SKILL.md, переписаны шаги 2, 4, 6, 7 решения и
шаги 2, 4 обслуживания, у разведки названо, почему исполнителей нет.
This commit is contained in:
av
2026-08-23 07:56:15 +03:00
parent e5dc0a1a39
commit 813345192d
7 changed files with 268 additions and 30 deletions
+99
View File
@@ -276,6 +276,103 @@ flowchart TD
Схема — **сводка**: содержание сценариев в их справочниках, и при расхождении
прав справочник.
## Кто пишет: письмо уходит агентам
**Своими руками этот скилл не пишет ничего** — ни спек, ни кода, ни правок по
находкам ревью. Каждую такую работу выполняет **отдельный агент**: оркестратор
ставит задание и читает возврат. Дальше эта работа зовётся **письмом** — всё, что
скилл написал бы сам, если бы писал.
Причина про контекст, и она одна. Оркестратор ведёт задачу целиком: выбрал
сценарий, собирает чекпоинт, сверяет план прогона с исходом, пишет доклад, — а
для всего этого надо помнить постановку, критерии приёмки и то, что человек
одобрил. Письмо тянет в контекст ровно то, чего в докладе не будет ни строкой:
содержимое тронутых файлов, вывод линтеров и гейта, перебранные варианты правки.
Забитый этим контекст теряет одобренное и постановку — и теряет **молча**: доклад
остаётся связным, а сверять его уже не с чем.
**Разведённость тут ни при чём**, и путать два довода нельзя. Агент пишет по
заданию оркестратора и отвечает перед ним; разведён с автором тот, кто работу
**судит**, — разметчик и проходы ревью.
| Работа | Где шаг |
| --- | --- |
| предложение и дельта-спеки — `opsx:propose` | [solve](references/solve.md), шаг 2 |
| правки спек и дизайна по находкам ревью дизайна | [solve](references/solve.md), шаг 4 |
| код — `opsx:apply`, вместе с гейтом до зелёного и поведенческой верификацией | [solve](references/solve.md), шаг 6 |
| правки по находкам триажа, помеченным `инлайн` | [solve](references/solve.md), шаг 7; [maintain](references/maintain.md), шаг 4 |
| правка оснастки в сценарии обслуживания | [maintain](references/maintain.md), шаг 2 |
**Остальное остаётся оркестратору, и перечень закрыт:** выбор сценария и стопы,
чекпоинт, вызовы `av-dev:code-review`, `av-dev:doc-sync`, `av-dev-git:commit` и
`av-dev:task-track`, сверка плана с исходом, урожай и доклад. Ни одна из этих
работ не пишет файлов проекта — они и есть та работа, ради которой контекст
берегут.
**Разведка сюда не попадает вовсе.** Её письмо — записка в документы канона и
записи задач, то есть тот самый текст, из которого собираются чекпоинт вариантов
и доклад. Отдать его агенту значило бы получить обратно пересказом то, что
и так надо держать целиком.
### Устава у этих агентов нет
Проходы ревью ходят уставами (`av-dev/agents/`), потому что уставом задаётся
**суждение**: что искать и что считать находкой. Здесь суждения нет — работа
нормирована скиллами `opsx:*`, конвенциями проекта и находками триажа, а устав
стал бы вторым домом того же и разошёлся бы с ним молча. Зовётся агент общего
назначения, и всё, чем один его прогон отличается от другого, приходит заданием.
### Задание собирается адресами
**Агент не видел разговора.** Он не знает ни постановки, ни выбранного сценария,
ни того, что уже одобрено на чекпоинте. Поэтому задание самодостаточно, а вещи в
нём называются **адресами, а не пересказом** — по тому же правилу, по которому
проход ревью получает дом темы путём и разделом. В задании:
- корень проекта, текущая ветка и база диффа. Ветку агент не создаёт и не
переключает, не пушит — правило то же, что у скилла;
- **что делать**: файл задачи либо её текст дословно, критерии приёмки,
идентификатор change;
- **что читать**: `CLAUDE.md`, конвенции проекта, дельта-спеки change;
- **находки — дословно**, как их вернул триаж или ревью дизайна, вместе с
оракулом;
- **границы**: правится названное, соседнее не улучшается заодно; развилок агент
не решает, задач не заводит, ничего не коммитит и наружу не ходит — правило
необратимого действует и на него (раздел «Когда спрашивать вне чекпоинта»);
- **чем кончает**: гейт зелёный, а если задача меняет наблюдаемое поведение —
прогнана поведенческая верификация.
**Пересказ находки — самая дорогая экономия из возможных.** Находка триажа несёт
оракул, и пересказ теряет как раз его: агент чинит то, что понял, гейт зеленеет,
а в отчёт уезжает «исправлено».
### Возврат — не длиннее экрана
Агент возвращает: что сделано, **адресами** тронутого; исход гейта и чем он
прогнан; что не удалось и почему; вопросы, если по заданию их не разрешить.
Диффа, пересказа кода и логов в возврате нет — иначе экономия, ради которой шаг
и вынесен, отменяется в момент возврата.
**Возврату на слово не верят, и перечитывать за агентом дифф для этого не надо.**
Верят независимым артефактам: зелёному гейту, отчёту триажа, ревью следующего
шага. Своей прозе здесь верить нельзя ровно по той причине, по которой ей не
верит конвейер ревью, — её написал тот, кто мог и пропустить.
**Артефакты, написанные для человека, оркестратор читает сам**: `proposal.md` и
`design.md` нужны ему на чекпоинте. Это не переполнение контекста, а его работа.
### Один агент на шаг, а не на файл
Нарезка по файлам разводит одну правку по разным контекстам, и сходиться она
будет в гейте, то есть после. Повторный проход того же шага — **новое задание**,
а не продолжение прежнего: агент прежнего не помнит, и рассчитывать на его память
нельзя.
**Правило про контекст, а не про полномочия.** Агент упал, вернул не то или не
понял задания — повтори задание, дописав то, чего в нём не хватило. Не вышло и во
второй раз — делай сам и **скажи это строкой доклада**: прогон стоил дороже, чем
должен, и это факт для человека, а не стоп.
## Автономность и плановый стоп
**У двух сценариев ровно один плановый стоп**, и стоят они в разных местах:
@@ -395,6 +492,8 @@ change, у второго — сверенный состав гейта и си
- **постановка пришла текстом** — сказать это прямо: как она понята, что `ready`
не гонялся и что закрывать было нечего;
- что сделано, какие вопросы записаны и куда;
- **шаг письма, сделанный не агентом, а тобой** — с причиной: раздел «Кто пишет»
требует называть это строкой, а не молча;
- чего проверить или узнать **не удалось**.
Сверх ядра каждый сценарий добавляет своё: [solve.md](references/solve.md) —
@@ -170,7 +170,7 @@
flowchart TD
in["сценарий выбран: обслуживание"]
s1["1. прочитать задачу<br/>критерии приёмки и границы"]
s2["2. сделать правку<br/>гейт тронут — сверить состав, не цвет"]
s2["2. правка агентом<br/>гейт тронут — состав снять до правки"]
s3["3. гейт проекта до зелёного"]
s4["4. ревью фиксированным планом<br/>av-dev:code-review, без change"]
s5["5. синк документации — av-dev:doc-sync"]
@@ -259,8 +259,11 @@ ADR: список источников канон закрыл двумя — а
### 2. Сделать правку
Код и конфиги — по конвенциям проекта. Правка по размеру задачи: чинится названное в записи, соседнее не улучшается
заодно.
**Правку делает агент** (SKILL.md, «Кто пишет: письмо уходит агентам»): задание
несёт постановку, конвенции проекта, границы правки и требование довести гейт до
зелёного; возврат — адреса тронутого и исход гейта. Код и конфиги — по конвенциям
проекта. Правка по размеру задачи: чинится названное в записи, соседнее не
улучшается заодно.
**Гейта ещё нет — сказать это, а не изображать сверку.** Первые шаги плана
стройки заводят гейт, сборку и хуки: у них нет ни «до», ни «прежнего», и
@@ -277,6 +280,11 @@ ADR: список источников канон закрыл двумя — а
их семантикой гейта в `CLAUDE.md`. Снимай исходное состояние **до** правки, по
тому, как проект это описал.
**Исходный состав снимаешь ты, а не агент, и это не мелочь.** Сверка «до и
после» уезжает в твой доклад, а снятое тем же, кто правил, сверкой не является:
агент вернёт состав, который получился, и назовёт его исходным. Снимок делается
до того, как задание ушло.
**Проект состав не описал — скажи строкой доклада, что сверен только цвет.**
Обходного пути не выдумывай: угаданный состав хуже отсутствующего, потому что
читается как сверенный. Это же строка и повод — предложить проекту дописать слот
@@ -353,8 +361,9 @@ Change ты не передаёшь — его нет.
Отчёт, из которого исчезло «что не смотрел никто», сообщает «проверено», не
сообщая, что именно.
Отработка — как в решении: помеченное `инлайн` чини сам и не логируй, `развилка`
— вопросом в запись. После правок снова гейт. Отложенные находки собери в секцию
Отработка — как в решении: помеченное `инлайн` чинит **агент** (SKILL.md, «Кто
пишет»), находки уходят ему дословно с оракулом, гейт после правок гоняет он же,
логировать их не надо; `развилка` — вопросом в запись, и агенту она не отдаётся. Отложенные находки собери в секцию
доклада `Урожай`; задачи из него заводит `av-dev:task-track`, не ты.
### 5. Синк документации — главный шаг этого сценария
@@ -30,6 +30,13 @@
(задачи заводятся и уточняются), `av-dev-git:commit`. Правило обращения к соседям
и правило «чего может не быть» — общие, они в [SKILL.md](../SKILL.md).
**Агентов-исполнителей у разведки нет** (SKILL.md, «Кто пишет: письмо уходит
агентам»), и это не пропуск. Её письмо — записка в документы канона и записи
задач, то есть тот самый текст, из которого собираются чекпоинт вариантов и
доклад: отданный агенту, он вернулся бы пересказом. Вычитку разведка всё же
отдаёт — `doc-wording`, `task-form`, `task-wording`: там судят написанное, а не
пишут.
**Отсутствие канона бьёт по разведке сильнее, чем по решению**, и сказать об этом
строкой мало: без документов у ответа нет дома, и знание осядет в переписке.
Назови исход и предложи `av-dev:canon`; работу не останавливай, но адрес
+50 -24
View File
@@ -15,7 +15,8 @@
дизайна.
Тонкая обёртка над каноническими скиллами `opsx:propose` / `opsx:apply` /
`opsx:archive`зови их через Skill, не переизобретай их шаги. Ревью — скилл
`opsx:archive`их шаги не переизобретаются, а **зовёт их агент**, не ты
(SKILL.md, «Кто пишет: письмо уходит агентам»). Ревью — скилл
`av-dev:code-review`; он же держит правило выбора метки, а называет её агент
`review-scope` — один раз на задачу, для обеих стадий ревью.
@@ -25,12 +26,12 @@
flowchart TD
in["сценарий выбран: решение"]
s1["1. прочитать задачу<br/>критерии приёмки выписать сразу"]
s2["2. opsx:propose — change, дельта-спеки, tasks.md"]
s2["2. opsx:propose — change, дельта-спеки,<br/>tasks.md — агентом"]
s3["3. разметка — review-scope:<br/>размер, сложность, метка, план тем"]
s4["4. ревью дизайна, состав по метке<br/>+ отработка замечаний"]
s4["4. ревью дизайна, состав по метке<br/>+ отработка замечаний агентом"]
s5(["5. ЧЕКПОИНТ: объяснение<br/>в чём проблема, как решаем,<br/>чем рискуем"])
s6["6. opsx:apply — код, гейт,<br/>поведенческая верификация"]
s7["7. ревью кода, та же метка<br/>+ отработка замечаний"]
s6["6. opsx:apply — код, гейт,<br/>поведенческая верификация — агентом"]
s7["7. ревью кода, та же метка<br/>+ отработка замечаний агентом"]
s8["8. opsx:archive"]
s9["9. синк документации — av-dev:doc-sync"]
s10["10. коммит работы — av-dev-git:commit"]
@@ -103,17 +104,28 @@ flowchart TD
### 2. Завести change — `opsx:propose`
Вызови Skill `opsx:propose`. Получаем `proposal.md`, дизайн, дельта-спеки
(`ADDED`/`MODIFIED`/`REMOVED Requirements`), `tasks.md`. Каждое `### Requirement`
содержит `SHALL`/`MUST`; структурные заголовки английские, сценарии
`GIVEN/WHEN/THEN`. Прогони `openspec validate --strict <id>`.
**Скилл `opsx:propose` зовёт агент** (SKILL.md, «Кто пишет»). В задании:
постановка — файл задачи либо её текст дословно, — критерии приёмки, если они
были, и требование прогнать `openspec validate --strict <id>`. Возврат:
идентификатор change, дельты адресами и исход валидации.
Критерии приёмки задачи, если они были, копируются в `tasks.md` отдельным блоком.
Задаче предшествовала разведка — её записка и отвергнутые варианты **уже
записаны** в документах канона (`docs/research/`, `docs/adr/`): сошлись на них из
`design.md`, а не переписывай второй раз. Варианты, разобранные без разведки
(способ был очевиден, но у него оказались оттенки), — в `design.md`, с причиной
отказа по каждому отвергнутому.
Шаг оставляет `proposal.md`, дизайн, дельта-спеки
(`ADDED`/`MODIFIED`/`REMOVED Requirements`) и `tasks.md`. Форму держит сам
`opsx:propose`, и требования к ней идут агенту заданием: каждое
`### Requirement` содержит `SHALL`/`MUST`, структурные заголовки английские,
сценарии — `GIVEN/WHEN/THEN`.
**`proposal.md` и `design.md` после возврата читаешь сам** — из них собирается
чекпоинт шага 5, и держать их в контексте это твоя работа, а не переполнение.
Кода нет, читать нечего сверх них.
Ещё две вещи задание называет прямо, иначе их не сделает никто. **Критерии
приёмки задачи, если они были, копируются в `tasks.md` отдельным блоком.**
И **записанное разведкой не переписывается второй раз**: задаче предшествовала
разведка — её записка и отвергнутые варианты уже лежат в документах канона
(`docs/research/`, `docs/adr/`), и `design.md` на них ссылается. Варианты,
разобранные без разведки (способ был очевиден, но у него оказались оттенки), — в
`design.md`, с причиной отказа по каждому отвергнутому.
**`proposal.md` пишется так, чтобы его понял человек, не читавший спек.** Это не
стилистическое пожелание: из него собирается чекпоинт шага 5, и переписывать его
@@ -175,10 +187,15 @@ flowchart TD
**Отработка замечаний, и она идёт до чекпоинта, а не после:**
- мелочь и явные улучшения — правь сам в спеках и дизайне;
- мелочь и явные улучшения — правкой спек и дизайна, и её делает **агент**
(SKILL.md, «Кто пишет»): находки уходят ему дословно, вместе с
идентификатором change и требованием перепрогнать
`openspec validate --strict <id>`;
- развилки (компромисс, scope, инвариант) — **не в запись, а в чекпоинт**: он
следующим шагом, и это ровно то, ради чего он поставлен здесь;
- после правок перепрогони `openspec validate --strict <id>`.
следующим шагом, и это ровно то, ради чего он поставлен здесь. Агенту развилка
не отдаётся вовсе: решает её человек, а не тот, кто правит спеку;
- возврат агента — адреса тронутых дельт и исход валидации; правленые спеки
перечитываешь по адресам, если чекпоинт опирается на изменившееся.
### 5. Чекпоинт: объяснение
@@ -234,7 +251,12 @@ flowchart TD
### 6. Написать код — `opsx:apply`
Вызови Skill `opsx:apply` для реализации `tasks.md`. Код — по конвенциям проекта
**Код пишет агент, и в его же задании лежит весь этот раздел** (SKILL.md, «Кто
пишет»): вызов `opsx:apply` для реализации `tasks.md`, гейт до зелёного,
поведенческая верификация. Возврат — адреса тронутого, исход гейта и строка
верификации; диффа в нём нет.
Код — по конвенциям проекта
(каталог `docs/conventions/`). Меняешь схему — обнови её описание в документации
тем же change, если проект этого требует: гейт обычно это проверяет.
@@ -245,8 +267,8 @@ flowchart TD
изменение вживую командой из раздела команд `CLAUDE.md` и прогони сценарий.
Пропусти только для чисто внутренних правок без наблюдаемого рантайма.
**Сервис не оставляем лежать.** Если запуск упал — почини или откати до конца
шага.
**Сервис не оставляем лежать.** Если запуск упал — агент чинит или откатывает до
конца шага; возврат с лежащим сервисом — незакрытый шаг, а не исход.
### 7. Ревью кода — та же метка
@@ -294,8 +316,11 @@ flowchart TD
#### Отработка, и здесь появляется одно новое правило
Помеченное `инлайн` чини сам и не логируй. `развилка` — вопросом в запись (он уже
сформулирован триажем, его остаётся перенести). После правок — снова гейт.
Помеченное `инлайн` чинит **агент** (SKILL.md, «Кто пишет»): находки уходят ему
**дословно, вместе с оракулом**, одним заданием на весь урожай инлайна, и гейт
после правок гоняет он же. Логировать их по-прежнему не надо. `развилка`
вопросом в запись (он уже сформулирован триажем, его остаётся перенести), и
агенту она не отдаётся.
**Находка, отменяющая одобренный дизайн, отменяет и одобрение.** Признак
проверяемый: **меняются ли дельта-спеки**.
@@ -303,7 +328,8 @@ flowchart TD
- не меняются — находка внутри дизайна, дожимай сам, это обычная отработка;
- меняются — решение стало другим, а одобрено было прежнее. Повтори шаг 3
(разметка выведена из дельта-спек) и **вернись на чекпоинт шага 5** с тем, что
изменилось и почему.
изменилось и почему. Такая находка агенту не отдаётся ни при каких условиях:
она отменяет одобрение, а это разговор с человеком.
**Это правило старше правила о развилке.** Находка класса `развилка`, чьё
основание — «надо менять спеку», подпадает под оба; побеждает возврат на