язык скиллов 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:
+2
-2
@@ -507,8 +507,8 @@ check`). Плюс `openspec/specs/` вливает `opsx:archive`.
|
|||||||
|
|
||||||
*Причина:* это тот же приём, что «границы покрытия» в отчёте ревью и «пустой
|
*Причина:* это тот же приём, что «границы покрытия» в отчёте ревью и «пустой
|
||||||
пункт называется пустым» в каноне — и единственный, о котором в этом репозитории
|
пункт называется пустым» в каноне — и единственный, о котором в этом репозитории
|
||||||
есть данные, что он работает. Умолчание «не написал» становится неотличимым от
|
есть данные, что он работает. Отличить «не написал» от «написал, что не
|
||||||
«написал, что не требуется», только если отрицание обязательно.
|
требуется» можно только тогда, когда отрицание обязательно.
|
||||||
|
|
||||||
**Триггер ADR, окончательная формулировка.** Запись заводится, когда верно одно
|
**Триггер ADR, окончательная формулировка.** Запись заводится, когда верно одно
|
||||||
из трёх: **дорогой откат** (переделка стоит дороже переписывания одного файла);
|
из трёх: **дорогой откат** (переделка стоит дороже переписывания одного файла);
|
||||||
|
|||||||
@@ -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`. Без этого копия в проекте останется на старой версии молча.
|
||||||
|
|
||||||
**Каждая такая копия помечена и сверяется машиной.** Дом обрамляется
|
**Каждая такая копия помечена и сверяется машиной.** Дом обрамляется
|
||||||
|
|||||||
@@ -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,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`), рекомендация
|
||||||
первым вариантом. Между итерациями применяй уже решённое.
|
первым вариантом. Между итерациями применяй уже решённое.
|
||||||
- **Сперва вычитай ответы из брифа.** Вопрос, ответ на который в тексте уже
|
- **Сперва вычитай ответы из брифа.** Если ответ уже есть в тексте, вопрос не
|
||||||
есть, задавать не надо — покажи своё прочтение и спроси, верно ли.
|
задавай — покажи своё прочтение и спроси, верно ли.
|
||||||
- **Не выдумывай четыре вещи:** периметр, что необратимо, измеренные числа и
|
- **Не выдумывай четыре вещи:** периметр, что необратимо, измеренные числа и
|
||||||
адресата дорогой проверки. Их из замысла не вывести. Не сказано — пиши
|
адресата дорогой проверки. Их из замысла не вывести. Не сказано — пиши
|
||||||
«неизвестно» с пометкой, что ждёт ответа.
|
«неизвестно» с пометкой, что ждёт ответа.
|
||||||
- **Развилка замысла — человеку, механика — сама.** Имена файлов, слаги, порядок
|
- **Развилка замысла — человеку, механика — сама.** Имена файлов, слаги, порядок
|
||||||
строк не выносятся.
|
строк не выноси.
|
||||||
|
|
||||||
## Порядок работы
|
## Порядок работы
|
||||||
|
|
||||||
|
|||||||
@@ -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, а не константы этого скилла.
|
||||||
|
|||||||
@@ -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. **Принимает человек на сессии, а не отдельный агент.** Декорреляция
|
||||||
исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его
|
исполнителя и приёмщика в момент закрытия **снята** (решение о снятии и его
|
||||||
|
|||||||
@@ -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`), а не задача, и карта кластеров
|
||||||
|
|||||||
@@ -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 @@
|
|||||||
- **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательны
|
- **Мета-блок** — список сразу после заголовка, **поле на строку**. Обязательны
|
||||||
**тип** и **место**, причина после тире желательна (именно она объясняет,
|
**тип** и **место**, причина после тире желательна (именно она объясняет,
|
||||||
почему задача здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и
|
почему задача здесь оказалась — в том числе «вышла из спринта: …»), «зачем» и
|
||||||
теги опциональны. Нераспознанные поля сохраняются: скрипт правит свои и не
|
теги необязательны. Нераспознанные поля сохраняются: скрипт правит свои и не
|
||||||
трогает чужие.
|
трогает чужие.
|
||||||
- **Тип — первым полем.** Он решает, что у записи вообще может быть: какие
|
- **Тип — первым полем.** Он решает, что у записи вообще может быть: какие
|
||||||
разделы обязательны, нужна ли цель, берётся ли она в спринт, — и читается
|
разделы обязательны, нужна ли цель, берётся ли она в спринт, — и читается
|
||||||
|
|||||||
Reference in New Issue
Block a user