--- компонент: Чешуйка «Задачи» — мои задачи по приоритету, с эпиками, клиентом и продуктом статус: черновик v1 обновлено: 2026-09-10 поверхность: карманный вебапп (главный дом) · артефакт в папке · док у чата портал: bot-marketing.bitrix24.ru UI: React + shadcn/ui на токенах Кобры связано: [[chesuyka]] · [[cheshuyka-crm]] — тот же клиент Б24, та же очередь · [[master-app]] — плитка «Задачи» --- # Чешуйка «Задачи» Открыл карман — и видишь, что делать **сейчас**: свои задачи в порядке настоящего приоритета, у каждой — эпик, клиент со сделкой и продукт. Видишь задачи коллег, если тебе открыто, и можешь поднять им приоритет. ## Шаг 1. Боль В Б24 7 344 открытые задачи. Список «мои задачи» там — это порядок по дате, приоритет почти никто не ставит, а чтобы понять, к какому клиенту и продукту относится задача, надо открыть её, потом сделку, потом вспомнить. С телефона это не делается вообще. | Кому больно | Что должно случиться | Кто пользуется | |---|---|---| | исполнитель | открыл карман — первая задача в списке и есть самая важная сейчас | вся команда | | руководитель | видит, чем занята команда, и может поднять приоритет чужой задаче | владелец, лиды | | аккаунт | у клиента видно все задачи по его сделке, а не только «свои» | продажи, аккаунты | | агенты | Алина знает, что у человека в работе, и не назначает поверх | G005, T-серия | ## Что реально лежит в нашем Б24 Разведка 10.09.2026, живые цифры: | | | |---|---| | Открытых задач | **7 344** | | Из них с привязкой к CRM (`UF_CRM_TASK`) | **5 924** — 81% | | В скрам-группе 115 «Разработка продукта» | 408 | | Эпиков в группе 115 | **24** | | Рабочих групп («проектов») | 50 | | Полей у задачи | 65, из них пользовательских **3** | Открытых по команде: Тарчинский 192 · Кальной 190 · Олег 185 · Хаустов 62 · Антощук 20 · Черноусов 6. На 50 свежих открытых задачах: с дедлайном — 16, с высоким приоритетом — **1**, в группе — 30, с CRM-привязкой — 29, подзадач — 1, с тегами — 6. ### Пять находок, которые задают архитектуру **1. Продукта в Б24 как сущности нет.** У задачи всего три пользовательских поля, и поля «продукт» среди них нет. Продукт размазан по трём местам: значение «Проект» у сделки (`Chat2Desk · ASMO · SmsVote · AVM · AV2CRM · Bitrix`), имя рабочей группы («Решение: HR бот», «Скрам-МоторЛэнд»), имя эпика («GPT семейство», «Классифайд — AVM»). Значит **дерево продуктов живёт в чешуйке**, а связь задачи с продуктом **выводится** по правилам, а не читается из поля. **2. Приоритет в Б24 не используется** — 1 задача из 50. Поле `PRIORITY` не годится как источник «что важно сейчас». Приоритет надо **считать**, а поднятие приоритета коллегой — хранить у себя. **3. Эпики есть только у скрам-групп, и в списке задач их не видно.** `tasks.task.list` эпик не отдаёт; связь лежит в `tasks.api.scrum.task.get` → `epicId` (там же `entityId` — спринт). Значит **эпики добираются отдельным батчем** по каждой задаче скрам-группы. **4. 81% задач привязаны к CRM** — через `UF_CRM_TASK` вида `D_19277` (сделка), `C_` контакт, `CO_` компания, `L_` лид. Связь «задача → клиент → сделка» в основном **уже есть**, её надо не выдумывать, а прочитать и разобрать префикс. **5. Заметная часть открытых задач — автозадачи роботов CRM** («CRM: Отправить через ЭДО», «Отправить напоминание», «Закрыть сделку»). Они настоящие, но это не то, что человек хочет видеть первым в кармане. Отличать по создателю и шаблону названия. --- ## Модель ``` product (дерево) ←─ правила выведения ─┐ │ epic ──┐ │ ├── task ── crmLink ── deal ── client sprint ┘ │ └── boost (кто поднял, когда, насколько) ``` | Сущность | Источник | Ключ | Заметки | |---|---|---|---| | `task` | `tasks.task.list` | `b24_task_id` | системные поля: title, status, deadline, responsible, creator, group, parent, tags, `UF_CRM_TASK` | | `epic` | `tasks.api.scrum.epic.list` по группе | `epic_id` | только скрам-группы | | `task.epicId`, `task.sprintId` | `tasks.api.scrum.task.get` | — | добор батчами | | `crmLink` | разбор `UF_CRM_TASK` | `D_/C_/CO_/L_` + id | сделка → клиент через чешуйку CRM | | `product` | **своя сущность**, дерево | `slug`, `parent` | вложенность как папки | | `productRule` | настройка SSI | — | «сделка.Проект = ASMO → продукт asmo», «группа 99 → моторлэнд» | | `boost` | **своя сущность** | task + user | поднятие приоритета коллегой | | `score` | вычисляется | — | приоритет «сейчас», см. ниже | Служебные поля те же, что у CRM: `b24ModifiedAt`, `localModifiedAt`, `syncedAt`, `dirty`, `archived`. Своя копия, очередь, журнал расхождений — **переиспользуются из чешуйки CRM**, это одна и та же связка с одним и тем же порталом. ## Продукт как дерево Продукты вложены, как папки: ``` Chat2Desk ├── Конструктор │ ├── Модули │ └── Локализация ├── Интеграции (RetailCRM, Bitrix24, Авито) └── Маркетплейс решений Cobra ├── Ядро ├── Чешуйки │ ├── CRM │ └── Задачи └── ADA AI Delivery Решения для клиентов ├── ResFood ├── МоторЛэнд └── … ``` Дерево — **настройка установки**, правится руками. Правила привязки задачи к узлу дерева проверяются по порядку, побеждает первое совпадение: 1. **эпик** → узел (эпик «Cobra — запуск продукта» → `cobra`); 2. **рабочая группа** → узел (группа 99 «Скрам-МоторЛэнд» → `clients/motorland`); 3. **сделка.Проект** через CRM-привязку → узел (`ASMO` → `asmo`); 4. **теги** задачи; 5. не сопоставилось → узел «Без продукта», и это видно — чтобы правила дописывали, а не чтобы задачи терялись. Сопоставление хранится у себя, чтобы каждое открытие кармана не пересчитывало 7 тысяч задач, и пересчитывается при изменении правил или задачи. ## Приоритет «сейчас» Считается, а не читается. Формула — настройка, веса по умолчанию: | Сигнал | Вес | Почему | |---|---|---| | Дедлайн просрочен | +100 | самое громкое | | Дедлайн сегодня / завтра / на неделе | +60 / +40 / +20 | | | **Поднял коллега** | +50 за каждого, руководитель ×2 | ради этого и делалось | | Клиент в горячей стадии (оплата, установка) | +30 | стадия берётся из чешуйки CRM | | Эпик помечен приоритетным | +25 | | | Задача блокирует другие (у неё есть подзадачи или зависимые) | +20 | | | Высокий приоритет в Б24 | +15 | слабый сигнал, но не игнорируем | | Возраст без движения > 14 дней | +10 | чтобы не тонуло | | Автозадача робота CRM | −40 | нужны, но не первыми | Рядом с каждой задачей в кармане — **почему она здесь**: «просрочена на 3 дня · поднял Кальной». Список без объяснения порядка не вызывает доверия и его перестают открывать. ## Доступ и поднятие приоритета Ядро видимость задач не ограничивает — правило «кому что видно» реализует чешуйка (см. права в спецификации чешуйки). Настройка по умолчанию: | Кто | Видит | Может поднять | |---|---|---| | исполнитель | свои задачи | — | | участник той же скрам-группы | задачи группы | да, +1 | | руководитель (owner/admin) | всё | да, ×2 | | агент | как тот, от чьего имени работает | нет — только предлагает | **Поднятие приоритета — своя сущность, не поле Б24.** `boost {taskId, byUser, at, weight, reason}`. В Б24 при желании досылается как комментарий («Кальной поднял приоритет: клиент ждёт») и, по настройке, как `PRIORITY=2`. Исполнитель видит бейдж «поднял Кальной» и одну строку причины; поднявший видит, что задача сдвинулась. Снять поднятие может тот, кто поднимал, или руководитель. --- ## Синхронизация Механика та же, что у CRM: своя копия, очередь исходящих, Б24 главный, доборка по времени. Отличия — в источниках: **Приём задач:** `tasks.task.list`, фильтр `=` на дате портал может молча игнорировать — использовать строгое `>`. **Отправка:** смена статуса (`tasks.task.update`), комментарий (`task.commentitem.add`), дедлайн, а поднятие приоритета — комментарий и опционально `PRIORITY`. Всё через очередь. **Событие «задача закрыта»** — самое ценное для агентов: по нему Алина может написать клиенту, что сделано. Забирать через события `OnTaskUpdate` + доборкой. --- ## Экраны По мерке — три на поверхность. Главный дом — карман. ### Карманный вебапп 1. **Сейчас** — мои задачи по приоритету. Каждая карточка: название, продукт-крошка («Cobra › Чешуйки › CRM»), клиент и стадия сделки, эпик, дедлайн, **почему здесь**. Свайп вправо — закрыть, влево — отложить на завтра. 2. **Задача** — всё о ней: описание, чек-лист, комментарии, сделка и клиент (ссылка в чат Кобры и в карточку CRM), эпик и спринт, кто поднимал и почему. Действия: закрыть, комментарий, перенести срок, поднять. 3. **Команда** — колонки по людям, кому мне открыто; в каждой — верх их «Сейчас». Кнопка «поднять» прямо на карточке. Фильтр по продукту и эпику. ### Артефакт в папке проекта Доска по продуктам: дерево слева, по каждому узлу — сколько открыто, просрочено, кто тянет, какие эпики живы. Полная ширина — единственное место, где дерево и таблица уместны. ### Док у чата Задачи по клиенту этого чата: открытые по его сделкам, кто исполнитель, когда. Одно действие — «создать задачу по этому чату» с уже подставленными клиентом, сделкой и продуктом. ### Рейл Список и поиск без чата: `chat` и `client` в подпись рейла не приходят. --- ## Компоненты интерфейса — React + shadcn/ui Выбор: **React + shadcn/ui** (Radix-примитивы + Tailwind). Три причины: команда и так на React/Next; shadcn отдаёт исходники компонентов, а не чёрный ящик — их можно перекрасить в токены Кобры (`--accent #0e9d7d`, `--bg #efeee9`) на уровне CSS-переменных; всё headless и одинаково работает в WebView Telegram, MAX и в PWA. Правило: **один компонент — одна сущность модели.** Если для сущности нет компонента — это сигнал, что сущность лишняя или недоописана. | Компонент чешуйки | Что показывает | shadcn/ui | Заметки | |---|---|---|---| | `TaskCard` | задача в списке | `Card` + `Badge` + `Progress`(дедлайн) | свайпы — `framer-motion`, не в shadcn | | `WhyHere` | объяснение позиции | `Tooltip` в доке, `Collapsible` в кармане | на телефоне тултипов нет — раскрытие | | `ProductCrumb` | путь в дереве продуктов | `Breadcrumb` | сворачивать до последних двух уровней в кармане | | `ProductTree` | дерево продуктов (артефакт, фильтр) | `Collapsible` рекурсивно + `Checkbox` | shadcn не имеет Tree — собирается из Collapsible | | `EpicChip` | эпик и спринт | `Badge` вариант `outline` | цвет по продукту | | `ClientLine` | клиент + стадия сделки | `HoverCard` в доке, `Sheet` в кармане | стадия — `Badge` с семантикой стадии | | `BoostButton` | поднять приоритет | `Button` + `Popover`(причина) + `Toast` | причина обязательна, одна строка | | `BoostedBy` | кто поднимал | `Avatar` группой + `Tooltip` | | | `TaskSheet` | карточка задачи | `Sheet` снизу (карман) / `Dialog` (док) | в кармане — только Sheet, Dialog не читается | | `TaskActions` | закрыть · срок · комментарий | `DropdownMenu` + `Calendar` + `Textarea` | закрыть — с `AlertDialog` только для чужих задач | | `TeamBoard` | колонки по людям | `Tabs` (карман) / `ScrollArea` горизонт. (артефакт) | | | `FilterBar` | продукт · эпик · срок · тип | `Command` (палитра) + `ToggleGroup` | автозадачи — отдельный тумблер, по умолчанию скрыты | | `SyncBanner` | «N правок ждут отправки», конфликты | `Alert` вариант `warning` / `destructive` | обязателен, не украшение | | `EmptyState` | нет задач / не настроено | `Card` + иконка `lucide` | «не настроено» ведёт в SSI | | `Skeleton` | первый экран | `Skeleton` | рисуется по `initDataUnsafe` до ответа сервера | ### Что хосты делают сами Не рисовать своё там, где у хоста есть системное: | | Telegram | MAX | PWA (ADA) | Кобра (док) | |---|---|---|---|---| | Назад | `BackButton` | `BackButton` | history + `Button` | хост | | Главное действие | `MainButton` («Закрыть задачу») | `MainButton` | `Button` закреплённая снизу | `Button` | | Тема | `themeParams` | `themeParams` | `prefers-color-scheme` | `applyTheme()` | | Safe-area | `viewport-fit=cover` | то же | то же | не нужно | | Уведомление о поднятии | бот | бот | Web Push | ядро | Структура кода: `components/` по таблице выше, `hosts/{telegram,max,pwa,cobra}.ts` — адаптеры того же интерфейса `Bridge`, что описан в спецификации чешуйки. Экраны — три файла, раскладки — по `host` и ширине. --- ## MCP-инструменты | Инструмент | Что делает | |---|---| | `my_tasks_now` | мои задачи по приоритету с объяснением позиции | | `team_tasks` | задачи коллег, кому открыто; фильтр по продукту, эпику, человеку | | `get_task` | задача целиком с клиентом, сделкой, продуктом, эпиком, поднятиями | | `boost_task` | поднять приоритет с причиной — своя сущность, в Б24 комментарием | | `unboost_task` | снять поднятие | | `close_task` / `postpone_task` / `comment_task` | через очередь | | `create_task_for_chat` | задача по чату: клиент, сделка, продукт подставлены | | `tasks_by_client` | все открытые задачи по клиенту или сделке | | `product_tree` | дерево продуктов с числами | | `epic_status` | по эпику: открыто, просрочено, кто, срок | | `request_feature` | заявка на доработку, дедуп по смыслу | Записывающие — только в очередь. Агент, предлагающий поднять чужую задачу, не поднимает, а спрашивает у человека: `boost_task` с `actor` агента отклоняется. ## SSI — настройки установки | Группа | Поля | |---|---| | Доступ | вебхук Б24, прокси, токен Кобры | | Охват | какие группы тянем; тянуть ли закрытые; тянуть ли автозадачи | | Продукты | дерево (JSON), правила привязки по порядку | | Приоритет | веса сигналов, что считать «горячей стадией» | | Видимость | кто видит чьи задачи; кто может поднимать; вес руководителя | | Автозадачи | шаблоны названий и создатели-роботы | | Отправка | досылать ли поднятие в Б24 как `PRIORITY`, как комментарий, или только у себя | Без дерева продуктов чешуйка работает, но всё падает в «Без продукта» — и говорит об этом. Без правил видимости — каждый видит только своё. ## Права - скоупы Кобры: `chats:read` (контекст чата для дока), `chats:write` (заметка «создана задача»). Больше не просить; - видимость задач — на сервере чешуйки, ядро не поможет; - вебхук Б24 не покидает сервер; поднятия и дерево продуктов — только свои данные. --- ## Чек-лист - [ ] эпики добраны батчами через `scrum.task.get`, не выдуманы из названий - [ ] `UF_CRM_TASK` разобран по префиксам `D_ / C_ / CO_ / L_` - [ ] дерево продуктов в SSI; правила привязки по порядку; «Без продукта» виден - [ ] приоритет считается, у каждой позиции есть объяснение - [ ] поднятие — своя сущность с причиной; в Б24 только по настройке - [ ] автозадачи роботов отличены и по умолчанию не первыми - [ ] закрытые задачи не тянутся; открытых — 7 344, обход по ID - [ ] `filter[GROUP_ID]` в верхнем регистре для скрам-методов - [ ] дата доборки — строгое `>`, проверено на задачах - [ ] три экрана кармана; `TaskSheet` снизу, не `Dialog` - [ ] каждый компонент таблицы соответствует сущности модели - [ ] хост-адаптеры: назад и главное действие — системные, не свои - [ ] `SyncBanner` показывает неотправленное и конфликты ## Где обычно ломается 1. **Приоритет из поля Б24** — 1 из 50 заполнен; список будет случайным. 2. **Продукт «из названия»** — «Скрам-МоторЛэнд» это клиент, а не продукт; без правил дерево превращается в свалку. 3. **Эпик из `tasks.task.list`** — его там нет; добор забыли — у всех задач «без эпика». 4. **Автозадачи первыми** — «Отправить через ЭДО» вверху кармана, и его закрывают. 5. **Поднятие как `PRIORITY=2`** — бинарное поле не умеет «кто и почему»; после второго поднятия информация потеряна. 6. **Список без «почему»** — человек не понимает порядок и перестаёт доверять. 7. **`Dialog` в кармане** — модалка на весь экран телефона, из которой не выйти жестом. 8. **Свой «назад» поверх `BackButton`** — две кнопки, одна из них не работает. ## Источники - Разведка портала 10.09.2026: `tasks.task.getFields`, объёмы, 50 свежих задач, эпики группы 115, `scrum.task.get`, `sonet_group.get` - Память: скрам-группа 115, `filter[GROUP_ID]` в верхнем регистре, привязка эпика через `scrum.task.update` - [Спецификация чешуйки](manifest-chesuyka.md) — поверхности, мерка, права, адаптер хостов - [Чешуйка CRM](manifest-cheshuyka-crm.md) — клиент Б24, очередь, журнал, сделки и клиенты - shadcn/ui — компоненты, Radix — примитивы, lucide — иконки --- _Источник: `cobra-components/cheshuyka-tasks.md` в репозитории audio-talks. Эта копия обновляется скриптом `sync-components.mjs` — правки вносить в источник, не здесь._