From 68218208b70a1377da7f0b671105639471329d0c Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Mon, 3 Aug 2026 14:48:01 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D1=87=D0=B8=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=BA=D0=B8=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B9=20=D1=81=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B8:=20=D0=B7=D0=B0=D0=BA=D1=80=D1=8B?= =?UTF-8?q?=D1=82=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B5=D1=85=D0=B0=D0=BB=D0=BE=20=D0=B7?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - sprint.md прямо запрещал шаг, который пайплайн теперь делает: раздел «кто и когда закрывает» переписан под снятую границу приёмки - закрытие задачи стало шагом 11, после коммита: раньше упавший коммит оставил бы задачу закрытой без следа работы - контракт close --implemented больше не обещает состоявшуюся приёмку - слот «куда копируются критерии приёмки» убран из session: на него отвечает пайплайн, а канон его не заводил - research/ в таблице ролей вернул adversary; журнал версий поднимает CLAUDE.md целиком, а не тремя пунктами из восьми - TODO и REMAINING перестали занижать: коммитов одиннадцать, переписок три --- REMAINING.md | 20 ++++----- TODO.md | 4 +- av-dev-pipeline/skills/task-pipeline/SKILL.md | 35 ++++++++------- av-dev-pm/skills/canon/references/canon.md | 2 +- .../skills/canon/references/changelog.md | 7 ++- av-dev-pm/skills/session/SKILL.md | 10 ++--- av-dev-pm/skills/session/references/sprint.md | 45 ++++++++++++------- av-dev-pm/skills/tasks/SKILL.md | 2 +- 8 files changed, 70 insertions(+), 55 deletions(-) diff --git a/REMAINING.md b/REMAINING.md index a345b66..01106ad 100644 --- a/REMAINING.md +++ b/REMAINING.md @@ -1,7 +1,7 @@ # Остатки, открытые вопросы и принятые пределы -Состояние на 2026-08-03, после разбора восьми тем и первых двух коммитов -реализации (`ad1779b`, `9cef452`). +Состояние на 2026-08-03, после разбора восьми тем и 11 коммитов реализации +(`ad1779b` … `HEAD`). План работ — [TODO.md](TODO.md). Решения с причинами — [DECISIONS.md](DECISIONS.md). Здесь то, что **не** является работой из плана: незакрытые риски, честно принятые @@ -9,16 +9,17 @@ ## Главный незакрытый риск -**Калибровка не сделана, а charter'ы переписаны второй раз.** +**Калибровка не сделана, а charter'ы переписаны трижды.** Первый раз девять charter'ов правили при выносе в плагин: предмет проверки заменили ссылкой на раздел брифа. `references/calibration.md` требует при такой правке замерить, помогла ли она, — **замера не было**. Второй раз их переписали -сейчас, коммитом `9cef452`: ссылка на раздел брифа заменена путём документа -канона. +коммитом `9cef452`: ссылка на раздел брифа заменена путём документа канона. +Третий — коммитами `0eab075` и следующим, по находкам ревью: `adversary`, `ops`, +`reimpl`, `rubric` и `triage` правились ещё раз. -Два неизмеренных изменения подряд **в том самом месте, где присваивается -severity**. Пробы готовы и синтетических не нужно — четыре реальные находки +**Три неизмеренных изменения подряд** в том самом месте, где присваивается +severity. Пробы готовы и синтетических не нужно — четыре реальные находки прошедшей сессии healthlog: - скелет из `null` затирает маршрут тренировки молча и необратимо; @@ -41,9 +42,8 @@ severity**. Пробы готовы и синтетических не нужн Список работ — в [TODO.md](TODO.md). Здесь только то, что стоит держать в голове отдельно: -- **`git push`.** Четыре коммита с `av-dev-pm` и `av-dev-pipeline` не отправлены - на origin, поэтому установленный маркетплейс их не видит и до сих пор стоит на - `092d07c`. Это буквальное объяснение фразы «плагины ни к одному проекту не +- **`git push`.** 11 коммитов не отправлены на origin, поэтому установленный + маркетплейс их не видит и до сих пор стоит на `092d07c`. Это буквальное объяснение фразы «плагины ни к одному проекту не подключены»: подключать пока нечего. - **Ни один скилл не прогонялся на живом проекте.** `docs.py` прогнан на healthlog и jellybit в режиме `check` и находит осмысленный дрейф; `init`, diff --git a/TODO.md b/TODO.md index 373c4c8..0027606 100644 --- a/TODO.md +++ b/TODO.md @@ -8,8 +8,8 @@ ## 0. Предусловие -- [ ] `git push` — четыре коммита с `av-dev-tasks` и `av-dev-pipeline` не - отправлены на origin, поэтому маркетплейс их не видит (37) +- [ ] `git push` — 11 коммитов не отправлены на origin, поэтому маркетплейс их + не видит и стоит на `092d07c` без единого нового плагина (37) - [ ] `claude plugin marketplace update av-dev-skills` — повторно, после push ## 1. Репозиторий плагинов diff --git a/av-dev-pipeline/skills/task-pipeline/SKILL.md b/av-dev-pipeline/skills/task-pipeline/SKILL.md index 070869b..a62d62b 100644 --- a/av-dev-pipeline/skills/task-pipeline/SKILL.md +++ b/av-dev-pipeline/skills/task-pipeline/SKILL.md @@ -288,20 +288,6 @@ description: Автономно проводит одну задачу чере и пройди по разделам его раскладки: каждый документ канона получает строку. Канона в проекте тоже нет — назови это исходом и предложи `av-dev-pm:canon`. -### 9а. Закрыть задачу - -**Вызови Skill `av-dev-pm:tasks`** и попроси закрыть задачу как реализованную — -он владеет форматом и двигает строку между индексами сам. Путь к его скрипту не -выясняй и индексы руками не правь: мост между плагинами — вызов скилла, а не -путь. - -Плагина в проекте нет — вызов не разрешится. Тогда **ничего не выдумывай**: -скажи в докладе, что учёт задач остаётся за владельцем, и назови исход. - -**Приёмщик и исполнитель здесь совпадают**, и закрытие не окончательно: человек -на сессии может вернуть задачу (`reopen` с причиной). Поэтому доклад по критериям -приёмки — не формальность, а единственное, по чему приёмка вообще возможна. - ### 10. Коммит Коммить **в текущую ветку** (`git rev-parse --abbrev-ref HEAD`), сам ветку не @@ -313,9 +299,24 @@ description: Автономно проводит одну задачу чере сделано», тело списком 1–3 пункта, без трейлеров). Одна задача — один осмысленный коммит. -Готово — доложи кратко. Задача к этому моменту **закрыта шагом 9а** (или учёт -явно оставлен владельцу, если плагина нет). Доклад — то, по чему человек проводит -приёмку и решает, не вернуть ли задачу `reopen`. +### 11. Закрыть задачу — **после коммита, не раньше** + +**Вызови Skill `av-dev-pm:tasks`** и попроси закрыть задачу как реализованную — +он владеет форматом и двигает строку из `SPRINT.md` сам. Путь к его скрипту не +выясняй и индексы руками не правь: мост между плагинами — вызов скилла, а не +путь. + +**Порядок обязателен.** Закрытие удаляет файл задачи; сделанное до коммита оно +оставило бы задачу закрытой без единого следа работы, если шаг 10 упадёт. + +Плагина в проекте нет — вызов не разрешится. Тогда **ничего не выдумывай**: +скажи в докладе, что учёт задач остаётся за владельцем, и назови исход. + +**Приёмщик и исполнитель здесь совпадают**, и закрытие не окончательно: человек +на сессии может вернуть задачу (`reopen` с причиной). Поэтому доклад по критериям +приёмки — не формальность, а единственное, по чему приёмка вообще возможна. + +Готово — доложи кратко. - **исход** задачи одним из трёх слов и, если не «сделана», чем ограничен результат; diff --git a/av-dev-pm/skills/canon/references/canon.md b/av-dev-pm/skills/canon/references/canon.md index c716cdb..d47c877 100644 --- a/av-dev-pm/skills/canon/references/canon.md +++ b/av-dev-pm/skills/canon/references/canon.md @@ -62,7 +62,7 @@ kebab-case. | `database.md` | что лежит в хранилище и какими настройками | `ops`, `adversary`, `reimpl` | | `security.md` | против кого защищаемся и что вне модели | `adversary` | | `conventions/` | как мы пишем код | `code` | -| `research/` | что показала реальность, а не документация | `specs`, `reimpl`, `ops` | +| `research/` | что показала реальность, а не документация | `specs`, `reimpl`, `ops`, `adversary` | | `adr/` | почему решено именно так | `architecture` | | `review.md` | как настроен конвейер и что уже проскакивало | `triage`, каждый проход — свою часть | | `openspec/specs/` | что система делает — нормативно | `specs` | diff --git a/av-dev-pm/skills/canon/references/changelog.md b/av-dev-pm/skills/canon/references/changelog.md index e7c4795..a7a80bc 100644 --- a/av-dev-pm/skills/canon/references/changelog.md +++ b/av-dev-pm/skills/canon/references/changelog.md @@ -38,7 +38,10 @@ upgrade` идёт по записям снизу вверх от версии п документам канона. 10. `conventions.md` → `conventions/`, `local-research.md` → `research/`. 11. Завести `docs/security.md` с периметром первой строкой и `docs/adr/`. -12. В `CLAUDE.md`: severity рядом с каждым инвариантом, семантика гейта, - запреты с путями; убрать раздел «Процесс», если он пересказывает пайплайн. +12. В `CLAUDE.md`: severity рядом с каждым инвариантом; семантика гейта (чем + краснеет безусловно, где логи, чего в нём нет и кто тогда гоняет дорогое); + **имя основной ветки**; запреты с путями; где `testdata` и куда писать + временное; **что считается необратимым**; общий станок; ориентир по размеру + спринта. Убрать раздел «Процесс», если он пересказывает пайплайн. 13. В `openspec/config.yaml` оставить только нужды генерации и ссылки. 14. Добавить шаг `docs.py check` в гейт проекта. diff --git a/av-dev-pm/skills/session/SKILL.md b/av-dev-pm/skills/session/SKILL.md index 7fd0d78..62d04d7 100644 --- a/av-dev-pm/skills/session/SKILL.md +++ b/av-dev-pm/skills/session/SKILL.md @@ -208,13 +208,13 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со спринт. 3. **Необратимое** — что спрашивается у человека всегда (тот же слот, что у скилла `tasks`; дом один). -4. **Как критерии приёмки переживают удаление файла задачи** — файл удаляется - при закрытии, поэтому критерии копируются туда, где их увидит приёмщик - (предложение об изменении, описание ветки, тело коммита). Куда именно — - решает проект. -5. **Ориентир по размеру спринта**, если он замерялся. Умолчание — 5–8 задач, и +4. **Ориентир по размеру спринта**, если он замерялся. Умолчание — 5–8 задач, и это **ориентир, а не закон**. +Слота «куда копируются критерии приёмки» здесь нет намеренно: на него отвечает +**пайплайн проекта**, перенося их в описание изменения при его заведении. Проект +без пайплайна называет своё место сам, в слоте 1. + Числа проекта (сколько задач в спринте, сколько времени на задачу, каков прирост беклога) — предмет шага 2, а не константы этого скилла. diff --git a/av-dev-pm/skills/session/references/sprint.md b/av-dev-pm/skills/session/references/sprint.md index 785ef4d..3f58f21 100644 --- a/av-dev-pm/skills/session/references/sprint.md +++ b/av-dev-pm/skills/session/references/sprint.md @@ -61,19 +61,27 @@ ### Кто и когда закрывает -**Задачу закрывает не пайплайн, а владелец спринта — после приёмки.** Порядок: +**Задачу закрывает агент-оркестратор — тот же, кто её и сделал**, последним шагом +пайплайна, после коммита. Порядок: -1. пайплайн доводит задачу до коммита и **докладывает исход**; файл задачи он не - трогает — своей процедуры закрытия у него нет; -2. приёмщик (не исполнитель) сверяет критерии поимённо и выносит вердикт; -3. вердикт сошёлся — владелец спринта зовёт `close --implemented` - командой учёта задач из `CLAUDE.md` проекта. +1. пайплайн доводит задачу до коммита; +2. **после коммита** зовёт `Skill av-dev-pm:tasks` и закрывает задачу + (`close --implemented`); строка уходит из `SPRINT.md`; +3. **докладывает исход и по каждому критерию — оракул и наблюдаемый исход.** + Это доклад приёмщику, а не отметка «принято». -Обратный порядок ломает приёмку физически: закрытие **удаляет файл**, и -приёмщику, нашедшему расхождение, возвращать нечего. +**Приёмщик и исполнитель здесь совпадают, и это принято сознательно** — цена +названа в `SKILL.md`, раздел «Стимулы». Поэтому закрытие **не окончательно**, а +доклад по критериям — не формальность: он единственное, по чему приёмка вообще +возможна. -**Дорога назад существует и обязана быть названа.** Закрыли раньше вердикта, а -приёмка не сошлась — `tasks.py reopen --reason "приёмка не сошлась: …"`: +**Порядок «коммит, потом закрытие» обязателен.** Закрытие удаляет файл задачи; +упавший коммит после закрытия оставил бы задачу закрытой без единого следа +работы. + +**Дорога назад существует и обязана быть названа.** Человек на сессии сверил +критерии, и приёмка не сошлась — `tasks.py reopen --reason "приёмка не +сошлась: …"`: файл восстанавливается из истории git, строка возвращается в набор идущего спринта (или в беклог, если спринта нет), строка кладбища снимается. Тело восстанавливается **на момент удаления** — всё, что было дописано позже, живёт @@ -84,13 +92,16 @@ Три условия, без которых пункт про критерии не исполняется никем: 1. **Критерии переживают файл задачи.** Файл удаляется при закрытии, поэтому - критерии копируются туда, где их увидит приёмщик — в предложение об - изменении, описание ветки, тело коммита. Куда именно, называет `CLAUDE.md` - проекта. Иначе приёмка проверяет критерии из файла, которого больше нет. -2. **Принимает не исполнитель.** Отдельный контекст — сабагент или человек, — - которому дают изменение, отчёт исполнителя и отчёты ревью. Тот же принцип - декорреляции, на котором стоит любой конвейер проверки: занизивший и - проверяющий не должны быть одним контекстом. + критерии копируются туда, где их увидит приёмщик. Куда именно — **отвечает + пайплайн проекта, а не слот в `CLAUDE.md`**: он переносит их в `tasks.md` + изменения на шаге заведения change. Проект без пайплайна называет своё место + сам. +2. **Принимает человек на сессии, а не отдельный агент.** Декорреляция + исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его + цена — в `SKILL.md`, «Стимулы»). Опоры остались три: сохранённый отчёт триажа + в `openspec/changes//review/` — независимый артефакт, `SPRINT.md` под git + и `reopen`. Переоценка на сессии и есть момент, когда критерии видит не + исполнитель. 3. **Расхождение — дефект критериев.** Приёмщик правит критерии и возвращает задачу исполнителю **в этом же спринте**: ответ есть, остаток есть, по тесту про остаток это не выход из спринта. diff --git a/av-dev-pm/skills/tasks/SKILL.md b/av-dev-pm/skills/tasks/SKILL.md index a765461..657fd6c 100644 --- a/av-dev-pm/skills/tasks/SKILL.md +++ b/av-dev-pm/skills/tasks/SKILL.md @@ -116,7 +116,7 @@ python3 $tk add --dir D --slug S --title T [--type goal|idea|epic] [--section S] python3 $tk edit S --dir D [--title T] [--hook H] [--type T] [--goal G] [--add-tag a,b] [--rm-tag c] python3 $tk move S --dir D --section S [--reason R] [--after S | --first] python3 $tk close S --dir D --reason R # в REJECTED.md + удалить (ушла без реализации) -python3 $tk close S --dir D --implemented # просто удалить (реализована, приёмка сошлась) +python3 $tk close S --dir D --implemented # просто удалить (реализована и закоммичена) python3 $tk reopen S --dir D --reason R # вернуть закрытую: приёмка не сошлась python3 $tk sprint start --goal S --dir D | take S… | drop S… --reason R | close [--dissolve --reason R] python3 $tk init --dir D [--sections …] [--plan-sections …] [--items …] [--backlog …] …