From d79f9d22865d2fb1f0496fc3fb9310f370e2d1cb Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Sun, 23 Aug 2026 19:43:49 +0300 Subject: [PATCH] =?UTF-8?q?=D1=85=D0=B2=D0=BE=D1=81=D1=82:=20=D1=83=D1=87?= =?UTF-8?q?=D1=91=D1=82=20=D0=B7=D0=BE=D0=B2=D1=91=D1=82=20=D0=BE=D1=80?= =?UTF-8?q?=D0=BA=D0=B5=D1=81=D1=82=D1=80=D0=B0=D1=82=D0=BE=D1=80,=20?= =?UTF-8?q?=D1=82=D1=80=D0=B5=D1=82=D0=B8=D0=B9=20=D1=82=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=20=D0=B8=D0=B4=D1=91=D1=82=20=D0=B8=20=D0=BD=D0=B0=20=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=D0=B7=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ревью трансформации нашло, что тема 78 спорит сама с собой в четырёх местах. Учёт был отдан агенту, хотя перечень оркестратора объявлен закрытым, а границы задания прямо говорят «задач не заводит»: вызов av-dev:task-track вернулся оркестратору, агенту третьего такта осталось письмо в документы. Ветка отказа не была покрыта — на ответе «ничего» правка первого такта уезжала в коммит невычитанной и с непрогнанным гейтом. Теперь третий такт идёт всякий раз, когда была реплика; не идёт он только тогда, когда реплики не было вовсе. Дом правила вычитки в doc-sync знает про два захода. Барьер карты кластеров из сценария «задачи из ревью и аудита» снимается там, где его уже прошли: список показан человеку и получил ответ. При прямом вызове и вызове из code-deep-review карта по-прежнему вопрос. Счёт стопов сведён в таблицу по сценариям; у обслуживания появился второй заход и одна реплика с поводом «новый запрет или инвариант». Сигнал сверки считается по архиву change и каталогу задач разом — иначе chore и research не считались вовсе — и вошёл в возврат агента и в доклады трёх сценариев. Ось «род правки документа» внесена в перечень осей. Журнал — тема 80; отложенный старший долг назван в С287. --- av-dev/shared/axes.md | 8 ++ av-dev/skills/code-deep-review/SKILL.md | 6 ++ av-dev/skills/code-resolve/SKILL.md | 30 +++++-- .../code-resolve/references/maintain.md | 50 ++++++++--- .../code-resolve/references/research.md | 6 +- .../skills/code-resolve/references/solve.md | 64 +++++++++----- av-dev/skills/doc-healthcheck/SKILL.md | 7 +- av-dev/skills/doc-sync/SKILL.md | 22 ++++- .../task-track/references/from-review.md | 20 +++-- decisions/80-tail-contradictions-fixed.md | 86 +++++++++++++++++++ decisions/README.md | 1 + 11 files changed, 244 insertions(+), 56 deletions(-) create mode 100644 decisions/80-tail-contradictions-fixed.md diff --git a/av-dev/shared/axes.md b/av-dev/shared/axes.md index 3ddb5b4..46642c7 100644 --- a/av-dev/shared/axes.md +++ b/av-dev/shared/axes.md @@ -27,6 +27,7 @@ | форма постановки | запись каталога · текст | `code-resolve/SKILL.md`, «Вход» | | сценарий | решение · обслуживание · разведка | `code-resolve/SKILL.md`, «Развилка» | | режим прогона | по change · без change | здесь, ниже | +| род правки документа | отражение · новое | `doc-sync/SKILL.md`, «Два рода правок» | | категория документа | тема · источник темы · процессный | `canon/references/canon.md` | | severity находки | `critical` `major` `minor` `nit` | `code-review/references/finding-contract.md` | | коды выхода | 0 1 2 3 4 | здесь, ниже | @@ -55,6 +56,8 @@ | режим прогона | состав проходов и саму возможность запуска прохода | `code-review/SKILL.md`, «Прогон без change» | | категория документа | заводит ли документ направление проверки | `canon.md`, «Три категории» | | severity | что с находкой делают дальше | `code-review/SKILL.md`, «Что происходит с находками» | +| род правки | спрашивают ли человека перед письмом в документ | `doc-sync/SKILL.md`, «Два рода правок» | +| сценарий | какова доля отражения в синке: обслуживание двигает факты и потому спрашивает редко | `code-resolve/references/maintain.md`, шаг 5 | **Четыре клетки пусты, и это сказано намеренно, а не забыто.** @@ -65,6 +68,11 @@ нет. Значит, документ, заведённый проектом как тема, на обслуживании не смотрит никто, и строкой это нигде не называется. +**Род правки × severity и × режим прогона.** Не влияет ни туда, ни обратно: род +правки — свойство того, что пишется в документ, и с находкой ревью он не +встречается. Находка, доехавшая до конвенции, меняет род не сама по себе, а тем, +что становится новой нормой, — и спрашивается тогда как всякое новое. + **Стадия проекта × режим прогона.** Не влияет: режим выбирает сценарий. Прогон обслуживания на стройке — обычное дело (первые шаги плана заводят гейт и сборку), и идёт он там так же, как на доработке. diff --git a/av-dev/skills/code-deep-review/SKILL.md b/av-dev/skills/code-deep-review/SKILL.md index be54ff1..76e11a1 100644 --- a/av-dev/skills/code-deep-review/SKILL.md +++ b/av-dev/skills/code-deep-review/SKILL.md @@ -202,6 +202,12 @@ capability — одним адресом или несколькими. Скил владеет этим документом. В следе: область, состав проходов, что взято задачами, что отвергнуто и почему, что проверить было невозможно. +**Второго вопроса здесь не задают, хотя `review.md` — документ рода «новое»** +(`av-dev:doc-sync`, «Два рода правок»): слово по каждой находке человек уже сказал +в разборе, и след цитирует ровно его решения. Правило то же, что у сужения +проверок: спрашивается новое, которое заметил ты, а не то, что человек только что +решил вслух. + Без этого следа второй прогон по той же области начнётся с нуля и предложит те же находки, от которых человек уже отказался, — а отказ, не оставивший записи, неотличим от непойманного. diff --git a/av-dev/skills/code-resolve/SKILL.md b/av-dev/skills/code-resolve/SKILL.md index 81b25ce..6e2bfea 100644 --- a/av-dev/skills/code-resolve/SKILL.md +++ b/av-dev/skills/code-resolve/SKILL.md @@ -303,7 +303,7 @@ flowchart TD | правки по находкам триажа, помеченным `инлайн` | [solve](references/solve.md), шаг 5; [maintain](references/maintain.md), шаг 4 | | правка оснастки в сценарии обслуживания | [maintain](references/maintain.md), шаг 2 | | архивация change и отражение в документах — `opsx:archive` и `av-dev:doc-sync` | [solve](references/solve.md), шаг 6, такт 1; [maintain](references/maintain.md), шаг 5 | -| письмо одобренного нового и задачи из урожая | [solve](references/solve.md), шаг 6, такт 3 | +| письмо одобренного нового в документы канона | [solve](references/solve.md), шаг 6, такт 3; [maintain](references/maintain.md), шаг 5 | **Остальное остаётся оркестратору, и перечень закрыт:** выбор сценария и стопы, чекпоинт, вызовы `av-dev:code-review`, `av-dev-git:commit` и `av-dev:task-track`, @@ -393,11 +393,21 @@ flowchart TD второй раз — делай сам и **скажи это строкой доклада**: прогон стоил дороже, чем должен, и это факт для человека, а не стоп. -## Автономность и плановый стоп +## Автономность и плановые стопы -**У двух сценариев ровно один плановый стоп**, и стоят они в разных местах: -у решения — объяснение сразу после предложения и до кода, у разведки — варианты -до первого написанного требования. Правило вокруг них общее. +**Стопов у сценария не больше двух, и каждый — про решение человека, а не про +ход работ.** + +| Сценарий | Стоп до письма | Стоп после письма | +| --- | --- | --- | +| решение | чекпоинт: объяснение после предложения и до кода | реплика шага 6: что из найденного заводится | +| разведка | чекпоинт вариантов до первого написанного требования | — исход и так уезжает в документы по выбранному варианту | +| обслуживание | — планового нет | реплика шага 5, и только если появилось новое | + +**Второй стоп короче первого и часто не случается вовсе.** Первый решает форму +решения, и без ответа работа не идёт дальше; второй решает, что из найденного +переживёт задачу, и при пустом списке нового его просто нет. Правило вокруг обоих +общее. **У обслуживания планового стопа нет вовсе, и это следствие, а не поблажка.** Один стоп с ожиданием ответа у него всё же есть — по найденной дельта-спеке, — но @@ -529,12 +539,14 @@ change, у второго — сверенный состав гейта и си текущем worktree и на текущей ветке: не делай `git checkout`/`switch`, не создавай веток, не пушь. - Прогон проходит **не больше одного** чекпоинта, и это норма, а не упрощение. - Два стопа за одну задачу — цена незнания способа, и платится она двумя + Два чекпоинта за одну задачу — цена незнания способа, и платится она двумя прогонами, а не одним длинным. У обслуживания чекпоинта нет ни одного, и это - тоже норма: там нечего решать. + тоже норма: там нечего решать. Реплика о новом чекпоинтом не является и этого + счёта не касается — она решает не форму решения, а судьбу находок. - Держи вызывающего в цикле короткими репликами на переходах фаз, но не проси - подтверждать механику: чекпоинт — единственное место, где ждут ответа, а в - обслуживании такого места нет вовсе. + подтверждать механику. Мест, где **ждут ответа**, ровно два, и оба названы в + «Автономности»: чекпоинт до кода и реплика о новом после него. Третьего нет ни + в одном сценарии, и заводить его нельзя. - **Сценарий назван вслух — значит, его можно оспорить.** Человек, увидевший в первой реплике «иду разведкой, потому что способа не видно», поправит выбор одной фразой; молча выбранный сценарий он поправит через полчаса работы. diff --git a/av-dev/skills/code-resolve/references/maintain.md b/av-dev/skills/code-resolve/references/maintain.md index 36d0c60..c466f07 100644 --- a/av-dev/skills/code-resolve/references/maintain.md +++ b/av-dev/skills/code-resolve/references/maintain.md @@ -68,7 +68,7 @@ ## Дельта нашлась по ходу — стоп, и у него свой порядок -Признак тот же, что на шаге 7 сценария решения: **меняется ли то, что записано в +Признак тот же, что у отработки ревью в решении (шаг 5): **меняется ли то, что записано в `openspec/specs/`**. Обнаружилось, что меняется, — работа перестала быть обслуживанием в ту же секунду, и продолжать её нельзя: коммит обслуживания заявляет «поведение не менялось», а оно меняется. @@ -153,9 +153,12 @@ решать, вырождается в обряд одобрения и обесценивает те стопы, где решать есть что. -**Место, где ответа всё же ждут, одно, и плановым оно не является** — стоп по -найденной дельте (раздел «Дельта нашлась по ходу»). Через него проходят не все -прогоны, а только те, где задача оказалась не тем, чем объявлена. +**Мест, где ответа всё же ждут, два, и через оба проходят не все прогоны.** +Первое — стоп по найденной дельте (раздел «Дельта нашлась по ходу»), и плановым +он не является: через него идут те прогоны, где задача оказалась не тем, чем +объявлена. Второе — **реплика о новом на шаге 5**, и она случается, только если +обслуживание завело в документах что-то, чего не было: запрет или инвариант. +Обычный прогон обслуживания не проходит ни через одно из двух. **Правило необратимого при этом действует полностью** (SKILL.md, «Когда спрашивать вне чекпоинта»), и здесь оно опаснее, чем кажется. Единственный @@ -365,8 +368,14 @@ ADR: список источников канон закрыл двумя — а Отработка — как в решении: помеченное `инлайн` чинит **агент** (SKILL.md, «Кто пишет»), находки уходят ему дословно с оракулом, гейт после правок гоняет он же, -логировать их не надо; `развилка` — вопросом в запись, и агенту она не отдаётся. Отложенные находки собери в секцию -доклада `Урожай`; задачи из него заводит `av-dev:task-track`, не ты. +логировать их не надо; `развилка` — вопросом в запись, и агенту она не отдаётся. +Отложенные находки собери в секцию доклада `Урожай`. + +**Задачи из урожая — по слову человека, и спрашивается это репликой шага 5**, +вместе с новым в документах: правило общее для всех прогонов конвейера +(`av-dev:code-review`, «Что происходит с находками дальше»), и обслуживание не +исключение. Сказал «заводим» — зовёшь `av-dev:task-track` сам, сценарий «задачи +из ревью и аудита»; не сказал — урожай остаётся строками доклада. ### 5. Синк документации — главный шаг этого сценария, и делает его агент @@ -385,11 +394,24 @@ ADR: список источников канон закрыл двумя — а предлагается** (дом — раздел «Два рода правок» скилла `av-dev:doc-sync`). Здесь оно почти ничего не стоит: обслуживание двигает **факты** — команды, шаги гейта, зависимости поимённо, пути, имя ветки, числа настроек, — а факт в документе, -разошедшийся с кодом, это отражение по определению. Реплика человеку на этом -сценарии редка, и поводов у неё два: **новый запрет или инвариант в `CLAUDE.md`** -и **сужение проверок в `review.*`**. Второе спрашивать не надо — проверки сузил -человек, слово по ним сказано; первое надо, потому что запрет свяжет все будущие -задачи. Нового нет — реплики нет, и шаг кончается возвратом агента. +разошедшийся с кодом, это отражение по определению. + +**Повод для реплики у этого сценария один — новый запрет или инвариант в +`CLAUDE.md`**: он свяжет все будущие задачи, и заводить его молча нельзя. +Сужение проверок в `review.*` поводом не является, хотя тоже новое: проверки +сузил человек, и слово по ним уже сказано (`av-dev:doc-sync`, «Два рода правок»). +К этому же поводу примыкает урожай ревью с шага 4 — спрашиваются они одной +репликой, а не двумя. + +**Нового нет — реплики нет**, и шаг кончается возвратом агента; так идёт +большинство прогонов обслуживания. + +**Реплика была — идёт второй заход тем же агентом**, и на нём висит то же, что в +решении: письмо одобренного, вычитка `doc-wording` по всей пачке и гейт до +зелёного. Первый заход снимает их с себя ровно тогда, когда вернул непустой +список предложений, — порядок и его довод описаны в [solve.md](solve.md), шаг 6. +Задачи из урожая при этом заводишь **ты сам** вызовом `av-dev:task-track`, а не +агент: индексы учёта правит тот, кто коммитит. **Здесь этот шаг весит больше, чем в решении, и вот почему.** Обслуживание не меняет поведения — значит, почти всё, что оно меняет, это документация: команды, @@ -471,7 +493,11 @@ ADR: список источников канон закрыл двумя — а выдуманному пользователю; - **состав гейта до и после**, если правка его трогала; не сверялся — почему; - по каждому критерию приёмки: **оракул и наблюдаемый исход**; -- **`Урожай`** — отложенные находки списком; +- **`Урожай`** — отложенные находки списком и **что человек по нему решил**; +- **что заведено нового в документах** и что предложено и отвергнуто — по именам + записей; отказ виден только здесь; +- **сигнал сверки** — строка синка о том, сколько задач сделано с прошлого + прогона `av-dev:doc-healthcheck`, либо что сверки не было ни разу; - **строка границ покрытия**: план сценария фиксирован; темы `requirements` в нём нет — её не смотрел никто, а `security` и `architecture` смотрелись только против записанных инвариантов, и то если шёл проход `code`. diff --git a/av-dev/skills/code-resolve/references/research.md b/av-dev/skills/code-resolve/references/research.md index 938209c..31eb600 100644 --- a/av-dev/skills/code-resolve/references/research.md +++ b/av-dev/skills/code-resolve/references/research.md @@ -398,8 +398,8 @@ git и читается диффом, а второй стоп на каждой ## Доклад разведки Общая форма доклада — в SKILL.md; у разведки он свой, потому что докладывать -нечего из того, о чём спрашивают решение (ни метки ревью, ни критериев приёмки, -ни архивного change). Коротко, и в нём обязательно: +нечего из того, о чём спрашивают решение: ни критериев приёмки, ни архивного +change, ни исхода ревью — кода она не писала. Коротко, и в нём обязательно: - **исход** одним из четырёх слов; - **вопрос и ответ** — по фразе на каждое. Ответ, который не сворачивается во @@ -408,6 +408,8 @@ git и читается диффом, а второй стоп на каждой - **какие задачи заведены и уточнены** — слагами; - **что вычитано и чем** — пачка документов и пачка записей, каждая со своими проходами; не вычитанное называется прямо, вместе с причиной; +- **сигнал сверки** — строка синка о том, сколько задач сделано с прошлого + прогона `av-dev:doc-healthcheck`, либо что сверки не было ни разу; - **что осталось неизвестным** и чего это стоит: разведка без этой строки сообщает «выяснено», не сообщая, что именно осталось не выяснено; - **рамки**, если они ограничили работу: докуда копали и почему остановились. diff --git a/av-dev/skills/code-resolve/references/solve.md b/av-dev/skills/code-resolve/references/solve.md index 3d45ab5..f25f661 100644 --- a/av-dev/skills/code-resolve/references/solve.md +++ b/av-dev/skills/code-resolve/references/solve.md @@ -1,8 +1,8 @@ # Сценарий «решение» Способ решения известен, спорно только как. Проводит задачу от постановки до -закрытия и **пишет код**: цикл Spec Driven Development с одним плановым стопом — -объяснением сразу после предложения. +закрытия и **пишет код**: цикл Spec Driven Development с двумя плановыми стопами — +объяснением сразу после предложения и репликой о новом после ревью. Сценарий выбирается развилкой на входе скилла ([SKILL.md](../SKILL.md), раздел «Развилка: какой сценарий») и называется вслух первой репликой. Здесь только его @@ -30,7 +30,7 @@ flowchart TD s5["5. ревью кода — постоянный состав
+ отработка замечаний агентом"] s6["6. opsx:archive + отражение в документах —
одним агентом"] s6q(["РЕПЛИКА: что заводим из нового —
ADR, конвенция, задачи из урожая"]) - s6b["6b. письмо одобренного и задачи —
тем же агентом"] + s6b["такт 3: задачи — оркестратором,
документы, вычитка и гейт — агентом"] s7["7. коммит работы — av-dev-git:commit"] s8["8. закрыть задачу — av-dev:task-track,
вторым коммитом учёта"] @@ -133,8 +133,9 @@ flowchart TD ### 3. Чекпоинт: объяснение -**Остановись и объясни человеку, что происходит.** Единственный плановый стоп -этого сценария, и он обязателен для всякой задачи. +**Остановись и объясни человеку, что происходит.** Первый из двух плановых стопов +сценария, и в отличие от второго он обязателен для всякой задачи: реплика шага 6 +случается только тогда, когда есть что заводить, а чекпоинт — всегда. Он стоит **сразу после предложения и до кода** — намеренно. Раньше между `propose` и чекпоинтом стояла стадия ревью дизайна, и человек читал объяснение, @@ -287,10 +288,10 @@ flowchart TD найденного заводим») стоили бы человеку двух переключений вместо одного. Сюда урожай складывается, а не выносится. -Сказал «заводим» — зовёт `av-dev:task-track` агент шага 6, у него на этот вход -отдельный сценарий «задачи из ревью и аудита»: своя нарезка, свой формат, свои -правила дублей, и передавать находку туда надо дословно. Не сказал — урожай -остаётся строками доклада, и это исход, а не потеря. +Сказал «заводим» — зовёшь `av-dev:task-track` **ты сам**, тактом третьим шага 6: +у него на этот вход отдельный сценарий «задачи из ревью и аудита» — своя нарезка, +свой формат, свои правила дублей, и находка передаётся дословно. Не сказал — +урожай остаётся строками доклада, и это исход, а не потеря. **Молча беклог не наполняется.** Очередь работ ведёт человек, и задача, заведённая за него по ходу чужого прогона, отнимает у него ровно то решение, ради которого @@ -360,8 +361,13 @@ flowchart TD том скилле; гейт до зелёного доводит агент, потому что красный гейт остановил бы коммит следующим шагом — документы у многих проектов он проверяет. -**Возврат — чек-лист, адреса тронутого, исход валидации и исход гейта, если он -гонялся.** +**Отложенное этим тактом обязано вернуться.** Оттого такт третий идёт **всякий +раз, когда была реплика** — в том числе когда человек не одобрил ничего: на нём +висят вычитка и гейт, которые первый такт с себя снял. Пропустить его на отказе +значило бы уехать в коммит с невычитанной правкой и непрогнанным гейтом. + +**Возврат — чек-лист, адреса тронутого, исход валидации, строка сигнала сверки и +исход гейта, если он гонялся.** Чек-лист уезжает в доклад целиком, и переписывать его своими словами нельзя — это единственный след того, что каждый документ был назван. @@ -405,17 +411,30 @@ flowchart TD и второй абзац уговоров превращает реплику в чтение. Человек вправе ответить «ничего» — это исход, а не потеря: находки остаются строками доклада. -#### Такт третий — тот же агент: письмо одобренного +#### Такт третий — задачи оркестратором, документы агентом -Запускается **только если человек что-то одобрил**. В задании: +**Идёт всякий раз, когда была реплика**, и порядок в нём жёсткий. + +**Сначала задачи — их заводишь ты, а не агент.** Человек сказал «заводим» — зови +Skill `av-dev:task-track`, у него на этот вход отдельный сценарий «задачи из ревью +и аудита»: своя нарезка, свой формат, свои правила дублей. Находка передаётся +**дословно, вместе с оракулом**. Согласован промоут находки в конвенцию — тем же +вызовом заводится **задача `chore` на механизацию правила**: шаг 2 промоута +(конфиг линтера, сканер, приведение кода к зелёному) в хвост чужой задачи не +помещается (`av-dev:code-review`, `references/promote.md`). + +**Заведение задач агенту не отдаётся ни в одном сценарии** — по той же причине, +по какой ему не отдаются коммит и закрытие: оно правит индексы учёта, а перечень +работ ведёт человек. Правило и его дом — SKILL.md, «Кто пишет». + +**Потом документы — их пишет тот же агент, что шёл тактом первым.** В задании: - **одобренные записи дословно** — формулировка, источник, основание; сочинять заново нельзя, ADR цитирует решение из архивного `design.md`, а не пересказывает - его; -- **задачи из урожая** — вызовом `av-dev:task-track`, сценарий «задачи из ревью и - аудита», находка передаётся дословно вместе с оракулом; + его. Человек не одобрил ничего — писать нечего, и это законный вход; - **вычитка** `doc-wording` по всей пачке правленого — и первого такта, и этого; -- **гейт проекта до зелёного** после правок. +- **гейт проекта до зелёного** после правок — он же увидит заведённые задачи, + потому они и заводятся раньше. **Отвергнутое не пишется никуда.** Ни в один документ, ни отдельной записью «от такого-то отказались»: журнала отвергнутого канон не держит, и заведение его @@ -493,11 +512,12 @@ change. Заводить запись задним числом, чтобы её тебя нет: состав прогона постоянный и сокращению не подлежит, перечень тем сверяется по исходу, непокрытое называется строкой, а расхождение с одобренным — отдельным пунктом доклада. -- **Заведение задач из урожая ревью — не твоя работа и не работа этого прогона по - умолчанию.** Отложенные находки отдаются **списком**, и в задачи их превращает - `av-dev:task-track` — по слову человека, у него на этот вход отдельный сценарий - «задачи из ревью и аудита». Каталога задач в - проекте нет — урожай остаётся списком в докладе, и это говорится строкой. +- **Заведение задач из урожая ревью не идёт по умолчанию.** Отложенные находки + отдаются **списком**, и в задачи их превращает `av-dev:task-track` — по слову + человека и вызовом от тебя, а не от агента: перечень работ ведёт человек, а + индексы учёта правит тот же, кто коммитит. У скилла на этот вход отдельный + сценарий «задачи из ревью и аудита». Каталога задач в проекте нет — урожай + остаётся списком в докладе, и это говорится строкой. - **Стопов у сценария два, и оба про решения человека, а не про ход работ.** Чекпоинт шага 3 решает форму решения **до** кода; реплика шага 6 решает, что из найденного переживёт задачу. Между ними прогон идёт сам: правки инлайном чинятся diff --git a/av-dev/skills/doc-healthcheck/SKILL.md b/av-dev/skills/doc-healthcheck/SKILL.md index a49ae7c..c5f414d 100644 --- a/av-dev/skills/doc-healthcheck/SKILL.md +++ b/av-dev/skills/doc-healthcheck/SKILL.md @@ -170,9 +170,10 @@ check` и его скрипт; здесь начинается там, где к - **Не проверяет раскладку, версию и ссылки** — это `canon check`, там машина. - **Не судит язык** документов: залог, англицизмы, жаргон, термин без дома — это агент `doc-wording`, и зовут его отдельно, по пачке правленных документов. - Звонящие у него названные — последний шаг синка в `av-dev:doc-sync`, шаг 9 - `av-dev:doc-init` и шаг вычитки в обоих режимах `canon`, — просто ни один из - них не здесь. У него другой ритм: он нужен там, где текст только что писали, а + Звонящие у него названные — последний заход синка в `av-dev:doc-sync`, шаг + вычитки сценария разведки (`av-dev:code-resolve`), шаг 9 `av-dev:doc-init` и + шаг вычитки в обоих режимах `canon`, — просто ни один из них не здесь. У него + другой ритм: он нужен там, где текст только что писали, а не там, где он год лежал. Оркестровать его нечем — он один и работает по названному списку. - **Не правит документы за агентов** — они возвращают формулировки, решение diff --git a/av-dev/skills/doc-sync/SKILL.md b/av-dev/skills/doc-sync/SKILL.md index f00a543..371c0bb 100644 --- a/av-dev/skills/doc-sync/SKILL.md +++ b/av-dev/skills/doc-sync/SKILL.md @@ -139,6 +139,14 @@ description: "Вести содержимое документов канона она коснулась, — и назови этот список в промпте: по нему же он судит, известен ли термин. Находки он отдаёт готовыми формулировками, подставляешь их ты. +**Синк бывает в два захода, и вычитка идёт последним из них.** Вернул непустой +список предложений — правка ещё не кончилась: человек ответит, и второй заход +допишет одобренное. Вычитывать пачку, которая сейчас пополнится, значит платить +за неё дважды. Значит: **предложения есть — вычитку откладываешь до второго +захода; предложений нет — этот заход последний, и вычитка идёт в нём.** Отказ +человека второго захода не отменяет: письма в нём не будет, а вычитка и гейт +будут — иначе правка первого захода уедет в коммит невычитанной. + **Условие вызова — правка, а не синк.** Синк самый частый вызывающий, но не единственный: разведка (`av-dev:code-resolve`, сценарий разведки) пишет ответ по одному адресу и синком себя не считает намеренно — вычитка ей нужна ровно та же. @@ -308,13 +316,21 @@ av-dev:code-review`, его `references/review-journal.md`. раздел `.av-dev.toml`). **Считает синк**, и вот чем: ```sh -git rev-list --count ..HEAD -- openspec/changes/archive +git rev-list --count ..HEAD -- openspec/changes/archive <каталог задач> ``` -Коммит, тронувший архив, — это доехавшая до конца задача, так что счёт идёт в -задачах, а не в правках. `openspec` в проекте нет — считай коммиты +Считаются коммиты, тронувшие **архив change или каталог задач** (его путь — ключ +`[tasks] dir`). Оба пути выбраны потому, что доведённая до конца задача оставляет +след хотя бы в одном: решение архивирует change, а обслуживание и разведка change +не заводят вовсе и видны только закрытием — правкой индексов учёта. Считать один +архив значило бы не считать `chore` и `research`, то есть на проекте с их +перевесом говорить «звать рано» вечно. + +Ни `openspec`, ни каталога задач в проекте нет — считай коммиты (`git rev-list --count ..HEAD`) и **скажи, что считал коммиты**: число другого рода, и молчаливая подмена сделала бы признак вдвое чувствительнее. +Постановка, пришедшая текстом, следа не оставляет ни там ни там — такие задачи в +счёт не входят, и это тоже говорится строкой, когда прогон шёл текстом. Строка доклада обязательна всегда, и вариантов у неё три: diff --git a/av-dev/skills/task-track/references/from-review.md b/av-dev/skills/task-track/references/from-review.md index 7759b10..2f8d930 100644 --- a/av-dev/skills/task-track/references/from-review.md +++ b/av-dev/skills/task-track/references/from-review.md @@ -15,11 +15,13 @@ не файл-на-находку.** Если у ревью был триаж — половина работы уже сделана, бери его выход. Если нет — триажируй сам, прежде чем заводить. -**Штатный отправитель — `av-dev:code-review`** (и `av-dev:code-resolve`, который -его вызывает): задач он не заводит сам, а отдаёт отложенные находки **списком -урожая** — формулировка, оракул, откуда взялась — и хранит отчёт триажа вместе с -изменением. Приходит и любой другой разбор, вплоть до пересказа человеком; тогда -триажа нет и шаг 1 порядка делается руками. +**Штатных отправителя два.** Первый — `av-dev:code-review` (и зовущий его +`av-dev:code-resolve`): задач он не заводит сам, а отдаёт отложенные находки +**списком урожая** — формулировка, оракул, откуда взялась — и хранит отчёт триажа +вместе с изменением. Второй — `av-dev:code-deep-review`, и он зовёт этот сценарий +напрямую, передавая согласованные с человеком находки дословно. Приходит и любой +другой разбор, вплоть до пересказа человеком; тогда триажа нет и шаг 1 порядка +делается руками. ## Находка агента — не задача @@ -64,6 +66,14 @@ ради которого заведение из ревью и выделено. Дешёвая мелочь по явному согласию может заводиться и без поштучного вопроса — но карта пользователю предъявляется всё равно. + + **Барьер снимается ровно в одном случае — когда его уже прошли.** В хвосте + задачи (`av-dev:code-resolve`, шаг 6; в обслуживании — шаг 5) человек одной + репликой сказал, что из урожая заводится, и третьего стопа у прогона не будет: + там карта идёт **строкой доклада**, а не вопросом. Признак читается буквально: + **список находок уже был показан человеку и получил ответ**. Не был — карта + предъявляется вопросом, и это обычный случай прямого вызова и вызова из + `av-dev:code-deep-review`, где находки разбирались по одной, а нарезка — нет. 6. **Заводи утверждённое** через `tasks.py add`, с тремя добавками: - **тег партии** — `--tag review-ГГГГ-ММ-ДД` (или `audit-`), чтобы весь заход разбора поднимался одной командой `list --tag …`; diff --git a/decisions/80-tail-contradictions-fixed.md b/decisions/80-tail-contradictions-fixed.md new file mode 100644 index 0000000..2fb710f --- /dev/null +++ b/decisions/80-tail-contradictions-fixed.md @@ -0,0 +1,86 @@ +# 80. Противоречия хвоста сведены: кто зовёт учёт, когда идёт третий такт (2026-08-23) + +## Что было + +Тему 78 проверило ревью — три прохода по скиллам, документам и сквозной +консистентности. Кроме поломки, разобранной темой 79, оно нашло, что тема +противоречит сама себе в четырёх местах, и все четыре — про хвост задачи. + +**Учёт отдали агенту, не сняв запрета.** Такт третий звал `av-dev:task-track`, а +`code-resolve/SKILL.md` двумя абзацами ниже объявлял этот вызов оркестраторским и +перечень закрытым, а границы задания агента прямо гласили «задач не заводит». + +**Ветка отказа не была покрыта.** Первый такт откладывал вычитку и гейт в третий, +третий запускался «только если человек что-то одобрил» — и на ответе «ничего» +правка первого такта уезжала в коммит невычитанной, с непрогнанным гейтом. + +**Дом правила вычитки не знал про два захода.** `doc-sync` велел звать +`doc-wording` последним шагом правки; агент, читающий дом, вычитал бы половину +пачки. + +**Барьер учёта столкнулся с одной репликой.** Сценарий «задачи из ревью и аудита» +требует показать карту кластеров через `AskUserQuestion` — изнутри агента, где +показывать некому, и вторым вопросом там, где стоп уже был. + +Отдельно разошёлся счёт стопов: «один плановый» в четырёх местах против «два» во +фронтматтере и тонкостях, — и сценарий обслуживания получил реплику, но не +получил того, кто пишет одобренное. + +## Решено + +**Р322. Задачи из урожая заводит оркестратор, а не агент.** Довод тот же, что у +коммита и закрытия: заведение правит индексы учёта, а перечень работ ведёт +человек. Агенту третьего такта остаётся письмо в документы канона. + +**Р323. Третий такт идёт всякий раз, когда была реплика** — в том числе на ответе +«ничего»: на нём висят вычитка и гейт, снятые с себя первым тактом. Не +запускается он ровно тогда, когда реплики не было вовсе. + +**Р324. Дом правила вычитки знает про два захода.** Предложения есть — вычитка +ждёт второго захода; предложений нет — заход последний, и вычитка идёт в нём; +отказ человека второго захода не отменяет. + +**Р325. Барьер карты кластеров снимается там, где его уже прошли.** Признак +читается буквально: список находок уже показан человеку и получил ответ. Это +хвост задачи; при прямом вызове и вызове из `av-dev:code-deep-review` карта +по-прежнему предъявляется вопросом — там разбирали находки, а не нарезку. + +**Р326. Стопов у сценария два, и счёт сведён в одну таблицу** — по сценариям, с +разделением «до письма» и «после письма». Чекпоинт остаётся не более чем одним, и +реплика этого счёта не касается: она решает не форму решения, а судьбу находок. + +**Р327. У обслуживания появился второй заход, а повод для реплики один** — новый +запрет или инвариант `CLAUDE.md`. Урожай ревью спрашивается той же репликой; +сужение проверок не спрашивается вовсе, потому что его решил человек. + +**Р328. Сигнал сверки считается по архиву change и каталогу задач разом.** Счёт +по одному архиву не видел `chore` и `research`: они change не заводят и заметны +только закрытием. Постановка текстом следа не оставляет ни там ни там — это +говорится строкой. + +**Р329. «Род правки документа» внесён в перечень осей** — отражение · новое, дом +`av-dev:doc-sync`. Перечень объявлен полным, а ось ветвит поведение трёх скиллов; +её отсутствие было ровно тем молчаливым пропуском, от которого перечень +предостерегает в своей же шапке. + +**Р330. Глубокое ревью пишет след в `docs/review.md` без второго вопроса.** +`review.md` — документ рода «новое», но слово по каждой находке человек сказал в +разборе, а след цитирует его решения. + +## Следствия + +**С285. Сигнал сверки вошёл в контракт возврата и в доклады всех трёх +сценариев.** Прежде строка была объявлена обязательной в скилле-владельце, но +порождалась там, где её никто не обязан вернуть. + +**С286. Прогон ревью после трансформации перестал быть необязательным.** Он нашёл +одну рабочую поломку (тема 79) и четыре противоречия, ни одно из которых не видит +гейт: гейт судит форму, а согласованность утверждений — суждение. + +**С287. Часть находок ревью намеренно отложена, и это не пропуск.** Старший долг — +основания развилки, названные то двумя, то тремя; `task-track/SKILL.md`, живущий +в мире снятых меток; `review-basics`, у которого «нет тем ядра» и тут же есть +`operations`; вопросы проекта по темам, обещанные проходам, которые о них не +знают; расхождения `av-dev:code-deep-review` с уставами `review-code` и +`review-triage`; отсутствующая запись журнала версий канона. Всё это старше темы +78 и разбирается отдельным заходом. diff --git a/decisions/README.md b/decisions/README.md index 9ed97c4..118086b 100644 --- a/decisions/README.md +++ b/decisions/README.md @@ -131,3 +131,4 @@ | 77 | [Цикл задачи проверяет механику; метки сняты](77-cycle-checks-mechanics-labels-dropped.md) | 2026-08-23 | | 78 | [Хвост задачи: отражение молча, новое — по слову](78-tail-reflection-silent-new-by-word.md) | 2026-08-23 | | 79 | [След сверки переехал в секцию docs; ключ верхнего уровня ронял скрипты](79-healthcheck-trace-moved-into-docs-section.md) | 2026-08-23 | +| 80 | [Противоречия хвоста сведены: кто зовёт учёт, когда идёт третий такт](80-tail-contradictions-fixed.md) | 2026-08-23 |