язык скиллов av-dev-pm: проход упрощения пятью агентами и разбор находок

Эксперимент: по сабагенту на каждый скилл 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) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-05 14:49:03 +03:00
co-authored by Claude Opus 5
parent 2d39a77444
commit 47a2f3de63
12 changed files with 64 additions and 63 deletions
+2 -2
View File
@@ -507,8 +507,8 @@ check`). Плюс `openspec/specs/` вливает `opsx:archive`.
*Причина:* это тот же приём, что «границы покрытия» в отчёте ревью и «пустой *Причина:* это тот же приём, что «границы покрытия» в отчёте ревью и «пустой
пункт называется пустым» в каноне — и единственный, о котором в этом репозитории пункт называется пустым» в каноне — и единственный, о котором в этом репозитории
есть данные, что он работает. Умолчание «не написал» становится неотличимым от есть данные, что он работает. Отличить «не написал» от «написал, что не
«написал, что не требуется», только если отрицание обязательно. требуется» можно только тогда, когда отрицание обязательно.
**Триггер ADR, окончательная формулировка.** Запись заводится, когда верно одно **Триггер ADR, окончательная формулировка.** Запись заводится, когда верно одно
из трёх: **дорогой откат** (переделка стоит дороже переписывания одного файла); из трёх: **дорогой откат** (переделка стоит дороже переписывания одного файла);
+5 -5
View File
@@ -18,7 +18,7 @@ description: Привести проект к канону документов
которое прочитали последним. Прочитай его **до** первой правки. которое прочитали последним. Прочитай его **до** первой правки.
- [references/skeletons.md](references/skeletons.md) — **что именно класть** в - [references/skeletons.md](references/skeletons.md) — **что именно класть** в
каждый незаполненный слот. Своей формой заглушку не выдумывай: `docs.py` каждый незаполненный слот. Не выдумывай заглушку своей формы: `docs.py`
узнаёт только плейсхолдер `<!-- заполнить: … -->` из шаблонов. узнаёт только плейсхолдер `<!-- заполнить: … -->` из шаблонов.
- [references/language.md](references/language.md) — **как это написано словами**: - [references/language.md](references/language.md) — **как это написано словами**:
информационный стиль, применённый к проектным текстам, таблицы англицизмов и информационный стиль, применённый к проектным текстам, таблицы англицизмов и
@@ -88,7 +88,7 @@ capability: незаполненный канон это переходное с
ещё и читает репозиторий. Позвал `doc-code-drift` — передай ему раздел ещё и читает репозиторий. Позвал `doc-code-drift` — передай ему раздел
запретов `CLAUDE.md`. запретов `CLAUDE.md`.
3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница 3. Доклад: вывод скрипта строкой исхода, находки агентов поимённо, **граница
покрытия** — что смотрели и чего не смотрели, и **кто из двоих был позван**: покрытия** — что смотрели и чего не смотрели, и **кого из двоих позвал**:
доклад, умолчавший об этом, читается как «сверено». доклад, умолчавший об этом, читается как «сверено».
Дрейф раскладки чинится переносом; смысловые находки — это либо правка Дрейф раскладки чинится переносом; смысловые находки — это либо правка
@@ -101,7 +101,7 @@ capability: незаполненный канон это переходное с
`docs.py check` — он уже назовёт упразднённые слоты с адресом, куда каждый `docs.py check` — он уже назовёт упразднённые слоты с адресом, куда каждый
уезжает. **Но смотрит он только верхний уровень `docs/`:** упразднённое в корне уезжает. **Но смотрит он только верхний уровень `docs/`:** упразднённое в корне
репозитория (`BRIEF.md`) и во вложенных каталогах он не назовёт никогда, поэтому репозитория (`BRIEF.md`) и во вложенных каталогах он не назовёт никогда, поэтому
корневые `*.md` читаются глазами. Плюс: `CLAUDE.md`, `openspec/specs/` (список корневые `*.md` читай глазами. Плюс: `CLAUDE.md`, `openspec/specs/` (список
capability), `openspec/config.yaml`. capability), `openspec/config.yaml`.
### 2. Составь карту ### 2. Составь карту
@@ -137,8 +137,8 @@ capability), `openspec/config.yaml`.
незаполненное — одной честной информативной строкой, а не «TBD»; незаполненное — одной честной информативной строкой, а не «TBD»;
3. переносы содержимого; 3. переносы содержимого;
4. каталог задач — **вызови скилл `av-dev-pm:tasks`**, сценарий адаптации: он 4. каталог задач — **вызови скилл `av-dev-pm:tasks`**, сценарий адаптации: он
владеет форматом задач, включая переименование транслитных слагов в владеет форматом задач. Он же переименует транслитные слаги в английские и
английские вместе с починкой перекрёстных ссылок; тем же проходом починит перекрёстные ссылки;
5. починка ссылок на перенесённое во всём репозитории — `docs/`, `openspec/`, 5. починка ссылок на перенесённое во всём репозитории — `docs/`, `openspec/`,
`CLAUDE.md`, `README.md`; `CLAUDE.md`, `README.md`;
6. удаление оригиналов — **только тех, чьё содержимое найдено в новом доме**; 6. удаление оригиналов — **только тех, чьё содержимое найдено в новом доме**;
@@ -12,7 +12,7 @@
`adr/README.md` и `review.md` уезжают в репозиторий проекта и обязаны там что-то `adr/README.md` и `review.md` уезжают в репозиторий проекта и обязаны там что-то
говорить; определение при этом остаётся в [canon.md](canon.md). Отсюда говорить; определение при этом остаётся в [canon.md](canon.md). Отсюда
обязанность: **правка такого правила в каноне тянет запись в обязанность: **правка такого правила в каноне тянет запись в
[changelog.md](changelog.md)** с указанием, какой файл проекта поднимает [changelog.md](changelog.md)** — и запись называет, какой файл проекта поднимает
`upgrade`. Без этого копия в проекте останется на старой версии молча. `upgrade`. Без этого копия в проекте останется на старой версии молча.
**Каждая такая копия помечена и сверяется машиной.** Дом обрамляется **Каждая такая копия помечена и сверяется машиной.** Дом обрамляется
+7 -7
View File
@@ -21,8 +21,8 @@ description: Вести содержимое документов канона
Причина, по которой правило именно такое, измерена: у ADR был список триггеров Причина, по которой правило именно такое, измерена: у ADR был список триггеров
прозой — и он дал **6 записей на 43 изменения**. Прозаический триггер, который прозой — и он дал **6 записей на 43 изменения**. Прозаический триггер, который
некому проверить, не срабатывает. Умолчание «не написал» становится отличимым от некому проверить, не срабатывает. Отличить «не написал» от «написал, что не
«написал, что не требуется», только когда отрицание обязательно. требуется» можно только тогда, когда отрицание обязательно.
Это тот же приём, что «границы покрытия» в отчёте ревью и «пустое называется Это тот же приём, что «границы покрытия» в отчёте ревью и «пустое называется
пустым» в каноне. пустым» в каноне.
@@ -65,11 +65,11 @@ description: Вести содержимое документов канона
**Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и **Но синк его не зовёт.** Оба судьи документов — `doc-consistency` и
`doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом. `doc-code-drift` — зовутся раз в спринт, шагом сессии, на весь канон разом.
Причина в цене: агент на `opus` по каждой сделанной задаче — самая дорогая Причина в цене: агент на `opus` по каждой сделанной задаче — самая дорогая
церемония процесса, а расхождение между двумя документами по определению требует церемония процесса. К тому же расхождение между двумя документами по определению
двух документов, и на большинстве задач синк правит один. требует двух документов, а на большинстве задач синк правит один.
Что теряется: привязка находки к задаче, которая её породила. Что выигрывается, Что теряется: привязка находки к задаче, которая её породила. Что выигрывается,
кроме денег: пачка перестаёт отбираться синком, и в неё попадают документы, кроме денег: синк перестаёт отбирать пачку, и в неё попадают документы,
которых работа не касалась, — расхождение, внесённое правкой в одном месте, там которых работа не касалась, — расхождение, внесённое правкой в одном месте, там
и живёт. и живёт.
@@ -101,7 +101,7 @@ description: Вести содержимое документов канона
маркера долга и правило «гейт от них не краснеет» — в маркера долга и правило «гейт от них не краснеет» — в
[каноне](../canon/references/canon.md), раздел `architecture.md`.** [каноне](../canon/references/canon.md), раздел `architecture.md`.**
Разбирается порциями: раздел вычищается той задачей, которая его касается. Разбирается порциями: раздел вычищает та задача, которая его касается.
Содержимое не выбрасывается, а переезжает — требования в дельта-спеку change, Содержимое не выбрасывается, а переезжает — требования в дельта-спеку change,
обоснование в ADR, обзор остаётся строкой со ссылкой на capability. обоснование в ADR, обзор остаётся строкой со ссылкой на capability.
@@ -128,7 +128,7 @@ description: Вести содержимое документов канона
Твоя часть на синке: **дефект пишется сразу**, а не «потом, когда починим». Твоя часть на синке: **дефект пишется сразу**, а не «потом, когда починим».
Со временем теряется не факт, а причина непоймания — единственное, ради чего Со временем теряется не факт, а причина непоймания — единственное, ради чего
журнал есть. И решение о сужении проверок (перестали звать проход, понизили журнал есть. И решение сузить проверки (перестали звать проход, понизили
профиль) обязано попасть в раздел настройки, а не остаться в отчёте ревью. профиль) обязано попасть в раздел настройки, а не остаться в отчёте ревью.
## Промоут в конвенции ## Промоут в конвенции
+8 -8
View File
@@ -8,16 +8,16 @@ description: "Завести новый проект — сессия вопро
Вход — свободный текст «что мне нужно и почему». Выход — канон документов, с Вход — свободный текст «что мне нужно и почему». Выход — канон документов, с
которого дальше работают все остальные скиллы. которого дальше работают все остальные скиллы.
**Определение канона — [канон](../canon/references/canon.md).** Читается до **Определение канона — [канон](../canon/references/canon.md).** Прочитай его до
первого вопроса: интервью идёт по слотам канона, а не по вкусу. Что класть в первого вопроса: интервью идёт по слотам канона, а не по вкусу. Что класть в
каждый файл — [скелеты](../canon/references/skeletons.md); своей формы заглушки каждый файл — [скелеты](../canon/references/skeletons.md); не выдумывай заглушки
не выдумывай, `docs.py` узнаёт только плейсхолдер оттуда. своей формы, `docs.py` узнаёт только плейсхолдер оттуда.
## Что `init` физически не может произвести ## Что `init` физически не может произвести
В новом репозитории **нет кода**, а `architecture.md`, `database.md`, В новом репозитории **нет кода**, а `architecture.md`, `database.md`,
`conventions/` и `research/` выводятся из него. Их сочинение на старте — это `conventions/` и `research/` выводятся из него. Сочинить их на старте — значит
проектирование вперёд реальности, и оно протухнет раньше первой задачи. проектировать вперёд реальности, и написанное протухнет раньше первой задачи.
Поэтому `init` заполняет то, что человек знает **до первой строки кода**: Поэтому `init` заполняет то, что человек знает **до первой строки кода**:
@@ -56,13 +56,13 @@ description: "Завести новый проект — сессия вопро
- **Не больше трёх вопросов за итерацию** (`AskUserQuestion`), рекомендация - **Не больше трёх вопросов за итерацию** (`AskUserQuestion`), рекомендация
первым вариантом. Между итерациями применяй уже решённое. первым вариантом. Между итерациями применяй уже решённое.
- **Сперва вычитай ответы из брифа.** Вопрос, ответ на который в тексте уже - **Сперва вычитай ответы из брифа.** Если ответ уже есть в тексте, вопрос не
есть, задавать не надо — покажи своё прочтение и спроси, верно ли. задавай — покажи своё прочтение и спроси, верно ли.
- **Не выдумывай четыре вещи:** периметр, что необратимо, измеренные числа и - **Не выдумывай четыре вещи:** периметр, что необратимо, измеренные числа и
адресата дорогой проверки. Их из замысла не вывести. Не сказано — пиши адресата дорогой проверки. Их из замысла не вывести. Не сказано — пиши
«неизвестно» с пометкой, что ждёт ответа. «неизвестно» с пометкой, что ждёт ответа.
- **Развилка замысла — человеку, механика — сама.** Имена файлов, слаги, порядок - **Развилка замысла — человеку, механика — сама.** Имена файлов, слаги, порядок
строк не выносятся. строк не выноси.
## Порядок работы ## Порядок работы
+8 -7
View File
@@ -157,9 +157,10 @@ flowchart TD
взятию и залежавшихся; при расхождении раскладки `--fix`. взятию и залежавшихся; при расхождении раскладки `--fix`.
2. Прочитать `SPRINT.md`: цель, состав, дата начала. 2. Прочитать `SPRINT.md`: цель, состав, дата начала.
3. **Развилка, и решает её человек.** Набор всё ещё твой — продолжай спринт, ни 3. **Развилка, и решает её человек.** Набор всё ещё твой — продолжай спринт, ни
сессии, ни переоценки не нужно, они между спринтами. Перечитываешь, зачем эти сессии, ни переоценки не нужно, они между спринтами. Взялся перечитывать,
задачи собраны вместе, — набор протух: `sprint close --dissolve --reason …`, зачем эти задачи собраны вместе, — набор протух:
недоделанное возвращается в беклог, дальше обычная сессия с шага 1. `sprint close --dissolve --reason …`, недоделанное возвращается в беклог,
дальше обычная сессия с шага 1.
Порога в неделях нет намеренно — почему, в Порога в неделях нет намеренно — почему, в
[references/sprint.md](references/sprint.md), «Протухший набор». [references/sprint.md](references/sprint.md), «Протухший набор».
@@ -256,8 +257,8 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со
## Слоты проекта ## Слоты проекта
Сессия не знает ни языка, ни сборки, ни CI. Часть проектного отвечает Сессия не знает ни языка, ни сборки, ни CI. На часть проектного отвечает своей
[канон](../canon/references/canon.md) структурой: разбор процесса (шаг 2) живёт структурой [канон](../canon/references/canon.md): разбор процесса (шаг 2) живёт
в `docs/review.md`, оракулы и «чем краснеет безусловно» — в семантике гейта в в `docs/review.md`, оракулы и «чем краснеет безусловно» — в семантике гейта в
`CLAUDE.md`. Остальное проект **дописывает в `CLAUDE.md`**: `CLAUDE.md`. Остальное проект **дописывает в `CLAUDE.md`**:
@@ -272,8 +273,8 @@ python3 $tk reopen <слаг> --dir D --reason … # приёмка не со
это **ориентир, а не закон**. это **ориентир, а не закон**.
Слота «куда копируются критерии приёмки» здесь нет намеренно: на него отвечает Слота «куда копируются критерии приёмки» здесь нет намеренно: на него отвечает
**пайплайн проекта**, перенося их в описание изменения при его заведении. Проект **пайплайн проекта** — он переносит критерии в описание изменения, когда его
без пайплайна называет своё место сам, в слоте 1. заводит. Проект без пайплайна называет своё место сам, в слоте 1.
Числа проекта (сколько задач в спринте, сколько времени на задачу, каков прирост Числа проекта (сколько задач в спринте, сколько времени на задачу, каков прирост
беклога) — предмет шага 2, а не константы этого скилла. беклога) — предмет шага 2, а не константы этого скилла.
+13 -13
View File
@@ -10,7 +10,7 @@
## Шаг 1. Разбор вопросов ## Шаг 1. Разбор вопросов
`tasks.py list --questions` — всё, что накопилось. Вопрос это решение человека, `tasks.py list --questions` — всё, что накопилось. Вопрос это решение человека,
и разбирается он **пачкой**, а не по одному в момент возникновения: по одному — и разбирается он **пачкой**, а не по одному, как только возник: по одному —
это дёрганье, пачкой — это сессия. это дёрганье, пачкой — это сессия.
Порядок по каждому вопросу: Порядок по каждому вопросу:
@@ -21,8 +21,8 @@
2. **Сформулируй развилку** с вариантами и последствием каждого, рекомендация — 2. **Сформулируй развилку** с вариантами и последствием каждого, рекомендация —
первым вариантом. первым вариантом.
3. **Вынеси пачкой** через `AskUserQuestion`, не больше трёх за раз. 3. **Вынеси пачкой** через `AskUserQuestion`, не больше трёх за раз.
4. **Ответ записывается в тело задачи, раздел «Вопросы» опустошается**, тег 4. **Запиши ответ в тело задачи, опустоши раздел «Вопросы»**, сними тег
снимается `edit <slug> --rm-tag question`, **«зачем» переписывается**: «Решено: (`edit <slug> --rm-tag question`), **перепиши «зачем»**: «Решено:
…» на вопрос «почему это лежит в беклоге» уже не отвечает. Опустошение …» на вопрос «почему это лежит в беклоге» уже не отвечает. Опустошение
раздела — не уборка, а условие взятия: правило и причина в скилле `tasks`, раздела — не уборка, а условие взятия: правило и причина в скилле `tasks`,
[references/task-format.md](../../tasks/references/task-format.md). [references/task-format.md](../../tasks/references/task-format.md).
@@ -73,10 +73,10 @@
`CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают `CLAUDE.md`. Протухшее и раздвоившееся неотличимо от свежего, и по нему принимают
решения, пока кто-нибудь не наткнётся. решения, пока кто-нибудь не наткнётся.
**Пачка — весь канон, и это не расточительство, а охват.** Отбор пачки работой **Пачка — весь канон, и это не расточительство, а охват.** Когда пачку отбирала
оставлял без присмотра ровно то, чего работа не касалась: правка, отменившая работа, без присмотра оставалось ровно то, чего работа не касалась: правка,
решение, живёт в одном документе, а парный статус нужен в другом. Канон мал, отменившая решение, живёт в одном документе, а парный статус нужен в другом.
раз в спринт он читается целиком. Канон мал, раз в спринт он читается целиком.
Находки обоих — обычный материал переоценки: строка на замену идёт в документ Находки обоих — обычный материал переоценки: строка на замену идёт в документ
сразу, работа больше чем на абзац становится задачей типа `chore`. **Позвал — сразу, работа больше чем на абзац становится задачей типа `chore`. **Позвал —
@@ -138,17 +138,17 @@
задачей, границы вместо реализации в разделе «Затрагивает». Список и правила — задачей, границы вместо реализации в разделе «Затрагивает». Список и правила —
в скилле `tasks`. **Переоценка — то самое место, где беклог добирает тип и в скилле `tasks`. **Переоценка — то самое место, где беклог добирает тип и
разделы его схемы:** требовать их на входе значило бы выгонять в заметки то, разделы его схемы:** требовать их на входе значило бы выгонять в заметки то,
что должно лежать задачей, а к взятию в спринт они уже обязательны. Сколько что должно лежать задачей, а к взятию в спринт они уже обязательны. Блок
записей готово к взятию, печатает блок здоровья `check`, — по этому числу и здоровья `check` печатает, сколько записей готово к взятию, — по этому числу
видно, добрала переоценка или нет. и видно, добрала переоценка или нет.
Затем — то, что решает пользователь: Затем — то, что решает пользователь:
6. **Жива ли она вообще.** Контекст мог измениться: ушла зависимость, отпал 6. **Жива ли она вообще.** Контекст мог измениться: ушла зависимость, отпал
сценарий, обошли иначе. Здесь и звучит вопрос о выкидывании. сценарий, обошли иначе. Здесь и звучит вопрос, выкидывать ли.
7. **Та ли цель — и нужна ли она вообще.** Приоритетов нет, и «повысить» нечего 7. **Та ли цель — и нужна ли она вообще.** Приоритетов нет, и «повысить» нечего
— вместо повышения **смена цели** (`edit <slug> --goal <другой>`) или — вместо повышения задача **меняет цель** (`edit <slug> --goal <другой>`) или
включение в ближайший набор. `feature`, которой не находится цель, — кандидат входит в ближайший набор. `feature`, которой не находится цель, — кандидат
на выход: новая возможность вне цели это возможность, которой никто не на выход: новая возможность вне цели это возможность, которой никто не
заказывал. Операционной задаче (`fix`, `chore`, `research`) цель не нужна, и заказывал. Операционной задаче (`fix`, `chore`, `research`) цель не нужна, и
выдумывать её здесь не надо. выдумывать её здесь не надо.
@@ -105,10 +105,10 @@ flowchart TD
отвечает «сделано по правилам», критерии — «сделано то, что заказывали». отвечает «сделано по правилам», критерии — «сделано то, что заказывали».
3. **Находки по ходу отданы списком** — исполнитель обязан их **назвать** 3. **Находки по ходу отданы списком** — исполнитель обязан их **назвать**
(каждую, с пометкой «заведена / не заведена: причина»), но **не обязан (каждую, с пометкой «заведена / не заведена: причина»), но **не обязан
заводить**: заведение интерактивно, оно требует дедупликации против беклога и заводить**: заведение интерактивно оно требует дедупликации против беклога
кладбища и решений человека. Обязанность **завести урожай** — на закрытии и кладбища, а ещё решений человека. Обязанность **завести урожай** — на
спринта, ниже. Так автономный исполнитель не оказывается одновременно обязан закрытии спринта, ниже. Иначе автономный исполнитель оказался бы разом и
завести задачи и не вправе это сделать в одиночку. обязан завести задачи, и не вправе сделать это в одиночку.
### Кто и когда закрывает ### Кто и когда закрывает
@@ -132,8 +132,8 @@ flowchart TD
**Само закрытие тоже коммитится, отдельным коммитом.** Удаление файла задачи и **Само закрытие тоже коммитится, отдельным коммитом.** Удаление файла задачи и
правка индекса — правки в рабочем дереве; пока они не в истории, `SPRINT.md` правка индекса — правки в рабочем дереве; пока они не в истории, `SPRINT.md`
ничего не показывает, а `reopen` восстанавливает текст из `HEAD` в узком окне, ничего не показывает, а `reopen` восстанавливает текст из `HEAD` в узком окне:
которое закончится первым посторонним коммитом. Сообщение про учёт, а не про его закроет первый посторонний коммит. Сообщение про учёт, а не про
работу: `закрыта задача <slug>`. работу: `закрыта задача <slug>`.
**Дорога назад существует и обязана быть названа.** Человек на сессии сверил **Дорога назад существует и обязана быть названа.** Человек на сессии сверил
@@ -151,7 +151,7 @@ flowchart TD
1. **Критерии переживают файл задачи.** Файл удаляется при закрытии, поэтому 1. **Критерии переживают файл задачи.** Файл удаляется при закрытии, поэтому
критерии копируются туда, где их увидит приёмщик. Куда именно — **отвечает критерии копируются туда, где их увидит приёмщик. Куда именно — **отвечает
пайплайн проекта, а не слот в `CLAUDE.md`**: он переносит их в `tasks.md` пайплайн проекта, а не слот в `CLAUDE.md`**: он переносит их в `tasks.md`
изменения на шаге заведения change. Проект без пайплайна называет своё место изменения, когда заводит change. Проект без пайплайна называет своё место
сам. сам.
2. **Принимает человек на сессии, а не отдельный агент.** Декорреляция 2. **Принимает человек на сессии, а не отдельный агент.** Декорреляция
исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его
+8 -8
View File
@@ -54,9 +54,9 @@ description: Ведение задач и целей как каталога mar
открыть файл, чтобы это понять. Раз порядок выводится, его проверяет машина — открыть файл, чтобы это понять. Раз порядок выводится, его проверяет машина —
и приоритетом он не становится. и приоритетом он не становится.
5. **Тип решает, что с записью можно делать.** Тип — единственная ось и первое 5. **Тип решает, что с записью можно делать.** Тип — единственная ось и первое
поле меты: от него зависят обязательные разделы тела, нужна ли цель, берётся поле меты: от него зависит, какие разделы обязательны в теле, нужна ли цель,
ли запись в спринт и в каком индексе живёт её строка. Словарь закрыт; ни один берётся ли запись в спринт и в каком индексе живёт её строка. Словарь закрыт;
тип не подошёл — значит, в записи их два, и её надо разделить. ни один тип не подошёл — значит, в записи их два, и её надо разделить.
## Раскладка ## Раскладка
@@ -193,7 +193,7 @@ stateDiagram-v2
только, чтобы формулировка отвечала на «что приложение делает», а не на «какую только, чтобы формулировка отвечала на «что приложение делает», а не на «какую
часть кода мы трогаем». часть кода мы трогаем».
**Что целью не является работа, которой держат проект.** Состав перечислен **Целью не становится работа, которой держат проект.** Состав перечислен
[в каноне](../canon/references/canon.md), раздел «Сопровождение и эксплуатация»; [в каноне](../canon/references/canon.md), раздел «Сопровождение и эксплуатация»;
на вопрос «что приложение будет уметь» ничто из него не отвечает. Им отведена отдельная секция роадмапа, на вопрос «что приложение будет уметь» ничто из него не отвечает. Им отведена отдельная секция роадмапа,
чтобы они были видны в том же экране и при этом не читались как возможности чтобы они были видны в том же экране и при этом не читались как возможности
@@ -304,7 +304,7 @@ stateDiagram-v2
видно, чего от работы ждут: «Ничья объявляется, пока клетки есть» одинаково видно, чего от работы ждут: «Ничья объявляется, пока клетки есть» одинаково
читается и как жалоба, и как задание, — и в списке, где решают «брать или не читается и как жалоба, и как задание, — и в списке, где решают «брать или не
брать», это разные вещи. `research` формы действия не несёт **намеренно**: её брать», это разные вещи. `research` формы действия не несёт **намеренно**: её
исход знание, что делать — ещё неизвестно, и заголовок-действие обещал бы исход знание, а что делать — ещё неизвестно, и заголовок-действие обещал бы
решённость, которой нет. решённость, которой нет.
Из этого же правила растёт разница индексов: роадмап — список возможностей, Из этого же правила растёт разница индексов: роадмап — список возможностей,
@@ -394,8 +394,8 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
**Мутации правят файл и индексы заодно** — руками строку индекса или мету **Мутации правят файл и индексы заодно** — руками строку индекса или мету
не пиши, зови `add`/`edit`/`move`/`close`/`sprint`. Смена заголовка, «зачем», типа, не пиши, зови `add`/`edit`/`move`/`close`/`sprint`. Смена заголовка, «зачем», типа,
цели и **тегов** — это `edit`: он держит H1 (вместе с эмодзи), мету и индекс в цели и **тегов** — это `edit`: он держит H1 (вместе с эмодзи), мету и индекс
синхроне. Снятие тега — `--rm-tag` (после ответа на вопрос снимается согласованными. Снятие тега — `--rm-tag` (после ответа на вопрос снимается
`question`), смена цели — `--goal`, типа — `--type`; оба заменяют прежнее `question`), смена цели — `--goal`, типа — `--type`; оба заменяют прежнее
значение, а не добавляют второе. значение, а не добавляют второе.
@@ -499,7 +499,7 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
### Разобрать находки аудита или ревью ### Разобрать находки аудита или ревью
Ревью и аудиты — тоже источник задач, но с зеркальной диалогу опасностью: не Ревью и аудиты — тоже источник задач, но с опасностью, зеркальной диалогу: не
пять файлов из одной мысли, а сорок файлов из сорока сырых находок. Защита та пять файлов из одной мысли, а сорок файлов из сорока сырых находок. Защита та
же, что в самом ревью: кластеризация по причине, дедуп против живых и же, что в самом ревью: кластеризация по причине, дедуп против живых и
`REJECTED.md`, находка без свидетельства → сырьё (`research`), а не задача, и карта кластеров `REJECTED.md`, находка без свидетельства → сырьё (`research`), а не задача, и карта кластеров
+3 -3
View File
@@ -92,9 +92,9 @@ Applicative-штурм («перечисли задачи, следующие и
applicative. applicative.
2. **Вынеси формы пользователю** через `AskUserQuestion` с компромиссами. Рамку 2. **Вынеси формы пользователю** через `AskUserQuestion` с компромиссами. Рамку
выбирает он: это продуктовое решение, не механика. выбирает он: это продуктовое решение, не механика.
3. **Назови цель.** Выбранная форма служит какой-то цели — существующей или 3. **Назови цель.** Выбранная форма служит цели — существующей или новой. Идея,
новой. Идея, для которой цель не находится, скорее всего уезжает в для которой цель не находится, скорее всего уезжает в `REJECTED.md`, а не
`REJECTED.md`, а не заводится задачей. заводится задачей.
4. **Только выбранную форму** дроби по тесту декомпозиции выше и проставь 4. **Только выбранную форму** дроби по тесту декомпозиции выше и проставь
критерии приёмки: без них наследники останутся идеями под другим именем. критерии приёмки: без них наследники останутся идеями под другим именем.
@@ -38,7 +38,7 @@
1. **Проверить, что поведение не меняется.** Меняется — это `feature` или `fix`, 1. **Проверить, что поведение не меняется.** Меняется — это `feature` или `fix`,
и у неё другие требования (цель, воспроизведение). и у неё другие требования (цель, воспроизведение).
2. **Назвать, что перестанет мешать** — одной фразой, адресуясь разработчику. 2. **Назвать, что перестанет мешать** — одной фразой, адресуясь разработчику.
«Прибраться в модуле X» ответом не является: непонятно, что изменится. «Прибраться в модуле X» — не ответ: непонятно, что изменится.
3. **Назвать границы** в `Затрагивает`. У обслуживания они часто не в коде: 3. **Назвать границы** в `Затрагивает`. У обслуживания они часто не в коде:
конфиг и его образцы, версия зависимости, команда сборки, файл CI. Границей конфиг и его образцы, версия зависимости, команда сборки, файл CI. Границей
считается то, у чего есть внешняя сторона и цена изменения. считается то, у чего есть внешняя сторона и цена изменения.
@@ -64,7 +64,7 @@
- **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательны - **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательны
**тип** и **место**, причина после тире желательна (именно она объясняет, **тип** и **место**, причина после тире желательна (именно она объясняет,
почему задача здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и почему задача здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и
теги опциональны. Нераспознанные поля сохраняются: скрипт правит свои и не теги необязательны. Нераспознанные поля сохраняются: скрипт правит свои и не
трогает чужие. трогает чужие.
- **Тип — первым полем.** Он решает, что у записи вообще может быть: какие - **Тип — первым полем.** Он решает, что у записи вообще может быть: какие
разделы обязательны, нужна ли цель, берётся ли она в спринт, — и читается разделы обязательны, нужна ли цель, берётся ли она в спринт, — и читается