Commit Graph

2010 Commits

Author SHA1 Message Date
Дмитрий 42e06a4e17 робот телеграма: рабочая копия принята в репозиторий + запись о выкате
Хвост, который висел с начала дня: рабочая копия робота на машине
C:\liderra\mts-telegram-robot была НОВЕЕ репозитория. Одиннадцать файлов жили
только там — вся служба bin/sluzhba.js со сторожами, отправщик тревог trevoga.js
и девять тестов. Любой, кто выложил бы репозиторий поверх, снёс бы это молча.

Теперь репозиторий = рабочая копия, файл в файл, сверено побайтово по 50 файлам.
Ничего не потеряно ни с одной стороны: рабочая копия уже содержала и мои
сегодняшние правки, так что перенос вышел без слияния вручную.

Что приехало от соседней смены
- служба bin/sluzhba.js + src/sluzhba-plan.js и три её сторожа
- src/trevoga.js — отправщик тревог, починенный 06.08
- чтение даты старта, пропуск подсказок модерации, слово «Запланирована»
- сторожа: оплата-гейт, шов даты старта, статус «Запущена»

Что уехало туда от меня, ещё утром
- чтение показов: parseStatsRow, setStatsPeriodAllTime, readCampaignStats
- режим read-stats в runner.js, poll-plan.js, bin/poll.js
- сторож сессии ходит С ОКНОМ вместо безоконного браузера

Тесты робота: 239 зелёных.

Документы
- ПИЛОТ.md — запись о выкате телеграм-показов на боевой 07.08 вечером: что
  изменилось для клиента, чем доказано, где бэкапы, чего снять не удалось и
  почему, плюс разбор чужой поломки obzvon_calls того же дня
- список к выкату помечен как исполненный

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-08 05:42:53 +03:00
Дмитрий f28222bc44 docs обзвон: приговор по кладущей половине имени, круг 1 смены 9
Работа круга принята. Имя человека доезжает от портала до ячейки своего звонка
само, без рук: названный довод, один ключ на весь шов, отказ мешку, чистка с
обеих сторон, укладка до первого байта в сторону станции. Стерегут 76 сторожей
шва и 232 пробы робота.

Задача построенной НЕ считается, счётчик не растёт: остаётся 20 из 54. Не хватает
правки настройки станции и снятия замка, и оба куска суть слово владельца, а не
работа.

Свои ошибки называю первыми, их пять.

Шестьдесят восьмая. В своём же промте написал, что набор имя не кладёт. Замерил
двумя приборами: имени не было ВОВСЕ - портал не посылал, приёмник не читал,
набор не знал. Сказал мягче правды.

Шестьдесят девятая. Объяснил прирост прогона соседями и назвал это замером, а моё
же число опровергало мой вывод: девять плюс шесть не равно шести. Судья указал
первой строкой. Дальше вышло хуже: проверить нечем вовсе, число снято с дерева,
которое сосед менял двадцать одну минуту подряд.

Семидесятая. Свою же находку про уборщика имён записал слабее правды трижды:
после оборванного звонка вместо после каждого, не увидел сторожа, который требует
тридцатидневного хранения файла с именем человека, не померил, что подпорки от
самой машины нет.

Семьдесят первая. Вывел с судьёй правило, что прогон годен только по неподвижному
дереву, и через час его нарушил: запустил прогон и разбудил помощника править те
же файлы. Плюс команда снимка дерева сохранила свой собственный текст вместо
чисел, то есть снимка не было вовсе, а выглядел он сделанным.

Семьдесят вторая. Судье подсказал не тот вопрос. Спросил, куда ещё попадает имя,
а правильный вопрос он задал сам: сколько стоит развернуть то, что в журнале всё
таки есть.

Помощник поправил меня четырежды и все четыре по существу. Мост физически не
может увидеть метку иначе как каноническим видом - это он замерил, а я мерил не с
той стороны. Имя обязано входить в отпечаток тела, иначе тот же знак с другим
именем пройдёт молча. Отказ мешку лучше молчаливого выброса, потому что
молчаливый выброс сам есть тихая потеря. И сверх задания он нашёл, что знак и
телефон защищены сегодня только случайностью порядка кусков.

Судья, заведённый сразу после первых находок, дал улов крупнее всех рабочих
кругов. Разбил мою точку отсчёта. Нашёл дыру в свежей постройке: свободный мешок
вёз имя мимо чистки, а над этим местом стояло наше же обещание, что это
невозможно. И назвал вопрос, которого за смену не задал никто.

Мой нож резал четырежды. Уборщик просроченных имён: следующего звонка нет - имя
живого человека остаётся, двадцать пять несостоявшихся звонков - лежат все
двадцать пять. Сторож сторонних библиотек показан красным двумя проверками, и
названная им цена проверена отдельно. Замазка имени в журнале дырявая на именах с
беглой гласной и на другом регистре, четыре протечки из семи. Доделка мешка -
шесть красных из семидесяти шести, среди них чужой сторож, которого не нашли ни
я, ни судья.

Числа моей рукой. Полный прогон по неподвижному дереву, снимки до и после
сошлись: 5400 проверок, 5396 зелёных, 4 пропущено, красных 0, арифметика сходится.
Это четвёртый прогон смены и первый годный: первый снят на движущемся дереве,
второй словил пять ложных красных от приехавшего слияния с главной, третий я
остановил сам. Сторожа шва 76 при 221 утверждении. Пробы робота 232, 64 и 27.
Сторожа машины 26, 27, 23 зелёные, текстовый след одна красная, обход две - те
же, что до работы, и обе датчики невыката.

Три вещи вынесены владельцу и здесь не лечатся: знак задания обратим вопреки
записанному в коде слову необратим, имя из карточки лида подставляется внутрь
наставления Лене и наш же сторож закрепляет отраву как годную, замок и починка
станции не связаны ничем.

Ничего не пушено и не выкачено. На машину робота не ходили с правками.
2026-08-07 19:40:03 +03:00
Дмитрий 802cc9a1d8 fix обзвон: нож с обеих сторон по мешку — и чужой сторож переписан, не снесён
Замерено чтением, а не рассуждением: тело робот читает СТРОГО — шесть
поисков по словарю без приведения регистра; приведение есть только у
заголовков и у слов станции. Значит ключ другим регистром робот не прочтёт
никогда, и отказ портала обращает тихую потерю в громкую, а не отвергает
годное.

На это заведён сторож с роботной стороны: имя, названное в задании другим
регистром, именем не считается. Научат робота читать нестрого — сторож
покраснеет, и портал поправим вслед.

Чужой сторож «мешок не может перебить знак или номер» проверял своё
свойство через ушедшее тело и после починки падал ошибкой. Не снесён:
свойство верное, моё правило его усиливает — переписана только охрана,
вторая половина по-прежнему проверяет, что чужие поля мешка доезжают.

В отчёт дописан новый раздел, старое не переписано.

Числа: проба приёмника 232, имя за звонок 64, мост 27, сторожа шва 76 —
красных и ошибок нет нигде. Новых сторожей ронял тремя порчами: 6, 1 и 4
красных. Полный прогон не запускал — его делает координатор.
2026-08-07 19:03:21 +03:00
Дмитрий 4a68609837 Merge branch 'main' into feat/prospects-manual-testing-kp
# Conflicts:
#	docs/observer/STATUS.md
2026-08-07 18:04:49 +03:00
Дмитрий 75eed53408 docs обзвон: своя ошибка первой — два полных прогона по одной базе разом
После обрыва смены счёл первый прогон погибшим и пустил второй. Первый был
жив: замер по процессам показал два прогона, оба били в одну базу. Оба
числа были бы ложью.

Заодно поймана вторая ложь того же места: обёртка отрапортовала по обоим
убитым прогонам «выход 0» при коде 127 и без единой итоговой строки.

Вылечено: процессы сняты по номерам, чужие серверы не тронуты, база снесена
явным словом и проверена, заведена заново, промигрирована.

Вписан и второй повод, по которому имя сегодня НЕ доедет до человека:
на машине робота набор стоит «net», значит кладущая рука не зовётся вовсе —
ещё до всякой правки станции.
2026-08-07 17:46:29 +03:00
Дмитрий 6897e2aa43 docs обзвон: отчёт смены — постройка, восемь порч, зовущие поимённо
Вписано: что построено файлами, чем ронял каждого сторожа и что он сказал,
слепки возврата, числа проб, соседи, свои ошибки первыми и что осталось
несделанным.

Числа полного прогона допишутся отдельно — он ещё идёт.
2026-08-07 17:39:07 +03:00
Дмитрий dc4d835b73 телеграм-реклама: клиент видит отчёт, управление и показы
Клиент после создания рекламы был слеп: ни отчёта, ни причины отказа проверки,
ни способа что-то изменить. Закрыто.

Что теперь видит клиент
- слова «МТС» на клиентских экранах больше нет — он покупает рекламу в Телеграме
- на карточке: увидят рекламу, зарезервировано, списано, показов, кликов, подписались
- кнопки «Отчёт», «Отменить», «Повторить эту рекламу»
- отчёт даёт ПОЛНЫЙ текст причин отказа проверки, дословно
- пересдача принимает новый заголовок и новую картинку
- вердикт проверки уходит клиенту письмом, а не только в колокольчик

Показы читает робот
- новый режим read-stats: список кабинета, срок «За всё время», строка кампании
- разбор строки С КОНЦА: начало ряда плавает, хвост из 12 колонок постоянен
- прочерк площадки значит «не знаем», а не ноль, и различие доезжает до экрана
- пять колонок stats_* в client_tg_campaigns, запись v9.73 в журнале схемы
- опросчик PollTelegramStatsJob раз в час

Закрыто по дороге, сверх заказа
- утечка: закупочная цена mts_cost_rub уезжала клиенту в браузер, из пары с
  actual_cost_rub наценка считалась вычитанием
- расход площадки stats_spend_rub скрыт по той же причине
- кабинет пишет «Запущена», робот такого слова не знал: кампания висела на
  проверке навсегда, хотя реклама уже шла и деньги площадки тратились
- в runner.js висел неразрешённый конфликт слияния — робот не запускался вовсе
- сторож сессии ходил БЕЗ окна, а работа робота ходит С окном: сторож ловил отказ
  там, где работа проходила, и слал письмо каждый час о беде, которой не было
- текст отказа больше не советует менять адрес выхода — совет был ошибочный и
  увёл целую смену на поиск блокировки, которой не существовало

Замеры
- Pest tests/Feature/ClientTg 396 зелёных, смежные области 97 зелёных
- тесты робота 182 зелёных, Larastan 0 ошибок
- Vitest tests/Frontend 2231 зелёный; 5 падений кошелька — чужие, были до этого
- сторожа проверены КРАСНЫМ: подсунутые ошибки красят их, возврат кода зеленит
- живая проверка чтения цифр на настоящей кампании кабинета

П-8 «Остановить» не входит: владелец запретил нажимать «Завершить» в кабинете,
а без этого неизвестно, что она делает с деньгами.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 17:24:58 +03:00
Дмитрий 2ecfc2a562 docs обзвон: разбор задания перед постройкой — чем называть ячейку
Замерено: мост берёт метку только каноническим UUID, а нынешний номер
звонка UUID не является. Значит ячейку называем каноническим видом того же
самого uuid, из которого сложен номер звонка, — одно рождение, два вида.

Записан отказ писать в общий запасной файл и цена отпечатка тела.
2026-08-07 16:46:23 +03:00
Дмитрий d2c5675cf7 docs обзвон: скелет отчёта помощника — кладущая половина имени
Заведён каркас отчёта смены 9. Пишется по ходу работы, чтобы
несохранённое не сгорело при обрыве.
2026-08-07 16:39:48 +03:00
Дмитрий 7b54146292 docs обзвон: конец смены 8, промт смене 9 с поправками к своему же прежнему промту
Смена 8 закрыта. Два круга: набор номера построен целиком, имя за звонок построено
наполовину. Задач стало 20 из 54.

В промте смене 9 поимённо названы ТРИ неверных места промта смены 8, и все три мои.

Первое и самое дорогое. Промт смены 8 говорил, что задачу про имя за звонок брать
нельзя, только пробы в отдельное окно. Прочитал решения владельца дословно: они отложили
ПРОБЫ, а не постройку. Из-за этой строки цепочка из трёх задач простояла запертой:
перевод на менеджера начинается только после этой задачи, а на переводе стоят предел
разговора, два плеча, тариф и половина исходов.

Второе. Порядок работ ставил вторым делом предел разговора. Брать его нельзя вовсе:
отсчёт идёт от соединения с менеджером, которого в роботе нет ни одним словом.

Третье. Число требований в промте не выходило ни из одной команды: живых 111, а не 112.

Заведены три правила сверх тридцати трёх. Отложенная проба не есть отложенная постройка,
и решение владельца читается дословно в протоколе, а не в пересказе промта. Замерил что
дорога есть - замерь, можно ли по ней проехать. Зелёная проба сама по себе не доказывает
ничего: одну и ту же поломку одна проба поймала шестью проверками, а вторая осталась
зелёной.

Прибавилось пять вопросов владельцу: короткие служебные номера проходят набор, имя
человека после оборванного звонка лежит на диске час, кто хозяин выбора номера при
стройке техники связи соседней сменой, открывать ли дорогу на машине, и задвоенные
номера решений Р116-Р127 между двумя протоколами.

Мест, ждущих выката, стало восемь.

Датчики: разметка обеих бумаг 0 ошибок, все ссылки промта проверены на существование,
команда чтения метода запускалась моей рукой в начале смены.
2026-08-07 15:50:48 +03:00
Дмитрий 093ae0e04f docs обзвон: приговор по имени за звонок, первая половина З-0.1
Круг 2 смены 8 принят. Имя того, кому звонят, больше не лежит одним файлом на всю
машину: у каждого звонка своё, взятие неделимое, метка проверяется на годность, есть
замок на число линий и уборщик просроченных имён. Беда, из-за которой живого человека
уже назвали чужим именем, закрыта в коде и показана красной на старом порядке.

Задача НЕ считается построенной целиком, и счётчик не растёт: остаётся 20 из 54.
Не хватает трёх вещей, все названы помощником самим. Кладущей половины нет - набор имя
никуда не кладёт. Настройка станции не поправлена, она отдаёт всем звонкам одну метку.
Замок остаётся на одной линии, значит требование о трёх линиях сегодня не в силе.

Мои ошибки называю первыми, их две.

Шестьдесят шестая, и она стоила стройке нескольких смен. В промте смены 8, который писал
я, сказано что З-0.1 брать нельзя, только пробы в отдельное окно. Прочитал решения
владельца дословно: Р96 отложил ПРОБЫ задачи, Р101 назвал условие для проб. Ни одно не
запрещает строить. Я прочитал отложены пробы как задачу не брать и записал это запретом.
Цена видна по цепочке: предел разговора стоит на переводе на менеджера, а тот начинается
только после З-0.1 и З-0.2, и З-0.2 построена ещё пятого августа. Вся цепочка упиралась в
одну задачу, которую я сам объявил незаходимой. И вторая половина той же ошибки: порядок
работ ставил вторым делом предел разговора, а его брать нельзя вовсе - отсчёт идёт от
соединения с менеджером, которого в роботе нет ни одним словом, замерено двумя приборами.

Вторая, повторная. Имя нужной части кода в своём ноже выдумал вместо того чтобы взять из
файла, и прибор упал на первом запуске. Это ровно ошибка пятьдесят шестая прошлой смены.

Помощник разобрал задание и поправил меня четырежды, все четыре по существу. Главное:
буквальное исполнение плана было бы ПЛАЦЕБО. Метка у станции константа, значит файл
названный по номеру звонка дал бы один файл на все звонки, и беда переехала бы в файл с
другим именем, выглядя вылеченной. Второе: метка приходила позже, чем нужна - мост брал
имя раньше, чем узнавал чей это звонок. Третье: замок на линии не заодно, он
единственное что защищает человека сегодня. Четвёртое: номер звонка из круга 1 по форме
меткой не годится, но нутро то же и превращение однозначно.

Мой нож. Сломал проверку годности метки - ту, без которой лечение плацебо. Его первая
проба покраснела шестью проверками, возврат доказан слепком со снятием невидимых знаков,
сошлось знак в знак. Побочно: вторая его проба на той же поломке осталась ЗЕЛЁНОЙ.
Записал, чтобы следующая смена не считала любую зелёную пробу доказательством.

Вырезание второго рода, случай объявленный мной ДО работы. После ОБОРВАННОГО звонка файл
с именем живого человека остаётся на диске, срок хранения час. Проверка два задачи
требует чтобы файл после конца звонка исчезал и имена людей не копились: для нормального
конца исчезает, для обрыва лежит до часа. Не дыра, а названная цена, но имена это
персональные данные и час их жизни должен быть решением владельца. Выношу, сам не
закрываю.

Датчики: полный прогон моей рукой 5361 проверка, 5357 зелёных, 4 пропущено, красных 0,
арифметика сходится. Девять проверок сверх точки отсчёта НЕ наши - замерил вторым
прибором, в дереве несохранёнными лежат семь изменённых и три новых проверочных файла
соседней смены телеграма. Пробы робота 43, 27 и 179, красных нигде. Сторожа машины 26,
27, 23 зелёные. Сторож текстового следа краснеет одной проверкой, и это правильно: мост в
хранилище починен, а на машине лежит старый, выката не было.
2026-08-07 15:46:54 +03:00
Дмитрий 21c59d6188 docs обзвон: числа полного прогона и проб робота в отчёт по имени за звонок
Портал 5361 проверка, 5357 зелёных, 4 пропущено, красных 0; девять лишних
против точки отсчёта — несведённая работа соседней смены, не моя. Пробы
робота: мои 43 и 27, прежние 23, 179, 26 и 27 — красных нигде нет.
2026-08-07 15:16:54 +03:00
Дмитрий 461d6fa84d docs обзвон: отчёт по имени за звонок — построенное, сторожа, вырезание
Десять вырезаний защит, девять покраснели сразу, десятое вскрыло дыру в охране
и потребовало дописать сторож. Старый порядок краснеет с первой же тройки:
11 чужих имён из 36 звонков. Названо вслух, чего круг не доказывает и что
осталось незакрытым, включая связку выката imya_zvonka.py вместе с most.py.
2026-08-07 15:02:19 +03:00
Дмитрий cc802fadbc docs обзвон: разбор задания и замеры до работы
Четыре возражения по существу: буквальное исполнение плана даёт плацебо,
метка приходит позже, чем нужна, запасной общий файл возвращает беду,
номер звонка по форме меткой не годится.
2026-08-07 14:16:35 +03:00
Дмитрий da9d977aa1 docs обзвон: заведён отчёт помощника по имени за звонок
Скелет разделов, дальше пишется по ходу работы.
2026-08-07 14:01:05 +03:00
Дмитрий aaf339b03c docs обзвон: приговор по набору номера, З-0.12 построена, стало 20 из 54
Круг 1 смены 8 принят. Робот вправду просит станцию набрать номер: приёмник открывает
короткое соединение к служебному входу, входит и просит начать исходящий звонок через
раздел набора, а снятую трубку станция отдаёт разговорному разделу. Диалплан не тронут -
оба раздела в нём уже были, проверено и в хранилище, и на живой станции.

Резал СВОИМ ножом, шесть случаев, каждый отдельным процессом: кривой знак задания,
ответ станции без метки, ответ с чужой меткой, знакомый отказ, обрыв связи посреди
просьбы, два задания на один номер. Все шесть отработали как должно. Вырезание первого
рода: сломал его лечение своей рукой - покраснели четверо его сторожей и мой нож на том
же месте. Возврат доказан слепком со снятием невидимых знаков, сошлось знак в знак.

Вырезание второго рода дало находку, которой не резал никто. Допущение объявлено мной
ДО работы: номер из цифр длиной от трёх до двадцати - годный телефон. Случай мимо:
короткий служебный номер. Замерено на настоящем коде - приёмник соглашается попросить
станцию набрать 112, 911 и 102. Чего НЕ замерял и замерять нельзя: дойдёт ли такой
звонок до настоящей экстренной службы. Выносится владельцу, сам не закрываю.

Мои ошибки называю первыми, их три.

Шестьдесят четвёртая. В промте смены 8, который писал я, стоит спека 112 требований, и
над таблицей написано что числа собраны командой. Это число не выходило ни из одной
команды: прибор из промта даёт 98, полный перечень меток 114, живых требований 111.

Шестьдесят пятая. В задании помощнику назвал служебный вход станции годной дорогой,
замерив только что он ЕСТЬ. Замерил после: учётных записей ноль, веб-вход выключен,
папка заданий закрыта правами. Все три дороги заперты, открытие любой - правка живой
машины и слово владельца. Поправка помощнику отправлена со своей ошибкой первой строкой.

Третья, помельче. Мой собственный нож соврал на первом запуске: подставная станция
принимала одно соединение, а набор открывает новое на каждый звонок. Второй звонок
получил станция промолчала, и это выглядело бедой проверяемого. Беда была моя.

Помощник разобрал задание и поправил меня трижды, все три раза по существу и все три
поменяли постройку. Главное: у станции два способа начать звонок и они значат
противоположное. При способе дождись конца ответ не принял значит человек не ответил, а
набор при этом БЫЛ - и портал позвонил бы человеку второй раз. Взят способ не жди.
Второе: всё что не принял считать отказом нельзя, список знакомых отказов белый. Третье:
я не назвал вход, через который течёт беда - перевод строки внутри номера превращает
одну просьбу станции в две, вторую на любой номер.

Приговор ПРИНЯТО с четырьмя оговорками, все названы мной, а не найдены потом. Живого
звонка не было и быть не могло. Дорога на машине заперта, это седьмое место ждущее
выката. Короткие служебные номера проходят. И номер, С КОТОРОГО звоним, набор не
выбирает и не сообщает - он зашит одной строкой в настройке станции.

Датчики: полный прогон моей рукой 5352 проверки, 5348 зелёных, 4 пропущено, красных 0,
арифметика сходится, ровно точка отсчёта. Проба робота 179 из 179, было 108. Разметка
обеих бумаг 0 ошибок. Построено стало 20 из 54.
2026-08-07 13:44:16 +03:00
Дмитрий ab59bd277c docs обзвон: числа полного прогона в отчёт помощника
Своя база, вывод в файл, датчик — числа, а не код возврата.
Зелёные 5348 + красные 0 + ошибки 0 + пропущенные 4 = всего 5352 —
ровно точка отсчёта. Проба робота 179 из 179, шестнадцать прогонов подряд.

Слепки обоих моих файлов кода после прогона совпадают с коммитом
со снятием невидимых знаков конца строки: во время прогона их никто
не переписывал.
2026-08-07 13:15:27 +03:00
Дмитрий 1855fe126e docs обзвон: отчёт помощника — постройка, сторожа красными, вырезание, ошибки
Записано по ходу, пока полный прогон идёт. Внутри: почему станцию просим не
ждать конца звонка, почему список знакомых отказов белый, шесть поломок с
дословными словами покрасневших сторожей и слепком возврата, перепись
зовущих глазами с четырьмя ловушками счётчика, и три моих ошибки первыми —
включая ту, где мой же сторож остался бы зелёным при живой дыре.

Раздел про полный прогон дописывается отдельно, когда прогон кончится.
2026-08-07 13:02:37 +03:00
Дмитрий e06606244f docs обзвон: разбор задания и замеры до работы по набору номера
Замерено своей рукой: проба приёмника даёт 108 проверок и ноль красных;
в диалплане уже есть оба нужных раздела, поэтому узкое горло трогать не
понадобится. Названы три места, где я с заданием не согласился, и почему
это меняет постройку.
2026-08-07 12:13:44 +03:00
Дмитрий 21ff2cd5db docs обзвон: заведён отчёт помощника смены 8 по набору номера
Скелет разделов заведён до всякой разведки, чтобы записи не сгорели вместе
с контекстом. Дальше файл наполняется по ходу работы, а не в конце.
2026-08-07 12:07:49 +03:00
Дмитрий 7f7c752c96 docs обзвон: приговор по запрету переадресации, конец смены 7, промт смене 8
Круг 2 принят. Дыра, которой никто не искал, закрыта во всех пяти построениях запроса
четырёх файлов. Замерено МОИМ ножом, тем же, каким находилась: на трёх плечах отдельным
запуском, включая пачечное плечо боевого Поиска клиентов, до неразрешённой машины не
доехало ничего.

Датчик проверен на БОЛЬНОМ случае, а не только на здоровом: снял запрет в одном месте,
утечка вернулась вместе с зелёной плиткой и чужим адресом на ней, двое его сторожей
покраснели на моём сломе. Возврат доказан слепком со снятием невидимых знаков.

Вырезание второго рода: допущение лечения - запрет стоит на КАЖДОЙ отправке. Собрал
отправки командой по всем четырём файлам: их пять, запрет на каждой, перечень полон.

Мои ошибки называю первыми, их две новых.

Шестьдесят вторая. Мой прибор копит улики в файл, а я перед замером проверял живость
подставной машины СВОИМ ЖЕ запросом - и он записался туда же. Первый замер после починки
показал утечка есть. Спасло только то, что я посмотрел, ЧТО ИМЕННО доехало: там стоял curl
и не было заголовка с ключом.

Шестьдесят третья. Числа полного прогона вписал в свою бумагу из отчёта помощника, пока
свой прогон ещё шёл. Сошлись знак в знак, но это удача, а не порядок: первое правило метода
гласит, что отчёт помощника не доказательство, и своей бумагой я его нарушил. Дождался
своего.

Помощник поправил меня по существу трижды и все три раза был прав: мест не четыре, а пять,
дверь голосового робота в бою не зовёт никто, и есть пятое место того же класса, у которого
двери нет вообще. Он же снял мою ложную тревогу: всё, что возит секрет через Authorization,
этой болезнью не больно, библиотека снимает такой заголовок сама.

Промт смене 8 написан. В нём поимённо названы ЧЕТЫРЕ неверных места промта смены 7, три из
них мои ошибки, и самое опасное: я назвал чужим файл, который был работой нашего же
помощника. Исполни следующая смена мой промт дословно, починка сгорела бы.

Датчики: полный прогон моей рукой 5352 проверки, 5348 зелёных, 4 пропущено, красных 0,
арифметика сходится. Разметка 0 ошибок. Задач 54, построено 19, требований 112, решений 127.
2026-08-07 11:13:01 +03:00
Дмитрий 8d96cda70b docs: в отчёт смены вписаны номера обоих коммитов
Чтобы файл читался сам по себе, без обращения к истории.
2026-08-07 10:39:39 +03:00
Дмитрий 171f531b61 docs приёмка: Т-М2 закрыта — живое одобрение МТС с движением денег
07.08 в 10:31 МТС одобрил кампанию №15. Числа сошлись с посчитанными ЗАРАНЕЕ
до копейки: кабинет взял 182.40, наценка 1.4 → списано 255.36, остаток 13.44
отпущен в ту же секунду, баланс 9869.50 → 9614.14, заморожено → 268.80.

Одобрение чуть не потерялось: кабинет написал седьмое слово «Запущена», словарь
робота знал шесть. Снаружи это неотличимо от «вердикта нет» — вскрыли, заглянув
в кабинет разовой пробой на чтение. Чинились ОБЕ половины (разбор и поиск ряда),
как предупреждает комментарий в коде; сторожа на обеих, тесты робота 202 → 206.

Непроверенной во всём блоке осталась одна вещь — живая половина пересдачи Т-М4:
для неё нужен свежий отказ МТС, а кампания одобрена.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 10:39:25 +03:00
Дмитрий 9ba2a6a49b fix(безопасность): за переадресацией не ходим — тайный ключ больше не уезжает чужому
Дверь проверяет адрес из настройки. Если разрешённая машина отвечает «иди на
другой адрес», перевозчик по умолчанию туда идёт и везёт наш заголовок дальше:
при уходе на чужой адрес Guzzle снимает только Authorization и Cookie, а
X-Render-Key и X-Obzvon-Key не из них.

Замерено до правки на подставных машинах: ключ рендера доехал до неразрешённой
машины из ленты Яндекса, из поиска клиентов одиночным запросом и пачкой, из
плитки прокси — и плитка при этом горела зелёным, показывая ЧУЖОЙ IP как свой.
Ключ голосового робота уезжал вместе с заданием.

Поставлен withoutRedirecting в пяти строениях запроса четырёх файлов. У
SelfRenderClient их два: пачка строит запрос сама, и запрет из одиночного пути
туда не доезжает — проверено вырезанием, снятие запрета только с пачки роняет
отдельного сторожа и даёт по утечке на каждый адрес порции.

Новых настроек не заводил: тумблер «сюда переадресовывать можно» и был бы той
дырой, ради которой запрет ставится.

Сторожа: app/tests/Feature/Security/KlyuchNeEdetPoPereadresaciiTest.php, 8
проверок, смотрят на запись переговоров, а не на текст исходника. Каждый показан
красным снятием своего запрета по одному. Отдельная проверка «датчик сам жив»
падает, если подставная сеть перестанет ходить за переадресацией, — иначе
остальные сторожа молча стали бы пустыми.

Отчёт смены: docs/superpowers/priyomka/stroyka-7/otchyot-pomoshchnika-zapret-pereadresacii-2026-08-07.md

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 10:37:22 +03:00
Дмитрий cc9a1a91a7 docs: заведён отчёт смены по запрету переадресации с тайным ключом
Скелет разделов. Пишется по ходу работы, чтобы не сгорело при обрыве.
2026-08-07 09:38:26 +03:00
Дмитрий 459947f76b Р126 третья дверь: работа оборванного круга сохранена и принята, дыра переадресации найдена
Круг смены 6 оборвали средой, работа помощника лежала в дереве несохранённой и её снёс бы
первый же чужой откат. Замерил целостность, прочёл его отчёт, прогнал своей рукой, вынес
приговор. Заново ничего не переделывал.

ПРИНЯТО. Третья и последняя дверь с ключом рендера закрыта той же проверенной дверью.
Список разрешённых машин общий с рендером и это доказано работой, а не доводом. Закрытая
дверь красит СЕРЫМ, а не красным, и ключ при этом физически никуда не уходит, замерено мной
двумя случаями по отдельному запуску на каждый.

Помощник сверх задания нашёл и починил ложь, которой никто не искал: подпись плитки называла
серый словами не отвечает, то есть гнала владельца продлевать исправные прокси.

Мои ошибки называю первыми, их три.

Пятьдесят девятая. Я назвал adminDashboardHelpers.ts чужим файлом соседней смены прямо в
промте смене 7, в списке не трогать и в коммит не брать. Взял из головы, не замерив. Вся
правка в этом файле - работа моего же помощника. Исполни следующая смена мой промт дословно,
починка подписи плитки не попала бы в коммит и сгорела.

Шестидесятая. Мой снимок оборванного круга был неполон: записал шесть файлов, их семь.
Перечень собрал командой, но раньше, чем помощник закончил, и не перемерил перед тем, как
назвать его окончательным.

Шестьдесят первая. Мой датчик прогона искал не то слово и я чуть не объявил состоявшийся
прогон несостоявшимся. Спас узкий прогон, которым я прибор перепроверил.

Вырезание второго рода дало дыру. Допущение защиты: дверь проверяет адрес из настройки и
считает, что запрос уйдёт именно туда. Случай мимо: разрешённая машина отвечает иди на другой
адрес. Замерено на двух подставных машинах: тайный ключ уехал на машину, которой в списке
разрешённых НЕТ, а плитка осталась ЗЕЛЁНОЙ и показала чужой адрес как свой. Перемерил на
живой двери боевого Поиска клиентов тем же ножом, отдельным запуском - то же самое. Причина
прочитана в исходнике библиотеки: при уходе на чужой адрес снимаются только два заголовка,
и нашего среди них нет. Вторым прибором замерено, что отключения переадресации нет нигде во
всём боевом коде. Это не отменяет Р126, дверь делает обещанное на своих случаях, но обещание
шире дела и про это не сказано нигде. Отдельным кругом.

Датчики: полный прогон моей рукой на своей базе 5344 проверки, 5340 зелёных, 4 пропущено,
красных 0, арифметика сходится. Проверки интерфейса 3 из 3. Разметка 0 ошибок.
2026-08-07 09:29:23 +03:00
Дмитрий 61182a1c55 docs обзвон: конец смены 6, проверка расписания закрыта живьём, круг 7 оборван
Смену остановил владелец. Довожу до логического конца.

Проверка 1 задачи З-0.10 закрыта ЖИВЬЁМ. Доказать её раньше 02:20 ночи было
нечем, я записал замену и назвал вслух, чего она не доказывает. Дождался и
замерил: 07.08.2026 в 02:20:01 машина робота обошла своих сторожей САМА, без
человека, за две секунды, все три зелёные, итог лёг со своей датой. Уборка
записей чужих голосов перестала зависеть от человеческой памяти, и это замерено,
а не обещано. Журнал того же обхода честно говорит отправка не настроена:
портальная половина не выкачена, и краснота одной проверки из 42 у сторожа обхода
и есть датчик завершённости выката.

Круг 7 оборван на середине. Помощник закрывал третью дверь с тем же тайным ключом
и не успел сохранить работу коммитом. Файлы перечислены поимённо в промте смене 7,
раздел 3.2, вместе с порядком: замерить целостность, прочесть его отчёт, прогнать
своей рукой, вынести приговор, НЕ переделывать заново. Приёмочный лист по этому
кругу не заведён, и это записано.

Итог смены. Задач 54, врезок ПОСТРОЕНО 19, требований 112, решений владельца 127.
Полный прогон 5301 проверка, 5297 зелёных, 4 пропущено, красных 0.

Мои ошибки: их одиннадцать, с 48 по 59, и все одного класса, прибор мерил не то,
о чём я спрашивал. Тяжелейшие три. Пятьдесят пятая: построил главный довод
задания на ложном замере, назвав упоминания зовущими. Пятьдесят восьмая: назвал в
задании одну дверь с тайным ключом, а их оказалось три. Пятьдесят девятая: вынес
владельцу цену решения, взятую из головы, а не из замера.

Правил стало 30, шесть добыты этой сменой.
2026-08-07 08:41:29 +03:00
Дмитрий 0bf43bfd1f docs приёмка: Я3 и Я4 закрыты по сроку — последние комбинации Яндекса 2026-08-07 08:38:44 +03:00
Дмитрий 8167dc7d79 docs приёмка: Я3 и Я4 закрыты по сроку — последние комбинации Яндекса
Срок обеих кампаний истёк 07.08 в 00:00 UTC, портал сам закрыл их и вернул
неоткрученное. Числа сняты с боевой базы, арифметика сходится до копейки:
833.50 - 9.00 = 824.50 и 833.50 - 40.50 = 793.00.

Я-Д5 воспроизвёлся трижды за четыре секунды на разных суммах — возврат по сроку
работает не по случайности.

Предсказание сбылось наполовину: Я4 обещали ~160 показов, вышел 81; Я3 обещали
ноль, вышло 18. Скорость по одному часу для суточного предсказания не годится.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 08:37:58 +03:00
Дмитрий d7b77d25f2 docs обзвон: приговор по восьмёрке в номере, цена решения названа честно
Решение владельца Р127 исполнено коммитом 56ddaa1e. Мой нож замерил: восьмёрка и
семёрка дают теперь ОДИН знак и ОДНО тело, границы держатся, семизначный и
тринадцатизначный номера не тронуты, казахстанский со своим знаком, и правило
устойчиво к повторному приведению.

Моя ошибка первой, пятьдесят девятая. Вынося развилку владельцу, я написал, что у
одиннадцати цифр с восьмёркой второго толкования нет. Я взял это из головы, НЕ
ЗАМЕРИВ. Второе толкование есть: иностранные номера длиной ровно одиннадцать
цифр с кодом на восьмёрку. Большинство дают несуществующий российский номер, но
вьетнамский превращается в живой подмосковный код, и род ошибки меняется с
звонок не состоится на звонок состоится, но не тому человеку.

Правило велит выносить развилку с полным набором дорог. Дороги я вынес полные, а
цену неполную, и владелец решал, не зная её.

Смягчает это одно, и не моя заслуга. Помощник докопал дальше и поправил САМ СЕБЯ:
общий нормализатор телефонов портала живёт в двадцати файлах, включая сам обзвон,
и делает ровно то же самое. Вьетнамский номер портится на входе везде уже
сегодня. Р127 опасности не добавляет, он прекращает расхождение обзвона с
остальным порталом.

Его находка, которую я перемерил своим прибором и подтверждаю: пара из десяти и
одиннадцати цифр даёт ДВА знака на одного человека, и ему позвонят дважды. При
этом общий нормализатор и проверка запрета звонить считают ту же пару ОДНИМ
человеком. То есть беда, ради которой принято Р127, на этой паре жива. Он не стал
чинить и правильно: лечение шире решения, надо сводить три разных канона
телефона, живущих в обзвоне, а один из них сторожит запрет звонить. Вынесено
открытым вопросом первым номером.

Ошибка помощника, названная им первой, редкого рода: он назвал цену нечестно и
едва не отдал её в таком виде, подав общую беду портала как новую опасность
решения. Проверил дальше и поправил себя прямым текстом. Это ровно то, чего метод
требует от надзирателя и чего надзиратель на этот раз не сделал: сперва замер,
потом слово.

Датчики: решений 127, разметка 0 ошибок, правописание протокола 0 жалоб.
Прогон 5301 проверка, 5297 зелёных, 4 пропущено, красных 0.
2026-08-07 08:36:21 +03:00
Дмитрий 56ddaa1ed4 fix обзвон: один человек, записанный через 8 и через +7, получал два звонка
Решение владельца Р127. В `odinVidNomera` восьмёрка приводится к семёрке
ТОЛЬКО когда цифр ровно одиннадцать. Короткие и длинные номера не трогаются
вовсе: слить двух разных людей в один знак — ошибка тише и хуже, второму не
позвонили бы никогда и молча.

Замерено до правки: `8 999 000-00-01` и `+7 999 000-00-01` давали два разных
знака и два разных тела. Сторожа смотрят на то, что вправду уехало роботу, и
сравнивают дословно — так же, как сравнивает приёмник.

Сторожа показаны красными тремя сломами: без починки, без проверки длины и с
приведением к восьмёрке вместо семёрки. Возврат доказан слепком файла.

Названная владельцу цена: иностранные одиннадцатизначные номера с кодом на
восьмёрку это правило портит. Вьетнамские `8496…`/`8497…`/`8498…` станут
похожи на живые коды Московской области — робот позвонит чужому человеку.
Лечится чисткой номеров на входе, это отдельная задача. Подробности и
незакрытые хвосты — в отчёте.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 08:25:28 +03:00
Дмитрий 09ed5e1b31 docs обзвон: приговор по двери боевого рендера, дверей оказалось три
Решение владельца Р126 исполнено коммитом 92472816, и исполнено ШИРЕ, чем я
заказал.

Моя ошибка первой, пятьдесят восьмая. Я назвал в задании ОДНУ дверь, через
которую уходит тайный ключ боевого Поиска клиентов. Помощник замерил: дверей
ДВЕ, и вторая шлёт тот же ключ по той же настройке. Перепроверил вторым прибором
на версии до его правки: у второй двери был ровно тот же вид проверки и тот же
заголовок с ключом. Почини он только названный мной файл, решение владельца
осталось бы невыполненным, а дыра открытой. Отсюда правило 29: одно найденное
место это находка, а не перечень.

И третья дверь нашлась потом: та же тайна уходит из плитки срока прокси по
другой настройке. Помощник назвал её и НЕ тронул, правильно. Перемерил сам,
вынес владельцу, закрыто отдельным заходом.

Мой нож прогнал одиннадцать форм адреса на боевом окружении с умолчанием списка
машин из хранилища. Пять законных форм открыты, шесть опасных закрыты, и главное
опечатка в адресе машины ловится, а именно она уводила ключ чужому молча и
навсегда. Обратный край тоже верен: при пустом списке дверь закрыта совсем, а
местный адрес без шифрования проходит только не на боевом.

Помощник назвал свою ошибку первой, и она новая для этого проекта: он запустил
полный прогон раньше, чем закончил правку стиля, и через четыре минуты форматтер
переписал два его файла прямо во время прогона. Зелёный цвет такого прогона не
доказывает ничего. Отсюда правило 30.

Вторая его ошибка честнее первой: проверка покраснела на его же оплошности, и
первым побуждением было подогнать код под ошибку. Поправил проверку.

Оговорка, которую называю вслух. Боевое значение настройки адреса НЕ ЗАМЕРЕНО и
замерить его нельзя, это доступ к боевому. Перед выкатом нужна одна команда,
показывающая, начинается ли адрес с шифрованной схемы. Начинается с
нешифрованной, выкатывать нельзя: лечение не обход, а перевод на шифрование,
сертификат на виртуалке уже работает.

Датчики: разметка 0 ошибок, ссылки живые.
2026-08-07 08:14:19 +03:00
Дмитрий c2b3fe47fc docs: промт-передача следующей сессии по вкладке «Активность» 2026-08-07 08:12:50 +03:00
Дмитрий 0181f2e3e7 docs: промт-передача следующей сессии по вкладке «Активность»
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 08:12:36 +03:00
Дмитрий e4a4766c50 docs: план переделки вкладки «Активность» под вопрос «жив ли клиент» 2026-08-07 08:05:53 +03:00
Дмитрий 16d8191d08 docs: план переделки вкладки «Активность» под вопрос «жив ли клиент»
11 задач по TDD: два сервиса на бэкенде (вердикт с полоской и лента дел из
пяти источников), ручка подгрузки, живая сортировка списка клиентов, типы и
маппер, русские фразы, панель Vue, точка состояния в списке, полный прогон,
приёмка глазами.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 08:05:43 +03:00
Дмитрий 9247281688 fix поиск клиентов: дверь к рендер-виртуалке — разрешённые машины и обязательное шифрование, Р126
Тайный ключ SELF_RENDER_KEY уходил заголовком X-Render-Key на любой адрес, какой окажется
в настройке. Проверялось ровно одно: адрес не пуст и ключ не пуст. Отсюда две молчаливые беды:
опечатка в SELF_RENDER_ENDPOINT увела бы ключ чужому человеку навсегда и без признаков,
а http:// увёз бы его открытым текстом.

Дверь повторяет проверенное устройство Р123 от голосового робота: своя причина на пустой
адрес и на пустой ключ, список разрешённых машин с пустым списком как «закрыто всё»,
обязательное https кроме своей машины, а «своя машина» — два независимых ответа: окружение
из положительного списка И двоичная проверка петли 127.0.0.0/8, ::1, localhost по RFC 6761.
Закрытая дверь = мягкая деградация: наружу не ходим, отдаём пусто, причина в журнал уровнем
warning, потому что на боевом всё ниже не доезжает.

Тумблера «можно без шифра» нет намеренно: он и был бы той самой опечаткой.

Дыр было ДВЕ, а не одна. Тот же ключ и тот же SELF_RENDER_ENDPOINT уходят из
RenderServiceYandexListSource — лента Яндекс.Карт. Починка только названного файла оставила
бы дыру открытой, поэтому дверь общая на обе.

Боевой поиск не сломается: умолчание списка НЕ пустое и содержит замеренный боевой адрес
виртуалки 51-250-1-97.sslip.io — пустое умолчание остановило бы поиск в момент выката.
Набор тот же, что владелец уже принял для OBZVON_ALLOWED_HOSTS: это одна и та же машина.
Прогнаны все формы адреса, какие могут стоять в боевой настройке, в окружении production.

Проверок 37, сторожа показаны красными пятью отдельными сломами, возврат доказан слепками.
Larastan 0, Pint чисто.

Не закрыто и ждёт слова владельца: ProxyMarketProbe шлёт тот же ключ на другую настройку
без двери; боевое значение SELF_RENDER_ENDPOINT не замерено, на боевой не ходил.

Отчёт: docs/superpowers/priyomka/stroyka-6/otchyot-pomoshchnika-r126-dver-rendera-2026-08-07.md
2026-08-07 08:04:35 +03:00
Дмитрий 475e2d6245 docs обзвон: знак и тело больше не расходятся, промт смене 7 написан
Портальная причина дыры закрыта коммитом a4ff69aea. Помощник выбрал путь, где
портал считает опознавательный знак задания САМ внутри вызова, а наружу
принимает то, из чего знак складывается. Рассогласовать стало нечего.

Довод, которого не было в моём задании и который решил дело: второй путь всё
равно потребовал бы сменить подпись, потому что для сверки знак надо
пересчитать. То есть он платит ту же цену, а взамен даёт лишний довод, который
может быть только неверным, и новый исход дверь закрыта. А чем кончается
закрытая дверь? Человеку не позвонили. Второй путь не убирает вред, а делает его
громким.

Мой нож мерил не текст, а то, что вправду уезжает роботу. Один человек в двух
записях даёт один знак И одно тело. Строка без цифр закрывает дверь, наружу не
уходит ничего. Вторая попытка и другой клиент дают другой знак.

И мой нож замерил цену того, что помощник НЕ стал чинить осознанно: человек,
записанный восьмёркой и семёркой, считается двумя разными, и ему позвонят
дважды. Он нашёл это сам и вынес владельцу, потому что ошибка в обратную сторону
тише и хуже: слияние двух разных людей означало бы, что второму не позвонят
никогда и молча. Владелец закрыл это решением Р127: восьмёрку приводим к
семёрке только у одиннадцатизначных номеров.

Лучшая ошибка смены, названная помощником первой: его главный сторож был слеп
ровно к той половине беды, ради которой писался. Он сверял согласие с точностью
до приведения номера, а робот сравнивает тело дословно. Вернул беду в код,
сторож остался зелёным. Не сломай он свою починку руками, сдал бы работу с
дырявым главным сторожем.

Промт смене 7 написан: docs/superpowers/2026-08-10-PROMT-obzvon-stroyka-4.md.
В нём правила стройки вперёд всего, 57 ошибок надзирателя, 28 правил, числа
собраны командой, порядок работ и три ловушки, которые выглядят правильными.
В промте смены 6 поставлен указатель, что он отработан.

Датчики: задач 54, врезок ПОСТРОЕНО 19, требований 112, решений 127.
Разметка 0 ошибок, правописание протокола 0 жалоб, все ссылки промта ведут к
живым файлам.
2026-08-07 07:53:48 +03:00
Дмитрий c298789eef docs: спека переделки вкладки «Активность» под вопрос «жив ли клиент» 2026-08-07 07:49:07 +03:00
Дмитрий c9daf48bdc docs: спека переделки вкладки «Активность» под вопрос «жив ли клиент»
Замерено на боевом: вкладка читает журнал сделок, где 364 из 419 строк —
системные «робот залил лид». Данные про входы и про дела клиента лежат в
двух других журналах и на вкладку не попадают вовсе.

Решения владельца: вердикт + полоска 90 дней + лента только дел, пороги
3 и 14 суток, входы только сверху, заодно чиним мёртвую сортировку списка
клиентов по последней активности.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 07:48:57 +03:00
Дмитрий a4ff69aea3 fix обзвон: знак задания и номер в теле больше не могут разойтись
Портальный клиент голосового робота считал опознавательный знак задания от
ОДНИХ ЦИФР телефона, а в тело задания клал номер КАК ЕСТЬ. Один и тот же
человек, записанный `+7 999 000-00-01` и `79990000001`, давал ОДИН знак и
РАЗНЫЕ тела. Приёмник робота сравнивает тело дословно и на такую пару
отвечает отказом — то есть честный повтор получал отказ вместо звонка.

Вторая половина той же беды: знак и телефон приходили в `pozvonit` ДВУМЯ
независимыми доводами, и ничто не заставляло их сойтись. Работник очереди,
посчитавший знак один раз и перебирающий номера, отправил бы роботу
рассогласованную пару, и человеку не позвонили бы молча.

Что сделано:

- заведено ОДНО место приведения номера — `ObzvonClient::odinVidNomera`;
  оба потребителя берут номер оттуда: и знак, и тело задания;
- `pozvonit` больше НЕ принимает знак снаружи. Он принимает то, из чего знак
  складывается — арендатор, кампания, номер, попытка, — и складывает знак сам.
  Рассогласовать нечего: второго номера в клиенте не существует;
- отказ по номеру теперь считается по признаку "в номере ноль цифр", а не по
  `trim`. Раньше строка вроде "абв" проходила дальше и давала ОДИН И ТОТ ЖЕ
  знак на все такие задания — два разных задания столкнулись бы знаками у
  робота, и одному из людей не позвонили бы вовсе;
- в докблоке `pozvonit` вслух записано следствие решения владельца Р124:
  номер попытки нельзя прибавлять на исходе, где звонок МОГ состояться, —
  иначе знак станет другим и защита не сработает именно в том случае, ради
  которого заведена.

Разбор ответа робота, пределы времени, предел одновременных и проверка
шифрования Р123 не тронуты.

Мерки. Сторожа роняли работой, а не текстом: возвращали беду в код и
смотрели на то, что уходит подставному роботу.

- вернул в тело номер "как есть" — 4 красных из 55;
- вернул знак доводом снаружи — 1 красный из 55, сторож читает доводный ряд
  метода через `ReflectionMethod`, а не текст файла;
- возврат доказан слепком со снятием невидимых знаков конца строки,
  после возврата 55 из 55 зелёных;
- полный прогон на своей базе: 5293 проверки, 5289 зелёных, красных 0,
  ошибок 0, пропущено 4; арифметика сходится;
- `composer stan` — 0 ошибок, `pint --test` — passed.

Открытым оставлено и названо в отчёте: `8...` и `+7...` сегодня разные люди
для портала; `dopolnitelno` обязано быть одинаковым у повтора; правило счёта
попыток не назначено.

Отчёт: docs/superpowers/priyomka/stroyka-6/otchyot-pomoshchnika-znak-tela-2026-08-07.md
2026-08-07 07:43:34 +03:00
Дмитрий 4513fe1a58 docs приёмка: дефект М-1 выкачен на боевой и доказан живыми данными 2026-08-07 07:34:28 +03:00
Дмитрий a0c660704c docs приёмка: дефект М-1 выкачен на боевой и доказан живыми данными
Задание 88 закончилось после выката и принесло ту же дату старта, а время
изменения кампании №15 осталось от прошлого задания. Раньше совпадало с концом
каждого задания до секунды — значит строку больше не трогают и счётчик 48 часов
пошёл по-настоящему.

Никого не стёрли: перепись боевого 1031 файл до и после, боевая копия файла до
выката побайтово равна прежней версии, после — новой.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 07:33:36 +03:00
Дмитрий 9eba348ee8 fix телеграм: счётчик зависшей модерации сбрасывался каждой проверкой робота 2026-08-07 07:19:00 +03:00
Дмитрий 1464fd5c3f fix телеграм: счётчик зависшей модерации сбрасывался каждой проверкой робота
Кампания, застрявшая на модерации дольше 48 часов, обязана уйти в ручной
разбор — иначе висит вечно с замороженными деньгами клиента и молча.
Срок считается по времени изменения строки, а вчерашняя правка «день начала
показов» писала дату при КАЖДОЙ проверке робота массовым обновлением, которое
всегда двигает updated_at. Робот ходит раз в четверть часа — счётчик не
досчитал бы никогда. Защита была цела на вид и мертва на деле.

Улика с боевого: у кампании №15 время изменения строки совпадало с концом
последнего задания робота до секунды, при том что вердикта не было третьи сутки.

Пишем дату, только если она вправду изменилась. Сравнение сырых значений мимо
приведения типов: starts_on это date:Y-m-d, сравнение с Carbon разошлось бы молча.

Сторожа SchyotchikZavisshejModeraciiTest (3 шт) видены красными до правки.
Блок телеграма 381 зелёный на своей базе, статанализ 0, pint чисто.
На боевой НЕ выкачено.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 07:18:27 +03:00
Дмитрий 30424a4b52 fix телеграм: счётчик зависшей модерации сбрасывался каждой проверкой робота 2026-08-07 07:18:03 +03:00
Дмитрий d3f190806a @' 2026-08-07 07:04:13 +03:00
Дмитрий b522d98afe @
fix: письма о недоливе — одна сводка в сутки вместо потока на каждом прогоне

Сверка с поставщиком шла каждые 30 минут и на каждом прогоне слала письмо
на КАЖДУЮ пару (тенант, дата) с недоливом больше 20%. Вчерашняя дата остаётся
в окне сверки, поэтому поток рос день ото дня: 144 письма 27.07 → 510 за 06.08,
около 3000 за 12 дней на ops@liderra.ru.

Теперь пары собираются в один список и уходят одной сводкой раз в сутки
(отсечка по московской дате в redis; гонки нет — handle держит общий lock).
Частоту самой сверки не трогал.

Поштучный TenantBusinessDriftAlertMail с шаблоном удалён — стал мёртвым.

Тесты: сводка собирает все пары в одно письмо, второй прогон в те же сутки
молчит, в новые сутки письмо уходит снова. Красными их видел.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@
2026-08-07 07:02:45 +03:00
Дмитрий 575b6d6491 docs обзвон: приняты З-0.3, З-3.1 и половина З-0.6, в плане нашлась дыра
Три приговора вынесены своей рукой. Плюс в план заведена новая задача по
решению владельца и записаны четыре его решения.

З-0.3 принята, коммиты 18f933550 и dd3b6fb4b. Портальная половина шва: клиент
умеет позвать робота, спросить состояние, остановить, мягко деградировать и
требовать шифрования. Мой нож проверил восемь форм адреса на боевом окружении:
большие буквы, порт и пробелы проходят, четыре опасные формы закрыты, каждая со
своей причиной словами.

З-3.1 принята, коммит 5dfe32dc9. Ловушка решения Р115 закрыта и проверена моим
ножом на каждом часе суток: менеджер в Москве с 14 до 18 и получатель во
Владивостоке дают ноль общих часов, а менеджер с 10 до 18 даёт ровно три, и
арифметика сходится знак в знак. Что живая рассылка клиентов не изменилась,
помощник доказал не тестами, а вычитанием: 144 816 сверок, ноль расхождений,
прибор показан красным подложенной поломкой.

З-0.6 принята КАК ПОЛОВИНА и половина честная: из восьми проверок задачи закрыта
одна, две частично, пять не закрыты. Построен приёмник заданий с памятью знаков
на сутки по решению Р124. Мой нож нашёл дыру: тот же знак с другим телефоном
приёмник считал повтором, молча не звонил второму человеку и отдавал порталу
номер звонка первого. Закрыто доделкой, теперь громкий отказ.

Главная находка смены крупнее всех задач. Помощник разобрал моё задание и
сказал, что между принять задание и отчитаться лежит САМ НАБОР НОМЕРА, а его нет
нигде в плане. Проверил вторым прибором, перебрав все 53 задачи поимённо: он
прав. Диалплан набирать умеет, а начать звонок некому. Владелец решил завести
отдельную задачу, она заведена как З-0.12 и стоит сразу за швом.

Мои ошибки, их четыре за эти круги, и все одного класса.

Пятьдесят третья. Завёл приёмочный лист ПОСЛЕ отправки задания, а не до. Ровно
на этом месте метод и рассыпается: лист, написанный после, подгоняется под то,
что вышло.

Пятьдесят пятая, самая тяжёлая. Я построил главный довод задания на ложном
замере. Написал, что правило часов зовут двенадцать файлов живого модуля, что
обзвон уже читает его через тарификатор и что у проверки часа двенадцать мест
боевого кода. Все три неверны: зовущих пять, тарификатор правило не читает
вовсе, у проверки часа один боевой зовущий. Помощник разбил все три, я перемерил
и подтвердил. Перечень я собрал командой, как велит правило, но команда считала
УПОМИНАНИЯ, а я назвал их зовущими.

Пятьдесят седьмая. Моя подсказка к решению Р123 привела бы к негодной починке:
сторожа были бы зелёными при живой дыре. Помощник показал это замером.

И четыре раза за смену мой собственный прибор мерил не то, о чём я его
спрашивал: подставной робот протекал между случаями, заголовок я спрашивал по
выдуманному имени, устройство памяти предположил вместо того, чтобы посмотреть,
подписи нового кода выдумал.

Решения владельца, закрытые 07.08.2026: Р122 подпись письма вместо слова в
адресе, Р123 шифрование к роботу кроме своей машины, Р124 робот помнит знаки
сутки, Р125 номер без общего окна не набираем и говорим клиенту до запуска,
Р126 дверь боевого Поиска клиентов чинится отдельным заходом.

Датчики: задач 54, врезок ПОСТРОЕНО 19, требований 112, решений 126.
Разметка 0 ошибок, правописание протокола 0 жалоб.
2026-08-07 06:47:54 +03:00
Дмитрий dd3b6fb4b5 fix обзвон: к роботу только по шифрованной дороге, кроме своей машины — Р123
Дверь пускала http к разрешённому хосту, и тайный ключ уезжал заголовком
открытым текстом — молча, без единого признака. Одной опечатки в OBZVON_ENDPOINT
хватало. Теперь адрес без шифрования портал не принимает: дверь закрыта, звонка
нет, причина сказана словами и лежит в журнале уровнем предупреждения.

Исключение ровно одно — разработчик на своём компьютере — и устроено оно ДВУМЯ
независимыми ответами, чтобы одной перепутанной настройки на боевом для утечки
не хватило:

1. приложение само говорит, где живёт: спрашиваем Laravel, а не список слов.
   Список окружений положительный, а не «всё кроме боевого»: любое неназванное
   окружение обязано шифрование.
2. робот стоит на ЭТОЙ ЖЕ машине: адрес ведёт на петлю — вся сеть 127.0.0.0/8,
   ::1, ::ffff:127.x.x.x, имена localhost и *.localhost по RFC 6761. Определяется
   двоичным сравнением адреса, а не совпадением слов. Резолвер имён не зовём
   намеренно: он вносит в проверку безопасности неопределённость и щель между
   «проверили» и «пошли».

Именно второй ответ и закрывает то, что владелец назвал незакрытым: одной
ошибки в APP_ENV на боевом теперь мало — боевой робот петлёй не станет. На это
стоит именной сторож.

Тумблера «можно без шифра» нет намеренно: он и был бы той опечаткой, ради
которой Р123 принято.

12 новых сторожей: четыре случая ножа приёмки ж, з, и, к; сторож на само
исключение; сторож против совпадения слов вместо петли; сторож на подложное
шифрование, когда проверку чужого удостоверения снимают. Каждый показан
красным — починка ронялась четырьмя разными способами, и каждый раз краснело
именно то, что этот способ ломает. Возврат доказан слепком со снятием невидимых
знаков конца строки.

Моя ошибка первой: первый сторож про журнал зеленел не по той причине — любая
строка предупреждения его устраивала. Нашёлся только арифметикой прогона, потому
что упал в поле ошибок, а не провалов. Переписан.

Найдено и НЕ тронуто второе место того же класса: services.self_render шлёт
секрет заголовком, и его дверь не проверяет ни схему, ни хост вовсе. Путь живой,
боевой. Вынесено решением владельцу отдельно.

Отчёт: docs/superpowers/priyomka/stroyka-6/otchyot-pomoshchnika-r123-shifrovanie-2026-08-07.md

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