Рефакторинг рутин: улики, починки, новая механика
хаб A-2022BAYAREA · 22.08.2026 · прогон retro-lost + панель майнеров (12 агентов) + приказ Антона «переработай рутину»
сессий закрыто ретро
10 / 10
очередь 640 → 630
транскриптов смайнено панелью
10 / 12
2 агента отбиты классификатором (transient)
починено корней сегодня
3
n8n-ноды · хук пути · дверь журнала
главный класс спотыканий
6 / 10
прогонов стартовали со сломанного хука
1 · Почему «рутины глючат» — теперь с уликами, а не ощущением
| класс спотыкания | счёт | что это | статус |
| hook-exe-path-unquoted | 6 из 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-correction | 2 случая | дверь журнала поломок молча глотала вторую строку класса (exit 0 без записи) — поправки к своим же строкам исчезали | ✅ починено: печать + exit 3 |
| permission-denied на атомарной записи | 1 | cu_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.py | 27 КБ (мёртвая, ввела меня в заблуждение) против 49 КБ (живая). Правил только живую; слияние — отдельная задача |
🧒 Простыми словами (обновлено вечером): днём мы проверили ощущение «роботы спотыкаются» на двенадцати вчерашне-сегодняшних прогонах. Оказалось, шесть из десяти спотыкались об один и тот же порог у входной двери — я его прибил (кавычки вокруг пути). Твоя идея «споткнулся три раза — зови ремонтника» у нас уже есть, просто роботы стеснялись жаловаться: записывали в журнал только когда умерли совсем. Теперь в конце смены каждый прогон ретро обязан рассказать журналу, обо что спотыкался, а журнал сам вызовет ремонтника после третьей жалобы. Новых роботов не заводили ни одного.
Вечером починили ещё пять поломок в самих сторожах. Самое интересное: сторож, который должен ругаться на кривые команды, ругался на всё подряд — из шестнадцати ругательств четырнадцать были пустыми. Мы научили его молчать про здоровое, и он тут же нашёл два по-настоящему мёртвых помощника, которые молчали неизвестно сколько. А ещё я трижды за день ошибся сам, потому что смотрел на сломанные приборы, и все три ошибки записал рядом с первыми выводами, чтобы они не остались в памяти как правда.