Commit Graph

8 Commits

Author SHA1 Message Date
Дмитрий 90cf01b374 docs(обзвон): владелец закрыл ВСЕ хвосты — 11 решений, план перестал врать
Разбор хвостов перед стройкой. Ждущих ответа вопросов у стройки больше нет:
шесть «Новое-1…6» из плана закрыты, плюс пять решений сверх них. Протокол
83 решения вместо 72.

Что решил владелец:
- Р73 этикетка чужого юрлица остаётся как есть;
- Р74 дорогу назад для рекламы чинит отдельная смена — до первых живых денег
  обзвона;
- Р75 юриста про голос за границу не спрашиваем, идём как есть. Риск законный
  и он остаётся — записан прямо, а не спрятан;
- Р76 правило часов одно на СМС и обзвон, живой СМС-модуль правим;
- Р77 пять номеров арендуем к первому живому обзвону — ОТМЕНЕНО решением Р83;
- Р78 тариф 2 плюс 10 остаётся, уточним по замеру;
- Р79 длину и содержание речи решает клиент, хвост про опенер снят;
- Р80 робота без слов-запиналок слушаем на приёмке;
- Р81 телефония уезжает на новую АТС, Манго — только испытание;
- Р82 расшифровка чужих записей живёт ШЕСТЬ месяцев, звук 30 дней;
- Р83 у Манго ничего не арендуем, переезд робота в план обзвона не заводим.

Три решения меняют сам план, и правки внесены:
- Р76 разблокировала З-3.1 целиком — развилка «одно правило или второй дом»
  стояла открытой и ждала ровно этого. Отмечено, что круг на боевой файл
  отдельный: своя приёмка, свои две строки про соседей, свой выкат;
- Р82 отменила мою страховку «расшифровка уходит вместе со звуком». Сроков
  теперь два, и чистка обязана стереть звук не тронув текст, а требование
  «сотрите меня» — достать до текста, когда звука уже нет;
- Р81 и Р83 превратили «до аренды» в «до новой АТС» в З-3.3.

Своя неточность названа вслух: в вопросе про часы я сказал «одна настройка»,
хотя решается общий код правила. Часы рассылки и часы обзвона остаются разными
числами — этого требует Т36 и проверка 8 в З-3.1. Записано и в протоколе,
и в плане, чтобы никто не прочитал Р76 как «одни часы на двоих».

Найдено при разборе: два вопроса владельцу, добавленные редактором, не попали
в промт смене 8 — «с какого кода звоним» и «расшифровки чужих записей». Оба
заданы и закрыты. Промт исправлен.

Работа, которая теперь не живёт нигде: перевод машины робота на новую АТС.
В план обзвона не заводим по решению владельца, но машина прописана на Манго
намертво. Названо вслух в протоколе и в промте.

ОБА СТОРОЖА ТЕКСТА БЫЛИ МЕРТВЫ — вскрылось при этом же коммите. Пакеты стояли
на месте, но внутри пустые: у одного остались только лицензия и схема, у другого
файл обрывался посреди строки. Причина — установка, оборванная на пакете,
которому нужен компилятор C++, а его на машине нет.

Два вывода записаны в промт смене 8:
- прежний датчик «посчитай папки в node_modules, должно быть под 750» ЛОЖНЫЙ:
  он показывал 745 при полностью мёртвых сторожах. Заменён на запуск самих
  программ;
- npx МАСКИРУЕТ поломку: не найдя программу на месте, молча качает чужую версию
  из сети, и проверка «проходит». Три отчёта «разметка чистая» в этой сессии
  опирались на неё и доказательством не были.

Починено: сломанные пакеты снесены и поставлены заново без сборки. Сторож
орфографии показан КРАСНЫМ на подсунутой ошибке — только после этого ему верю.
Он же нашёл настоящее: слово «запиналки» отсутствовало в словаре, добавлено.

Проверено командой: план 3341 строка, 21 раздел, 47 задач, по волнам
7·7·5·8·9·3·8. Протокол 83 решения, 7 разделов. Разметка и орфография чистые
живыми сторожами, а не скачанными.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 09:19:27 +03:00
Дмитрий 2c72a0cb6b feat(смс): своё имя есть, но у этой сети не согласовано — номер не уходит вовсе
Решение владельца 05.08.2026. Прежний вариант (подписать нашим «Liderra.ru»)
подменял бренд, за который клиент заплатил, причём незаметно: журнал сообщений
имя отправителя не хранит вовсе. Так уже работает отдел продаж
(SmsRecipientSelector → SKIP_NO_SENDER), и надпись на клиентском экране
(«нет имени отправителя для оператора») давно лежала готовая — её просто никогда
не показывали.

Два случая разведены НАМЕРЕННО и закреплены отдельными тестами:
  • своего имени нет вовсе (или приостановлено) — шлём от имени Лидерры, как
    и раньше. Смешай их — и рассылка встала бы у ВСЕХ разом: на бою своих имён
    заведено НОЛЬ;
  • своё имя есть, но у этой сети не согласовано — номер не уходит.

Отсев в ОТБОРЩИКЕ, а не при отправке: деньги не замораживаются, и причина видна
клиенту в предпросмотре — до оплаты.

🪤 Полный прогон поймал мою ошибку, которую выборочные тесты не видели: имя
спрашивалось ПО КАЖДОМУ номеру — 20 000 запросов в базу, отбор 20 000 получателей
вырос с 20 до 29 секунд и упёрся в сторожа скорости. Добавлена памятка на тенанта
(та же защита, что у AllowedSmsOperators, который прямо об этом предупреждает).
После лечения — 1,47 с.

Два теста часовой давности переписаны: они закрепляли ПРЕЖНЕЕ решение и после
смены решения стали неправдой. Теперь проверяют и «в канал не ушло ничего», и
«деньги целы».

Узкая щель записана в коде: если админ сузит список операторов у имени ПОСЛЕ
создания рассылки, такой номер уже лежит в снимке и уйдёт подписанным нашим именем.
Случай редкий — пересогласование переводит имя в «на рассмотрении», а это снимает
блокировку.

Проверено: 4621 тест, упал один чужой (ExampleTest — в рабочей папке не собран
фронтенд). Статанализ 0. Стиль чист.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 08:21:28 +03:00
Дмитрий c50b3dbe1e docs(обзвон): ворота вслепую и суд пройдены — третья редакция плана, 46 задач
Вторую редакцию проверили трое: двое ворот вслепую и судья. Оба проверяющих
работали по спеке, план им был запрещён словами, оба отчитались «план не
открывал» и оба назвали вещи, которых в плане нет. Судья план читал и искал
ошибки надзирателя.

Проверено командой: план 2801 строка / 19 разделов / 46 задач, спека 2126 / 18 /
96 требований, протокол 2150 / 7 / 72 решения. Разметка чистая во всех трёх.
Полный прогон: 4755 из 4760, упавший тест чужой (коммит 1ed82b6b3), в одиночку
файл проходит 10 из 10 — грязь от соседнего теста, не поломка продукта.

Шесть ошибок надзирателя, найденных судьёй, все настоящие:
- план утверждал, что приёмщица живёт в отдельной папке bots/lena-vhodyashchie —
  такой папки нет, это тот же most.py вторым процессом. Заходов в мост стало
  семь, порядок в таблице горл исправлен;
- наставления робота лежат вне репозитория, задачи на это не было — З-0.7;
- Т13, Т23, Т24 не были поручены никому, все три про то, что робот говорит
  вслух — З-4.8;
- своя очередь и живое обновление экрана выброшены целиком — З-6.8;
- проверка дословности каркаса и три проверки манеры проходили при сломанной
  работе — переписаны;
- порядок по узким горлам врал в пяти местах; З-2.4 обещала поле в карточке
  сделки, не назвав ни одного файла экрана.

Улов ворот, внесённый в план и в новый §18 спеки:
- стирание по требованию человека не достаёт до звука и расшифровки: сделка
  стёрта, голос остался — З-2.5;
- безопасный ритм 40-100 наборов в день на номер измерен нами же, Т38 перебивает
  его в разы; счёт попыток не привязан к человеку — до 24 наборов за двое
  суток — З-3.8;
- дорезерв на ходу Т60 не сработает ни разу: заморозка не складывается;
- реклама физически не возвращается — состояние тупиковое, ручка ждёт другого
  состояния; письмо обещает невозможное;
- замкнутый круг: обзвон морозит деньги, списание тушит Директ, тушение отпускает
  бронь рекламы, её доедает обзвон;
- проверка «наружу не ушло ничего» неисполнима — единого журнала исходящих нет;
- своё окно клиента ломает несущее правило часов «живёт здесь и больше нигде»;
- робот не слушается скрипта — измерено, а вся защита проверяется по тексту
  скрипта; проверки переведены на запись разговора;
- этикетка на экране у человека — чужого юрлица ООО Лизинговая Омега;
- трансграничная передача голоса: в 96 требованиях ни слова.

Два решения владельца, принятых по ходу проверки:
- Р71 арендуем двенадцать номеров, не десять — спор Р41 и Р53 закрыт. Замерено:
  у оператора восемь номеров, докупить надо пять, а не двенадцать;
- Р72 у лидов, пришедших через нашу платформу, согласие уже есть — подтверждение
  спрашиваем у двух источников из четырёх.

Замеры смены: номеров у оператора восемь, в телефонию заведено два, наружу
звоним одним; письмо о нехватке денег одно и боевое; на машине робота 13 ГБ
свободно, записей 68 МБ в 89 файлах, чистки нет.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 05:21:43 +03:00
Дмитрий 784ed07392 docs(обзвон): все 29 развилок пройдены, решения владельца Р50-Р70
Допрос по спеке «Обзвон» доведён до конца: 28 развилок закрыты решениями
владельца, одна (плата за второе плечо перевода) намеренно отложена до замера
цены звонка. Незаданных развилок не осталось — объявлено вслух.

Хранение и закон:
- Р50/Р51 — сроков два: звук месяц, текст три месяца, потом остаются сухие
  итоги. Строку не удаляем: иначе нечем подтвердить счета за прошлые кварталы;
- Р52 — в письме менеджеру и номер, и ссылка на сделку (цена: наша чистка до
  почтового ящика не дотягивается);
- Р59 — об удалении своих записей клиент узнаёт надписью на их месте;
- Р61 — менеджера клиента о записи не уведомляем.

Темп и защита:
- Р53 — шесть попыток в сутки, ровно два дня, всего до двенадцати;
- Р58 — три одновременные линии, больше только через нас (работает без замера);
- Р64 — часы менеджера задаёт клиент, и они только сужают общее окно.

Деньги:
- Р54 — обратный звонок после кампании идёт в долг, ничего не резервируем;
- Р55 — большой список запускать не мешаем, но последствие названо словами и
  нужно подтверждение;
- Р56 — письмо о минусе называет обе остановки: обзвон и рекламу.

Вход и скрипт:
- Р66 — клиента без записей берём: стандартный каркас, наши вопросы, его сайт;
- Р60/Р67 — пятнадцать записей ориентир, список на входе один;
- Р65 — источников получателей три, как в рассылках; моё Т43 снято;
- Р62 — приёмщица одна, но представляется по сделке звонящего;
- Р68 — манера живёт у робота, а не в скрипте;
- Р69 — машина отдаёт скрипт сразу размеченным;
- Р70 — правку раскладывает руками тот, кто её принимает;
- Р63 — на своём номере отвечаем всегда, запрет второго перезвона снят.

Правило, выведенное по ходу и решившее часть вопросов само: надпись — там, где
клиент за свои деньги получает работу; замок — там, где работа гарантированно
бесполезна. Р18 про выбор, а выбора нет, когда результат предрешён.

Три слепых сторожа найдены и переписаны:
- проверка «манера во всех скриптах одинакова» проходила бы ровно при
  расползании правки, то есть зеленела в момент беды;
- проверка «три клиента попросили одно и то же» считала буквальные совпадения
  в свободном тексте, которых не бывает;
- Т70 всё ещё обещало шесть месяцев звука вместо принятого месяца.

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

Настоящий мобильный номер, попавший в протокол как название проекта, замаскирован.
В истории он остаётся (коммит 06f49ce0d) — вычищать историю ветки без владельца
не стал.

План под новые решения НЕ переписан: в нём 32 задачи с пометками
«заблокировано развилкой», расставленными до ответов. Стройку не начинать.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 22:41:27 +03:00
Дмитрий 2ce4bbc058 docs(обзвон): план стройки, ворота по плану и решения владельца Р39–Р41
План фичи «Обзвон» — 32 задачи в шести волнах, 17 помечены «заблокировано
развилкой», в конце таблица «развилка → сколько задач держит».

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

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

Развилок в спеке стало 29. Ни одна не разрешена — это решения владельца.

Новые решения владельца:
- Р39 — режимов обзвона два, морозим по-разному: авто-обзвон по поступлению
  лида, обзвон базы пачкой. Владелец поймал вопросом ошибку в моей
  рекомендации: спрятать заморозку от выключателя значило сделать минус
  ежедневным, а резерв фикцией;
- Р40 — звук храним месяц, не полгода (правит Р22): место падает с ~50 ГБ
  на клиента до ~8, а учит текст, а не звук;
- Р41 — пул номеров общий на портал, аренду платим мы. Чинит то, что сегодня
  человек после робота перезванивает нашему отделу продаж.

Спека дополнена авто-обзвоном (Т33а–Т33е) и разведённой заморозкой
(Т58/Т58а/Т58б).

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

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 14:32:59 +03:00
Дмитрий 06f49ce0d1 docs+защита: спека обзвона по методу ведения фичи, чужие телефоны убраны из виду гита
Дыра: golos-test/inostrannye/ содержала выгрузку «Записи разговоров» с 44 настоящими
номерами живых людей и не была в игноре — любой `git add .` затащил бы персональные
данные в историю навсегда. Закрыто правилом /golos-test/, проверено check-ignore.

Работа шла по docs/superpowers/METOD-vedeniya-fichi-v1.md (файл лежит в ветке
feat/night-dispatcher-part1): спека → ворота вслепую → правки чужой рукой → судья.

- спека фичи «Обзвон»: 72 требования, 18 развилок владельца намеренно не разрешены;
- приёмочный лист ворот написан ДО работы, а не после;
- протокол допроса: решение Р38 (счёт уходит в минус, долг остаётся за клиентом)
  и поправка к приписке про экран СМС — путь к файлу был моей догадкой, а прочитан
  следующими как слово владельца, и по нему ошиблись все трое.

Замеры смены: ворота вслепую двумя разными ходами дали 0 из 72 «умеет»; полный
прогон 4650 проверок, 4646 зелёных, красных ноль.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-04 11:08:18 +03:00
Дмитрий 64fdf5f424 docs(ночной работник): решения владельца 124-127 и промт на обсуждение стройки
Четыре решения владельца, внесённые в планы кусков 5 и 6:
- 124 неясный ответ («может быть») не трогает сделанное — работа ждёт ясного слова
- 125 об отказе кнопки «продолжить» владелец узнаёт из окна, письма не строим
- 126 угол вставшего работника уборка не трогает, пока владелец не решит
- 127 забытый на паузе гасится через сутки, и в письме сказано почему

Внесение вскрыло три вещи:
- решение 127 потребовало нового блока в круге надзирателя: гасить забытую паузу
  ночью больше некому — кнопка ждёт руки, письмо ушло в 08:10, отсечка 8:00
  паузных не трогает по решению 115;
- и этот блок столкнулся с блоком куска 7 по ИМЕНИ: оба назвались 6а,
  27 упоминаний против 26. Разведены: 6а — конец задачи (кусок 7),
  6б — забытая пауза (кусок 6). Порядок круга 6 -> 6а -> 6б;
- у решения 124 нашлось непрописанное следствие: пометить неясный ответ
  отвеченным значит закрыть пункт, сделанный в расчёте на «да».

Числа: кусок 5 — 66 проверок, кусок 6 — 51, кусок 7 — 128. Долгов перед
кусками 1-4 стало 11. Вопросов владельцу осталось 13 из 17.

Промт следующей сессии — только обсуждение, КАК строить. Строить запрещено
прямым указанием владельца.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 17:05:06 +03:00
Дмитрий adc18ce2ae docs(ночной работник): семь планов из семи — затея «дело идёт без владельца» допланирована
Бумаги затеи о ночном работнике, который делает работу по плану восемь часов
без человека, а утром присылает письмо владельцу.

Что лежит:
- бумага «что и зачем» (125 проверок, заморожена) и протокол допроса, 123 решения владельца
- разрез на семь кусков «тонкой нитью насквозь» и договор о стыках
- семь планов: куски 1-4 с кодом, куски 5-7 без кода (решение владельца 121)
- записи ворот, правщиков и сквозных ворот, 45 файлов

Порядок работы, отработавший впервые целиком: договор, трое пишущих разом,
ворота двумя углами на каждый план, правщик, СКВОЗНЫЕ ВОРОТА двумя углами,
правщик стыков.

Числа: 400 находок ворот за затею, из них 160 за 01.08, ложная одна.
Решение 121 (план без кода) проверено замером: планы вдесятеро короче прежних
при том же числе проверок, а находок не меньше — но смысловых вместо механических.

Сквозные ворота дали 25 находок, ложных ноль, и поймали класс, невидимый
изнутри одного плана: приёмка сносила рабочий угол под живым работником,
поднятым кнопкой «продолжить». Куски 6 и 7 не назвали друг друга ни разу.

Строк настоящего кода — ноль. Ночей отработано — ноль. Стройка не начиналась.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 16:18:07 +03:00