Все pipeline-стадии падают с AI_PAUSED. Новые заявки обрабатываются, но AI-классификация/parse/enrichment/smeta не работают.
Возобновить → кнопка «▶️ Возобновить AI» в шапке справа вверху.
Заявки на которые автопилот сам попросил внимания: просрочка SLA · нужны уточнения · слабая привязка к каталогу · ошибка pipeline. Кликни заявку — разберись.
загружаю...
✅ Автопилот идёт без вмешательства
🔴 SLA breach
🟡 Уточнения у клиента
🟡 Низкий catalog match
— AI не нашёл работы в каталоге
🔴 Ошибки pipeline
🟠 Без координатора
💰 Ждут моего одобрения
❓пусто
загружаю...
✅ Все чеки и расширения сметы обработаны
💸 Чеки на материалы ()
➕ Расширения сметы ()
🎯 TOP работ которые надо в каталог
❓
загружаю...
✅ Каталог покрывает все работы за последние дней
Owner: кликни ➕ в каталог → создастся catalog_suggestion → подтверди в Справочники → Предложения. После добавления AI будет автоматом матчить эту работу в будущем.
Работа (нормализованное имя)
Встречалась
Заявок
Сумма себес
Ср. цена
Примеры
Действия
📊 Воронка обработки заявок (24ч)
📥 Поступило
🤖 Авто-диспатч
✋ Касаний coord
🟢 Без касаний
🤖 Автопилот — за последние 24 часа
❓
Загружаю KPI…
Нет доступа к общей финансово-операционной сводке.
KPI временно недоступны. Пустые или нулевые значения не подставлены.
🚀 Auto-dispatch
💰 Auto-approve смет
✋ Касаний координатора
📐 Точность бюджета
🚨 В очереди к coord
draft-заявки за 7 дней
ℹ Сейчас нет активности за 24 часа — метрики пустые. Дождись поступления заявок, чтобы увидеть статистику.
🧬 Canonical State KPIs
🛑 Review required
AI сомневается · ждёт owner approval
⏳ Pending customer
ждём клиента
🔧 В работе
assigned + en_route + in_progress
🚫 Blocked
техник заблокирован
Медиана intake → dispatch:
ℹ Shadow phase A накапливается. Миграция применена 2026-04-24; ожидаем 7-14 дней для первых стабильных метрик.
📊 Автодисплечер — неделя
❓
загружаю...
🚀 Auto-dispatch (неделя)
📡 Покрытие техников
🔧 Диспатч за 7 дней
🧙 Wizard завершён
за 7 дней
📡 Какими каналами достучаться (на 6300+ базы)
✉ Воронка приглашений за 7 дней (по каналам)
Канал
Отпр.
Доставл.
✅ Подп.
❌ Откл.
🤐 Молчат
% подп.
🧙 Воронка onboarding wizard (5 шагов · последние 7 дней)
📭 За 7 дней нет данных по приглашениям и wizard'у. Ждём Sprint 1 mass-invite запуска.
⏎ одобрить · → дальше · ← назад · Z вернуть · Esc выйти
Будет одобрено после окна отмены
⟳
⚡
Плотность и группировкаСортировка — клик по заголовку колонки
Смотреть как
Как распределяются заявки
🔵 Общий пул — новая заявка видна всем. Любой координатор или техник может взять.
✋ Беру — берёшь себе, становишься ответственным (DRI). Попадает в «Мои».
🎯 Фокус — подсвечивает срочное сверху, остальное приглушает (мягко). У координатора включён по умолчанию.
⏱ Таймаут → авто(при включённом авто-режиме): если за время никто не взял (авария ~5 мин / срочно ~15 / план ~30-60) → авто-назначение на лучшего техника.
🆘 Эскалация — если и техники отказались, заявка возвращается тому координатору, который её взял (или дежурному).
⚡ счётчик «в работе» — твои активно взятые. Держи ~3-5 одновременно.
Как распределяются заявки
Точный статусИсточникИсполнитель
Клиент
Город
Система
Фильтры:
☑ Выбрано:
— восстановимо 30 дней, потом удаляется навсегда
загружаю…
ID
СтатусКлиент
Бюджет
Возраст
Действие
Заявки временно недоступны.
⚠ Обновление не прошло (). Показаны устаревшие данные.
{ if (e.target.tagName === 'IMG' && (e.target.src || '').startsWith('http')) { e.preventDefault(); window.showModal && window.showModal(``, { width: 'auto' }); } }"
x-html="selectedDetail?.mirror?.original_description || 'Оригинал пуст: нет данных ни в email/comm store, ни в Okdesk mirror/live fallback.'">
Кандидатов не нашлось — объект создаётся через ✎ выбор или на стадии привязки.
·
📎 Вложения
🔧 Поменять объект
Сейчас:
⏳ загружаю...
Не найденоВведи поиск для фильтра
Клиентытекущий
✎
Исправить AI значение
Поле на заявке
·
AI выдал:
Правильное значение:
Почему AI ошибся? *(контекст для обучения — мин. 5 симв.)
🎓 Как это работает: исправление + причина сохранятся в enrich_correction_log.
Когда накопится ≥3 похожих исправления для этого клиента+работы, fit-script запишет их как
few-shot example в enrich_few_shot_examples. AI начнёт использовать твой формат
в новых похожих заявках автоматически. (Pattern: Mindee RAG + Salesforce Einstein FSL.)
➕
Создать политику клиента вручную
Клиент *
Название клиента (опционально, для UI)
Scope (на кого распространяется)
Чем уже scope — тем выше приоритет (Salesforce ResourcePreference: narrowest wins).
Work L1 *
ID объекта (maintenance_entity_id) *
ID контакта (okdesk contact_id) *
Текст правила *(что AI должен помнить про этого клиента)
✓ Это «гласное» правило — сразу confirmed (active=TRUE). Начнёт инжектиться в 07-enrich AI prompt
с первой же следующей заявки этого клиента. AI видит trust по source_kind:
contract > email > вручную > устно > AI.
🚦
Поднять флаг клиента
Тип флага *
ID клиента (company_id) *
📍 Только для объекта (опц.)
👤 Только для контакта (опц.)
Причина *— для audit log (мин. 5 симв.)
Истекает (опц.)
— ISO datetime, если временно
⛔ HARD GATE: следующие заявки этого клиента (и связанных объектов/контактов если scope указан)
НЕ будут диспатчиться. Координатор увидит причину и должен снять флаг прежде чем тех будет назначен.
🤖
AI Pipeline Audit⏳ обрабатывается
⛔ Прогон оборван — процесс умер, не дописав стадию. «Пересчитать» продолжит с места обрыва.
🧩 из
стадий — из прошлого прогона
📦 только до разбивки
🔴 AI отключен
⚡ Быстрые действия:
↩ унаследовано · пересчёт на конверте📥 выполняется при приёме письма · пересчётом не повторяется
модели:
🩺 vision-провайдеры: с проблемами · чинить 🔧 —
🔧 = нужно действие · ℹ/⏳ = временно, самовосстановится (vertex основной — парсинг работает)
ⓘ что делает эта стадия / код / run
🎯 Цель:
Что делает:
Что делать:
Код:
📋 Что поняла система
Работа:
Объект:
Адрес:
Заявитель:
📍 Контакт на объекте (из письма):
🕘 Ранее на объекте (память контактов точки):
✓ основной
📥 На наш ящик:
Почему впущено:
✉️ Текст письма:
…показаны первые 800 символов · полный текст — в описании заявки
→ разбор
·
Статус резолва:
Как нашли:
⚠ Не хватает:
✏️ Заголовок очищен от FW:/RE:
✓ Заголовок без FW:/RE: префиксов — очистка не нужна
🎫 Билет извлечён из темы/описания
👶 Дочерняя заявка — классификация и дедупликация пропущены
⚙️ Детерминированная стадия (regex) — без AI
Решение:🟢 Одна заявка🔵 Несколько заявок🟡 Нужен контекст
· уверенность:
👶 Дочерняя заявка — классификация и дедупликация пропущены
📋 План разделения: заявк
без номера
🔁 AUTO-MERGED→ заявка
💡 предложен дубликат→
💡 Совпал номер тикета→
Письмо ссылается на тот же клиентский номер, что и существующая заявка. Реши: это продолжение той заявки или новая — «Возможный дубль» в списке или кнопки в карточке цели.
🤖 AI judge:не дубликат
✓ дубликатов не найдено · проверил кандидатов за
✓ дубликатов не найдено · окно
✓ поиск по номерам тикетов: совпадений нет
⚠ полный дедуп по компании (окно/скоринг/AI-судья) для email-заявок не выполняется — если письмо-дубль пришло без номера тикета, эта проверка его не поймает.
⚠ данные прогона дедупа не сохранились — вердикт неизвестен. Пересчитай с этой стадии для честной проверки.
🔴 AI split failedretry поставлен в очередь (cron ~10 мин)
🟢 Создано дочерних заявок: AI split OK
🟡 Объединено с существующими: данные перенесены туда
⊘ найдено номеров: , но разбить на дочерние не удалось — heuristic + AI не нашли способ.⊘ разбивать нечего — заявка одиночная (тип определён выше в «Классификация», дедуп — в «Поиск дубликатов»).
BS24: возможный дубль→ internal email 90%
🎫 ticket# в скриншоте→ deterministic 90%
💡 Semantic suggest→
⚠ Работы могут повторяться — проверь, точно ли это тот же случай
Okdesk вернул «» — это шаблон без полноценного договора.
07-enrich и 07ba-estimate-contract будут работать без прайса клиента → смета по market rates.
Действие: загрузи реальный договор → «Справочники → Импорт прайса» или подтверди что это фриланс-без-контракта (поднять флаг ⚠ высокий риск в разделе Клиенты).
📚 Контрактные данные клиента
— используются в 07-enrich и 07ba-estimate-contract
💰 цен в прайсе
💳 платежи ()
📋 scope ()
📍 территория ()
✎ прочие ()
📋 Условия ( top из )
⚠ Договор привязан, но contract_terms и contract_prices для этого клиента не парсились —
AI работает только с agreement_title (без условий + прайса).
Загрузи XLSX/PDF в «Справочники → Импорт прайса».
⚠ Договор не привязан
Pipeline не нашёл активный договор для клиента. 07-enrich и 07ba-estimate-contract сработают
с deficit — нет контракт-прайсов. Проверь в Окдеск: company → agreements → active=true.
📧 Извлечено из письма:
Город:Адрес:Объект:Категория:
⚠ Все парсеры провалились — координатор должен проверить вручную
⚠ Billing-деградация: основная модель (Claude) недоступна, использован fallback.
Качество парсинга может быть снижено — рекомендуется перепроверить вручную и перезапустить после восстановления.
⚠ фото может быть не про эту поломку — AI заметил расхождение с темой заявки
→ помечено: запросить у клиента правильное фото поломки
✗✓
:
«»
✓
:
«»
📄 Из этого файла (парсер 04-parse):
🔬 спец:
:
🔬 Специалисты AI
📝 Акт выполненных работ
Статус: · Принят: · Работы ():
📜 Договор
· Сумма: · Заказчик ИНН: · Этапы оплаты ():
📸 Фотоотчёт
Дефекты:
Требуются работы:
Материалы:
Aggregated type:
💰 Счёт / УПД
Итого: · НДС : · Оплатить до:
🏗 Смета / КП
Разделы (): · Итого: · НДС
🔧 Паспорт оборудования
· S/N: · Гарантия до:
📋 ТЗ / Проект
Зона:
🔨 Работы ():
📦 Материалы ():
📐 Замеры:
Зоны: · Позиции:
✍️ Рукописный акт
Строки (): · ⚠ Сумма не сходится · Читаемость:
📐 Чертёж
· Размеры ():
📜 Гарантийное письмо
Долг: · Платежи ():
🔍 Обследование
Тип: · Дефекты ():
📅 Ежемесячный осмотр
· Статус:
👤 Доверенность
· до
📝 Допсоглашение
· ежемес:
🧾 Кассовый чек
· итого: · позиции ():
движки:
Модель:⏱💰🔁
🧠 Контекст для AI:
📋 0 policies
Эти данные ушли в AI prompt — определяют точность extraction.
Если 0 policies для известного клиента — проверь Справочники → Политики клиентов.
🎯 Уверенность AI по полям:
low/medium → проверь · ✎ → исправить → AI будет учиться
:
«»
⚠ AI вопросы технику для уточнения на месте:
✓ AI проверил себя: декомпозиция полная
(/10).
Действий не требуется.
✓ AI:
⚠ AI нашёл пропущенные работы: добавлено
позиц.
(score /10)
· Проверь смету ниже.
📋 Сырой dump: все извлечённых полей (debug)
Если работы извлечены неверно — поправь и задай образец для дообучения:
Работ на входе: Прошли guard: ⚠ Flagged:
Причины:
Работ: Материалов: ⚡ overrides: 🟡 review required
Работы:
Причины review:
Медиана: Мин: Макс: Похожих:
⊘ История недоступна ·
Всего строк:
✓ catalog: 🤖 AI fallback: ⚠ unbound: ⚠ нужна проверка:
catalog = AI нашёл в прайсе клиента/каталоге работ · AI fallback = модель оценила без каталога · unbound = не привязано вообще
⚠ Строки требующие внимания ():
Действия здесь только операционные: проверь строку в «Управление сметой», пересчитай стадию или одобри вручную. Каталог/прайсы меняются отдельным controlled flow, не из карточки заявки.
Себес:
Клиент:
Маржа:
Строк сметы:
Источник первой работы:
Pipeline:
Verdict: · Severity: · AI confidence:
⚠ AI заключения:
🚩 Flagged работы ()
· status:
reason codes:
⊘
📣 Алерт владельцу отправлен (review_required)
TG message: · Материалов: · Советов: · History items:
TG message preview
🚦 Наш статус:
⚠ требует согласования
Канон-статус ещё не записан.
Okdesk (legacy, выводится из эксплуатации)
okdesk статус: okdesk пропущен:
🤖 Автоматически назначен:
TG msg:
📤 Статус:
Длина черновика: симв.
TG msg:
Почему не авто:
⊘ Диспетч не запущен
Причина:
🚨 Emergency fastpath eval🏗 SMR gate eval
🔧 отладочный JSON
Клавиши:1 правильно · 2 неверно · 3 почти · → пропустить · ← назад · Esc выход. Auto-advance после label.
✓ Совпадает с title заявки — AI правильно вытащил из контекста (это issue-level поле, общее для всех файлов заявки). Можно жать «AI правильно».
📄 Распознанный текст ( симв.)
⚠ Старый формат данных
Raw текст отсутствует в сохранённых данных parser_docs.
Нажми «Пересчитать с этой стадии» (04-parse)
на карточке заявки чтобы обновить (~30с).
⚠ Legacy формат — оценить не получится
Это старая заявка: parser хранил только счётчик («1 элемент») вместо содержимого.
Чтобы увидеть реальные значения — открой файл вручную ИЛИ нажми
«Пересчитать с этой стадии» (04-parse) на карточке заявки (заберёт ~30с).
Пропусти sample (→) — corpus не пострадает.
📖 Что значит «»:
▾ другие варианты значения
—
📍 Где AI нашёл это на изображении:
📍 Координаты не пришли: модель этого прогона не вернула bbox для поля (запрашиваются всегда, но возвращают только сильные vision-модели — Opus/Sonnet; gemini-flash обычно нет). Появятся автоматически при следующем прогоне на сильной модели.
💡 Что происходит дальше: мастер ещё не подключён к @boryabrobot. Перешли карточку через WhatsApp или TG (кнопки выше). Когда мастер тапнет invite-ссылку — он автоматически подключится к боту, и в БД появится его @username. Тогда чип станет «🤖 TG бот» и AI начнёт отправлять напрямую.
(помощник по заявке)
📭
Нет переписки по этой заявке
Когда клиент / техник напишет в Email, Telegram, WhatsApp или MAX —
сообщения автоматически появятся здесь.
Кому:Копия:
📎 Отпустите файл — загрузится в эту заявку
📞 Каналы клиента:
Канал:
📨 Ответ уйдёт клиенту в выбранный канал
🔒 Внутренняя заметка — клиент НЕ увидит. Видит команда (coord/owner/CSM/TNL).
Используй @имя для прямого упоминания — получит push-уведомление.
💡 Борис знает: историю объекта, память по клиенту, правила клиента, флаги, договор, комплект безопасности, предпочтения по связи, повторные визиты, условия и цены.
Спрашивай: «кто работал», «какие правила клиента», «что было раньше», «какой выезд», «есть ли пов второй визит».
Чат пустой. Спроси первое — например: «Кто из техников знает этот объект?»
🤖 думаю...
(Claude обычно отвечает за 5-15с)
🤖 Boris думает...
⌘/Ctrl+Enter — отправить
🔒 Read-only Q&A · действия (отправка/назначение/утверждение) пока через клик в UI · полноценный action chat — Phase 3
деньги уйдут только после СМС-подписи в интернет-банке
💰 Бюджет — деталиосновные суммы выше в hero
📋 Основная смета (запрошено)
💡 Доп КП (обнаружено)
🧾 Привязан счёт # ·
·
✓ оплачен
📸 Фотоотчёт + Акт
📸 ДО работ ()
📸 ПОСЛЕ работ ()
📷 Без метки ()
📋 Акт выполненных работ ()
📋
🎤 Голосовой отчёт ()
🎤
📝 Текстовый отчёт ()
📤 Отправки техникам
🧰 Отчёты техника
Заявка в pipeline, но dispatch/отчётов/бюджета пока нет.
📜 История состоянийрасследование спорных случаев
Кто, когда и почему переключал статус. Для ежедневной работы НЕ требуется — открывать только при расследовании.
🧭 Сквозной след заявкиsource → queue → stages → dispatch
Единый trace spine по нашей заявке. Okdesk # здесь только временный внешний ID; основной будущий ключ — service_issue_ref / internal issue.
Событий пока нет. Для старых заявок trace появится после следующего webhook/email/pipeline-run.
payload / refs
🏢 Клиенты
Не удалось загрузить данные:
Загружаю…
🏢
🆔
📨
🏛️
⏱
→
🏢
Попробуйте другой запрос или сбросьте фильтры.
Добавь через
Финансы → Клиенты.
Контакты (люди работающие у заказчиков)
👤 Новый контакт
ничего не найдено
Загружаю…
Заказчик
ФИО
Должность
Email
Телефон
Источник
Primary
Status
⭐
Контактов нет. Они появляются автоматически при синхронизации с Okdesk
(cron okdesk-customer-master-sync-cron) и при обработке писем (intake-resolver).
Объекты обслуживания
Загружаю…
Объект
Заказчик
Город
Адрес
Источник
Status
Объектов нет. Они синхронизируются ежедневно из Okdesk (cron okdesk-objects-sync-cron 03:30 UTC) или добавляются вручную через карточку заказчика.
Клиенты, авто-созданные из входящих заявок (по корп.домену / ИНН). Подтверди или отклони.
Очередь пуста — нет клиентов на подтверждение.
Клиенты без активного договора. Заявки обработаны, но диспетч заблокирован — требуется работа CSM.
📭
Очередь лидов пуста
Все клиенты с активными договорами — отличная работа!
Загружаю…
Компания / Контакт
ИНН
Дней в лиде
Заявок
Статус CSM
Действия
📬 К разбору
письма куда AI-resolver не уверен — owner делает решение, resolver учится
Загружаю письма…
🤖 Resolver:
📭
Очередь пустаНет писем с этим статусом
Resolver автоматически разобрал все входящие письма.Попробуйте другой фильтр выше.
📬 Email detail
От:
Тема:
Получено:
Status:
Provider:
Message-Id:
🏢
Загружаю данные клиента…
Ошибка загрузки:
📇 Реквизиты
ИНН/БИН:
КПП:
ОГРН:
Юр. адрес:
Почт. адрес:
💼 Биллинг
Наше юрлицо:
Срок оплаты:
Валюта:
ЭДО:
не используется
Биллинг-контакт
ФИО:
Email:
Телефон:
Бухгалтер:
📝 Заметки
🔗 Связи с внешними системами
Объекты обслуживания
📍
·
📍
Объектов нет
Появляются автоматически при синхронизации с Okdesk или можно добавить вручную.
Контактные лица
⭐
👥
Контактов нет
Появляются автоматически при синхронизации с Okdesk и при обработке писем (intake-resolver).
📧 Email-правила resolver
💡 Эти правила автоматически связывают входящие письма с этим клиентом.
Resolver применяет их в порядке приоритета — выше priority = первее проверяется.
Заявок этого клиента не найдено. Поиск идёт по short_name «».
💬 Все коммуникации (Email + TG + WhatsApp + MAX + Portal)
📭
Коммуникаций с этим клиентом ещё не было
Когда клиент напишет в Email / Telegram / WhatsApp / MAX / Portal —
threads со всех каналов появятся здесь.
Финансы
💼 Нам должны
⚠️ Просрочено
✓ Оплачено
Загружаю счета…
№
Выставлен
Срок оплаты
Сумма
Статус
Оплачен
Счетов для этого клиента не выставлено. Создай через
Финансы → Счета.
📋 История клиента — Phase 6 (activity_log table).
Источник:
Источник:
🔧 Оборудование объекта
загружаю реестр…
Оборудование пока не извлечено — появится автоматически, когда в заявке по этому объекту будет паспорт / фото серийника.
🤖 из AIне подтверждено
📥
Inbox переехал в drawer
Inbox теперь доступен через 📥 chip справа на любой странице — click и
drawer откроется на 480px. Кликни ⛶ в углу чтобы развернуть до полного экрана
со всеми функциями (Hubbard tabs, поиск, bulk).
Финансы
Считаю ДДС…
Движение денег по факту банка (Точка + Т-банк + ZenMoney), разнесённое статьями. Свои переводы/фонды — вне потоков.
Статья
▲ Поступления
▼ Расходы
= Сальдо
Авто-собирается из банка. Дефолт-статья применяется к новым платежам контрагента автоматически (сильнее правил, слабее ручного).
Загружаю…
авто
Статьи движения денег (ДДС). Системные — базис отчётов, удалять нельзя; ручная статья на операции всегда сильнее правил.
Правила автозаполнения статей. Создаются из ленты Движения (⚡ на строке или тост «Всегда так?»). Порядок = приоритет; правила слабее метки BS24-N и никогда не перезаписывают ручное.
Правил пока нет.
Не удалось загрузить финансовые данные:
·
💰 Касса
Загружаю ленту…
🎉 Пусто — в этом фильтре операций нет
✂ Разделить платёж
₽ →
⚡ Автоправило
А✋
⚡ Правила автозаполнения
Правил пока нет. Создаются из строки ленты (⚡) или тостом «Всегда так?» при ручной статье.
📋 Реестр подрядчиковпо журналу работ · начисления появятся с автодиспетчем · выплаты вне системы (нал) — в Движении, статья «Выплаты техникам»
Техник
Работ ✓
Начислено
Выплачено
В ожидании
Последняя работа
🔴 запросов просрочены >24ч
Tech ждут больше суток. Откройте и одобрите/отклоните для разблокировки.
Запросы на выплату
ожидают одобрения ·
готовы к выплате
📭
Нет активных запросов на выплату
Tech-запросы появляются здесь после клика «Запросить выплату» в @boryabrobot.
Загрузка…
👑💎⚡
· Прошлая: за 30д
📱 ·
Себестоимость и прибыльность заявок
за
📋 Заявок
💰 Клиенты заплатят
Sum client_total
💼 Себес
работы + материалы
📈 Прибыль
Заявка
Клиент
Работы (себес)
Материалы
Всего себес
Факт (банк)
Клиенту
Прибыль
Маржа %
Scope split
Строк
Когда
R:
+ O:только requested
Нет данных за выбранный период или фильтр
загружаю…
💡 Scope split: R = requested (то что клиент просил) · O = observed (AI обнаружил дополнительно)
· Красные строки: маржа <15% (убыточно), зелёные: ≥25% (здорово)
· Источник: pipeline_budget_log
Наши юрлица (issuer companies)
Юрлицо
Страна
Налоги
НДС
ИНН/БИН
Банк
Юрлиц пока нет. Добавь первое — например ООО БИЛДИНГ из примера счёта #8182.
Договоры между нашими юрлицами и клиентами
№
Дата
Наше юрлицо
Клиент
Сумма
Статус
🔁
Договоров пока нет. Добавь хотя бы один (например Д-325п-24 от 20.03.2024) чтобы основание автоматически вставлялось в счёт.
Сначала добавь хотя бы одно юрлицо и одного клиента.
Счетов пока нет. Жми «+ Выставить счёт» чтобы создать первый.Все счета оплачены 🎉Просроченных счетов нет 👍Черновиков нет.Оплаченных счетов пока нет.
Калибровка: Расчётный vs Сметный vs Фактический
❓ что это
Расчётный = AI · Сметный = invoice · Фактический = paid
🔢 Заявок с AI-оценкой
📐 Точность (Сметный vs Расч)
✅ Точность (Факт vs Расч)
💰 Суммы
AI ₽k →
k →
k
Расчётный / Сметный / Факт
Заявка
Клиент
Расчётный (AI)
Сметный (invoice)
Δ vs AI
Фактический
Δ vs AI
Статус
без счёта✓ оплачен
Нет данных для калибровки. Сначала pipeline должен обработать заявки с AI-оценкой,
потом выставить счета и дождаться оплаты.
P&L (прибыль и убытки)
По счетам: выставлено · оплачено · просрочено · нам должны · выплаты техникам
💵 Выручка (оплачено)
💸 Выплаты техникам
📈 Оплачено − выплаты техникам (не полная прибыль — см. ДДС)
без себестоимости материалов
⚠️ Просрочено счетов
МесяцЮрлицо (issuer)Заказчик
Счетов
Выставлено
Оплачено
Нам должны
Просрочено
НДС (с оплаченных)
Итого
Нет данных за выбранный период. Попробуй расширить диапазон дат или выставить/оплатить счета.
Матчинг входящих к счетам (Точка)
Автоматически через webhook. Ночью — reconcile из выписки.
Платежи временно недоступны. Это не означает, что их нет.
Всё привязано автоматически 🎉Платежей пока не было. Webhook от Точки активируется после регистрации в company editor.Привязанных платежей нет.Нераспознанных нет.Неоднозначных нет.
Нажми «Запустить» чтобы проверить смету по 6 формальным правилам
(маржа, outliers, unmatched rate, min_order, норм расхода).
пропущено (нет данных)
🛠 Auto-corrections (применяются автоматически):
Текущие пороги (ENV-настраиваемые)
D1_MARGIN_HIGH_PCT = %
D1_MARGIN_LOW_PCT = %
D2_CLIENT_FACTOR = ×
D5_MIN_ORDER_FLOOR = ₽
D6_UNMATCHED_BLOCK_PCT = %
ℹ Все строки pipeline не опознаны в каталоге.
Это типично для регламентных работ (ТО): фреон/фильтры/чистящие средства описаны словами
без артикулов. Payout взят из похожих заявок в истории (см. блок ниже).
Координатор может уточнить цены вручную в R4.P4 (inline edit — скоро).
🌍 Регион
⚡ Надбавки
📈 Маржа
🎯 Достоверность
⚠ Что требует ручной проверки
📋 Строки сметы
(07c-deterministic — но основной payout взят из другого источника, см. pill выше)
Unpaid счетов на этого issuer'а нет. Создай новый счёт в «Счета» и вернись сюда.
Новый счёт
Позиции
Описание
Кол-во
Ед.
Цена
Сумма
Итого:
В том числе НДС %:
🏦 Расчётные счета
✓ Primary
Счетов нет. «+ Добавить счёт» → primary создастся автоматически.
🏦 Интеграция с Точка Банкreal-time webhook + ночная сверка
Проверяю доступ и подключение…
Нет доступа к настройкам банковского провайдера.
Статус интеграции временно недоступен.
Статус
JWT:
customerCode:
JWT храним в /etc/apps/secrets/okdesk-pipeline.env как
.
customerCode — публичный ID Business-кабинета, берётся кнопкой «🔎 Найти» или вручную из ЛК.
✓ Webhook подключён
⏳ Webhook не подключён
Логотип
— нет —
Подпись
— нет —
Печать
— нет —
💡 PNG с прозрачным фоном для подписи и печати — лучше всего смотрится в счёте. Max 5 MB.
💰 Баланс
счетов
📈 Приход
за период
📉 Расход
за период
📊 Net
чистый поток
⏳ Загрузка...
Дата
Описание
Счёт
Приход
Расход
Категория
Счёт
Нет транзакций за выбранный период
🧩 atomic
🧠 embed
📐 BOM
💡 Философия: настрой один раз — забудь
Эти правила — базовая конфигурация бизнеса, а не ежедневный контроль. Раз настроил при запуске — работает автоматически.
📋 базовое
Модификаторы / Надбавки / Sanity — задай при запуске, меняй раз в год при инфляции.
🤖 auto-tune
Маржа — empirical median per (клиент × L1) из contract_prices. 182 ячейки matrix (13×14).
Refresh weekly cron fill-margin-matrix когда добавляются новые договоры.
🚀 dispatch
Правила маршрутизации — создай пресеты, включай/выключай автопилот в Система.
📋 Правила
📚 Каталог
🤖 AI
⚡ Модификаторы (отдельные строки в смете — Wowworks doctrine)
❓
Код
Название
Тип
Значение
Триггер
Активен
Модификаторов пока нет. Они добавляют отдельные строки в смету по триггер-словам
(пример: «срочно» → +500₽ «быстрый выезд»).
🏢 Надбавки (multiplier на всю работу — mall/bank/roof/access)
❓
Тип
Описание
Коэфф.
Ключевые слова
Активен
Надбавок пока нет. Они увеличивают всю смету ×1.15 / ×1.30 для сложных условий
(ТЦ / банк / кровля / ночная работа).
📈 Маржа по категориям работ
🤖 auto-tune
💡 Не надо крутить ежедневно. Маржа по категории подстраивается автоматически:
cron margin-calibration смотрит plan vs fact в estimate_budget_fact и предлагает
сдвинуть margin_pct если факт систематически расходится с планом более чем на 5%. Включается через Система → Autopilot controls.
Категория (work_l1)
Клиент
Маржа %
Floor %
Активен
Маржа по категориям ещё не настроена. Нажми «+ Добавить» чтобы задать
для каждой work_l1 (отделка / электрика / HVAC / ...) target + floor %.
AI-сметчик использует их для D1-rule (Protection Layer).
⚠ Sanity ranges (допустимые диапазоны цен)
❓
💡 Первый защитный слой перед AI. Для каждой категории — допустимый
диапазон цен [min_price, max_price] ₽/единицу.
AI-сметчик (07c) использует эти границы чтобы ловить галлюцинации: «1₽» или «500 000₽» за обычную работу
→ блокируется, ждёт проверки координатора.
См. также 🛡 Защита сметы в Система → AI Управление (D1-D6 rules + Anomaly detector).
Категория
Ед.
Min ₽
Max ₽
Примечание
Пока нет диапазонов цен. AI-сметчик может галлюцинировать «1₽ за м²» или «500 000₽ за замок».
Нажми «+ Добавить» чтобы ограничить min/max для каждой категории.
🚀 Маршрутизация техников (matching + per-rule auto toggle)
❓
Приор.
Название
Паттерны (work/city/client)
Сложн.
Рейтинг
Загрузка
Авто
Активен
work:
city:
client:
⚡ urgent-only
Правил маршрутизации техников пока нет. Добавь первое — pipeline будет использовать его для подбора техника под каждую заявку.
🎯 Политика заявок (выезд + диагностика)
❓
⏳ Загрузка политики...
Политика не найдена в operation_modes (миграция 114 не применена?). Используется FALLBACK_POLICY (hardcoded в lib/enrich-postprocess.mjs).
💡 Быстрый старт — выберите шаблон (можно потом подправить):
① Основное
② Когда применять (к каким заявкам)
③ Каких техников рассматривать
④ Режим работы
ℹ Как это работает: когда приходит заявка, pipeline проходит все активные правила в порядке приоритета
(меньше → первее), ищет первое совпадение по категории/городу/клиенту/сложности. Найденное правило задаёт
фильтры для поиска техников (рейтинг, загрузка). Если Автопилот вкл — pipeline сам публикует
в канал и/или назначает; иначе ждёт действия координатора.
🔎 RAG Preview — что AI-энрих увидит в каталогеТест на любой заявке, без живых данных
💡 Здесь вводишь title/description заявки (или жмёшь пресет) — видишь
реальный shortlist который пойдёт в промпт 07-enrich. Источники:
embedding (семантическая близость к service_catalog.embedding) +
keyword (FTS по L1 в spec/name_full) +
contract (договорные цены клиента через client_alias_map).
Пресеты:
➕ Предложения в каталог
—
💡 Что тут: единая очередь — (a) AI-сметчик предлагает редкие работы для промоута,
(b) Phase B audit наполняет Curator аномалиями (L1 mismatch, нет цены, obsolete).
AI → Approve создаёт новую запись. Anomaly → Apply выполняет proposed_fix
на existing record (UPDATE service_catalog, audit в catalog_audit_log).
🤖 AI обработать всё — запускает batch с правилами: similarity ≥0.99 auto-merge, AI verify для 0.95-0.99,
skip для obsolete не входящих в L1, set-price только при confidence ≥medium. Остальное → review для owner.
ID
Название
Ед.
Категория
Себес (AI)
Заявка
Severity
Статус
Действия
Загрузка…
🎯 Эталонные сметы (templates)
💡 Recipes для частых работ: trigger_keywords → матчится с title/description новой заявки →
AI в 07-enrich видит template в prompt как подсказку (templateHintBlock).
Пример: template "Замена жалюзи" = [work: "Жалюзи | Ремонт" × 1, materials: [...]], triggers: ["жалюзи","штора","ролет"].
⏳ Загрузка…
Templates не созданы. Жми + Добавить для первого. Или seed'ом через скрипт.
Как это работает. Загрузи клиентский прайс или смету (.xlsx / .xls) →
система автоматически определит формат (5 поддерживаемых: Adidas / Билдинг / Just Sport / Lichi / Мегафон) →
покажет preview с color-coded matching к catalog → нажмёшь «Импортировать» — работы попадут в contract_prices, новые — в очередь catalog_suggestions.
Матчинг через embedding similarity (Ollama bge-m3). Поддерживаемые единицы из lib/unit-normalize.mjs.
📎
Формат
Клиент:
Метаданные из шапки
Заказчик:
Подрядчик:
Объект:
Адрес:
Площадь:
Всего строк
Работы
Материалы
Matched
New candidates
Выбор строк:
Выбрано: (работы: , материалы: ) из
☐
Row
Имя
Тип
Ед.изм
₽ за ед
Match
изменено (было: )
Нет извлечённых строк. Проверь формат.
Отметь строки чекбоксами
✅ Импорт завершён
·
·
Выбери XLSX/XLS файл → нажми «Preview» для предварительной обработки.
🩺 Здоровье каталога
⏳ Считаю метрики…
✓
📈 История health-score (snapshots)
⏳ Загрузка…
Нет snapshots в выбранном диапазоне (cron `0 3 * * *` копит daily, retention 30d).
min= · max= · n=
📦 BOM (нормы расхода материалов)
Coverage
Работ с нормами
Полный BOM (3+ мат)
Всего норм
BOM = состав материалов на работу (consumption_norms). Cron weekly: dofill для новых работ. AI source: Haiku 2026-04-26.
📊 AI Market Tracking
AI fresh (<30 дн)
AI stale (>30 дн)
Δ > 30%
Δ > 50% 🔴
Δ = ABS(canonical exec − AI median) / AI median. Расхождение > 30% — повод проверить.
Cron: monthly refresh AI цен (1-го числа в 04:00 UTC). Не применяем canonical автоматически.
⏳ Загрузка…
ID / Работа
Catalog ₽
AI ₽
Δ%
Conf
Action
🧾 Рыночные цены — на рассмотрение
К рассмотрению: Снимок устарел: Ниже нашей выплаты: Принято: · Отклонено:
Устаревшая строка сравнивалась с ценой, которой больше нет — её не берёт
«выбрать безопасные». Снять устаревание: повторный прогон обновления выше.
Работа
Наша
Рынок
Вилка
Смет 90д
снимок устарелниже выплаты
Общий индекс здоровья
/ 100
Формула: 25% alias · 20% price · 20% embedding · 15% (no anomalies) · 10% category balance · 10% usage
catalogPresets[k] = false); catalogPresets['no_price'] = true; if (typeof catalogFilterChanged === 'function') catalogFilterChanged(); if (typeof loadCatalogList === 'function') loadCatalogList();"
title="Кликни — открыть в Менеджере с фильтром «Без цены»"
onmouseover="this.style.background='var(--v2-surface-2)'" onmouseout="this.style.background='var(--v2-bg)'">
Всего позиций → 🔍
{ const s = document.getElementById('catSuggSource'); if (s) { s.value = 'anomaly_*'; if (typeof loadCatalogSuggestions === 'function') loadCatalogSuggestions(); } }, 150);"
title="Кликни — открыть в Предложения с фильтром «🧩 Все anomalies»"
onmouseover="this.style.background='var(--v2-surface-2)'" onmouseout="this.style.background='var(--v2-bg)'">
Anomalies → 🔍
margin × 5 или < 1.05 → анализ в Предложениях
📊 Метрики покрытия (детали — клик чтобы развернуть)
📂 Категории — score & coverage (детали — клик чтобы развернуть)
Категория
Позиций
Alias %
Price %
Embedding %
Usage %
Score
Нажми «↻ Обновить» чтобы посчитать метрики.
📐 BOM — Нормы расхода материалов
💡 BOM (Bill of Materials) — состав материалов на работу (например «Установка унитаза» = унитаз + инсталляция + крепёж + силикон).
Нужно для авто-составления сметы. Источники: Haiku AI (2026-04-26 batch) + СНиП. Cron weekly: catalog-norms-fill-cron.
Coverage
Работ с BOM
Полный BOM (3+ мат.)
Всего норм
Работа (catalog)
Материал
Норма
Ед.
Отходы
Источник
Действия
📭
Нет норм по фильтру
Очисти поиск или жди — AI cron заполнит еженедельно (Sun 05:00)
💡 Поиск лучших цен по списку: вставь имена материалов (по одной строке).
Можно с количеством через `|`: краска интерьерная | 5 кг.
Бэкенд делает trgm match в materials_catalog → находит линкованные material_prices с лучшей ценой + альтернативы.
Если нет в каталоге — ищет напрямую в свежих прайсах от scrapers.
Как это работает. После того как AI-сметчик собрал смету, второй AI (Reviewer) проверяет её по этому чек-листу — как бухгалтер при приёмке. Если правило нарушено — в заявке появится reason_code, заявка попадёт в Dashboard «Требует внимания».
Источник правил: docs/ai/reference/gold-technology.json + Руководство сметчика.
Полный план: Autopilot Roadmap (сейчас Phase 1 — manual approve, далее AI suggest → auto-fix).
⏳ Загрузка чек-листа…
7 ключевых pitfalls (Option C — 2026-04-21)
Когда AI флагает:
Как исправить:
Существующие правила (margin, регион, surcharge, etc)
Reviewer AI также флагает эти legacy reason_codes (описаны в lib/estimate-review-contract.mjs правила 1-6):
·
👷 База техников
Не удалось загрузить базу техников:
ФИО
Статус
Рейтинг
Заявки
Активн.
Скиллы
TG
✓◔
Нет данных по фильтру
← Кликни тех в списке чтобы посмотреть детали
Навыки (мультивыбор из канон-словаря — используется автодиспетчером)
не выбраны — отметь ниже
загрузка словаря…
Уровень по навыку (необязательно — влияет на приоритет в автодиспетчере)
ℹ Сохранённые поля защищаются от перезаписи Excel-синхронизацией. tech_status/рейтинг из истории заявок — авто, тут не правятся.
📞
✉
✈ TG:
📍 · радиус
BS24 id:
Okdesk eq id:
Last sync:
Проверка:
Нет skills matrix данных
Скилл
Уровень
Verified jobs
Сертификации / допуски
нет сертификатов — добавь через «+ Добавить»
Техника мастера
что привезёт на объект
⚠ На этот ресурс нужен допуск — заведи его выше, в «Сертификации / допуски», иначе подбор пометит заявку.
техника не записана — подбор пометит этого мастера на заявках, где нужна вышка, кран или сварка
Как работает: при входящем сообщении (email/TG/WA) — сервер проходит правила
по возрастанию priority и применяет первое совпадение. Правило ставит
assignee_role на thread → координатор той роли видит его в Inbox.
Owner override доступен в expanded view drawer (✏ кнопка). Cache TTL 60s — изменения видны через минуту.
Новое правило роутинга
Загружаю…
ID
Prio
Match Type
Pattern
Target Role
Description
📊 Точность
Enabled
Действия
— нет данных
📋 Auto-TODO Rules
Как работает: cron coord-todo-generator-cron.mjs запускается каждую минуту,
проверяет события (новые threads / mentions / SLA breach / tech reject / snoozed expired)
и создаёт coord_todos записи по правилам ниже. Каждое правило указывает
trigger event, match conditions (JSONB filter),
target role (кому показать) и template (заголовок + тело).
Auto-tasks появляются в 📥 Что сейчас drawer как alert/task rows.
Anti-dup: event_key уникальный per fire — повтор не создаст дубль.
Новое auto-TODO правило
Загружаю…
ID
Prio
Trigger
Role
Level
Title template
Hits
Enabled
Действия
🧠 Политики клиентов
Как это работает (Phase 2 (D) Auto-Learning):
Каждый раз когда координатор исправляет AI поле в 07-enrich (через ✎ buttons), запись летит в enrich_correction_log.
Когда в одной компании накапливается ≥2 похожих исправления — extractor создаёт candidate policy здесь.
Ты подтверждаешь / отклоняешь / редактируешь → confirmed policy автоматически инжектится в AI prompt для следующих заявок этого клиента.
Industry pattern: Salesforce Einstein FSL «Customer Profile Learning», ServiceTitan «Customer Memory Vault», Mindee «Per-Customer Rules».
🎉 Пока нет политик на подтверждение.
Когда координаторы исправят 2+ похожих ошибки AI у одного клиента — здесь появится candidate policy.
Можно вручную запустить «🔁 Запустить экстрактор» (обычно cron делает это сам ночью).
Источник: заявки
#,
🚦 Флаги клиентов
Что это: ServiceTitan-style теги клиентов — hard gates (⛔ Do Not Service блокирует dispatch)
и soft hints (⭐ VIP, 💸 Slow Pay, 💰 Только предоплата, 🪪 Нужен инструктаж, 🎫 Сервисный контракт, ⚠ Высокий риск) —
инжектятся в 07-enrich AI prompt. Можно прикрепить к клиенту / конкретному объекту / конкретному контакту.
Нет флагов. Подними первый через «➕ Поднять флаг» (например Do Not Service для клиента с просрочкой).
✗ снят
Снят
👤 Предпочтения контактов
Что это: Per-contact преференции (ServiceTitan/Salesforce pattern): канал связи (WA/TG/email/звонок), часы доступности, язык, роль на объекте, уровень полномочий.
05b-memory автоматически достанет prefs для contact_id текущей заявки и AI учтёт в clarification_questions. Tech получит в pre-work brief.
contact_id *
company_id *
Имя
Телефон
Канал связи
Время доступности
Язык
Роль
Полномочия
Заметки (свободный текст)
Нет настроенных предпочтений контактов. Добавь через «➕ Добавить» — например, для контакта который любит WhatsApp вместо звонков.
⛔ не звонить после часов
❤ Здоровье клиентов
Что это: Composite score 0..1 из 5 компонентов: SLA breaches (×0.30) + risk-flags NTE proxy (×0.20) + coord touches per issue (×0.15) + AR aging (×0.15) + repeat-visit % (×0.20).
Утром CSM (Andrey) глянул — обзвонил красных за 60-90 дней до churn. Pattern: ServiceChannel Provider Scores / Salesforce FSL Customer 360.
Daily cron 03:00 UTC обновляет snapshots. История 90 дней в drill-down. Trend 7d — стрелка изменения score.
🎉 Нет клиентов на риске. Если snapshot'ы ещё не запускались — нажми «🔄 Пересчитать».
🔮 Что готовится — будущие features + мониторинг памяти
📊 Мониторинг памяти AI
Pipeline coverage
Источники памяти
✓ Все системы памяти работают штатно
Список deferred-фич Auto-Learning Sprint'а. Каждая ждёт unlock condition (CSM hire / data density / owner-decision).
Показывает текущий прогресс. Когда condition выполнится — фича становится READY 🎉, можно делать (effort estimate указан).
Загрузка...
📋 Детали (unlock + current state + action)
Unlock condition:
Текущее состояние:
Действие когда готово:
Effort:
Research warning:
📚 Менеджер каталога
Сохранённые фильтры
Пусто
Режим:
Цены клиента:
⚠ overlay активен
Пресеты:
🕳 Gaps — работы которые AI часто видит, но не находит в каталоге
⏳ загружаю...
✅ Нет gaps — каталог покрывает всё что AI видел
№
Наименование
Ед
₽ исп
₽ клиент
Маржа
Готов
Источник
⏳ Загрузка…
Каталог пуст по текущим фильтрам.
⏳ Загрузка…
Каталог пуст по текущим фильтрам.
Считаю влияние правки…
🛠 Skill:—
⏱ Duration:—
Источник:
· ref:
· ⭐
⏳ Загрузка aliases…
Нет synonyms в contract_prices. Все клиенты используют имя как в каталоге.
·
·
⏳ Загрузка клиентов…
Клиентских цен нет. Используется каноническая из каталога.
Каноническая
·
·
⏳ Загрузка норм…
Норм расхода материалов для этой позиции не задано.
💡 Synonyms — альтернативные названия работы, которые AI может дать вместо канонического имени.
Пример: "кондёр"↔"кондиционер". Harvested из pipeline_budget_log (historical) + manual add.
Используются в 07-enrich fastpath — быстрый точный bind перед RAG/embedding.
⚠ Не путать с «Алиасы» tab (contract_prices — как клиенты именуют в договорах).
⏳ Загрузка synonyms…
Synonyms для этой позиции не заданы.
source: · conf:
➕ Добавить synonym
📜 История правок этой работы (catalog_audit_log). Показываются edits через UI и cron-процедуры (anomaly fixes, AI refresh, classify).
⏳ Загрузка истории…
Истории нет. После первой правки через панель здесь появится запись.
·
-
+
🔀 Варианты — каноническое разделение работы по осям (размер / материал / тип механизма / etc). Цена = parent.exec × price_factor; client = exec × 2 (50% маржа).
⬆️ Это вариант. Родительская работа:
₽
дочерних вариантов:
exec ₽
client ₽
:
У этой работы нет вариантов.
📚 Каталог работ — экспорт/импорт CSV
—
💡 Зачем: скачай CSV, открой в Excel/Google Sheets, правь цены / добавляй работы,
загрузи обратно. ID = UPDATE, пустой id = INSERT (новая работа).
После импорта нужен backfill embeddings:
node scripts/backfill-catalog-embeddings-ollama.mjs
— иначе RAG не увидит новые работы.
📥
Экспорт каталога для сметчика
Все активные строки + atomic_alias, contract usage count, средняя цена по договорам.
Открыть в Excel-RU: Данные → Получить данные → Из текста/CSV → выбрать UTF-8 + разделитель «запятая».
📋 Прайс для заказчика (legacy — выбирай канон экспорт выше)
5 колонок: № · Наименование · Ед.изм. · Цена ₽ · Мин.заказ. Для multi-region клиентов (Мегафон: 794 работы × 82 региона) — выбери регион, иначе будет median по всем регионам.
Полный отчёт: все колонки + margin абс + % + итоги по категориям. Для анализа / Excel pivot. НЕ отправлять контрагентам (содержит executor и client цены вместе).
Применить процент ко всем (или фильтрованным) catalog items. Сначала dry-run — увидеть сколько items затронет. Потом apply.
Осторожно.
Как изменятся цены (выборка по применяемости):
Работа
Технику
Клиенту
Смет 90д
📤
Импорт из CSV
Columns: id (опц.), category, action, spec, name_full, unit, unit_label, base_price_executor, base_price_client, min_order, source, source_ref
👥 Команда
⏱ Рабочий день — мониторинг активности🟢 авто-обновление 30с
Автоматический мониторинг рабочего дня
Авто-закрытие забытых смен · восстановление дежурного координатора · авто-away по простою · учёт простоя/обеда. ⚠ Слежка за сотрудником — раскрой в трудовом/локальном акте (ТК РФ + 152-ФЗ).
Загружаю...
Сотрудник
Роль
Статус
На смене
Отработано
Обед
Простой
Активность
· выезд
Нет активных сотрудников
📊 Здоровье маршрутизации заявок ❓
без владельца сейчас
эскалаций / 7д
ушли бы дежурному (detect, набл.)
presence-detect копится…
авто-назначение по источнику::
📈 Аналитика смен (7 дней) ❓
дежурный
провалов покрытия
смен
переработок
забытых
средняя смена
Передачи дежурства: вручную · авто · с заметкой
Replay shift-log:
· due now
· recovered 7д
· max attempt
· oldest Replay shift-log: очередь недоступна (миграция не применена или PG отключён)
✨ AI-сводка смены ❓
Нажми «Сгенерировать» — AI соберёт приоритеты для передачи смены (что подхватить первым).
❓ Как работает дежурство
Смена — нажми «▶ Начать день» в шапке. Если нет активного дежурного, дежурство берёт активный координатор. Owner/admin/другие роли ведут смену без 🛡.
Обед / Выезд — на обеде простой не учитывается (≤2ч ТК). «🚗 На выезде» — простой не считается (работа вне компа).
Завершить день — дежурство передаётся только активному координатору. Если координатора нет, слот остаётся пустым, а срочные случаи уходят owner через эскалацию.
Заявки идут закреплённому ответственному или дежурному координатору (catch-all). Если координатора нет, owner получает эскалацию как последний резерв, но не становится дежурным.
Авто-присмотр (если мониторинг вкл): нет активности 15м → «🌙 Отошёл»; ушёл надолго (4ч) или забыл закрыть (16ч) → смена авто-закроется по последней активности.
Эскалация: дежурный молчит 30м + есть срочное → оповещаются коллеги → через час owner (в Telegram). Срочные заявки не теряются.
Сотрудники платформы
Не удалось загрузить сотрудников:
Не удалось загрузить справочник ролей:
ID
ФИО
Роль
Статус
TG
Города
В работе
Last active
✓—
Загружаю сотрудников...
Нет сотрудников по фильтру
📞 · ✉
✈ TG:
🛡 Роль:
🏙 Города:
🔗 Okdesk сотрудники:
не привязаны
📅 Создан:
🔐 Правила авторизации (политика binding)✓ настроено⚠ не настроено
Этот coord сможет привязать WhatsApp / Telegram только с указанного рабочего номера
(SIM в собственности компании). Email — только с рабочей почты.
Personal личные аккаунты заблокированы политикой.
Yandex app password для IMAP poll каждые 2 мин. Создать:
Yandex ID → Безопасность → Пароли приложений.
Пароль шифруется AES-256-GCM и не возвращается обратно.
ⓘ Telegram отправит код на рабочую SIM. После подключения customer
будет видеть сообщения от @her_username, не от @bs24bot.
В TG → Settings → Devices появится «BS24 Service».
Открой WhatsApp на телефоне →
Settings → Linked Devices → Link a Device
→ Сканируй QR
⏳ Генерируется QR-код...
QR обновляется каждые ~20 сек. Окно pairing — 90 сек.
⏱ QR истёк (окно pairing 90 сек). Сгенерь новый и сканируй быстрее.
ⓘ Coord должна иметь WhatsApp на рабочем телефоне. После QR scan
в WA → Settings → Linked Devices появится «BS24 Service».
Customer видит её сообщения из её personal WhatsApp.
Ⓜ MAX (personal)⏳ pending platform support
MAX сегодня поддерживает только Bot API — coord не может авторизоваться
от своего личного аккаунта, как сделано в TG MTProto / WhatsApp Multi-Device.
Сейчас (Phase 1): shared @bs24bot + author prefix
«👤 :» — customer видит общий бот.
Активация: см. runbook.
Будущее (Q4 2026): когда MAX выкатит Business Connection API
(аналог TG Business), сюда добавим QR/SMS pairing. Адаптер
lib/comm-max-mirror.mjs готов к flip — 15 мин код.
⚠ Опасная зона
Блокировка отзывает все TG/WA сессии и preserves audit trail
🧩 Роли и доступ
пользователи, LK-шаблон, protected blocks и runtime overrides
Загружаю роли и LK-шаблоны…
Роль
Пользователи
Landing
Видимые блоки
Governance
Действия
всего
drawer auto
нет LK-шаблона
override ·
registry default
⏳ Загрузка workspace…
Выбери роль чтобы увидеть какие блоки UI она видит, какой landing использует, какие notification defaults.
Центр включателей блоков
Роль: override
Загружаю блоки…
Режим настройки открыт, изменений нет.
🚪 Landing
📂 Section:
🗂 Sub-tab:
🪟 Auto-open drawer: да
🧩 Widgets:
🔔 Notification defaults
📲 Telegram:
📧 Email digest:
📱 SMS critical:
не настроено для этой роли
📦 LK-шаблон роли
⚙️ override applied
⚠ Изменения мгновенно влияют на UI всех пользователей этой роли. Universal blocks (🌐) убрать нельзя — они hard-coded в registry.
Текущие блоки
Техническое добавление блока
➕ ✕
🌐 — обязательная LK-оболочка: уведомления + профиль. Центр коммуникаций и рабочие разделы включаются выше в «Центре включателей».
🗂 Sidebar groups
🔐 Permissions detail (raw JSON)
🔗 Привязать Okdesk-сотрудников
Когда заявка в Okdesk имеет ответственного из этого списка → pipeline отправит карточку . При смене ответственного в Okdesk — карточка автоматически перейдёт другому координатору.
Загружаю список Okdesk сотрудников… · 💡 По phone match подсказан кандидат сверху
Список пустой
⚠️ Если сотрудника нет в списке (например owner-admin id=1 скрыт Okdesk API):
➕ Пригласить сотрудника
Как это работает: создай сотрудника → система вернёт staff accept URL и отправит письмо на рабочий email. Эту же ссылку можно переслать вручную через TG, WA или SMS. Ссылка открывает вход в ЛК и действует ограниченное время.
После первого входа сотрудник получит staff-сессию. Если понадобится новая ссылка входа позже, её можно выпустить из карточки сотрудника.
➕ Добавить сотрудника
Один сотрудник: укажи email + роль. Если это координатор / CSM / Tech Lead — раскрой «Дополнить детали» и заполни phone / TG / города (нужно для bind в Okdesk + city routing).
Пачка emails: вставь список (по строке или через запятую) → выбери роль (одна для всех) → жми submit. Каждый получит email с magic-ссылкой (TTL 10 дней). ФИО auto-gen из email, можно дозаполнить после accept.
Загружаю LK-шаблон роли…
будет применён после accept; Яндекс ID сработает по этому email
Дополнить детали (ФИО / должность / phone / TG / города)
— для координатора / CSM / Tech Lead
💡 Детали используются для Okdesk binding (phone match) + city routing заявок. Можно оставить пустыми — координатор дозаполнит после accept в своём профиле.
📬 Канал: email через Resend. После создания получишь accept-URL (для дублирования в TG/WA при необходимости).
⏳ Создаём приглашения…
📬 Emails отправлены через Resend · TTL ссылок 10 дней
· Яндекс ID после accept по email
💡 Все успешные ссылки уже отправлены на emails. Если нужно продублировать в TG/WA — кликни 🔗 рядом с каждой строкой или «Скопировать все».
✏️ Редактировать координатора
📨 Onboard техников через SMS
Как работает: SMS с magic-link → tech жмёт → бот авто-привязывает Telegram → следующие заявки приходят в TG (бесплатно).
Дедуп: tech повторно не получит SMS если invited за последние 7 дней.
Двойной gate: SMS пойдёт только если feature_flags.dispatch.sms_to_techs_enabled=true в БД.
⏳ Загружаю cohort preview...
В когорте
Будет SMS
Дедуп skip
~ Стоимость ₽
Превью (первые 5):
✓ Burst queued — batch_id:
·
Прогресс check'ай через PG: SELECT COUNT(*), sms_provider_status FROM tech_invite_log WHERE batch_id='' GROUP BY sms_provider_status
Через 24h измерь conversion: SELECT COUNT(*) FROM tech_invite_log WHERE response_at IS NOT NULL AND batch_id=''
ℹ Все техники в когорте уже invited за последние 7 дней — нечего слать.
⚠ Когорта пустая — нет подходящих техников по критериям SQL.
🧠 Знания
Спроси память своими словами — поиск по смыслу по всей истории заявок: сметы, переписка,
закупки, закрытия, работы по объектам. Например: «что ставили в Европолисе», «почём заправка
фреоном», «кто делал электрику у Ташир-М», «протечка кровли ремонт».
Показать только:сбросить
Задай вопрос — память ответит по смыслу, а не по точным словам.
Ничего не вспомнилось по этому запросу. Попробуй другими словами.
🗄 архив Okdesk
Загружаю из зеркала…
Статус:
В зеркале только заголовок и мета — тела/комментов нет.
Система
🛑
AI на паузе: заявки не обрабатываются автоматически. Возобновить — кнопка справа →
💡 Kill AI + AI провайдеры + цепочки моделей — перенесено в
🤖 AI Управление.
Здесь только общая инфраструктура (PG, Okdesk, парсеры, TG-бот).
🩺 Доктор ЦК
⏰ проверка устарела
Статусов ещё нет — cron пишет их каждые 30 мин в рабочие часы (9–22 МСК).
🤖 AI Operations Center
💡 «Офис экспертов»: каждая операция = карточка со статусом-светофором + кнопкой «▶ Запустить». 🟢 Норма = недавно бежал. 🟡 Залежался = давно не бежал, проверь cron. 🔵 Ручной = только по кнопке. Cron schedules показаны для autopilot ops.
⏳ Загрузка…
Mode:Trust:
▼ история (10 last runs)
⏳…
Нет истории в audit_log.
Нет AI operations в audit_log. Может быть это первый запуск.
Заявки в обработке сейчас (окно 1ч)
Заявка
Клиент
Категория
Статус
Обновлено
Кандидаты
🎯 Кандидаты для заявки
Загружаю кандидатов…
Источник:
· dispatch_log_id =
· статус:
findTopTechs вернул пустой список — нет подходящих техников.
Нет заявок в обработке за последний час. Pipeline в idle-state.
📤 Отправки заявок техникам (7д)❓
Всего заявок
за 7 дней
📩 В Telegram
бесплатно
📱 По SMS
~2.3₽/шт
⚠ Без контактов
за 7 дней
База активных техников:
всего ·
📩 в TG ·
📱 только phone
⚠ без контактов
Пока нет исправлений координатора за выбранный период.
После того как координатор начнёт исправлять AI через ⭐ AI Pipeline Audit — здесь будет статистика.
Не удалось загрузить данные.
🧑⚖ Confidence dashboard (LLM-as-judge)
❓
Пока нет данных. После следующего AI-расчёта (новая заявка через pipeline) — judge запишет verdict.
✅ Auto-publish
цель ≥85% · судья пока строг ❓
⚠ Review
🚨 Escalate
цель ≤5% · сейчас это очередь на прокачку ❓
📊 Avg score
4 оси × 10: полнота·корректность·цены·консистентность
Шаг 2. После подтверждения страница покажет код — вставьте его сюда вместе с названием аккаунта.
Вход ждёт 10 минут, потом отменяется сам. Токен проверяется живым вызовом до сохранения.
Выполните у себя claude setup-token, подтвердите в браузере нужным аккаунтом
и вставьте сюда последнюю строку вывода — она начинается с sk-ant-oat01-.
Токен будет проверен живым вызовом до сохранения.
🔗 Цепочки моделей (fallback chains)
❓
Живые провайдеры:
В буфере не найдено (буфер держит последние 500 строк — попробуй «глубоко»).
journald-история (глубже буфера):
Логи появятся здесь когда pipeline что-то залогирует…
Источник: in-memory ring buffer (500 строк) из lib/log.mjs.
Rate limit: 30 строк/сек на подключение. Heartbeat 20сек.
📥 Входящие на проверку
📥 Здесь письма, в которых система не уверена — заявка это или нет. Проверьте и решите: ✓ Это заявка — создаст заявку и запустит обработку. ✗ Это спам — уберёт письмо.
Можно ничего не делать — письмо просто ждёт здесь, ничего не теряется.
Полка 🗑 Шум — то, что система отбила сама: спам и письма, пришедшие на наш домен
мимо принимающих адресов (у таких в причине стоит recipient_not_accepted). Раньше такие
письма исчезали без следа — теперь их видно и можно вернуть заявкой.
✓ Пусто — все письма разобраны. Новые сомнительные будут появляться здесь.
Нет данных. ai-prober cron запущен? systemctl status ai-prober.timer. PG таблица: ai_health_probes.
⏳ Загрузка...
💰 AI Economics — стоимость, latency, paid-leak (д)
Всего AI calls
Stages используют AI
Total cost USD
Avg paid call
⚠️ Paid leak — fallback на платный API когда Max sub был доступен
Provider
Calls
Cost USD
Stages
Расчёт от 429 на Max → fallback на anthropic-direct / openai-direct. Free providers (groq, gemini) excluded.
Stage
Provider
Calls
p50/p95 latency
Cost USD
Paid calls
⏳ Загрузка...
Нет AI calls за выбранное окно. Источник: pipeline_enrichment_audit.
📈 Daily cost trend:
🗺 AI Inventory — все места где код вызывает AI
Всего call sites
✓ Chain-protected
DI param (resolved)
⚠ Lonely
Internal (defs)
📁 По категориям:
Category
Total
Chain ✓
Lonely ⚠
File:Line
Type
Status
Primary model
Note
✓ chainDIinternal⚙ intentional⚠ lonely
⏳ Сканирую код...
Нажми 🔄 чтобы выполнить scan.
📊 Runtime activity (last 24h, из pipeline_enrichment_audit):
Stage
Calls
Paid
Cost USD
Generated:
📜 Recent probes (last 100)
Time
Chain
Model
OK
Latency
Error
AI-аномалии
❓
Время
Severity
Стадия
Заявка
Actual
Median
Δ %
Sample
Действие
—
✓
Аномалий не обнаружено 👍 (pipeline работает в пределах ±100% от медианы)
История переключений AI
❓
Время
Стадия
Заявка
Было → стало
Уровень
Кто
Причина
→
Переключений режимов пока не было.
🔌 Каналы — почтовые ящики и маршрутизация
Как это работает. Клиенты пишут на разные адреса: общие (info@ — на всё),
для заявок (help@/build@ — даём клиентам), и на личные ящики координаторов.
Можно писать на любой — система привяжет письмо к компании по отправителю (независимо от ящика),
схлопнет дубли, и направит по правилам ниже: адрес-получатель → роль, личный ящик → его владелец («мой inbox»).
Спорное (не заявка) уходит в «📥 Входящие на проверку», не в активный список.
Всего ящиков: Общие: Личные:
📬 Ящики
загружаю…
Адрес
Тип
→ Владелец / роль
Провайдер
Писем 30д
Последнее
Опрос relay
●—не опрашивается — обновите пароль приложения
📥 Принимаемые адреса (приём заявок)
Письмо обрабатывается, только если адресовано на один из этих адресов. ● = адрес, который мы ещё и опрашиваем (есть в ящиках выше). Добавление почты сотрудника здесь = подключить её к приёму заявок.
Что принимает ящик. У каждого адреса ниже — класс:
pipeline — как сейчас: письмо создаёт заявку;
lead — заявка не создаётся, письмо ждёт в очереди разбора и становится лидом (если отправитель новый);
noise — письмо видно на полке «🗑 Шум», заявка и лид не создаются;
internal — внутренняя переписка: заявка и лид не создаются, письмо видно в очереди разбора.
Класс не проставлен — адрес работает как pipeline, то есть до первого изменения всё как было.
Пересылка письма клиента сотрудником на такой ящик остаётся заявкой — иначе сценарий
«переслал обращение на help@ для автосоздания» сломался бы.
●Список пуст — принимаются все (фильтр выключен).
✉️ Подтверждение получения письма
Выключено по умолчанию. Когда включено, отправителю НОВОГО письма уходит одно короткое
подтверждение «письмо получено, заявка такая-то» — в тот же тред, чтобы у клиента это была одна переписка.
Роботам и автоответам, рассылкам, нашим собственным адресам и ответам внутри существующей переписки
подтверждение не уходит. Сроков в письме нет — их нет и в данных.
Текст подтверждения (необязательно; {номер} — номер заявки)
загружаю…
сохраняю…
Тумблер сохраняется сразу; текст — когда уходите из поля.
Как работает. Письмо проходит правила сверху вниз по приоритету (меньше число = раньше), первое совпадение назначает роль-ответственного. Типы сопоставления:
to_pattern — по адресу-получателю. Напр. help@brendservice → coordinator (все письма на help@ идут координатору).
sender_pattern — по отправителю. Напр. @partner.ru → нужная роль.
regex — по теме+телу. Напр. (отмена|расторж|претензия) → customer_success.
ai_category — по AI-классификации намерения письма.
channel — по каналу (email / tg / wa).
💡 Личные ящики координаторов привязывают письмо к владельцу автоматически («мой inbox»), независимо от этих правил. Правила нужны для общих ящиков (help@/info@) и контентной маршрутизации по ролям.
Приор.
Тип
Паттерн
→ Роль
Статус
💡 Все почтовые ящики и правила маршрутизации в одном месте. ➕ добавить · ✏️ изменить · 🗑 удалить. Пароли хранятся зашифрованными, изменения применяются на следующем цикле опроса (~2 мин).
Ящик не опрашивается. Последний опрос кончился отказом — пароль приложения отозван
или IMAP закрыт. Впишите новый пароль приложения (не основной пароль аккаунта)
и сохраните: релей возьмёт его на следующем круге опроса.
Открыть fias.nalog.ru — только с российского IP.
С нашего сервера сайт недоступен, у нас для этого есть выход через Beget.
Раздел «Сервисы» → «Получение сведений из ГАР», войти через Госуслуги (ЕСИА).
Это личная авторизация: сторонний сервис её получить не может, поэтому шаг только ваш.
Заказать выгрузку. Полный архив ~30 ГБ — нам столько не нужно,
достаточно адресообразующих элементов уровня населённых пунктов.
Полученную ссылку прислать мне — подключу загрузку вместо OSM.
В схеме справочника для этого уже есть поля источника, менять придётся только загрузчик.
Честно: ГАР точнее по России, но не покрывает Казахстан. Скорее всего останутся оба источника.
Источник: ·
обновление
загружаю…
Справочник не загрузился:
📍 DaData — геокодинг + ИНН/БИК
DADATA_API_KEY в env. Адреса, компании, банки.
🚩 Системные флаги
❓ что это
🖥 UI версия
✓ все ВКЛ⚠ есть отличиявсе должны быть ВКЛ
🔌 Интеграции (Точка Банк, детектор аномалий)
✓ все ВКЛ⚠ нарушение — интеграция отключенавсе должны быть ВКЛ
⚠️ Override (экстренные переключатели)
✓ штатное состояние⚠ override активен — что-то переопределеновсе должны быть ВЫКЛ (штатно)
mode
Главный переключатель dispatch stage. manual = все действия вручную. auto = ветка B активна (auto-publish/auto-assign при confidence≥high).
max_complexity
R7.1 — порог сложности
Максимальная сложность (1-5) для попадания в branch A auto-assign. По умолчанию 3, в v3.5 поднято до 4.
max_budget_rub
R7.1 — порог бюджета
Максимальный budget_estimate.median (₽) для branch A. По умолчанию 50000, в v3.5 поднято до 75000.
auto_republish_timeout_mins
R7.3 — таймаут draft
После скольки минут inactivity координатора в draft-статусе pipeline сам публикует в канал. По умолчанию 60.
💰 Pricing autopilot (auto-approve смет)
вкл — safe-смета идёт в работу без согласованиявыкл — все спорные сметы идут на согласование❓ политика
auto_approve_enabled
R8.1c — главный kill switch
Когда ВКЛ — заявки подходящие под политику ниже идут в soglasie (в работу) без ручного согласования.
Политика auto-approve
auto_approve_max_budget
макс. бюджет
Заявки дороже этой суммы всегда идут на согласование. Ограничивает финансовый риск автопилота.
auto_approve_min_bound_fraction
мин. доля bound
Доля строк сметы привязанных к каталогу (bound). 0.9 = 90% работ и материалов должны быть узнаны. Ниже — проверка вручную.
auto_approve_min_margin_pct
мин. маржа
Минимальная маржа. Если расчётная маржа ниже (например из-за ошибки или агрессивного демпинга клиента) — в ручное согласование.
auto_approve_require_known_client
только известные
Применять auto-approve только если клиент привязан к canonical_name (есть в alias_map). Неизвестные клиенты — всегда в review.
🤖 Smart Estimator (AI-сметчик для редких работ)
smart_estimator_enabled
R8.3 — AI-оценка для unbound работ
Когда catalog-bind не нашёл работу → AI даёт cost_executor на основе похожих работ из истории. Маржа / регион / надбавки берутся из БД. Линия помечается как ai-estimated и всегда требует проверки координатором.
smart_estimator_materials
AI и для материалов
⚠️ РИСК: материалы требуют реальных цен поставщика. AI может галлюцинировать цены. Оставь ВЫКЛ пока не подключим web-search fallback (R8.3.6.6).
smart_estimator_min_confidence
минимальный confidence AI
Ниже этого уровня AI-ответ отбрасывается (линия остаётся unbound). high = только прямые аналоги в истории. low = принимаем и угадывания (дефолт, safer для координатора).
Загрузка...
⚠ Ошибка:
Возможные причины: файл не найден / путь не в whitelist (stages/, lib/, scripts/, public/, tests/) / файл больше 1MB / secret-блокировка.
📥
🌙
Ты не на смене.
Дежурный: .Никого нет на смене.
Чтобы работать — нажми «▶ Начать день»
СотрудникРоль
TG папки:Email папки:
⚠ Ошибка загрузки
📭
Пусто в «» для фильтра
💡 Почему пусто: включён фильтр «✋ Мои» — показаны только твои треды. включён фильтр «📥 Очередь» — показаны только неразобранные. выбран сотрудник — только его треды. выбрана роль . выбран канал . поиск «» ничего не нашёл. все сообщения разобраны 🎉
По каналу :
📡
В «» есть
threads, но список пока пуст.
Обычно это временный рассинхрон после переключения роли/блоков или фильтров.
🎉
Всё разобрано
✨
Входящие пусты · есть в работе
📭
🔍
Фильтры скрыли threads в «»
По запросу ничего не найдено
Поиск идёт по всем корзинам — Входящие, В работе, Готово, Спам, Все
🔇 Заблокированные отправители
Click чтобы показать список и управление
📖 Что это:
Список sender-ID которые BS24 автоматически отклоняет. Когда отправитель из этого списка пишет — мы не показываем сообщение в Входящие.
🛠 Управление:
➕ Добавить вручную — когда знаешь sender_id заранее (например, по жалобе клиента) — заблокировать до того как он напишет.
⬇ Экспорт — скачать JSON-backup всех правил (для DR / переноса).
⬆ Импорт — восстановить правила из JSON-backup.
✓ Разблокировать на строке — удалить правило, sender снова сможет писать.
💡 Когда нужно: блокируешь sender'a которого ещё нет в BS24 — например, по жалобе клиента, или мигрируешь блок-листы из другой системы.
⏳ Загрузка...
🔇
Никто не заблокирован
Когда нажмёшь 🚫 на сообщение из TG/WA/MAX/Email — появится здесь.
💡 Показаны решённые за 14 дней. Старше — найди через 🔍 поиск вверху (архив не удаляется).
📭
Выбери тред слева
Кликни любое сообщение в списке — здесь откроется conversation с возможностью ответить.
⚠️ Скрыта фильтром
🤖👥
Скрыт · только owner видит
Чем закончился разговор
— общий доступ —
🤖 AI-разбор
AI читает переписку…
⚠ Новые сообщения — разбор может быть неактуален
Новые сообщения
📝 КОММЕНТАРИЙред.
{ const el = document.querySelector('[data-msg-id="' + m.reply_to_message_id + '"]'); if (el) el.scrollIntoView({behavior:'smooth',block:'center'}); })()">
⚠ Битая кодировка: email пришёл в не-UTF-8 charset (likely Windows-1251)
и не был правильно декодирован при intake. Текст ниже — мусор.
Серверу нужен fix (iconv-lite в email-mirror).
🗑 Удалено ·
↪ Переслано
Кому: · Копия:
🎤 Голосовое
· хранение истекло (>90 дней)
✓
🎥
⚠
— превышен лимит загрузки (25 MB)
📎 · хранение истекло
media metadata пришла, но бинарный файл не сохранён в хранилище
Нет сообщений
🔴
Пока нет шаблонов — создай первый
Hotkeys: ⌘+1..9 (Mac) или Ctrl+1..9
↩ Отвечаешь:
👤
никто не подходит под «@»
📄
отправится с сообщением
✓ email отправлен✓ отправлено в TG✓ отправлено в WA✓ Отправлено✓ черновик сохранён✓ отправлено коллегам
📊Статистика ЦК — сегодня
Загрузка…
Общее · вся команда сегодня
Я
По сотрудникам · ответы сегодня
Пока никто не отвечал сегодня.
Я · сегодня
Общее по ЦК · справочно
📚Как работает «Что сейчас»
💡 Click любой блок → детали на нужной вкладке. Цифры — реальное состояние сейчас.
📥 ОТ ЛЮДЕЙ
клиенты, техники — пишут напрямую
↓
⏰ ОТ СИСТЕМЫ
cron каждые 5 минут проверяет правила
🚨 SLA breach— клиент ждёт >24ч
🔴 Техник отказался— нужен новый
⏰ Thread застрял— >7 дней без касания
⏰ Snooze истёк— парковка закончилась
↓
📋 Создаёт задачу или 🚨 алерт
Назначено роли (Координатор / CSM / Tech Lead / др.)
↓ ↓
Оба потока попадают в одни и те же 3 корзины
В корзине = смесь 3 типов сущностей:
💬 Переписка
от клиента или техника
📋 Задача
передана другой роли
🚨 Алерт
создан системой
Inbox принимает сообщения из 4 каналов одновременно. Каждое входящее проходит 4 AI-шага.
📧 Email (IMAP poll каждые 2 мин)
загружаю список ящиков…список ящиков — во вкладке «Каналы» (там же им можно управлять)
✈ Telegram
@boryabrobot — бот для техников (заявки, статусы)
Личный аккаунт через MTProto (как WhatsApp Web — coord видит чат как со своего телефона)
📱 WhatsApp
Meta Cloud API — бизнес WhatsApp
Multi-Device Personal — личный (Baileys)
Ⓜ MAX (российский мессенджер)
Bot API через @bs24bot (shared bot, Phase 1)
🤖 Что AI делает с каждым входящим (Track A):
Проверка на спам (admission classifier) — если spam_or_noise → thread.status='spam', попадает в Спам корзину
Назначение роли (routing rules) — кто должен этот thread видеть: Координатор / CSM / Tech Lead / AI Lead / Catalog / Закупщик / Бухгалтер
Связывание с заявкой — распознаёт [BS24-N] в subject, RFC In-Reply-To header, TicketID шаблоны
Уведомление — push к ответственному + observers (наблюдателям)
⏰ Что система делает сама (Track B — cron каждые 5 минут):
SLA breach — клиент ждёт ответа >24 часа → создаётся 🚨 алерт для координатора (priority=urgent)
Tech reject — техник отказался от заявки → 🚨 алерт «нужен новый техник»
Thread застрял в работе — координатор взял thread, не обновлял >7 дней → 🚨 алерт-bump
Snooze истёк — парковка закончилась → thread возвращается в Входящие
Mention — кто-то упомянул @имя в внутреннем сообщении → notification
Алерты и задачи — это 📋 / 🚨 сущности в тех же 3 корзинах что и обычные thread'ы.
Координатор видит всё в одном месте без переключения.
3 канонические корзины — минимум для быстрой триажа (Hick's Law: 4+ выборов удваивают время решения). Спам и Все — это фильтры внизу.
🔴 ТРИАЖ — требует внимания
Что попадает: непрочитанные thread'ы (никто не открывал). Если клиент написал в закрытый thread — авто-возвращается сюда. Что делать: просмотреть, ответить или закрыть.
⏸ В РАБОТЕ — взято, не закрыто
Что попадает: прочитанные thread'ы (открывал) или отложенные (⏸ Отложить). Также сюда попадают 📋 задачи и 🚨 алерты от cron-scanners. Что делать: ответить когда время будет, или ⏸ Отложить ещё. Через 7 дней без активности — система напомнит алертом (chip «⏰ N дней»).
✓ ГОТОВО — обработанные
Что попадает: закрытые («✓ Закрыть» / «✓ Выполнено» / «✓ Скрыть алерт») за последние 14 дней. Что делать: поиск и проверка завершённых переписок.
🚫 СПАМ — фильтр
Что попадает: AI-классификатор отметил как спам/шум. ИЛИ вручную через 🚫 кнопку.
📦 ВСЕ — для поиска
Все thread'ы — корзина для поиска и проверки прошлых переписок.
Hover на любой кнопке для подсказки. Каждое действие имеет undo через всплывашку (5 сек).
Кнопка
Когда
Что происходит
↩ Ответить
когда нужно ответить клиенту
inline form под row; ⌘+Enter отправляет; auto-close. Реально шлёт SMTP / TG / WA в том же канале.
📝 Внутренние комментарии
сообщение коллегам, клиент не видит
Передача ценности команде без лишних ушей. Поддержка @-mentions — упомянутый коллега получит уведомление.
⏸ Отложить
когда нужно потом
parking lot в «В работе» basket. Заберёшь сам когда время будет.
✓ Закрыть
вопрос решён
thread → status=archived → Готово basket. Если клиент напишет — auto-вернётся в Входящие.
📋 Передать задачу
нужен закупщик / бухгалтер / спец
Создаёт задачу другой роли (procurement / accountant / customer_success / tech_network_lead / ai_lead / catalog_curator). Thread остаётся открытым с обратной ссылкой. AI auto-detect — Phase 2.
🚫 Спам
явный спам/реклама
status=spam → Спам корзина. AI-обучение на спам-паттернах — Phase 2.
🗑 Удалить
чужая переписка / тест
Скрывает thread из всех корзин. 152-ФЗ совместимо. Можно отменить через ↺.
🔔 Подписаться
хочешь следить
issue_observers — получаешь push при новых inbound. Auto-subscribe при reply / mark-read / @mention. Повторный click — отписаться.
💡 Для todo/alert кнопки чуть другие:
• Todo: ✓ Выполнено (вместо ✓ Закрыть)
• Alert: ✓ Скрыть алерт (появится снова через 24ч если ситуация не изменится)
9 ролей в системе. AI routing назначает thread конкретной роли.
🔓 Рабочие переписки — общие
Email, заявки клиентов и общие чат-боты (@boryabrobot и т.п.) видят все координаторы — общая очередь, любой может подхватить (модель «консолидированный координатор»). Счётчики и список одинаковы для всех.
🔒 Личные TG / WhatsApp — только твои
Переписки из твоей личной TG/WA-сессии видишь только ты. Другие сотрудники их не видят — ни содержимое, ни счётчики, даже в спаме. Подключить можно только с рабочего номера.
Роль
Кто
Что ассайнят
🎯 Координатор
диспетчер заявок
Заявки клиентов, диспетчеризация техников, ответы клиентам. Видит цены работ и материалы.
Принцип: fallback идёт только к роли с реальной competence, иначе сразу Owner. Если задача мелкая (купить лампочку, выписать счёт небольшой) — можешь выполнить сам, не передавая. После передачи: задача у одного владельца. Передатчик становится наблюдателем — получит уведомление когда выполнено (Linear pattern).
💡 Esc или click outside чтобы закрыть. Эта подсказка доступна всегда через ❓ в header.
↪ Переслать в…✕
Ничего не найдено
Поиск контактов…
⚠ Клик по контакту = переслать ему. Сообщение уйдёт выбранному адресату (как в TG).
⚠
Удалить переписку целиком?
…удаляю
🗑
Удалить сообщение?
«»
…удаляю
✏️
Редактировать сообщение
…сохраняю
☀
Что произошло
💬 Передача от :
Загружаем сводку…
📬 Новые сообщения
ждут в Входящие
🚨 SLA breaches
клиенты ждут >24ч
🔴 Tech rejects
нужен новый техник
⏰ Зависли
в работе >7 дней
📊 Сейчас в работе: в Входящие ·
В работе
⏹
🎉 Твой день
✅ доведено до «Готово»💬 ответов клиентам✋ взято в работу⏱ ч на смене
💪 смен за неделю — отличный ритм!
Спасибо за работу 🙌
Дежурство координатора — эстафета. Выбери активного координатора для передачи.
Если оставишь пустым — система авто-выберет активного координатора на смене, если он есть.
Ты не дежурный координатор. Будет закрыта только твоя смена; дежурство не изменится.
💡 Передача появится в Daily Brief у следующего coord утром.
💬Закрыть без сообщения коллегам?
Этот thread связан с заявкой и здесь было больше одного сообщения.
Если произошло что-то важное (договорились о выезде / клиент попросил перенести /
техник отказался) — запиши коллегам перед закрытием. Иначе в audit будет пусто.
💡 Можно нажать «Закрыть без сообщения» — но в твоей статистике появится «закрыто без записи».
Топ-FSM делают заметку после каждого касания (ServiceTitan / Salesforce FSL pattern).
📋Передать задачу
Создаст задачу в очереди выбранной роли. Thread остаётся в Inbox — задача с обратной ссылкой
на эту переписку. AI auto-detect (Phase 2) сделает это сам когда уверен.
✓ Задача попадёт к:⚠ Все нужные роли не на смене сейчас — задача попадёт к:🔴 Нет coord для этой роли!
Маршрут (по компетенции):
💡 Когда передаёшь задачу — она у получателя (один владелец).
Ты становишься наблюдателем и получишь уведомление когда задача выполнена.
Если задача мелкая — можешь сделать сам, не передавая.
⚠
👤
Каналы ()
➕ Привязать новый канал
Threads ()
Нет threads
🔍Esc
Быстрая навигация
🗓️ Сегодня · 📋 Заявки · 💰 Финансы · 📚 Справочники · ⚙️ Система
Примеры
• #8212 → открыть заявку
• маржа → Справочники → Маржа
• аномалии → Система → Аномалии
Ничего не найдено. Попробуй: номер заявки, «маржа», «kill», «каталог»…