Осей было две — тип записи (goal/idea/task) и род работы (kind:<род> тегом), — и ортогональность у них была фальшивой: из двенадцати клеток произведения законны шесть. У цели род запрещён, у задачи обязателен, у идеи пуст и на практике не ставится. Плюс «алгоритм работы над записью такого типа» крепится не к task, а к fix и research, то есть к роду: ось, к которой пишется алгоритм, и была настоящим типом. Схлопнуто в одну ось из пяти значений: goal | feature | fix | chore | research. Тип idea упразднён отдельно и по другой причине: он значил не род работы, а незаполненность, а состояние типом быть не может — оно меняется по мере того, как запись дописывают, а тип меняют командой. Теперь состояние выводится из заполненности: research без раздела «Вопрос» это сырьё. В спринт не берётся, как и прежняя идея, лежит в конце категории, отбирается list --raw. Дом типа — поле меты «Тип» первой строкой, эмодзи в H1 производна. Прежнее «отдельного поля типа нет: два места для одного факта разъезжаются» отменено собственным аргументом: он был против префикса плюс поля, а при переносе дома место остаётся одно. Эмодзи стоит в H1, а не в строке индекса, чтобы инвариант «заголовок в индексе дословно» остался нетронутым. Поле места названо по типу: «Секция» у цели (часть роадмапа, состояние очереди), «Категория» у задачи (полка домена, куда её вернёт sprint drop). Одинаковое переименование закрепило бы конфляцию; какое поле обязательно, решает тип — то самое, ради чего затевалась правка. Два новых обязательных раздела выросли из правил, которые были записаны и которые нечем было проверить. «Не воспроизводится — это research, а не fix» стояло в каноне: теперь есть раздел «Воспроизведение». Приёмка разведки — «записанный ответ, а не изменённый код» — тоже стояла, но sprint take требовал от research два-пять критериев с оракулами, и они писались ради проверки; вместо них «Вопрос» и «Куда ляжет ответ». Сортировка «по важности» из заметок не взята: она требует, чтобы кто-то важность поддерживал, а это приоритет, от которого отказалось правило 4. Взято только «сырьё в конец категории» — этот порядок выводится из типа и заполненности, а не назначается человеком, и потому проверяется машиной. TYPE_SCHEMA кормит и body_template, и schema_verdict: иначе add кладёт то, на чём sprint take потом откажет. check --fix мигрирует за один проход — kind:/[goal]/[idea] в поле «Тип», эмодзи в заголовок, «Секция» → «Категория», сырьё в конец. Тип, которого неоткуда взять, не угадывается: feature от chore машина не отличает, такие записи уходят в НЕОДНОЗНАЧНО поимённо. Попутно закрыт класс отказов в --fix: шагов, правящих мету, стало пять, и второй, перечитавший файл с диска, стирал правку первого. Общий stage() поверх отложенных правок; до этого корректность держалась на том, что шагов было мало. Устав на тип отдельным файлом — references/task-<тип>.md, пять штук: схема, алгоритм, что видит машина и что человек. Агент task-form получил правило «тип сходится с тем, что в записи написано» с проверяемыми расхождениями. Обкатано на демо-наборе из 13 записей: миграция за один проход, второй прогон даёт ноль починок; fix без «Воспроизведения» и сырьё в спринт не идут, годная feature берётся. DECISIONS тема 27 (ААББ–ЛЛММ, следствия 101–104). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
15 KiB
15 KiB
Работы по итогам разбора
Порядок и обоснование — DECISIONS.md, тема 8. Номера в скобках — следствия оттуда.
Замер (шаг 3) — единственный шаг, который нельзя переставить: он блокирует переезд jellybit. Всё остальное можно тасовать.
0. Предусловие
git push—092d07c..88c5d97, 17 коммитов ушли на origin (37)claude plugin marketplace update av-dev-skills— клон встал на88c5d97и видитav-dev-pmиav-dev-pipeline
1. Репозиторий плагинов
1.1 Переименование
av-dev-tasks→av-dev-pm: каталог,plugin.json,marketplace.json(18)- пространство имён во всех текстах:
av-dev-tasks:session→av-dev-pm:session, включая ссылку изtask-pipeline(18)
1.2 Канон — единственный дом определения
av-dev-pm/skills/canon/references/canon.md— раскладка, роли документов, правило единственного дома. Читаютinit,canon,docs(AA)av-dev-pm/skills/canon/references/changelog.md— журнал версий канона, версия 1 (26)
1.3 Правки существующих скиллов
tasks: убрать слот 6 «Команда учёта задач» (33)tasks: путь каталога жёсткийdocs/tasks, убрать цепочку разрешения (F)tasks:.tasks.json→docs/.pm.json, там же версия канона и путь миграций (23, 30)tasks: убрать слоты 3 «куда переезжает суть» и 5 «оракулы» — отвечает канон и семантика гейта (тема 4)session: убрать слот 7 и слот 4 «где живёт разбор процесса» (33, K)session: переписать «Стимулы, которые процесс создаёт» — снятая граница выбила опору у трёх защит (19)
1.4 Новые скиллы
init— интервью по брифу → канон нового проекта (R)canon—check/adopt/upgrade; поглощает скиллadopt(R, 21, 24)docs— содержимое канона: ADR из архивногоdesign.md, промоут конвенций, запись вresearch/иreview.md, чисткаarchitecture.md(X)docs.py— раскладка, лишние файлы, битые ссылки, версия, плейсхолдеры, маркеры долга; сверки миграции ↔database.mdи capability ↔architecture.md(T, 31)
1.5 av-dev-pipeline
- удалить скилл
project-briefиreferences/{project-brief,brief-template}.md(13) - снять ветки деградации OpenSpec в трёх местах:
task-pipeline,review-pipeline,task-batch(1) - девять charter'ов: разделы брифа → пути канона;
ops/adversary/reimplобязаны сшиватьresearch/иdatabase.md(14, 15) review-pipeline: убрать бриф, поразрядная деградация по документам (16)task-pipelineшаг 9 → построчный доклад по документам канона (28)task-pipeline/task-batch: закрытие задачи вызовом скиллаav-dev-pm:tasks, слот убрать (32, 33)promote.mdшаг 3: перечень механизированного →conventions/README.md(29)- описание плагина: «требует OpenSpec» (2)
1.6 Прочее
av-dev-backlog— пометить устаревшим, переписать описание, чтобы не ловило триггер (Q)README.mdмаркетплейса — три плагина, канон, установкаHISTORY.md— сжатьAGENTIC-TASKS.mdдо истории решений (CC)REMAINING.mdпересобрать: пункт 2 отменён, четыре вопроса закрыты, калибровка стала обязательной (38)
1.7 Линтеры скриптов (тема 9)
pyproject.toml: ruff + pyrefly черезuv, версии прибиты (DD, FF)- запрет внешних зависимостей двумя способами:
banned-api+ пустое окружение pyrefly (EE) RUF001–RUF003выключены,av-dev-backlogисключён (GG, HH)- починены 27 находок ruff и 14 pyrefly;
osизtasks.pyушёл (40, 41) - раздел «Проверка скриптов» в
README.md
1.8 Ревью двумя проходами (тема 10)
reopenберёт текст изHEAD, когда коммита удаления ещё нет (JJ)- шаг 11 коммитит учёт вторым коммитом; батч проверяет чистоту дерева (JJ)
- фиктивный ключ
tasks.sectionsубран из четырёх документов (KK) initпишет конфиг вdocs/.pm.json;looks_like_tasksего читает- урожай спринта заводится до
sprint close, слаг — из его отчёта - ответ на вопрос опустошает раздел «Вопросы» — во всех трёх местах
- путь отчёта триажа переживает архивацию (5 мест)
review-specsполучил режим 3 — стык после слияния- остальные 12 находок:
sprint.md, «9а», перечень проектных копий, параллельность в батче, триаж в финальной сверке, триггеры профиля, 8–12
1.9 Ревью зависимостей между плагинами (тема 11)
- опоры приёмки названы абстрактно, деградация без конвейера объявлена (MM)
- ветка деградации шага 9 ходит в свой
project-facts.md(NN) docsдаёт ветку «конвейера нет» для журнала и промоута- форма журнала дефектов сведена к дому, копия помечена в
changelog.md specsвернулся в читателиdocs/research/; дом списка назначен- пайплайн не называет
items/иSPRINT.md— их знаетav-dev-pm - манифесты объявили
av-dev-pmопциональным для конвейера (49)
1.10 Механическая проверка копий (тема 12)
scripts/copies.py: маркеры дома и копии, побайтовая сверка (OO)- строгий id, повторяемый в закрывающем маркере (PP)
- помечены два контракта; «когда заводить ADR» сведён к дословному (50)
- раздел «Проверка копий правил» в
README.md, правило — в обоих домах
2. healthlog — первая боевая проверка
canon adopt;docs/backlog/→docs/tasks/architecture.md1662 строки → обзор, остаток маркерами (W)- после выноса поведения — замерить остаток
architecture.mdи решить по каталожной форме: жмёт → следующая версия канона дляarchitecture.mdиreview.md, точка входаREADME.md(тема 16, GGG, 65; версию 3 занял роадмап с родом работы, тема 17, 68; версию 4 — секцияСопровождениеи порядок секций, тема 26) - завести
security.mdс периметром первой строкой (J) review-journal.md→review.md+ настройка конвейера (K, L)conventions.md→conventions/,local-research.md→research/(G)plan.md→docs/tasks/ROADMAP.md(E)- завести
docs/adr/ CLAUDE.md: severity инвариантов, семантика гейта, убрать раздел «Процесс» (M, N)docs.py checkвtask gate(V)- почистить
openspec/config.yaml(C) - удалить проектные копии:
.claude/skills/healthlog-{task,review}-pipelineи девять.claude/agents/healthlog-review-*.md— они прошлого поколения и после переезда указывают наdocs/conventions.md,docs/local-research.md,docs/review-journal.md, которых уже не будет
3. Калибровка — блокирует шаг 5
- замер на четырёх находках healthlog: скелет из
null, откат бинаря, канонизация в транзакции,-1 >= -1(1 из REMAINING, 14)
4. Обкатка
- один-два спринта healthlog на новом процессе
5. jellybit
BRIEF.md→docs/passport.md, обновитьdocs/specs/{recognition,review-ux,workflow}.md— сверить с capability и удалить как дубли (10)docs/specs/architecture.md→docs/architecture.md,database.md→docs/database.md,jellyfin-layout.md→docs/research/docs/review/journal.md→docs/review.mddrafts/растворить: roadmap →ROADMAP.md, conventions-backlog → задачи[idea], logical-title-model → ADR (H)docs/backlog/→docs/tasks/- удалить проектные копии скиллов и агентов (4 из REMAINING)
av-dev-backlogудалить из маркетплейса
6. Канон версии 3 — повысить живые проекты (тема 17)
Оба проекта стоят на каноне 2 и держат docs/tasks/PLAN.md: healthlog 55 задач,
jellybit 43. Шаги повышения — changelog.md,
запись «Версия 3»; делаются скиллом av-dev-pm:canon в режиме upgrade.
- healthlog:
PLAN.md→ROADMAP.md, ссылки,"canon": 3— сделано, лежит в рабочем дереве проекта некоммитнутым - jellybit: то же
- род работы и раздел «Затрагивает» — не задним числом: сперва то, что
идёт в ближайший набор (
sprint takeбез них откажет), остальное по ходу переоценки (PPP) - секции роадмапа:
порядок→Запланировано,темы→Направления, завестиГотовоиСопровождение; прозаические разделы healthlog («Что уже пройдено», «Почему в таком порядке») разложить — звенья строками вГотово, обоснование очереди прозой внутриЗапланировано(тема 19, 80).checkтеперь называет чужую секцию ошибкой, так что шаг обязателен - переформулировать цели ответом на «что приложение будет уметь»; цели не
про приложение («Процесс и качество разработки» в jellybit) — в
Сопровождение check --fixна обоих: поднимет написание канонических секций, поставит отбивку после заголовков и сведёт секцию в мете файлов с заголовками. Секции беклога переименовать руками — имена выбирал проект (тема 20, ККК)- заголовки задач в форму действия — не задним числом: по мере попадания
задачи в работу.
checkпечатает их число,task-formпредложит формулировки пачкой (тема 20, ЕЕЕ)
Канон 4 — сверх того (changelog, запись «Версия 4»):
- healthlog:
## Разработка→## Сопровождение, поле «Секция» в целях этой секции,check --fix(переставитГотововниз и поправит отбивку),"canon": 4 - jellybit едет сразу на 4:
Готовозаводить последней, секцию сопровождения — сразу с новым именем, переставлять дважды не нужно - типы:
check --fixпереведётkind:/[goal]/[idea]в поле «Тип», снимет тег, поставит эмодзи, переименует «Секция» → «Категория» у задач и снесёт сырьё в конец категорий — за один проход, вместе с порядком секций - разобрать
НЕОДНОЗНАЧНОпосле--fix: записи без типа (заведены до появления рода работы) машина не угадывает —edit <слаг> --type … - новые обязательные разделы — не задним числом:
Воспроизведениеу каждогоfixиВопрос+Куда ляжет ответу каждогоresearchпишутся по мере того, как задача идёт в набор (sprint takeбез них откажет). Сколько записей готово к взятию, печатает блок здоровьяcheck