Обкатка скилла tasks на выдуманном проекте — консольные крестики-нолики на JavaScript, каталог заведён с нуля тем же скриптом. Форма вылезла раньше содержания, и правки все про неё. Заголовок отвечает на вопрос типа записи, и форм три: цель — утверждение о возможности, задача — глагол в неопределённой форме (допускается «не» перед ним), идея — назывное, без обещания. Причина не стилистическая: описательный заголовок называет состояние, а из состояния не видно, чего от работы ждут — «Ничья объявляется, пока клетки есть» одинаково читается как жалоба и как задание. Отсюда же разница индексов: роадмап — список возможностей, беклог — список работ, и перепутанные формы делают каждый похожим на другой. Механизировано ровно то, что механизируется: check считает заголовки, где первое слово не на -ть/-ти/-чь, и печатает число в блоке здоровья. Замечанием на файл нельзя — эвристика грубая, а на 97 записях двух живых проектов это поток одинаковых строк, после которого пропускают весь блок. Годность формулировки судит отдельный агент task-wording, а не чек-лист в скилле: сейчас формулировку пишет и проверяет один агент в одном контексте, а самопроверка текста слабее всего там, где формулировка казалась удачной при написании. Он ничего не правит — возвращает готовые формулировки, и заголовок с «зачем» показываются человеку, потому что по ним задачу выбирают. Ничего из того, что ловит tasks.py check, он не трогает намеренно: это был бы второй дом для правила. Заголовки секций — с прописной, после заголовка пустая строка, во всех индексах. Канонические имена стали Готово | Запланировано | Направления | Разработка (англ. Done | Planned | Directions | Tooling), сверка везде по нижнему регистру, так что старые индексы читаются по-прежнему. Отбивка живёт на записи, а не на вставке: через Plan.index проходит каждая правка индекса, а мест вставки три. Имя секции принадлежит заголовку индекса, файл на неё только ссылается. Это разрешает единственную неоднозначность починки — расхождение в одном регистре правится в пользу заголовка. Без него переезд на канон оставил бы «Готово» в роадмапе и «готово» в каждом файле цели, и свести это было бы некому. Регистр правится только у канонических секций: имена секций беклога выбирает проект. Обкатка нашла два дефекта, которых не находили ни линтеры, ни свои проверки. Вставка в пустую секцию съедала отбивку перед следующим заголовком — пропуск пустых строк теперь идёт только до первой непустой. Мета, разорванная пустой строкой, теряла поля молча: check видел лишь следствие («без рода работы») и советовал edit --kind, который дописывал второе такое же поле. Поле меты в теле стало ошибкой с названной причиной, и --fix её намеренно не чинит — какое из двух значений верное, знает человек. DECISIONS тема 20 (ЕЕЕ–ККК, следствия 82–85), changelog канона v3 пополнен двумя пунктами и двумя шагами переезда, TODO — два шага для healthlog и jellybit. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
184 lines
13 KiB
Markdown
184 lines
13 KiB
Markdown
# Работы по итогам разбора
|
||
|
||
Порядок и обоснование — [DECISIONS.md](DECISIONS.md), тема 8. Номера в скобках —
|
||
следствия оттуда.
|
||
|
||
Замер (шаг 3) — **единственный шаг, который нельзя переставить**: он блокирует
|
||
переезд jellybit. Всё остальное можно тасовать.
|
||
|
||
## 0. Предусловие
|
||
|
||
- [x] `git push` — `092d07c..88c5d97`, 17 коммитов ушли на origin (37)
|
||
- [x] `claude plugin marketplace update av-dev-skills` — клон встал на `88c5d97`
|
||
и видит `av-dev-pm` и `av-dev-pipeline`
|
||
|
||
## 1. Репозиторий плагинов
|
||
|
||
### 1.1 Переименование
|
||
|
||
- [x] `av-dev-tasks` → `av-dev-pm`: каталог, `plugin.json`, `marketplace.json` (18)
|
||
- [x] пространство имён во всех текстах: `av-dev-tasks:session` →
|
||
`av-dev-pm:session`, включая ссылку из `task-pipeline` (18)
|
||
|
||
### 1.2 Канон — единственный дом определения
|
||
|
||
- [x] `av-dev-pm/skills/canon/references/canon.md` — раскладка, роли документов,
|
||
правило единственного дома. Читают `init`, `canon`, `docs` (AA)
|
||
- [x] `av-dev-pm/skills/canon/references/changelog.md` — журнал версий канона,
|
||
версия 1 (26)
|
||
|
||
### 1.3 Правки существующих скиллов
|
||
|
||
- [x] `tasks`: убрать слот 6 «Команда учёта задач» (33)
|
||
- [x] `tasks`: путь каталога жёсткий `docs/tasks`, убрать цепочку разрешения (F)
|
||
- [x] `tasks`: `.tasks.json` → `docs/.pm.json`, там же версия канона и путь
|
||
миграций (23, 30)
|
||
- [x] `tasks`: убрать слоты 3 «куда переезжает суть» и 5 «оракулы» — отвечает
|
||
канон и семантика гейта (тема 4)
|
||
- [x] `session`: убрать слот 7 и слот 4 «где живёт разбор процесса» (33, K)
|
||
- [x] `session`: переписать «Стимулы, которые процесс создаёт» — снятая граница
|
||
выбила опору у трёх защит (19)
|
||
|
||
### 1.4 Новые скиллы
|
||
|
||
- [x] `init` — интервью по брифу → канон нового проекта (R)
|
||
- [x] `canon` — `check` / `adopt` / `upgrade`; поглощает скилл `adopt` (R, 21, 24)
|
||
- [x] `docs` — содержимое канона: ADR из архивного `design.md`, промоут
|
||
конвенций, запись в `research/` и `review.md`, чистка `architecture.md` (X)
|
||
- [x] `docs.py` — раскладка, лишние файлы, битые ссылки, версия, плейсхолдеры,
|
||
маркеры долга; сверки миграции ↔ `database.md` и capability ↔
|
||
`architecture.md` (T, 31)
|
||
|
||
### 1.5 av-dev-pipeline
|
||
|
||
- [x] удалить скилл `project-brief` и `references/{project-brief,brief-template}.md` (13)
|
||
- [x] снять ветки деградации OpenSpec в трёх местах: `task-pipeline`,
|
||
`review-pipeline`, `task-batch` (1)
|
||
- [x] девять charter'ов: разделы брифа → пути канона; `ops`/`adversary`/`reimpl`
|
||
обязаны сшивать `research/` и `database.md` (14, 15)
|
||
- [x] `review-pipeline`: убрать бриф, поразрядная деградация по документам (16)
|
||
- [x] `task-pipeline` шаг 9 → построчный доклад по документам канона (28)
|
||
- [x] `task-pipeline`/`task-batch`: закрытие задачи вызовом скилла
|
||
`av-dev-pm:tasks`, слот убрать (32, 33)
|
||
- [x] `promote.md` шаг 3: перечень механизированного → `conventions/README.md` (29)
|
||
- [x] описание плагина: «требует OpenSpec» (2)
|
||
|
||
### 1.6 Прочее
|
||
|
||
- [x] `av-dev-backlog` — пометить устаревшим, переписать описание, чтобы не
|
||
ловило триггер (Q)
|
||
- [x] `README.md` маркетплейса — три плагина, канон, установка
|
||
- [x] `HISTORY.md` — сжать `AGENTIC-TASKS.md` до истории решений (CC)
|
||
- [x] `REMAINING.md` пересобрать: пункт 2 отменён, четыре вопроса закрыты,
|
||
калибровка стала обязательной (38)
|
||
|
||
### 1.7 Линтеры скриптов (тема 9)
|
||
|
||
- [x] `pyproject.toml`: ruff + pyrefly через `uv`, версии прибиты (DD, FF)
|
||
- [x] запрет внешних зависимостей двумя способами: `banned-api` + пустое
|
||
окружение pyrefly (EE)
|
||
- [x] `RUF001`–`RUF003` выключены, `av-dev-backlog` исключён (GG, HH)
|
||
- [x] починены 27 находок ruff и 14 pyrefly; `os` из `tasks.py` ушёл (40, 41)
|
||
- [x] раздел «Проверка скриптов» в `README.md`
|
||
|
||
### 1.8 Ревью двумя проходами (тема 10)
|
||
|
||
- [x] `reopen` берёт текст из `HEAD`, когда коммита удаления ещё нет (JJ)
|
||
- [x] шаг 11 коммитит учёт вторым коммитом; батч проверяет чистоту дерева (JJ)
|
||
- [x] фиктивный ключ `tasks.sections` убран из четырёх документов (KK)
|
||
- [x] `init` пишет конфиг в `docs/.pm.json`; `looks_like_tasks` его читает
|
||
- [x] урожай спринта заводится до `sprint close`, слаг — из его отчёта
|
||
- [x] ответ на вопрос опустошает раздел «Вопросы» — во всех трёх местах
|
||
- [x] путь отчёта триажа переживает архивацию (5 мест)
|
||
- [x] `review-specs` получил режим 3 — стык после слияния
|
||
- [x] остальные 12 находок: `sprint.md`, «9а», перечень проектных копий,
|
||
параллельность в батче, триаж в финальной сверке, триггеры профиля, 8–12
|
||
|
||
### 1.9 Ревью зависимостей между плагинами (тема 11)
|
||
|
||
- [x] опоры приёмки названы абстрактно, деградация без конвейера объявлена (MM)
|
||
- [x] ветка деградации шага 9 ходит в свой `project-facts.md` (NN)
|
||
- [x] `docs` даёт ветку «конвейера нет» для журнала и промоута
|
||
- [x] форма журнала дефектов сведена к дому, копия помечена в `changelog.md`
|
||
- [x] `specs` вернулся в читатели `docs/research/`; дом списка назначен
|
||
- [x] пайплайн не называет `items/` и `SPRINT.md` — их знает `av-dev-pm`
|
||
- [x] манифесты объявили `av-dev-pm` опциональным для конвейера (49)
|
||
|
||
### 1.10 Механическая проверка копий (тема 12)
|
||
|
||
- [x] `scripts/copies.py`: маркеры дома и копии, побайтовая сверка (OO)
|
||
- [x] строгий id, повторяемый в закрывающем маркере (PP)
|
||
- [x] помечены два контракта; «когда заводить ADR» сведён к дословному (50)
|
||
- [x] раздел «Проверка копий правил» в `README.md`, правило — в обоих домах
|
||
|
||
## 2. healthlog — первая боевая проверка
|
||
|
||
- [ ] `canon adopt`; `docs/backlog/` → `docs/tasks/`
|
||
- [ ] `architecture.md` 1662 строки → обзор, остаток маркерами (W)
|
||
- [ ] после выноса поведения — замерить остаток `architecture.md` и решить по
|
||
каталожной форме: жмёт → канон версии **4** для `architecture.md` и
|
||
`review.md`, точка входа `README.md` (тема 16, GGG, 65; версию 3 занял
|
||
роадмап с родом работы, тема 17, 68)
|
||
- [ ] завести `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.md`
|
||
- [ ] `drafts/` растворить: 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](av-dev-pm/skills/canon/references/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-wording` предложит
|
||
формулировки пачкой (тема 20, ЕЕЕ)
|