⌂ все дашборды/Инфраструктура и рутины← Routine-Rails-Architecture · Routine-Rights →

Рефакторинг рутин: улики, починки, новая механика

хаб A-2022BAYAREA · 22.08.2026 · прогон retro-lost + панель майнеров (12 агентов) + приказ Антона «переработай рутину»
сессий закрыто ретро
10 / 10
очередь 640 → 630
транскриптов смайнено панелью
10 / 12
2 агента отбиты классификатором (transient)
починено корней сегодня
3
n8n-ноды · хук пути · дверь журнала
главный класс спотыканий
6 / 10
прогонов стартовали со сломанного хука

1 · Почему «рутины глючат» — теперь с уликами, а не ощущением

класс спотыканиясчётчто этостатус
hook-exe-path-unquoted6 из 10 прогоновSessionStart-хук звал python.exe по Windows-пути без кавычек → bash съедает бэкслеши → command not found, exit 127 в КАЖДОЙ рутинной сессии хаба✅ починено: кавычки + форвард-слеши, живой прогон exit 0
n8n-telegram-html-parse (3-й случай)15+ паденийлечение от 21.08 само стало болезнью: regex-литерал /<[^>]*>/g ломает парсер выражений n8n; голосовые Антона доезжали только фолбэком✅ починено: new RegExp(...) в обеих нодах-близнецах, 40/40 выражений валидны
journal-door-swallowed-correction2 случаядверь журнала поломок молча глотала вторую строку класса (exit 0 без записи) — поправки к своим же строкам исчезали✅ починено: печать + exit 3
permission-denied на атомарной записи1cu_grants.json: os.replace при занятом файлестрока в журнале, ждёт счёта 3
кривые флаги CLI по памяти2 (мои)bus_send --post вместо bus_ping; dr_registry show которого нетлечится личинкой (ниже)
вывод: «рутина спотыкается» = в основном ОДИН обрыв на старте (хук) + классы, которые никто не записывал. Наблюдение Антона подтверждено машинно.

2 · Решение кофаундера: ЛИЧИНКА, а не рутина-рефакторщица

Твоя идея «если споткнулась 3 раза → отдельная сессия починки» уже построена — это дверь selfheal.py journal + правило третьей поломки (§5.10): дверь сама считает строки класса и сама поднимает сессию починки на 3-й. Сегодня она это делала вживую.

Дыра была в другом: рутины доносили до журнала только СМЕРТЬ. Спотыкания, после которых прогон выжил (кривой флаг, съеденный путь, ретрай, обход), не записывал никто — счётчик 3-х не тикал, грабли жили вечно.

Что вклеено (личинка): шаг 9 в /retro-lost — перед финишем прогон выгружает СВОИ спотыкания дверью журнала, по одной строке на семью. Дальше существующая механика: 3 строки → сессия починки сама. Ноль новых роботов.

Что отклонено и почему: «рутина сама переписывает свой скрипт» — ⛔ самоперезапись на лету запрещена нашим же каноном (implementer не объявляет done сам, §4.4; сторож не живёт в том, что сторожит, §5.5). Переписывает ОТДЕЛЬНАЯ сессия починки от двери — это тот же эффект без само-ревью. Отдельная «рутина-рефакторщица рутин» — дубль менеджера robot-audit-weekly (оргмодель 21.08) и §3.5.

3 · Переработка самой retro-lost (сегодняшним приказом)

былосталозачем
каждый прогон писал одноразовый скрипт-читалкупостоянный прибор retro_lost_extract.py (паспорт+тест+счётчик)ночь не переизобретает рельсу (грабля 21.08 №876)
10 сессий поштучнополе hint в сканере: сессии одной рутины = ОДИН батч, одна заметка, mark-done всемочередь 640 при 10/ночь и окне 25 дней = большинство выпадало из окна неразобранным; батч закрывает 20-30/ночь
приборы на глазчек-лист приборов в шаге 1 (судьба пункта = реестр 10-Tasks, не mtime перевалки; MCP = конфиг Desktop)сегодня кривой прибор чуть не записал в дома ложное «всё сгнило»
спотыкания прогона испарялисьшаг 9: личинка → дверь журналасчётчик 3-х наконец тикает
тень с двумя датами: старт 22.08 → 🌾 урожай 29.08 (Shadow-First-Queue). Критерий: личинка дала строки и ≥1 класс дошёл до починки или опровергнут.

4 · Сегодняшние находки-долги (для твоих рук / решения)

WhatsApp мёртв 52.9 сутокинструмент готов (/whatsapp-pair), нужна 1 минута с телефоном; будильник возвращён на 25.08
7 асков висят непрочитанными (кап 5)очередь 02 забита → канал асков не работает как дверь
Кириллу отчёт отправлен ✅бенч 0.645 vs 0.658, anomaly без объяснимости, phone-home; мяч у него; добросов цифр до 31.08
intention-daily мертва 66чсторож дал дневной рутине недельный порог; карточка P1 заведена

5 · Вечерний заход: починка корней (приказ «почини все корни»)

кореньчто было на самом делепочинка + доказательство
drift-guard fail-OPEN
_shared/cron_watchdog.py
любому НЕзарегистрированному хартбиту молча выдавался самый слабый порог (8 суток). Таких стампов 15, из них 6 суточных по имени ✅ порог выводится из имени (guess_threshold); тест 12/12 + мутация: старое поведение роняет тест в ПРОВАЛ 12
линтер хуков утоплен шумом
hooks_selftest.py
линтер СУЩЕСТВОВАЛ с 20.07, но краснел на любом бэкслеше: 16 срабатываний, 14 ложных → ему перестали верить ✅ судит токены вне кавычек; 16→2 срабатывания, и оба оказались реально мёртвыми хуками (task_card_guard, ack_format_guard — bash отвечал «command not found»). Воскрешены. Тест 16/16 + мутация
рецепт починки WhatsApp мёртв
wa_probe.py
алярм кричал каждый день, но звал нерабочий инструмент (ASCII-QR в консоли, который телефон не берёт) и чужую карточку ✅ рабочий клик-путь (/whatsapp-pair + живая страница QR), своя карточка, цена простоя словами. Дроссель не задет — отпечаток считается по списку проблем, не по тексту
смерть аска невидима
approval.py
статус stale — терминальный и невидимый: аск умирал через 2-4 часа и не всплывал нигде. 528 асков, одобрено 11 (2%), умерло 512 (97%) ✅ очередь печатает смертность канала; устойчиво к битой БД (прогнано на файле-мусоре)
n8n: правка без приёмки
skills/n8n
требовался бэкап ДО и подпись ПОСЛЕ, но ничего не проверяло результат: «PUT 200» ≠ «выражение рендерится» ✅ обязательная валидация + чтение последнего execution; запрет regex-литерала в выражениях с карв-аутом для Code-нод (36 живых)
потерянные дни полосы
intention-daily
полоса НЕ была забыта сторожем — она дважды стартовала и упёрлась в исчерпанный бак подписки (exit 123), повтора нет ◐ кандидаты за 20 и 21.08 добраны (32 и 55). Корень класса — в очереди починки (ниже)

6 · Личинка сработала вживую: класс сам вызвал ремонтника

Класс rate-limit-123-loses-the-day (рутина упёрлась в бак → день потерян навсегда) записан шестью датированными строками — по одной на пострадавшую рутину: intention-daily, token-spend-watchdog, gmail-digest-morning, content-factory-daily, preference-sweep-daily, claudeai-sync.

На третьей строке дверь журнала сама напечатала «⚠️ КЛАСС СИСТЕМНЫЙ», сама завела карточку и сама поставила в очередь сессию починки auto-hub-260822-repair-rate-limit-123-loses-the-day. Без меня и без кнопки Антона — ровно то, что он просил вечером.

⚠️ Честная оговорка: сессия в статусе queued, а потолок одновременных сессий сейчас упёрт (8 задач просрочено, 82 отказа за 90 минут) — она стартует, когда освободится место.

7 · Что НЕ починено и почему (названо, а не умолчано)

publish_canon.py — источник 19 из 19 «ложных» асков неделиправка заблокирована классификатором (скрипт-издатель канона на весь флот = охраняемая зона). Не обходил. Нужно твоё разрешение или отдельная сессия с правами
класс «потерянный день» (retry после сброса бака)точный патч выписан, но правка боевого .cmd доказывается только живым прогоном в 23:20; вслепую ночью — это ровно сценарий «лечение стало болезнью», случившийся сегодня дважды. По канону нужна канарейка
две расходящиеся копии cron_watchdog.py27 КБ (мёртвая, ввела меня в заблуждение) против 49 КБ (живая). Правил только живую; слияние — отдельная задача
🧒 Простыми словами (обновлено вечером): днём мы проверили ощущение «роботы спотыкаются» на двенадцати вчерашне-сегодняшних прогонах. Оказалось, шесть из десяти спотыкались об один и тот же порог у входной двери — я его прибил (кавычки вокруг пути). Твоя идея «споткнулся три раза — зови ремонтника» у нас уже есть, просто роботы стеснялись жаловаться: записывали в журнал только когда умерли совсем. Теперь в конце смены каждый прогон ретро обязан рассказать журналу, обо что спотыкался, а журнал сам вызовет ремонтника после третьей жалобы. Новых роботов не заводили ни одного.

Вечером починили ещё пять поломок в самих сторожах. Самое интересное: сторож, который должен ругаться на кривые команды, ругался на всё подряд — из шестнадцати ругательств четырнадцать были пустыми. Мы научили его молчать про здоровое, и он тут же нашёл два по-настоящему мёртвых помощника, которые молчали неизвестно сколько. А ещё я трижды за день ошибся сам, потому что смотрел на сломанные приборы, и все три ошибки записал рядом с первыми выводами, чтобы они не остались в памяти как правда.