⌂ все дашборды/Правила и канон← Rule-Liveness · Voice-Coverage →

Покрытие тестами: полный рекол + картина + план

Хаб A-2022BAYAREA · собрано 22.08.2026 20:15 · данные: coverage_map 18:00 (сегодня) + регресс-прогон 02:52 + git-археология + 5 RECALL-агентов
1154
живых python-деталей (из 1326; 172 мёртвых)
23.3%
честное покрытие тестами (269 деталей; карта показывает 20.3% - занижает на 35 сценарных)
99%
с документацией (1138)
440
тестов в ночной регресс-сетке
43
красных на хабе (прогон 02:52); у Наташи 72
22
нагруженных деталей (25+ ссылок) без теста

Почему 23%, а не 80: код старше правила

СлойДеталейС тестомПокрытие
Трогались ДО правила 28.07 (наследие)550173%
Трогались ПОСЛЕ правила 28.0760421736%

Вывод: правило «тест при рождении» работает (3% → 36%), долг = наследие мая-июля. Осознанное решение §5.8: задним числом покрываем только живое и только по касанию, «докажи что приживётся» для нового - запрещено.

ЗонаЖивыхС тестомДоляПочему так
~/.claude/scripts (инфра, сторожа)49216834%здесь живёт сетка, тесты рождались рядом
_imports (контент-фабрика, мозг, ДР)6396110%старейший слой, рос быстрее правил
skills (движки скиллов)21314%зона добавлена в карту только 30.07
engine (шина)22100%-

43 красных теста: триаж (важнее процента покрытия)

28
real-fail: настоящие поломки деталей или устаревшие контракты
6
infra-missing: тест не стартовал (нет файла/env)
6
format-drift: прибор отстал от жизни (API сменился)
3
unknown
Чинить первымЧто случилось
_test_stignore_guard + scripts_share⛔ приказ в тесте: «откати .stignore из .bak-doorcut-* НЕМЕДЛЕННО» - риск Syncthing-утечки/потери
registry_dispatch (selftest)кап автозапусков пробит - «ковровая бомбардировка» планировщика сессиями (это же душит 8 застрявших сессий)
_test_publish_canon_unsigned_guardдыра гейта подписи канона: unsigned-over-unsigned проходит (§7.9 safety)
_test_github_lane_freshnessсторож молча гасит тревогу (ложный зелёный) - класс «прибор врёт»
_test_llm_routingклассы orchestrate/voice без второй рельсы в llm_routing.json (приказ 20.08)
_test_memory_index_integrity6 FAIL: индекс памяти разъехался с диском (класс потери данных)

Как мы сюда пришли (рекол: июнь → август)

июнь - тестов почти нет: 2 файла на весь ~/.claude. 25.06 боль Антона: «говорим готово, а сделано на две трети» → рождается идея /tt.
27.06 - построен /tt: обязательный гейт после каждой сборки (живой прогон → сломать нарочно → корень → вердикт с доказательством).
июль - ручеёк: +76 тестов. 17.07 в /tt вшит Codex-ломатель (внешние глаза). 21.07 мандат secondop пирам. 26.07 рельса Grok.
28.07 - ПЕРЕЛОМ. Приказ Антона: тест + док + счётчик на КАЖДУЮ живую деталь. Родились regress_run.py (сетка «смотрит назад») и coverage_map.py (карта). Всплеск: 49 тестов за 4 дня. Той же ночью доказано «тест обязан краснеть на сломанном коде».
30.07 - дыра: 127 скиллов невидимы для карты → зона skills добавлена.
04.08 - дыра: сетка не заходила в hooks/ - 15 тестов гейтов (вкл. security-floor) НИКОГДА не гонялись → 4-й корень, сетка 268.
11.08 - конвейер «тесты пишет чужая подписка» (Codex пишет, мы ревьюим) + приём kill-list: тест обязан назвать, какая правка исходника его роняет; сразу поймал 2 фикции. Хаб hub-testing-breakers.
август - +185 тестов за 22 дня. Сетка 268 → 440. Сегодня: карта 23.3%, красных 43.
22.08 - (сегодня) починен regress_run --help (3-й случай класса «флаг молча запускает работу» → ночная сессия линта на 23:30) + принято правило отпечатка автора §4.9.

🎙 Совет кофаундера

Старый код (550 деталей, 3% покрытия): НЕ бэкфиллить ковром. Тесты на всё подряд = зелёное враньё (фикции без kill-list) + месяцы работы. Вместо этого:
1. Сначала гасим 43 красных - сетка с 10% красноты не ловит новые поломки (alarm fatigue). Порядок: 6 top-fixes из триажа, потом format-drift (чинить тесты), потом infra-missing.
2. Топ-22 нагруженных без теста (secondop 76 ссылок, bus_ping 74, brain_embed_update 73, cron_heartbeat 51...) - закрыть конвейером «Codex пишет + kill-list + мы ревьюим» по 2-3 в неделю. Это 80% риска за 5% работы.
3. Остальные 500+ - только по касанию (правишь → тем же заходом тест, это уже канон §5.8). Не трогаем = не тестируем.
Новая разработка: правила уже стоят и работают (36% после 28.07, а не 3%): тест+док+счётчик при рождении, /tt с ломателем, kill-list, dogfood. Дыра не в правилах, а в протечках гейта: свежие детали без теста всё ещё рождаются (arch_status.py: 13 ссылок, 4 дня, голый). Лечение = отпечаток автора (§4.9, принят сегодня): теперь видно, ЧЬЯ сессия родила деталь без теста, и счёт предъявляется конкретному конвейеру.
Цель на 90 дней: не «покрытие X%», а (1) сетка зелёная или все красные = названные долги, (2) нагруженных (25+ ссылок) без теста = 0, (3) новые детали 100% через /tt.

Новое правило §4.9: отпечаток автора на коде (принято сегодня)

Каждое изменение кода коммитится САМИМ актором с 4 трейлерами:
Assisted-by: Claude Code / Fable 5 · Machine: A-2022BAYAREA · Account: *******vskiy.a2@gmail.com · Operator: anton
Для всех: Claude, Codex, Gemini, Grok, люди. unknown/localhost = нарушение. Авто-бэкап = транспорт, не автор.
✅ Дверь живая: code_provenance_lint.py сторожит 7 git-репо, гоняется ночью (сетка + housekeeping), при нарушении алярмит в 03. Ворота rule_liveness: 🟢 дверь+расписание+потребитель. Первые 5 отпечатанных коммитов уже в истории.

План утверждён 22.08: две видимые сессии подняты

СессияСтартЧто делает
AUTO-hub-260822-red-tests-43сегодня 23:00гасит 43 красных по триажу: safety-первыми (.stignore, кап автозапусков, гейт подписи канона), потом format-drift, потом FileNotFoundError-кластер. Цель: красных ≤15, каждый оставшийся = датированный долг в Breakage-Journal
AUTO-hub-260823-test-conveyor-top22завтра 05:00конвейер «тесты пишет Codex по подписке, мы ревьюим по kill-list»: первая партия 3 детали из топ-19 нагруженных, дальше сама заводит недельную рутину 2 раза в неделю

Потолок сессий проверен: просрочек нет (228 задач в живом файле приложения), обе стартуют.

Рельсы панели ломателей: уточнение 22.08 зашито в код

Было: веер OpenRouter = 5 семей, включая американские gpt-5.6-terra и gemini-3.1-pro ($2/$12 за 1М каждая) - при том что OpenAI у нас есть подпиской Codex, а Google подпиской Gemini CLI.
Стало (твоими словами): codex / grok / gemini живы → идут ПОДПИСКОЙ; Mistral и две китайские → через роутер. Базовый веер OR = glm-5.3 + deepseek-v4-pro (CN) + mistral-large-2512 (EU). Американская семья добирается автоматически и поштучно за КАЖДУЮ смолчавшую подписку.
Замер, который это оправдал (rail_measure 30 дней): 161 прогон панели, авто-фолбэк в OpenRouter 0 раз (codex 66/66, grok 60/60, gemini 55/63), но 92 прогона ушли в OpenRouter вручную - платили за то, чей бак уже оплачен.
Тест _test_orouter_fan.py: 9 кейсов, kill-list проверен двумя мутациями на копии, сетка его видит. Честный пробел назван: для grok имя модели в каталоге OR живьём не сверено - замены нет, не выдумываем.

Дома правила: Библия reglament-otpechatok-avtora-na-kazhdom-izmenenii-koda (MOC вшит) · CLAUDE.md §4.9 (v4.32.0) · память code-change-provenance-stamp · AGENTS.md §1.6-бис (Codex) · docs\agent-protocol.md §Отпечаток · дверь+тест в регресс-сетке. Не публикуется на GitHub Pages: внутренние имена скриптов и падений.