Поправка 21:05. Первая версия этой страницы называла 722 поломки, 48/день и «97% классов-одиночек». Это была ошибка: извлечение делали LLM-агенты, и они утроили счёт. Пересчёт самого файла даёт 144 записи, 11/день, 82% одиночек — и, что важно, правило третьей поломки на именованных классах работает (5 классов дошли до порога, покрывают 53% записей). Направление выводов устояло, магнитуды — нет. Инструмент соврал зелёным ровно в том разборе, который эту болезнь и диагностирует.
selfheal.py journal → потому что дверь честно пропускает буллет без маркера класса (так и сказано в её докстринге) → потому что «назвать класс» это шаг доброй воли пишущего, а не поле, которое кто-то требует.
Что замер подтвердил, а что опроверг. Опроверг первую версию этой страницы: на ИМЕНОВАННЫХ классах правило работает — 5 классов дошли до порога и покрывают 53% записей. Подтвердил: 82% имён всё же одиночки, и в коде сравнение классов точное (class_slug(raw_cls) != class_slug(cls)) — ни словаря, ни сопоставления с существующими. Одна семья под тремя именами живёт как три одиночки: «перезапись чужого живого артефакта» · «package-install-reverts-newer-local-file» · «протухшая копия скрипта при живом фиксе».
Две дыры разной величины: большая — безымянные буллеты (22% вне счёта навсегда); меньшая — точное сравнение имён. Чинить в этом порядке.
Лечение (АК-47, образец в нашем же коде): onair.py уже сопоставляет незнакомые зоны с каноничными через difflib. Тот же приём — на имена классов. Новый робот не нужен: правка одной функции в существующей двери.
Что это значит буквально: сторож нуждается в стороже, у сторожа сторожа протухает индикатор — и вся эта конструкция ломается чаще, чем то, ради чего строилась. Флот как целое перестал быть чинибельным «молотком и отвёрткой».
Механизм уже есть: оргмодель рутин от 21.08 — у рутины есть мама, приёмник, рельса и цена, а менеджер robot-audit-weekly увольняет сам. Дверь построена, увольнений по факту не видно.
Лечение: добавить в «цену» рутины число строк журнала, которые она породила. Прибор, дающий больше поломок, чем предотвращает, увольняется существующим менеджером. Ноль новых машин.
предложение, сессия не поднята — ждёт решения Антонаcheck --zone в момент правки никто не зовёт → потому что правило живёт в каноне (текст, который надо вспомнить), а действие идёт через инструмент (Write, Bash, create_task) → между знанием правила и моментом действия нет физической связи, кроме моей добросовестности.
Это и есть твоё сегодняшнее указание: наклейка «занято» уже есть и называется ON AIR. Строить второй гейт было бы копией — то есть само по себе нарушением АК-47.
Свой же замер подтверждает шире: 76% свежих правил жили без двери (§8.6, квота «одно правило = одна дверь»), «5 почему» пролежал 42 дня без единого применения.
сессия поднята: auto-hub-260822-clobber-onair-root, 23:05Самая большая семья. Краш выглядит как успех, exit 0 при недоставке, сторож рапортует OK на мёртвую ногу, сторож живёт на том же движке, что и объект наблюдения. Механизмы есть — §5.5 (сторож не живёт в том, что сторожит), output_freshness.py, crash-guard except BaseException → exit 4, гейт _test_crash_guard.py. Не применяются к КАЖДОМУ новому прибору при рождении, а только задним числом.
Лечение: ничего нового не строить — сделать crash-guard и «громкий отказ» частью рождения детали (§5.8 уже требует тест + паспорт + счётчик; добавить туда же «докажи ненулевой выход на поломке»).
Пути, Windows против POSIX, кодировки, венвы, лимит argv, кавычки в хуках, msys-пути в heredoc. Корень: код пишется под ОДНУ машину, а живёт на пяти разных с тремя ОС. Механизмы есть — лесенка menv, lint_path_hardcode, дрейф-манифест флота. Тот же провал вызова: применяются ночным сторожем постфактум, а не в момент написания строки с путём.
Sync-конфликты, зеркала канона, частные копии общего замка, старая копия скрипта при живом фиксе, посылка, откатившая более новый локальный файл. Корень: пять машин + eventual-consistency Syncthing + нет владельца у артефакта. Порождает корень №3 (клобер) как частный случай.
Отсюда — единственный честный вывод по АК-47: следующий шаг не «написать ещё правило» и не «построить ещё сторожа», а починить два уже существующих механизма, которые должны были всё это сдерживать: счётчик классов (корень 1) и вызов ON AIR в момент действия (корень 3). Обе сессии подняты. Остальное — предложения, ждут твоего решения.
selfheal.py (class_slug строка ~639, сравнение в journal_rows).