Смена 9 закрыта. Два круга, оба по задаче З-0.1: имя доезжает от портала до
ячейки звонка само, станция различает звонки, замок поднят до трёх линий, и
настройка станции выкачена на живую машину.
Владелец закрыл четыре развилки Р128-Р131, и вся стена, на которую упиралась
стройка, снята: править станцию можно, менять базу можно.
В промте смене 10 названы поимённо ДВА неверных места промта смены 9, оба мои.
Первое. Сказано, что набор имя никуда не кладёт. Имени не было ВОВСЕ: портал не
посылал, приёмник не читал, набор не знал.
Второе. Сказано, что три линии - это трое услышавших чужое имя. Неверно: в общий
файл имени не пишет ни одна рабочая половина, он только читается, и человек
остаётся без имени, а не с чужим.
Мои ошибки смены 9 - шесть, с 68 по 73. Худшая семьдесят первая: вывел с судьёй
правило, что прогон годен только по неподвижному дереву, и через час его нарушил.
Заведены четыре правила сверх тридцати шести. Прогон годен только по неподвижному
дереву, со снимком до и после; ложная краснота опаснее ложной зелени, по ней идут
чинить чужой исправный код. Порог числом не задавай - он краснеет от чужих
коммитов. Судье задавай вопрос о цене, а не о составе. Датчик, сверяющий значение
с той же настройкой, которую ты ломаешь, - пустой.
Судья дал улов крупнее обоих рабочих кругов вместе: разбил мою точку отсчёта,
нашёл дыру в свежей постройке, утяжелил мою находку втрое и назвал вопрос,
которого за смену не задал никто.
Прибавилось четыре вопроса владельцу: записи разговоров лежат на машине правами
читать всем пятые сутки; замазка имени в журнале дырявая на четырёх случаях из
семи; имя уезжает сторонней службе за пределами страны дважды за звонок; час
хранения ячейки - это предел, а не факт.
Порядок работ переставлен: первым идёт выкат моста, ячеек и приёмника вместе -
без него работа двух смен на машине не существует.
Датчики: разметка обеих бумаг 0 ошибок, все четыре ссылки промта проверены на
существование, полный прогон по неподвижному дереву 5400 проверок и красных 0,
команда чтения метода запускалась моей рукой в начале смены.
Круг 2 смены 9 принят, выкат состоялся. Станция теперь даёт каждому звонку свою
метку, замок поднят с одной линии до трёх, и непочиненная станция сама режет
предел обратно до одной.
Свою ошибку называю первой, семьдесят третья.
В листе и в задании помощнику я написал, что три линии при общем файле - это
трое услышавших чужое имя. Это неверно. Помощник разбил, я проверил вторым
прибором и подтвердил: в общий файл имени не пишет ни одна рабочая половина, он
только читается. На непочиненной станции общий файл пуст, и человек остаётся БЕЗ
имени, а не с чужим. Чужое имя было настоящей бедой ДО постройки смены 8; я
перенёс старую картину в новый круг, не перемерив. И сказал это владельцу вслух -
поправку отдал первой строкой следующего же сообщения.
Помощник поправил меня трижды, все три по существу. Картина беды. Второе место
того же класса: мост у обеих Лен один и тот же, а предел линий общее умолчание -
одна правка подняла бы до трёх линий живые входящие звонки компании. И запасной
вид он не стал строить по моей догадке, а сделал так, что пустое до станции не
доходит вовсе.
Его собственная ошибка поучительнее моей: датчик предела был пустой, сверял
предел с той самой настройкой, которую ломал. Сломал лечение - проба осталась
зелёной тридцать шесть из тридцати шести. Вскрыл только показом красным.
Мой нож резал по новому надзору, случаи по одному. Непочиненная станция режет
предел до одной линии, вторая не пущена. Починенная даёт три и не даёт четыре. До
первого звонка предел полный, и это объявлено. И замер, которого нет в его
отчёте: один хороший звонок возвращает предел с единицы обратно на три - урезание
не навсегда. Это названная цена, не беда.
Выкат делал своей рукой и отступил от порядка дважды, оба раза в сторону меньшего
риска. Не переносил кусок целиком: в нашей копии номер компании замаскирован, а
настоящего я не знаю, и перенос целиком сломал бы живые входящие. Поменял одну
строку на четыре, счётной программой с тремя предохранителями сразу и со слепком
для отката. Приёмщица живых входящих после правки та же, замерено исполняемым
диалпланом. Живых разговоров на миг правки было ноль. Станцию перечитал, а не
перезапустил.
Шаги девять и десять не делал. Перезапуск моста бессмыслен: на машине живёт
старый мост, ячеек он не знает вовсе, а нового файла там нет - предел три живёт в
коде, которого на машине нет. Живая проба стоит денег и грузит машину, делящую
железо с боевым сервисом; запасной вид виден прямо в исполняемом диалплане.
Числа моей рукой. Полный прогон по неподвижному дереву, снимки до и после
сошлись: 5400 проверок, 5396 зелёных, 4 пропущено, красных 0. Пробы робота 232,
71 и 38. Новый сторож настройки до выката 13 проверок и 2 красных, после выката
12 и ноль. Сторожа машины прежние.
Главное сказать трезво: выкат станции сегодня ничего не чинит и ничего не ломает,
он подготовительный. Починка доедет до жизни только вместе с выкатом моста, ячеек
и приёмника. Счётчик построенных задач не двигаю: остаётся 20 из 54.
Полный прогон портала на своей базе liderra_testing_stanciya9:
5400 проверок, зелёных 5396, красных 0, ошибок 0, пропущено 4.
Арифметика сходится. Утверждений 22 085, 23,6 минуты.
Дерево при прогоне неподвижно: грязь в app/ до и после одна и та же,
HEAD сдвинут только моим коммитом, не трогавшим ни одного файла под app/.
База за собой снесена, проверено запросом к pg_database.
Замер про мигание пробы имени: оно унаследованное и зависит от нагрузки —
на версии БЕЗ моих правок под полным прогоном мигнуло 1 из 12, на свободной
машине 0 из 24 с обеих сторон. Не моё, не чинил.
proba-mosta-bez-zvonka.py на машине разработчика не запускается вовсе:
most.py читает при ввозе .kluch, которого в хранилище нет. Проверено, что
падает так же на версии до моих правок.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Станция. Раздел [lena-inworld] берёт метку переменной канала
LENA_METKA_ZVONKA вместо прежней константы. Ключевое — запасной вид: если
переменной нет вовсе (ручная проба, звонок не от нашего набора), подставляется
та самая прежняя константа, и всё идёт ровно как до починки — общий файл и
крик в журнал. Пустое значение до AudioSocket не доходит, поэтому вопрос
«чем AudioSocket отвечает на пустой довод», который никто не замерял, стал
ненужным, а не угаданным. Строка NoOp кладёт метку в журнал станции — это
единственный способ увидеть глазами, доехала ли переменная.
Раздел [lena-vhodyashchie] с живыми входящими звонками не тронут ничем.
Предел линий. Умолчание 1 -> 3 (Т34, решение владельца Р58). Четвёртая линия
получает громкий отказ с числами в журнале.
Надзор — новое. До сегодня предел и починка станции не были связаны ничем:
предел снимался переменной среды, и ничто не спрашивало станцию, а настройка
на этой машине уже дважды молча откатывалась. Теперь Imena.zanyat_metku
рассказывает надзору, какая метка вправду пришла с живого звонка, а Vorota
спрашивает у надзора действующий предел. Общая константа урезает предел до
одной линии, столкновение двух живых звонков на одной метке — навсегда до
перезапуска. most.py при этом не тронут ни строкой: мост создаёт Imena и
Vorota умолчаниями, а умолчание у обоих — общий на модуль надзор.
Этим же закрыто второе место того же класса, о котором задание не знало:
most.py один и тот же у обеих Лен, и одна правка умолчания подняла бы до трёх
линий живые входящие звонки компании. Надзор возвращает приёмщице одну линию
после её первого же звонка — её метка не своя.
Ячейка имени теперь исчезает в конце звонка (Imena.osvobodit_metku), а не
ждёт следующего звонка: сборщик просроченных просыпался только внутри vzyat,
и без следующего звонка имя живого человека лежало бессрочно. Набор вдобавок
метёт просроченные перед каждой кладкой.
Исправлена НЕВЕРНАЯ надпись на прежнем замке. Она гласила «три линии при
общем файле — это трое услышавших чужое имя». Замер: в общий imya.txt не
пишет ни одна рабочая половина, набор кладёт только в ячейку по метке.
Значит на непочиненной станции общий файл пуст и человек остаётся без имени,
а не с чужим; а положенное руками имя унесёт ровно один звонок при любом
пределе — взятие неделимо. От предела линий число услышавших чужое имя не
зависело.
Новый сторож proverka-nastroyki-stancii.sh: копия в хранилище,
неприкосновенность приёмщицы, исполняемый диалплан живой станции. Суточный
обход подхватит его сам — он собирает сторожей по шаблону proverka-*.sh.
Пробы: proba-mosta-metka-i-zamok 38 проверок, proba-imeni-za-zvonok 71,
proba-priyomnika 232, сторож настройки 10 — все зелёные.
Каждый сторож показан красным нарочной поломкой; первая же поломка вскрыла,
что мой датчик предела был пустой — он сверялся с той самой постоянной,
которую я и ломал. Числа в пробе теперь литеральные.
На сервер ничего не возилось: выкат делает владелец, порядок по шагам —
в README.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Решений стало 131. Все четыре приняты вслух 08.08.2026, у каждого записаны
отрезанные ветки и строка о том, чего решение НЕ закрывает.
Р128. Настройку телефонной станции править и выкатывать разрешено. Отрезано
подготовить-без-выката и не-трогать-вовсе. Не закрывает: копия и сервер обязаны
сойтись в один заход, иначе шумом забивается единственный датчик молчаливых
откатов сервера, а их уже было два; и сверка эта ручная.
Р129. Менять базу разрешено целиком. Отрезано только-тестовая и запрещаю. Не
закрывает: разрешение дано на изменение схемы, а не на выкат модуля; боевую базу
сегодня трогать нечего, первая боевая миграция поедет вместе с выкатом.
Р130. Обратимость знака задания чиним при выкате, а не сейчас. Отрезано
починить-сейчас и оставить-как-есть. Не закрывает главного: пока не починено,
пояснение в коде продолжает утверждать неправду, а обещание больше защиты
закрывает вопрос в голове читающего. До выката в коде обязано стоять честное
слово вместо слова необратим, и это правка пояснения, не поведения.
Р131. Имя человека не должно влиять на наставление роботу — передаётся отдельно,
а не внутри. Отрезано отсеивать-по-списку-слов, потому что такой список всегда
неполон, и оставить-с-риском. Не закрывает: работа лежит в мосте, который узкое
место трёх будущих задач, и сторожа, закрепляющего отраву как годную, придётся
переписать, а не дописать.
Все четыре подняты приёмкой круга 1 смены 9: три из них нашёл судья, замеры под
ними мои.
Хвост, который висел с начала дня: рабочая копия робота на машине
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>
Работа круга принята. Имя человека доезжает от портала до ячейки своего звонка
само, без рук: названный довод, один ключ на весь шов, отказ мешку, чистка с
обеих сторон, укладка до первого байта в сторону станции. Стерегут 76 сторожей
шва и 232 пробы робота.
Задача построенной НЕ считается, счётчик не растёт: остаётся 20 из 54. Не хватает
правки настройки станции и снятия замка, и оба куска суть слово владельца, а не
работа.
Свои ошибки называю первыми, их пять.
Шестьдесят восьмая. В своём же промте написал, что набор имя не кладёт. Замерил
двумя приборами: имени не было ВОВСЕ - портал не посылал, приёмник не читал,
набор не знал. Сказал мягче правды.
Шестьдесят девятая. Объяснил прирост прогона соседями и назвал это замером, а моё
же число опровергало мой вывод: девять плюс шесть не равно шести. Судья указал
первой строкой. Дальше вышло хуже: проверить нечем вовсе, число снято с дерева,
которое сосед менял двадцать одну минуту подряд.
Семидесятая. Свою же находку про уборщика имён записал слабее правды трижды:
после оборванного звонка вместо после каждого, не увидел сторожа, который требует
тридцатидневного хранения файла с именем человека, не померил, что подпорки от
самой машины нет.
Семьдесят первая. Вывел с судьёй правило, что прогон годен только по неподвижному
дереву, и через час его нарушил: запустил прогон и разбудил помощника править те
же файлы. Плюс команда снимка дерева сохранила свой собственный текст вместо
чисел, то есть снимка не было вовсе, а выглядел он сделанным.
Семьдесят вторая. Судье подсказал не тот вопрос. Спросил, куда ещё попадает имя,
а правильный вопрос он задал сам: сколько стоит развернуть то, что в журнале всё
таки есть.
Помощник поправил меня четырежды и все четыре по существу. Мост физически не
может увидеть метку иначе как каноническим видом - это он замерил, а я мерил не с
той стороны. Имя обязано входить в отпечаток тела, иначе тот же знак с другим
именем пройдёт молча. Отказ мешку лучше молчаливого выброса, потому что
молчаливый выброс сам есть тихая потеря. И сверх задания он нашёл, что знак и
телефон защищены сегодня только случайностью порядка кусков.
Судья, заведённый сразу после первых находок, дал улов крупнее всех рабочих
кругов. Разбил мою точку отсчёта. Нашёл дыру в свежей постройке: свободный мешок
вёз имя мимо чистки, а над этим местом стояло наше же обещание, что это
невозможно. И назвал вопрос, которого за смену не задал никто.
Мой нож резал четырежды. Уборщик просроченных имён: следующего звонка нет - имя
живого человека остаётся, двадцать пять несостоявшихся звонков - лежат все
двадцать пять. Сторож сторонних библиотек показан красным двумя проверками, и
названная им цена проверена отдельно. Замазка имени в журнале дырявая на именах с
беглой гласной и на другом регистре, четыре протечки из семи. Доделка мешка -
шесть красных из семидесяти шести, среди них чужой сторож, которого не нашли ни
я, ни судья.
Числа моей рукой. Полный прогон по неподвижному дереву, снимки до и после
сошлись: 5400 проверок, 5396 зелёных, 4 пропущено, красных 0, арифметика сходится.
Это четвёртый прогон смены и первый годный: первый снят на движущемся дереве,
второй словил пять ложных красных от приехавшего слияния с главной, третий я
остановил сам. Сторожа шва 76 при 221 утверждении. Пробы робота 232, 64 и 27.
Сторожа машины 26, 27, 23 зелёные, текстовый след одна красная, обход две - те
же, что до работы, и обе датчики невыката.
Три вещи вынесены владельцу и здесь не лечатся: знак задания обратим вопреки
записанному в коде слову необратим, имя из карточки лида подставляется внутрь
наставления Лене и наш же сторож закрепляет отраву как годную, замок и починка
станции не связаны ничем.
Ничего не пушено и не выкачено. На машину робота не ходили с правками.
Замерено чтением, а не рассуждением: тело робот читает СТРОГО — шесть
поисков по словарю без приведения регистра; приведение есть только у
заголовков и у слов станции. Значит ключ другим регистром робот не прочтёт
никогда, и отказ портала обращает тихую потерю в громкую, а не отвергает
годное.
На это заведён сторож с роботной стороны: имя, названное в задании другим
регистром, именем не считается. Научат робота читать нестрого — сторож
покраснеет, и портал поправим вслед.
Чужой сторож «мешок не может перебить знак или номер» проверял своё
свойство через ушедшее тело и после починки падал ошибкой. Не снесён:
свойство верное, моё правило его усиливает — переписана только охрана,
вторая половина по-прежнему проверяет, что чужие поля мешка доезжают.
В отчёт дописан новый раздел, старое не переписано.
Числа: проба приёмника 232, имя за звонок 64, мост 27, сторожа шва 76 —
красных и ошибок нет нигде. Новых сторожей ронял тремя порчами: 6, 1 и 4
красных. Полный прогон не запускал — его делает координатор.
После обрыва смены счёл первый прогон погибшим и пустил второй. Первый был
жив: замер по процессам показал два прогона, оба били в одну базу. Оба
числа были бы ложью.
Заодно поймана вторая ложь того же места: обёртка отрапортовала по обоим
убитым прогонам «выход 0» при коде 127 и без единой итоговой строки.
Вылечено: процессы сняты по номерам, чужие серверы не тронуты, база снесена
явным словом и проверена, заведена заново, промигрирована.
Вписан и второй повод, по которому имя сегодня НЕ доедет до человека:
на машине робота набор стоит «net», значит кладущая рука не зовётся вовсе —
ещё до всякой правки станции.
Вписано: что построено файлами, чем ронял каждого сторожа и что он сказал,
слепки возврата, числа проб, соседи, свои ошибки первыми и что осталось
несделанным.
Числа полного прогона допишутся отдельно — он ещё идёт.
Клиент после создания рекламы был слеп: ни отчёта, ни причины отказа проверки,
ни способа что-то изменить. Закрыто.
Что теперь видит клиент
- слова «МТС» на клиентских экранах больше нет — он покупает рекламу в Телеграме
- на карточке: увидят рекламу, зарезервировано, списано, показов, кликов, подписались
- кнопки «Отчёт», «Отменить», «Повторить эту рекламу»
- отчёт даёт ПОЛНЫЙ текст причин отказа проверки, дословно
- пересдача принимает новый заголовок и новую картинку
- вердикт проверки уходит клиенту письмом, а не только в колокольчик
Показы читает робот
- новый режим 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>
Замерено: мост берёт метку только каноническим UUID, а нынешний номер
звонка UUID не является. Значит ячейку называем каноническим видом того же
самого uuid, из которого сложен номер звонка, — одно рождение, два вида.
Записан отказ писать в общий запасной файл и цена отпечатка тела.
Смена 8 закрыта. Два круга: набор номера построен целиком, имя за звонок построено
наполовину. Задач стало 20 из 54.
В промте смене 9 поимённо названы ТРИ неверных места промта смены 8, и все три мои.
Первое и самое дорогое. Промт смены 8 говорил, что задачу про имя за звонок брать
нельзя, только пробы в отдельное окно. Прочитал решения владельца дословно: они отложили
ПРОБЫ, а не постройку. Из-за этой строки цепочка из трёх задач простояла запертой:
перевод на менеджера начинается только после этой задачи, а на переводе стоят предел
разговора, два плеча, тариф и половина исходов.
Второе. Порядок работ ставил вторым делом предел разговора. Брать его нельзя вовсе:
отсчёт идёт от соединения с менеджером, которого в роботе нет ни одним словом.
Третье. Число требований в промте не выходило ни из одной команды: живых 111, а не 112.
Заведены три правила сверх тридцати трёх. Отложенная проба не есть отложенная постройка,
и решение владельца читается дословно в протоколе, а не в пересказе промта. Замерил что
дорога есть - замерь, можно ли по ней проехать. Зелёная проба сама по себе не доказывает
ничего: одну и ту же поломку одна проба поймала шестью проверками, а вторая осталась
зелёной.
Прибавилось пять вопросов владельцу: короткие служебные номера проходят набор, имя
человека после оборванного звонка лежит на диске час, кто хозяин выбора номера при
стройке техники связи соседней сменой, открывать ли дорогу на машине, и задвоенные
номера решений Р116-Р127 между двумя протоколами.
Мест, ждущих выката, стало восемь.
Датчики: разметка обеих бумаг 0 ошибок, все ссылки промта проверены на существование,
команда чтения метода запускалась моей рукой в начале смены.
Круг 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 зелёные. Сторож текстового следа краснеет одной проверкой, и это правильно: мост в
хранилище починен, а на машине лежит старый, выката не было.
Портал 5361 проверка, 5357 зелёных, 4 пропущено, красных 0; девять лишних
против точки отсчёта — несведённая работа соседней смены, не моя. Пробы
робота: мои 43 и 27, прежние 23, 179, 26 и 27 — красных нигде нет.
Десять вырезаний защит, девять покраснели сразу, десятое вскрыло дыру в охране
и потребовало дописать сторож. Старый порядок краснеет с первой же тройки:
11 чужих имён из 36 звонков. Названо вслух, чего круг не доказывает и что
осталось незакрытым, включая связку выката imya_zvonka.py вместе с most.py.
Четыре возражения по существу: буквальное исполнение плана даёт плацебо,
метка приходит позже, чем нужна, запасной общий файл возвращает беду,
номер звонка по форме меткой не годится.
Круг 1 смены 8 принят. Робот вправду просит станцию набрать номер: приёмник открывает
короткое соединение к служебному входу, входит и просит начать исходящий звонок через
раздел набора, а снятую трубку станция отдаёт разговорному разделу. Диалплан не тронут -
оба раздела в нём уже были, проверено и в хранилище, и на живой станции.
Резал СВОИМ ножом, шесть случаев, каждый отдельным процессом: кривой знак задания,
ответ станции без метки, ответ с чужой меткой, знакомый отказ, обрыв связи посреди
просьбы, два задания на один номер. Все шесть отработали как должно. Вырезание первого
рода: сломал его лечение своей рукой - покраснели четверо его сторожей и мой нож на том
же месте. Возврат доказан слепком со снятием невидимых знаков, сошлось знак в знак.
Вырезание второго рода дало находку, которой не резал никто. Допущение объявлено мной
ДО работы: номер из цифр длиной от трёх до двадцати - годный телефон. Случай мимо:
короткий служебный номер. Замерено на настоящем коде - приёмник соглашается попросить
станцию набрать 112, 911 и 102. Чего НЕ замерял и замерять нельзя: дойдёт ли такой
звонок до настоящей экстренной службы. Выносится владельцу, сам не закрываю.
Мои ошибки называю первыми, их три.
Шестьдесят четвёртая. В промте смены 8, который писал я, стоит спека 112 требований, и
над таблицей написано что числа собраны командой. Это число не выходило ни из одной
команды: прибор из промта даёт 98, полный перечень меток 114, живых требований 111.
Шестьдесят пятая. В задании помощнику назвал служебный вход станции годной дорогой,
замерив только что он ЕСТЬ. Замерил после: учётных записей ноль, веб-вход выключен,
папка заданий закрыта правами. Все три дороги заперты, открытие любой - правка живой
машины и слово владельца. Поправка помощнику отправлена со своей ошибкой первой строкой.
Третья, помельче. Мой собственный нож соврал на первом запуске: подставная станция
принимала одно соединение, а набор открывает новое на каждый звонок. Второй звонок
получил станция промолчала, и это выглядело бедой проверяемого. Беда была моя.
Помощник разобрал задание и поправил меня трижды, все три раза по существу и все три
поменяли постройку. Главное: у станции два способа начать звонок и они значат
противоположное. При способе дождись конца ответ не принял значит человек не ответил, а
набор при этом БЫЛ - и портал позвонил бы человеку второй раз. Взят способ не жди.
Второе: всё что не принял считать отказом нельзя, список знакомых отказов белый. Третье:
я не назвал вход, через который течёт беда - перевод строки внутри номера превращает
одну просьбу станции в две, вторую на любой номер.
Приговор ПРИНЯТО с четырьмя оговорками, все названы мной, а не найдены потом. Живого
звонка не было и быть не могло. Дорога на машине заперта, это седьмое место ждущее
выката. Короткие служебные номера проходят. И номер, С КОТОРОГО звоним, набор не
выбирает и не сообщает - он зашит одной строкой в настройке станции.
Датчики: полный прогон моей рукой 5352 проверки, 5348 зелёных, 4 пропущено, красных 0,
арифметика сходится, ровно точка отсчёта. Проба робота 179 из 179, было 108. Разметка
обеих бумаг 0 ошибок. Построено стало 20 из 54.
Своя база, вывод в файл, датчик — числа, а не код возврата.
Зелёные 5348 + красные 0 + ошибки 0 + пропущенные 4 = всего 5352 —
ровно точка отсчёта. Проба робота 179 из 179, шестнадцать прогонов подряд.
Слепки обоих моих файлов кода после прогона совпадают с коммитом
со снятием невидимых знаков конца строки: во время прогона их никто
не переписывал.
Записано по ходу, пока полный прогон идёт. Внутри: почему станцию просим не
ждать конца звонка, почему список знакомых отказов белый, шесть поломок с
дословными словами покрасневших сторожей и слепком возврата, перепись
зовущих глазами с четырьмя ловушками счётчика, и три моих ошибки первыми —
включая ту, где мой же сторож остался бы зелёным при живой дыре.
Раздел про полный прогон дописывается отдельно, когда прогон кончится.
Замерено своей рукой: проба приёмника даёт 108 проверок и ноль красных;
в диалплане уже есть оба нужных раздела, поэтому узкое горло трогать не
понадобится. Названы три места, где я с заданием не согласился, и почему
это меняет постройку.
Круг 2 принят. Дыра, которой никто не искал, закрыта во всех пяти построениях запроса
четырёх файлов. Замерено МОИМ ножом, тем же, каким находилась: на трёх плечах отдельным
запуском, включая пачечное плечо боевого Поиска клиентов, до неразрешённой машины не
доехало ничего.
Датчик проверен на БОЛЬНОМ случае, а не только на здоровом: снял запрет в одном месте,
утечка вернулась вместе с зелёной плиткой и чужим адресом на ней, двое его сторожей
покраснели на моём сломе. Возврат доказан слепком со снятием невидимых знаков.
Вырезание второго рода: допущение лечения - запрет стоит на КАЖДОЙ отправке. Собрал
отправки командой по всем четырём файлам: их пять, запрет на каждой, перечень полон.
Мои ошибки называю первыми, их две новых.
Шестьдесят вторая. Мой прибор копит улики в файл, а я перед замером проверял живость
подставной машины СВОИМ ЖЕ запросом - и он записался туда же. Первый замер после починки
показал утечка есть. Спасло только то, что я посмотрел, ЧТО ИМЕННО доехало: там стоял curl
и не было заголовка с ключом.
Шестьдесят третья. Числа полного прогона вписал в свою бумагу из отчёта помощника, пока
свой прогон ещё шёл. Сошлись знак в знак, но это удача, а не порядок: первое правило метода
гласит, что отчёт помощника не доказательство, и своей бумагой я его нарушил. Дождался
своего.
Помощник поправил меня по существу трижды и все три раза был прав: мест не четыре, а пять,
дверь голосового робота в бою не зовёт никто, и есть пятое место того же класса, у которого
двери нет вообще. Он же снял мою ложную тревогу: всё, что возит секрет через Authorization,
этой болезнью не больно, библиотека снимает такой заголовок сама.
Промт смене 8 написан. В нём поимённо названы ЧЕТЫРЕ неверных места промта смены 7, три из
них мои ошибки, и самое опасное: я назвал чужим файл, который был работой нашего же
помощника. Исполни следующая смена мой промт дословно, починка сгорела бы.
Датчики: полный прогон моей рукой 5352 проверки, 5348 зелёных, 4 пропущено, красных 0,
арифметика сходится. Разметка 0 ошибок. Задач 54, построено 19, требований 112, решений 127.
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>
Дверь проверяет адрес из настройки. Если разрешённая машина отвечает «иди на
другой адрес», перевозчик по умолчанию туда идёт и везёт наш заголовок дальше:
при уходе на чужой адрес 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>
Круг смены 6 оборвали средой, работа помощника лежала в дереве несохранённой и её снёс бы
первый же чужой откат. Замерил целостность, прочёл его отчёт, прогнал своей рукой, вынес
приговор. Заново ничего не переделывал.
ПРИНЯТО. Третья и последняя дверь с ключом рендера закрыта той же проверенной дверью.
Список разрешённых машин общий с рендером и это доказано работой, а не доводом. Закрытая
дверь красит СЕРЫМ, а не красным, и ключ при этом физически никуда не уходит, замерено мной
двумя случаями по отдельному запуску на каждый.
Помощник сверх задания нашёл и починил ложь, которой никто не искал: подпись плитки называла
серый словами не отвечает, то есть гнала владельца продлевать исправные прокси.
Мои ошибки называю первыми, их три.
Пятьдесят девятая. Я назвал adminDashboardHelpers.ts чужим файлом соседней смены прямо в
промте смене 7, в списке не трогать и в коммит не брать. Взял из головы, не замерив. Вся
правка в этом файле - работа моего же помощника. Исполни следующая смена мой промт дословно,
починка подписи плитки не попала бы в коммит и сгорела.
Шестидесятая. Мой снимок оборванного круга был неполон: записал шесть файлов, их семь.
Перечень собрал командой, но раньше, чем помощник закончил, и не перемерил перед тем, как
назвать его окончательным.
Шестьдесят первая. Мой датчик прогона искал не то слово и я чуть не объявил состоявшийся
прогон несостоявшимся. Спас узкий прогон, которым я прибор перепроверил.
Вырезание второго рода дало дыру. Допущение защиты: дверь проверяет адрес из настройки и
считает, что запрос уйдёт именно туда. Случай мимо: разрешённая машина отвечает иди на другой
адрес. Замерено на двух подставных машинах: тайный ключ уехал на машину, которой в списке
разрешённых НЕТ, а плитка осталась ЗЕЛЁНОЙ и показала чужой адрес как свой. Перемерил на
живой двери боевого Поиска клиентов тем же ножом, отдельным запуском - то же самое. Причина
прочитана в исходнике библиотеки: при уходе на чужой адрес снимаются только два заголовка,
и нашего среди них нет. Вторым прибором замерено, что отключения переадресации нет нигде во
всём боевом коде. Это не отменяет Р126, дверь делает обещанное на своих случаях, но обещание
шире дела и про это не сказано нигде. Отдельным кругом.
Датчики: полный прогон моей рукой на своей базе 5344 проверки, 5340 зелёных, 4 пропущено,
красных 0, арифметика сходится. Проверки интерфейса 3 из 3. Разметка 0 ошибок.
Смену остановил владелец. Довожу до логического конца.
Проверка 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, шесть добыты этой сменой.
Срок обеих кампаний истёк 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>
Решение владельца Р127 исполнено коммитом 56ddaa1e. Мой нож замерил: восьмёрка и
семёрка дают теперь ОДИН знак и ОДНО тело, границы держатся, семизначный и
тринадцатизначный номера не тронуты, казахстанский со своим знаком, и правило
устойчиво к повторному приведению.
Моя ошибка первой, пятьдесят девятая. Вынося развилку владельцу, я написал, что у
одиннадцати цифр с восьмёркой второго толкования нет. Я взял это из головы, НЕ
ЗАМЕРИВ. Второе толкование есть: иностранные номера длиной ровно одиннадцать
цифр с кодом на восьмёрку. Большинство дают несуществующий российский номер, но
вьетнамский превращается в живой подмосковный код, и род ошибки меняется с
звонок не состоится на звонок состоится, но не тому человеку.
Правило велит выносить развилку с полным набором дорог. Дороги я вынес полные, а
цену неполную, и владелец решал, не зная её.
Смягчает это одно, и не моя заслуга. Помощник докопал дальше и поправил САМ СЕБЯ:
общий нормализатор телефонов портала живёт в двадцати файлах, включая сам обзвон,
и делает ровно то же самое. Вьетнамский номер портится на входе везде уже
сегодня. Р127 опасности не добавляет, он прекращает расхождение обзвона с
остальным порталом.
Его находка, которую я перемерил своим прибором и подтверждаю: пара из десяти и
одиннадцати цифр даёт ДВА знака на одного человека, и ему позвонят дважды. При
этом общий нормализатор и проверка запрета звонить считают ту же пару ОДНИМ
человеком. То есть беда, ради которой принято Р127, на этой паре жива. Он не стал
чинить и правильно: лечение шире решения, надо сводить три разных канона
телефона, живущих в обзвоне, а один из них сторожит запрет звонить. Вынесено
открытым вопросом первым номером.
Ошибка помощника, названная им первой, редкого рода: он назвал цену нечестно и
едва не отдал её в таком виде, подав общую беду портала как новую опасность
решения. Проверил дальше и поправил себя прямым текстом. Это ровно то, чего метод
требует от надзирателя и чего надзиратель на этот раз не сделал: сперва замер,
потом слово.
Датчики: решений 127, разметка 0 ошибок, правописание протокола 0 жалоб.
Прогон 5301 проверка, 5297 зелёных, 4 пропущено, красных 0.
Решение владельца Р127. В `odinVidNomera` восьмёрка приводится к семёрке
ТОЛЬКО когда цифр ровно одиннадцать. Короткие и длинные номера не трогаются
вовсе: слить двух разных людей в один знак — ошибка тише и хуже, второму не
позвонили бы никогда и молча.
Замерено до правки: `8 999 000-00-01` и `+7 999 000-00-01` давали два разных
знака и два разных тела. Сторожа смотрят на то, что вправду уехало роботу, и
сравнивают дословно — так же, как сравнивает приёмник.
Сторожа показаны красными тремя сломами: без починки, без проверки длины и с
приведением к восьмёрке вместо семёрки. Возврат доказан слепком файла.
Названная владельцу цена: иностранные одиннадцатизначные номера с кодом на
восьмёрку это правило портит. Вьетнамские `8496…`/`8497…`/`8498…` станут
похожи на живые коды Московской области — робот позвонит чужому человеку.
Лечится чисткой номеров на входе, это отдельная задача. Подробности и
незакрытые хвосты — в отчёте.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Решение владельца Р126 исполнено коммитом 92472816, и исполнено ШИРЕ, чем я
заказал.
Моя ошибка первой, пятьдесят восьмая. Я назвал в задании ОДНУ дверь, через
которую уходит тайный ключ боевого Поиска клиентов. Помощник замерил: дверей
ДВЕ, и вторая шлёт тот же ключ по той же настройке. Перепроверил вторым прибором
на версии до его правки: у второй двери был ровно тот же вид проверки и тот же
заголовок с ключом. Почини он только названный мной файл, решение владельца
осталось бы невыполненным, а дыра открытой. Отсюда правило 29: одно найденное
место это находка, а не перечень.
И третья дверь нашлась потом: та же тайна уходит из плитки срока прокси по
другой настройке. Помощник назвал её и НЕ тронул, правильно. Перемерил сам,
вынес владельцу, закрыто отдельным заходом.
Мой нож прогнал одиннадцать форм адреса на боевом окружении с умолчанием списка
машин из хранилища. Пять законных форм открыты, шесть опасных закрыты, и главное
опечатка в адресе машины ловится, а именно она уводила ключ чужому молча и
навсегда. Обратный край тоже верен: при пустом списке дверь закрыта совсем, а
местный адрес без шифрования проходит только не на боевом.
Помощник назвал свою ошибку первой, и она новая для этого проекта: он запустил
полный прогон раньше, чем закончил правку стиля, и через четыре минуты форматтер
переписал два его файла прямо во время прогона. Зелёный цвет такого прогона не
доказывает ничего. Отсюда правило 30.
Вторая его ошибка честнее первой: проверка покраснела на его же оплошности, и
первым побуждением было подогнать код под ошибку. Поправил проверку.
Оговорка, которую называю вслух. Боевое значение настройки адреса НЕ ЗАМЕРЕНО и
замерить его нельзя, это доступ к боевому. Перед выкатом нужна одна команда,
показывающая, начинается ли адрес с шифрованной схемы. Начинается с
нешифрованной, выкатывать нельзя: лечение не обход, а перевод на шифрование,
сертификат на виртуалке уже работает.
Датчики: разметка 0 ошибок, ссылки живые.
11 задач по TDD: два сервиса на бэкенде (вердикт с полоской и лента дел из
пяти источников), ручка подгрузки, живая сортировка списка клиентов, типы и
маппер, русские фразы, панель Vue, точка состояния в списке, полный прогон,
приёмка глазами.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Тайный ключ 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
Портальная причина дыры закрыта коммитом a4ff69aea. Помощник выбрал путь, где
портал считает опознавательный знак задания САМ внутри вызова, а наружу
принимает то, из чего знак складывается. Рассогласовать стало нечего.
Довод, которого не было в моём задании и который решил дело: второй путь всё
равно потребовал бы сменить подпись, потому что для сверки знак надо
пересчитать. То есть он платит ту же цену, а взамен даёт лишний довод, который
может быть только неверным, и новый исход дверь закрыта. А чем кончается
закрытая дверь? Человеку не позвонили. Второй путь не убирает вред, а делает его
громким.
Мой нож мерил не текст, а то, что вправду уезжает роботу. Один человек в двух
записях даёт один знак И одно тело. Строка без цифр закрывает дверь, наружу не
уходит ничего. Вторая попытка и другой клиент дают другой знак.
И мой нож замерил цену того, что помощник НЕ стал чинить осознанно: человек,
записанный восьмёркой и семёркой, считается двумя разными, и ему позвонят
дважды. Он нашёл это сам и вынес владельцу, потому что ошибка в обратную сторону
тише и хуже: слияние двух разных людей означало бы, что второму не позвонят
никогда и молча. Владелец закрыл это решением Р127: восьмёрку приводим к
семёрке только у одиннадцатизначных номеров.
Лучшая ошибка смены, названная помощником первой: его главный сторож был слеп
ровно к той половине беды, ради которой писался. Он сверял согласие с точностью
до приведения номера, а робот сравнивает тело дословно. Вернул беду в код,
сторож остался зелёным. Не сломай он свою починку руками, сдал бы работу с
дырявым главным сторожем.
Промт смене 7 написан: docs/superpowers/2026-08-10-PROMT-obzvon-stroyka-4.md.
В нём правила стройки вперёд всего, 57 ошибок надзирателя, 28 правил, числа
собраны командой, порядок работ и три ловушки, которые выглядят правильными.
В промте смены 6 поставлен указатель, что он отработан.
Датчики: задач 54, врезок ПОСТРОЕНО 19, требований 112, решений 127.
Разметка 0 ошибок, правописание протокола 0 жалоб, все ссылки промта ведут к
живым файлам.
Замерено на боевом: вкладка читает журнал сделок, где 364 из 419 строк —
системные «робот залил лид». Данные про входы и про дела клиента лежат в
двух других журналах и на вкладку не попадают вовсе.
Решения владельца: вердикт + полоска 90 дней + лента только дел, пороги
3 и 14 суток, входы только сверху, заодно чиним мёртвую сортировку списка
клиентов по последней активности.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Портальный клиент голосового робота считал опознавательный знак задания от
ОДНИХ ЦИФР телефона, а в тело задания клал номер КАК ЕСТЬ. Один и тот же
человек, записанный `+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
Задание 88 закончилось после выката и принесло ту же дату старта, а время
изменения кампании №15 осталось от прошлого задания. Раньше совпадало с концом
каждого задания до секунды — значит строку больше не трогают и счётчик 48 часов
пошёл по-настоящему.
Никого не стёрли: перепись боевого 1031 файл до и после, боевая копия файла до
выката побайтово равна прежней версии, после — новой.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>