From 47a2f3de6320da73a7ee9880965657bc12afe969 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Wed, 5 Aug 2026 14:49:03 +0300 Subject: [PATCH] =?UTF-8?q?=D1=8F=D0=B7=D1=8B=D0=BA=20=D1=81=D0=BA=D0=B8?= =?UTF-8?q?=D0=BB=D0=BB=D0=BE=D0=B2=20av-dev-pm:=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=20=D1=83=D0=BF=D1=80=D0=BE=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BF=D1=8F=D1=82=D1=8C=D1=8E=20=D0=B0=D0=B3?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D0=BC=D0=B8=20=D0=B8=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B7=D0=B1=D0=BE=D1=80=20=D0=BD=D0=B0=D1=85=D0=BE=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Эксперимент: по сабагенту на каждый скилл av-dev-pm, задача — переписать текст более простыми словами, но только там, где уверен и без потери смысла и точности. Нормой служил устав языка самого проекта, language.md, включая его раздел «Порог правки»: правка без нарушенного правила не делается. 36 правок в двенадцати файлах, +64/-63 — почти строго замена, а не переписывание. Правили залог (пассив с названным деятелем в творительном), отглагольные существительные, параллельность перечней, канцелярит «является», пару garden-path и одно двойное отрицание. Контракт не задет нигде: в диффе нет изменённых строк-заголовков, а код-спаны встречаются ровно парой минус-плюс, то есть ни имя, ни флаг, ни путь не переписаны. Отчёты «что рассматривал и не тронул» вышли длиннее отчётов о правках у всех пятерых, и это главный результат прогона. Самый частый повод остановиться — слово, живущее в четырёх файлах: конфляция, интейк, провенанс, непоймание. Правка в одном месте развела бы словарь, а править все — уже не упрощение текста скилла, а сквозной проход по репозиторию. Второй повод — формулировка, дословно повторённая в соседнем плагине: декорреляция, материализация нерешённого, «при расхождении прав текст». Шестой агент проверил все 36 правок и нашёл четыре. Перестановка слов в task-research.md развела формулу с её домом: «число без источника проход ревью обязан читать как условие» стоит в canon.md и в уставе doc-consistency, который прямо ссылается на канон как на источник. Откачено — это ровно тот класс расхождения, который сам doc-consistency и ловит. «Держит H1, мету и индекс в согласии» — управление требует дополнения, а language.md в разделе англицизмов прямо оговаривает: русский аналог звучит коряво — остаётся термин. Взят третий вариант, «согласованными». В skeletons.md «правка тянет запись, и она называет» — местоимение указывает на два женских существительных сразу. Стало «и запись называет». Четвёртая находка не откачена: правка в init/SKILL.md хорошая, но развела конструкцию с близнецом в canon/SKILL.md — выровнена вторая половина. Побочно найдена старая логическая инверсия в DECISIONS.md, решение U: «становится неотличимым, только если отрицание обязательно» — смысл вывернут, в docs/SKILL.md и во второй записи журнала он правильный. Починено. Co-Authored-By: Claude Opus 5 (1M context) --- DECISIONS.md | 4 +-- av-dev-pm/skills/canon/SKILL.md | 10 +++---- .../skills/canon/references/skeletons.md | 2 +- av-dev-pm/skills/docs/SKILL.md | 14 +++++----- av-dev-pm/skills/init/SKILL.md | 16 ++++++------ av-dev-pm/skills/session/SKILL.md | 15 ++++++----- .../skills/session/references/cadence.md | 26 +++++++++---------- av-dev-pm/skills/session/references/sprint.md | 14 +++++----- av-dev-pm/skills/tasks/SKILL.md | 16 ++++++------ av-dev-pm/skills/tasks/references/split.md | 6 ++--- .../skills/tasks/references/task-chore.md | 2 +- .../skills/tasks/references/task-format.md | 2 +- 12 files changed, 64 insertions(+), 63 deletions(-) diff --git a/DECISIONS.md b/DECISIONS.md index c26c440..4580c52 100644 --- a/DECISIONS.md +++ b/DECISIONS.md @@ -507,8 +507,8 @@ check`). Плюс `openspec/specs/` вливает `opsx:archive`. *Причина:* это тот же приём, что «границы покрытия» в отчёте ревью и «пустой пункт называется пустым» в каноне — и единственный, о котором в этом репозитории -есть данные, что он работает. Умолчание «не написал» становится неотличимым от -«написал, что не требуется», только если отрицание обязательно. +есть данные, что он работает. Отличить «не написал» от «написал, что не +требуется» можно только тогда, когда отрицание обязательно. **Триггер ADR, окончательная формулировка.** Запись заводится, когда верно одно из трёх: **дорогой откат** (переделка стоит дороже переписывания одного файла); diff --git a/av-dev-pm/skills/canon/SKILL.md b/av-dev-pm/skills/canon/SKILL.md index 8433040..c1ab804 100644 --- a/av-dev-pm/skills/canon/SKILL.md +++ b/av-dev-pm/skills/canon/SKILL.md @@ -18,7 +18,7 @@ description: Привести проект к канону документов которое прочитали последним. Прочитай его **до** первой правки. - [references/skeletons.md](references/skeletons.md) — **что именно класть** в - каждый незаполненный слот. Своей формой заглушку не выдумывай: `docs.py` + каждый незаполненный слот. Не выдумывай заглушку своей формы: `docs.py` узнаёт только плейсхолдер `` из шаблонов. - [references/language.md](references/language.md) — **как это написано словами**: информационный стиль, применённый к проектным текстам, таблицы англицизмов и @@ -88,7 +88,7 @@ capability: незаполненный канон это переходное с ещё и читает репозиторий. Позвал `doc-code-drift` — передай ему раздел запретов `CLAUDE.md`. 3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница - покрытия** — что смотрели и чего не смотрели, и **кто из двоих был позван**: + покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**: доклад, умолчавший об этом, читается как «сверено». Дрейф раскладки чинится переносом; смысловые находки — это либо правка @@ -101,7 +101,7 @@ capability: незаполненный канон это переходное с `docs.py check` — он уже назовёт упразднённые слоты с адресом, куда каждый уезжает. **Но смотрит он только верхний уровень `docs/`:** упразднённое в корне репозитория (`BRIEF.md`) и во вложенных каталогах он не назовёт никогда, поэтому -корневые `*.md` читаются глазами. Плюс: `CLAUDE.md`, `openspec/specs/` (список +корневые `*.md` читай глазами. Плюс: `CLAUDE.md`, `openspec/specs/` (список capability), `openspec/config.yaml`. ### 2. Составь карту @@ -137,8 +137,8 @@ capability), `openspec/config.yaml`. незаполненное — одной честной информативной строкой, а не «TBD»; 3. переносы содержимого; 4. каталог задач — **вызови скилл `av-dev-pm:tasks`**, сценарий адаптации: он - владеет форматом задач, включая переименование транслитных слагов в - английские вместе с починкой перекрёстных ссылок; + владеет форматом задач. Он же переименует транслитные слаги в английские и + тем же проходом починит перекрёстные ссылки; 5. починка ссылок на перенесённое во всём репозитории — `docs/`, `openspec/`, `CLAUDE.md`, `README.md`; 6. удаление оригиналов — **только тех, чьё содержимое найдено в новом доме**; diff --git a/av-dev-pm/skills/canon/references/skeletons.md b/av-dev-pm/skills/canon/references/skeletons.md index abb537d..1fad8de 100644 --- a/av-dev-pm/skills/canon/references/skeletons.md +++ b/av-dev-pm/skills/canon/references/skeletons.md @@ -12,7 +12,7 @@ `adr/README.md` и `review.md` уезжают в репозиторий проекта и обязаны там что-то говорить; определение при этом остаётся в [canon.md](canon.md). Отсюда обязанность: **правка такого правила в каноне тянет запись в -[changelog.md](changelog.md)** с указанием, какой файл проекта поднимает +[changelog.md](changelog.md)** — и запись называет, какой файл проекта поднимает `upgrade`. Без этого копия в проекте останется на старой версии молча. **Каждая такая копия помечена и сверяется машиной.** Дом обрамляется diff --git a/av-dev-pm/skills/docs/SKILL.md b/av-dev-pm/skills/docs/SKILL.md index adfc5f5..6c162f5 100644 --- a/av-dev-pm/skills/docs/SKILL.md +++ b/av-dev-pm/skills/docs/SKILL.md @@ -21,8 +21,8 @@ description: Вести содержимое документов канона Причина, по которой правило именно такое, измерена: у ADR был список триггеров прозой — и он дал **6 записей на 43 изменения**. Прозаический триггер, который -некому проверить, не срабатывает. Умолчание «не написал» становится отличимым от -«написал, что не требуется», только когда отрицание обязательно. +некому проверить, не срабатывает. Отличить «не написал» от «написал, что не +требуется» можно только тогда, когда отрицание обязательно. Это тот же приём, что «границы покрытия» в отчёте ревью и «пустое называется пустым» в каноне. @@ -65,11 +65,11 @@ description: Вести содержимое документов канона **Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и `doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом. Причина в цене: агент на `opus` по каждой сделанной задаче — самая дорогая -церемония процесса, а расхождение между двумя документами по определению требует -двух документов, и на большинстве задач синк правит один. +церемония процесса. К тому же расхождение между двумя документами по определению +требует двух документов, а на большинстве задач синк правит один. Что теряется: привязка находки к задаче, которая её породила. Что выигрывается, -кроме денег: пачка перестаёт отбираться синком, и в неё попадают документы, +кроме денег: синк перестаёт отбирать пачку, и в неё попадают документы, которых работа не касалась, — расхождение, внесённое правкой в одном месте, там и живёт. @@ -101,7 +101,7 @@ description: Вести содержимое документов канона маркера долга и правило «гейт от них не краснеет» — в [каноне](../canon/references/canon.md), раздел `architecture.md`.** -Разбирается порциями: раздел вычищается той задачей, которая его касается. +Разбирается порциями: раздел вычищает та задача, которая его касается. Содержимое не выбрасывается, а переезжает — требования в дельта-спеку change, обоснование в ADR, обзор остаётся строкой со ссылкой на capability. @@ -128,7 +128,7 @@ description: Вести содержимое документов канона Твоя часть на синке: **дефект пишется сразу**, а не «потом, когда починим». Со временем теряется не факт, а причина непоймания — единственное, ради чего -журнал есть. И решение о сужении проверок (перестали звать проход, понизили +журнал есть. И решение сузить проверки (перестали звать проход, понизили профиль) обязано попасть в раздел настройки, а не остаться в отчёте ревью. ## Промоут в конвенции diff --git a/av-dev-pm/skills/init/SKILL.md b/av-dev-pm/skills/init/SKILL.md index cd9a29e..7ea846e 100644 --- a/av-dev-pm/skills/init/SKILL.md +++ b/av-dev-pm/skills/init/SKILL.md @@ -8,16 +8,16 @@ description: "Завести новый проект — сессия вопро Вход — свободный текст «что мне нужно и почему». Выход — канон документов, с которого дальше работают все остальные скиллы. -**Определение канона — [канон](../canon/references/canon.md).** Читается до +**Определение канона — [канон](../canon/references/canon.md).** Прочитай его до первого вопроса: интервью идёт по слотам канона, а не по вкусу. Что класть в -каждый файл — [скелеты](../canon/references/skeletons.md); своей формы заглушки -не выдумывай, `docs.py` узнаёт только плейсхолдер оттуда. +каждый файл — [скелеты](../canon/references/skeletons.md); не выдумывай заглушки +своей формы, `docs.py` узнаёт только плейсхолдер оттуда. ## Что `init` физически не может произвести В новом репозитории **нет кода**, а `architecture.md`, `database.md`, -`conventions/` и `research/` выводятся из него. Их сочинение на старте — это -проектирование вперёд реальности, и оно протухнет раньше первой задачи. +`conventions/` и `research/` выводятся из него. Сочинить их на старте — значит +проектировать вперёд реальности, и написанное протухнет раньше первой задачи. Поэтому `init` заполняет то, что человек знает **до первой строки кода**: @@ -56,13 +56,13 @@ description: "Завести новый проект — сессия вопро - **Не больше трёх вопросов за итерацию** (`AskUserQuestion`), рекомендация первым вариантом. Между итерациями применяй уже решённое. -- **Сперва вычитай ответы из брифа.** Вопрос, ответ на который в тексте уже - есть, задавать не надо — покажи своё прочтение и спроси, верно ли. +- **Сперва вычитай ответы из брифа.** Если ответ уже есть в тексте, вопрос не + задавай — покажи своё прочтение и спроси, верно ли. - **Не выдумывай четыре вещи:** периметр, что необратимо, измеренные числа и адресата дорогой проверки. Их из замысла не вывести. Не сказано — пиши «неизвестно» с пометкой, что ждёт ответа. - **Развилка замысла — человеку, механика — сама.** Имена файлов, слаги, порядок - строк не выносятся. + строк не выноси. ## Порядок работы diff --git a/av-dev-pm/skills/session/SKILL.md b/av-dev-pm/skills/session/SKILL.md index 3f22529..e642bbf 100644 --- a/av-dev-pm/skills/session/SKILL.md +++ b/av-dev-pm/skills/session/SKILL.md @@ -157,9 +157,10 @@ flowchart TD взятию и залежавшихся; при расхождении раскладки `--fix`. 2. Прочитать `SPRINT.md`: цель, состав, дата начала. 3. **Развилка, и решает её человек.** Набор всё ещё твой — продолжай спринт, ни - сессии, ни переоценки не нужно, они между спринтами. Перечитываешь, зачем эти - задачи собраны вместе, — набор протух: `sprint close --dissolve --reason …`, - недоделанное возвращается в беклог, дальше обычная сессия с шага 1. + сессии, ни переоценки не нужно, они между спринтами. Взялся перечитывать, + зачем эти задачи собраны вместе, — набор протух: + `sprint close --dissolve --reason …`, недоделанное возвращается в беклог, + дальше обычная сессия с шага 1. Порога в неделях нет намеренно — почему, в [references/sprint.md](references/sprint.md), «Протухший набор». @@ -256,8 +257,8 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со ## Слоты проекта -Сессия не знает ни языка, ни сборки, ни CI. Часть проектного отвечает -[канон](../canon/references/canon.md) структурой: разбор процесса (шаг 2) живёт +Сессия не знает ни языка, ни сборки, ни CI. На часть проектного отвечает своей +структурой [канон](../canon/references/canon.md): разбор процесса (шаг 2) живёт в `docs/review.md`, оракулы и «чем краснеет безусловно» — в семантике гейта в `CLAUDE.md`. Остальное проект **дописывает в `CLAUDE.md`**: @@ -272,8 +273,8 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со это **ориентир, а не закон**. Слота «куда копируются критерии приёмки» здесь нет намеренно: на него отвечает -**пайплайн проекта**, перенося их в описание изменения при его заведении. Проект -без пайплайна называет своё место сам, в слоте 1. +**пайплайн проекта** — он переносит критерии в описание изменения, когда его +заводит. Проект без пайплайна называет своё место сам, в слоте 1. Числа проекта (сколько задач в спринте, сколько времени на задачу, каков прирост беклога) — предмет шага 2, а не константы этого скилла. diff --git a/av-dev-pm/skills/session/references/cadence.md b/av-dev-pm/skills/session/references/cadence.md index 1329eed..e6817a5 100644 --- a/av-dev-pm/skills/session/references/cadence.md +++ b/av-dev-pm/skills/session/references/cadence.md @@ -10,7 +10,7 @@ ## Шаг 1. Разбор вопросов `tasks.py list --questions` — всё, что накопилось. Вопрос это решение человека, -и разбирается он **пачкой**, а не по одному в момент возникновения: по одному — +и разбирается он **пачкой**, а не по одному, как только возник: по одному — это дёрганье, пачкой — это сессия. Порядок по каждому вопросу: @@ -21,8 +21,8 @@ 2. **Сформулируй развилку** с вариантами и последствием каждого, рекомендация — первым вариантом. 3. **Вынеси пачкой** через `AskUserQuestion`, не больше трёх за раз. -4. **Ответ записывается в тело задачи, раздел «Вопросы» опустошается**, тег - снимается `edit --rm-tag question`, **«зачем» переписывается**: «Решено: +4. **Запиши ответ в тело задачи, опустоши раздел «Вопросы»**, сними тег + (`edit --rm-tag question`), **перепиши «зачем»**: «Решено: …» на вопрос «почему это лежит в беклоге» уже не отвечает. Опустошение раздела — не уборка, а условие взятия: правило и причина в скилле `tasks`, [references/task-format.md](../../tasks/references/task-format.md). @@ -73,10 +73,10 @@ `CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают решения, пока кто-нибудь не наткнётся. -**Пачка — весь канон, и это не расточительство, а охват.** Отбор пачки работой -оставлял без присмотра ровно то, чего работа не касалась: правка, отменившая -решение, живёт в одном документе, а парный статус нужен в другом. Канон мал, -раз в спринт он читается целиком. +**Пачка — весь канон, и это не расточительство, а охват.** Когда пачку отбирала +работа, без присмотра оставалось ровно то, чего работа не касалась: правка, +отменившая решение, живёт в одном документе, а парный статус нужен в другом. +Канон мал, раз в спринт он читается целиком. Находки обоих — обычный материал переоценки: строка на замену идёт в документ сразу, работа больше чем на абзац становится задачей типа `chore`. **Позвал — @@ -138,17 +138,17 @@ задачей, границы вместо реализации в разделе «Затрагивает». Список и правила — в скилле `tasks`. **Переоценка — то самое место, где беклог добирает тип и разделы его схемы:** требовать их на входе значило бы выгонять в заметки то, - что должно лежать задачей, а к взятию в спринт они уже обязательны. Сколько - записей готово к взятию, печатает блок здоровья `check`, — по этому числу и - видно, добрала переоценка или нет. + что должно лежать задачей, а к взятию в спринт они уже обязательны. Блок + здоровья `check` печатает, сколько записей готово к взятию, — по этому числу + и видно, добрала переоценка или нет. Затем — то, что решает пользователь: 6. **Жива ли она вообще.** Контекст мог измениться: ушла зависимость, отпал - сценарий, обошли иначе. Здесь и звучит вопрос о выкидывании. + сценарий, обошли иначе. Здесь и звучит вопрос, выкидывать ли. 7. **Та ли цель — и нужна ли она вообще.** Приоритетов нет, и «повысить» нечего - — вместо повышения **смена цели** (`edit --goal <другой>`) или - включение в ближайший набор. `feature`, которой не находится цель, — кандидат + — вместо повышения задача **меняет цель** (`edit --goal <другой>`) или + входит в ближайший набор. `feature`, которой не находится цель, — кандидат на выход: новая возможность вне цели это возможность, которой никто не заказывал. Операционной задаче (`fix`, `chore`, `research`) цель не нужна, и выдумывать её здесь не надо. diff --git a/av-dev-pm/skills/session/references/sprint.md b/av-dev-pm/skills/session/references/sprint.md index 79db003..2fae936 100644 --- a/av-dev-pm/skills/session/references/sprint.md +++ b/av-dev-pm/skills/session/references/sprint.md @@ -105,10 +105,10 @@ flowchart TD отвечает «сделано по правилам», критерии — «сделано то, что заказывали». 3. **Находки по ходу отданы списком** — исполнитель обязан их **назвать** (каждую, с пометкой «заведена / не заведена: причина»), но **не обязан - заводить**: заведение интерактивно, оно требует дедупликации против беклога и - кладбища и решений человека. Обязанность **завести урожай** — на закрытии - спринта, ниже. Так автономный исполнитель не оказывается одновременно обязан - завести задачи и не вправе это сделать в одиночку. + заводить**: заведение интерактивно — оно требует дедупликации против беклога + и кладбища, а ещё решений человека. Обязанность **завести урожай** — на + закрытии спринта, ниже. Иначе автономный исполнитель оказался бы разом и + обязан завести задачи, и не вправе сделать это в одиночку. ### Кто и когда закрывает @@ -132,8 +132,8 @@ flowchart TD **Само закрытие тоже коммитится, отдельным коммитом.** Удаление файла задачи и правка индекса — правки в рабочем дереве; пока они не в истории, `SPRINT.md` -ничего не показывает, а `reopen` восстанавливает текст из `HEAD` в узком окне, -которое закончится первым посторонним коммитом. Сообщение про учёт, а не про +ничего не показывает, а `reopen` восстанавливает текст из `HEAD` в узком окне: +его закроет первый посторонний коммит. Сообщение про учёт, а не про работу: `закрыта задача `. **Дорога назад существует и обязана быть названа.** Человек на сессии сверил @@ -151,7 +151,7 @@ flowchart TD 1. **Критерии переживают файл задачи.** Файл удаляется при закрытии, поэтому критерии копируются туда, где их увидит приёмщик. Куда именно — **отвечает пайплайн проекта, а не слот в `CLAUDE.md`**: он переносит их в `tasks.md` - изменения на шаге заведения change. Проект без пайплайна называет своё место + изменения, когда заводит change. Проект без пайплайна называет своё место сам. 2. **Принимает человек на сессии, а не отдельный агент.** Декорреляция исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его diff --git a/av-dev-pm/skills/tasks/SKILL.md b/av-dev-pm/skills/tasks/SKILL.md index c46b389..b20d4e9 100644 --- a/av-dev-pm/skills/tasks/SKILL.md +++ b/av-dev-pm/skills/tasks/SKILL.md @@ -54,9 +54,9 @@ description: Ведение задач и целей как каталога mar открыть файл, чтобы это понять. Раз порядок выводится, его проверяет машина — и приоритетом он не становится. 5. **Тип решает, что с записью можно делать.** Тип — единственная ось и первое - поле меты: от него зависят обязательные разделы тела, нужна ли цель, берётся - ли запись в спринт и в каком индексе живёт её строка. Словарь закрыт; ни один - тип не подошёл — значит, в записи их два, и её надо разделить. + поле меты: от него зависит, какие разделы обязательны в теле, нужна ли цель, + берётся ли запись в спринт и в каком индексе живёт её строка. Словарь закрыт; + ни один тип не подошёл — значит, в записи их два, и её надо разделить. ## Раскладка @@ -193,7 +193,7 @@ stateDiagram-v2 только, чтобы формулировка отвечала на «что приложение делает», а не на «какую часть кода мы трогаем». -**Что целью не является — работа, которой держат проект.** Состав перечислен +**Целью не становится работа, которой держат проект.** Состав перечислен [в каноне](../canon/references/canon.md), раздел «Сопровождение и эксплуатация»; на вопрос «что приложение будет уметь» ничто из него не отвечает. Им отведена отдельная секция роадмапа, чтобы они были видны в том же экране и при этом не читались как возможности @@ -304,7 +304,7 @@ stateDiagram-v2 видно, чего от работы ждут: «Ничья объявляется, пока клетки есть» одинаково читается и как жалоба, и как задание, — и в списке, где решают «брать или не брать», это разные вещи. `research` формы действия не несёт **намеренно**: её -исход знание, что делать — ещё неизвестно, и заголовок-действие обещал бы +исход знание, а что делать — ещё неизвестно, и заголовок-действие обещал бы решённость, которой нет. Из этого же правила растёт разница индексов: роадмап — список возможностей, @@ -394,8 +394,8 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап **Мутации правят файл и индексы заодно** — руками строку индекса или мету не пиши, зови `add`/`edit`/`move`/`close`/`sprint`. Смена заголовка, «зачем», типа, -цели и **тегов** — это `edit`: он держит H1 (вместе с эмодзи), мету и индекс в -синхроне. Снятие тега — `--rm-tag` (после ответа на вопрос снимается +цели и **тегов** — это `edit`: он держит H1 (вместе с эмодзи), мету и индекс +согласованными. Снятие тега — `--rm-tag` (после ответа на вопрос снимается `question`), смена цели — `--goal`, типа — `--type`; оба заменяют прежнее значение, а не добавляют второе. @@ -499,7 +499,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап ### Разобрать находки аудита или ревью -Ревью и аудиты — тоже источник задач, но с зеркальной диалогу опасностью: не +Ревью и аудиты — тоже источник задач, но с опасностью, зеркальной диалогу: не пять файлов из одной мысли, а сорок файлов из сорока сырых находок. Защита та же, что в самом ревью: кластеризация по причине, дедуп против живых и `REJECTED.md`, находка без свидетельства → сырьё (`research`), а не задача, и карта кластеров diff --git a/av-dev-pm/skills/tasks/references/split.md b/av-dev-pm/skills/tasks/references/split.md index ebba763..c3e7e89 100644 --- a/av-dev-pm/skills/tasks/references/split.md +++ b/av-dev-pm/skills/tasks/references/split.md @@ -92,9 +92,9 @@ Applicative-штурм («перечисли задачи, следующие и applicative. 2. **Вынеси формы пользователю** через `AskUserQuestion` с компромиссами. Рамку выбирает он: это продуктовое решение, не механика. -3. **Назови цель.** Выбранная форма служит какой-то цели — существующей или - новой. Идея, для которой цель не находится, скорее всего уезжает в - `REJECTED.md`, а не заводится задачей. +3. **Назови цель.** Выбранная форма служит цели — существующей или новой. Идея, + для которой цель не находится, скорее всего уезжает в `REJECTED.md`, а не + заводится задачей. 4. **Только выбранную форму** дроби по тесту декомпозиции выше и проставь критерии приёмки: без них наследники останутся идеями под другим именем. diff --git a/av-dev-pm/skills/tasks/references/task-chore.md b/av-dev-pm/skills/tasks/references/task-chore.md index 3ec2d15..52fd11d 100644 --- a/av-dev-pm/skills/tasks/references/task-chore.md +++ b/av-dev-pm/skills/tasks/references/task-chore.md @@ -38,7 +38,7 @@ 1. **Проверить, что поведение не меняется.** Меняется — это `feature` или `fix`, и у неё другие требования (цель, воспроизведение). 2. **Назвать, что перестанет мешать** — одной фразой, адресуясь разработчику. - «Прибраться в модуле X» ответом не является: непонятно, что изменится. + «Прибраться в модуле X» — не ответ: непонятно, что изменится. 3. **Назвать границы** в `Затрагивает`. У обслуживания они часто не в коде: конфиг и его образцы, версия зависимости, команда сборки, файл CI. Границей считается то, у чего есть внешняя сторона и цена изменения. diff --git a/av-dev-pm/skills/tasks/references/task-format.md b/av-dev-pm/skills/tasks/references/task-format.md index bf6289f..4794f8e 100644 --- a/av-dev-pm/skills/tasks/references/task-format.md +++ b/av-dev-pm/skills/tasks/references/task-format.md @@ -64,7 +64,7 @@ - **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательны **тип** и **место**, причина после тире желательна (именно она объясняет, почему задача здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и - теги опциональны. Нераспознанные поля сохраняются: скрипт правит свои и не + теги необязательны. Нераспознанные поля сохраняются: скрипт правит свои и не трогает чужие. - **Тип — первым полем.** Он решает, что у записи вообще может быть: какие разделы обязательны, нужна ли цель, берётся ли она в спринт, — и читается