Шапка и пункт про push стояли на 11 коммитах и восьми темах — стало 17 и
двенадцать. Предел «копия правила в шаблонах» теперь говорит, что расхождение
ловит copies.py, а на человеке осталось пометить копию и завести запись в
журнал версий.
В план healthlog дописан снос девяти проектных агентов и двух скиллов: они
прошлого поколения и ссылаются на docs/conventions.md, docs/local-research.md
и docs/review-journal.md — на файлы, которых после переезда не будет.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Разделение плагинов оставлено, цена названа: пять симметричных контрактов в двух
домах, два уже разошлись — форма журнала дефектов потеряла в копии поле
«Причина», список читателей docs/research/ потерял specs. Оба раза копия
выглядела актуальной и прошла мимо трёх ревью.
scripts/copies.py требует побайтового совпадения текста между маркерами.
Комментарии, а не манифест копий: маркер уезжает в репозиторий проекта вместе со
скелетом и там полезен — говорит, что у текста есть дом.
Идентификатор строгий и повторяется в закрывающем маркере. Иначе документация о
самом механизме объявляет дом и роняет проверку: это случилось на первом же
прогоне, README объявил дом примером.
Ограда блока кода в сверку не входит: в доме текст обрамлён своей оградой, в
скелете лежит внутри чужой, объемлющей.
Помечены два контракта. Второй пришлось сперва сделать дословным: копия говорила
«обязателен статус», дом — «обязателен статус „заменено на“».
Проверка не ловит копию, которую забыли пометить, — это сказано вслух, иначе
зелёный прогон читался бы как «копий больше нет». И не заменяет запись в журнал
версий канона: она видит, что копия отстала, но не что проект унёс старую версию.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Целевая картина проверена по коду и текстам. av-dev-git ни от чего не зависит.
av-dev-pipeline проходим на задаче, заданной одной строкой текста, — кроме одного
места. Третья цель в исходной формулировке недостижима, и поправлена формулировка,
а не картина.
av-dev-pm владеет docs/review.md — конфигурационным файлом конвейера с «Вопросами
к проходам» и «Триггерами профиля», то есть знает проходы поимённо по построению.
Кто-то этим словарём владеть обязан. Честная формулировка: pm не зовёт пайплайн и
не требует его наличия — и она выполняется.
Настоящая протечка была одна: опоры приёмки в «Стимулах» и sprint.md держались на
отчёте триажа по конкретному OpenSpec-пути. В проекте без конвейера защита от
занижения урожая исчезала молча. Теперь опора названа абстрактно, путь дан частным
случаем, отсутствие конвейера обязано попадать строкой в доклад спринта.
Ветка деградации шага 9 была неисполнима ровно в том случае, ради которого
написана: «плагина нет — открой av-dev-pm/skills/canon/references/canon.md», путь в
дерево маркетплейса. Пайплайн теперь ходит в свой project-facts.md, а ссылки в
чужой плагин даются через Skill.
Две симметричные копии уже разошлись: форма журнала дефектов (шесть полей против
пяти, «Причина» потеряна) и читатели docs/research/ («specs» выпал). Дома
назначены, копии помечены, обязанность тянуть запись в журнал версий записана.
Плюс: пайплайн не называет items/ и SPRINT.md — их имена проект вправе сменить;
манифесты объявили av-dev-pm опциональным и приём задачи текстом.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Два независимых сабагента на av-dev-pm и av-dev-pipeline. Две находки нашли оба.
Главная — моя же перестановка закрытия за коммит сломала reopen и батч. close
печатал «дорога назад из git», а reopen искал коммит удаления, которого в новом
порядке ещё нет: шаг 11 последний, учёт остаётся незакоммиченным. Проверено
прогоном — отказ кодом 2 на свежезакрытой задаче. Тем же грязным деревом
ломались rebase и worktree remove в батче: каждая закрывшая задачу ветка уехала
бы в провалившиеся.
Починено с обеих сторон: reopen берёт текст из HEAD, если коммита удаления нет,
а шаг 11 коммитит учёт вторым коммитом.
Вторая — канонический пример docs/.pm.json убивал tasks.py. Четыре документа
показывали ключ tasks.sections, которого скрипт не знает: неизвестный ключ это
код 3 на любой команде. Проект, заведённый по канону дословно, остался бы без
работы с задачами, а docs.py при этом печатал «канон соблюдён». Секции живут в
заголовках индекса и второго дома не получают.
Остальные восемнадцать: init писал конфиг в упразднённый .tasks.json;
looks_like_tasks не видел переименованный индекс; урожай спринта терял автотег
после sprint close; ответ на вопрос по инструкции оставлял задачу незабираемой;
adopt требовал недостижимого зелёного; путь отчёта триажа не переживал archive;
review-specs не имел режима для стыка после слияния; три остатка «шаг 9а» несли
предкоммитную позицию закрытия; sprint.md отрицал сам себя в пункте «Сделана».
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Скрипты остаются на голом python 3.12 без зависимостей: pyproject.toml живёт
только в этом репозитории и держит линтеры, а не зависимости скриптов.
Ноль зависимостей охраняется дважды: banned-api у ruff ловит частые соблазны по
имени, pyrefly видит окружение без ничего и не разрешает любой сторонний импорт.
Версии прибиты точно, uv.lock под git: обновление линтера меняет набор находок,
а находки правятся руками в скриптах, которые уезжают в чужие проекты.
RUF001–003 выключены — весь текст русский, 311 срабатываний из 338 шум.
av-dev-backlog исключён: заморожен до удаления, правка без выгоды.
Из 41 находки содержательных две: мёртвая ques в check и два места, где
find_entry_index может вернуть None прямо в list.pop и range. По ревью там
стоит raise, а не continue: тихий пропуск превратил бы сломанный инвариант в
отчёт «индексы согласованы».
os из tasks.py ушёл целиком, fail() в docs.py объявлен NoReturn.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- sprint.md прямо запрещал шаг, который пайплайн теперь делает: раздел «кто и
когда закрывает» переписан под снятую границу приёмки
- закрытие задачи стало шагом 11, после коммита: раньше упавший коммит оставил
бы задачу закрытой без следа работы
- контракт close --implemented больше не обещает состоявшуюся приёмку
- слот «куда копируются критерии приёмки» убран из session: на него отвечает
пайплайн, а канон его не заводил
- research/ в таблице ролей вернул adversary; журнал версий поднимает CLAUDE.md
целиком, а не тремя пунктами из восьми
- TODO и REMAINING перестали занижать: коммитов одиннадцать, переписок три
- DECISIONS.md: 29 решений по восьми темам, каждое с причиной; две отменённые
версии сохранены с объяснением отмены
- TODO.md: план в порядке выката, замер блокирует переезд jellybit