Прыжок standard → deep стоил самого дорогого прохода конвейера, а платить
приходилось за одну архитектурную находку: изменений, которые трогают
публичный контракт, но не вводят нового правила слияния, — большинство.
Ступень wide это standard плюс architecture (вход шире диффа, отсюда имя),
семь проходов против восьми.
Заодно вычистилась давняя неровность: триггер reimpl стоял внутри deep, и
профиль означал то семь проходов, то восемь — реестр состава, который
«сверяется взглядом до коммита», проверять было нечем. Теперь условие
«новое правило идентичности, слияния или разбора» выбирает профиль, reimpl
в deep безусловен и есть единственное отличие от wide. Барьер стоимости
остался только в deep: в wide за ним стоял бы один дешёвый проход с
потолком в 3 находки, а барьер сериализует то, что могло идти разом.
Цвет charter'а теперь кодирует модель, а не роль: sonnet → green,
opus → yellow, fable → red. Роль видна из имени, стоимость прогона —
ниоткуда, а список агентов читается взглядом.
scripts/frontmatter.py ловит три класса ошибок, невидимых при чтении:
- двоеточие с пробелом в незакавыченном описании — для YAML это вложенное
отображение, а не текст. Так было написано три описания из четырнадцати,
и читались они правильно;
- name, разошедшееся с именем каталога скилла или файла charter'а;
- цвет, не отвечающий модели: он ставится один раз при заведении charter'а,
а модель потом двигает калибровка.
Обе ветки проверены, коды выхода — общий словарь. Триггеры профиля в
canon.md и skeletons.md подтянуты под wide.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Диаграмма и проза вокруг неё описывают один факт — это второй дом, и
разойтись они могут молча: то самое, против чего написан copies.py.
Механической сверки здесь нет, дословного соответствия между текстом и
графом не существует, поэтому работает объявление. В review-pipeline
старший граф — он и есть алгоритм планировщика, проза объясняет рёбра;
в остальных местах старшая проза, диаграмма там сводка; в calibration.md
старшая таблица вердиктов, схема добавляет к ней только счётчик.
Объявление стоит у каждой диаграммы строкой в месте, а не общим правилом
в README: скилл читают целиком, README — нет. В task-batch добавлена
оговорка про соседний скилл — два вызова с разным старшинством рядом это
место, где легко ошибиться.
scripts/diagrams.py вынимает все mermaid-блоки и рендерит каждый через
mmdc или npx @mermaid-js/mermaid-cli. Коды выхода — общий словарь; нет
рендерера — код 3, а не молчаливый успех. Chromium с --no-sandbox:
без флага падает на «No usable sandbox», причина в докстроке. Проверены
обе ветки: 11 диаграмм в 9 файлах зелено, сломанный блок даёт точное
место с текстом ошибки парсера и код 1.
README: раздел «Проверка диаграмм» рядом с проверкой копий — что ловит,
чего не ловит и почему не в гейте. DECISIONS 63 и 64.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Критерий: диаграмма заводится, если структура граф или автомат, а проза
вынуждена его пересказывать. Где структура таблица соответствий — чек-лист
синка, профили ревью, коды выхода — не заводится: дублировала бы таблицу
и разошлась с ней.
tasks: жизненный цикл записи по индексам — состояния это где числится
строка, файл items/ не двигается ни на одном переходе.
session: четыре шага сессии; текст говорил «это зависимость, а не список»,
но зависимости не показывал — теперь на рёбрах написано, что ломается.
sprint.md: исходы задачи в спринте плюс два ребра, где порядок нарушается
молча — урожай до sprint close и блокер в обход исходов.
task-pipeline: одиннадцать шагов с развилкой «тривиальная» и досрочным
исходом «крупнее задачи».
promote.md: храповик находка → конвенция → правило → удаление, с обратным
ребром; обязательность третьего шага теперь видна как ребро.
calibration.md: счётчик retune до drop — таблица вердиктов его выразить
не может, автомат может.
README: граф вызовов между плагинами; односторонность зависимости
pipeline → pm видна сразу.
Все девять блоков прогнаны через mermaid-cli. README-схема и автомат
калибровки переверстаны после просмотра: subgraph'ы ломали раскладку,
self-loop наезжал подписями.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Номер стадии не означал зависимости: между стадиями 1–4 ни один проход
не читает вывод другого, и очередь между ними была платой ни за что.
А правило про замеры держалось на двух именах и рассыпалось бы в день,
когда мерить начнёт третий проход.
Рёбер три вида, и они разной природы: зависимость (гейт → опиниативные,
все проходы → триаж), конфликт за ресурс (ненаправленный) и барьер
стоимости. Стадии остаются единицей состава, порядок задаёт граф:
уходит всё, у чего входящие рёбра закрыты.
Сериализует ресурс, а не имена: пометка «держит машину» — gate,
adversary, ops, triage; остальные читают и рассуждают. Проект вправе
пометить свой проход, снять пометку с перечисленных — нет.
Ранний выход заменён барьером стоимости и стоит там, где выход
зарабатывал: перед reimpl и architecture, то есть только в deep.
Отдельным абзацем — что ребро значит порядок и никогда не данные:
графовый словарь провоцирует обратное прочтение, а проход, увидевший
чужие находки, соглашается с ними. Исключение одно и оно же сток.
Диаграммы — mermaid, прогнаны через mermaid-cli. Режим прогона теперь
«по графу» / «линейно»; task-batch и task-pipeline подтянуты под общий
словарь, adversary и ops знают о пометке из своих charter'ов.
DECISIONS 15.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Умолчания разошлись по цене шага. Проход ревью читает и рассуждает: он
ничего не поднимает, ни за что не дерётся и по построению не видит
выводов соседа — очередь между проходами добавляет только ожидание.
Задача батча тянет полный цикл пайплайна с гейтом, поднятием сервиса и
вложенным ревью — две такие дерутся за порты, каталоги и железо.
review-pipeline: параллельно внутри стадии — умолчание. Последовательно —
по трём причинам с именем в отчёте: сказал оператор, проходы меряют,
машина занята. Просьба «последовательно» набора не требует. Меряющая пара
adversary + ops стала именованным исключением: она идёт по очереди
всегда, и общее «гони параллельно» этого не отменяет. Ранний выход
переехал на границу стадии.
task-batch: план собирается графом зависимостей и в умолчании
линеаризуется. Параллельно — по просьбе, и просьба разрешает ширину
графа, а не «всё разом»; потолок 2–3 и одиночная волна замеряющей задачи
сохранены как правила этого режима. Режим ревью внутри задачи выводится
из режима батча и называется в charter'е. Финальная сверка гонит
review-specs по capability параллельно.
DECISIONS 14 — с причиной; версия канона не меняется, канон этих скиллов
не описывает.
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>
- sprint.md прямо запрещал шаг, который пайплайн теперь делает: раздел «кто и
когда закрывает» переписан под снятую границу приёмки
- закрытие задачи стало шагом 11, после коммита: раньше упавший коммит оставил
бы задачу закрытой без следа работы
- контракт close --implemented больше не обещает состоявшуюся приёмку
- слот «куда копируются критерии приёмки» убран из session: на него отвечает
пайплайн, а канон его не заводил
- research/ в таблице ролей вернул adversary; журнал версий поднимает CLAUDE.md
целиком, а не тремя пунктами из восьми
- TODO и REMAINING перестали занижать: коммитов одиннадцать, переписок три
- task-pipeline и task-batch запрещали шаг, который сами же добавили: раздел
границ и финальный доклад переписаны под снятую границу приёмки
- «триаж сводит строки в одну» противоречило «не сливает» — деградация снова
поразрядная во всех трёх местах
- канон не требовал в CLAUDE.md имени основной ветки, testdata и запретов, а
скелета CLAUDE.md не было вовсе — заведён
- обратимость жила в двух домах, читатели ходили в пустой; единственный дом
теперь CLAUDE.md
- заведены слоты «Единые точки проекта» и «Триггеры профиля», куда charter'ы
слали, а канон их не создавал
- блок «Вопросы к проходам» стал частью задания прохода: за ним ходили двое
из девяти
- чек-лист синка и правило «замер + настройка» сведены к одному дому;
plugin.json больше не про бриф
- удалены скилл project-brief и контракт брифа; вместо них references/
project-facts.md — карта «что нужно проходу → где лежит» и таблица
поразрядной деградации по документам
- девять charter'ов, review-pipeline, task-pipeline и task-batch переписаны
на пути канона; OpenSpec стал объявленной предпосылкой без ветки деградации
- шаг синка документации переписан в построчный доклад, закрытие задачи —
вызовом скилла av-dev-pm:tasks вместо строки-слота из CLAUDE.md
- по находкам ревью: docs.py звал tasks.py из чужого каталога и выдавал его
отказ окружения за дрейф; сверка миграций не видела рабочее дерево;
плейсхолдер краснел вместо замечания; сверка capability проходила по
совпадению с именем пакета; tasks.py не читал docs/.pm.json; скилл docs
пересказывал канон в пяти местах
- скилл project-brief: бриф собирается из CLAUDE.md, архитектуры, Taskfile
и конвенций и показывается человеку. Раньше единственная инструкция по
его созданию лежала внутри шаблона, поэтому деградированный режим был не
аварийным, а единственным: critical по основанию «нарушен инвариант»
недостижим ни на одной задаче
- rebase перенесён внутрь worktree задачи: прежняя форма падала на занятой
ветке, и агент уводил весь батч в провалившиеся с ложной причиной
- контракт брифа дополнен восемью слотами; проверен заполнением на обоих
проектах, незаполнимых нет. Прецедент healthlog вынут из общего charter'а
в бриф — там он вмёрз вместе с числами
- шов: пайплайн задачу не закрывает и записи учёта не трогает, урожай
отдаёт списком, правило остатка — ссылкой на av-dev-tasks
- деградированный абзац во всех девяти проходах, вопрос 9 в ops,
пространство имён в вызовах, раздел предпосылок
Пара плагинов с намеренно проведённой границей: av-dev-tasks отвечает
за то, что делаем и в каком порядке, av-dev-pipeline — за то, как ведём
одну задачу. Зависимости между ними нет: управление задачами работает и
с ручным исполнением, пайплайн — на проекте с любым учётом задач.
- av-dev-tasks — преемник av-dev-backlog: цели вместо приоритетов,
спринт под одну цель с заморозкой набора, различение вопроса и
блокера, каденция «вопросы — разбор — переоценка — набор».
Раскладка docs/tasks с items/, PLAN.md, BACKLOG.md, SPRINT.md,
REJECTED.md; проверенное из av-dev-backlog перенесено, не переписано.
- av-dev-pipeline — вынос того, что лежало копиями в healthlog и
jellybit (3628 строк) и уже разошлось: цикл SDD, конвейер ревью с
обязательным триажем, прогон нескольких задач разом. Проектная
специфика вынесена в файл-бриф, charter'ы несут метод.
Коммит фиксирует состояние на момент ревью: три прохода нашли
блокирующие дефекты (нет шага, заводящего бриф; git rebase на занятой
worktree ветке; sprint drop пишет наполовину) — они чинятся следующими
коммитами. Сохранено как база, от которой видно правки.