⌂ все дашборды/Задачи и планированиеAntislop-4-Legs-Report →

Корни всех наших проблем

Мета-разбор 144 записей журнала поломок (10.08–22.08.2026) · цифры пересчитаны детерминированно 21:05 после того, как первичное извлечение LLM-агентами завысило счёт втрое · механический корень проверен чтением кода · хаб A-2022BAYAREA, 22.08.2026
Главный факт: 88% наших поломок — это поломки наших же приборов (сторожа, гейты, счётчики, реестры, рутины, задачи), и только 2% — поломки самой работы (посты, лиды, PR, звонки). Мы построили слой наблюдения, который больше и хрупче наблюдаемого. А у счётчика классов, который должен это сдерживать, есть дыра: каждая пятая поломка записана вообще без имени класса и не считается никогда.

Поправка 21:05. Первая версия этой страницы называла 722 поломки, 48/день и «97% классов-одиночек». Это была ошибка: извлечение делали LLM-агенты, и они утроили счёт. Пересчёт самого файла даёт 144 записи, 11/день, 82% одиночек — и, что важно, правило третьей поломки на именованных классах работает (5 классов дошли до порога, покрывают 53% записей). Направление выводов устояло, магнитуды — нет. Инструмент соврал зелёным ровно в том разборе, который эту болезнь и диагностирует.

144поломки за 13 дней
11в день
88%ломаются приборы
2%ломается работа
31записи без имени класса
5классов из 66 дошли до порога

Семьи поломок (детерминированная кластеризация по ключевым словам)

Прибор соврал / промолчал61
Копия вместо одного источника61
Ждём человека / нет принуждения54
Среда не константа (пути, ОС, кодировки)42
Сделал ≠ доставлено / применено30
Детектор судит подстроку, а не действие22
Протухшая правда (кэш, снимок, старый вердикт)20
Лимиты / логины / кончился бак20
Механизм есть, но его никто не зовёт14
Записи попадают в несколько семей одновременно — это карта пересечений, не разбиение. Считалось по тексту «класс + симптом + причина».

1У счётчика классов дыра: каждая пятая поломка записана без имени класса

5 почему: класс не доходит до порога «3 строки» → потому что 31 запись (22% всех) не несёт имени класса вообще → потому что их пишут сессии рукописным буллетом мимо двери selfheal.py journal → потому что дверь честно пропускает буллет без маркера класса (так и сказано в её докстринге) → потому что «назвать класс» это шаг доброй воли пишущего, а не поле, которое кто-то требует.

Что замер подтвердил, а что опроверг. Опроверг первую версию этой страницы: на ИМЕНОВАННЫХ классах правило работает — 5 классов дошли до порога и покрывают 53% записей. Подтвердил: 82% имён всё же одиночки, и в коде сравнение классов точное (class_slug(raw_cls) != class_slug(cls)) — ни словаря, ни сопоставления с существующими. Одна семья под тремя именами живёт как три одиночки: «перезапись чужого живого артефакта» · «package-install-reverts-newer-local-file» · «протухшая копия скрипта при живом фиксе».

Две дыры разной величины: большая — безымянные буллеты (22% вне счёта навсегда); меньшая — точное сравнение имён. Чинить в этом порядке.

Лечение (АК-47, образец в нашем же коде): onair.py уже сопоставляет незнакомые зоны с каноничными через difflib. Тот же приём — на имена классов. Новый робот не нужен: правка одной функции в существующей двери.

сессия поднята: auto-hub-260822-class-counter-blind, 22:30

2Приборов больше, чем работы — слой наблюдения перестал быть АК-47

5 почему: 53% поломок в приборах против 7% в работе → потому что приборов больше, чем работы → потому что на каждую поломку заводится прибор → потому что корень №1 снял тормоз «после третьей» → и потому что у каждого нового сторожа нет цены: он не отвечает за поломки, которые сам породил.

Что это значит буквально: сторож нуждается в стороже, у сторожа сторожа протухает индикатор — и вся эта конструкция ломается чаще, чем то, ради чего строилась. Флот как целое перестал быть чинибельным «молотком и отвёрткой».

Механизм уже есть: оргмодель рутин от 21.08 — у рутины есть мама, приёмник, рельса и цена, а менеджер robot-audit-weekly увольняет сам. Дверь построена, увольнений по факту не видно.

Лечение: добавить в «цену» рутины число строк журнала, которые она породила. Прибор, дающий больше поломок, чем предотвращает, увольняется существующим менеджером. Ноль новых машин.

предложение, сессия не поднята — ждёт решения Антона

3Механизм есть, но его не зовут в момент действия

5 почему: ON AIR существует с 05.07, а перезаписи чужих живых файлов продолжаются → потому что доску читает хук один раз на старте → потому что check --zone в момент правки никто не зовёт → потому что правило живёт в каноне (текст, который надо вспомнить), а действие идёт через инструмент (Write, Bash, create_task) → между знанием правила и моментом действия нет физической связи, кроме моей добросовестности.

Это и есть твоё сегодняшнее указание: наклейка «занято» уже есть и называется ON AIR. Строить второй гейт было бы копией — то есть само по себе нарушением АК-47.

Свой же замер подтверждает шире: 76% свежих правил жили без двери (§8.6, квота «одно правило = одна дверь»), «5 почему» пролежал 42 дня без единого применения.

сессия поднята: auto-hub-260822-clobber-onair-root, 23:05

4Прибор врёт зелёным (180 записей)

Самая большая семья. Краш выглядит как успех, exit 0 при недоставке, сторож рапортует OK на мёртвую ногу, сторож живёт на том же движке, что и объект наблюдения. Механизмы есть — §5.5 (сторож не живёт в том, что сторожит), output_freshness.py, crash-guard except BaseException → exit 4, гейт _test_crash_guard.py. Не применяются к КАЖДОМУ новому прибору при рождении, а только задним числом.

Лечение: ничего нового не строить — сделать crash-guard и «громкий отказ» частью рождения детали (§5.8 уже требует тест + паспорт + счётчик; добавить туда же «докажи ненулевой выход на поломке»).

5Среда не константа (122 записи)

Пути, Windows против POSIX, кодировки, венвы, лимит argv, кавычки в хуках, msys-пути в heredoc. Корень: код пишется под ОДНУ машину, а живёт на пяти разных с тремя ОС. Механизмы есть — лесенка menv, lint_path_hardcode, дрейф-манифест флота. Тот же провал вызова: применяются ночным сторожем постфактум, а не в момент написания строки с путём.

6Копия вместо одного источника (83 записи)

Sync-конфликты, зеркала канона, частные копии общего замка, старая копия скрипта при живом фиксе, посылка, откатившая более новый локальный файл. Корень: пять машин + eventual-consistency Syncthing + нет владельца у артефакта. Порождает корень №3 (клобер) как частный случай.

Корень корней

Мы лечим памятью то, что лечится только руками инструмента. Правило, записанное в канон, — это обещание о будущем поведении, а не механизм. 144 поломки за 13 дней при ~150 КБ канона доказывают: объём правил не коррелирует с надёжностью. Каждое новое правило добавляет нагрузку и не добавляет надёжности, если у него нет двери в точке действия.

Отсюда — единственный честный вывод по АК-47: следующий шаг не «написать ещё правило» и не «построить ещё сторожа», а починить два уже существующих механизма, которые должны были всё это сдерживать: счётчик классов (корень 1) и вызов ON AIR в момент действия (корень 3). Обе сессии подняты. Остальное — предложения, ждут твоего решения.

Честные границы этого замера