Files
portal/tools
Дмитрий 5d7ebb2751 защита: подсказка сессии ВРАЛА про сторожа боевой базы — вылечена, и теперь ложь не молчит
Обход хозяйства правилом 258 («у защиты спроси, сколько у неё тел»), по слову владельца.

🔴 ЗАМЕР ПО ВСЕМУ ХОЗЯЙСТВУ: рабочих папок ДВАДЦАТЬ ТРИ, у каждой своё тело каждой защиты.
Сличены четыре: сторож боевой базы, указатель на живую базу, предкоммитные сторожа, настройки.

| защита | тел | вердикт |
| сторож `prod-db-guard.mjs` | 3 | 🔴 13 папок на САМОМ ПЕРВОМ теле, включая ветку `main` |
| указатель `prod-db-pointer.mjs` | 2 | 🔴 врал дважды (см. ниже) |
| предкоммитные `lefthook.yml` | 5 | 🟢 набор сторожей одинаков везде (21 штука), различия в мелочах |
| настройки `.claude/settings.json` | 2 | 🟢 второе — нарочно своё у работников ночи |

🔴 ЛОЖНАЯ ТРЕВОГА, СНЯТАЯ ЗАМЕРОМ, — НАЗЫВАЮ ЧЕСТНО. У девяти папок (углы работников ночи)
в настройках сторожа боевой базы НЕТ ВОВСЕ. Выглядело страшно. Замерил: `.env` работника
указывает на СВОЮ местную базу (`night_r_..._w_1` на 127.0.0.1), а в его белом списке команд
нет ни `psql`, ни `dropdb`, ни `yc`, ни `curl`, ни `ssh` — дотянуться до боевой ему нечем.
Живого вреда нет. Тонкая стенка одна: `.env` работник править может, но боевую связь взять
неоткуда — чтение соседних папок ему запрещено.

🔴 ГЛАВНАЯ НАХОДКА: ПОДСКАЗКА, КОТОРУЮ СЕССИЯ ЧИТАЕТ ПЕРВОЙ, ВРАЛА ПРО ЗАЩИТУ. Хук
`prod-db-pointer.mjs` печатает в начале каждой сессии, что именно ловит сторож. Он отстал:
  1. называл ПЯТЬ приёмов сноса, а сторож ловит ШЕСТЬ (не назван снос средствами приложения);
  2. хуже — прямо обещал: «ЧЕГО ХУК НЕ ЛОВИТ — на это не полагаться: снос по связи, где имя
     базы не названо». А сторож это ловит с 07.08.

🔑 ВТОРАЯ ЛОЖЬ ХУЖЕ МОЛЧАНИЯ. Смена, прочитав «на это не полагаться», либо сочтёт такой снос
допустимым, либо, упёршись в неожиданный отказ, пойдёт искать обход там, где обхода уже нет.
У знания о защите оказалось ДВА ТЕЛА — сам сторож и рассказ о нём, — и второе отстало молча.
Правило 254 и правило 258 сходятся здесь в одной точке.

СДЕЛАНО:
 · подсказка вылечена (шестой приём назван, обещание пропуска заменено объяснением, как
   писать цель словами, и честной ценой строгости);
 · заведён сторож «подсказка не отстаёт от сторожа»: оба хука зовутся ЖИВЬЁМ (правило 246) —
   сторожу дают команду и смотрят, остановит ли; у подсказки берут ровно тот текст, который
   увидит смена. Читать исходники вместо запуска значило бы зеленеть от примечаний (244);
 · вчерашний сторож «одно тело» расширен с ОДНОГО хука на ОБА: правило 258 спрашивает про
   КЛАСС защит, а не про тот файл, на котором беду поймали. Сам же на этом и попался —
   завёл сторожа на сторожа и забыл про указатель;
 · подсказка в ГЛАВНОЙ папке тоже заменена свежей (не коммичу — чужая ветка).

ПРИЁМКА ВЫРЕЗАНИЕМ, ТРИЖДЫ, И КАЖДЫЙ РАЗ СЧЁТ СОШЁЛСЯ (М-394):
 · до починки ждал 2 красных — вышло ровно 2;
 · вернул врущую строку в подсказку: ждал 1 — вышла ровно 1, с цитатой строки целиком;
 · рассогласовал тела указателя: ждал 1 — вышла ровно 1.

🪤 ТРИ СВОИ ОШИБКИ, КАЖДУЮ ПОЙМАЛ ЧУЖОЙ СТОРОЖ ИЛИ ЗАМЕР:
 1. первый вид датчика ПОКРАСНЕЛ НА ВЕРНОМ ТЕКСТЕ — искал слова `PGDATABASE`/`pgpass` сами
    по себе, а правильное объяснение их законно упоминает. Правил ПРОВЕРКУ, а не текст под неё;
 2. не внёс новую проверку в поимённый список тех, кому живой запуск разрешён, — сторож
    поймал и назвал причину;
 3. набрал СВОЁ число предела времени (`60_000`) вместо общего `PREDEL_ZHIVOGO_ZAPUSKA` —
    сторож покраснел словами «через полгода его никто не сможет объяснить». Он прав.
 4. в счёте проверок ошибся в арифметике: назвал 2987 вместо 2982, посчитав расширение
    прибора с 5 проверок до 7 как +7, а не как +2.

🪤 Чужой прибор `platnyy-zamer-tolko-cherez-schyot` покраснел по истёкшему сроку в двух
прогонах из шести. Замерено: в одиночку он тратит 2,2 с из пяти — запас двукратный, под
полной нагрузкой 112 файлов проедается. Вдвоём с моим новым файлом — зелено, значит дело
не в нём. Плавающая беда от загрузки; перемер закрыл.

Прогон: 2982 проверки в 112 файлах (было 2978 в 111), код 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 14:46:22 +03:00
..
2026-06-17 08:03:35 +03:00