docs обзвон: владелец закрыл десять развилок Р105-Р114

Обход дерева развилок 06.08.2026, порядок «сначала необратимое». Пройдены все
восемь вопросов, висевших на владельце, и открытая развилка внутри задачи З-2.4.

Р105 облачное хранилище под записи — пока не заводим, звук на диске портала.
Р106 очередь обзвона на боевом — отдельный работник, ставится при выкате.
Р107 заготовки робота — кладём в хранилище все, 4,8 МБ.
Р108 лишняя копия моста с дырой — переложена в игнорируемую папку, исполнено.
Р109 подпись столбца в боевой базе — правим вместе с выкатом обзвона.
Р110 четыре чужие бумаги про несуществующую защиту — дописываем замер рядом.
Р111 сторожа машины робота — заводим задачей, с письмом при красноте.
Р112 в сделке значение сверху и лента всех контактов под ним.
Р113 тот же номер в новом списке — прошлое показываем, звонить не запрещаем.
Р114 «не звоните мне больше» — робот заносит в список сам.

Замеры, добытые по ходу и изменившие ответы:

- 🔴 прежнее число «полтерабайта записей» завышено впятеро: считалось без учёта
  решения Р95, по которому звук живёт месяц. Верно около 87 ГБ при десяти
  клиентах, цена порядка 200 ₽ в месяц;
- 🔴 на живом боевом замерено только чтением: работник очередей запущен без
  указания очереди и берёт только default; очередь obzvon не разбирает никто.
  Вреда сегодня ноль — модуль не выкачен;
- заготовки робота оказались синтезом машины, а не голосами живых людей —
  личных данных в них нет. Семь папок из восьми делаются заново своими
  скриптами; невосстановима одна, tempy2;
- копия моста в корне побайтово совпала с резервной копией на машине робота,
  слепок 0975e226672853efa785a0fbb6f188a00aa3c3c2;
- итог по номеру уже привязан к кампании уникальным ключом, поэтому вопрос
  «сколько живёт итог» снят устройством, а не решением;
- развилка про стоп-лист оказалась уже записанной в спеке как открытая.

🪤 Своя ошибка при замере, названная первой: приговор «подписи в боевой базе нет»
был ложным. Первый прибор сопоставлял столбцы по порядковому номеру, а он
расходится с внутренним, если из таблицы удаляли столбец. Второй прибор показал,
что подпись есть и она старая. Ровно тот случай, ради которого в методе записано:
приговор «этого нет» — только вторым прибором.

Проверено прибором: решений 114, номера без пропусков, разметка 0 ошибок.
This commit is contained in:
Дмитрий
2026-08-06 14:59:49 +03:00
parent 13ce301ab3
commit 8fef11622e
@@ -2936,8 +2936,481 @@ Managed PG стоит `anon 1.3.2`, статическое маскирован
---
### Р105. Облачное хранилище под записи разговоров — пока не заводим
**Вопрос.** Задача З-2.1 построила у портала приёмную сторону для звука: склад,
переезд, три замка. Склад сделан **переключаемым**: он может лежать либо на диске
машины портала, либо в облачном хранилище — это одна строка настройки, код правит
не надо. Но у местного диска **не бывает ссылок со сроком**: замерено запуском —
портал отдаёт вечную ссылку либо не отдаёт никакой. Мы выбрали не отдавать
никакой. ⇒ пока склад местный, кнопки «послушать запись» у человека **нет вовсе**.
Вопрос владельцу: заводить ли облачное хранилище — это деньги.
**Замеры к вопросу (собраны 06.08.2026):**
- 🔴 **Поправка к прежнему числу.** В промте смене 5 стояло «50 ГБ за полгода, при
десяти клиентах — полтерабайта». Оно посчитано так, будто записи копятся вечно,
и **не учитывает Р95**: звук живёт месяц, старое удаляется. В хранилище всё
время лежит **месяц** записей, а не полгода — около **8,7 ГБ на клиента**, при
десяти — около **87 ГБ**.
- Цена облачного хранилища Яндекса: обычное ≈ **2,2 ₽** за гигабайт в месяц,
холодное ≈ **1,2 ₽**, первый гигабайт бесплатно; раздача наружу — первые 100 ГБ
в месяц бесплатно. ⇒ один клиент ≈ **20 ₽ в месяц**, десять ≈ **200 ₽**.
Вперёд платить не нужно, счёт идёт по занятому месту.
**Решение владельца: пока не заводим.** Звук ложится на диск машины портала.
**Отрезано и почему:**
- ✂️ **«завести сейчас»** — отрезано владельцем, **хотя цена оказалась мала**
(порядок двухсот рублей в месяц). Решение принято не из-за денег;
- ✂️ **«решить в день первого живого звонка»** — отрезано: владелец не отложил
вопрос, а ответил на него. Склад местный, и это рабочее положение, а не пауза.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **Ссылки «послушать запись, срок час» не будет.** Не «вечная» — **никакой**.
Это не недоделка и не долг: это прямое следствие решения. Тому, кто будет
рисовать экран разговора, надо знать заранее — кнопки там не появится.
2. 🔴 **Свободное место на диске машины портала НЕ ЗАМЕРЕНО.** Мерить его — значит
лезть на боевой сервер, а туда без слова владельца нельзя. 87 ГБ голоса при
десяти клиентах — не мелочь, и портал падает от переполненного диска целиком, а
не одним обзвоном.
3. 🔴 **Месячная уборка до нового склада ещё не доведена.** Р95 исполнен на машине
робота — там скрипт и расписание. Про склад портала это **отдельная работа**, и
пока её нет, «лежит месяц» — намерение, а не устройство. Без неё диск копит
без предела, и оценка 87 ГБ неверна.
4. **Момент возврата к вопросу не назначен.** Годный признак для возврата — не
календарь, а замер: сколько свободного места осталось на машине портала.
---
### Р106. Очередь обзвона на боевом — отдельный работник, ставится при выкате
**Вопрос.** У обзвона три фоновые работы, и все три положены в **свою** очередь
`obzvon`: перевозка звука в хранилище, шаг заморозки под лид, запуск обзвона базы.
Смена 3 заметила по бумагам, что работник очередей на боевом запущен **без
указания очереди** — такой берёт только `default`. Бумага — не замер, и владелец
разрешил сходить на боевой **посмотреть, ничего не меняя**.
**Замерено на живом боевом 06.08.2026, только чтение:**
| работник | чем запущен | жив |
|---|---|---|
| `liderra-queue` | `queue:work redis` — 🔴 **очередь не указана** ⇒ только `default` | да |
| `liderra-queue-bot` | `queue:work redis --queue=bot` | да |
Размер очередей: `default` — 0, `obzvon` — 0, `bot` — 0. Павших работ — 3, старые,
к обзвону отношения не имеют.
**Догадка подтвердилась: очередь `obzvon` не разбирает никто.** Но вреда сегодня
**ноль**: модуль обзвона на боевой не выкачен, класть в эту очередь некому.
Вопрос владельцу: каким способом чинить в день выката.
**Решение владельца: заводим отдельного работника только под обзвон** — так же, как
уже сделано для бота.
**Отрезано и почему:**
- ✂️ **«дописать очередь `obzvon` к общему работнику»** — отрезано, хотя это правка
одной строки без новых частей. Причина: работы обзвона **долгие** — перевозка
звука и запуск целой базы. В общей очереди они придержат письма, выгрузки и СМС;
- ✂️ **«решим в день выката»** — отрезано: в день выката будет спешка, а выбор
всё равно пришлось бы делать.
🔴 **Чего это НЕ закрывает.**
1. **Работника ещё нет.** Решение назначает способ, а не исполнение. Пункт
обязан попасть в лист выката модуля обзвона, иначе повторится ровно то же:
код есть, работы копятся, журнал чист.
2. 🔴 **Беда была бы МОЛЧАЛИВОЙ.** Ненайденная, она выглядит как здоровье:
портал отвечает, ошибок нет, обзвон просто не едет. Это тот же класс, что
уборка без расписания (Р98) — построено, но никем не позвано.
3. **Отдельный работник — это ещё и отдельная точка отказа.** Он может умереть
один, не уронив портал. Кто и чем это заметит — не решено.
4. **Три павшие работы на боевом не разобраны.** Они чужие и старые, обзвона не
касаются, но лежат.
---
### Р107. Заготовки робота — кладём в хранилище ВСЕ
**Вопрос.** Заготовки, на которых настраивали голос Лены, лежат во **временной**
папке машины `/tmp/lena-inworld`. Временную папку уносит перезагрузка, и никто эти
файлы не воссоздаёт. Машина не перезагружалась с 05.07.2026.
**Замерено на машине робота 06.08.2026, только чтение:**
- во временной папке 68 МБ, но **63 из них — записи разговоров**, у которых своя
месячная уборка. Собственно заготовки — **4,8 МБ**: четыре файла подставного
собеседника и восемь папок;
- 🔑 **это не голоса живых людей.** Всё наговорено машиной: подставной собеседник
озвучен синтезом голосом «Tamara» (нарочно не «Elena» — чтобы на записи было
слышно, кто где), плюс девять образцов женских голосов для выбора. ⇒ **личных
данных в заготовках нет**, класть их в хранилище можно;
- **семь папок из восьми делаются заново**: скрипты, которые их создают, лежат в
надёжной папке и перезагрузку переживут;
- 🔴 **папка `tempy2` невосстановима** — шесть образцов скорости речи
(0,9 · 1,0 · 1,1 · 1,2 · 1,35 · 1,5), 404 КБ. Скрипта, который их сделал,
**больше нет**: о папке помнит только уборка, которая её бережёт.
**Решение владельца: класть в хранилище ВСЕ заготовки, 4,8 МБ.**
**Отрезано и почему:**
- ✂️ **«только невосстановимое `tempy2`»** — отрезано, хотя это 404 КБ вместо 4,8 МБ.
Владелец выбрал не полагаться на «переозвучим заново»: переозвучка — это время,
ключ, работающая сторонняя ручка синтеза и деньги, и любое из четырёх может
однажды не совпасть;
- ✂️ **«не класть ничего»** — отрезано: шесть образцов скорости погибли бы навсегда.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **Записи разговоров — 63 МБ — в хранилище НЕ КЛАДЁМ.** Это настоящий звук
настоящих звонков, и решение к нему не относится. Тот, кто будет исполнять,
обязан взять **только** заготовки, иначе личные данные уедут в коммит.
2. **Решение не назначает, кто раскладывает их обратно.** Положить в хранилище —
половина дела. Чтобы после перезагрузки они снова оказались на машине, нужен
тот, кто их туда вернёт. Иначе повторится Р98: положено, но никем не позвано.
3. **Скрипт, делавший `tempy2`, не восстановлен.** Файлы уцелеют, а умение сделать
их заново — нет.
4. **Заготовки — не эталон.** Побайтовые сторожа их не стерегут, и расхождение
между хранилищем и машиной никто не заметит.
---
### Р108. Лишняя копия моста в корне — переложена в игнорируемую папку
**Вопрос.** В корне хранилища лежал `most-server.py` — 322 строки, никем не
заведённый: гит его не отслеживал. Смена 3 заподозрила, что это копия моста **до**
починки З-0.8, то есть с дырой внутри.
**Замерено 06.08.2026:**
- 🔑 **это побайтово та самая резервная копия**, снятая на машине робота 03.08
перед правкой. Слепки сошлись знак в знак:
`0975e226672853efa785a0fbb6f188a00aa3c3c2` — и у файла в корне, и у
`/home/ubuntu/lena-inworld/most.py.bak-20260803-104305`;
- 🔴 **дыра настоящая**: строка 211 печатает дословные слова человека —
`👤 человек: <сказанное>`. Ровно то, что З-0.8 убирала.
Опасен он был не тем, что лежал, а тем, что **выглядел рабочим мостом**: скопировать
его на машину — и вся работа З-0.8 отменилась бы молча.
**Решение владельца: переложить в папку `моя/`,** которая в хранилище не попадает.
**Исполнено в тот же час, проверено:** слепок после переноса **не изменился**
(`0975e226…`), из корня файл исчез, гиту не виден. Новое имя названо так, чтобы
следующий человек не ошибся:
`моя/most-server-kopiya-do-pochinki-03-08-2026-S-DYROY.py`.
**Отрезано и почему:**
- ✂️ **«удалить совсем»** — отрезано: побайтовая копия есть на машине робота, но
машина однажды может пропасть, и тогда пропадёт и она. Перенос ничего не теряет;
- ✂️ **«оставить как есть»** — отрезано: ловушка осталась бы лежать на виду рядом
с рабочими файлами.
🔴 **Чего это НЕ закрывает.**
1. **Копия с дырой продолжает существовать** — и в `моя/`, и на машине робота под
именем `.bak`. Решение убирает её с дороги, а не из мира.
2. **Откуда она взялась в корне — не выяснено.** Гит её не помнит, значит она
попала туда мимо коммитов. Тот же путь открыт и для следующего такого файла.
3. **Сторожа на «в корне нет ничего лишнего» нет.** Найдено глазами при разборе, а
не прибором.
---
### Р109. Подпись столбца в боевой базе — правим вместе с выкатом обзвона
**Вопрос.** Решением Р103 поправлена **бумага**: канон схемы перестал обещать
защиту, которой нет. Но такая же надпись живёт **внутри самой боевой базы**
у столбца `pd_subject_requests.processing_restricted` есть подпись, и она осталась
прежней.
**Замерено на живом боевом 06.08.2026, только чтение. Текст подписи:**
> «При TRUE все операции с ПДн субъекта блокируются на уровне сервиса
> (**ProcessingRestrictedException**). Сохраняется только право на хранение и
> удаление.»
🔴 **Класса `ProcessingRestrictedException` в проекте не существует** — проверено
двумя приборами: ни поиском по коду, ни поиском по именам файлов. Подпись называет
защиту **поимённо**, и этой защиты никогда не было.
🪤 **Своя ошибка при замере, названная первой.** Первый прибор ответил «подписи
нет» — сопоставлял столбцы по порядковому номеру, а он расходится с внутренним
номером, если из таблицы когда-то удаляли столбец. Второй прибор показал, что
подпись есть. Ровно тот случай, ради которого в методе записано: **приговор «этого
нет» — только вторым прибором, и «ноль» — самый опасный ответ прибора.**
**Решение владельца: править вместе с выкатом модуля обзвона,** отдельного похода
на боевой не делаем.
**Отрезано и почему:**
- ✂️ **«править отдельно и сейчас»** — отрезано: лишнее касание боевого ради
текста. Подпись данных не трогает, срочности нет;
- ✂️ **«не трогать вовсе»** — отрезано: база и бумага говорили бы разное, а
проверяющий скорее поверит базе — она ближе к делу.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **До дня выката ложь остаётся в боевой базе.** Если проверка придёт раньше
выката, она прочтёт именно её.
2. **Пункт обязан попасть в лист выката** — иначе он потеряется так же, как
потерялся работник очереди (Р106).
3. **Подпись — единственная у этой таблицы.** У остальных четырнадцати столбцов
подписей нет вовсе, и вопрос «а надо ли им» не ставился.
4. **Решение не строит защиту.** Флаг «прекратить обработку» как не запрещал
ничего, так и не запрещает (Р103).
---
### Р110. Четыре чужие бумаги про несуществующую защиту — дописываем замер рядом
**Вопрос.** Решением Р103 поправлен канон схемы. Но то же обещание — «флаг
„прекратить обработку" всё блокирует» — живёт ещё в **четырёх** бумагах, которые
обзвону не принадлежат.
**Замерено 06.08.2026, командой по каждой бумаге:**
| бумага | что обещает |
|---|---|
| `Analiz_originala_v8_3.md:736` | дословно повторяет старую подпись столбца, включая `ProcessingRestrictedException` **и защиту по строкам** |
| `CRM_bp-gr_Инструкция_v8_5.md:38` | жёсткий запрет входа под клиента, «единый охранник в `SaasAdminAuthService`» — такого класса **нет** |
| `Workflow_pd_subject_requests_v8_2.md:7` | «✅ **закрыт**… все операции обязаны проверять флаг и отказывать» |
| `Открытые_вопросы_v8_3.md:2163` | 🔴 **Ю-9 стоит среди двенадцати закрытых P1** — построено под ним ничего |
Худшая — последняя: пункт числится в списке **сделанного**.
**Решение владельца: дописать рядом с каждым обещанием врезку-замер** — «замер
06.08.2026: не построено, класса такого нет». Ничего не удалять и не переписывать.
**Отрезано и почему:**
- ✂️ **«переписать разделы по-настоящему»** — отрезано: снять у Ю-9 галочку
«закрыт» значит **двигать закрытый вопрос обратно в открытые**, а это отдельное
решение владельца, а не побочный итог правки бумаги;
- ✂️ **«не трогать вовсе»** — отрезано: канон базы говорил бы одно, четыре
бумаги — другое.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **Ю-9 остаётся в списке закрытых.** Врезка объяснит, что под ним пусто, но
счётчик «двенадцать закрытых» останется прежним. Кто читает только счётчик —
будет введён в заблуждение по-прежнему.
2. **Защиты как не было, так и нет.** Правка бумаги делает положение честным, а не
защищённым — то же, что записано при Р103.
3. **Сторожа на эти четыре бумаги нет.** Живой сторож канона читает бумаги под
`db/`, а эти лежат в `docs/`. Ложь сможет вернуться незамеченной.
4. **Формулировка врезки не согласована.** В каноне она вышла длинной; в чужих
бумагах её длину и место придётся выбирать исполнителю.
---
### Р111. Сторожа машины робота — заводим задачей, с письмом при красноте
**Вопрос.** На машине робота живут три сторожа — 26 проверок на уборку звука,
46 на текстовый след и 27 на сам скрипт уборки. Они ходят по связи и меряют
**жизнь**, а не бумагу. Но зовёт их только человек, который помнит про них.
Уборка, умершая молча, выглядит как уборка, которой нечего делать.
**Замерено на машине 06.08.2026:**
- 🔴 **почтовых программ на машине НЕТ вовсе**, и получатель в расписании не задан.
⇒ поставить сторожей расписанием прямо там — значит получить отчёт, который
**никто никогда не прочтёт**. Это ровно та болезнь, от которой лечим;
- в расписании машины сегодня три записи: своя уборка звука, уборка выжимок проб и
системная `e2scrub_all`.
**Решение владельца: завести задачей.** Машина раз в сутки проверяет себя сама и
кладёт итог файлом; портал этот файл читает и **шлёт письмо, если красно**.
**Отрезано и почему:**
- ✂️ **«вписать сторожей в общий прогон проверок портала»** — отрезано: сторожам
нужен ключ от машины. У соседних смен его может не быть, и тогда либо чужой
прогон краснеет зря, либо сторож зеленеет **«не глядя»** — а зелёный, означающий
«не смотрел», опаснее отсутствия сторожа (урок смены 4);
- ✂️ **«оставить руками»** — отрезано: живёт ровно до первой смены, которая
пропустит шаг;
- ✂️ **«расписание прямо на машине»** — отрезано **замером**: голос подать нечем.
🔴 **Чего это НЕ закрывает.**
1. **Задачи ещё нет.** Решение назначает устройство, а не исполнение: задачу надо
завести в плане, и счётчик задач в шапке плана вырастет.
2. 🔴 **Появляется новый молчун.** Тот, кто носит итог с машины в портал, сам может
умереть тихо — и тогда писем не будет, а выглядеть это будет как «всё хорошо».
У новой задачи обязана быть проверка **на свежесть итога**, а не только на его
содержимое.
3. **Адрес получателя не назначен.** Куда именно идёт письмо — не решено.
4. **Ключа от машины у портала нет.** Каким путём итог попадает с машины в портал —
не выбрано, и это самая тонкая часть будущей задачи.
---
### Р112. В сделке — значение сверху и лента всех контактов под ним
**Вопрос.** План З-2.4 оставил открытым: семь исходов Т21 надо разложить на «про
попытку» и «про номер», потому что у номера бывает много попыток, а в карточке
сделки место одно.
**Владелец постановку переиграл.** Дословно: *«мы сохраняем каждый контакт если
есть хоть секунда разговора! и показываем его клиенту — если человек взял и сразу
скинул мы это демонстрируем, и если перезвонил тоже показываем. Недозвон просто
пишем сколько попыток было.»*
То есть в сделке живёт не один победивший исход, а **история**.
**Решение владельца — устройство карточки:**
1. **Сверху одно значение** — исход **последнего состоявшегося** разговора.
🔴 Недозвоны его **не меняют**: двенадцать недозвонов после удачного разговора
не затрут удачный разговор.
2. **Под ним лента всех контактов**, где была хоть секунда разговора: дата,
длительность, исход, запись. Перезвонил человек сам — тоже строка в ленте.
3. **Недозвоны в ленту не попадают** — они сворачиваются в одну строку
«не дозвонились: N раз».
🔑 **Это объясняет прежнее решение Р88 задним числом.** Отдельный исход «взял и
сразу бросил» заводить не нужно именно потому, что контакт длиной в секунду
**показывает себя сам** — своей длительностью в ленте. Р88 не обходится, он
работает.
**Отрезано и почему:**
- ✂️ **«в карточке всегда исход последней попытки, какой бы ни был»** — отрезано:
один недозвон стёр бы всю картину;
- ✂️ **«побеждает самый резкий исход — отказ и агрессия перекрывают всё»** —
отрезано: человек, который передумал и согласился, выглядел бы отказавшимся;
- ✂️ **«только лента, никакого одного значения»** — отрезано: в списке сделок
нечем было бы отобрать «покажи всех, кто отказал», и рассыпалось бы требование
Т65 о собственном статусе обзвона.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **Требование Т84 в спеке сформулировано теснее этого решения** — там сказано
«в сделке стоит итог по номеру, а не последняя попытка», и про ленту не сказано
ничего. Спеку придётся дописать, иначе построят по старому тексту.
2. 🔴 **Решение Р47 говорит «единственный итог по номеру».** Оно не отменено:
единственный итог остался — это значение сверху. Но читать Р47 теперь надо
вместе с этим решением, иначе он звучит как запрет ленты.
3. **Срок жизни итога не решён.** Что будет, если тот же номер придёт новым
списком через полгода, — отдельный вопрос, он остаётся открытым.
4. **Лента — это лишние запросы к базе.** Проверка 6 задачи З-2.4 требует, чтобы
таблица сделок не стала медленнее. Лента живёт в карточке, но счётчик и
значение придётся показывать и в списке — и вот там лишний запрос на каждую
строку смертелен. На этом месте проект уже спотыкался дважды.
5. **Где кончается «хоть секунда» — не назначено.** Разговор длиной ноль секунд
и разговор длиной одну секунду различаются, а разговор в 0,4 секунды — вопрос.
---
### Р113. Тот же номер в новом списке — прошлое показываем, но звонить не запрещаем
**Вопрос.** План З-2.4 спрашивал: сколько живёт итог по номеру, если тот же номер
придёт новым списком через полгода.
🔑 **Замер снял половину вопроса.** Итог уже построен привязанным **к кампании**,
а не к номеру вообще — в каноне стоит
`UNIQUE (tenant_id, campaign_id, phone)`. Значит новый список **сам заводит новый
итог**, а прежний остаётся в истории. Спрашивать «сколько живёт» нечего: он живёт
столько же, сколько своя кампания.
Заодно замером подтвердилось, что построенное уже совпадает с Р112: в таблице есть
`attempts_count` — тот самый счётчик недозвонов — и ровно **восемь** значений
исхода, как требует Т65.
**Решение владельца: прошлое показываем, но звонить оно не запрещает.** В карточке
видно «полгода назад отказался»; набор номера это не блокирует.
**Отрезано и почему:**
- ✂️ **«прежний отказ запрещает звонок навсегда»** — отрезано: запрещать — работа
стоп-листа, он уже есть и заведён именно для этого (Р45, задача З-3.2). Два
разных запрета рано или поздно разойдутся, и отменить второй будет нечем;
- ✂️ **«прошлое не показываем, новый список с чистого листа»** — отрезано:
менеджер не узнал бы, что этому человеку уже звонили и он ругался.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **Итог и стоп-лист теперь обязаны быть связаны руками.** Человек, сказавший
«не звоните», даёт исход «отказ» — но в стоп-лист он попадает **только если его
туда положат**. Кто и в какой миг это делает — не решено, а это и есть главная
защита.
2. **«Показываем» — не значит «видно».** Прежний итог лежит в другой кампании;
чтобы он оказался в карточке, его надо туда достать. Это лишний запрос, и он
попадает ровно под проверку 6 задачи З-2.4.
3. **Сколько прошлого показывать — не назначено.** Одну прошлую кампанию или все.
4. **Решение не касается стирания по требованию.** Р97 уже сказал: стоп-листы при
стирании не вычёркиваем. Прошлые итоги под это правило не подводились.
---
### Р114. «Не звоните мне больше» — робот заносит в список сам
**Вопрос.** Спека держала это открытым прямым текстом (Т80, §13 п. 28): попадает
ли человек в список «не звонить» **сам**, сказав роботу в трубку «не звоните мне
больше», — или только руками клиента.
**Цена ошибки неравна.** Робот распознаёт слова и может ослышаться. Ошибка в одну
сторону — не позвонили тому, кто хотел разговора: потеря сделки. Ошибка в другую —
позвонили тому, кто просил не звонить: жалоба и закон.
**Решение владельца: робот заносит сам, снимает только человек руками.** В карточке
видно, что запись поставил робот, — если это была ошибка слуха, клиент снимет.
**Отрезано и почему:**
- ✂️ **«только руками клиента»** — отрезано: отказ жил бы ровно столько, сколько
кто-то помнит его перенести. Это тот же класс, что уборка без расписания (Р98) и
сторожа без зовущего (Р111);
- ✂️ **«робот предлагает, клиент подтверждает»** — отрезано: между просьбой
человека и запретом появилось бы окно, и в это окно ему могли позвонить снова.
🔴 **Чего это НЕ закрывает.**
1. 🔴 **По каким словам робот считает, что его попросили,** — не назначено.
«Не звоните мне больше» он поймёт, а «слушайте, хватит уже» — вопрос. Список
слов придётся выбирать, и он же определит, как часто робот будет ошибаться.
2. 🔴 **Исход «агрессия» — не то же самое, что просьба не звонить.** Человек,
сказавший «это незаконно, откуда мой номер», отказа от звонков не заявлял.
Кладём ли и его — не решено.
3. **Как клиент снимает запись — не построено.** Решение опирается на то, что
клиент увидит пометку и сможет её снять; экрана для этого нет.
4. **Список отказов обзвона — пятый, отдельный** (Т79, Р45). Занесённый роботом
номер по-прежнему получит СМС и телеграм: остальные четыре списка этот не
читают. Так решено, но человеку это придётся объяснять.
5. **Стирание по требованию списка не чистит** — Р97. Значит запись переживёт
удаление остальных данных человека, и это осознанно.
---
## Осталось открытым
**Открылось при обходе 06.08.2026 — порождено решениями Р105–Р114:**
- **По каким словам робот считает, что его попросили не звонить** (Р114). «Не
звоните мне больше» поймёт, «хватит уже» — вопрос. Список слов задаёт и частоту
ошибок слуха.
- **Кладём ли в список отказов исход «агрессия»** (Р114). «Откуда мой номер» —
не заявление об отказе от звонков.
- **Каким путём итог сторожей попадает с машины робота в портал и на какой адрес
идёт письмо** (Р111). Ключа от машины у портала нет.
- **Где кончается «хоть секунда разговора»** (Р112). Ноль секунд и одна секунда
различаются, а 0,4 секунды — вопрос.
- **Сколько прошлых кампаний показывать в карточке** (Р113) — одну или все.
- **Когда возвращаться к вопросу об облачном хранилище** (Р105). Годный признак —
не календарь, а замер свободного места на машине портала; сам замер требует
слова владельца.
**Открыто раньше:**
- **Путь (в) — письменные итоги сделок из CRM клиента.** Отклонён при Р3
(«нет»), но модель Б, которая на нём держалась, тоже отклонена. Нужен ли он
как подпорка к аудио — не спрашивали заново.