# Остатки, открытые вопросы и принятые пределы Состояние на 2026-08-03, после разбора двенадцати тем и 16 коммитов реализации (`ad1779b` … `885981c`). План работ — [TODO.md](TODO.md). Решения с причинами — [DECISIONS.md](DECISIONS.md). Здесь то, что **не** является работой из плана: незакрытые риски, честно принятые пределы и вопросы, у которых пока нет ответа. ## Главный незакрытый риск **Калибровка не сделана, а charter'ы переписаны трижды.** Первый раз девять charter'ов правили при выносе в плагин: предмет проверки заменили ссылкой на раздел брифа. `references/calibration.md` требует при такой правке замерить, помогла ли она, — **замера не было**. Второй раз их переписали коммитом `9cef452`: ссылка на раздел брифа заменена путём документа канона. Третий — коммитами `0eab075` и следующим, по находкам ревью: `adversary`, `ops`, `reimpl`, `rubric` и `triage` правились ещё раз. **Три неизмеренных изменения подряд** в том самом месте, где присваивается severity. Пробы готовы и синтетических не нужно — четыре реальные находки прошедшей сессии healthlog: - скелет из `null` затирает маршрут тренировки молча и необратимо; - откат бинаря поверх новой схемы стартует без единого слова; - канонизация внутри транзакции — 768 МиБ пика, 5.019 с удержания блокировки; - `-1 >= -1` читается как «журнал разобран целиком». Ожидаемый исход известен и его стоит проверить первым: метод переносится, а **severity деградирует**. Третья находка без слота под представление данных и настройки хранилища превращалась из `critical` с прогнанным оракулом в условное наблюдение. Ровно ради этого случая канон развёл числа (`docs/research/`) и настройки (`docs/database.md`) по разным домам и **обязал проход их сшивать** — но работает ли обязанность, не проверено. Оркестратор реагирует на severity, поэтому цена — не «не найдём», а **«найдём и не починим»**. Замер стоит перед переездом jellybit и блокирует его (решение 39). ## Что ещё не сделано Список работ — в [TODO.md](TODO.md). Здесь только то, что стоит держать в голове отдельно: - **`git push`.** 17 коммитов не отправлены на origin, поэтому установленный маркетплейс их не видит и до сих пор стоит на `092d07c`. Это буквальное объяснение фразы «плагины ни к одному проекту не подключены»: подключать пока нечего. - **Ни один скилл не прогонялся на живом проекте.** `docs.py` прогнан на healthlog и jellybit в режиме `check` и находит осмысленный дрейф; `init`, `canon adopt`, `canon upgrade` и скилл `docs` не исполнялись ни разу. - **Проектные копии в healthlog и jellybit.** Два `.claude/skills/` и одиннадцать `.claude/agents/` старого поколения. У jellybit хуже: его скиллы названы `task-pipeline`, `review-pipeline`, `task-batch` — **ровно как в плагине**. Claude Code не переопределяет их, а держит обе пары, так что короткое имя может увести в устаревшую копию, и молча. ## Открытые вопросы **Как проверять, что канон не разошёлся с проектами после `upgrade`.** `canon check` сверяет версию, но не то, что миграционные записи journal'а применены верно. Проект может нести `"canon": 2` и не иметь того, что версия 2 требовала. **Форма ADR при пересмотре решения.** Правило «старая запись получает статус `заменено на`» требует, чтобы кто-то заметил, что новое решение отменяет старое. Механической проверки нет, а принуждённое отрицание на шаге синка спрашивает про `adr/` вообще, а не «не отменяет ли это что-то из существующего». **Что делать с `av-dev-backlog` после перевода jellybit.** Помечен устаревшим и переписан так, чтобы не ловить триггер. Удалять его из маркетплейса или оставить как есть — решится, когда jellybit переедет. ## Известные пределы — приняты, чинить не планируется **Транзакций на несколько файлов нет.** POSIX её не даёт без журнала. Окно сжато до цепочки `rename` без ввода-вывода, а всё, что в окне может разъехаться, сделано производным и восстанавливается `check --fix` без потерь. **Оракул в критериях приёмки проверяется эвристикой.** Число пунктов проверяется жёстко, наличие оракула — по слову, и это **только замечание**. В тексте прямо сказано, что проверено меньше, чем требуется. **Recall прохода по конвенциям равен качеству конвенций проекта.** Своего списка у него нет: критерий берётся из `docs/conventions/`. На проекте с тонкими конвенциями проход почти пуст, и charter это признаёт вслух. **Доменного словаря в каноне нет.** Проходы получают факты, но не термины; словарь строится каждый раз заново из спек и архитектуры. Цена не измерена. **Смысловые дубли ловит только агент.** `docs.py` видит раскладку, но не то, что `docs/specs/recognition.md` описывает то же, что capability `recognition`. Граница объявляется вслух в каждом отчёте — это единственная защита от «соблюдено» на проекте с тремя лишними файлами. **Приёмщик и исполнитель совпали.** Граница «пайплайн не закрывает задачу» снята сознательно (решение P); три защиты из раздела «Стимулы» держатся теперь текстом, а не механикой. Реальные опоры — сохранённый отчёт триажа, `SPRINT.md` под git и `reopen`. Это записано в самом скилле, а не спрятано. **Копия правила в шаблонах проекта.** `adr/README.md` и `review.md` уезжают в репозиторий и обязаны там что-то говорить, поэтому правило канона в них копируется намеренно. Расхождение копии с домом ловит `scripts/copies.py` — но только у **помеченной** копии, и только внутри маркетплейса. Остаётся на человеке двое: пометить копию и завести запись в журнал версий, когда правка уже уехала в проект.