Commit Graph

386 Commits

Author SHA1 Message Date
Дмитрий 3ab8b2cbff feat(sales): руками введённые телефоны контактов чистятся при сохранении (формат 79…, дубли долой)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 08:57:02 +03:00
Дмитрий 44b892c771 feat(sales): экран «Реклама на кандидатов» в кабинете начальника
GET/PATCH /api/sales/ad-audience — три числа (в рекламе сейчас, выходят на
этой неделе, ждут отправки), рубильник и срок хранения номера. Доступ только
роли head — гейт denyIfNotHead зеркалит SalesManagersController.

Экран объясняет обычными словами, что список пополняется только кнопкой
«Отправить в рекламу» в Поиске клиентов, и предупреждает, когда номеров
меньше 100 (Яндекс не запустит рекламу).

Тесты: 9 в tests/Feature/Sales/AdAudienceScreenTest.php (доступ, три числа,
смена настроек, валидация срока). SharesSupplierPdo — модели на pgsql_supplier.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-19 08:46:36 +03:00
Дмитрий 536716a65e @
feat(судья): опровергатели против ложных тревог + чтение всех трёх форм журнала

Владелец: «нам надо пару сотен разговоров прогнать, мы умрём слушать сами».
Значит на объёме ложная тревога дороже пропуска: судья с выдумками бесполезен,
ему перестают верить. Первый живой запуск коллегии 19.07 дал ЧЕТЫРЕ ложных
СТОПа на два разговора — два разных довода принял за противоречие, оговорку
«приходят люди или нет» за гарантию, настоящий подарок за возврат денег.

Два системных замка, оба универсальные:

  1. Поле «narushen» вместо разбора прозы. Судья писал в обосновании
     «признак соблюдён, нарушения нет» — и всё равно подавал это находкой.
     Думать вслух теперь некуда: есть отдельное поле. Поля нет (старая форма
     ответа) — считаем нарушением, чтобы не терять молча.

  2. Опровергатели. Каждый СТОП коллегии уходит к трём независимым судьям,
     которым велено ОПРОВЕРГНУТЬ, и при сомнении опровергать. Опровергнут
     двумя из трёх — понижается до СИГНАЛА (не выбрасывается: судью самого
     надо мерить). Приборные СТОПы через опровержение НЕ гоняем — приборы
     нельзя уговорить, а деньги владельца тратить незачем.

Проверка на живых деньгах, эталон v9 от 17.07:
  было  — СТОП по трём обвинениям, два из них выдуманы;
  стало — оба выдуманных опровергнуты и понижены, СТОП остался ОДИН
          и настоящий: прибор 15 поймал перевёрнутую цену
          «от пятидесяти пяти до двадцати пяти». 10 обращений, 4.11 ₽.

Судья теперь читает все три формы журнала (боевой мост / стенд моста /
движок v9) + автоопределение формы: владелец подсовывает файл, не думая.
Стенд и движок не пишут решение маршрута — признак 44 там честно
не измеряется, а не делает вид, что проверен.

🪤 Четвёртый вид тех же граблей: прибор 41 «цену вперёд не тащи» ловил слово
«почему» — внутри него сидит «почем». Обвинял её за вопрос «почему не начали».
Найдено судом над эталоном, починено, регрессия закреплена.

Тестов 77 → 100.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-19 08:39:16 +03:00
Дмитрий b4c51bf0bc feat(admin): СМС-центр (smsc.ru) на плашке внешних сервисов — баланс, пороги, кнопка пополнения
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 08:25:28 +03:00
Дмитрий bb20a8859d @
feat(sales): приём номеров в рекламную аудиторию

Сервис-канал POST /api/sales/integration/ad-audience (тот же X-Sales-Token,
что и «Отдать менеджеру»). Новый номер добавляем, известный — продлеваем срок
из настройки и просим ночной джоб дослать (synced_at=NULL, removed_at=NULL).
Формат Яндекса строгий: 11 цифр с 7, без плюса.

Task 3 плана 2026-07-19-reklamnaya-auditoriya-kabinet-nachalnika.

Моделям дописаны @property-докблоки (конвенция проекта, как у SalesProspect) —
без них Larastan не видит полей.

Тесты: 6 в tests/Feature/Sales/AdAudienceIntakeTest.php, вся Sales-пачка 264 зелёные.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@
2026-07-19 08:16:14 +03:00
Дмитрий d7e6766760 feat(sales): модели рекламной аудитории 2026-07-19 08:01:58 +03:00
Дмитрий 237be1f7fd @
feat(судья): закрыты три слепых пятна — сор из избы, маршрут обязательств, разворот сферы

Четыре дефекта живого прогона 18.07 судья не видел. Три из них закрыты
приборами и рубрикой, четвёртый (противоречие себе) уже покрыт признаком 13
и ждёт первого живого запуска коллегии.

Лечим КЛАСС, а не случай — ни одного слова из живого разговора в коде нет:

  43 «сор из избы» (правдоруб, СТОП) — признание клиенту наших сбоев и
     внутренней кухни. Смысловой, судит роль. Тест запрещает привязку к фразе.
  44 «зона обязательств ведётся умным мозгом» (прибор, ТРЕВОГА) — меряем
     РЕШЕНИЕ маршрута, а не имя модели. Зона = вопрос И тема обязательств.
     🔴 Вторая сторона правила важнее первой: когда ухо съедает ключевое слово,
     реплика клиента в журнале уже испорчена — зато её ответ цел. Заговорила
     про обязательства с быстрого мозга — тот же дефект с уцелевшей стороны.
  45 «разворот сферы доведён до конца» (прибор, ТРЕВОГА) — судья не знает
     ни одной ниши, читает след моста: заметил чужую сферу и не сменил справку.

Мост НЕ тронут: весь след уже был в журнале, надо было научиться читать.

🪤 Третий раз одни грабли: первая версия прибора резала правду
(«Договорились!» → договор, «Отвечаю:» → ответственность). Поймано только
адверсарным прогоном НА ПРАВДЕ. Формы сужены, регрессия закреплена тестом.
Итог прогона: 12/12 верных реплик чисто, 4/4 бракованных пойманы.

Тестов 61 → 77.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-19 07:49:02 +03:00
Дмитрий d7eaee6021 feat(finder): убраны значки 📱☎️ из подписей номеров (просьба владельца)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:46:00 +03:00
Дмитрий 4f172ad88b @
docs(golos): HANDOFF — судья и четыре дефекта Александры

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

🔴 Главное правило вынесено в шапку: ни судью, ни Александру нельзя точить под
конкретный случай. Никаких регулярок под «база перепуталась», списков с «натяжными
потолками» и синонимов «гарантии» в маршрут. Для каждого дефекта указан КЛАСС
проблемы: смысловая связность, сила свидетельства о нише, доверие к компании,
независимость маршрута от точного слова.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-19 07:27:22 +03:00
Дмитрий dff4b62002 feat(finder): номера без «+» (79…) — формат для Яндекс Аудиторий, ДаДата/СМС-центр совместимы
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:22:55 +03:00
Дмитрий dc4a17cb43 docs(finder): правка владельца — живость менеджеру не показываем, зачёркиваем только «не существует»
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:05:11 +03:00
Дмитрий cffbc1e7c3 feat(finder): живость не показываем менеджеру — зачёркиваем только «не существует» (решение владельца)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 06:57:22 +03:00
Дмитрий d826d96a86 fix(finder): HLR — финальный отказ приходит статусом 20 (не 1); вердикт по err, проверено живым боем
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 06:10:19 +03:00
Дмитрий 37809697b6 @
docs(golos): мини-прогон трёх сценариев на сервере + первый суд

Карта судьи по 3 разговорам: доля речи 75-82% при норме 35-45, за 4 реплики один
довод из 13, выдумки ушей в каждом разговоре.

🔴 Записаны слепые пятна судьи — то, что глаз увидел, а он нет: самопротиворечие
внутри реплики, разворот ниши не сработал (замок «подтвердить дважды» слишком строг —
клиент называет сферу ОДИН раз), признание клиенту «база у нас перепуталась».

🔴 Механическая находка: клиент спросил про гарантии, уши съели слово «гарантии» —
маршрут по словам не сработал, и дешёвая модель полезла рассуждать о законе
(«отвечать будете вы», «согласие на обработку данных»). Съеденное ухом ключевое
слово ломает маршрутизацию — это дефект схемы, а не промпта.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-19 06:02:51 +03:00
Дмитрий cb81d9faad @
feat(sudya): спектр продажи по нашей методике + накопитель слабых мест

Судья умел говорить, чего она НЕ должна говорить (красные флажки), но не умел
судить, КАК она продаёт. Добавлены признаки по методике из базы наставника:
крючок, лесенка подачи, финал по теплоте, ведёт вопросами, цену вперёд не тащит.

🔴 Живой замер на сервере опроверг мою догадку. Я ждал, что она ВЫВАЛИВАЕТ доводы
пачкой — а она за шесть реплик назвала ОДИН блок из тринадцати. Говорит 71% времени
и почти ничего не доносит: много сочувствия, мало содержания. По доле речи это
не видно, поэтому добавлен признак 42 на пустословие. Детектор блоков проверен
на эталонном тексте базы — узнаёт 12 из 13, то есть находка настоящая, не слепота.

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

🔴 Судья ДОКЛАДЫВАЕТ, а не правит: где промахнулась, как часто, дословные примеры.
Что чинить — решает владелец. Советов «крути здесь» в накопителе нет намеренно.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 19:36:31 +03:00
Дмитрий 28db52fb6e docs(разведка): проверка первоисточниками — 4 факта Perplexity оказались неверны + письмо в поддержку Яндекса
Три агента перечитали официальную документацию Яндекса, ВК и МТС.
Итог: Perplexity дал минимум 4 неверных факта, каждый пойман только
чтением первоисточника.

Исправлено:
- площадок ТРИ, не четыре: myTarget мёртв, вся дока 301 → ads.vk.ru
- ВК: два порога — 100 руками, 2000 через API (мы автоматизируем ⇒ 2000);
  создание не более 1 списка в час
- МТС: 0,48 руб/показ по прайсу от 01.06.2026, а не 0,9 (цена 2024 года);
  показывает ТОЛЬКО не-абонентам МТС ⇒ канал B3 через Telegram недостижим
- квоты Аудиторий: 5000 запросов в СУТКИ на логин, а не 100 в секунду
- медийка: от 300 руб/день, порога 35 000 не существует
- PUT /segment/{id} меняет только название; данные — modify_data
  с режимами addition/subtraction/replace
- автотаргетинг на Поиске отключить нельзя (но и не надо — сегмент режет
  через «И», автотаргетинг задаёт лишь набор запросов)
- look-alike выключается конкретной радиокнопкой «Только выбранный сегмент»

Новое:
- фича универсальная: клиент жмёт кнопку, Лидерра — такой же клиент у себя же
- агентский логин Директа без условий, но договор — 3 клиента и 3 млн/мес
- в API Аудиторий аналога Client-Login НЕТ; мультиклиентность через делегатов,
  но в интерфейсе такого раздела нет ⇒ 5 блокирующих вопросов в поддержку
- Метрика уже стоит (счётчик 110476275) — второй бесплатный источник сегментов

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 19:33:37 +03:00
Дмитрий fbca7e13f9 @
feat(sudya): оркестратор, карточка звонка и приёмка на подсадных ошибках

Оркестратор сам ничего не проверяет — собирает слои и выносит итог: любой СТОП →
СТОП, иначе ТРЕВОГА, иначе НОРМА. Сломанный якорь перекрывает всё. В бою полная
коллегия не зовётся — только приборы, деньги владельца берегутся.

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

Проверено сквозняком на живом журнале, а не только на выдуманных примерах:
судья честно поймал, что она говорит 57% времени при норме 35–45%.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:59:29 +03:00
Дмитрий e2e054365c @
feat(sudya): приборы техники и характера + сторож покрытия рубрики

Техника: задержки до звука и до ответа, потеря реплики клиента (СТОП — мост однажды
глох во время думания и сказанное исчезало), выдумки ушей на тишине, доля её речи.

Характер v9: женский род, «вы», повторное приветствие, своё имя вместо обращения,
длина реплики, латиница. Женский род правится ТОЛЬКО про себя — тест стережёт
живую ловлю 18.07, когда сторож сделал пациента-мужчину «готова».

🔴 Сверка вскрыла дыру в собственном плане: признаки 8 и 9 стояли в рубрике как
измеряемые, а кода не было — судья молча делал вид, что проверяет. Признак 8
реализован (перебивания были, а обрезки нет — тот самый утренний дефект моста).
Признак 9 честно записан как неизмеряемый: журнал пишет, что мост ЖДАЛ думающего,
но не пишет случаи, когда оборвал. Добавлен тест покрытия: каждый приборный признак
либо имеет код, либо стоит в списке с причиной. Дыра больше не спрячется.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:55:03 +03:00
Дмитрий bf30a83ed2 @
feat(sudya): прибор правды о числах и коллегия судей со слепым протоколом

Прибор ловит два дефекта, пойманных владельцем живьём: числа вне замка фактов
и цену наизнанку («от пятидесяти пяти до двадцати пяти» вместо «от двадцати пяти
до пятидесяти пяти»).

🔴 Адверсарный прогон поймал ПОВТОР истории: прибор резал правду «минимальный
заказ — одна заявка». Ровно на этой форме сторож чат-бота однажды уже съел верный
ответ и оставил клиенту обрубок. Добавлены формы один/одна/одну/штука, случай
закреплён отдельным тестом — тестов из плана было мало, они этого не видели.

Коллегия: четыре узкие роли вместо одной большой рубрики, вопрос НЕЙТРАЛЬНЫЙ
(наводящий однажды заставил судью объявить роботом живого диктора), находка без
цитаты понижается до сигнала, якорь-контроль, автостоп и кеш по деньгам.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:47:52 +03:00
Дмитрий 7ee40fcde5 docs(разведка): реклама по своим номерам (4 площадки) + аналоги поставщика в СНГ и мире
Две находки одной сессии.

1. Реклама по своим номерам — берём все 4 площадки:
   Яндекс Аудитории (порог 100, полный API, максимум площадок), VK Реклама
   (порог 100 — поправка, 2000 относится к старому myTarget), myTarget (2000,
   ради Одноклассников), МТС Маркетолог → Telegram Ads (0,9 руб/показ, без API).
   Главный сценарий — недозвоны, которые сейчас списываются в ноль.
   Look-alike выключен намеренно: согласие давали конкретные люди.
   Грабли автовыгрузки: формат 79995551111, SHA-256 без соли, статус
   «Обновляется» на несколько часов после заливки.

2. Аналогов нашего поставщика (ГЦК/BG) нет нигде — проверено 9 стран СНГ
   и 12 мировых рынков. Операторы монетизируют данные, но контакт наружу
   не выдают: закрытый двор от Казахстана до США. Законы всех девяти стран
   СНГ требуют отдельного согласия на передачу номера третьему лицу.
   Российская модель — аномалия, моат сильнее, чем считали.
   Казахстан — единственный перспективный (Kcell Target Call, DMP.one уже там).
   Беларусь закрыта законом 99-З дословно. Узбекистан — вторым, разведать глубже.

Дыры выписаны честным списком: локализация данных в КЗ/УЗ, реальные цены,
льёт ли BG по Казахстану (проверяется тестовым проектом за час).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-18 18:45:16 +03:00
Дмитрий ec8cd1ddb2 @
feat(sudya): разбор журнала моста и надзор за судьями

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

Надзор: промах = судья сказал НОРМА, а владелец нашёл брак ушами. Сказал СТОП —
поймал, не промах. Доля выше 20% — судья негоден. Без этого слоя коллегия
со временем халтурит незаметно: она же сама себя и оценивает.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:43:12 +03:00
Дмитрий 17cf679652 @
feat(sudya): план судьи + рубрика на 36 признаков

Рубрика — единственный источник правды по критериям: спектры I звук, II техника
разговора, III правда и обязательства, IV характер, V продажа (новое — этого не
судил ни один прежний судья), VI проверка самого судьи.

Каждый признак несёт тяжесть: СТОП двигает вердикт в брак, ТРЕВОГА зовёт смотреть
глазами, СИГНАЛ идёт только в статистику. Из 36 признаков 16 — СТОП.

Тесты закрепляют целостность: ровно 36, номера без дыр, поля из допустимых множеств,
спектр V судит только продавец.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:39:18 +03:00
Дмитрий d2b74c8b04 docs(finder): спека и план проверки телефонов (ДаДата + HLR)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 18:22:40 +03:00
Дмитрий f386a2e27b fix(finder): мусорные номера подписаны «номер не распознан» (по спеке)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 18:21:48 +03:00
Дмитрий f8bd812807 test(finder): отрисовка размеченных номеров закреплена тестами (HTML + Excel)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 18:13:33 +03:00
Дмитрий d9e82f6e3c @
docs(sudya): проект сводного судьи диалогов Александры

Собран из трёх существующих семейств судей: голосовые (NISQA/дуэли/glitch),
чатовые (AnswerGuard + слепые судьи-агенты), нормативные (llm-judge/reviewer-agent/
judge-evaluator). Ни одно из них не судило ГЛАВНОЕ — продала ли она; для номера
менеджера по продажам на лендинге это ключевой спектр.

Устройство: приборы (приговор) → коллегия узких судей-ролей (находки) →
судья над судьями (доля промахов). 36 признаков в шести спектрах.

Протокол честности, каждое правило оплачено ошибкой: слепота, нейтральный вопрос,
живой якорь в партии (забраковал якорь → партия недействительна), роли вместо
одной большой рубрики, находка без цитаты источника не считается.

Границы названы явно: звук живых клиентов не пишем (ПДн — отдельная работа),
судья не правит Александру сам, владелец остаётся высшей инстанцией.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 18:09:39 +03:00
Дмитрий f2221101c6 feat(finder): метки номеров в списке и Excel — живые мобильные первыми, мёртвые зачёркнуты
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 18:04:24 +03:00
Дмитрий ba62359337 fix(finder): нераспознанные номера в warning (не теряем), guard эндпоинта, секреты читаем раз
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:58:37 +03:00
Дмитрий 3db5115e6e feat(finder): проверка номеров встроена в сбор контактов (+2 поля Firm)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:46:52 +03:00
Дмитрий 40fa829738 fix(finder): оркестратор — сбой на одном номере не роняет остальные; junk-путь закреплён тестами
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:41:49 +03:00
Дмитрий c3eff704a3 feat(finder): оркестратор проверки номеров + сортировка для показа
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:34:49 +03:00
Дмитрий 74f3048e91 fix(finder): HLR — id=0 не терять, строковые статусы коерсить, опрос короче (8×0.5с)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:30:32 +03:00
Дмитрий 7255a4c1b6 feat(finder): HLR СМС-центра — живой/отключён/не существует, кэш вердиктов
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:23:29 +03:00
Дмитрий 7d57c8277d fix(finder): кэшировать любой оплаченный ответ ДаДаты — незнакомый тип не даёт платить дважды
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:19:58 +03:00
Дмитрий d358ddb6f3 feat(finder): ДаДата clean/phone — мобильный/городской, оператор с MNP, кэш
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:14:38 +03:00
Дмитрий 4ddcc6abae feat(finder): нормализация телефонов досье — дубли и хвосты-обрезки долой
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 17:00:45 +03:00
Дмитрий 1514991ceb @
style(sales): Pint — порядок импортов в SalesClientsController

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 14:40:02 +03:00
Дмитрий b0750dce53 @
feat(sales): сайт кандидата ссылкой прямо на плитке доски

Менеджеру удобно глянуть на клиента перед звонком, не открывая карточку.

- На плитке колонки сайт выводится ссылкой (target=_blank, rel=noopener),
  click.stop — иначе клик по ссылке заодно открывал бы диалог карточки.
- Расчёт ссылки вынесен в utils/prospectSite.ts и переиспользован в карточке:
  домен получает https, готовый адрес не трогаем, пусто → строки нет.

Гейты: Vitest 55/55 по воронке (4 новых теста доски), vue-tsc чисто.
TDD RED→GREEN.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 12:36:14 +03:00
Дмитрий 48dd6c44af @
fix(sales): «Зарегистрировался» подаёт ЗАЯВКУ начальнику, а не привязывает клиента сразу

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

- registerProspect() теперь зовёт SalesAttachmentService::submit() от имени ВЛАДЕЛЬЦА
  карточки. Свободен → заявка pending + письма менеджеру и начальникам; занят другим →
  заявка с пометкой конфликта, чужая привязка не трогается; уже свой → заявки нет.
  Привязка со снимком тарифа создаётся только при одобрении (handleApprove).
- Стадия карточки едет в «Зарегистрировался» СРАЗУ (решение владельца): регистрация —
  факт, воронка показывает правду; «чей клиент и кому деньги» решает начальник.
  Автожизнь не зависит от одобрения — джоб смотрит linked_tenant_id.
- Отменён прежний 422 «клиент уже закреплён за другим менеджером» — теперь это заявка.
- Подсказка под полем e-mail говорит про одобрение начальником.

Спека §17 (отменяет правило §6 «привязываем сразу»). Гейты: Pest 218/218 sales,
Vitest 38/38, Larastan 0 в своих файлах. TDD RED→GREEN.

LEFTHOOK_EXCLUDE: larastan/cspell падают на файлах параллельной сессии
tests/Feature/Admin/*Balances*, свои файлы проверены отдельно и чисты.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 12:09:24 +03:00
Дмитрий b3d758c81b @
style(sales): Pint — импорты ДаData в тесте кандидатов

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
2026-07-18 11:40:27 +03:00
Дмитрий 1c3da4a25e docs(golos): прогресс телефонии Mango (бот REGISTERED) + рестарт-промт под компакт
Телефония: бот регистрируется в Mango (pyVoIP 1.6.8, PhoneStatus.REGISTERED, NAT-aware rport).
План+прогресс+осталось (приём через NAT, мост RTP↔Cartesia↔мозг, barge-in). Рестарт-промт под
оба трека. Секреты и ПДн (SIP-пароль, номера, ключи) — вне git, замаскированы.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 05:25:52 +03:00
Дмитрий ec903c6d19 docs(golos): чистка голоса (бренд-IPA/нервность/угу) + план телефонии Mango
Голос: fix_pron() лечит бренд «Лидерра» через IPA-блок Cartesia (подтверждено на ухо);
нервничание с затуханием (speed+calm/content, т.к. emotion anxious на этом голосе — пустышка);
угуканье подрезано. Всё принято владельцем на слух.
Телефония: план стройки под ключ (Mango SIP vpbx400046720.mangosip.ru → медиа-мост на GPU →
уши/голос Cartesia + barge-in). Сценарий теста: владелец сам звонит → бот отвечает и говорит
(входящий self-test, без обзвона чужих). Креды/скрины — вне git.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-17 00:33:06 +03:00
Дмитрий 57f1ca3900 docs(golos): движок Александры — наука телефонных продаж + плавающий темп + лестница финала (снимок движка + журнал)
Вшита наука телефонных продаж (Gong/Chorus, Восс/SPIN/Sandler): слушать>говорить,
SPIN-лесенка, зеркало/называние чувства, стоп-слова, дисциплина цены. Плавающий темп
Cartesia (0.86/0.90/0.95, только версия 2025-04-16). Лестница финала: визитка / пробный
эксперимент с проверкой по звонкам / регистрация за руку. Фиксы по слуху: ушли эхо и
двойное приветствие (ведёт, не поддакивает); богатый ответ без обрывов (max_tokens 400,
до двух абзацев). Снимок движка aleksandra_engine.py — durable, без ключей.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 23:23:26 +03:00
Дмитрий 87b7f4117f docs(golos): рестарт-промт под движок Александры (полный контекст для новой сессии)
Переписан paste-блок восстановления контекста под текущее состояние: движок
собран под ключ (живость + продающая база + отраслевая призма + живой Sonar +
жёсткий разворот), новый порядок чтения (журнал → паспорт → база), боевые
розетки, ключи/квирки, следующие шаги, стиль владельца.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 22:12:04 +03:00
Дмитрий 9317974670 docs(golos): движок Александры под ключ + живой Perplexity(Sonar) + жёсткий разворот ниши
- жёсткий разворот ниши (стоматология → займы под залог): бот ловит смену,
  тормозит разведочным вопросом (= покупка времени), свапает справку,
  додавливает через призму новой ниши; гарантий не даёт (флажок держит).
- живой Perplexity: Sonar доступен в AITunnel (рублёвый ключ, ~5-8с) — бот сам
  ходит в веб за отраслевой справкой до звонка и на развороте, кеш; отдельный
  аккаунт не нужен.
- движок собран в один файл scratchpad/aleksandra_engine.py (мозг+характер+
  живость+отрасль), прогнан end-to-end с живым Sonar. Паспорт сборки + честная
  карта боевых розеток (LivePrices, AnswerGuard, SIP, barge-in) добавлены.
- журнал и рестарт-файл обновлены.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 22:07:34 +03:00
Дмитрий 1a4218e1ee docs(golos): продающая база вплетена в живой круг (Александра продаёт из базы)
zhivoy_krug_prodazhnik.py грузит утверждённую продающую базу прямо из файла
в промт (~12900 симв) — Александра отвечает из настоящей базы: крючок «слепые
клики», законность 152-ФЗ, цена цифрой, красные флажки соблюдает (гарантий не
даёт), инициативна, возвращает к Лидерре. Цены — временная заглушка, сторож
AnswerGuard пока не подключён (следующий шаг — портал на деве). Журнал и
рестарт-файл обновлены.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 20:04:50 +03:00
Дмитрий 27644d6adc docs(external): план реализации чистки доп-каналов поставщика (TDD, 5 задач)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 19:15:37 +03:00
Дмитрий 907bd2f231 docs(external): спека модуля чистки доп-каналов поставщика (B6/B8 → удаление в 20:00, KEEP=B1/B2/B3)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-16 19:15:37 +03:00
Дмитрий b1814bea34 feat(external): POST /balances/refresh принимает services[] (групповое обновление) 2026-07-16 17:05:38 +03:00
Дмитрий d4b466cf75 feat(external): keyso — проба живости (зависимость поиска клиентов, 13-й ключ) 2026-07-16 17:03:47 +03:00