Гейт судил слово, а не дело — класс закрыт
хаб A-2022BAYAREA · сессия auto-hub-260822-repair-gate-substring-not-action · 22 августа 2026, вечер
9строк класса в журнале
05.08 – 21.08
3/3ложных блока из журнала
теперь проходят
5тихих пропусков закрыто
(нашла панель, 2 раунда)
31+6кейсов в двух тестах
4 мутанта убиты
6машин получили посылку
Что болело (простыми словами)
Сторож у двери должен спрашивать «ты запускаешь эту программу?». А он спрашивал «в твоей фразе
встречается это слово?». Поэтому он отбивал запись заметки, где программа просто упомянута,
и пропускал настоящий запуск, если тот записан непривычно.
Корень серии (5 почему по 9 строкам, не по последнему случаю)
Каждый гейт нёс
свою копию вопроса «запускает или упоминает». Каждую копию латали отдельно —
и класс просто перебегал на тот гейт, который ещё не залатали.
Корень:
не было единого ответа «что команда реально исполняет».
Единый ответ — ~/.claude/scripts/_shared/cmd_action.py — построен 20.08 и ужесточён панелью 21.08.
Эта сессия доказала, что он закрывает серию, и зашила последнюю незашитую деталь.
Замер: три названных в журнале ложных блока — живой прогон на хабе
| Случай из журнала | Что это на самом деле | Было | Стало |
| 20.08 · python-heredoc с мемо | запись файла | БЛОК | проходит |
| 21.08 · семь карточек CRM | запись файла | БЛОК | проходит |
| 14.08 · дозапись строки в журнал | запись файла | БЛОК | проходит |
| настоящий запуск сессии | запуск | БЛОК | БЛОК |
| 19.08 · правка файла с именем рутины | правка | БЛОК | проходит |
| 20.08 · греп по файлу рутины | чтение | БЛОК | проходит |
| настоящий запуск рутины | запуск | БЛОК | БЛОК |
Что починено сегодня
| Деталь | Что было | Что стало | Улика |
hooks/av_spawn_guard.py |
судил подстроку: запись заметки и настоящий вызов давали один вердикт. Дыра дремала — на хабе нет Касперского, гейт уходит в stand down |
спрашивает у общего разбора cmd_action; разбор не удался → блок (fail-closed) |
мутант старой логики = красный тест |
| он же, ветка тихих пропусков |
мимо гейта шли настоящие запуски: powershell -c "schtasks /create", абсолютный путь, путь в кавычках |
закрыты разбором действия; /query и /run по-прежнему свободны |
нашла панель ломателей 3/3 за 38с, все три воспроизведены живьём |
scripts/registry_dispatch.py |
лепил taskId с кириллицей, а приёмник spawn_slot_guard берёт только латиницу → сессия не поднималась никогда, очередь считалась поставленной |
транслит из единого источника имён auto_session_name.slugify |
тест импортирует регекс у самого потребителя; мутант = 4 красных |
Сегодня это ударило по самой сессии починки: диспетчер поднимал её руками под ASCII-именем.
Честные границы (названы вслух, не заметены)
| Что не закрыто | Почему так решено |
start /b schtasks /create — общий разбор видит только start |
чинить надо в cmd_action, а не копией в гейте. Строка 1/3 в журнале поломок; по правилу третьей поломки механизм пока не строю |
PowerShell-командлеты (New-ScheduledTaskAction) остались на текстовом якоре |
cmd_action разбирает шелл, а не PowerShell: снятие блока по нему дало бы пропуск настоящего вызова. Тест поймал это сразу |
| Два разных имени задачи могут дать один taskId после транслита |
поведение не новое, ни одного датированного случая нет; выдумывать поломку заранее не буду |
Раскатка на флот
Посылка
substr-gate-action-20260822 зарегистрирована на
6 машин
(хаб, Маяк, MacBook-Anton, MacBook-Ruslana, MyOwnPC-Natalia, ZBOOKG8).
Файлы едут синком (
hooks/** и
scripts/**/*.py в шаре), шаг посылки —
прогнать два теста:
красный тест на узле = там ещё старая версия файла.
Важно: все девять поломок класса случились на Mac16, а чинилось на хабе — поэтому проверка идёт по узлам, а не по хабу.
Ворота качества
| Проверка | Результат |
_test_av_spawn_guard.py | 31/31 · три мутанта убиты |
_test_dispatch_taskid_ascii.py | 6/6 · мутант убит (4 красных) |
_test_blackbox_guard.py | 41/41 |
_test_gates_substring_regression.py | 19/19 |
_test_maintenance_gate_action.py / _body.py | 40/40 · 33/33 |
substr_lint.py по изменённым файлам | чисто |
панель ломателей /secondop t3 | раунд 1 BLOCK → 3 находки закрыты · раунд 2 COUNTER → из 4 находок 2 реальны (дефисный ключ -create, имя задачи со словом create) и закрыты, 2 опровергнуты зелёными тестами |