канон отпустил каталог задач: docs.py не зовёт tasks.py, конфиг разъехался

Пока владелец был один, docs/tasks/ числился слотом канона: docs.py требовал
каталог, звал внутрь чужой скрипт подпроцессом и выдавал его дрейф за свой, а
настройки задач жили ключом tasks в docs/.pm.json. Для проекта, поставившего
только документы, всё это отказ на ровном месте — задач он не ведёт, и требовать
их не за что.

Раскол вскрыл это немедленно и молча: check_tasks искал tasks.py по пути
parents[2]/tasks/scripts, то есть внутри своего плагина, и после переезда
скатывался в ветку «скрипт не найден» на каждом прогоне. Проверка выглядела
живой и не проверяла ничего.

Теперь docs.py про задачи не говорит ни слова: check_tasks снят целиком, каталог
остаётся в NOT_DOCS, его отсутствие дрейфом не считается. Канон резервирует место
в docs/ и внутрь не смотрит.

Дом настроек каталога задач вернулся в свой файл — <каталог>/.tasks.json. Прежний
ключ tasks в docs/.pm.json читается, только когда своего файла нет, и скрипт
говорит, куда его перенести; есть оба — побеждает свой, и об этом тоже говорится
вслух. Порядок именно такой, потому что docs/ принадлежит другому плагину: дом
настроек в чужом дереве это дом, которого у половины проектов нет.

Заодно закрыта дыра, которую сам же и открыл первый вариант правки: битый
docs/.pm.json ронял бы задачи даже при живом своём конфиге. Чужой файл здесь
только повод для замечания, и его поломка не наша. Проверено на четырёх случаях —
только чужой конфиг, оба, свой плюс битый чужой (код 0), только битый чужой
(код 3, окружение).

Канон повышен до версии 8 с записью, выполнимой upgrade. В ней названо и то, что
легко потерять: раньше согласованность задач тянул за собой docs.py check, и
проект, у которого в гейте стоял только он, обязан добавить второй шаг — иначе
дрейф индексов перестанет ловиться молча.

Гейт зелёный. Оба скрипта прогнаны: docs.py check на фикстуре про задачи не
упоминает, tasks.py check код 0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-08-09 14:12:08 +03:00
co-authored by Claude Opus 5
parent 00ddfb0dde
commit 1f31ac6afd
7 changed files with 131 additions and 110 deletions
+11 -4
View File
@@ -624,10 +624,17 @@ python3 $tk adopt scan --from … | apply --plan … # разовая адап
действительно новый, а перевод чужой раскладки делает `av-dev-docs:canon`.
У скрипта поиск вверх по дереву ещё жив — он для непереведённых проектов, и
полагаться на него скилл не должен: молча найденный чужой каталог это дрейф.
- **Настройки живут в `docs/.pm.json`**, ключ `tasks`: **имена** файлов и
заголовков, и только если они отличаются от умолчания. Один конфиг на весь
канон, а не по одному на каталог. Неизвестный ключ — код 3 на любой команде,
так что лишнее слово в этом объекте останавливает работу с задачами целиком.
- **Настройки живут в `<каталог задач>/.tasks.json`** — свой файл у своего
плагина: **имена** файлов и заголовков, и только если они отличаются от
умолчания. Неизвестный ключ — код 3 на любой команде, так что лишнее слово в
этом объекте останавливает работу с задачами целиком.
Дом именно свой, а не `docs/.pm.json`, потому что `docs/` принадлежит плагину
канона: проект, поставивший учёт работ без него, каталога `docs/` не имеет
вовсе. Прежний ключ `tasks` в `docs/.pm.json` читается, **только когда своего
файла нет** — для проектов, заведённых до раскола плагинов; скрипт при этом
говорит замечанием, куда его перенести. Есть оба — побеждает свой, и об этом
тоже говорится вслух: молча выбранный из двух конфиг это дрейф.
- **Секции беклога** берутся из заголовков `##` индекса как есть; их количество
и названия — дело проекта (умолчание `Ядро` / `Инфра`). **В конфиге их нет** —
второй список разошёлся бы с заголовками молча.