Ключ [healthcheck] last, заведённый вчера темой 78, роняли оба скрипта плагина: верхний уровень .av-dev.toml стережёт TOP_KEYS в shared/config.py, и неизвестный ключ там — отказ кодом 3. Первый же прогон сверки сделал бы нерабочими canon check/adopt/upgrade, весь task-track и гейт проекта. След живёт теперь ключом healthcheck_last в секции [docs] — по смыслу (настройки проверок документов) и по цене (правка одной константы DOCS_KEYS в docs.py, общий читатель не тронут). Воспроизведено до и после: docs.py и tasks.py конфиг с ключом принимают. Корень был не в описке, а в ложном обещании канона «неизвестный ключ docs.py игнорирует» — оно старше темы 78, и на него опёрлись, не открыв скрипт. Обещание снято, на его месте правило: новый ключ заводится правкой константы скрипта-владельца, и только потом попадает в канон. Журнал — тема 79.
5.2 KiB
79. След сверки переехал в секцию docs; ключ верхнего уровня ронял скрипты (2026-08-23)
Что было
Тема 78 завела след сверки документов ключом last в секции [healthcheck]
файла .av-dev.toml. Ревью трансформации — три прохода по скиллам и документам —
нашло, что такого ключа не переживает ни один скрипт плагина.
Проверено запуском, а не рассуждением. В проекте с [healthcheck] last команда
docs.py check печатает ОТКАЗ: .av-dev.toml: неизвестные ключи верхнего уровня: healthcheck и выходит кодом 3; tasks.py check — то же самое. Верхний уровень
файла стережёт shared/config.py константой TOP_KEYS, и неизвестный ключ там —
отказ, а не пропуск. То есть первый же прогон сверки сделал бы нерабочими
canon check/adopt/upgrade, весь task-track вместе с закрытием задачи и гейт
проекта, который их зовёт.
Корень — не описка, а ложное обещание документа. Раздел .av-dev.toml в
каноне утверждал: «неизвестный ключ docs.py игнорирует». Утверждение было
неверным и старше темы 78; при проектировании следа опёрлись на него и скрипт не
открыли, хотя докстринг check_keys говорит прямо обратное: «неизвестный ключ —
отказ, а не безмолвный пропуск».
Решено
Р319. След живёт ключом healthcheck_last в секции [docs]. Секция досталась
ему по смыслу: [docs] — настройки проверок документов, а сверка документов и
есть такая проверка. Своя секция верхнего уровня стоила бы правки общего читателя
shared/config.py и превратила бы файл, объявленный «версией и настройками», в
хранилище состояния.
Р320. Новый ключ .av-dev.toml заводится правкой константы скрипта-владельца,
и только потом появляется в каноне. Порядок именно такой, а не обратный:
владелец ключа — тот скрипт, чья константа его перечисляет (TOP_KEYS в
shared/config.py, DOCS_KEYS в docs.py, свой список в tasks.py).
Р321. Канон приведён к скрипту, а не скрипт к канону. Отказ кодом 3 — поведение верное: ключ, положенный не в ту секцию, при молчаливом пропуске не значит ничего, проверка объявляет себя неприменимой, отчёт выходит зелёным, и на месте настройки оказывается тишина. Ложное обещание снято, на его месте — правило Р320 и названная цена этой ошибки.
Следствия
С282. Версия раскладки не двигается. Ключ необязательный и заводится сам первым прогоном сверки; проекту делать нечего, а запись журнала версий нужна ради пункта «что сделать проекту».
С283. Правило «своей прозе здесь верить нельзя» распространяется и на собственную документацию плагина. Оно написано про возврат агента, но работает шире: утверждение документа о поведении скрипта проверяется запуском скрипта, и стоит эта проверка одной команды. Здесь её не сделали, и цена вышла в рабочую поломку у всякого, кто позвал бы сверку.
С284. Гейт репозитория такого класса дефектов не ловит и ловить не может. Он судит форму: фронтматтеры, дословность копий, адреса, номера журнала, рендер диаграмм. Согласованность прозы с поведением скрипта — суждение, и добыло его ревью, а не хук. Это довод в пользу того, чтобы прогон ревью по трансформации шёл не «если останется время», а следом за ней.