Две находки одной сессии.
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>
feat(sudya): разбор журнала моста и надзор за судьями
Разговор на входе судьи: реплики кто-что, пометка оборванных, доля её речи,
события моста (перебивания, ожидание думающего, выдумки ушей, потери реплик).
Всё чтение журнала живёт в одном файле — сменится формат, правим одно место.
Проверено на настоящих строчках сегодняшнего боевого журнала, не только на тесте.
Надзор: промах = судья сказал НОРМА, а владелец нашёл брак ушами. Сказал СТОП —
поймал, не промах. Доля выше 20% — судья негоден. Без этого слоя коллегия
со временем халтурит незаметно: она же сама себя и оценивает.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
feat(sudya): план судьи + рубрика на 36 признаков
Рубрика — единственный источник правды по критериям: спектры I звук, II техника
разговора, III правда и обязательства, IV характер, V продажа (новое — этого не
судил ни один прежний судья), VI проверка самого судьи.
Каждый признак несёт тяжесть: СТОП двигает вердикт в брак, ТРЕВОГА зовёт смотреть
глазами, СИГНАЛ идёт только в статистику. Из 36 признаков 16 — СТОП.
Тесты закрепляют целостность: ровно 36, номера без дыр, поля из допустимых множеств,
спектр V судит только продавец.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
docs(sudya): проект сводного судьи диалогов Александры
Собран из трёх существующих семейств судей: голосовые (NISQA/дуэли/glitch),
чатовые (AnswerGuard + слепые судьи-агенты), нормативные (llm-judge/reviewer-agent/
judge-evaluator). Ни одно из них не судило ГЛАВНОЕ — продала ли она; для номера
менеджера по продажам на лендинге это ключевой спектр.
Устройство: приборы (приговор) → коллегия узких судей-ролей (находки) →
судья над судьями (доля промахов). 36 признаков в шести спектрах.
Протокол честности, каждое правило оплачено ошибкой: слепота, нейтральный вопрос,
живой якорь в партии (забраковал якорь → партия недействительна), роли вместо
одной большой рубрики, находка без цитаты источника не считается.
Границы названы явно: звук живых клиентов не пишем (ПДн — отдельная работа),
судья не правит Александру сам, владелец остаётся высшей инстанцией.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@
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>
@
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>
@
Телефония: бот регистрируется в 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>
Голос: 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>
Вшита наука телефонных продаж (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>
Переписан paste-блок восстановления контекста под текущее состояние: движок
собран под ключ (живость + продающая база + отраслевая призма + живой Sonar +
жёсткий разворот), новый порядок чтения (журнал → паспорт → база), боевые
розетки, ключи/квирки, следующие шаги, стиль владельца.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- жёсткий разворот ниши (стоматология → займы под залог): бот ловит смену,
тормозит разведочным вопросом (= покупка времени), свапает справку,
додавливает через призму новой ниши; гарантий не даёт (флажок держит).
- живой 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>
zhivoy_krug_prodazhnik.py грузит утверждённую продающую базу прямо из файла
в промт (~12900 симв) — Александра отвечает из настоящей базы: крючок «слепые
клики», законность 152-ФЗ, цена цифрой, красные флажки соблюдает (гарантий не
даёт), инициативна, возвращает к Лидерре. Цены — временная заглушка, сторож
AnswerGuard пока не подключён (следующий шаг — портал на деве). Журнал и
рестарт-файл обновлены.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Аутентифицированный sales-user грузится под pgsql (crm_app_user) до admin-db
(приоритет middleware Authenticate > кастомного UseAdminConnection), и модель
запоминает это подключение. SalesEarningsService лениво читал $u->assignments/
->currentTariff → запрос уходил в crm_app_user (нет прав на sales_*) → 42501.
Фикс: assignmentsOf()/tariffOf() — свежие запросы на текущем (admin) подключении,
как уже делает SalesMetricsService. Регресс-тест: bogus-подключение на модели.
Гейты: 18/18, Larastan 0. Тесты грант НЕ ловят (общий admin-PDO) — ловится живьём.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Интеграционные роуты в web.php → web-группа применяла VerifyCsrfToken; у
Python-поиска нет сессии/куки, POST /integration/prospects падал 419 (в бою).
Pest это не ловил (Laravel гасит CSRF под тестами). Защита канала — сервис-токен.
Найдено живым смоуком после выката Этапа 2.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
В поиске: выпадашка менеджеров (из портала) + кнопка «Отдать менеджеру» рядом
с «Собрать контакты», колонка «Менеджер» перед «Оценкой», таблица с отступом.
Новый salesfinder/portal.py (get_managers/send_prospects, полный payload фирмы),
поля Firm.assigned_manager_id/name. Портал недоступен → кнопка disabled, ошибка
не помечает строки. Гейты: 244/244 pytest.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Портал публикует /api/sales/integration/{managers,prospects} под сервис-токеном
(X-Sales-Token, config sales.integration_token). ingest создаёт карточки stage=new
с полным payload, дедуп по (sales_user_id, inn|phone), assigned_by=начальник.
Гейты: 8/8 Pest, Larastan 0. Финдер-сторона — следующим коммитом.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3 правки в §15: карточка показывает ВСЕ данные поиска (payload), фильтр —
конкретный выбор менеджера, сортировка «Переговоры» по ближайшему созвону.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 14. /sales/prospects (менеджер), /sales/prospects/board
(начальник, salesBossOnly). Пункты «Потенциальные клиенты» и «Воронка отдела».
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 12–13. SalesProspectsView (менеджер, listProspects свои),
SalesProspectsBoardView (начальник, listSalesManagers фильтр, все карточки).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 11. Без drag: карточки раскладываются по стадиям, клик эмитит
open, просроченный next_call_at подсвечивается.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 10. Селектор результата, поля по стадии, отказ скрыт при user,
обязательные причина/время. Тесты через vm (v-dialog телепортит контент).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 9. PROSPECT_STAGES (8 колонок), stageMeta, isOverdue;
listProspects/updateProspect в api/sales.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 8. По 2 карточки на каждую из 8 стадий у указанного менеджера
(для показа досок). Baseline под artisan() Pest-паттерн.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 3–7. GET /api/sales/prospects (менеджер видит свои; начальник —
все + ?manager_id). PATCH /prospects/{id} — переговоры (next_call_at),
недозвон (причина), отказ (причина; запрещён из stage=user). ownership 403.
8 тестов зелёные. Baseline Larastan под Pest-паттерны нового файла.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Этап 1 Task 2. Дефолт stage=new в $attributes (доступен до refresh).
ide-helper мисин добавлен в локальный стаб (регенерация всех моделей).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
15 задач по TDD: миграция sales_prospects, модель, GET/PATCH API (свои/все+
фильтр, результаты переговоры/недозвон/отказ с правилами), демо-команда, доска-
канбан + диалог карточки + экраны менеджера и начальника + меню/маршруты.
Этапы 2 (поиск→портал) и 3 (автожизнь) — отдельными планами.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Начальник отдаёт фирмы из поиска менеджеру → канбан в кабинете портала.
7 колонок (Новые/Переговоры/Зарегистрировался/Пополнил баланс/Пользователь/
Отказ/Недозвон), движение карточки — по результату разговора (без drag),
автостадии по реальным пополнениям, интеграция поиск→портал по сервис-токену.
Общая доска начальнику + фильтр по менеджерам. 3 этапа. Согласовано в чате.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Форма «Тарифы менеджеров» дефолтит первую ступень с 0 (с момента привязки),
и расчёт вознаграждения (tenure стартует с 1) с from=0 работает верно, но
валидатор params.periods.*.from требовал min:1 → «Сохранить» падало 422
(«Поле params.periods.0.from должно быть не менее 1»). min:1 → min:0.
TDD: тест store с первой ступенью from=0 → 201 (падал 422 до фикса).
Baseline Larastan: actingAs 20→21 (добавлен один тест, квирк Pest+Larastan п.25).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>