Суточный оптимизатор CLAUDE.md — кто пишет и чем доказано
Суточный оптимизатор CLAUDE.md — хвост закрыт
06.08.2026, 22:30 · узел ZBOOKG8-2023PAL · задача auto-zbook-260806-claude-md-optimizer-close-tail
Писатель
Маяк
FLEET-ANCHOR, 03:40
CLAUDE.md сейчас
119 459 б
жёлтая зона, 541 б до кэпа
Живой прогон на писателе
−8 738 б
118 058 → 109 320, dry-run
Тест краснеет на сломанном
да
2 FAILED из 9
Кто пишет CLAUDE.md (доказано прогоном на каждом узле)
| Узел | role_class | Пишет? | Расписание | verify читает факт |
| FLEET-ANCHOR (Маяк) | anchor | ДА — единственный | cron 40 3 * * *, enabled | rc=0: 7 файлов + задача включена + регресс-тест зелёный |
| A-2022BAYAREA (хаб) | hub | нет, report-only (запасной) | задача 03:40, Ready | rc=0, DONE-маркер |
| ZBOOKG8-2023PAL (ноут) | peer | нет, report-only | задача 03:40, Ready | rc=0 (канарейка) |
| прочие пиры | peer | нет | не ставим (движок и так едет синком) | — |
Что было сломано и что починено
| # | Дыра (найдена фактом на узле) | Чем кончилось бы | Починка |
| 1 | На Маяке — единственном писателе — не было scripts/llm_ask.py. Движок едет синком в _shared, соседи из scripts/ — нет. | Прогон 03:40 умирал бы с rc=4 «рельса не ответила», жёлтый доклад в 03, файл не тронут — каждую ночь. | Файл доставлен, посылка claude-md-daily-20260806b кладёт его в канонический дом; verify гоняет селфтест, который это ловит. |
| 2 | Писателей стало ДВА: к записи допускался любой узел role_class hub|anchor, а таких два. В 21:39 хаб принял посылку и получил ту же задачу на 03:40. | Два робота правят один always-loaded файл → sync-conflict'ы и затёртые правила (замер 03.08). | writer_node_key() называет писателя поимённо: anchor вперёд хаба; хаб — только если anchor'а нет в реестре. Перехват руками: CLAUDE_MD_WRITER=1. |
| 3 | Ворота входа правила: красная пошлина брала только перелив, а пробы двухфазного гейта стояли в зоне, где запись всё равно ломает кэп. | «Доказал оплату» стоило 359 б, «перепрогнал» — 900 б; файл парковался ровно на кэпе. | Красная пошлина = max(цена блока, перелив) → освободив её, попадаешь в жёлтую, где квитанция даёт exit 0. Селфтест сторожа: было 1 FAILED, стало ALL PASS. |
| 3-бис | Моя же первая редакция п.3 подняла проверку оплаты выше красной ветки — нашла панель ломателей (Grok + Gemini). | Квитанция ПОКУПАЛА бы запись за красную черту: арифметика сходится, файл выше кэпа. | Порядок возвращён: в красной зоне ворота держат всегда, кэп не выкупается. Новый тест «квитанция НЕ выкупает запись за красную черту» — в обоих наборах. |
| 4 | Груз старой посылки нёс ДОфиксовый движок и не доставлял паспорт (apply копировал только *.py в одну папку). | Авто-применение позже откатило бы починку молча. | Груз обновлён до исправленных файлов; новый установщик кладёт 7 файлов в три дома и ставит расписание. |
Тест краснеет на сломанном коде (проверено ломанием, не словом)
Нарочно сняли машинную проверку инвариантов в validate() движка → _test_claude_md_daily.py:
2 FAILED («движок: --selftest ALL PASS» + «задача стоит И ВКЛЮЧЕНА», последняя красная потому,
что её verify тоже гоняет селфтест). Код возвращён → ALL PASS, rc=0.
Членство в ночной сетке доказано списком: regress_run.py --list видит и тест-файл, и встроенные
селфтесты движка и сторожа. На Маяке сетка идёт в 02:40 — за час до оптимизатора.
Нужна ли полная /canon-revision
Нет, не сейчас. Живой прогон на писателе показал, что суточный робот сам снимает
8 738 б (7,4 % файла) — это ниже его же ночного потолка 15 %, значит ночью он поставит правку сам.
Полная ревизия — это когда роботу нечего свернуть.
Порог, при котором зову её отдельной сессией: два прогона подряд с исходом
all-rejected / shrink-cap-hit, либо файл держится выше 118 КБ после двух ночей.
Смотреть: scripts/_claude_md_daily_usage.jsonl.
Остаточные риски (не чинил, называю честно)
· Копия CLAUDE.md на Маяке отстаёт до 30 минут (канон-применитель */30). Оптимизатор
работает в 03:40 UTC, когда флот тих, поэтому риск свернуть устаревшую копию низкий — но он не нулевой.
· Если Маяк умрёт, файл не будет ужимать НИКТО: хаб теперь report-only. Сигнал — сторож
claude_md_guard.py (23:45) и возраст выхода в _claude_md_daily_log.txt; перехват — CLAUDE_MD_WRITER=1 на хабе.
· Панель ломателей: Grok и Gemini ответили и нашли настоящую дыру в моей же правке (учтено выше, п.3-бис) + подсказали сверку md5 при установке (сделано); Codex не уложился в 120 с — его мнения нет, это честный пробел, а не «все согласны».
Паспорта: ~/.claude/scripts/docs/claude_md_daily.md, ~/.claude/scripts/docs/claude_md_guard.md.
Канон: CLAUDE.md §10.0, §10.2, §5.5, §7.3-бис.