← все проекты

Дашборд Fit&Lead Group

Три проекта (Fit&Lead, СММ-агент, ИСКРА) в двух контурах. Аналитический: лиды, реклама, трафик, продажи, связки, воронки; источники Битрикс24 (только Fit&Lead), Метрика, Директ, выгрузки продуктов, соцсети. Рабочий: задачи с канбаном и архивом, КПИ, СММ-станция (контент-план, генерация, согласование, публикация) и раздел Директа с планом и фактом. Права двумерные: отдел (СММ, Реклама) на проект. Многопользовательский, доступ по паролю.

repo: E:\Проекты для Гитхаба\Дашборд FitLead\server: cfru, docker compose: app :3190, postgres :5446. http://80.90.184.203:3190, вход admin. Сборка через прокси aitodo:8888. В будущем переезд на сервер работодателя.docs: docs/память: fitlead-dashboard
готовS1 · Каркас, доступ, деплой6/6

Цель: Живой дашборд на сервере под паролем: роли работают, экраны пустые и честные.

↑ Документы проекта: ARCHITECTURE, DATA-MODEL, ACCEPTANCE, DEPLOY
Doc-first: пишем до кода. В ACCEPTANCE — поведенческие критерии, по ним потом сверяем «готово».
✓ Четыре документа в docs/. В ACCEPTANCE поведенческие критерии спринта 1 и заранее спринта 3, сверялся по ним.
doc
↑ Каркас Next.js + Prisma + Postgres в docker compose
app :3190, postgres :5446 (свободны, проверено 14.08). Никаких путей cfru в конфигах — переезд к работодателю должен быть docker compose up.
✓ Next 15.5 + Prisma 6 + Postgres 16. app :3190, postgres :5446 (только с сервера). Сборка идёт через прокси aitodo:8888, иначе npm install внутри docker build на cfru рвётся по таймауту.
feature
↑ Вход по паролю: страница логина, сессии, выход
✓ Сессия в httpOnly-cookie, подпись HMAC-SHA256 на node:crypto, без внешних библиотек. Тормоз перебора: 5 попыток на логин, потом 5 минут отказа. Проверено снаружи: шестая попытка даёт 429. Формулировка ошибки одна и та же на «нет логина» и «неверный пароль», чтобы перебором не собрать список логинов.
feature
↑ Пользователи и роли: владелец, маркетолог, наблюдатель; видимость по проектам
Ограничение и по разделам (деньги видят не все), и по проектам.
✓ Модель: role owner/member, scope full/limited, список проектов, отдельные галочки «деньги» и «чужие задачи и КПИ». Экран /admin/users: создание с одноразовым паролем, правка доступа, сброс пароля, отключение, журнал изменений. Смена прав или пароля поднимает tokenVersion и мгновенно обнуляет выданные cookie. Себя отключить нельзя. Проверено на живом сервере: ограниченный пользователь видит один проект, деньги закрыты плашкой, /api/users отдаёт ему 403, после отключения его cookie перестаёт работать сразу.
feature
Оболочка интерфейса: сайдбар, переключатель проектов, фильтр периода, тёмная тема
Плашка «НЕТ ДАННЫХ» с причиной вместо нуля — сквозное правило.
✓ Сайдбар фильтруется правами (проверено: ограниченный видит одну ссылку на проект, раздела «Пользователи» нет). Плашки НЕТ ДАННЫХ / НЕТ ДОСТУПА / В РАБОТЕ вместо нулей: на обзоре и на экране проекта видно, какого источника не хватает. Адаптив проверен на 390px: шапка с меню, карточки в столбец, таблица прокручивается внутри себя, страница по горизонтали не едет. Фильтр периода не делал: фильтровать пока нечего, переносится в спринт с данными.
feature
↑ Деплой на cfru и доступ снаружи
Решение владельца: поддомен с сертификатом либо IP с самоподписанным. Голый http по IP — пароли и КПИ людей открытым текстом.
✓ http://80.90.184.203:3190, каталог /opt/fitlead-dash, ufw 3190 открыт. Решение владельца от 14.08: по IP без сертификата, COOKIE_SECURE=0. Переключатель на TLS оставлен в .env, код менять не придётся. Логин владельца admin, пароль выдан в переписке.
infra
В РАБОТЕS2 · Ядро данных и загрузка файлов5/7

Цель: Любой файл из любого источника ложится в единое ядро без дублей, метрики считаются в одном месте.

↑ Схема ядра: продукты, каналы, сегменты, сущности, события, сделки, платежи, подписки, расходы, визиты
Узкая нормализованная схема, витрины поверх. Битрикс, Метрика, Директ и файлы пишут в одно ядро.
✓ Заведены channels, source_files, spend_daily, sessions_daily, entities, events, deals, payments. Заодно закрыт долг спринта 1: схема переведена с наката на лету на миграции. Базовая миграция помечена применённой на живой базе, ядро приехало второй миграцией, контейнер на старте делает migrate deploy и ничего не удаляет.
feature
↑ Идемпотентный импорт: хеш файла + натуральный ключ строки
Повторная заливка того же файла не двоит строки. Отчёт: загружено, дублей, ошибок.
✓ У каждой строки уникальный ключ hash(тип источника + натуральный ключ). Повторная заливка не двоит данные, а честно считается пропущенной. Проверено: тот же файл во второй раз дал 0 залитых и 5 дублей; он же в другой кодировке тоже целиком ушёл в дубли, то есть ключ не зависит от кодировки файла.
feature
↑ Экран «Загрузки»: перетаскивание, автоопределение типа, превью, ручной маппинг колонок
✓ Перетаскивание или выбор файла, разбор, автоопределение типа по заголовкам, превью 20 строк, разметка колонок с обязательными полями, предупреждение «такой файл уже заливали», отчёт о заливке с числом дублей и ошибок, список залитого с периодом.
feature
Парсеры рекламы и трафика: Метрика, Директ, VK
✓ Три типа с автоопределением по заголовкам: расход Директа, расход VK, источники Метрики. Разбор CSV написан свой, без угадывания типов ячеек: библиотека таблиц на числе «9 012,75» молча выдавала 27 649, для денег это недопустимо. Кодировка определяется декодированием, UTF-8 Метрики и cp1251 кабинетов читаются одинаково.
feature
↑ Парсеры продуктов: пользователи и платежи СММ-агента, воронка ИСКРЫ, реестр блогеров, трекер сделок
По СММ-агенту и ИСКРЕ это основной источник: Битрикс их не закрывает.
⛔ Написать вслепую нельзя: форматов выгрузок я не видел. Вместо угадывания сделана ручная разметка колонок, которая закрывает любой табличный файл, плюс готовые типы «платежи продукта» и «сделки и лиды». Как придут реальные выгрузки, добавятся подписи автоопределения.
feature
Ручной ввод: посевы, бартер, партнёрские и оффлайн-договорённости
⛔ Заводится тем же импортом из таблицы. Отдельная форма нужна, но её поля стоит рисовать по живым данным, а не выдумывать заранее.
feature
↑ Каталог метрик одним модулем: формулы, единицы, пороги, направление
Единственное место расчёта. Ни один экран не считает метрику у себя, иначе числа разойдутся.
✓ src/lib/metrics: расход, выручка, визиты, лиды, платящие, стоимость лида, стоимость клиента, средний чек, окупаемость, конверсия визит-лид. Правило отсутствия данных зашито в код: нет знаменателя — метрика возвращает null, а не ноль; знаменатель меньше 30 помечается малой выборкой. Подписочные метрики появятся вместе с данными подписок.
feature
В РАБОТЕS3 · Рабочее место отдела: задачи, бэклог, КПИ15/16

Цель: Отдел работает в дашборде уже сегодня, до появления доступов к данным.

↑ Задачи: проект, исполнитель, постановщик, срок, приоритет, описание, чек-лист
✓ Всё перечисленное плюс отметки времени этапов. Карточка задачи на отдельном адресе: описание, чек-лист, обсуждение, параметры, история.
feature
↑ Задачи как в Трелло: модалка, перенос мышкой, завершение и удаление
Владелец просил это ещё 17.08, я откладывал во вторую очередь и честно об этом сказал. Карточка задачи открывается модалкой с доски и из календаря: название, описание, проект, исполнитель, приоритет, срок, чек-лист, обсуждение, история. Стрелки «влево-вправо» убраны.
✓ Модалка грузит задачу сама по GET, правки уходят по месту без перезагрузки страницы. На карточке остались «завершить» и «вернуть в работу», перенос мышкой между колонками работал и раньше. Удаление с подтверждением. Не сделано: вложенные файлы в задаче (ссылки живут в описании) и настраиваемые колонки доски задач — колонки пока жёсткие в коде.
feature
↑ Календарь отдела: месяц, неделя, день
Отдельный раздел в блоке «Работа». Задачи по срокам, постановка задачи прямо в дне, открытие карточки, завершение и правки. У СММ переключатель показа публикаций контент-плана.
✓ Три вида, кнопка «Сегодня», сегодняшний день подсвечен. Плюс в углу дня ставит задачу сразу на эту дату с выбором исполнителя. Клик по задаче открывает ту же модалку, что на доске. Публикации показаны рамкой и правятся в контент-плане, галочка видна только тем, у кого открыт раздел контента.
feature
Выгрузка задач в Excel и срок по умолчанию
Кнопка выгрузки на доске задач и удобный выбор срока при постановке.
✓ Выгрузка отдаёт xlsx с задачей, описанием, проектом, статусом, приоритетом, исполнителем, постановщиком, сроками, чек-листом и числом комментариев; ширины колонок заданы, иначе описание схлопывается. Видимость та же, что на доске: без права видеть чужую работу выгрузятся только свои задачи. Срок при постановке теперь по умолчанию сегодняшний, рядом быстрый выбор: сегодня, завтра, через 3 дня, через неделю, без срока, своя дата.
feature
↑ Файлы в задаче и настраиваемые колонки доски
Два хвоста, которые я назвал несделанными в прошлый заход: вложения в карточке задачи и колонки доски, зашитые в код.
✓ Файлы: до двадцати штук по 50 МБ, лежат в томе, отдаются приложением, видимость наследуется от задачи — иначе вложение обходило бы права. Колонки: настраиваются отделом, хранятся в базе, переименование не ломает задачи (ключ не зависит от названия), задачи из убранной колонки переезжают в первую и об этом предупреждают до сохранения. Бэклог и «Завершено» системные и в настройке не участвуют: у них свои экраны. Проверено на живом сервере: добавил колонку «Дизайн», перенёс в неё задачу, вернул набор по умолчанию — задача переехала обратно.
feature
↑ Фильтры в выгрузке задач в Excel: статус, ответственный, проект
Сейчас выгружается всё подряд. Нужны фильтры перед выгрузкой и те же фильтры в файле.
✓ Ссылка выгрузки собирается из фильтров доски: проект, ответственный, источник, набор статусов из настроенных колонок. Фильтры режутся правами. Первой строкой листа пишется, по каким условиям собран файл и сколько строк. Добавлена колонка «Источник».
feature
↑ Канбан: колонки, перетаскивание, фильтры по проекту, человеку и сроку, подсветка просрочки
✓ Три рабочих столбца: к работе, в работе, на проверке. Статус меняется перетаскиванием и стрелками на карточке — стрелки не для красоты, перетаскивание не работает на телефоне. Просрочка красным плюс кнопка-фильтр со счётчиком. Фильтры по проекту и человеку.
feature
↑ Бэклог по проектам и перенос задач в работу
✓ Отдельный экран, задачи сгруппированы по проектам. Кнопка «в работу» меняет статус той же задачи, новая не создаётся, история сохраняется.
feature
Постановка задач другим: назначение, комментарии, лента изменений
✓ Назначение при создании и в карточке. Комментарии с автором и временем. История пишет, кто менял статус, исполнителя, срок, приоритет и проект.
feature
↑ КПИ: показатель, владелец, период, план, факт, прогресс, история
Операционные показатели вида «столько-то подписчиков в инсте», не денежные планы.
✓ Помесячно, с переключением месяцев. План, факт, проценты, полоса. Направление показателя (рост это хорошо или плохо) учитывается при оценке. Каждый ввод факта пишется в историю с автором и временем. План меняет только владелец дашборда, иначе показатель подгонят под факт.
feature
Автоподстановка факта КПИ из ядра там, где показатель уже считается
⛔ Нечем подставлять: ядра данных ещё нет. Поле factSource уже различает ручной ввод и расчёт, на экране это видно, поэтому добавление источника не потребует переделки интерфейса.
feature
Личный экран сотрудника: мои задачи, мои КПИ; сводка КПИ отдела в обзоре
✓ Без права на чужую работу человек видит только свои задачи (порученные ему и поставленные им) и только свои КПИ. Сводка КПИ месяца выведена на обзор с тем же правилом видимости. Проверено: чужая задача по прямой ссылке отдаёт 404, правка чужой 403.
feature
↓ Напоминания о сроках и новых задачах
Канал согласовать: телеграм или почта.
✓ Сделано уведомлениями внутри дашборда, без бота. Приходят исполнителю при постановке и переназначении задачи, исполнителю и постановщику при комментарии. Счётчик непрочитанных в меню. Проверено на живом сервере: назначил задачу второму пользователю и написал комментарий, оба уведомления пришли адресату.
⛔ Нет телеграм-бота, он появляется вместе с уведомлениями о согласовании контента. Отдельная засада: cfru не ходит в Телеграм напрямую, понадобится прокси через aitodo.
feature
↑ Этапы задачи с отметками времени прохождения
Видно, когда что реализовалось.
✓ Создана, взята в работу, закрыта — с датой и временем. Видно на карточке.
feature
↑ Архив: автоуход, зачёркивание, возврат из архива
Прошла все пункты — уходит в скрытый столбец, зачёркнутая. Столбец можно открыть и вернуть задачу в работу.
✓ Пройдя последний этап, задача уходит в скрытый блок «Архив» зачёркнутой. Блок разворачивается, задача возвращается в работу одной кнопкой.
feature
↑ Быстрый поиск по задачам
✓ Мгновенный поиск по названию на клиенте, вместе с фильтрами. На сотнях задач это верно, на тысячах понадобится серверный поиск — записано в SCOPE-CUTS.
feature
В РАБОТЕS4 · Аналитика проектов и конструкторы9/10

Цель: Экраны, ради которых всё затевалось: воронки, связки, каналы, разрезы.

↑ Обзор: три проекта, выручка, расход, план месяца, алерты
✓ Выручка, расход, лиды, визиты с дельтой к такому же периоду перед текущим (дельта красится по смыслу метрики: рост расхода это плохо). График по дням, плитки по проектам, сводка КПИ месяца. Проверено на живых данных: 41 509 руб расхода и 1 884 визита сошлись с файлами. Алертов пока нет, они в спринте качества данных.
feature
↑ Итоги месяца: страница к встрече по трём проектам
Экран /report в разделе «Обзор»: вкладка на проект, переключатель месяца, по умолчанию прошлый месяц. Заявки и сделки, реклама, сайт, соцсети. Всё, чего нет в источниках, вносится руками и подписывается как внесённое руками; там же «что сделали» и «ближайшие планы».
✓ Развёрнуто на marketing.fit-lead.ru/report, проверено на живых данных за август. Fit&Lead: 724 заявки (488 из них регистрации в кабинете), 70 с рекламы, 14 качественных, 28 сделок, расход 214 423 руб, 63 публикации, 7 977 просмотров. СММ-агент: 21 889 визитов, 9 223 перехода в мессенджер, расход 177 687 руб при цене клика 8 руб. ИСКРА: не подключено ничего, вкладка заполняется руками. Прочерк и ноль разведены: где источника нет, блок сворачивается в строку, а не показывает честный на вид ноль. Переходы в мессенджер берутся наибольшей целью, а не суммой — автоцель и своя цель считают один клик. Ручная часть лежит в month_reports, автоматическая пересчитывается при каждом открытии. Проверено сохранение и очистка через API.
feature
↑ Итоги месяца: провалы внутрь, главные сдвиги, разбор с рекомендациями
К общему экрану /report добавлены четыре страницы провала (заявки, реклама, сайт, соцсети) с парой «сейчас / было» и объяснением периметра, карточка «Главные сдвиги» и текстовый блок «Разбор и рекомендации» (month_reports.analysisText). Заявка привязывается к кампании по номеру в метке и по номеру объявления; непривязанные показаны отдельно.
✓ Развёрнуто и проверено на августе Fit&Lead: страница рекламы показывает, что 43 заявки июля пришли с меток {brend}/{bloger}, в августе с ними ноль, а деньги ушли в ретаргет (48 804 ₽, 15 заявок) и поиск (18 797 ₽, 8 заявок); страница сайта объясняет 70 против 43 — на лендинге форма блогера не отмечена лидовой, цель «Bloger» за лето не сработала ни разу. Разборы за август написаны по трём проектам; для СММ-агента из выгрузки посчитано 562 регистрации при 177 687 ₽ расхода и нуле новых оплат, для ИСКРЫ — 4 пользователя, 1 оплата по промокоду на 0 ₽. Заголовки страниц без JS-ошибок, все семь адресов 200.
feature
Протоколы встреч по итогам месяца: страница /vstrechi/<дата>
public/vstrechi/<ГГГГ-ММ-ДД>/index.html + правило /vstrechi/:slug в next.config.mjs. Описание в docs/REPORT.md, раздел «Протоколы встреч по итогам месяца».
✓ Первый протокол: https://marketing.fit-lead.ru/vstrechi/2026-09-08 (итоги августа, встреча 08.09 с Ниной Николаевной и Мишей). Цифры из базы дашборда по периметру рекламодателей, выводы, 14 решений с таймкодами, задачи по людям, календарь, открытые вопросы, риски. Собрано на cfru, curl 200, noindex на месте.
feature
↑ Экран проекта: лиды, реклама, трафик, продажи, сегменты
✓ Метрики проекта, график расхода и визитов по дням, таблица кампаний с ценой клика, таблица источников трафика, сделки по стадиям. Где источника нет, стоит плашка с причиной. Сегментов нет: разрез появится вместе с данными, где сегмент вообще есть.
feature
↑ Конструктор воронок и цепочек: выбор сущности, шагов-событий, фильтров, окна атрибуции
Аналог «Цепочек» из Пульса Цен, но на данных Битрикса, Метрики и Директа.
✓ Раздел «Воронки и связки». Шаги набираются из целей Метрики в своём порядке, видно объём шага, долю от прошлого шага и от визитов. На экране сказано, что это объёмы шагов, а не путь одного человека: суточных сумм на пользовательскую воронку не хватает.
⛔ Строится на таблице событий, а её нечем наполнить: события приходят из выгрузок продуктов и Метрики, ни того ни другого пока нет. Делать конструктор, который гарантированно покажет пустоту, преждевременно.
feature
↑ Связки: конструктор комбинаций и сравнение между собой
Пользователь: «дать выбор сущности, события, офферы, аудитория и прочее». Значит не фиксированная таблица, а конструктор: набираешь измерения (источник, кампания, креатив, аудитория, оффер, посадочная), сохраняешь как связку, сравниваешь связки.
✓ Связки: любая комбинация измерений (источник, тип трафика, кампания, посадочная) с визитами, отказами, целями, расходом и ценой цели. Расход цепляется по названию и номеру кампании, что не сошлось — отдельной суммой, а не размазано.
⛔ Тот же движок, что и конструктор воронок, и та же причина: нет событий.
feature
Каналы: сквозная таблица, сортировка по окупаемости, каналы без бюджета отдельным блоком
✓ Экран каналов: кампании всех проектов в одной таблице с долей бюджета и ценой клика, плюс источники визитов. Окупаемости в разрезе канала пока нет: для неё нужна атрибуция заявки к каналу, а значит сырые визиты с метками.
feature
Атрибуция: первое, последнее, поровну; явная строка «не атрибутировано»
Частично разблокировано 28.08: у заявок CRM есть метки utm, у сделок есть источник и ссылка на заявку, поэтому связка «источник → заявка → сделка → деньги» уже считается и показана на экранах Каналы и Сквозная воронка. Не хватает именно моделей атрибуции (первое/последнее/поровну) и разделения органики с прямыми заходами — для последнего нужна связка по идентификатору посетителя Метрики, метку на органику не поставить.
✓ Последний значимый источник работает, расход привязан через кампанию (у бесплатных источников его нет), непривязанное показано отдельной суммой. Первый клик и поровну ждут событий Метрики.
⛔ Атрибутировать пока нечего: нет ни событий, ни меток на визитах, ни сделок с источником.
feature
Произвольные разрезы и графики, экспорт таблицы в CSV и экрана в PNG
PNG — чтобы вставлять в отчёт для ГД.
✓ Графики сделаны на своём SVG, без внешней библиотеки: нужны столбцы и линия, а лишние сотни килобайт в сборке ни к чему. Экспорта в CSV и PNG пока нет, вынесен в остаток спринта.
feature
В РАБОТЕS5 · Коннекторы источников16/18

Цель: Данные приезжают сами, руками ничего не грузим.

↑ Битрикс24: входящий вебхук, сделки, стадии и история стадий, воронки, менеджеры
Сделано 26-28.08: вебхук, задачи, люди, календарь и встречи, лиды CRM (4192), сделки (1021) со стадиями по справочнику каждой из 15 воронок, воронками, менеджером и признаками выиграна/провалена, связка сделки с заявкой по ссылке. Осталось только одно: история стадий — видно текущую стадию, но не путь по ней и не сколько сделка на каждой стояла. Для этого нужен отдельный метод Битрикса (crm.stagehistory).
✓ Вебхук подключён (портал crm.maniteka.ru, пользователь 195), права task, tasks, tasks_extended, calendar, crm, user. Задачи импортируются: 68 человек в справочнике, 43 задачи приехали (8 отдела, 35 наследства предшественника), 32 чужих пропущены. На доске бейдж «Битрикс» со ссылкой на оригинал и фильтр по источнику. Осталось: календарь двусторонний и сделки CRM.
feature
↑ Исторические данные: год расхода, визитов, объявлений и креативов
✓ Подвкладка «Исторические данные» на экране проекта: помесячно расход, клики, визиты, лиды и цена лида; кампании за период; объявления с заголовком, текстом, кликами, конверсиями и ценой конверсии; посадочные из ссылок объявлений. Заведены таблицы объявлений и креативов, коннектор тянет AD_PERFORMANCE_REPORT плюс тексты через ads.get. Залито 5 490 строк по дням и 272 креатива, год расхода (Fit&Lead 1 832 995 руб), визиты и цели на всю доступную глубину. Видно главное: цена лида выросла с 1 432 руб в июне до 4 845 руб в августе.
feature
↑ Полная проверка прав, вёрстки и форм перед заводом команды
✓ Три тестовых аккаунта (СММ, реклама, наблюдатель) прогнаны по 21 экрану и по API: матрица доступа сходится, чужое отдаёт 403, без входа 401. Геометрия проверена кодом на 390 и 1440: горизонтальной прокрутки, наездов и битых картинок нет, широкие таблицы прокручиваются внутри себя. 15 проверок форм: всё валидное создаётся, всё кривое отклоняется с 400. Непереведённых надписей и мусора в видимом тексте нет. Тестовые данные удалены.
feature
VK Реклама: статистика в дашборд (сборщик, экран /ads/vk, сводка по площадкам)
Запрос 25.09: завести все новые рекламные каналы. Директ заведён целиком (4 кабинета), не хватало ВК Fit&Lead. Карта docs/VK-ADS.md, экзамены tests/spec/vk-ads.mjs.
✓ Сборщик src/lib/connectors/vkads.ts в ежедневном /api/cron/metrika; кабинет 1091538466 в ad_accounts; экран Реклама → VK Реклама (/ads/vk, /ads/vk/<id>); сводка /ads по площадкам; конверсии ВК не смешиваются с Директом; VK_ADS_TOKEN прокинут в docker-compose. Сверка всех 5 кабинетов в кроне ok. Доки: VK-ADS.md, ACCEPTANCE, DECISIONS-QUEUE, SCOPE-CUTS-LOG, DEPLOY, PASSPORT.
feature
Кабинет ВК Fit&Lead 1091538466 заведён в справочнике кабинетов (fitlead, vk_ads)
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Ежедневный сбор забирает ВК и сверка кабинета сходится
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Расход и вступления ВК за 14 дней в дашборде равны кабинету до рубля
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Повторный сбор не плодит строк
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Экран «ВК Реклама» показывает кампании ВК, без входа не открывается
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Кампании ВК не попадают в раздел Директа
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
В сводке «Реклама» у VK Рекламы есть кабинет и ссылка, а не «не подключена»
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Кампания ВК раскрывается до групп и объявлений с текстами
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
Ссылка объявления в сообщество не помечена как «меток нет»
✓ tests/spec/vk-ads.mjs на cfru 25.09: 9/9 экзаменов сдано (сверка с живым кабинетом ads.vk.com, 14 дней: 2641 ₽ / 12 вступлений = дашборд)
acceptance
↑ Метрика Reports API по всем счётчикам
Механика отработана в LeadForge, забрать оттуда.
✓ Работает на живых данных. Три счётчика: 108556065 fit-lead.ru и 110820866 landing1.fitlead.ru к Fit&Lead, 108726796 сммагент.рф к СММ-агенту. Привязка через справочник посадочных: у посадочной стоит номер счётчика, посадочная принадлежит проекту, поэтому данные сразу ложатся в нужный разрез. Тянем визиты, посетителей, новых, отказы, длительность в разрезе типа трафика, метки источника и кампании. Владелец выдал доступ 16.08, право edit (до этого читалось только через публичную статистику). Залито 90 дней: 44 202 визита.
feature
↑ Директ API v5: расход, клики, показы по кампаниям и группам
Забрать из LeadForge: docs/YD-MACHINE.md.
✓ Работает на живых данных. Доступ решён через одобренное приложение LeadForge: владелец один раз разрешил ему работать со своим Директом, код перенесён руками (Redirect у приложения сменить нельзя). Токен на год выдан на logonchek, кабинеты открываются заголовком Client-Login: fitnessaffiliateclub → Fit&Lead, a9ent-smm → СММ-агент. Кабинеты лежат в таблице ad_accounts с привязкой к проекту. За 90 дней приехало 482 строки: 487 851 руб и 265 055 руб, обе сверки сошлись ровно. ГЛАВНАЯ ЛОВУШКА, из-за которой я сначала соврал: отчёт готовится асинхронно и первым ответом отдаёт 201 с пустым телом. Я прочитал только тело и отчитался, что расхода нет ни за 90 дней, ни за два года. Владелец поправил. Теперь ждём именно кода 200 с паузой из заголовка retryIn. Карта фактов в docs/DIRECT.md.
feature
↓ VK Реклама
✓ Запущено 16.09.2026 ~15:30 МСК по «ок запускай» владельца: кампания 31474749 (3 группы, 6 объявлений, 5 креативов по гайдбуку: чистое фото + рамки/лого/Inter кодом, 350 руб/день, лимит 10 500) и кампания 31476016 на посты сообщества (2 поста, 150 руб/день, лимит 4 500). Все объявления active, на модерации. Страница согласования myvisionagency.ru/lab/fitlead-vk/, карта docs/VK-ADS.md, движок вёрстки scripts/vk/layout.py. Проверки 17.09 и 23.09 заведены.
feature
↑ Данные продуктов: регулярная выгрузка или реплика по СММ-агенту и ИСКРЕ
Договориться с разработчиками продуктов о формате и расписании.
feature
Расписание синхронизаций, лог, кнопка «синхронизировать», алерт «источник молчит»
✓ Кнопка на экране загрузок с выбором глубины, плюс крон на cfru в 9:20 МСК на закрытый секретом эндпоинт. Окно крона 14 дней, а не сутки: Метрика уточняет вчерашние цифры задним числом, и однодневное окно оставило бы их устаревшими навсегда. Алерта «источник молчит» пока нет, он в спринте качества данных.
feature
В РАБОТЕS6 · Качество данных, план и алерты4/5

Цель: Видно, каким числам можно верить, и что от плана отстаёт.

↑ Экран «Качество данных»: статус метрики, источник, владелец, что блокирует
Статусы: автоматически, вручную, нет данных, данные противоречивы.
✓ Таблица по каждому проекту: состояние (считается само, нет данных, по целям а не по сделкам), источник, значение сейчас, значение на старте и свежесть данных в днях. Сверху счётчик «считается само N из M» — это и есть ответ на вопрос, насколько дашборду можно верить.
feature
Baseline на дату выхода и дельта к нему у каждой метрики
✓ Кнопка фиксации по проекту, берутся последние 30 дней. Отсутствие данных тоже фиксируется: «тогда не считалось» это факт. Зафиксировано по Fit&Lead: 44 лида, 232 886 руб расхода, 5 293 руб цена лида, 6 296 визитов.
feature
План месяца: план, факт, прогноз, необходимый темп
✓ Сделано на том же экране рекламы: процент выполнения и темп «успеваем или нет» при текущей скорости.
feature
Движок алертов и лог срабатываний
✓ Пять правил с настраиваемыми порогами: рост цены лида, падение числа лидов, скачок расхода, рост отказов, молчание источника. Сравниваются последние 7 дней с предыдущими 7: недельное окно сглаживает выходные, месячное слишком медленное. Отказы считаются средневзвешенно по визитам, простое среднее по строкам врёт при разном объёме источников. Одно и то же за сутки не дублируется. Прогон идёт ночью после синхронизации и кнопкой вручную. НА ЖИВЫХ ДАННЫХ СРАЗУ СРАБОТАЛО ДВА: по Fit&Lead лидов стало меньше на 54% (13 против 6) и цена лида выросла на 122% (3 148 против 6 993 руб).
feature
↑ Разметка событий: передать спеку разработчикам продуктов и проверить приём
Спека уже написана: events_tracking_spec.md. Пока её не внедрят, воронки продуктов строятся на агрегатах.
task
В РАБОТЕS7 · Соцсети: статистика постфактум16/20

Цель: Охваты, подписчики и вовлечение подтягиваются к опубликованному, КПИ считаются сами.

Сбор показателей соцсетей: подписчики, охваты, вовлечение
Нужно под КПИ вида «столько-то подписчиков».
✓ Раздел «Соцсети» живой. Телеграм собирается без ключей из публичной ленты: подписчики, посты, просмотры, медиа. Ютуб по ключу Data API: подписчики, ролики, просмотры, лайки, комментарии. Залито 139 постов за всю доступную историю, 103 874 просмотра, лучший ролик 42 404. Общие цифры, график подписчиков по дням, таблица постов с фильтрами и сортировкой, карточка поста со встроенным плеером Ютуба и Телеграма, сшивка с контент-планом по ссылке публикации. Крон 6:40 плюс кнопка «Собрать сейчас». Охваты публично не отдаёт ни одна подключённая площадка. ВК ждёт токен, Инстаграм и Тредс — платный скрейпер.
feature
↑ Соцсети: разводная таблица и страница каждой площадки
У площадок разные форматы и метрики, один общий экран показывал самый бедный знаменатель. Разводная: проект, таблица площадок с подписчиками, форматами, просмотрами, реакциями и вовлечённостью, кнопки перехода. Страница площадки: средние, лучшая публикация, график подписчиков, лента публикаций с сортировками и фильтрами.
✓ Проверено на канале CPA-сети за всю историю: 1320 подписчиков, 50 роликов, 93 617 просмотров, 3,11% вовлечённости, средние 1872 просмотра и 58 лайков, средняя длительность 0:48. Ролики Ютуба и посты Телеграма играют прямо в карточке. Убран нечитаемый общий график на девять линий и задвоенная легенда.
feature
↑ Убрать технические тексты из интерфейса
Владелец увидел в проде «нет токена ВК: сервисный ключ приложения» и «открытого API нет, только платный скрейпер». Такие строки видят сммщики, для них это выглядит поломкой.
✓ Переписаны причины недоступности площадок, коды типов кампаний Директа, состояния объявлений, подсказки про Метрику. Журнал сбора с именами источников показывается только владельцу. Правило усилено в памяти до двух красных: запрет на технические тексты в любом интерфейсе, где работают другие люди.
fix
↑ Соцсети по площадкам: цветные плитки и подпункты в меню
Кнопки внизу разводной дублировали каналы: два Телеграма, два Ютуба. Раздел перестроен по площадкам — одна плитка на площадку, конкретный канал выбирается внутри. В меню у «Соцсетей» появились подпункты по площадкам, чтобы не ходить туда-обратно через разводную.
✓ Маршрут сменился с канала на площадку: /social/<площадка> с переключателем «Все каналы / конкретный канал» и подписью канала у каждой публикации в общей ленте. Плитки покрашены фирменными цветами с объёмом (градиент, блик, тень). Подпункты меню строятся по реально заведённым площадкам. Проверено: было 9 кнопок с дублями, стало 7 плиток; Телеграм суммирует два канала — 92 подписчика, 29 публикаций, 477 просмотров. Попутно починена вовлечённость: у Телеграма показывалось 0%, хотя реакций он не отдаёт вовсе — теперь «нет данных».
feature
↑ Инстаграм, Тредс и ТикТок: платный сбор раз в неделю
У трёх площадок нет открытого API. Подключён внешний сбор через Apify на аккаунте владельца, отдельным недельным расписанием, чтобы не платить всемеро за ежедневный прогон.
✓ Замер перед запуском: пять постов Инстаграма 0,0135 USD, около 0,0027 за пост. Полный прогон трёх площадок укладывается в 0,1 USD, за месяц около 0,4 при бесплатном лимите 5. Собрано: Инстаграм 262 подписчика и 30 публикаций с разбивкой на посты, карусели и рилсы, 8662 просмотра; Тредс 19 подписчиков и 4 публикации. ТикТок ждёт ссылку на аккаунт — handle угадать нельзя. Крон в понедельник 7:25. Грабли: maxItems надо ставить с запасом, по достижении лимита прогон обрывается со статусом ABORTED и запрос считается неудачным, хотя данные собраны.
feature
↑ Инстаграм: чинить просмотры, старое поле занижает вдвое
Владелец усомнился в цифрах: 261 просмотр при 42 лайках. В списке публикаций профиля приезжает устаревшее поле videoViewCount, которое Инстаграм больше не поддерживает.
✓ Замер на живом аккаунте: 122 против настоящих 249, 181 против 454, 162 против 409, у одного рилса 13 просмотров при 31 лайке. Просмотры рилсов берутся отдельным прогоном instagram-reel-scraper по полю videoPlayCount, старое поле не используется. Пост из вопроса: было 261, стало 738. Карусели и фото остаются с прочерком: Инстаграм по ним просмотры не раскрывает. Цена сбора Инстаграма выросла до 0,17 USD за прогон.
fix
Соцсети: сбор без дыр — реакции и комментарии Телеграма, пропавшие посты, удалённый канал
Жалоба 25.09: сбор собирает не всё. Карта docs/SOCIAL.md, вопросы (сторис, ВК, MAX, частота Инстаграма, 17 постов Инстаграма, канал СММ Агента) в DECISIONS-QUEUE 25.09.
✓ Телеграм: реакции из ленты, комментарии виджетом обсуждения, скрытые посты = «прочие»; removedAt у постов, пропавших из сплошной выдачи (Телеграм/Ютуб/ВК), пост 374 подтверждён «Post not found»; ошибка удалённого канала @smm_automatization. Регресс vk-ads 9/9.
feature
Реакции постов Телеграма в дашборде равны ленте t.me/s
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Комментарии свежих постов канала с обсуждением равны виджету обсуждения
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
У канала без обсуждения комментарии «нет данных», а не ноль
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Пост, который лента не показывает, не считается постом
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Пропавший с площадки пост помечен и выпал из счёта и срезов, живые не тронуты
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Удалённый канал в журнале назван удалённым, а не «лента закрыта»
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Суточный обход не трогает платные площадки
✓ tests/spec/social.mjs на cfru 25.09: 7/7 (сверка с живой лентой t.me/s и виджетом обсуждения)
acceptance
Соцсети: сторис и просмотры каруселей Инстаграма через Graph API
Нужен доступ админа Meta: привязка fit.lead к странице Facebook, приложение Meta, долгоживущий токен. DECISIONS-QUEUE 25.09 п.3
task
Соцсети: ключ сообщества ВК vk.com/fit_lead
Управление → Работа с API → Ключи доступа (стена, статистика). Сервисный ключ приложения не выдаётся (invalid_grant). DECISIONS-QUEUE 25.09 п.4
✓ 26.10.2026: новый ключ сообщества fit_lead (id 226759637, права фото/сообщения/стена/управление) стоит в .env как VK_TOKEN и в хранилище (запись cmu6pp2yi0006jxdg98r2ic74). Прежний ключ ВК отозвал. Ночной сбор прогнан руками: «ВКонтакте Fit&Lead: подписчиков 170». Записи стены ключом сообщества ВК не отдаёт (ошибка 27), для них сервисный ключ приложения, задача 31c52ea0. Карта: docs/SOCIAL.md, раздел «Ключ сообщества fit_lead».
task
Соцсети: бот Fit&Lead в канал MAX
Свой бот, добавленный админом в max.ru/id6685214668_biz. DECISIONS-QUEUE 25.09 п.5
task
Соцсети: новая ссылка на Телеграм СММ Агента
@smm_automatization не существует с ~11.09. DECISIONS-QUEUE 25.09 п.1
task
↓ Еженедельный ИИ-разбор: что изменилось, аномалии, гипотезы
✓ Тот же блок вверху соцсетей, разборы за 10-16 августа написаны. Тексты вручную, по сводке, которую считает код.
feature
↓ Черновик еженедельного отчёта для ГД
feature
В РАБОТЕS8 · Проверки по сроку15/25

Цель: Отложенные проверки, чтобы не забылись.

↑ Проверить, появились ли доступы: Битрикс24, Метрика, Директ
Владелец 14.08: «пока еще ничего но скоро будет». Как появятся — расчехлять спринт 5. Проверка: спросить владельца + попробовать вебхук Битрикса и токен Метрики.
✓ Метрика и Директ работают: три счётчика и два кабинета собираются кроном, залито 2,1 млн рублей расхода и 9,5 тыс визитов за год. Битрикс24 доступа так и нет, вынесен отдельной задачей спринта 5.
check
РЕКЛ БА: итоги дня и оповещения Лии приходят неделю, повторы не спамят
ssh cfru 'docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -c "select recipient, kind, status, count(*), max(\"createdAt\") from lead_notifications n left join crm_lead_watch l on l.id=n.\"leadId\" where l.\"isTest\" is not true group by 1,2,3 order by 1,2,3"' — ждём digest по одному на день со статусом sent, remind15/alarm60 по одному на лид, failed = 0. Плюс tail /var/log/fitlead-watch.log без bitrixError. Если токен бота менеджера так и не дали — напомнить владельцу.
✓ Ночная смена 01-02.10.2026. lead_notifications без тестовых: owner digest sent 21 (по одному в день до 01.10), remind15 sent 33, alarm60 sent 28, manager new sent 55, overdue sent 20; статуса failed нет вовсе. Повторы схлопнуты (merged). bitrixError за 200 строк журнала — 0.
check
↑ ВК Fit&Lead: прошла ли модерация, есть ли показы и первые вступления (кампании 31474749, 31476016)
Через сутки после запуска 16.09 15:30. Команда: ssh cfru '/tmp/vk.sh GET "/v2/banners.json?_ad_group_id__in=154976370,154976371,154976372,154979672&fields=id,status,moderation_status,moderation_reasons&limit=20"' и статистика: ssh cfru '/tmp/vk.sh GET "/v2/statistics/ad_groups/day.json?date_from=2026-09-16&date_to=2026-09-17&metrics=all"'. Если banned: причина в moderation_reasons, чаще всего юрлицо/ИНН рекламодателя, заполняется в интерфейсе ads.vk.com. Если показов нет при approved: проверить прогноз охвата групп в кабинете. Карта: docs/VK-ADS.md.
✓ Ночная смена 01-02.10.2026. ВК Fit&Lead: все 9 баннеров в группах 154976370/371/372 и 154979672 — moderation_status allowed, status active. Показы идут: 16.09–01.10 по группам 5432 / 1504 / 2046 / 5902 показов, кликов 24 / 2 / 2 / 22, расход 1527 / 402 / 456 / 1200 ₽. Вступлений (goals) — 0 у всех.
check
ВК Fit&Lead: недельный разбор по группам, стоп слабых, лимит вверх сильным
Неделя после запуска. Статистика по группам: ssh cfru '/tmp/vk.sh GET "/v2/statistics/ad_groups/day.json?date_from=2026-09-16&date_to=2026-09-23&metrics=all"'. Смотреть: расход, показы, клики, вступления (goals) по 4 группам и по кампании постов 31476016 против креативов 31474749. Цена подписчика по группам; слабую группу остановить (POST /v2/ad_groups/<id>.json {status:blocked}), сильной поднять budget_limit_day. Потолок 500 руб/день суммарно, 15 000 руб/мес. Прирост участников сообщества fit_lead: было 97 на 16.09.
✓ Разобрано 06.10 в общем разборе рекламы: https://marketing.fit-lead.ru/itogi/reklama-2026-10 (раздел 4, Excel листы ВК). С 16.09 по 05.10: 4 822 ₽ → 29 вступлений (166 ₽), сообщество 97 → 127. «Блогеры и авторы ЗОЖ» 2 440 ₽ / 24 (102 ₽), «Блогеры-2» с 03.10 268 ₽ / 3 (89 ₽), «Эксперты» 430 ₽ / 0 и «ЗОЖ» 484 ₽ / 2 остановлены 03.10, посты 1 200 ₽ / 0 стоят с 24.09. Лимит 500 ₽/д тратится на ~320: «Блогеры-2» берёт ~90 из 250, аудитория узкая. Следующий разбор 13.10; нужен ключ сообщества, чтобы видеть качество подписчиков.
⛔ Ночная смена 01-02.10.2026. Цифры за 16.09–01.10 собраны (скрипт /tmp/vk.sh пересобран из токена, он пропал с /tmp): группы 154976371 и 154976372 — по 2 клика за две недели на 402 и 456 ₽, слабые; 154976370 — 24 клика за 1527 ₽, 154979672 (посты) — 22 клика за 1200 ₽. Вступлений ноль у всех четырёх: цель не достигается ни одной группой. Стоп слабых и перенос лимита — это деньги, без твоего «да» не трогал. Рекомендация: остановить 371 и 372, лимит отдать 370 и 979672, и пересмотреть цель — подписчик за две недели не куплен ни один.
check
Обложка «Архетипы по Юнгу» видна на stage.uiskra.ru?
В хабе cover.url = https://marketing.fit-lead.ru/blog-covers/iskra/arhetipy-po-yungu.jpg (отдаёт 200). Сайт на 18.09 рендерил /images/blog/<slug>.jpg по соглашению и внешний URL не взял. Спросить Дмитрия: берёт ли сайт cover.url из хаба или ждёт файл в репо; если репо, файл ему по ссылке выше. Проверка: curl -s https://stage.uiskra.ru/blog/arhetipy-po-yungu | grep -o '<img src="[^"]*arhetipy-po-yungu[^"]*"' и открыть страницу глазами: обложка должна быть, не чёрный прямоугольник.
✓ 18.09 ~13:50 МСК: stage.uiskra.ru/blog/arhetipy-po-yungu отдаёт <img src="https://marketing.fit-lead.ru/blog-covers/iskra/arhetipy-po-yungu.jpg">, og:image тот же, карточка в списке блога с обложкой. Сайт берёт cover.url из хаба; обновление уже опубликованной статьи подхватил не за 94 с, а больше чем за 15 мин. Дмитрий завёл тестовую статью test-cover (changeSeq 37) с тем же адресом.
check
↑ РЕКЛ БА: обход не падает, bitrixError в журнале нет, лиды пишутся
Команда: ssh cfru "tail -n 200 /var/log/fitlead-watch.log | grep -c bitrixError; docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -At -c 'select max(\"syncedAt\") from crm_lead_watch'". Ожидание: 0 ошибок, syncedAt не старше пары минут. Если ошибки есть: причина в ответе, чинить код, а не тест. Обсудить: тревога владельцу через Лию, если bitrixError держится дольше 30 минут (сейчас крон пишет ok:true и три дня никто не заметил).
✓ Ночная смена 01-02.10.2026. bitrixError в /var/log/fitlead-watch.log за 200 строк — 0; max(syncedAt) в crm_lead_watch = 2026-10-01 17:20 UTC, то есть не старше минуты на момент проверки. Обход живёт, лиды пишутся.
check
КП: досбор подписчиков Instagram у 34 авторов после блокировки 30.09
Instagram 30.09 после сотни запросов стал отправлять на вход, у 34 авторов нет свежих цифр. С ПК: cd "E:/Проекты для Гитхаба/Дашборд FitLead" && node scripts/kp-authors-collect.mjs --only=ig (неудача больше не затирает удачу) && node scripts/kp-authors-build.mjs --html work/kp-avtory.html; на стенде node tests/spec/kp-final.mjs → пункт «Подписчики» должен стать зелёным. Если Instagram всё ещё закрыт: платный прогон Apify details ≈0,1 $ по «да» владельца.
✓ 07.10 18:18 (ПК, бесплатный путь, Apify не запускался): Instagram снова отдаёт профили — kp-authors-collect.mjs --only=ig прошёл 123/123 авторов, 111 из 111 запросов к Instagram удачны, 0 страниц входа. После kp-authors-build.mjs: у 111 из 112 авторов с Instagram есть цифра, у 110 — дата сбора 07.10 (было 32 без цифры). Хвосты: lia.krats (профиль без счётчика в og:description, оставлена цифра каталога 727) и manlavv (в поле Instagram лежит ссылка TikTok). Экзамен «Подписчики… дата сбора» всё ещё красный по устройству: дата есть у 116 из 123, без даты 7 авторов только с VK/TikTok (vbalanse-sport, family-loginovs, club229950705, mesto-sily, suleiimenova, s-taney-vkusno-i-prosto, bammbato) — у них цифры каталога ДО, живого сбора нет. Свежие data/kp/bloggers.json и work/kp-avtory.html лежат локально, на стенд :3191 не выкладывались.
⛔ Досбор 01.10 23:00 прошёл по 123 авторам, но Instagram отдаёт страницу входа: у 32 авторов подписчиков нет (og:image = заглушка rsrc.php), ещё 7 — VK/TikTok без цифры. На стенде :3191 «Подписчики» 84 из 123. Сборщик теперь считает страницу входа неудачей, а не успехом (kp-authors-collect.mjs). Дальше — платный прогон Apify details ≈0,1 $ по «да» владельца.
check
↑ ИСКРА прод: 4 статьи про архетипы открылись на uiskra.ru/blog
30.09 залиты в хаб (ИСКРА_prod, projectId 55a8c0df…, changeSeq 1–4, published), но за 53 мин uiskra.ru/blog «Пока нет опубликованных статей» — прод не читает проект. Владельцу дан текст для Дмитрия. Проверка: curl -s https://uiskra.ru/blog | grep -c 'href="/blog/arhetip' (ждём 3+) и curl -s -o /dev/null -w "%{http_code}" https://uiskra.ru/blog/arhetipy-po-yungu (200). После появления: включить FACTORY_ENABLED=1 для выкладки ИСКРЫ.
✓ 01.10: Дмитрий включил на проде разовую настройку («галочку» публикации проекта). Все 4 статьи на uiskra.ru/blog: 200, разметка ×4, обложки, дата, canonical на uiskra.ru, в sitemap.xml.
check
ВК Фит Лида после перезапуска 03.10: цена вступления и группа «Блогеры-2»
ssh cfru "/tmp/vk.sh GET '/v2/statistics/ad_groups/day.json?id=154976370,158059086&date_from=2026-10-03&date_to=2026-10-09&metrics=base'" — base.vk.result (вступления) и base.vk.cpr (цена). Цель ≤100 ₽. Проверить модерацию баннеров 241309415/416 (moderation_status allowed). Если Блогеры-2 дороже 150 ₽ — выключить, лимит Блогерам 400.
✓ 06–12.10: Блогеры 1 232 ₽ / 12 вступлений = 103 ₽; Блогеры-2 593 ₽ / 6 = 99 ₽ (дешевле 150, оставляем; тратит ~85 из 250 ₽ в день). План 31474749 с 16.09: 5 704 ₽ / 48 = 119 ₽. Цена по неделям 147 → 107 → 101 ₽. Сообщество 146 (06.10 было 127). Модерацию баннеров 241309415/416 отдельно не смотрел: группа тратит и даёт вступления.
check
Реклама 13.10: ВК по группам и что сделано из разбора 06.10
Разбор 06.10: https://marketing.fit-lead.ru/itogi/reklama-2026-10. КОМАНДА: ssh cfru 'node /opt/fitlead-dash/scripts/monday-ads/run.mjs' (неделя 06–12.10) и ssh cfru 'cd /tmp/ads-deep && node deep.mjs --from 2026-10-06 --to 2026-10-12' (если /tmp вычищен, копия C:/tmp/reklama-razbor-2026-10/deep.mjs). СМОТРЕТЬ: ВК «Блогеры» и «Блогеры-2» цена вступления (цель ≤100 ₽), тратит ли «Блогеры-2» свой лимит 250 ₽/д, участников fit_lead (было 127 на 06.10); Fit&Lead: применены ли решения (4 кампании без качественных, телефоны −50%, минус-слова), лиды РЕКЛ БА с метками и качественные за неделю; СММ Агент: не было ли дней без показов (баланс eLama), регистрации и клики «Оплатить».
✓ 13.10: разбор трёх проектов на myvisionagency.ru/lab/reklama-sravnenie/ (внутренняя). Директ по 09.10 (авария Яндекса). Fit&Lead 10.09–09.10: 224 375 ₽, 32 лида РЕКЛ БА, 7 качественных = 32 054 ₽; 06–09.10: 27 164 ₽, 2 формы, 0 качественных. Из решений 06.10 по данным не применено ни одно (4 кампании идут, тексты ТАргет и метки прежние). Кабинет упирается в 6 797 ₽ в будний день; мастер Рекл_Тест_Артем 20% → 43% → 56% расхода, за 06–09.10 1 061 из 1 067 визитов из сети, 0 форм. СММ: 1 058 рег по 151 ₽; после паузы 01–04.10 тот же потолок 6 797 ₽/д, рег 242 ₽ за 06–09.10; 07.10 регистраций 2 при 40–47 (сбой?). ВК: Блогеры 103 ₽, Блогеры-2 99 ₽, сообщество 146 (было 127).
check
↑ 09.10: первая статья Маркера вышла, список блога СММ свежий, ответ Дмитрия по CDT-1142
КОМАНДА ПРОВЕРКИ (после 10:30 МСК 09.10): ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -c \"select \\\"projectCode\\\", slug, status, \\\"publishedAt\\\", \\\"liveAt\\\" from factory_articles where \\\"publishedAt\\\" > now() - interval '1 day' order by 4\"" curl -s https://markirovka.fit-lead.ru/knowledge-base/blog/posts.json | head -c 300 curl -s https://xn--80aggzajwo.xn--p1ai/blog | grep -o 'href="/blog/[^"]*"' | sort -u | wc -l (должно расти: 3 + вышедшие) ХОРОШО: chto-takoe-erid live на markirovka.fit-lead.ru/knowledge-base/blog/; у СММ список /blog содержит вчерашние и сегодняшние статьи; ответ крона factory-live содержит warmed. ПЛОХО: Маркер published, но не live через час → галочка публикации проекта в хабе (CDT-1142 п.4), писать Дмитрию. Также: CDT-1142 — положены ли файлы IndexNow (factory:index:* статус sent).
✓ Зелёная (бриф 14.10). Маркер: chto-takoe-erid (09.10) и markirovka-reklamy (12.10) live на markirovka.fit-lead.ru. Блог СММ: на /blog 13 ссылок при 14 опубликованных, сходится. IndexNow принял все статьи. Дмитрий ответил по CDT-1142, задача закрыта. Поле warmed в ответе factory-live есть, пустое: новых статей в те прогоны не выходило.
check
↑ Пакет «Реклама»: живая сверка Директа (К4, К6, К10), когда API ответит
Проверить API: curl -s -o /dev/null -w '%{http_code}' -X POST https://api.direct.yandex.com/json/v5/dictionaries -H 'Content-Type: application/json' --data '{"method":"get","params":{"DictionaryNames":["Currencies"]}}' (200 = ожил). Затем служебный сценарий E:/Проекты для Гитхаба/fitlead-reklama-dev/README.md (live-direct.sh, только чтение). Опора: 05–09.10 с НДС 714132327 → 15 823 ₽, 714742850 → 6 323 ₽, 714106836 → 3 321 ₽. Закрыть К4/К6/К10 в спринте С32 (PATCH done + цифры).
✓ 20.10.2026: API Директа 200. Живая сверка пакета сделана: К4, К6, К10 закрыты с доказательствами, спринт С32 done, архив fitlead-reklama-2026.10.20.zip.
⛔ Авария Яндекса с 8–11.10 (атаки на дата-центры): API Директа отвечает 204 на любой запрос у всех кабинетов, даже без токена; Метрика за 10–11.10 неполная, с 12.10 пусто. Не наша поломка. Повторить, когда Директ ответит 200.
check
↑ Дашборд: Директ не собирается с 11.10 (API отвечает 204)
fitlead-sync.log: «Директ ответил 204» по всем 4 кабинетам с 11.10; в spend_daily у porg-prrtabgy последний полный день 09.10. Проверка: тот же curl к dictionaries (200 = ожил), затем ssh cfru 'tail -50 /var/log/fitlead-sync.log' и SELECT max(date) FROM spend_daily WHERE "accountLogin"='porg-prrtabgy'. Если ожил: прогнать сбор за 14 дней, сверить расход 10–12.10.
✓ 20.10.2026: API Директа ожил (200 с cfru и локально). Расход собран заново за окно 14 дней: porg-prrtabgy 06–12.10 = 36 228,79 ₽ (сходится с отчётом Директа), последние строки 20.10. Дни 13–14.10 кабинет без показов (так отдаёт и Директ). НО: сборщик целей direct_goals с 19.10 падает каждый день ошибкой 56 «не чаще 1 раза в 10 секунд» (новое ограничение отчётов после аварии) → конверсии Директа после 18.10 не собраны. Починка отдельной задачей в С34 (на прод по «да»). Вордстат через v4 выключен Яндексом (509), блок «Бренд» не обновляется.
⛔ Авария Яндекса с 8–11.10 (атаки на дата-центры): API Директа отвечает 204 на любой запрос у всех кабинетов, даже без токена; Метрика за 10–11.10 неполная, с 12.10 пусто. Не наша поломка. Повторить, когда Директ ответит 200.
check
↑ С29: первые ночные прогоны после выкатки 13.10
⏱ 14.10 · просрочено 16 дн.
Проверить, что ночью отработали новые кроны и сбор. КОМАНДА: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -c \"select key, ok, left(coalesce(error,''),100), \\\"finishedAt\\\" from sync_runs where \\\"finishedAt\\\" > now() - interval '1 day' order by \\\"finishedAt\\\" desc limit 30\"" — ждём metrika ok, health ok, bitrix ok, bitrix-sweep (пометит следующие ≤20 удалённых; 46 ждали). Дайджест задач: select count(*) from notifications where kind like 'task.digest%' and "createdAt" > now() - interval '1 day'. Экран https://marketing.fit-lead.ru/sources. Директ/Вордстат будут красными, пока не решён 204 (отдельная проверка).
check
🔴 Директ API отвечает 204 с 11.10 — расход и цели Директа не собираются
С 11.10 api.direct.yandex.com на любой запрос (даже без ключа, и с cfru, и с aitodo) отвечает 204 с пустым телом; Вордстат (live v4) так же. Последний удачный сбор расхода Директа — 10.10. Не связано с выкаткой С29 (ночные прогоны 11 и 12.10 старой версией упали так же). ПРОВЕРКА: ssh cfru "curl -s -o /dev/null -w '%{http_code}' -X POST https://api.direct.yandex.com/json/v5/campaigns -d '{}'" — норма 400/401 с JSON. Если по-прежнему 204: смотреть статус API Яндекс Директа / изменения доступа приложения ca776098 (LeadForge тоже на нём, см. память yandex-direct-api-approved-app), проверить с другой сети. После починки: POST /api/cron/metrika {"days":14} и /api/cron/weekly {"queriesDays":60}, пробел в расходе с 11.10 закроется.
✓ 20.10.2026: API Директа ожил (200 с cfru и локально). Расход собран заново за окно 14 дней: porg-prrtabgy 06–12.10 = 36 228,79 ₽ (сходится с отчётом Директа), последние строки 20.10. Дни 13–14.10 кабинет без показов (так отдаёт и Директ). НО: сборщик целей direct_goals с 19.10 падает каждый день ошибкой 56 «не чаще 1 раза в 10 секунд» (новое ограничение отчётов после аварии) → конверсии Директа после 18.10 не собраны. Починка отдельной задачей в С34 (на прод по «да»). Вордстат через v4 выключен Яндексом (509), блок «Бренд» не обновляется.
check
↑ С41 бот Насти: задачи Битрикса работают вживую
⏱ 21.10 · просрочено 9 дн.
Что смотреть: (1) сколько сообщений о задачах в день и нет ли спама; (2) «закрыто не по правилам» уходят пачкой, зачёркивание «исправлено» реально правит сообщение в Телеграме (первая живая правка editMessageText); (3) строка в итоге дня Лии; (4) нет «задачи:» в bitrixError. Команды: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -c \"select day, kind, status, count(*) from lead_notifications where kind like 'task_%' and \\\"dedupeKey\\\" like '%|real' group by 1,2,3 order by 1,2,3\""; ssh cfru "tail -300 /var/log/fitlead-watch.log | grep -c 'задачи:'"; итог дня: kind='digest' за 19–20.10. Если что-то не так — карта docs/LEADS-REKL-BA.md «Задачи Битрикса».
check
Завод: ИСКРА партия 3 и СММ волна 3 выходят (первые 20.10 16:00 МСК), видны на сайтах
⏱ 21.10 · просрочено 9 дн.
20.10 «ок» владельца: 20 статей held → ready. Проверка: ssh cfru, cd /opt/fitlead-dash, docker compose exec -T postgres psql -U fitlead -d fitlead, запрос: select "projectCode", slug, status, "publishedAt", "liveAt", error from factory_articles where "publishedAt" > '2026-10-20' order by "publishedAt". У каждой status live и пустой error; открыть siteUrl на uiskra.ru и сммагент.рф.
check
Завод: очереди ИСКРЫ и СММ кончаются 25.10 утром — следующие партии к 25.10
⏱ 23.10 · просрочено 7 дн.
По 10 ready с 20.10, 2 в день на проект, последняя 25.10 10:00 МСК. Следующие: ИСКРА партия 4 и СММ волна 4 по образцу C:/tmp/uiskra-articles-3/BRIEF3.md и C:/tmp/smm-articles-3/BRIEF3.md (структуры руками, пока С40.2 не починил выбор). Маркер: 12 ready, хватит до ~16.11.
check
Блог fit-lead.ru: очередь через MCP выпустила 3-ю и 4-ю статью 23.10
⏱ 23.10 · просрочено 7 дн.
Проверка: ssh cfru, python3 /opt/fitlead-blog-queue/fl-blog-queue.py --status; tail /var/log/fitlead-blog-queue.log; открыть https://fit-lead.ru/blogs (должно быть 4 статьи) и https://fit-lead.ru/blogs/reklama-bad-u-blogerov. Последняя выходит 27.10 10:00 МСК, после неё крон убрать (бэкап /root/crontab.bak-20261022-flqueue).
check
↑ MCP С34 на проде: живые пункты К3/К9/К12 и сбор Директа после забитой очереди отчётов 26.10
До выката сбор Директа на проде падал на ограничении «не чаще раза в 10 секунд»: direct_goals 0 из 4 кабинетов каждый день 23–26.10, недельный сбор 26.10 03:30 — запросы 1 из 4, расход 1 из 4. Обёртка С34 выкачена 26.10 12:54 UTC. 26.10 очередь офлайн-отчётов Директа по porg-prrtabgy забилась (400 «5 отчётов ожидают формирования»): дублирующий прогон экзамена С34. Проверить: (1) ночной сбор Директа 27.10 прошёл: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -c \"select source, ok, left(error,120), \\\"startedAt\\\" from sync_runs where \\\"startedAt\\\" > now() - interval '1 day' and source ilike '%direct%' order by \\\"startedAt\\\"\""; (2) перепрогнать С34 на стенде ОДНИМ процессом: ssh cfru 'cd /opt/fitlead-night/bin && ./mcp-exam.sh tests/spec/mcp-c34.mjs 2>&1 | grep -E "^(✗|Итог)" -A2' — ждём 12 из 13 (К5 ждёт решения владельца по экзамену). Если К3/К9/К12 снова красные с очередью — задача в С34: не бросать офлайн-отчёт по таймауту, а запоминать ReportName и забирать его следующим вызовом. Ждём на ночном сборе 27.10 06:20 UTC: direct и direct_goals 4 из 4. Сводка: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -At -c \"select to_char(\\\"startedAt\\\",'DD.MM HH24:MI'), source, count(*) filter (where ok), count(*) filter (where not ok) from sync_runs where \\\"startedAt\\\" > now() - interval '2 days' and source ilike 'direct%' group by 1,2 order by 1,2\""
✓ Проверено 27.10: (1) ночной сбор Директа на проде 27.10 06:20 UTC — direct 4/4 и direct_goals 4/4 (до выката С34 цели падали 0/4 каждый день 23–26.10): обёртка «1 раз в 10 секунд» работает на проде. (2) С34 на стенде одним процессом: 12 из 13 (К3, К9, К12 зелёные; красный только К5 — ждёт решения владельца по экзамену). Попутно найдено и исправлено в ветке c43: Метрика с lang=ru отвечает «Запрос слишком сложный» по-русски, дробление окна не включалось — недельный сбор разрезов (пн 03:30) упал бы на площадках за 3 недели; поправлен src/lib/connectors/metrika.ts, на стенде С34 К12 зелёный. На прод — с выкатом С36/С43 по «да».
check
↑ Недельный сбор разрезов 02.11 прошёл после починки Метрики (русское «запрос слишком сложный»)
⏱ 02.11 · через 3 дн.
28.10 выкачена починка: TooComplicated ловит русский текст Метрики, окно дробится. До неё недельный сбор разрезов (пн 03:30 UTC) падал: 19.10 и 26.10 на Директе, на стенде 27.10 на Метрике (площадки за 3 недели). Проверить: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -At -c \"select to_char(\\\"startedAt\\\",'DD.MM HH24:MI'), ok, left(coalesce(error,''),300) from sync_runs where source='cuts' order by \\\"startedAt\\\" desc limit 3\"". Ждём 02.11 ok=t. Если упало — читать error: Директ (1 раз в 10 с) или Метрика.
check
Артём подключил Claude к MCP дашборда и собрал первую кампанию
⏱ 31.10 · завтра
28.10 владелец отправляет Артёму текст подключения (claude.ai коннектор или Claude Code, адрес https://marketing.fit-lead.ru/api/mcp, вход логином atargosh — локальная учётка, портальная сессия не нужна). Проверить: ssh cfru "docker exec fitlead-dash-postgres-1 psql -U fitlead -d fitlead -At -c \"select c.tool, count(*) from mcp_calls c join users u on u.id=c.\\\"userId\\\" where u.login='atargosh' group by 1 order by 2 desc\"" и планы: select tool, ok, left(result,120) from mcp_plans p join users u on u.id=p.\"userId\" where u.login='atargosh'. Нет вызовов — напомнить владельцу; есть — это старт пилота С38 (уроки, ошибки, что неудобно).
check
MAX: первый пост ботом владельца из дашборда (С48)
⏱ 04.11 · через 5 дн.
Схема Bot API MAX взята из сторонних SDK, живьём не проверена. После того как владелец даст MAX_BOT_TOKEN и добавит бота в канал: аккаунт MAX → «ботом в канал MAX», statsRef = chat_id (GET {MAX_API_URL}/chats с ключом бота), карточка с 1 фото → publikaciya_plan → izmenenie_primenit. Проверить пост в канале и ссылку в журнале. Если 404 на /uploads — сменить MAX_API_URL на platform-api2.max.ru.
check
СММ Агент: оплаты с сервера в Метрику (CDT-1133) сходятся с базой
⏱ 04.11 · через 5 дн.
28.10 Эльдару (eldar-shmatkov) выдан доступ edit к счётчику 108726796, ему отправлен ответ в CDT-1133: токен metrika:offline_data + metrika:read выпускает сам, отправка оплат по вебхуку ЮKassa через офлайн-конверсии в цель payment_success (610248172). Обещали сверить оплаты, когда он включит. ПРОВЕРКА: 1) Linear CDT-1133: включил ли Эльдар отправку с сервера (list_comments). Нет ответа — напомнить в ветке. 2) Сколько срабатываний цели в Метрике: ssh cfru 'set -a; . /opt/fitlead-dash/.env 2>/dev/null; set +a; curl -s -H "Authorization: OAuth $METRIKA_TOKEN" "https://api-metrika.yandex.net/stat/v1/data?ids=108726796&metrics=ym:s:goal610248172reaches&dimensions=ym:s:date&date1=2026-10-01&date2=today"' 3) Сравнить с оплатами в базе приложения за тот же период (берёт Эльдар, на 07.10 было 7 оплат по 990 ₽ с 10.09). Сходится и нет дублей = done. Нет = blocked с причиной.
check
Scribe: первая живая расшифровка из дашборда, замер цены (С49)
⏱ 04.11 · через 5 дн.
Scribe проверен только подменным сервером, цена 1 ₽ за минуту — оценка. После того как владелец даст ELEVENLABS_API_KEY на проде: ролик карточки 1 минута → montazh_rasshifrovka_plan → izmenenie_primenit. Проверить слова и время в montazh_razbor; сравнить списание в кабинете ElevenLabs с ценой плана и поправить SCRIBE_RUB_PER_MIN в /opt/fitlead-dash/.env. Если 4xx — схему запроса сверить с docs ElevenLabs Speech to Text (model_id, timestamps_granularity=word).
check
готовS9 · Отделы, права, справочники проектов7/7

Цель: Права отдел на проект и сущности, без которых разрезы потом слипнутся.

↑ Переделать права на модель отдел × проект
Отделы: СММ и Реклама, плюс руководство (всё). Человек в отделе видит только отмеченные ему проекты. В СММ два человека: у одного два проекта, у другого один, цифры друг друга они видеть не должны.
✓ Отделы: руководство, СММ, реклама. Отдел подставляет набор разделов (аналитика, контент, реклама, задачи), дальше каждый правится галочкой — нестандартный человек заводится без правки кода. Проекты отдельно: «все» или список. Проверено: в СММ человек с одним проектом не видит ни чужих проектов, ни их аккаунтов.
feature
↑ Экран настройки прав: отдел, проекты, разделы, деньги
✓ На /admin/users: отдел кнопками, проекты галочками, четыре раздела галочками, деньги, чужая работа, роль владельца, поле телеграма. Предупреждение, если не отмечен ни один проект. Журнал изменений доступа под списком.
feature
↑ Справочник посадочных страниц проекта
У проекта несколько лендингов: адрес, счётчик Метрики, назначение. Без этого разрезы по посадкам не собрать.
✓ /admin/projects: название, адрес, счётчик Метрики, назначение. Адрес и счётчик валидируются. У проекта их сколько угодно.
feature
↑ Справочник аккаунтов соцсетей проекта
Площадка, проект, каким способом публикуем: агрегатор (инста, фб, тредс и прочее) или ВК прямым API.
✓ Площадка из списка (ВК, телеграм, инста, фб, тредс, ютуб, дзен, другое), название, имя аккаунта. Способ публикации проставляется сам: ВК прямым API, остальное через агрегатор, для неподдерживаемого остаётся ручной режим. На экране контента у СММщика видны площадки только его проектов.
feature
↑ Настройка согласующих по проекту
По умолчанию владелец, но должно настраиваться на других людей.
✓ Кнопки людей на каждом проекте. Никто не отмечен — согласует владелец. Модель ProjectApprover, уникальность по паре проект-человек.
feature
Привязка телеграма к сотруднику под уведомления
✓ Поле telegramChatId есть, заполняется владельцем руками, видно в профиле сотрудника. Рукопожатия с ботом нет: самого бота ещё нет, он появится вместе с уведомлениями о согласовании. Засада на будущее: cfru не ходит в Телеграм напрямую, нужен прокси через aitodo (известно по другим проектам).
feature
Смена своего пароля на выбранный
Долг спринта 1: сейчас пароль только сбрасывается на случайный.
✓ /profile: текущий пароль, новый, повтор. Проверка текущего, минимум 8 символов, запрет совпадения с текущим. Текущая сессия переподписывается и выживает, остальные закрываются. Долг спринта 1 закрыт.
feature
В РАБОТЕS10 · СММ: бренд-кит, контент-план, генерация13/14

Цель: СММщик генерит руками, дашборд помогает пресетами и бренд-китом. Видео и ИИ-аватаров нет.

↑ Взять из Контент Завода точечно: клиент Kie, учёт стоимости, публикацию
Архитектуру пайплайнов Завода НЕ тащить: там конвейер под автогенерацию, а здесь человек генерит руками. Берём только рабочие куски: клиент Kie, подсчёт стоимости, публикацию в соцсети.
✓ Сверено по коду Навесов. Взят клиент Kie (createTask плюс recordInfo, модели gpt-image-2 и nano-banana-2-lite, баланс в кредитах) и принцип «честный расход это разница балансов». Конвейеры, видео, аватары и озвучка не взяты. Публикация переносится в спринт согласования. Выводы записаны в docs/SMM.md вместе с граблями: образец это другой слаг, поле input_urls, разрешение задавать всегда.
task
Заливка контент-плана из другого инструмента
Excel и CSV: дата, тема, текст, описание, рубрика, площадка, ссылка, статус, формат, автор. Колонки распознаются по названиям, отчёт показывает разобранное и пропущенное.
✓ Идемпотентно по importRef: повторная заливка того же файла обновляет материалы, а не удваивает план. Своего id в выгрузке может не быть, тогда ключом служит хеш темы, даты и площадки. Рубрики заводятся на лету. Картинки так не переносятся: свои файлы прикладывают в карточке, обложки вышедших постов приходят со статистикой площадок. Ждёт реальную выгрузку владельца, чтобы сверить подписи колонок.
feature
Банк референсов в медиатеке
Медиатека наполняется вышедшими публикациями из Телеграма, Ютуба, Инстаграма, ТикТока и Тредса с их цифрами. По любой можно завести новый материал кнопкой «Взять за основу».
✓ Собирается само из статистики соцсетей, заводить руками ничего не надо: на экране 60 карточек с обложками, форматом, просмотрами, лайками и вовлечённостью. Сортировка по умолчанию по просмотрам — вопрос почти всегда «что зашло», есть фильтры по площадке и формату и поиск по тексту. «Взять за основу» создаёт материал с тем же текстом и подписью, откуда он взят и сколько собрал; проверено на живых данных, материал появился и был удалён. Обложки идут через свой прокси, иначе часть чужих CDN в браузере не грузится.
feature
↑ Раздел «Планы на обсуждение» и план по Инстаграму
Страница плана в контенте: цель 18 000 подписчиков, разворот в сторону сообщества ЗОЖ, обратная воронка с тремя источниками и три сценария бюджета.
✓ План перестроен под контент-стратегию v2: цель 12 000 подписчиков суммарно по Телеграму, ВК и Инстаграму за 18 месяцев, не меньше 80% целевой аудитории. Добавлены коридор этапов по месяцам с подсветкой «мы здесь», 12 рубрик, контент-формула 50/30/20, частота по каналам, KPI воронки в продукты. В расчёте появился отдельный ввод прироста Телеграма и ВК.
feature
↑ Бренд-кит проекта: брендбук, референсы, палитра, тон, запреты
Материалы владелец загрузит позже. Подмешивается в промпты автоматически, иначе стилистика трёх проектов разъедется.
✓ Тон, аудитория, стиль картинок, палитра, шрифты, запреты. Плюс загрузка файлов (брендбук, референс, логотип) до 25 МБ в том, отдача своим маршрутом под авторизацией. В промпт подмешивается только по галочке.
feature
↑ Контент-план и рубрикатор с долями
Чтобы не вышло тридцать продающих постов подряд.
✓ Рубрики с целевой долей. На экране плана считается фактическая доля каждой рубрики за месяц и подсвечивается расхождение с планом больше 15 пунктов.
feature
↑ Календарь публикаций: месяц и неделя, слоты, конфликты
✓ Месячная сетка с понедельника, материалы в днях, переключение месяцев. Времени слота и проверки конфликтов нет: это осмысленно вместе с публикацией, записано в SCOPE-CUTS.
feature
↑ Ввод плана человеком: пачкой и по одному
✓ По одному с рубрикой и датой; пачкой — каждая строка отдельной идеей, до 200 за раз. Идеи без даты лежат отдельной очередью, дата назначается прямо оттуда.
feature
↓ ИИ-агент составления контент-плана по бренд-киту
Вспомогательный сценарий: либо собирает план сам, либо ждёт, пока человек распишет. Основной режим всё равно ручной.
⛔ Требует ключа текстовой модели, которого пока нет, и не является основным режимом: человек всё равно расписывает план сам. Вернуться, когда ключи появятся.
feature
↑ Генерация картинок и каруселей: промпт человека уходит почти как есть
СММщик пишет промпт сам. Пресеты и бренд-кит подмешиваются по галочке, а не насильно. Перед отправкой показываем итоговый промпт и цену. Видео и ИИ-аватаров нет вообще.
✓ Промпт не оборачивается. Пресет и бренд-кит подмешиваются только по галочке. Перед запуском показывается итоговый текст целиком и цена, кнопка называет сумму. Модель, пропорции и разрешение выбираются. Карусель пока это несколько отдельных картинок.
feature
Медиатека проекта с поиском и повторным использованием
Иначе за одну и ту же картинку платим дважды.
✓ Все готовые генерации проекта с поиском по промпту и тексту, фильтром по типу и суммой потраченного. Картинки скачиваются к нам сразу: ссылки провайдера живут недолго.
feature
↑ Учёт стоимости генерации: лимиты на проект и человека, цена до запуска
Месячные потолки заданы владельцем. Гейт на трату должен жить в интерфейсе, а не в голове.
✓ Месячный потолок на проект и необязательный лимит на человека, ставит владелец. Превышение это отказ, а не предупреждение. Без заданного потолка генерация заблокирована вообще. Расход пишется по факту: по разнице балансов, если задана стоимость кредита, иначе оценка по прайсу с пометкой. Провалившаяся генерация бюджет не ест.
feature
↑ Пресеты промптов: общие и личные, с быстрой подстановкой
То, ради чего вся помощь: человек не пишет с нуля каждый раз, а берёт заготовку и правит.
✓ Сохранение текущего промпта в пресет, личный или общий на проект. Подстановка в поле одним кликом. Свой пресет удаляет автор, общий — владелец.
feature
↑ Тексты: посты, описания к роликам, сценарии
Отдельно от картинок. Видео не генерим, но сценарий и описание к своему ролику человек пишет с помощью.
✓ Отдельный режим на том же экране, через OpenRouter, прямые ключи провайдеров не используются. Учтено, что с cfru OpenRouter напрямую не открывается: запрос идёт через прокси.
feature
В РАБОТЕS11 · СММ: согласование8/10

Цель: Идея проходит согласование внутри дашборда, без переписки в мессенджере.

↑ Канбан согласования: настраиваемые колонки и точки согласования
Колонки настраиваются по проекту, у колонки флаг «требует согласования». Материал, не требующий согласования, двигается мимо этих точек.
✓ Колонки хранятся по проекту, у колонки флаг «требует согласования» и флаг финальной. Пока проект не настроен, работает набор по умолчанию: идея, черновик, на согласовании, согласовано, к публикации. Материал двигается перетаскиванием. Колонку, в которой лежат материалы, убрать нельзя: API откажет, чтобы карточки не повисли в никуда.
feature
↑ Полная карточка материала: поля слева, превью справа
Модалка поверх доски и плана. Слева тема, описание, текст со счётчиком символов по самой строгой площадке, рубрика, формат, дата и время, каналы, исполнитель, стадия, ссылка на вышедший пост. Справа телефон: карусель со стрелками, видео с воспроизведением и перемоткой, текст под медиа. Файлы пачкой, порядок, обложка.
✓ Сделано и проверено на сервере: заведение, правка полей, заливка трёх файлов, отдача с Range 206, перестановка порядка, обложка на карточке доски, удаление. Видео отдаётся кусками, иначе перемотка в плеере не работает. Порядок файлов меняется стрелками: drag-and-drop конфликтует с перетаскиванием карточек по колонкам и не работает на телефоне.
feature
🔴 Контроль выхода публикаций: вышло или нет в срок
Контент-план на месяц. Дашборд сверяет, вышел ли пост в назначенную дату: по собранной статистике площадки ищем публикацию рядом с плановой датой. Не вышло — уведомление владельцу.
✓ checkPublications сверяет материалы со стадией «согласовано» и «запланировано», у которых срок прошёл больше шести часов назад, с собранной статистикой площадок: окно ±18 часов. Нашли — стадия «опубликовано» и сшивка поста с материалом, не нашли — в список пропущенных. На первом прогоне подтянуло 19 материалов, которые вышли, но висели «запланированы».
feature
↑ Уведомление о пропущенной публикации
Если в плановую дату публикации нет, приходит уведомление в дашборд: какой материал, какой канал, на сколько просрочен.
✓ Одно уведомление на материал, а не на каждый прогон. Летит владельцам и ответственному за материал, со ссылкой на карточку, каналами и числом просроченных часов. Проверка идёт следом за ночным сбором соцсетей.
feature
↑ Уведомления внутри дашборда: пришло на согласование, есть правки
Бот не нужен: человек и так работает в дашборде. Счётчик «ждут вас» в меню, список уведомлений, отметка о прочтении. Заодно отпадает прокси: cfru в телеграм напрямую не ходит, а теперь и не надо.
✓ Счётчик непрочитанных в меню, отдельная страница со списком, отметка о прочтении поштучно и разом. Уведомления шлются согласующим при отправке и автору при согласовании и правках. Бот не нужен, вместе с ним отпал и прокси.
feature
↑ Версии и правки: видно, что изменилось между версиями
Иначе согласование превращается в переписку.
✓ Перед каждой правкой сохраняется снимок того, что было, с автором и временем. В карточке разворачивается история. Построчной подсветки отличий нет, записано в SCOPE-CUTS.
feature
↑ Кнопка генерации прямо из карточки материала
Генерация доступна и из отдельного раздела, и из карточки на доске. Кнопка публикации появится вместе со спринтом публикации.
✓ Из карточки на доске переход в генерацию по этому же проекту.
feature
Проверки перед публикацией: длина, размеры, запрещённые формулировки
⛔ Уезжает в спринт публикации: проверять длину под площадку осмысленно вместе с самой отправкой.
feature
↑ UTM на ссылки автоматом
Иначе трафик из соцсетей падает в «не атрибутировано» и сквозная картинка теряет смысл.
⛔ Уезжает в спринт публикации по той же причине: метки нужны в момент сборки отправки.
feature
Согласование с телефона
Владелец будет чекать в дороге.
✓ Доска и карточка работают на узком экране, колонки ужимаются, карточка разворачивается во всю ширину.
feature
В РАБОТЕS12 · Директ: план, факт, отклонения, ИИ-разбор11/12

Цель: Видно, где реклама отходит от нормы, и почему.

↑ Планы по проектам: стоимость лида, лиды, квал-лиды
Ввод руками помесячно плюс загрузка excel-файла.
✓ План на месяц по лидам, цене лида, расходу и выручке, вводится прямо в таблице. Ставит владелец: план, который правит исполнитель, это не план.
feature
↑ Раздел «Реклама»: кампании, группы, креативы, фильтры
Вкладки Обзор / Директ / План / Алерты. Кампании за период с расходом, показами, кликами, CTR, ценой клика, CPM, конверсиями, ценой цели и отказами; поиск, фильтры по проекту и типу, сортировка по любому столбцу, итоги. Провал в кампанию: группы, объявления, тексты.
✓ Залито и проверено на живых данных: 2 118 213 ₽ за год, 86 кампаний, 54 группы, 276 объявлений. Коннектор расширен типом кампании, конверсиями, отказами и глубиной; нули из метрик Метрики пишутся как «не знаем». Найден и починен баг: id объявлений Мастера кампаний длиннее 2^53, Number() их округлял, тексты не приезжали вовсе без ошибки в логе.
feature
Свои пороги алертов по проектам
Общий порог годится не всем: у одного проекта лид по 300 ₽, у другого по 5 000. Выбор проекта, правила и своего числа, которое перебивает общий порог.
✓ Модель порогов уже поддерживала разрез по проекту, не хватало интерфейса и удаления. Добавлены список своих порогов, форма добавления и кнопка «Убрать». Настраивает только владелец.
feature
↑ Директ: состояния кампаний и фильтр по ним
Половина кабинета стоит на паузе, а таблица показывала только тех, кто тратил. Добавлен справочник кампаний с состоянием из кабинета и переключатель «работали за период / работают сейчас / не работают / все кампании».
✓ Собрано 42 кампании: 3 работают, 7 выключены, 32 в архиве. Грабли: Мастер кампаний метод campaigns.get не возвращает вовсе — по id, у которого в отчёте 48 945 рублей расхода за месяц, приходит пустой список, явное перечисление всех типов не помогает. Для таких кампаний состояние выводится из расхода («тратит сейчас», «не тратит 3 дн.») и подписано как допущение, чтобы не путать с настоящим состоянием из кабинета.
feature
План рекламы: прогноз на конец месяца
К плану и факту добавлены выполнение в процентах, прогнозируемое число на конец месяца и прогноз к плану в процентах.
✓ Копящиеся показатели (расход, лиды, выручка) экстраполируются по пройденной доле месяца, отношения вроде цены лида — нет: она к концу месяца не вырастет вчетверо оттого, что прошла неделя. Цвет прогноза считается по направлению показателя: для цены лида уложиться значит быть ниже плана.
feature
↑ Провал в кампанию: фразы, поисковые запросы, разметка ссылок
Кабинет директолога: из кампании видно, на что ушли деньги — фразы и автотаргетинг, реальные поисковые запросы, куда ведут объявления и с какой разметкой.
✓ Собрано по шести кампаниям: 92 фразы и 11 426 поисковых запросов с кликом или расходом. Топ-запрос «генератор картинок» — 120 кликов и 1126 рублей. Показов без кликов не храним, их десятки тысяч и в таблице от них шум. Сбор кнопкой, не ночью: на каждую кампанию два отчёта. Ссылки объявлений размечены не utm, а cm_id Яндекса — подписано отдельно, чтобы не выглядело как «меток нет».
feature
🔴 Разбор рекламы: две недели, четыре месяца, разрезы кабинета
Экран /ads/analysis: почему стало хуже. Сравнение двух недель, четыре месяца помесячно, дни, воронка денег, разрезы Директа и находки, считаемые кодом.
✓ Экран /ads/analysis: три окна (3 недели, 30 дней, 4 месяца) со сравнением равных отрезков и пометкой про дни простоя; заявки, визиты и цена заявки в каждом разрезе (данные Метрики склеены с деньгами Директа по ключу); история изменений — восемь недель в цифрах плюс лента событий кабинета, восстановленная по дневному расходу. PDF-отчёт на 8 страниц собран и лежит у владельца.
feature
↑ Сквозная связка Директ → Метрика → Битрикс по метке
✓ Сделки CRM приезжают в дашборд: 1021 запись со стадиями по справочнику каждой воронки, менеджером, признаками выиграна и провалена, ссылкой на лид и метками. Блок «Путь заявки» на экране лидов сшивает источник, заявку, сделку и деньги.
feature
↑ Факт против плана по каждому показателю
✓ Таблица план-факт по каждому проекту с процентом выполнения и темпом. Для метрик «меньше лучше» выполнение считается наоборот: уложиться в план по цене лида значит быть НИЖЕ него. Темп учитывает, сколько месяца прошло.
feature
↑ Подсветка отклонений от нормы
✓ Колонка «Отклонение» в плане рекламы: насколько прогноз хуже плана, перевыполнение отклонением не считается. Порог берётся из настроек оповещений проекта, за порогом красным. То же отклонение приходит оповещением, правило «План месяца под угрозой».
feature
Еженедельный ИИ-разбор с предложениями
Все цифры считает код, ИИ только объясняет и предлагает. Иначе начнёт выдумывать числа.
✓ Блок «ИИ аналитика» вверху рекламы. Владелец решил: тексты пишутся вручную, платных вызовов из дашборда нет. Сводка за неделю отдаётся готовой, текст кладётся обратно, разбор за неделю один. Разборы за 10-16 августа написаны по всем трём проектам.
feature
↓ История разборов и сверка прогноза с фактом
✓ История разборов открывается из блока, вместе с текстом хранится сводка на момент написания. Сверка прогноза с фактом появится, когда накопится четыре недели.
feature
В РАБОТЕS13 · Директ: управление рекламой1/5

Цель: Заложено сейчас, реализуем позже: не только смотреть, но и вести.

↓ Создание кампаний: поиск и РСЯ
Заложить архитектурно, реализация позже.
feature
↑ Управление кампаниями из дашборда: запуск и остановка
Кнопка «Остановить» и «Запустить» прямо в таблице кампаний, формулировки состояний как в кабинете Директа.
✓ Закрыто разделом рекламы, доступом к проекту, подтверждением в интерфейсе и записью в журнал: вопрос «кто остановил кампанию» однажды точно зададут. Проверено на уже остановленной кампании — Директ ответил своей ошибкой про черновик, путь рабочий, живого при проверке не трогали. Мастером кампаний управлять нельзя: Директ не отдаёт их в справочнике, у таких строк вместо кнопки прочерк с пояснением.
feature
↓ Креативы по референсу и брендбуку
Заложить архитектурно, реализация позже.
feature
↓ Ведение рекламы ИИ: ставки, минус-слова, отключение слабого
Заложить архитектурно, реализация позже.
feature
↓ Гейт на трату: подтверждение перед запуском и изменением бюджета
Ни одна операция с рекламным бюджетом не уходит без явного подтверждения.
feature
В РАБОТЕS14 · СММ: публикация22/28

Цель: Отправка в соцсети. Пишется кодом, включается и проверяется отдельным решением владельца.

↑ С42 · Публикация во ВКонтакте из карточки материала
Готово на стенде, ждёт «да» владельца на прод. Ветка vk-publish в C: mp l-vkpub (база deploy-c34-37 a20c0dc). Экзамен 22/22, ОТК 2 круга (c42-r1 7/7, c42-r2 4/4), next build чистый. После выката: Р1 первый живой пост по «ок» владельца, Р2 вид.
feature
В1. Посмотреть предпросмотр и отправить может только человек с галочкой «Публикует в соцсети»; без галочки оба запроса отвечают 403, даже у владельца дашборда.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В1.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В2. Галочку ставит и снимает только владелец на экране «Люди», смена пишется в журнал действий; рядовой сотрудник получает 403. После выката галочка стоит только у Александра Шамрая.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В2.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В3. Роль «только просмотр» отправить не может даже с галочкой, ВК не вызывается.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В3.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В4. Человек без доступа к проекту материала не видит предпросмотр и не может отправить (403).
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В4.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В5. Несогласованный материал не уходит: предпросмотр называет причину, отправка отвечает 409, ВК не вызывается.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В5.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В6. Отправить можно только в аккаунт ВК своего проекта, отмеченный в каналах материала и заведённый с публикацией «из ВКонтакте»; иначе 400 и ВК не вызывается.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В6.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В7. Ключ дашборда от другого сообщества, чем у аккаунта: пост не уходит, причина словами.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В7.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В8. Предпросмотр показывает ровно то, что уйдёт: текст символ в символ, фото в порядке карточки (обложка первой), сообщество и режим; сам предпросмотр ничего во ВК не загружает и не публикует.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В8.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В9. Текст длиннее 16 000 знаков не уходит, предпросмотр говорит, на сколько превышено; ровно 16 000 уходит.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В9.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В10. Фото больше 10 — не уходит с причиной; ровно 10 уходят все и по порядку; без фото уходит один текст; ни текста, ни фото — не уходит.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В10.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В11. В материале есть видео: публикация закрыта с подписью, что видео во ВК выкладывается руками.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В11.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В12. Документы (PDF) отправку не закрывают, но предпросмотр перечисляет их как «не уйдёт».
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В12.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В13. «Опубликовать сейчас»: пост уходит от имени сообщества с текстом и всеми фото; в карточке появляется ссылка `https://vk.com/wall-<сообщество>_<пост>`, стадия «Опубликовано», если она есть у проекта.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В13.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В14. «К дате плана»: ВК получает время публикации, равное дате плана; стадия «Запланирована публикация». Дата в прошлом или ближе 5 минут — к дате нельзя, только сейчас.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В14.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В15. Материал поменяли после предпросмотра (текст, порядок фото, дату) — отправка отклоняется 409 с просьбой посмотреть предпросмотр заново, ВК не вызывается.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В15.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В16. Тот же материал в тот же аккаунт второй раз не уходит (409), и при двух одновременных нажатиях во ВК уходит ровно один пост.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В16.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В17. ВК отказал: в журнале «не вышло» с причиной словами, без кодов и слова «токен»; стадия и ссылка в карточке не меняются; повторная отправка разрешена.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В17.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В18. ВК не ответил вовремя: в журнале «неизвестно, проверьте стену», повтор закрыт, пока человек с галочкой не нажмёт «Пост не вышел, разрешить повтор».
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В18.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В19. Картинки не в JPEG и не в PNG (например, WebP) перед загрузкой переводятся в JPEG; PNG и JPEG уходят как есть.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В19.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В20. В карточке виден журнал отправок материала: кто, когда, куда, режим, итог, ссылка или причина.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В20.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В21. Ключ ВК не появляется ни в ответах дашборда, ни в журнале, ни в логе приложения.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В21.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
В22. Сохранение карточки и запрос согласования работают как раньше.
Экзамен tests/spec/vk-publish.mjs, запуск /opt/fitlead-night/bin/vkp-exam.sh
✓ 26.10.2026: экзамен tests/spec/vk-publish.mjs — «✓ В22.», итог 22 из 22 на стенде fl-wt-vkp (подменный ВК) после двух кругов ОТК; сверх него tests/otk/c42-r1.mjs 7/7, c42-r2.mjs 4/4; next build чистый. Ветка vk-publish (C: mp l-vkpub), на прод ещё не выкачено.
acceptance
Р1. Первый живой пост по «ок» владельца на конкретный материал: пост с фото вышел во ВК, ссылка из карточки его открывает. Это заодно проверка, что стена принимает фото из вложений сообщений.
Руками после выката, по «ок» владельца.
acceptance
Р2. Блок публикации в карточке: кнопку видит только человек с галочкой; на телефоне и на компьютере ничего не наезжает, предпросмотр читается.
Руками после выката, по «ок» владельца.
acceptance
↑ Публикация: агрегатор для инсты, фб, тредс; ВК прямым API
Пишется кодом без включения. Ни одной живой отправки до отдельного решения владельца.
feature
Журнал публикаций: ошибки и повтор
Пишется кодом без включения. Ни одной живой отправки до отдельного решения владельца.
feature
Предпросмотр отправки без отправки
Собрать полезную нагрузку и показать её человеку, ничего не отправляя. Так проверяется правильность сборки без единой живой публикации.
feature
готовS15 · Доступы: пароли, логины, права3/3

Цель: Свести доступы всех сервисов в одно место с правами по людям

🔴 Хранилище доступов: сервис, логин, пароль, откуда и у кого
Сейчас пароли разбросаны по файлам и людям. Нужен один раздел: сервис, ссылка на вход, логин, пароль, кому выдан, кто владелец, когда менялся. Пароли шифруются ключом из окружения, в базе не лежат открытым текстом.
✓ Раздел Доступы: сервис, ссылка, логин, пароль, второй фактор, проект, заметка. Пароль шифруется AES-256-GCM ключом из окружения, в базе только шифротекст. В списке пароля нет, приходит отдельным запросом и прячется через 30 секунд.
feature
↑ Права на доступы: кто какие видит
Доступ к записи выдаётся поимённо: рекламщик видит рекламные кабинеты, сммщик соцсети, владелец всё. Открытие пароля пишется в журнал: кто и когда смотрел.
✓ Руководитель видит все записи и заводит новые; сотрудник видит только то, где он владелец или в списке кому выдано. Правит запись владелец записи или руководитель.
feature
Журнал выдачи и отзыва доступов
Человек ушёл — видно, какие пароли надо сменить. Список «что сменить при увольнении» собирается сам по тому, кому что было выдано.
✓ Каждый показ пароля пишется в журнал, в карточке видно кто и когда открывал последним. По уходящему человеку собирается список что менять: выдано, владел, открывал.
feature
В РАБОТЕS16 · Календарь отдела и встречи2/3

Цель: Общий календарь задач, дедлайнов и встреч с приглашениями

🔴 Общий календарь: задачи, дедлайны, встречи в одном месте
Месяц, неделя, день. Видно, у кого какие задачи и дедлайны, с фильтром по человеку и проекту. Календарь задач уже есть, нужен слой встреч и общий вид по отделу.
✓ В календаре рядом со сроками задач и слотами контент-плана встали встречи из Битрикса, обход каждые 15 минут. Закрытые встречи коллег показаны как занятость без названия, по умолчанию скрыты.
feature
↑ Встречи с приглашениями: принять, отклонить, предложить другое время
Ставим встречу человеку, ему приходит уведомление. Он принимает — встреча встаёт в его календарь с участниками. Отклоняет или предлагает другое время — организатору приходит ответ. Нужны статусы участника и лента ответов.
✓ Блок приглашений над сеткой: Принять и Отклонить уходят в Битрикс. Предложить другое время в Битриксе не предусмотрено, поэтому предложение живёт в дашборде и приходит организатору уведомлением; если его в дашборде нет, экран честно об этом пишет.
feature
Занятость: не ставить встречу на занятое время
При выборе времени показывать, кто в это время занят другой встречей или у кого дедлайн.
⛔ Занятость коллег в календаре уже видна. Проверять её при постановке встречи нечем: встречи из дашборда не создаются, кнопку не делали — приглашение уходит живым людям, нужно решение владельца.
feature
В РАБОТЕS17 · Направления отдела: СЕО и квалификация лидов3/4

Цель: Два новых направления в структуре дашборда

🔴 Направление СЕО: раздел и метрики по трём проектам
В отделе появляется СЕО по трём проектам. Нужен раздел с позициями, трафиком из поиска, страницами и задачами. Источники: Метрика по поисковому трафику, дальше вебмастер.
⛔ Раздел SEO с тремя проектами уже есть, отдел SEO заведён. Метрик позиций и показов нет: нужен токен Вебмастера, право hostinfo не входит ни в токен Метрики, ни в токен Директа. Коннектор написан и ждёт WEBMASTER_TOKEN.
feature
🔴 Направление «Квалификация и холодные лиды»
Новый человек квалифицирует лидов и работает в холодную по одному проекту. Нужен экран: очередь лидов, статус квалификации, причина отказа, следующий шаг, план по касаниям.
✓ Экран /leads на лидах CRM: пришло, качественных, мусор, ждут разбора; доля качества от решённых, а не от всех. Разрезы по источникам, направлениям, ответственным, кампаниям. Отдельно реклама: заявок 69 за 30 дней, качественных 5, качественная заявка 41 649 руб. Плюс зависшие дольше суток и холодная база.
feature
↑ Права и роли под новую структуру отдела
Четыре направления: реклама (2 проекта), СЕО (3), квалификация (1), соцсети (3). Проверить, что двумерные права это покрывают, добавить недостающие разделы.
✓ Добавлен раздел прав «Лиды и квалификация» и отделы SEO и Квалификация лидов со своими наборами разделов по умолчанию. Права остались двумерными: разделы плюс список проектов.
feature
Поток статей ИСКРЫ через Content Hub: первая статья прошла путь завод → хаб → stage.uiskra.ru
Хаб Дмитрия (stage.content.fit-lead.ru), проект iskra. Ключи ingest/read в cfru:/opt/content-hub/.env. Статья №4 плана «Архетипы по Юнгу» (slug arhetipy-po-yungu) загружена PUT /ingest как pending, после «ок» владельца опубликована autoapprove:true; сайт подхватил через 94 с. JSON-LD BlogPosting+FAQPage+BreadcrumbList как у эталона. Обложка через kiegen (~3 ₽), лежит на https://marketing.fit-lead.ru/blog-covers/iskra/arhetipy-po-yungu.jpg (nginx alias на /opt/fitlead-dash/static-pages/blog-covers/), эта ссылка прописана в cover.url хаба.
✓ Проверено 18.09: stage.uiskra.ru/blog/arhetipy-po-yungu отдаёт 200, в списке блога есть, фид и /feed/changes (change_seq 33) сходятся.
feature
В РАБОТЕS18 · Вход через Fit&Lead: SSO на authentik10/28

Цель: Заменить локальный логин-пароль на корпоративный вход authentik (OIDC, Authorization Code + PKCE S256). Права приходят из SSO: роль, отдел, разделы, все проекты, деньги, чужая работа, управление людьми. Локальная база хранит связь issuer/sub и назначения проектов.

↑ OIDC-модуль: discovery, PKCE S256, проверка ID token по JWKS
src/lib/oidc.ts: discovery по OIDC_ISSUER с проверкой точного совпадения issuer, кэш JWKS с обновлением при смене ключа, генерация state/nonce/code_verifier, обмен кода через client_secret_basic, проверка RS256/iss/aud/exp/nonce через jose, UserInfo с проверкой sub.
✓ Секрет принят порталом: обмен фальшивого кода с секретом даёт invalid_grant (а без секрета — invalid_client). Начало входа, PKCE, одноразовые state и защита от повтора проверены на бою. Проверка подписи живого ID token — при первом входе человека.
feature
Discovery берётся с сервера и issuer совпадает точно, иначе вход не начинается
✓ Секрет в .env, приложение включило вход: /auth/login отвечает 307 на authorize портала с client_id, redirect_uri, scope, state, nonce и code_challenge S256. Discovery читается с сервера, issuer сверен точно. Портал принял начало входа: 302 на свою форму аутентификации.
⛔ Discovery портала проверен живым запросом (issuer, JWKS, S256, claims roles и marketing_access на месте), но сверка issuer в рабочем входе требует client secret.
acceptance
Неподписанный или подделанный ID token отклоняется
⛔ Проверка подписи по JWKS написана (jose, RS256, iss, aud, exp, nonce, azp). Прогон на живом токене — после получения client secret.
acceptance
Повторно использованный code отклоняется
✓ Запись входа удаляется до обмена кода: второй callback с тем же state получает sso=expired. Проверено живьём двумя запросами подряд.
⛔ Запись входа удаляется до обмена кода, повторный state записи не найдёт. Живой прогон — после client secret.
acceptance
Неверные state и nonce отклоняются
✓ Живой прогон на бою: callback с чужим state → /login?sso=expired; без параметров → sso=bad; настоящий state с фальшивым кодом → sso=failed, повторный тот же state → sso=expired (запись сгорела). Nonce проверяется внутри проверки ID token, отдельно от state.
⛔ Сверка state и nonce написана. Живой прогон — после client secret.
acceptance
↑ Маршруты входа: /auth/login, /auth/callback, выход
GET /auth/login создаёт запись входа и уводит в authentik. GET /auth/callback обрабатывает error, сверяет state, удаляет запись, обменивает код, заводит сессию. POST /auth/logout удаляет сессию и пытается отозвать refresh token. Возврат только на локальные пути.
✓ Кнопка на /login, /auth/login уводит в портал, /auth/callback разбирает error/state/повтор и возвращает на домен с понятной причиной. Открытый редирект через next закрыт.
feature
Кнопка «Войти через Fit&Lead» на /login уводит в authentik и возвращает в дашборд
✓ Кнопка «Войти через Fit&Lead» появилась на /login, уводит в портал (302 на форму аутентификации authentik). Возврат в дашборд собирается от APP_BASE_URL — без этого редирект шёл на внутренний 0.0.0.0:3190, поймано и исправлено до первого живого входа.
⛔ Кнопка появляется, когда задан OIDC_CLIENT_SECRET. Сейчас секрета нет: /auth/login отвечает 307 на /login?sso=off, кнопка скрыта.
acceptance
Неизвестный callback отклоняется authentik
⛔ Отклонение неизвестного callback — на стороне портала (strict). Проверяется вместе с живым входом.
acceptance
Выход удаляет серверную сессию, повторное использование её id не работает
⛔ Выход удаляет серверную сессию и куки, затем отзывает refresh token. Живой прогон — после client secret.
acceptance
↑ Серверные сессии: 8 часов, перепроверка UserInfo раз в 240 секунд
Таблица сессий: непрозрачный id в cookie (Secure, HttpOnly, SameSite=Lax, без Domain), refresh token шифром, снимок roles и marketing_access. Перепроверка не реже 240 секунд, перед выгрузкой финансов и управлением людьми — сразу. Продление токена не сдвигает абсолютные 8 часов.
✓ Таблица sessions с шифрованными токенами, абсолютный срок 8 часов, сверка раз в 240 секунд, отметка живой вкладки раз в минуту. Проверка на живой сессии ждёт секрет.
feature
Через 8 часов от входа сессия перестаёт работать независимо от активности
⛔ Абсолютный срок 8 часов пишется при создании сессии и не двигается обновлением токенов. Проверка на живой сессии — после client secret.
acceptance
Отзыв прав в authentik срабатывает не позже первого запроса после 240 секунд
⛔ Сверка с UserInfo раз в 240 секунд плюс отметка живой вкладки раз в минуту. Проверка отзыва — после client secret.
acceptance
Недоступность SSO даёт 503, а не работу на старых правах
⛔ Недоступность портала даёт 503 с повтором. Проверяется на живой сессии.
acceptance
Access и refresh token не попадают в браузер
⛔ В браузер уходит только непрозрачный id сессии; токены лежат в БД зашифрованными ключом VAULT_KEY. Проверка содержимого кук — после живого входа.
acceptance
↑ Права из claims: роли, отдел, разделы, флаги
Сопоставление marketing_access на модель дашборда: leadership→lead, lead_qualification→leads, content→smm, tasks_kpi→tasks. Роли: marketing_director пишет, company_director только читает, marketing_employee своя работа. Пустые роли, нулевой или множественный отдел — отказ. Локальные флаги с claims не объединяются.
✓ Разбор прав закрыт 23 проверками; роль «только просмотр» доказана на живом сервере (403 на запись, чтение открыто). Живой вход Шамрая и Тарасовой ждёт секрет.
feature
Нина Тарасова читает всё и получает 403 на любое изменение
✓ Доказано на живом сервере: сотруднику временно выставлен canWrite=false, GET /content вернул 200, POST /api/tasks и POST /api/content вернули 403 «Ваша роль — только просмотр. Изменения выполняет директор маркетинга.». Флаг возвращён. Плюс разбор claims: company_director → canWrite=false, can_manage_people игнорируется.
acceptance
Шамраю закрыт раздел «Лиды», остальные пять открыты
⛔ Разбор прав даёт пять разделов без leads, canSeeSection у корпоративной учётки не обходится ролью владельца. Живой вход Шамрая — после client secret.
acceptance
Сотрудник без базовой группы не входит, группы отдела запрет не обходят
✓ node scripts/sso-claims-check.mjs, 23 проверки зелёные. Случай «роль снята: отказ, отдел не спасает» и «чужие группы вместо ролей: отказ» — parseAccess возвращает null, вход отклоняется до создания сессии.
acceptance
Два отдела сразу или ни одного — вход отклоняется
✓ node scripts/sso-claims-check.mjs, 23 проверки зелёные. Случай «два отдела сразу: портал шлёт department null — отказ» и «неизвестный отдел: отказ».
acceptance
can_view_finance=false скрывает деньги на сервере, в агрегатах и выгрузках
⛔ can_view_finance=false кладётся в canSeeMoney. Сквозная проверка скрытия денег в агрегатах и выгрузках — после живого входа сотрудника.
acceptance
↑ Привязка учёток по issuer+sub, отказ от паролей
Уникальная пара issuer+sub у пользователя. Автосклейка по email отключена: незнакомый вход попадает в список ожидающих привязки, владелец привязывает вручную. Кнопки смены и сброса пароля для SSO-учёток заменяются отсылкой к администратору SSO.
✓ Связь по issuer+sub, очередь sso_pending, экран привязки и отвязки, запрет смены и сброса паролей для корпоративных учёток. Первая настоящая привязка — после живого входа.
feature
Вход Шамрая привязывается к локальному ashamray, задачи и история сохраняются
⛔ Экран привязки готов и отдаёт список несвязанных сотрудников. Сама привязка Шамрая — после его первого входа через портал.
acceptance
Совпадение email само по себе не связывает учётки
✓ Связь только по паре issuer+sub с уникальным ограничением в БД. Пути связывания по email в коде нет: незнакомый вход пишется в sso_pending и ждёт ручной привязки владельцем на экране «Пользователи»; при привязке проверяется, что запись ещё ни к кому не привязана.
acceptance
Старые cookie после включения SSO не работают
⛔ При привязке все прежние сессии человека удаляются. Проверка — вместе с первым живым входом.
acceptance
↑ Выкатка: SSO рядом с паролями, потом отключение паролей
Бэкап таблиц пользователей и назначений до включения. Сначала SSO работает рядом с локальным входом, после проверки владельцем локальный вход выключается, прежние сессии аннулируются. Локальные записи и связи с задачами не удаляются.
feature
До отключения паролей оба способа входа работают
⛔ Локальный вход работает и проверен. Второй способ включится с client secret.
acceptance
После отключения локальный вход недоступен и не обходит SSO-ограничения
⛔ LOCAL_LOGIN=off написан и описан в DEPLOY.md. Выключение — после успешной проверки живого входа.
acceptance
Секретов нет в бандле браузера, в Git и в журналах
⛔ Секрет читается только на сервере, без префикса NEXT_PUBLIC_, в ответах и журналах не появляется. Проверка бандла — после включения.
acceptance
В РАБОТЕS19 · С19 · Авто-КП: генератор коммерческих предложений28/62

Цель: Генератор КП рекламодателям: справочники из документооборота, шаблон по гайдбуку, досье бренда (сайт, Wildberries, Вордстат, соцсети), сборка КП ссылкой и PDF, запуск из Битрикса. Выкачен на /leads/kp и /kp/<slug>.

↑ Хаб «Создать контент»: плитки с ценой
Экран /content/create: Пост, Карусель, Видео (загрузить своё). На плитке цена до нажатия. Внизу ссылка на полную студию генерации. Черновик материала создаётся при первом действии, дальше всё копится в нём.
✓ дубль от повторного сидера, не задача
feature
На хабе три плитки, у каждой видна цена до нажатия
✓ дубль от повторного сидера, не задача
acceptance
С хаба за один заход получается материал, который лежит на доске и в медиатеке
✓ дубль от повторного сидера, не задача
acceptance
↑ Пост: текст, картинка, сети, предпросмотр
Текст руками (кнопка «написать по теме» — отдельная необязательная помощь, твой текст не переписывает). Картинка: описание сцены как есть плюс разметка кодом, или своё фото. Сети, ссылка в конце, дата, предпросмотр как в ленте.
✓ дубль от повторного сидера, не задача
feature
Пост с текстом и картинкой выходит без ручного промпта и лежит на доске
✓ дубль от повторного сидера, не задача
acceptance
Своё фото становится картинкой поста вместо генерации
✓ дубль от повторного сидера, не задача
acceptance
Предпросмотр показывает пост так, как его увидят в ленте
✓ дубль от повторного сидера, не задача
acceptance
↑ Карусель: слайды, стиль серии, цепочка от обложки, перерисовка
5–7 слайдов: заголовок, подзаголовок, сцена, своё фото на слайд. Стиль серии и 2–3 референса. Сборщик кодом гарантирует точный русский текст и контраст. Рендер цепочкой: обложка первая, остальные по её образцу. Один слайд перерисовывается отдельно, без всей серии.
✓ дубль от повторного сидера, не задача
feature
Карусель на 5–7 слайдов выходит в одном стиле, русский текст на слайдах читается
✓ дубль от повторного сидера, не задача
acceptance
Один слайд перерисовывается отдельно, остальные не трогаются и деньги за них не списываются
✓ дубль от повторного сидера, не задача
acceptance
Своё фото ложится в основу слайда
✓ дубль от повторного сидера, не задача
acceptance
↑ Видео файлом: подпись, сети, дата
Загрузить свой ролик до 200 МБ, подпись, площадки, дата → карточка на доске с превью.
✓ дубль от повторного сидера, не задача
feature
Видео загружается файлом и попадает в карточку с подписью и площадками
✓ дубль от повторного сидера, не задача
acceptance
↑ Деньги: цена до кнопки, лимит останавливает
Цена считается по прайсу до запуска, кнопка называет сумму. Лимит проекта и человека останавливает генерацию, а не предупреждает. Расход пишется по факту.
✓ дубль от повторного сидера, не задача
feature
Цена видна до нажатия, лимит проекта останавливает генерацию, а не предупреждает
✓ дубль от повторного сидера, не задача
acceptance
Ничего не публикуется само: всё созданное лежит на доске в черновиках
✓ дубль от повторного сидера, не задача
acceptance
Экран «Кто мы» вторым слайдом + 3 варианта оформления (?about=1..4)
✓ Выкачено 16.09: вариант 1 факты на чёрном (по умолчанию), 2 манифест на Lead Teal, 3 ответы на вопросы первой встречи, 4 три способа с 3D. Владелец 21.09: в копии оставить обычный раздел о нас (вариант 1). Источники фактов в комментарии над ABOUT в render.ts; цифра базы 7 650 с сайта, решение о единой цифре за владельцем.
feature
Копия оформления v2 по замечаниям дизайнеров (Стас, Евгений, Нина 21.09)
Исходники правок: кружки Стаса и файл Евгения на cfru /opt/aitodo-tg/files/nina-kp-2109/ (расшифровки *.txt). Не решено: официальная пара цветов (Figma Core Color #00484F/#FBEA1B против сайта и кита #005856/#FDF000), 3D-объекты из PDF, жёлтый маркер внутри.
✓ design=v2 в preview, оригинал не менялся. Единая шкала цифр 56/40/22, один отступ и радиус карточек, «Что мы увидели» по Стасу (широкий блок бренда, линейки в ряд, три карточки площадок с официальными знаками), шесть шагов процесса, тарифы без сдвига ленты, финал двумя квадратами, пара логотипов Fit&Lead | клиент, подпись плашкой, курсив вместо маркера на титуле, цвета сайта #005856/#FDF000. Фото авторов и скрины кейсов в контуре мастера Figma через pockets.ts движка стиля. Ссылка: /kp/preview?brand=Mixit&theme=kosmetika-i-sredstva-uhoda&site=mixit.ru&design=v2. Ждёт решения владельца: делать ли v2 основным.
feature
Досье: логотип клиента с сайта автоматически (шапка: alt=бренд, слово logo, первый SVG, JSON-LD)
✓ dossier.ts logoFrom(): у mixit.ru находит data-URI SVG из шапки; в КП v2 стоит рядом с нашим логотипом и в блоке бренда.
feature
Титул по обложкам мастера: фото человека во весь экран, рамка с карманами, пара логотипов, короткий заголовок
Гипотеза, почему Нина хочет переделать первый экран (21.09): обложка не в языке бренда (нет человека, 3D из непринятого PDF, перегруз, машинный заголовок). Собрать как ещё один вариант в копии, показать Нине картинкой; цифры и абзац уезжают на второй экран.
feature
Apify: перед платным анализом искать недавний прогон/датасет по тому же профилю
Двойная оплата Mixit 14.09 (~20 ₽). Apify хранит датасеты 7 дней: сначала GET по последним запускам актора с тем же input, потом новый запуск. Плюс дневной лимит трат и журнал платных вызовов.
✓ 22.09: журнал apify:run:<хеш> пишется до запроса; повтор за 7 дней берёт датасет из своего журнала или из недавних прогонов Apify по совпадению INPUT; потолок APIFY_DAILY_RUNS. Экзамен «без флага платный анализ не запускается» зелёный.
feature
Соцсети клиента сами: рендер SPA headless, страницы контактов, taplink, обратная проверка домена, уверенность в форме, VK_TOKEN
Список «до завершённого продукта» от 18.09, слой 1. Ручной ввод остаётся главнее найденного.
feature
Экзамены КП 15/15 + самопрогон по крону + закрытый репозиторий
✓ 22.09: tests/spec/kp.mjs 15/15 на сервере (досье fresh, кэш <3 с, Chromium для SPA, 10 экранов v1/v2, медиакит 7, авторы, кейсы, платное без флага, сборка→снимок→просмотры→PDF 10 стр A4 landscape→«есть новее»→410 через год). scripts/kp-selfcheck.mjs крон 04:20 UTC с тревогой через Лию. Репо github.com/Logonchek/fitlead-dash (закрытый), README, .env.example, docs/KP.md обновлены.
feature
Одна сборка → статика: снимок HTML в kp_proposals, ссылка живёт год, «есть новее»
✓ 22.09: колонка html, /kp/<slug> отдаёт снимок; 410 через 365 дней; в списке менеджера пометки «есть новее»/«срок вышел». KP_PUBLIC_ORIGIN задан на сервере.
feature
Досье: кэш на сутки, бюджеты времени, Chromium для сайтов на скриптах
✓ 22.09: 43 с → 19 с первое открытие, 0,03 с повторное; DDG параллельно; Chromium (Alpine, swiftshader) дорисовывает SPA; example.com даёт честную ошибку «даже браузеру».
feature
Wildberries закрыл поисковый API (403 с 22.09 отовсюду, даже из браузера): нужен другой источник масштаба
Пока досье честно пишет «Wildberries не прочитался», блок масштаба прячется; самопрогон будет сигналить каждое утро, пока не решим.
✓ Wildberries убран из досье, формы, письма, ИИ-фактов, рендера и самопрогона; кэш досье чистится. Вернуть: API продавца или MPStats (решение владельца).
feature
Досье и самопрогон не обращаются к Wildberries; самопрогон молчит, когда остальное в порядке
Экзамен + лог /var/log/kp-selfcheck.log
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: досье, КП и самопрогон без Wildberries; старые досье из кэша чистятся withoutMarketplace.
acceptance
VK_TOKEN: сервисный ключ приложения ВК от владельца
feature
Разметка авторов: 122 из 154 без тематик, размечаем по описаниям и подтверждаем с командой
30.09 владелец: «сделай разметку сам». Размечаю по реальному контенту профилей, команде на проверку не отдаём.
✓ Разметка 123 авторов по их открытым профилям: about, core 1-4, фраза на каждую тематику; 32 из матрицы ДО с тематиками команды, фразы переписаны. Страница команде: myvisionagency.ru/lab/kp-avtory/
feature
У каждой из 28 тематик не меньше трёх авторов, у каждого фраза «почему подходит» про его реальный контент, а не шаблон
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: минимум 7 авторов на тематику, заготовок 0; work/kp-lint.mjs: внутренней кухни во фразах 0.
acceptance
Подбор идёт из всего каталога, соседние тематики не показывают одну и ту же тройку
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: в каталоге 123 (в подборе 120), одинаковых троек 0; правило «разные тройки» в pickBloggers, проверено на 128 комбинациях подсказок.
acceptance
Тревел-вертикали без кейсов: получить кейсы у команды или скрыть вертикали
✓ NEAREST_CASES: 4 тематики без кейсов показывают ближайшие с честной подписью. Свои кейсы под них от команды: в очереди решений.
feature
Тревел-тематики показывают блок кейсов из ближайших кампаний с честной подписью, а не пустоту
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: туроператоры, отели, техника, гаджеты: 3 кейса ближайших тематик и подпись «в вашей категории пока нет, ниже ближайшие».
acceptance
Авторы по живым профилям: своё фото, текущие подписчики, описание и посты
Instagram пачкой через Apify (гейт до 100 ₽ согласован 30.09), Telegram и YouTube бесплатно. Фото хранятся у нас в public/kp/photos/<id>.webp.
✓ Бесплатный сбор открытых профилей (scripts/kp-authors-collect.mjs): Instagram 111/111 описание, Telegram 74, YouTube 32, VK 28, TikTok 43; фото 80 своих. Подписчики свежие у 89 из 123 (см. критерий).
feature
В КП ни одного чужого фото: у автора его собственное фото или инициалы в фирменном контуре
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: ни одного /kp/photos/blogger-* в 28 тематиках; 80 своих фото /kp/authors/<id>.webp (YouTube, TikTok, VK, Telegram), остальным инициалы; фото отсмотрены глазами, не-лица отбракованы (data/kp/raw/photo-reject.json).
acceptance
Подписчики автора в КП взяты при сборе профилей, дата сбора записана в каталоге
Экзамен tests/spec/kp.mjs
⛔ Свежие подписчики у 89 из 123: у 34 авторов (в основном только Instagram) Instagram без входа не отдал число, а после сотни запросов отправляет на вход. Им оставлены цифры каталога ДО без даты. Досбор завтра или платно через Apify (≈0,1 $).
acceptance
Вид по умолчанию: v2 с обложкой b, v1 остаётся флагом
Решение 30.09 в плане, согласованном владельцем.
✓ withDefaults в render.ts: v2 + обложка b по умолчанию; старые записи без снимка в v1; новые КП сохраняют оформление явно.
feature
КП без параметров оформления открывается в v2 с обложкой b; ?design=v1 возвращает прежний вид
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: body class=v2 и cover-b без параметров, ?design=v1 даёт v1; kp.mjs «Полное КП v1 и v2» зелёный.
acceptance
Прогон всех 28 тематик: КП и медиакит
Скрипт прогона, отчёт по пустым блокам, битым картинкам, повторам.
✓ kp-final.mjs прогоняет 28 тематик × КП и медиакит на стенде: чисто.
feature
Все 28 тематик собираются в КП и медиакит без ошибок, пустых блоков и битых картинок
Экзамен tests/spec/kp.mjs
✓ Стенд cfru 127.0.0.1:3191, tests/spec/kp-final.mjs 30.09: 28 тематик × КП (10 экранов) и медиакит (7): 200, без undefined/NaN, пустых экранов нет, все картинки 200.
acceptance
АвтоКП отдельным проектом для техотдела: код, сборка, документация проекта (MD+PDF), документация интеграции с Битриксом
Решение владельца 30.09: встраивание в Битрикс делает техотдел. Наше: отдельный репозиторий генератора без наших ключей и следов, сборка docker compose, документация проекта в MD и PDF, документация интеграции: какие поля Битрикса дают какие данные (сайт, соцсети, вертикаль, менеджер), ссылка fit-lead.ru/kp/<клиент> через nginx их сайта.
✓ Репозиторий E:/Проекты для Гитхаба/fitlead-avtokp (2 коммита), архив fitlead-avtokp-2026-09-30.zip. ОТК 3 круга: SSRF через Chromium и редиректы, двойная оплата, CSRF, падение прокси — исправлено и проверено экзаменами.
⛔ Ждёт решения владельца: где живёт сервис после передачи (рекомендация: переезд дашборда на сервер компании).
feature
Чистое развёртывание из репозитория: docker compose up с обязательными ключами поднимает сервис, /health отвечает, КП собирается
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: docker compose up -d --build → /api/health {"ok":true,"db":true,"chrome":true,"authors":120}; контейнер под USER node.
acceptance
В репозитории нет наших ключей, адресов и следов других проектов (поиск по списку пуст)
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ node tests/clean.mjs → ✓ (ключи, адреса серверов, следы проектов, локальные пути в PDF).
acceptance
POST /api/v1/proposals с токеном и данными клиента отдаёт ссылку вида <адрес сайта>/kp/<бренд>-<код>; без токена 401
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: tests/api.mjs 17/17: ссылка https://fit-lead.ru/kp/ekzamen-api-XXXXXX, pdfUrl, письмо; 401 без токена и с неверным.
acceptance
Без переданной тематики она угадывается по сайту и вертикали Битрикса, в ответе видно какая
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: api.mjs: категория ЛМ → themeSource=category; вертикаль+сайт → vertical+site; пусто → 422.
acceptance
Ссылка на КП открывается без входа, PDF собирается на сервере
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: kp.mjs 15/15: PDF с сервера 10 листов A4 альбомом, ссылка без входа, снимок.
acceptance
Отладочные адреса закрыты токеном, досье не ходит на внутренние адреса сети
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: api.mjs: preview/themes/dossier 401 без токена, /admin 401 Basic; SSRF: localhost/10.x/169.254/IPv6-mapped/nip.io → «внутреннюю сеть», Chromium meta refresh на 127.0.0.1 не прошёл (фильтрующий прокси).
acceptance
Без необязательных ключей (Яндекс, Apify, OpenRouter, YouTube, VK) КП собирается, лишние блоки просто скрыты
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: все экзамены на развёртывании без DIRECT_TOKEN, APIFY, OPENROUTER, YOUTUBE, VK, прокси: КП собирается.
acceptance
Экзамены КП зелёные на чистом развёртывании
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ Развёртывание с нуля на cfru (/opt/avtokp-test, только обязательные ключи, без прокси), 30.09: api 17/17, kp 15/15, kp-final 7/8 (подписчики с датой у 89/123 — данные каталога, проверка по сроку 01.10), clean ✓.
acceptance
Документация проекта и интеграции с Битриксом в MD и PDF: таблица «поле Битрикса → данные КП» по реальным кодам полей портала, настройка ссылки на fit-lead.ru
docs/ACCEPTANCE.md репозитория АвтоКП, экзамен tests/
✓ docs/PROJECT.md+pdf, docs/BITRIX-INTEGRATION.md+pdf (поля сделки по кодам портала, API, запись в сделку, nginx для fit-lead.ru/kp/, сеть для облачного Битрикса), CATALOG.md, ACCEPTANCE.md.
acceptance
Материалы из ДО и сведение классификатора тематик
Пять файлов из документооборота: постановка, ТЗ на КП (10 слайдов), матрица блогеров (28 тематик), кейсы (24 штуки, матрица тематика-кейс), список услуг с ценами.
✓ Файлы разобраны: каталог 154 блогера с ER и ссылками, размечено 32; кейсов 24, связок тематика-кейс 75. Классификаторы сведены: 25 из 28 тематик блогеров получили кейсы. Дыры: бьюти-тематики не привязаны (17 бьюти-кейсов есть), тревел без кейсов вообще, 8 тематик кейсов без размеченных блогеров.
feature
Справочники в базе дашборда: блогеры, тематики с алиасами, кейсы, услуги
Импорт четырёх источников в Postgres дашборда, единый список тематик с алиасами между матрицей блогеров и матрицей кейсов.
✓ Справочники в JSON (data/kp): 154 автора, 32 размечены, 28 вертикалей с алиасами к 25 тематикам кейсов, 24 открытых кейса, 4 своих (Balanvit, Econity, Yomilk, Mister Prot), 10 тарифов. Импорт scripts/kp-import.mjs. В базу не переносил: правка справочников через интерфейс пока не нужна (в SCOPE-CUTS-LOG).
feature
По любой тематике из классификатора возвращаются три блогера с фото, ER и охватами и три кейса с цифрами и формулировкой
✓ По 25 из 28 вертикалей три автора и три кейса; тревел (4 тематики) без кейсов, у них по 3 автора. Проверено выдачей /kp/preview на сервере. Фото авторов временные с лендинга: папка 21608 Битрикс.Диска не отдана.
acceptance
Досье бренда: карточка Битрикса плюс обогащение
Шаг 0: снять с карточки лида имя, телефон, компанию, комментарий формы, UTM с городом, стадию, таймлайн. Шаг 1: по названию и телефону найти сайт, прочитать, добрать ИНН и ОКВЭД через DaData (ключ есть в LeadForge, бесплатный тариф), сверить бренд с файлом упоминаний у блогеров. Якорь только телефон, почта или домен: на ФИО была ложная склейка с однофамильцем. Соцсети бренда отложены: ключа ScrapeCreators нет ни в одном репозитории парсера.
✓ Досье по сайту и снаружи: тип бизнеса (Mixit = бренд с собственным магазином), линейки, og-картинка, Wildberries через curl+прокси (4503 товара, рейтинг 4,8, сегмент), Вордстат (109 646 запросов/мес), соцсети: с сайта, догадки по домену, подсказки DuckDuckGo; Telegram/YouTube бесплатно, Instagram/TikTok через Apify по кнопке (Mixit: IG 3,36 млн, TikTok 480 тыс. с 3 тыс. просмотров на ролик). Кэш платного анализа 7 дней. Карточка Битрикса в досье пока не читается: нужен leadId из встройки.
feature
На реальном лиде с лендинга (только телефон и UTM) досье находит компанию и сайт либо честно говорит «не определено», а не подставляет однофамильца
⛔ Досье стартует от названия бренда и сайта, не от телефона: лид с лендинга без компании пока не обогащается. Нужна связка с карточкой Битрикса (leadId) и досье по телефону из bo-lead-dossier с якорной проверкой.
acceptance
Шаблон КП на 10 слайдов в дизайн-системе landing2.fitlead.ru
Текст слайдов берётся из ТЗ документооборота. Автозаполняемых слайда три: титул под бренд, три блогера, три кейса. Цифры первого экрана (7000+ лидеров мнений, ER до 9,7%, CPV 1,03) выносятся в настройку с датой подтверждения: в самом ТЗ стоит пометка подтверждать их перед отправкой.
✓ Шаблон по гайдбуку v1 06.09 (Inter, Lead Teal #00484F, Fit Yellow #FBEA1B, официальный логотип, 3D-объекты из PDF гайдбука). После разбора глазами клиента 14.09 сжат до 9 экранов: титул под клиента с его картинкой, что увидели, предлагаем начать с этого, авторы, кейсы со скринами, сценарии под площадки, как работаем, форматы, следующий шаг. Медиакит 6 экранов.
feature
Сборка КП: ссылка, PDF и текст письма
Одна ручка на входе бренд и вертикаль, на выходе страница по слагу, PDF и письмо. Подбор блогеров, кейсов, цифры и цены считает код по матрицам, ИИ пишет только вступление под бренд и обоснование авторов.
✓ Экран /leads/kp: досье, соцсети руками, платный анализ отдельной кнопкой, ИИ-тексты по кнопке или при сборке, контакт менеджера. Собрать КП → постоянная ссылка /kp/<slug> (таблица kp_proposals, счётчик открытий), письмо, ?print=1 для PDF. Выкачено на marketing.fit-lead.ru 14.09.
feature
Названный бренд превращается в готовое КП меньше чем за минуту: ссылка открывается, PDF скачивается, письмо копируется
⛔ Сборка с досье идёт 20–60 секунд из-за Вордстата (очередь отчётов), а не меньше минуты в сумме с платными соцсетями. Подтверждать надо с формы под логином владельца: у меня сессии нет, классификатор запретил выписывать. Ждёт прогона владельцем.
acceptance
В КП нет ни одного факта о клиенте, который не подтверждён источником из досье
✓ В КП идут только факты досье: тип бизнеса, линейки, WB, Вордстат, соцсети с цифрами; описание сайта только цитатой «так бренд говорит о себе». Цифры первого экрана агентства (7000+, ER 9,7%, CPV 1,03) выключены до подтверждения. ИИ пишет только вступление и сценарии по кнопке.
acceptance
Запуск из Битрикса: кнопка в карточке и стадия-триггер
Кнопка в карточке лида через placement: у вебхука нет права «Встройки» и «Диск», добавляет владелец в своём вебхуке. Пока права нет, работает стадия-триггер: перевод лида на стадию отправки предложения запускает сборку и кладёт ссылку в карточку. Менеджеры работают только в Битриксе, дашборд держит движок.
⛔ У вебхука crm.maniteka.ru нет права placement и disk. Владелец добавляет галочки «Встройки» и «Диск» на своём вебхуке (он его создавал), тогда кнопка в карточке. Стадия-триггер как запасной путь не начат.
feature
Менеджер из карточки лида получает готовое КП и отправляет письмо, не выходя в другое окно
⛔ Зависит от права placement на вебхуке Битрикса.
acceptance
Расширить разметку блогеров по тегам каталога
Размечено 32 блогера из 154. Разметку тянем кодом по тегам каталога (лайф, бьюти, спорт, ПП, тревел, наука, семья, мода, спортсмены, готовка), ИИ пишет только недостающие тексты «почему подходит», около 500-600 коротких текстов, 5-10 рублей на дешёвой модели.
✓ Закрыто разметкой 30.09 (все 123 автора, см. задачу про разметку).
feature
В РАБОТЕS20 · С20 · РЕКЛ БА: лиды, боты, аналитика37/41

Цель: Рекламные заявки воронки РЕКЛ БА дублируются менеджеру в ТГ в минуту прихода, Лия дублирует владельцу и сообщает скорость взятия в работу, в дашборде экран аналитики по двум воронкам РЕКЛ БА (объём, источники, скорость, качество, путь до сделки, проблемы).

Детектор: обход раз в минуту, события по лиду (стадии, дела, комментарии), журнал отправок
Новый маршрут /api/cron/leads-watch раз в минуту. Три колонки: UC_8LPFJZ «РЕКЛ БА: Входящий трафик» (пинги), UC_EFI0HJ «РЕКЛ БА: Холодная база» и UC_RDA54Q «РЕКЛ: Холодная база» (только аналитика). Таблицы crm_lead_events, lead_notifications. Автодубли (робот id 1 за секунду) отдельно от брака менеджера.
✓ Крон раз в минуту + полный обход раз в час, таблицы crm_lead_watch/crm_lead_events/lead_notifications, 494 лида за 90 дней догружены. Вход в колонку по истории стадий (иначе автодубли теряются).
feature
Лид из «Входящий трафик» после обхода лежит в базе с колонкой входа и временем создания
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
По лиду сохранены создание, смены статуса, дела и комментарии с автором и временем
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Брак роботом через секунду после создания помечен как автодубль, а не брак менеджера
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Повторный обход не создаёт повторных событий и сообщений
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лид из колонок «Холодная база» в базе есть, сообщений не порождает
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Первое касание человеком звонком через 23 минуты даёт время взятия 23 мин и способ «звонок», роботы не считаются
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Крон на сервере зовёт обход раз в минуту
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Бот менеджера: /start, привязка чата к пользователю Битрикса, карточка нового лида, повтор через 15 мин
Менеджер жмёт /start, chat id берётся из getUpdates и прописывается в настройки. Все лиды колонки «Входящий трафик» падают ей без привязок к пользователям Битрикса. Карточка: название, телефон, компания, источник, кампания/объявление из utm, данные формы, ссылка в CRM, пометка дубля. Повтор через 15 мин в рабочее время. Токен даст владелец.
⛔ Код и настройки готовы, экзамены зелёные; ждёт токен бота от владельца и /start менеджера
feature
На новый лид одно сообщение со всеми полями карточки и ссылкой на CRM
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
На автодубль сообщение с пометкой «дубль лида №N»
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Не взят 15 минут рабочего времени — ровно один повтор, второго через 40 минут нет
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лид пришёл в субботу и не взят — повтора нет до понедельника 9:15
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Без chat id обход не падает, сообщение в журнале со статусом «пропущено»
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Руками: менеджер нажала /start, кнопка «Кто нажал /start» показывает её, тестовое сообщение приходит
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
⛔ ждёт владельца: токен бота менеджера / живой чат
acceptance
Лия: копия лида владельцу, «взят в работу через N мин», тревога через час, итог дня 18:30
Через токен @lia_mytodo_bot, chat 234701173. Тихое окно 06:00–09:00 МСК: не пушить, накопленное одним сообщением в 9:00. Взят в работу = первое из: смена статуса, звонок, письмо, комментарий, дело человеком.
✓ Шлёт через токен @lia_mytodo_bot из дашборда; тихое окно 06–09 МСК, итог дня 18:30. Живые сообщения «взят в работу» уже приходили владельцу.
feature
На новый лид «Входящий трафик» одно сообщение владельцу
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лид взят в работу — владельцу сообщение «взят через N мин» со способом
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Не взят 60 минут рабочего времени — одна тревога владельцу, второй нет
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лид в 06:30 МСК — сообщение отложено, в 09:00 уходит одно с упоминанием лида
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лид в 05:30 МСК — сообщение уходит сразу
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Обход в 18:30 МСК даёт один итог дня с числами, в 18:31 второго нет
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Руками: тестовое сообщение Лии приходит владельцу
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
⛔ ждёт владельца: токен бота менеджера / живой чат
acceptance
Экран /leads/rekl-ba: объём и источники, скорость взятия, тепловая карта час×день, качество и причины брака, путь до сделки, менеджеры, проблемы, таблица лидов
Три воронки: Входящий трафик, РЕКЛ БА: Холодная база, РЕКЛ: Холодная база (лид-менеджер, источник Telegram). Рабочее время по умолчанию пн–пт 9–18 МСК, настраивается. Все формулы в src/lib/metrics.
✓ https://marketing.fit-lead.ru/leads/rekl-ba — 9 блоков, три колонки, скорость только по входящему трафику; настройки /leads/rekl-ba/settings
feature
/leads/rekl-ba без сессии отдаёт вход, с сессией открывается
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Сводка без сессии и токена 401, с x-api-token цифры
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Сводка по подставным лидам: пришло 7 (5+1+1), автодублей 1, взято 3, медиана 23 мин, зависших 1; тест не попадает в обычную сводку
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Тепловая карта 7×24 по приходу и взятию, лид вторника 15:00 МСК в ячейке вт/15
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Путь до сделки и причины брака в сводке
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Проблемы содержат лид без телефона и не взятый с признаками
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Экран показывает девять блоков
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
При пустом периоде плашка «нет данных», а не нули
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Настройки пишет только владелец: без сессии 401, с токеном сводки 403
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
✓ tests/spec/rekl-ba.mjs на cfru 11.09.2026: «Экзамены: 27, прошло 27, красных 0» после двух кругов ОТК
acceptance
Лия читает сводку РЕКЛ БА из дашборда по запросу владельца
Инструмент в lia-v2: GET /api/leads/rekl-ba/summary с токеном, ответ цифрами кода.
✓ Инструмент rekl_ba_leads в lia-v2 (register_all.py), проверен вызовом из контейнера: цифры совпадают с дашбордом. Ручная проверка вопросом к Лие за владельцем.
feature
Руками: спросить Лию «как лиды по РЕКЛ БА сегодня» — ответ теми же числами, что на экране
tests/spec/rekl-ba.mjs; запуск: cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/rekl-ba.mjs
⛔ ждёт владельца: токен бота менеджера / живой чат
acceptance
Доки: docs/LEADS-REKL-BA.md, ACCEPTANCE.md, SCOPE-CUTS-LOG.md, DEPLOY.md (крон раз в минуту)
✓ docs/LEADS-REKL-BA.md, ACCEPTANCE.md (спринт 20), SCOPE-CUTS-LOG.md, DEPLOY.md (крон, env), LEADS.md (ссылка)
feature
Взятие: задачи Битрикса и автокомментарии портала (жалоба 18.09)
Владелец 18.09: «Взято в работу: 0 из 0 входящих», хотя лиды переведены по этапам; «надо чекать не только лид, но и задачу». Разбор по живому Битриксу: 17.09 в «РЕКЛ БА: Входящий трафик» не входил никто (0 честный), 4 в «РЕКЛ: Холодная база» заведены руками. Сделано: (1) tasks.task.list по UF_CRM_TASK=L_<id>, дельта по >=CHANGED_DATE, событие task с TASK_CREATED/CHANGED/CLOSED, закрытие человеком = касание; (2) список автокомментариев портала в настройках (robotCommentPatterns), «Внимание! У лида не заполнен номер телефона» под id менеджера не касание; (3) итог дня без входящих пишет «входящих за день не было». Холодная база во взятие не считается (решение владельца 18.09).
✓ Развёрнуто на marketing.fit-lead.ru 18.09. Экзамены tests/spec/rekl-ba.mjs: 31 из 31 (3 новых). Полный живой обход: 153 лида, 63 события задач, 3 лида холодной базы взяты через задачу (201 Коновалова). Снимок настроек с новым полем снят.
feature
Задача робота, закрытая менеджером через 40 минут, даёт взятие 40 мин и способ «задача»
✓ Экзамен ✓: pickedMinutes=40, pickedBy=task, событие TASK_CLOSED автор 181
acceptance
Автокомментарий портала под id менеджера взятием не считается
✓ Экзамен ✓: лид с одним автокомментарием pickedAt=null
acceptance
Итог дня без входящих пишет «входящих за день не было», а не «0 из 0»
✓ Экзамен ✓: текст итога с одним лидом холодной базы содержит «входящих за день не было»
acceptance
🔴 Багфикс 21.09: обход падал на ufCrmTask=false, три дня заявки без оповещений
С 18.09 10:42 МСК tasks.task.list у трёх задач без привязки к CRM отдавал ufCrmTask:false, `false ?? []` оставался false, весь обход рвался до записи лидов; в кроне ok:true с bitrixError внутри. Пропущены лиды 12871 (18.09) и 13011 (21.09), жалоба Насти 21.09.
✓ bitrix.ts taskLeadIds: Array.isArray вместо ?? []. Выкачено 21.09 14:45 МСК, обход ожил (leads:214), карточка 13011 ушла Насте и владельцу, 31/31 экзаменов. Грабли в docs/LEADS-REKL-BA.md.
bug
В РАБОТЕS21 · С21 · СММ: создать контент — пост, карусель, видео7/16

Цель: Хаб «Создать контент» по образцу СММ-центра Контент Завода в режиме «без ИИ»: что человек написал, то и уходит в модель, код только размечает (формат, текст на слайде, контраст, цвета бренда). Пост с картинкой, карусель 5–7 слайдов в одном стиле с цепочкой от обложки и перерисовкой одного слайда, видео файлом. Всё в карточку на доску согласования и в медиатеку; ничего не публикуется само.

↑ Хаб «Создать контент»: плитки с ценой
Экран /content/create: Пост, Карусель, Видео (загрузить своё). На плитке цена до нажатия. Внизу ссылка на полную студию генерации. Черновик материала создаётся при первом действии, дальше всё копится в нём.
✓ Хаб, черновик при первом действии, ссылка на студию. Развёрнут, снимок снят.
feature
На хабе три плитки, у каждой видна цена до нажатия
✓ Снимок /content/create: Пост «от 2 ₽», Карусель «от 2 ₽ за слайд», Видео «бесплатно». Цены из прайса gen.ts по дешёвой модели.
acceptance
С хаба за один заход получается материал, который лежит на доске и в медиатеке
✓ Проверено без генерации: черновик + своё фото + сохранение = карточка с медиа. С нарисованной картинкой — после ключа Kie.
acceptance
↑ Пост: текст, картинка, сети, предпросмотр
Текст руками (кнопка «написать по теме» — отдельная необязательная помощь, твой текст не переписывает). Картинка: описание сцены как есть плюс разметка кодом, или своё фото. Сети, ссылка в конце, дата, предпросмотр как в ленте.
✓ Экран и API готовы, своё фото и сохранение проверены живьём; нарисованная картинка ждёт ключ Kie.
feature
Пост с текстом и картинкой выходит без ручного промпта и лежит на доске
⛔ KIE_API_KEY пуст: вопрос «чей аккаунт Kie» открыт с августа. Код написан по рабочему коду Завода, живьём не прогнан.
acceptance
Своё фото становится картинкой поста вместо генерации
✓ Живой прогон API: черновик → загрузка PNG полем file → сохранение → карточка на доске с одним медиа. По дороге поймана и исправлена ошибка имени поля (files → file).
acceptance
Предпросмотр показывает пост так, как его увидят в ленте
⛔ Предпросмотр на экране есть, снимок с реальной картинкой — после ключа Kie.
acceptance
↑ Карусель: слайды, стиль серии, цепочка от обложки, перерисовка
5–7 слайдов: заголовок, подзаголовок, сцена, своё фото на слайд. Стиль серии и 2–3 референса. Сборщик кодом гарантирует точный русский текст и контраст. Рендер цепочкой: обложка первая, остальные по её образцу. Один слайд перерисовывается отдельно, без всей серии.
✓ Экран, сборщик промптов, рендер цепочкой и перерисовка написаны; живой прогон ждёт ключ Kie.
feature
Карусель на 5–7 слайдов выходит в одном стиле, русский текст на слайдах читается
⛔ Ждёт ключ Kie.
acceptance
Один слайд перерисовывается отдельно, остальные не трогаются и деньги за них не списываются
⛔ Ждёт ключ Kie.
acceptance
Своё фото ложится в основу слайда
⛔ Загрузка фото на слайд работает (проверено API), использование как образца — после ключа Kie.
acceptance
↑ Видео файлом: подпись, сети, дата
Загрузить свой ролик до 200 МБ, подпись, площадки, дата → карточка на доске с превью.
✓ Проверено живьём через API и на экране.
feature
Видео загружается файлом и попадает в карточку с подписью и площадками
✓ Экран /content/create/video отдаёт 200 без ошибок; тот же путь загрузки проверен живьём с файлом, карточка format=video сохранена и удалена после проверки.
acceptance
↑ Деньги: цена до кнопки, лимит останавливает
Цена считается по прайсу до запуска, кнопка называет сумму. Лимит проекта и человека останавливает генерацию, а не предупреждает. Расход пишется по факту.
✓ Цена на кнопках и потолок до первого вызова написаны; проверка на живой генерации после ключа.
feature
Цена видна до нажатия, лимит проекта останавливает генерацию, а не предупреждает
⛔ Цена на кнопке есть; остановка по лимиту на живой генерации — после ключа Kie.
acceptance
Ничего не публикуется само: всё созданное лежит на доске в черновиках
✓ Сохранение кладёт карточку в первую колонку доски (stage=draft), кода публикации на экране нет; проверено по базе.
acceptance
ревьюS23 · Стиль Fit&Lead: рамка, текст и лого кодом7/7

Цель: Кнопка «Наложить стиль» на картинке в /content/create: код по гайдбуку (стр. 13, 40-42, 49-50, 52) кладёт рамку, заголовок Inter, лого, адрес, плашку рубрики и маркировку ИИ; композицию подбирает ИИ по картинке из каталога раскладок, рендер детерминированный. Сначала отдельный движок и тренировочная галерея ~100 вариаций на согласование.

↑ Движок стиля: рамки со стр. 42 векторами, свободные зоны, растяжка под 1:1 / 4:5 / 9:16
src/lib/style/frames.ts: 21 контур из PDF, кусочная растяжка без искажения скруглений, параметры step_x / zone_top / zone_bottom, вычисление зон TL/TR/BL/BR по точкам контура. Режимы: контур поверх фото и контейнер (фото внутри рамки, поле белое/teal/жёлтое).
✓ src/lib/style/frames.ts: 21 контур из PDF, кусочная растяжка, stepX/zoneTop/zoneBottom, зоны TL/TR/BL/BR с учётом косых переходов; режимы контур и контейнер (фото вписано в габарит рамки). Экзамен геометрии: 195 макетов, 0 коллизий.
feature
↑ Типографика по стр. 13: перенос и подгонка заголовка по метрикам Inter, подзаголовок, плашка рубрики, адрес, маркировка ИИ
opentype.js по Inter SemiBold/Medium: ширина строк, автоперенос в зону, кегль 70-110 на базе 1080 с масштабом под формат, не больше 4 строк (иначе ужать и пометить), трекинг -7% заголовка / -3% текста, интерлиньяж 100%. Разнесённый заголовок (две части). Плашка-пилюля, адрес 30-34 px, маркировка «Изображения созданы с использованием ИИ*».
✓ text.ts на opentype.js (charToGlyph+кернинг), подбор кегля 90→70 с предпочтением ≤3 строк, headline_too_long, аварийный кегль до 48 чтобы не ломать рамку; подзаголовок 50 Medium, плашка-пилюля, адрес, маркировка ИИ двумя строками.
feature
↑ Каталог раскладок по 21 примеру стр. 52 + логотипы: стопка, wordmark в строку, круглый штамп
layouts.ts: словарь композиций (лого в ступеньке, wordmark над рамкой, штамп по центру; заголовок слева-снизу / по центру с плашкой / разнесённый / сверху; адрес и маркировка в вырезах; тонировки teal/оранж/жёлтый duotone). Каждая раскладка знает, какие рамки ей подходят и сколько текста вмещает.
✓ layouts.ts: 13 раскладок (лого в ступеньке ×2, wordmark ×3, штамп, заголовок сверху + лого в вырезе, 3 тонировки, 3 контейнера), 13 рубрик; brand.ts: стопка, wordmark в строку из векторов лого, круглый штамп буквами по одной.
feature
↑ Тренировочная галерея: ~100 вариаций на 5 чистых фото, страница /lab/fitlead-style/ на согласование
scripts/style/gallery.ts: перебор раскладок × рамок × длины текста (1 слово, 2 слова, 5-6 слов, заголовок + 2 подзаголовка) × форматов × режимов (контур/контейнер). Страница с фильтрами. Итерации по замечаниям владельца до «ок».
✓ myvisionagency.ru/lab/fitlead-style/ (112 вариаций, фильтры) и /auto/ (180 картинок автоподбора, топ-3 на фото×текст×формат). Три круга правок по замечаниям владельца и автопроверке: коллизии 15 → 7 → 4 → 0.
feature
Подбор композиции: эвристика по карте занятости фото + ИИ через OpenRouter (GPT-4o mini, картинка), fallback без ИИ
analyze.ts: 4×4 карта яркости/детализации через sharp; choose.ts: ранжирование раскладок кодом; при OPENROUTER_API_KEY запрос с уменьшенным фото и каталогом → JSON {layout, frame, colors, gradient}; ответ валидируется схемой, при ошибке эвристика. Цена клика видна до нажатия, повтор бесплатен (кэш по хешу картинка+текст+параметры).
✓ analyze.ts (карта 16×16 яркости, 4×4 детализации), choose.ts (ранжирование, topDistinct), ai.ts (GPT-4o mini через OpenRouter с картинкой, JSON {choice, reason}, валидация, fallback на код), кэш решения по хешу входов в Generation.params.key. На проде ИИ-выбор упирается в отсутствие месячного потолка расходов проекта: ждёт владельца.
feature
Кнопка «Наложить стиль» в Пост и Карусель: модалка, предпросмотр, другой вариант, ручной выбор рамки, применить
API /api/create/style (POST: mediaId, headline, sub, rubric, site, aiMark, format, mode, layoutOverride) → новое ContentMedia в карточке, исходник не трогается. Dockerfile: fontconfig + Inter в образ, sharp. Лимиты денег как у генерации.
✓ POST/GET /api/create/style, StylePanel.tsx в CreatePost: заголовок/подзаголовок/рубрика/тумблеры/ручная раскладка, Подобрать, Другой вариант (0 ₽), Применить, Вернуть картинку без стиля. Результат = Generation kind style, встраивается в сохранение поста. Dockerfile: fontconfig+Inter, sharp, opentype.js. Проверено в браузере на живом дашборде. Карусель не сделана (scope cut).
feature
Доки и приёмка: docs/STYLE.md (правила в числах, контракт), критерии в ACCEPTANCE.md, экзамены tests/spec/style.mjs, ОТК
Экзамены: заголовок 2 слова и 14 слов оба влезают в зону; лого не пересекает контур ни в одной раскладке; адрес всегда внутри свободной зоны; на тёмном фоне белый текст, на светлом teal; без OpenRouter кнопка работает; повторный клик не списывает деньги.
✓ docs/STYLE.md (правила в числах, контракт, автопроверка, грабли сборки), ACCEPTANCE.md спринт 23, tests/spec/style.mjs + scripts/style/exam-geometry.ts: 15/17 зелёных, 2 красных = гейт денег без потолка проекта (не баг). SCOPE-CUTS-LOG: 5 углов.
feature
ревьюS24 · Стиль по мастеру Figma и card kit8/8

Цель: Движок стиля переведён на источник истины айти-отдела: мастер Figma как данные (44 шаблона, грамматика карманов, токены куратора, Inter 3.19). Обложки собираются по скелетам с подвижной композицией, сверены с эталонами Figma, кнопка в дашборде работает на них.

Мастер Figma как данные: загрузчик templates/constructions/figma-raw, логотипы кита, Inter 3.19, токены куратора
✓ src/lib/style/master.ts + pockets.ts (порт card-shell.js). Курсив по символам, регистр, списки, точный интерлиньяж из сырого дерева; штамп распознан; партнёрские знаки отфильтрованы. Обложки по скелету с сопоставлением элементов по содержимому/ближайшему центру.
feature
Сверка с мастером: 44 шаблона против эталонов Figma, страница /lab/fitlead-style/master/
✓ scripts/style/master-check.ts: внутренние по серому с маской фото, обложки чернилами против ч/б скелета с допуском 2 px. Среднее расхождение 3,3 % после 6 кругов правок (было 29 % → 5,9 → 5,3 → 4,9 → 4,2 → 3,3).
feature
Подвижная композиция обложек: карманы под элементы, рост заголовка, якоря на 4 формата, затемнение
✓ src/lib/style/compose.ts. 17 скелетов × 4 формата × 5 текстов = 340 макетов, коллизий 0 (было 11 → 6 → 0). Галерея /lab/fitlead-style/v2/ (68), автоподбор /lab/fitlead-style/auto2/ (90).
feature
Подбор скелета по фото и тексту (код + ИИ) и врезка в дашборд вместо движка v1
✓ choose.ts по скелетам; apply/route/StylePanel переведены на compose; старый движок (рамки из PDF) удалён. Образ пересобран, экзамены 15/17 (2 красных = потолок расходов не задан). Живой рендер проверен: Graphics 255.
feature
Доки: STYLE.md переписан под мастер, ACCEPTANCE спринт 24, scope cuts
✓ docs/STYLE.md v2, ACCEPTANCE.md, SCOPE-CUTS-LOG.md.
feature
Витрина на пяти фото ВК: обложки, посты, карусели без генерации
✓ Страница /lab/fitlead-style/examples/: 15 обложек (топ-3 автоподбора), 15 постов (4:5, 1:1, 9:16), две карусели (6 и 7 карточек: тексты мастера про ОРД и свой текст про доход с блога). scripts/style/showcase.ts, 0 ₽. Просмотрено глазами, три круга правок.
task
Внутренние карточки карусели: сборка «картинка под текст» по data-fit кита
✓ src/lib/style/inner.ts: режимы pocket/stack/under, стопка на 46, зазор 24, карман по ширине текста и под широкую плашку, списки с отступом 62. Экзамен: 121 карточка (11 × 3 формата × 4 текста) без коллизий, картинка в диапазоне мастера; всего 461 макет в exam-geometry.ts.
task
Автоподбор видит человека без ИИ + ровные строки заголовка
✓ analyze.ts: карта объекта съёмки по цвету фона и оценка головы; choose.ts: штрафы за заголовок/лого/плашку на объекте и голове. text.ts: balance — без висячего слова. Контейнер пересобран, экзамены 15/17 (2 красных = потолок расходов проекта не задан, владелец).
task
ревьюS25 · С25 · Обогнать card kit: баннеры, проверки, карусель, партнёры6/6

Цель: Закрыть всё, что у кита айти-отдела есть, а у нас нет, дешевле и стабильнее: композицию считает код. Критерии: docs/ACCEPTANCE.md § Спринт 25.

25.1 Баннеры Директа: 8 размеров одной кнопкой, умное кадрирование, ≤ 512 КБ, экзамен 240 баннеров
banners.ts + exam-banners.ts + кнопка в /content/create
✓ banners.ts + banners-apply.ts + /api/create/banners (+zip), кнопка «Баннеры Директа» на экране поста. Экзамен exam-banners.ts: 240 баннеров, размеры точные, поле/контур/знак чисто, кегль ≥ 17, ≤ 512 КБ, голова в кадре (детектор лиц pico + силуэт). Живая проверка: 8 файлов за 2,3 с, архив 1,2 МБ, UI-скрин.
task
25.2 База проверок: 32 правила ворот кита + 15 антипаттернов как наши экзамены + наши правила сверх
checks.ts, exam-geometry.ts, tests/spec/style.mjs
✓ gate.ts (unfilled_slot, near_edge, in_ui_zone, empty_pocket) + правила по построению в exam-gate.ts: 28 правил, у каждого вход «срабатывает» и вход «молчит», 0 провалов. Большие пустые карманы обложек закрываются сами. Маршрут отвечает 400 на чужую рубрику и TODO-текст.
task
25.3 Карусель в дашборде: кнопка на слайде, все 23 внутренних шаблона (рецепты, картинка внизу)
inner.ts, StylePanel, CreateCarousel, маршрут kind: inner
✓ SlideStylePanel на каждом слайде карусели (обложка = скелет, внутренний = карточка), маршрут /api/create/style kind:inner, inner-apply.ts (rankInner по форме текста, занятые шаблоны в хвост). Все 23 внутренних: рецепты 330–336 (автор + вид спорта), текст сверху 325/328 (вывод на подножии), 265/266. Экзамен 567 макетов, 0 коллизий. UI-скрин: Graphics 326 на слайде 2.
task
25.4 Партнёрский ряд по весу чернил (313/314/264) и маркировка рекламы (data-ad)
partners.ts, поля рекламодатель/erid
✓ partners.ts: ряд по весу чернил (границы «равный бокс»/«равные чернила», середина), 313/264/314, ужатие под карман, отчёт с числами; маркировка «Реклама. … erid» на 9:16 (в две строки слева от кармана) и последней строкой карточки, XXXXXXXX отвергается. Поля в панелях поста и слайда (PartnersAdFields). Экзамен: равная высота мастера вне границ, наш выбор внутри; ряд на трёх обложках без коллизий.
task
25.5 Паспорт картинки (made-with) и объяснение выбора словами
apply.ts, params, ответ маршрута
✓ made-with в EXIF каждой картинки (обложка, карточка, баннер) + Generation.params с входами/скелетом/предупреждениями/партнёрами/маркировкой, engine master-v2.1. Ответ обложки: explain словами (скелет, лицо/силуэт, затемнение, кегль, что подвинуто); карточка: reason.
task
25.6 Витрина «кит против движка» /style/vs/
showcase-vs.ts
✓ marketing.fit-lead.ru/style/vs/: баннеры айти-отдела (скрин владельца) против наших на тех же текстах (2,1 с, 0 ₽), их разметка руками против нашего входа, карусель, таблица цифр. Их карточек рядом нет: PNG в их репозитории нет.
task
В РАБОТЕS26 · С28 · Завод статей SEO+GEO26/42

Цель: Спрос из Вордстата → ИИ-сеошник (сейчас ассистент в сессии, API заложен) → план 30 тем на проект → статьи с обложкой gpt-image и инфографикой кодом → автовыкладка 2/день через Content Hub → проверка на сайте и отчёт Лией. Док docs/ARTICLE-FACTORY.md, критерии ACCEPTANCE «Спринт 28».

↑ Документ и критерии завода
docs/ARTICLE-FACTORY.md, раздел «Спринт 28» в ACCEPTANCE.md, экзамены tests/spec/factory.mjs до кода.
✓ docs/ARTICLE-FACTORY.md, ACCEPTANCE «Спринт 28», экзамены tests/spec/factory.mjs, базовый прогон 14 красных
feature
↑ СММ Агент: статьи по профессиям — план 24 тем на согласовании
План: https://marketing.fit-lead.ru/seo-plan/smm-agent/ (исходники C:/tmp/smmagent-seo-plan/, Вордстат 06.10 по 184 фразам). 20 профессий (~15 тыс. показов) + общие «пост для вк» 27,5 тыс., «пост знакомство» 4,8 тыс., «готовые посты» 5 тыс. После «ок»: волна 1 = 14 статей, пишу в сессии, превью в вёрстке блога.
✓ 07.10: волна 1 (14 статей) принята заводом с обложками (42 ₽) и выходит по 2 в день с 07.10; превью /blog-preview/smm-agent/. Дальше волна 2 (10 статей).
feature
↑ СММ Агент на боевой сммагент.рф: ключи хаба от Дмитрия 02.10, переключение завода
Ключи smm_agent_ingest / smm_agent_mcp в личке Дмитрия (сообщение 02.10 11:10). Нужно: положить в /opt/fitlead-dash/.env как HUB_SMM_PROD_INGEST_KEY, в projects.ts smm_agent → siteBlogBase https://xn--80aggzajwo.xn--p1ai/blog/, siteHosts + markirovka.fit-lead.ru, направление «Соцсети по профессиям». Перед первой заливкой спросить Дмитрия про «галочку» публикации. Первой перелить «Контент-план на месяц» с testsite.
✓ 07.10: ключи Дмитрия в .env, projects.ts smm_agent → https://xn--80aggzajwo.xn--p1ai/blog/ (HUB_SMM_PROD_INGEST_KEY), compose + docs, пересборка; стоп снят, первая статья post-dlya-vk ушла в боевой хаб 10:55 UTC.
infra
↑ Маркер в завод: план блога 29 тем, ключи хаба от Дмитрия 05.10
План: https://marketing.fit-lead.ru/seo-plan/marker/ (исходники C:/tmp/marker-seo-plan/, разбор сайта scratchpad marker/). Спрос темы ≈87 тыс. без повторов: erid 18,9 тыс., орд вк 11,8 тыс., маркировка рекламы 9,3 тыс., ерир 8 тыс. Блог markirovka.fit-lead.ru/knowledge-base/blog/ пустой, posts.json пересобирается sync_hub.py раз в 15 мин. Нужно: проект marker в projects.ts (siteHosts + официальные источники для ссылок), HUB_MARKER_INGEST_KEY, claims с сайта. Факты только сверенные (38-ФЗ, КоАП 14.3 ред. 04.08.2026, ПП 974/1427/1224).
✓ 06.10: волна 1 написана, 17 статей (6 200–8 000 знаков, без картинок), все проходят check.py. Факты по 38-ФЗ, КоАП 14.3 (ред. 04.08.2026), ПП 974/1427/1087, приказу РКН № 68, ст. 24 и 149-ФЗ ст. 10.6 — тексты норм в scratchpad marker/law. Превью: https://marketing.fit-lead.ru/blog-preview/marker/ . Исходники C:/tmp/marker-articles/. Ждёт: «ок» на тексты, «да» на ключи marker_*, проект marker в заводе (siteHosts: ord-lab.ru вместо несуществующего ord.sber.ru).
feature
↑ С30 · Быстрая индексация (IndexNow + Вебмастер) и Маркер в заводе
Владелец 07.10: «сделать быструю выкладку, чтобы иишки подхватывали» + запуск Маркера (без картинок). Код: src/lib/factory/indexing.ts, publisher.ts (индексация при выходе + повторы, дни выкладки), writer/quality (images:false), projects.ts (marker), роут /api/factory/index. Доки: ARTICLE-FACTORY.md «Индексация», «Маркер»; ACCEPTANCE «Спринт 30»; экзамены tests/spec/factory-index.mjs.
✓ 07.10: выкачено, экзамены 10 ✓ / 0 ✗ / 1 пропуск, регресс 0 красных, ОТК-критик: 8 находок закрыты. Открыто: файлы ключей IndexNow на сайтах, WEBMASTER_TOKEN, «да» на публикацию Маркера.
feature
После выхода статьи адрес уходит в IndexNow (Яндекс+Bing), если у проекта ключ и файл ключа на сайте
✓ 07.10: код на месте, ждёт файлов ключей на сайтах (экзамен пока «пропуск»)
acceptance
Без ключа/файла — причина по-русски, статья live, повтор раз в час до 14 дней
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
Успешно отправленный адрес второй раз не уходит
✓ 07.10: код на месте, ждёт файлов ключей на сайтах (экзамен пока «пропуск»)
acceptance
С WEBMASTER_TOKEN — очередь переобхода; без токена — «нет токена Вебмастера»
✓ 07.10: ветка без токена проверена экзаменом («нет токена Вебмастера»); постановка в очередь переобхода проверится, когда владелец даст токен
acceptance
dryRun-проверка одной статьи по токену завода, без токена 401
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
Статья Маркера без cover_scene и инфографики принимается, обложка не заказывается
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
Статья ИСКРЫ/СММ без cover_scene по-прежнему отклоняется
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
Пока у Маркера стоп — его статьи не уходят в хаб
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
Маркер выходит только пн/ср/пт по МСК, 1 в день, адрес со слэшем
✓ 07.10: экзамен tests/spec/factory-index.mjs зелёный (10 ✓, 0 ✗)
acceptance
↑ Спрос: Вордстат по семенам проектов, ядро + помесячные снимки
src/lib/factory/demand.ts, крон /api/cron/factory-demand 1-го числа. Фильтры коммерции и стоп-слов кодом.
✓ demand.ts + крон 1-го числа; ядро СММ 1114, ИСКРА 1724 фраз, снимки месяца
feature
Прогон спроса кладёт в ядро не меньше 150 фраз по СММ-агенту и 150 по ИСКРЕ
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ СММ-агент 1114 фраз, ИСКРА 1724
acceptance
Повторный прогон в тот же месяц не плодит строк
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ строк было = стало
acceptance
В ядро не попадают купить/цена/заказать/скачать и стоп-слова проекта
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ коммерческих 0
acceptance
После прогона в Вордстате не остаётся наших отчётов
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ отчётов в очереди 0
acceptance
↑ Сеошник: пакет фактов, приём плана, проверки (режимы session/api)
src/lib/factory/strategist.ts, GET /api/factory/pack, POST /api/factory/plan. Цифры только из ядра.
✓ pack/plan, проверки кодом, режим api заложен выключенным (api.ts)
feature
Пакет по токену завода, без токена 401
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ без токена 401, с токеном 200
acceptance
План с фразой не из ядра отклоняется с её названием; показы в плане равны ядру
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ 422 с названием фразы, показы = ядро
acceptance
План с уже вышедшей или уже запланированной темой отклоняется
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ 422 с названием темы
acceptance
План 30 тем виден на экране по волнам с причинами
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ 30 тем СММ-агента и 30 ИСКРЫ, экран с волнами и причинами (скриншот)
acceptance
В режиме session ни одного запроса в OpenRouter
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ mode=session, factory:llm 0
acceptance
↑ Писатель: приём статей, проверки качества, обложка gpt-image + инфографика кодом
src/lib/factory/writer.ts, quality.ts, images.ts. Журнал Kie factory:img:<хеш>, потолок FACTORY_MONTHLY_CAP_RUB.
✓ приём, проверки, обложка Kie с журналом и потолком, инфографика SVG→JPEG; ждёт «ок» на трату 3 ₽ для прогона EXAM_SPEND
feature
Короткая / с таблицей / со штампом / со следом работы на стороне статья отклоняется с причиной
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ 4 проверки: знаки, таблица, штамп, работа на стороне — 422 с причиной
acceptance
Продукт вне последнего раздела — отказ
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ 422
acceptance
Принятая статья получает обложку 16:9 и 1-2 инфографики, адреса отдают 200 image/jpeg
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
Повтор той же обложки не списывает деньги
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
На потолке трат картинка не заказывается, причина в журнале
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
↑ Выкладка: крон 2/день через Ingest, проверка live, отчёты Лией, стоп
src/lib/factory/publisher.ts, кроны factory-publish (10:00/16:00 МСК) и factory-live (10 мин). published_at шлём сами.
✓ publisher.ts, кроны 10/16 МСК и каждые 10 мин; FACTORY_ENABLED=0 до первой партии
feature
Не больше дневной нормы, порядок волна → номер
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
Статья открывается на сайте с датой, обложкой и якорями, статус live, отчёт Лией
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
Не появилась за 30 минут — тревога Лией
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ засев 40 мин → тревога, статус не live
acceptance
Стоп проекта и FACTORY_ENABLED=0 не публикуют
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ стоп проекта не публикует; FACTORY_ENABLED=0 — в коде, руками
acceptance
Повтор крона в том же слоте не публикует сверх нормы
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
acceptance
↑ Экран «SEO → Завод статей»
/seo/factory: план по волнам, очередь, вышедшие, расход и потолок, стоп.
✓ /seo/factory, ссылка с экрана SEO
feature
Открыт только руководству, без входа не открывается
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ без входа редирект, со входом 200; раздел seo только у руководства (requireSection)
acceptance
По проекту видны план, очередь, вышедшие со ссылкой, расход, стоп
tests/spec/factory.mjs — cd /opt/fitlead-dash && set -a && . ./.env && set +a && node tests/spec/factory.mjs (деньги: EXAM_SPEND=1, публикация: EXAM_PUBLISH=1)
✓ tests/spec/factory.mjs 29.09: ✓ План/Очередь/Вышли/Расход/Стоп на экране
acceptance
Первая партия: план 30 тем СММ-агента и ИСКРЫ, статьи пишет ассистент
После запуска: пакет → план (ассистент) → 20-30 статей по просьбе владельца → очередь.
✓ 30.09: направления в заводе; ИСКРА — направление «Подарок» (893 фразы, мусор сертификатов вычищен), план ИСКРЫ 42 темы, подарочный кластер 12 тем первым. Статья №1 «Что подарить руководителю» прошла проверки (6 128 знаков), превью marketing.fit-lead.ru/blog-preview/iskra/chto-podarit-rukovoditelyu/ — ждёт «ок» владельца на стиль, затем партия.
feature
Fit&Lead в завод (следующий этап)
Ждёт проект Fit&Lead в хабе у Дмитрия или ключ WordPress blog_post.
feature
готовS27 · С29 · Дашборд до взрослого: цифры, фильтры, задачи, сбор, креативы, монтаж178/178

Цель: Задача владельца 01.10: честные цифры и пул метрик (бренд, ROMI), фильтры и разрезы с датами и сравнением, задачи для команды (сдал → принял/вернул, Телеграм, фильтры Артёма), сбор без тихих поломок и брендовый спрос, генератор рекламных креативов (Fit&Lead по гайдбуку, СММ Агент и ИСКРА своей дизайн-системой), ИИ-монтажёр для соцсетей. Работа на стенде /opt/fitlead-night, прод только по «да» владельца.

🔴 num · Честные цифры и пул маркетинговых метрик
Входящие/исходящие/регистрации раздельно (leadKind), московские сутки без неполного сегодня, выиграно по дате закрытия, выручка только где есть сумма, «Все проекты» без деления чужого расхода, конверсии без >100%, бренд и ROMI/ДРР/CAC в Итогах месяца, алерты по входящим. Критерии docs/night/num-ACCEPTANCE.md, экзамен tests/spec/night-num.mjs, копия C:/tmp/fl-wt/num, стенд :3201.
✓ Выкачено 13.10.2026 (С29). Прод: Итоги сентября — входящие рекламодателей 130 (авг 75), исходящие 740, регистрации 993, выиграно 6 по дате закрытия, деньги «нет данных: сумма есть у 0 из 10»; пул «Метрики»; регресс night-num 39/39.
feature
num · 1. Каждая карточка CRM ровно одного вида.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 2. Сверка с аудитом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 3. Правила видов на примерах.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 4. Общий интерфейс как в брифе.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 5. Входящие, исходящие и регистрации отдельно, главная цифра входящие.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 6. Сравнение «как с чем» подписано.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 7. «CRM видит N заявок с сайтов» без холодных карточек.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 8. Качественные по видам.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 9. Выиграно по дате закрытия.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 10. Выручка только с суммой.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 11. Потенциал сделок не выдаётся за выручку.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 12. Конверсия «качественная → сделка» не больше 100%.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 13. Одинаковые числа на всех экранах.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 14. Каждое число подписано.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 15. «Все проекты» не делит чужой расход.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 16. Сводка не складывает CRM и цели СММ Агента.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 17. Расход подписан «с НДС».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 18. Лид = «Вход · Новая регистрация», продажа = «Деньги · Оплата прошла».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 19. Одно число на всех экранах СММ Агента.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 20. Московские сутки.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 21. «Показатели» не выдают неполный месяц за полный.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 22. Алерты и рост без неполного сегодня.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 23. Справочник формул.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 24. Страница «Метрики».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 25. Расчёт пула сходится с экранами.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 26. Блоки «Бренд» и «Деньги» в итогах месяца.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 27. Заброшенные аккаунты отдельно.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 28. Посты без просмотров в конце списка.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 29. Честное «плана нет».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 30. Алерты по входящим заявкам.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 31. Удалённая карточка не попадает ни в одно число.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 32. «Показатели»: пусто с причиной, потенциал подписан видимым текстом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 33. Сводка: «Качественные входящие».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 34. Только применимые показатели.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 35. Скорость.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 36. Алерты без дублей.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 37. Деньги только с правом «деньги».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 38. Мелочи.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
num · 39. Доводка по кругу 2.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-num 39/39. Отчёт: C:/tmp/fl-wt/num/docs/night/num-REPORT.md
acceptance
🔴 flt · Фильтры, разрезы и сравнение периодов
Общая панель фильтров (даты, пресеты, свои даты, сравнение с прошлым периодом/годом, шаг день/неделя/месяц, разрезы канал/источник/кампания/кабинет/площадка/направление/менеджер/вид заявки) на рекламе, заявках, воронках, соцсетях, SEO; выгрузки с теми же фильтрами; вишлист Артёма по Директу (даты кампании, тип, расход кабинета, цели по кампаниям). Критерии docs/night/flt-ACCEPTANCE.md, копия C:/tmp/fl-wt/flt, стенд :3202.
✓ Выкачено 13.10.2026. Панель фильтров на всех аналитических экранах, разрезы, сравнение, выгрузки с фильтрами и правом «деньги»; /leads = 130 как Итоги; регресс night-flt 40/40.
feature
flt · 1. Пресеты дат.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 2. Окна кончаются вчера, сегодня по кнопке.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 3. Подпись сравнения рядом с периодом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 4. Шаг графика.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 5. Разрезы выпадающими списками и сброс.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 6. Выгрузка с теми же фильтрами.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 7. Старые адреса открываются.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 8. Все 17 экранов на resolvePeriod получили новую панель дат.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 9. Телефон.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 10. Разрез «Кабинет».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 11. Разрез «Площадка».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 12. Разрез «Тип кампании» и «Кампания».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 13. Настоящий тип кампании.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 14. Сравнение в плитках и таблице.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 15. Строка расхода по каждому кабинету.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 16. Даты кампании.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 17. Цели по отдельности.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 18. Переносы после eLama помечены одинаково.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 19. «Разбор» назван честно.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 20. Прогноз плана с порогом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 21. Расход подписан «с НДС».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 22. Вид заявки по умолчанию «Входящие».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 23. Разрезы заявок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 24. Сравнение заявок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 25. Московские сутки у событий.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 26. РЕКЛ БА: разрезы без поломки бота.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 27. Выгрузка заявок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 28. Воронки.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 29. Соцсети: площадка и аккаунт.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 30. Заброшенные помечены.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 31. Площадка: период, сравнение, шаг.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 32. SEO.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 33. Выгрузки знают фильтры и права.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 34. События по eventFrom/eventTo, дневные таблицы по from/to.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 36. Одна заявка — одно число.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 37. Заявки только открытых проектов.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 38. Деньги в выгрузках только с правом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 39. Заявки периода одним запросом, числа как у num.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
flt · 35. Карты обновлены.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-flt 40/40, check-filters зелёная. Отчёт: C:/tmp/fl-wt/flt/docs/night/flt-REPORT.md
acceptance
↑ tsk · Задачи для команды: сдал → принял/вернул, Телеграм, фильтры
Цикл проверки, уведомления (колокольчик + ТГ), задачи Битрикса только на чтение и закрытие вместе с Битриксом, фильтры Артёма в адресе, страница задачи с файлами и историей, права, сводка руководителю. Критерии docs/night/tsk-ACCEPTANCE.md (31 пункт), копия C:/tmp/fl-wt/tsk, стенд :3204.
✓ Выкачено 13.10.2026. Цикл сдал→принял/вернул, уведомления + Телеграм, задачи Битрикса только чтение; на проде задача Артёма cmukz4bquajhmo13l6pgrynoj «На проверке», проверяет Шамрай; зомби 0; кроны tasks/digest и tg/poll стоят; регресс 12/12 + 58/59.
feature
tsk · 1. Исполнитель открытой задачи видит кнопку «Сдать на проверку» (на карточке доски и в задаче).
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 2. Проверяющий = постановщик
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 3. Проверяющий (и руководитель) видит «Принять» и «Вернуть»
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 4. «Вернуть» без комментария не срабатывает: «Напишите, что поправить»
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 5. Исполнитель больше не закрывает задачу мимо проверки: кнопки «Завершить» у него нет, а запрос
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 6. На доске плашка «Ждут вашей проверки: N» (кнопка ведёт к этому фильтру), когда N > 0.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 7. Задача Артёма cmukz4bquajhmo13l6pgrynoj после scripts/night/fix-artem-task.sql:
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 8. Поручили задачу другому человеку — ему колокольчик «Вам поручена задача» и Телеграм
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 9. Сдали на проверку — проверяющему; приняли или вернули — исполнителю
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 10. Новый комментарий — исполнителю, постановщику и проверяющему, кроме самого автора
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 11. Чужую задачу изменили (срок, название, описание, приоритет, проект, колонка) — исполнителю
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 12. Утренний дайджест (POST /api/tasks/digest под x-cron-secret): один на человека в день,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 13. notifyUser без токена бота или без привязанного чата возвращает false, ошибок наружу не
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 14. Привязка Телеграма: в профиле «Подключить Телеграм» → одноразовая ссылка
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 15. У задачи из Битрикса в карточке и в задаче нет смены статуса, исполнителя, срока, названия,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 16. Синк задач: закрытая в Битриксе (статус 5) или пропавшая оттуда задача закрывается у нас
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 17. scripts/night/fix-bitrix-zombies.sql снимает отметки закрытия у задач Битрикса в открытом
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 18. Быстрая кнопка «Из Битрикса» и список источников «В работе отдела / Все / Наши / Из Битрикса /
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 19. Быстрые кнопки «Мои», «Поставил я», «Ждёт моей проверки», «Просрочено», «Сегодня», «Неделя»,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 20. Фильтры по исполнителю, автору, проекту, приоритету; сортировка по сроку, приоритету, дате
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 21. Фильтры живут в адресе: /tasks?who=mine&due=overdue открывает доску с этими фильтрами,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 22. Задача без проекта при выбранном проекте видна с пометкой «без проекта»
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 23. Даты на доске и в архиве с годом, если год не текущий
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 24. Архив: новые закрытые сверху, у каждой кто и когда закрыл («приёмка: …», «закрытие: …»,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 25. Узкий экран: колонки листаются свайпом по одной, кнопки действий на карточке видны без
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 26. /tasks/[id]: файлы (скачать, добавить, удалить), чек-лист, комментарии, полная история:
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 27. GET задачи и файла задачи проверяют раздел, проект и чужую работу: недоступная задача →
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 28. «Удалить» видит только тот, кто может удалить (руководитель, задачи не из Битрикса).
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 29. Выгрузка в Excel учитывает фильтры доски и раздел (без раздела «Задачи» — отказ)
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 30. Новая задача встаёт наверх своей колонки; перенос карточки на место другой сохраняет порядок
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
tsk · 31. Руководитель видит на доске блок «Неделя по людям»: закрыто за 7 дней, просрочено сейчас,
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-tsk 12/12 + check-tasks 58/59 (п.16 пропущен на копии с настоящими задачами Битрикса, зелёный на стенде tsk). Отчёт: C:/tmp/fl-wt/tsk/docs/night/tsk-REPORT.md
acceptance
↑ col · Сбор без тихих поломок, брендовый спрос, здоровье источников
Метрика (лишние строки, too complicated → дробление окна), цели СММ Агента кроном, Вордстат точная частотность с повтором, справочник брендовых фраз, поисковые запросы Директа кроном, ad_goal_daily, Битрикс шаги и потолок, ВК при наличии ключа, экран здоровья источников. Критерии docs/night/col-ACCEPTANCE.md, копия C:/tmp/fl-wt/col, стенд :3203.
✓ Выкачено 13.10.2026. Метрика: сверки ok, цели СММ 33 (лид «Новая регистрация»), ВК с НДС (история +НДС, итог 6 647 ₽), сверка Битрикса пометила 20 удалённых (проверено: Битрикс отвечает Not found), экран /sources честный. Кроны health/weekly/bitrix sweep стоят. 🔴 Директ API отвечает 204 с 11.10 (до выкатки, даже без ключа) — отдельная проверка; Вордстат падает по той же причине.
feature
col · К1. Новые цели собираются сами.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К2. Решение владельца по целям СММ Агента.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К3. Лишние строки удаляются.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К4. Сложный запрос не выбрасывает счётчик.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К5. Мелкое расхождение не роняет прогон.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К6. Вордстат меряет правильно.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К7. Склейки не удваивают спрос.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К8. Справочник брендовых фраз.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К9. Экран фраз.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К10. Брендовые визиты рекламы.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К11. Расход на свой бренд.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К12. Итог бренда за месяц.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К13. Конверсии по каждой цели.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К14. Площадки раз в неделю.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К19. ВК Реклама с НДС.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К15. Понятный журнал прогона.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К16. Сделки полнее, удалённое помечено.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К17. ВК сообщества.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К18. Вебмастер.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К20. Здоровье каждого источника.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К21. Оповещения без шума.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К22. Кроны закрыты, расписание записано.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
col · К23. Карты обновлены.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-col 34/34 (на базе стенда col со слитым кодом). Отчёт: C:/tmp/fl-wt/col/docs/night/col-REPORT.md
acceptance
cre · Генератор рекламных креативов и дизайн-системы брендов
Fit&Lead строго по гайдбуку через существующий движок, СММ Агент и ИСКРА своей дизайн-системой без рамок; размеры площадок, вес ≤512 КБ, контраст, маркировка, лимиты текстов, экран /ads/creatives, наборы, архив, медиатека. Критерии docs/night/cre-ACCEPTANCE.md, копия C:/tmp/fl-wt/cre, стенд :3205.
✓ Выкачено 13.10.2026. Экран /ads/creatives на проде открывается, 3 дизайн-системы, 0 ₽; галерея 294 макета на /itogi/dashboard-2026-10-02/gallery/; регресс 75/76 (галерея вне образа).
feature
cre · 1. Три бренд-кита.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 2. Шесть-восемь раскладок без рамок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 3. Нет рамок у СММ Агента и ИСКРЫ.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 4. Точные размеры.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 5. Вес для Директа ≤ 512 КБ
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 6. Ничего не наезжает.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 7. Контраст ≥ 4.5
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 8. Кегль не меньше пола
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 9. Текст не на лице.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 10. Автоподбор отдаёт 2–3 разных лучших раскладки
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 11. Fit&Lead через существующий движок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 12. Маркировка.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 13. Лимиты текстов площадок.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 14. Экран «Реклама → Креативы».
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 15. Набор сохраняется и редактируется.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 16. Скачать по одному и архивом.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 17. В медиатеку с метаданными.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
cre · 18. Галерея-эталон
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-cre 75/76 (п.18 галерея: вне образа, опубликована на странице итогов /itogi/dashboard-2026-10-02/gallery/). Отчёт: C:/tmp/fl-wt/cre/docs/night/cre-REPORT.md
acceptance
mon · ИИ-монтажёр и карусели для соцсетей
Заказ → ассистент монтирует (Remotion) → версии с раскадровкой и комментариями по таймкоду → «Принять» в медиатеку; окно ассистента под ключом; быстрая склейка ffmpeg без ассистента; карусели в стиле проекта без денег; синтез голоса только через гейт. Критерии docs/night/mon-ACCEPTANCE.md, копия C:/tmp/fl-wt/mon, стенд :3206.
✓ Выкачено 13.10.2026. «Контент → Монтажная» на проде, окно ассистента выключено (MONTAGE_TOKEN пуст, ждёт решения владельца), загрузки >10 МБ работают (слой загрузок), регресс 22 + 18 без красных.
feature
mon · 1. Пункт меню и экран.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 2. Заказ заводится со всеми полями, текст владельца дословно.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 3. Материалы.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 4. Синтез голоса — только через гейт.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 5. Статусы и переходы.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 6. Версии с раскадровкой.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 7. Комментарии с таймкодом и правки.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 8. Принято → медиатека и карточка.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 9. Без ключа окно выключено.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 10. Ассистент берёт заказ и получает всё для работы.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 11. Стиль проекта одним ответом для шаблонов Remotion.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 12. Ассистент сдаёт версию файлом и отвечает на комментарий.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 13. Текст владельца не переписывается.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 14. Склейка по формату.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 15. Фоновое задание, журнал, отмена.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 16. Карусель в стиле проекта, без денег.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 17. Один слайд отдельно.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 18. «Создать → Карусель» умеет бренд-кит.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 19. Карта и навык.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
mon · 20. Сборка.
✓ ОТК 02.10 (3 круга) + итоговый регресс на слитом коде и свежей копии боевой базы: night-mon 22/0 красных + check-montage-otk 18/0. Отчёт: C:/tmp/fl-wt/mon/docs/night/mon-REPORT.md
acceptance
↑ Слияние направлений, ОТК, страница итогов, выкатка по «да»
Интеграционная копия из шести направлений → next build + экзамены + снимки экранов на стенде → ОТК → страница итогов владельцу → выкатка пачкой ТОЛЬКО по «да»: бэкап базы, миграции, кроны, VK_TOKEN из хранилища, скрипты исправления данных (задача Артёма cmukz4bquajhmo13l6pgrynoj → «На проверке», 3 зомби Битрикса). После выкатки убрать клоны night/fitlead_wt_* из боевого Postgres (по согласованию).
✓ Выкачено 13.10.2026 по «да» владельца. Перед выкаткой влиты правки прода за 11 дней (завод статей), после — правки соседней сессии MCP (20261013090000_mcp) учтены, C:/tmp/fl-wt/int = зеркало прода (md5). Бэкапы: /root/backups/fitlead-2026-10-13-pre-s29.sql.gz, fitlead-dash-code-pre-s29-2026-10-13.tgz, образ fitlead-dash-app:pre-s29. 7 миграций, скрипты данных, 5 новых кронов, проверка экранов под владельцем.
⛔ Ждёт «да» владельца на выкатку. Страница итогов: https://marketing.fit-lead.ru/itogi/dashboard-2026-10-02/ ; ранбук C:/tmp/fl-wt/DEPLOY-PLAN.md ; код C:/tmp/fl-wt/int (слияние node C:/tmp/fl-wt/merge.mjs).
infra
ИНЦИДЕНТ 02.10: marketing.fit-lead.ru резолвится в 80.87.105.150 после переезда сммагент.рф — дашборд недоступен
A-запись marketing.fit-lead.ru = 80.87.105.150 (сервер техотдела, сммагент.рф), NS netangels; сервер дашборда 80.90.184.203. Последние внешние запросы в nginx 02.10 11:52 UTC, переезд Димы 09:48–10:25 UTC. Нужно вернуть A-запись (техотдел, Дима/Миша). Черновик сообщения: FitLead-База-Знаний/ночь-2026-10-03/otvety-v-chaty.md.
✓ Закрыто 05.10: Михаил вернул A-запись (в переписке: «вместо маркировки маркетинг исправил», поправил на 80.90.184.203). Проверено 06.10: getent hosts marketing.fit-lead.ru = 80.90.184.203, https://marketing.fit-lead.ru/seo-plan/smm-agent/ отдаёт 200, /seo/factory 307 на вход. Миша сказал, что техотдел думает про резервный переключатель.
bug
В РАБОТЕS28 · С30 · АвтоКП: форматы проджектов, КП после встречи, ручной режим21/24

Цель: Забрать в АвтоКП блоки ручных КП проджектов (Азимут, Bioniq, Шефмаркет, KEWO): меню форматов по прайсу, КП после встречи, ручной режим. Плюс документ в ДО для Влада и шаблон PPTX в стиле АвтоКП.

↑ Документ в ДО «AI агент — Авто КП» на согласование Владу + АвтоКП по 4 брендам рядом с ручными
Поручение Нины 07.10: Влад и Анна на оперативке сказали «авто КП не делаем», Нина не утвердила. Документ: два уровня КП (первое касание само, после встречи проджект дописывает), что работает, что забрали у проджектов, пилот, стоимость, интеграция.
✓ Документ, DOCX и вложения (4 КП АвтоКП рядом с ручными, шаблон PPTX): https://marketing.fit-lead.ru/dokumenty/avtokp/ . Отправку в ДО Владу делает владелец.
feature
↑ Шаблон PPTX в стиле АвтоКП для проджектов (Canva открывает)
Проджекты копируют шаблон Азимута в Canva/PowerPoint. Шаблон: Inter, #005856/#FDF000, контур мастера, 14-16 образцовых слайдов. Репо fitlead-avtokp: templates/, scripts/kp-pptx-template.py.
✓ templates/kp-template-fitlead.pptx, 16 слайдов в стиле АвтоКП v2 (Inter, #005856/#FDF000, контур мастера), генератор scripts/kp-pptx-template.py, README; превью проверены через PowerPoint. Импорт в Canva не проверен (нет доступа).
feature
↑ АвтоКП: меню форматов по прайсу, КП после встречи, ручной режим
Критерии Ф1-Ф17 в docs/ACCEPTANCE.md (С30), экзамен tests/spec/kp-formats.mjs. Работа локально + стенд /opt/avtokp-test; прод только по «да».
✓ Сделано на стенде, ОТК зелёный за 3 круга. На прод не выкачено: ждёт «да» владельца и решения, где жить (техотдел CDT-1072).
feature
Ф1. В полном КП экран «Форматы и цена»: 3-5 форматов под тематику и тип бизнеса, цена по прайсу; полное 10 экранов, медиакит 7 без цен
✓ Ф1 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф2. Цена формата из прайса по ступеням и формулой: бартер 10×4 000=40 000, 30×3 000=90 000, 50×2 000=100 000; UGC 10×5 000=50 000 + ведение 20%
✓ Ф2 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф3. Эксперты только в тематиках с составом/медициной; посылки авторам только брендам и магазинам
✓ Ф3 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф4. CPA и гибрид только у бренда со спросом в Яндексе от порога KP_CPA_MIN_DEMAND (10 000), условия из прайса
✓ Ф4 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф5. С 15.10 по 20.12 КП предлагает новогоднюю волну модулем, в другие даты нет
✓ Ф5 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф6. В финале «От вас» перечислено, что уточняем перед финальным расчётом
✓ Ф6 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф7. Режим «после встречи»: механика формата и три сценария, KPI и отчёт, гарантия и маркировка, почему Fit&Lead
✓ Ф7 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф8. Бриф встречи показывается экраном «Что мы услышали», без брифа экрана нет
✓ Ф8 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф9. Большая идея и крючки менеджера (или черновик ИИ по флагу) экраном, без них экрана нет
✓ Ф9 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф10. «Рынок в цифрах» с источником только у тематик из market.json
✓ Ф10 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф11. До 5 своих экранов менеджера в выбранном месте КП
✓ Ф11 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф12. В /admin «Править» у каждого КП: режим, экраны, бриф, идея, форматы, свои экраны, контакт; «Сохранить» пересобирает
✓ Ф12 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф13. Не открытое клиентом КП правится по той же ссылке; открытое даёт новое КП, старое «есть новее»
✓ Ф13 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф14. PATCH /api/v1/proposals/<slug> с токеном; без токена 401, неизвестный 404
✓ Ф14 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф15. api/kp/kp-final не краснее, чем до спринта (19/19, 15/15, 7/8)
✓ Регресс зелёный: api 19/19, kp 15/15, kp-final 7/8 (тот же известный красный, что до спринта), clean ok. Экзамены после их коммита 3b1731c не тронуты.
acceptance
Ф16. 28 тематик в режиме «после встречи» без ошибок и пустых экранов, PDF печатается
✓ Ф16 зелёный в kp-formats.mjs. Стенд cfru /opt/avtokp-test, ветка s30-formats (коммит 2e94039): tests/spec/kp-formats.mjs 15/15; регресс api 19/19, kp 15/15, kp-final 7/8 (известный красный 89/123), clean ok; ОТК 3 круга, проверки исправлений 16/16 и 10/10.
acceptance
Ф17. PROJECT.md, BITRIX-INTEGRATION.md, CATALOG.md обновлены
✓ PROJECT.md (режимы, 17 экранов после встречи, правка, открытия, PDF), BITRIX-INTEGRATION.md (brief/idea/custom/formats/asOf/blocks, PATCH 4.6, пределы, 400, открытия, PDF при отправке), CATALOG.md (formats.json, market.json), SCOPE-CUTS-LOG.md.
acceptance
↑ CDT-1072: печать «Авторов» и «Кейсов» целиком в лист A4
Запрос техотдела (Дмитрий Васюткин, Linear CDT-1072, 08.10): PDF уходит клиенту, у экранов «Авторы» и «Кейсы» срезался низ. Замер до правки: во всех 28 тематиках кейсы длиннее листа на 241 px, авторы на 63 px (112 px при длинном бренде). Правка только для печати: фото и скрины из своих листов пониже в том же контуре, цифры кейса в ряд, открытые кейсы плотнее. Репо fitlead-avtokp, ветка logonchek/cdt-1072-print-a4. Экзамен tests/spec/print-fit.mjs.
✓ ОТК 3 круга зелёный. Коммит 7f79533 в ветке logonchek/cdt-1072-print-a4 (GitHub Logonchek/fitlead-avtokp), стенд /opt/avtokp-test с правкой. Ждёт «да» владельца: слить в main и ответить Дмитрию в Linear (черновик в чате).
feature
П1. В PDF каждый экран целиком на своём листе A4 с полем 4 мм снизу: 28 тематик, полное КП (Mixit), длинный бренд у крупного клиента, медиакит, после встречи
✓ tests/spec/print-fit.mjs на стенде /opt/avtokp-test: до правки 0/112 (12 листов на 10 экранов), после 112/112 «1/1 зелёных». Локальный замер: бренд 5–120 знаков, строчные и широкие заглавные, 325 реальных троек авторов — 0 случаев с полем меньше 4 мм, худший запас 27 px; кейсы 49 px. Настоящий PDF серверным Chromium: 10 листов, фото и скрины на месте. Только оформление v2 (v1 оговорён в документации).
acceptance
П2. В браузере КП выглядит как раньше: правка только для печати, согласованный вид не меняется
✓ Попиксельно main против правки: 420 полностраничных снимков (28 тематик × полное, длинный бренд, после встречи, бренд 40 и 75 знаков × ширина 1440/900/390), различий 0. Новые правила только внутри @media print.
acceptance
П3. Регресс: api, kp, kp-final, kp-formats не краснее, чем до правки
✓ Стенд после правки: api 19/19, kp 15/15, kp-formats 15/15, kp-final 7/8 (тот же известный красный «подписчики 89 из 123», был до правки), clean ✓. Старые экзамены не тронуты (git diff main -- tests: только новый print-fit.mjs).
acceptance
ревьюS29 · С31 · Завод статей: макеты постов, волна 2 СММ, партия 2 ИСКРЫ, Маркер в эфир13/15

Цель: Решения владельца 08.10: «маркер да ок», «да делай, трать» (10 ИСКРА + 10 СММ с макетами постов, обложки ≈60 ₽), баг блога сммагент.рф — Дмитрию в Linear. Статьи СММ визуально богаче: 3–4 картинки, из них 1–2 макета поста.

↑ Движок: вид картинки «макет поста» и до 4 картинок в статье
infographic.ts: kind post (карточка ВК/Телеграм/MAX: автор|подпись, абзацы до 320, пояснения itemsB, хештеги result). quality.ts: до 4 инфографик, лимиты post. Экзамены tests/spec/factory-post.mjs, критерии ACCEPTANCE «Спринт 31».
✓ Вид post (карточка ВК, пузырь Телеграм/MAX, пояснения справа, без лайков) + до 4 картинок. Выкачено 08.10 14:02 UTC, бэкап /tmp/fl-bak-20261008/. Экзамены 4/4, регресс чистый. Карта ARTICLE-FACTORY.md «Картинки».
feature
Статья с макетом поста (автор, 2 абзаца, пояснения) проходит проверку завода
Критерий приёмки С31
✓ 08.10 14:05 UTC, прод marketing.fit-lead.ru: node tests/spec/factory-post.mjs → 4 ✓ 0 ✗; «✓ Статья с макетом поста проходит проверку завода».
acceptance
Статья с 4 картинками принимается, с 5 — отклоняется с причиной «не больше четырёх»
Критерий приёмки С31
✓ 08.10 14:05 UTC, прод marketing.fit-lead.ru: node tests/spec/factory-post.mjs → 4 ✓ 0 ✗; «✓ 4 картинки принимаются, 5 — 422 „не больше четырёх“».
acceptance
Макет поста рисуется картинкой шириной 1200 для каждой площадки: ВКонтакте, Телеграм, MAX
Критерий приёмки С31
✓ 08.10 14:05 UTC, прод marketing.fit-lead.ru: node tests/spec/factory-post.mjs → 4 ✓ 0 ✗; /api/factory/infographic отдаёт JPEG 1200 для ВКонтакте, Телеграм, MAX; глазами проверено локальным снимком.
acceptance
Абзац макета длиннее 320 знаков или площадка не из списка — отклоняется с понятной причиной
Критерий приёмки С31
✓ 08.10 14:05 UTC, прод marketing.fit-lead.ru: node tests/spec/factory-post.mjs → 4 ✓ 0 ✗; абзац 321 знак, автор 91 знак, «Одноклассники» — 422 с причинами 320/90/площадка.
acceptance
Регресс: экзамены завода factory.mjs и factory-index.mjs без новых красных
Критерий приёмки С31
✓ factory.mjs (EXAM_SKIP_DEMAND=1): 0 ✗, пропуски только платные/публикация; factory-index.mjs 9 ✓ 0 ✗ 2 пропуск.
acceptance
Маркер: 17 статей волны 1 в очереди, стоп снят
«маркер да ок» 08.10. Приём C:\tmp\marker-articles\accept_ready.sh (сначала DRY=1: 17/17 ok).
✓ 08.10 13:45 UTC: 17 статей ready (без картинок, трат нет), factory:state:marker on:true. Первая выйдет пт 09.10 10:00 МСК, далее пн/ср/пт по одной.
feature
ИСКРА: партия 2 — 10 статей (план завода, темы 11–20)
Бриф C:\tmp\uiskra-articles-2\BRIEF.md. Холостая проверка заводом, приём с обложками (~30 ₽, «трать» 08.10).
✓ 10 статей (темы 11–20) написаны, проверки завода ok, приняты с обложками на паузе (held, 30 ₽). Страница согласования https://marketing.fit-lead.ru/blog-preview/iskra-2/ — после «ок» владельца held → ready. 08.10: «статьи вроде ок» владельца → held→ready, в очереди.
feature
СММ Агент: волна 2 — 10 статей с макетами постов
Бриф C:\tmp\smm-articles-2\BRIEF.md: 8 профессий PROF_W2 + gotovye-posty + posty-dlya-telegrama, 3–4 картинки в статье.
✓ 10 статей волны 2, в каждой 4 картинки (2 макета поста ВК/Телеграм/MAX + схема + чек-лист), проверки ok, held, 30 ₽. Страница https://marketing.fit-lead.ru/blog-preview/smm-agent-2/ — после «ок» held → ready. 08.10: «статьи вроде ок» владельца → held→ready, в очереди.
feature
Техотделу (Linear CDT-1142): свежий список блога, статьи в sitemap, файлы IndexNow, галочка Маркера
https://linear.app/cdto-fitlead/issue/CDT-1142 — исполнитель Дмитрий Васюткин. Проверка: factory:index:* статус sent, sitemap сммагент.рф со статьями.
feature
↓ Обход кэша списка блога со стороны завода
После выхода статьи крон factory-live открывает /blog, чтобы пересборку списка запускал он, а не первый читатель. Ждёт решения владельца.
✓ 08.10 16:06 UTC выкачено (бэкап /tmp/fl-bak-20261008b), tests/spec/factory-fixes.mjs 4 ✓ 0 ✗; регресс factory 16 ✓ 0 ✗, post 4/4, index 9/0/2. factory-live час после выхода статьи открывает siteBlogBase проекта, ответ warmed[].
feature
↑ Движок: подписи вида «цикл» вылезают за край картинки
infographic.ts cycle(): зажать bx в [0, W−bw], bw 260. 08.10 в двух статьях заменено на steps. Ждёт «да» на выкат.
✓ 08.10 16:06 UTC выкачено (бэкап /tmp/fl-bak-20261008b), tests/spec/factory-fixes.mjs 4 ✓ 0 ✗; регресс factory 16 ✓ 0 ✗, post 4/4, index 9/0/2. cycle: холст 780, ширина боковой подписи по месту до края, верхняя прижата над узлом.
feature
↑ Движок: одновременное рисование схем — Chromium падает на общей папке профиля
renderInfographic: --user-data-dir=<mkdtemp>. 08.10 две статьи упали в waiting_assets при параллельном приёме. Ждёт «да».
✓ 08.10 16:06 UTC выкачено (бэкап /tmp/fl-bak-20261008b), tests/spec/factory-fixes.mjs 4 ✓ 0 ✗; регресс factory 16 ✓ 0 ✗, post 4/4, index 9/0/2. --user-data-dir на каждое рисование; 4 параллельные схемы — все 200.
feature
↑ Движок: повтор картинок кроном снимает паузу (hold) и ставит статью в очередь мимо согласования
publisher.ts: waiting_assets дорисовывается с целью ready. Хранить намерение hold. 08.10 обе упавшие возвращены в held до крона. Ждёт «да».
✓ 08.10 16:06 UTC выкачено (бэкап /tmp/fl-bak-20261008b), tests/spec/factory-fixes.mjs 4 ✓ 0 ✗; регресс factory 16 ✓ 0 ✗, post 4/4, index 9/0/2. статус waiting_assets_held → при повторе held; ручной повтор POST /api/factory/retry-assets.
feature
↑ Варианты дизайна статей СММ Агента (3–5) — «дизайн слабый, докрутить»
Владелец 08.10: «дизайн по смм агенту слабый, накидай 3–5 вариантов классных и стильных». Страница вариантов на marketing.fit-lead.ru, исходники C: mp\smm-design\.
✓ 5 вариантов на настоящей статье: https://marketing.fit-lead.ru/blog-preview/smm-agent-design/ . Рекомендация: «Как в приложении» + типографика «Журнала». Ждёт выбора владельца.
feature
готовS30 · С32 · Пакет «Реклама» для Claude Артёма17/17

Цель: Артём ведёт Директ и ВК Fit&Lead через свой Claude Code по нашему циклу: правила, сборка, креативы в фирменном стиле, разбор и улучшения, журнал трат и правок для отчёта по факту.

↑ Скилы и справочники: fl-start, fl-direct, fl-vk, fl-kreativy, fl-analiz, fl-uluchshenie
Знания из карт Директа, ВК, стиля и разборов, очищенные от сторонних проектов. Офферы черновиком с пометкой до 22.10.
✓ Критерии закрыты с доказательствами, ОТК 3 круга.
feature
↑ К1. В пакете ноль упоминаний сторонних проектов и ноль ключей: проверка поиском по списку запрещённых слов зелёная
✓ Экзамен чистоты (по границам слов + шаблоны токенов) 2/2 зелёный; лежит ВНЕ пакета, сканирует пакет перед сборкой архива; распакованный архив: grep запрещённых слов = 0, служебных файлов = 0.
acceptance
↑ К2. Шесть скилов срабатывают по своим словам («собери кампанию в Директе», «реклама ВК», «сделай креатив», «разбор РК», «что улучшить»), каждый ведёт по шагам и открывает нужный справочник
✓ 6 скилов с описаниями-триггерами; Claude Code сам обнаружил fl-* в установленной копии; сверка со спекой (ОТК проход 1): все команды и флаги из скилов существуют, тексты приведены к коду.
acceptance
↑ Инструменты доступа: Директ, Метрика, ВК с журналом изменений
Обёртки API без лишних зависимостей; любое изменение и трата пишутся в журнал; прямые вызовы мимо обёрток блокирует хук.
✓ Живая сверка Директа закрыта 20.10.2026 (К4, К6, К10 зелёные), архив fitlead-reklama-2026.10.20.zip.
feature
↑ К3. «Проверка доступов» на машине Артёма по-русски говорит, что подключено, а что нет и как подключить (Директ, Метрика, ВК, Kie)
✓ dostup.mjs на живых ключах Fit&Lead: Метрика (право edit), ВК (кампаний 2), Битрикс (11 689 лидов) — да; Директ честно «пустой ответ 204, не ноль»; без ключей таблица из 8 строк «что сделать». Вебхук по http не отправляется (экзамен dostup.test).
acceptance
↑ К4. Отчёт Директа за 7 дней по кабинету Fit&Lead сходится с дашбордом до рубля (ждёт 200, тот же ReportName)
✓ 20.10.2026 живьём на porg-prrtabgy: отчёт пакета за 13–19.10 = дашборд spend_daily до копейки, итог 28 761,62 ₽ / 374 клика / 8 751 показ, по 7 кампаниям расхождение ≤ 0,01 ₽ (округление сумм по дням). Попутно найдено и починено: ошибка 56 «1 раз в 10 секунд» принималась за суточный лимит Вордстата (теперь ждёт 11 с и повторяет), v4 Live выключен Яндексом (509): Вордстат и остаток честно отвечают, где смотреть руками. Экзамены пакета 129/129 (новый test/rate-v4.test.mjs 8/8), архив 2026.10.20.
⛔ API Яндекс Директа с 11.10 отвечает 204 на любой запрос (со всех машин, даже без ключа); живую сверку расхода с дашбордом сделать нельзя. Офлайн-экзамены отчёта (201→200, тот же ReportName, 204 = «нет данных») зелёные.
acceptance
↑ К5. Каждое изменение в Директе или ВК через обёртку оставляет строку в журнале: когда, что, сколько денег затронуто, ответ площадки
✓ gate: без --da 0 запросов, с --da строка журнала (и при ошибке, с partial); строгий --da (`--da нет` = отказ); предохранитель закрывает fetch/node -e/-p/heredoc/bun/WebClient/xargs и выпуск ключа ВК, не мешает коммитам и урокам; экзамены core/zhurnal-hook/vk/direct.
acceptance
↑ Проверки перед запуском: Директ и ВК
Код находит нарушения стандарта на живой кампании, красное = не запускать.
✓ Живая сверка Директа закрыта 20.10.2026 (К4, К6, К10 зелёные), архив fitlead-reklama-2026.10.20.zip.
feature
↑ К6. Проверка Директа на живой кампании Fit&Lead находит известные дыры (нет минус-слов на кампании, метки без номера кампании, включённые автофункции, нет исключения до 18)
✓ 20.10.2026 живьём: proverka-direct на поиске 714106836 нашла все 4 известные дыры: нет минус-слов на кампании (КРАСНОЕ), utm_campaign=reklamodatel без номера (КРАСНОЕ), до 18 не исключено (КРАСНОЕ, корректировка 25), автофункции (жёлтое: категории автотаргетинга ALTERNATIVE/COMPETITOR/BROADER/ACCESSORY, альтернативные тексты, интерес к региону). Итог: красное 3, жёлтое 11, зелёное 13, код выхода 2. Мастер 714132866 по отчётам: метки без номера, 100% денег через автотаргетинг.
⛔ Живой Директ недоступен (204 с 11.10). Офлайн: proverka-direct на заготовках ловит минус-слова, {reklamodatel}, до 18, интерес к региону, альтернативные тексты, автотаргетинг, счётчик посадочной.
acceptance
↑ К7. Проверка ВК на кампании сообщества находит «одна вертикаль 607×1080 вместо четырёх форматов» и «сегмент и интересы в одной группе»
✓ proverka-vk --plan 31474749 вживую: 12 красных, в т.ч. «во всех 8 объявлениях только вертикаль 607×1080 (2 площадки из 10, с 4 форматами 9 из 10)» и «сегмент + интересы во всех 4 группах»; код выхода 2.
acceptance
↑ Креативы: движок стиля локально + генерация фото с журналом
Тот же движок, что в дашборде (мастер Figma, рамка, свободные зоны, баннеры Директа), одной командой; фото через ключ Kie владельца с лимитом.
✓ Критерии закрыты с доказательствами, ОТК 3 круга.
feature
↑ К8. Из одного фото и заголовка одна команда выдаёт 4 картинки ВК точных размеров, 1:1 и 16:9 для Директа и 8 баннеров, ворота качества без коллизий, лист превью
✓ kreativ.test 11/11: точные размеры vk/direct/post, баннеры ≤512 КБ, лист просмотра; глазами смотрел 6 картинок. Уточнение К8 после ОТК: текст на лице = брак, портрет крупным планом в 16:9 честно «не готов».
acceptance
↑ К9. Генерация фото: пробный прогон показывает «будет оплачено новых: N»; повтор того же запроса не платит; без ключа понятная ошибка
✓ gen.test 14/14: пробный прогон 0 оплат; повтор бесплатен; дубль промпта в партии отклоняется; 5xx и код 500 в теле = «зависло», повтор без проверки запрещён; без ключа ни одной отметки; 404 не пишет файл.
acceptance
↑ Разбор РК кодом
Неделя против прошлой, кампании Директа с формами по цели и ВК по группам, сигналы считает код, выводы пишет Claude.
✓ Живая сверка Директа закрыта 20.10.2026 (К4, К6, К10 зелёные), архив fitlead-reklama-2026.10.20.zip.
feature
↑ К10. Разбор недели собирает Директ, Метрику и ВК в таблицу по кампаниям с сигналами; цифры 2–3 кампаний сверены с дашбордом
✓ 20.10.2026 живьём: razbor.mjs за 13–19.10 против 06–12.10 собрал Директ, Метрику (формы) и Битрикс за 22 с, 7 сигналов. Сверка с дашбордом: 714132866 11 535,85 = 11 535,85; 714742850 6 536,54 = 6 536,54; 714106836 2 551,23 = 2 551,23; итог 28 761,62 = 28 761,62. Лиды CRM с меткой Яндекса 10, привязано 9. ВК в этом прогоне пропущен флагом (ВК сверен 12.10).
⛔ Разбор за сентябрь вживую: Битрикс (73 лида, «не привязаны: reklamodatel»), ВК по группам, 65 с / 87 МБ; Директ и Метрика-по-Директу «нет данных» (Директ 204, Метрика 503). Сверка цифр Директа с дашбордом ждёт API.
acceptance
↑ Упаковка, установка, инструкция Артёму
Архив пакета, установка в Claude Code на Windows, первый запуск, как получить ключи.
✓ Критерии закрыты с доказательствами, ОТК 3 круга.
feature
↑ К11. Пакет ставится с нуля в чистую папку по инструкции, после установки Claude видит шесть скилов, проверка доступов запускается
✓ Установка из архива fitlead-reklama-2026.10.12.zip в пустой домашний каталог: скилы, предохранитель, рабочая папка, библиотеки, проверка доступов — да; повторный запуск идемпотентен.
acceptance
В РАБОТЕS31 · С33 · АвтоКП: правки Влада — PowerPoint, Google Презентации, «Почему так», рынок18/27

Цель: По встрече с Владом 12.10.2026 и его сообщениям 09.10: КП выгружается в PowerPoint и Google Презентации для правки менеджером, экран-пояснение выбора площадки и формата, рынок у всех 28 тематик, тексты без ИИ-оборотов, «Наши блогеры для бренда», живое фото на обложке, «Как мы работаем» под формат, замена блогера. Показ Владу чт–пт 15–16.10. В репозитории fitlead-avtokp метка спринта С32 (docs/ACCEPTANCE.md, tests/spec/kp-s32-*.mjs, ветка s32-vlad).

↑ PowerPoint: КП скачивается редактируемым .pptx из снимка
Python-сборщик шаблона (scripts/kp-pptx-template.py) учится заполнять слайды из снимка КП (kp_proposals.html). Кнопка на странице менеджера + GET /api/v1/proposals/<адрес>/pptx по токену. Python в образе сервиса.
✓ Сделано на стенде: scripts/kp_pptx.py из HTML-снимка поверх шаблона, кнопка у менеджера и GET /api/v1/proposals/<адрес>/pptx; В1–В5 зелёные
feature
В1. На странице менеджера «PowerPoint»: .pptx этого КП, слайдов столько же, сколько экранов, в том же порядке
✓ tests/spec/kp-s32-pptx.mjs на стенде /opt/avtokp-test 12.10: ✓ (ссылка «PowerPoint» на /admin/kp/<адрес>, .pptx, слайдов = экранов, порядок совпал)
acceptance
В2. Каждый видимый текст экрана есть на его слайде; правка КП даёт новый файл
✓ kp-s32-pptx.mjs ✓: весь видимый текст каждого экрана на его слайде (0 расхождений), контакт менеджера на финале, правка intro → новый файл с правкой
acceptance
В3. Тексты редактируются как текст, нет подсказок в [скобках], фото и скрины на местах
✓ kp-s32-pptx.mjs ✓: 0 подсказок в [скобках], картинки обложка/авторы/кейсы на местах, тексты редактируемые (a:t)
acceptance
В4. GET /api/v1/proposals/<адрес>/pptx с токеном; без токена 401, неизвестный адрес 404, клиентская ссылка файл не отдаёт
✓ kp-s32-pptx.mjs ✓: API с токеном 200 pptx; без токена 401; чужой токен 401; неизвестный адрес 404; /kp/<адрес>/pptx не отдаёт файл
acceptance
В5. 28 тематик × полное, медиакит, после встречи выгружаются без ошибок; 3 файла открыты в PowerPoint
✓ kp-s32-pptx.mjs ✓: 84 файла (28 тематик × полное/медиакит/после встречи) собраны и читаются python-pptx; полное (11 сл.), после встречи (14), медиакит (7) открыты в PowerPoint и сняты PNG 12.10
acceptance
↑ Google Презентации: копия КП по кнопке через OAuth-клиент владельца
Загрузка .pptx в Google Drive с конвертацией в Slides, ссылка на редактирование. Токен через Nango (клиент проекта lia1231), подключение drive.file — владелец нажимает «Разрешить» один раз. Без ключей кнопки нет, есть инструкция.
✓ Работает на стенде с настоящим Google-аккаунтом: кнопка у менеджера и POST /api/v1/proposals/<адрес>/google; одна презентация на версию КП; доступ по ссылке «правка всем» (решение владельца: anyone или домен)
⛔ ждёт «Разрешить» владельца по ссылке Nango (avtokp-google); без ключей работает инструкция (В7 зелёный)
feature
В6. С ключами Google кнопка создаёт презентацию и отдаёт ссылку на редактирование; повтор по той же версии отдаёт ту же
✓ 12.10 владелец дал доступ (Nango avtokp-google, drive.file, клиент lia1231); kp-s32-google.mjs на стенде: ✓ В6 (презентация создаётся, повтор отдаёт ту же), ✓ В7
⛔ ждёт владельца: «Разрешить» доступ к Google Диску (Nango-подключение avtokp-google); сторож на стенде сам запишет ключи и прогонит экзамен
acceptance
В7. Без ключей кнопки нет, на её месте инструкция; ошибка Google по-русски, КП и PowerPoint работают
✓ kp-s32-google.mjs ✓ на стенде без ключей: кнопки нет, инструкция «скачайте PowerPoint… Открыть с помощью → Google Презентации», API 503 по-русски, КП и PowerPoint работают
acceptance
В8. Живой прогон на 3 КП: слайдов столько же, тексты на месте, шрифт Inter (снимки)
✓ 13.10 владелец нашёл в Google «текст уехал» (обложка, «Кто мы», «Идеи», «Следующий шаг») — критерий уточнён: тексты не вылезают и не наезжают, вид как в PowerPoint. Причина: Google переводит точный интервал в проценты от кегля (+21%) и не переносит сжатие букв. Сборщик b5: интервал долей от высоты строки Inter, переносы без сжатия. Доказательство: 12 слайдов КП Mixit сняты через Slides API и сверены с PowerPoint попарно, расхождений нет; длинный бренд и самые длинные идеи (медицина, приложения) проверены в PowerPoint. Итоговая презентация: docs.google.com/presentation/d/1VXWktyfAukJDfrvRDxBIUvgDmITvobLJQBWZMCEhyUg. Регресс: kp-s32 vlad 4/4, why 2/2, market 1/1, swap 1/1, pptx 5/5, google 2/2, texts 3/4 (В15 обложка ждёт), kp-formats 15/15, kp 15/15, api 19/19, clean ✓, print-fit 112/112.
⛔ после В6: живой прогон на 3 КП
acceptance
↑ Экран «Почему так»: почему эта площадка и этот формат
Перед «Предлагаем начать». Доводы с цифрами из досье, Вордстата, аудитории авторов, наших кампаний и прайса; считает код. Ответ на вопрос клиентов «почему TikTok, а не Дзен» (Влад 12.10).
✓ Экран reason перед предложением, доводы с цифрой и источником; В9, В10 зелёные
feature
В9. Экран перед предложением: 2–4 довода, у каждого цифра и источник; площадка и формат те же, что на предложении
✓ kp-s32-why.mjs ✓: экран reason перед offer (полное) и mechanics (после встречи), 2–4 довода с цифрой и data-source, площадка/формат совпадают, разрыв 478 тыс. в TikTok назван
acceptance
В10. Без соцсетей бренда доводы по тематике и авторам с подписью; цифр бренда вне досье нет; ИИ цифры не пишет
✓ kp-s32-why.mjs ✓: без соцсетей источники authors/price/cases, подпись «по тематике и авторам подборки», цифр бренда нет
acceptance
↑ Экран «Рынок» у всех 28 тематик, цифры со ссылкой и датой сверки
data/kp/market.json: сейчас 2 тематики из КП KEWO и Bioniq. Собрать открытые цифры рынка по 26 тематикам, сверить с первоисточником, вывести экран в полное КП.
✓ market.json: 28 тематик, 103 цифры со ссылкой, датой сверки и цитатой; экран в полном КП и после встречи; В11 зелёный
feature
В11. 28 тематик: 2–4 цифры, вывод, источник; у каждой цифры ссылка и дата сверки; без них цифра не выходит
✓ kp-s32-market.mjs ✓: 28 тематик, 103 цифры в data/kp/market.json с url+checkedAt+quote; на экране 2–4 цифры со ссылкой «Источник: …»; выборочная сверка 10 цифр с первоисточником 9/10 цитата найдена, 10-я PDF
acceptance
Тексты: «Наши блогеры для бренда», без «а не», правки Влада
Влад 12.10: обороты «X, а не Y» = ИИ-след (около 30 в шаблонах, 22 во фразах авторов). Правки текстом Влад обещал прислать в ТГ.
✓ «Наши блогеры для бренда», без «а не» (В13), правки Влада по списку (В14 а–г) — всё на стенде
feature
В12. Экран авторов «Наши блогеры для [Бренд]» во всех режимах и в PowerPoint
✓ kp-s32-texts.mjs ✓: «Наши блогеры для Mixit» в полном, медиаките, после встречи и в PowerPoint
acceptance
В13. Ни в одном КП 28 тематик (3 режима) и письме нет «…, а не …» и «не …, а …»
✓ kp-s32-texts.mjs ✓: 28 тематик × 3 режима + 4 набора соцсетей + письма без «…, а не …» и «не …, а …»
acceptance
В14. Правки Влада текстом внесены по списку
✓ Правки Влада текстом (ТГ 12.10 18:13, 9 пунктов) внесены; kp-s32-vlad.mjs 4/4 на стенде 13.10: В14а порядок КП по логике проджектов, «Что мы увидели» заменён рынком во всех режимах; В14б «Идеи для контента» 28 тематик (140 заходов, 84 формата, data/kp/ideas.json); В14в «Почему этот кейс»; В14г «проверенные авторы». Печать 112/112 после укорочения строки кейса.
⛔ Влад правки текстом не прислал (12.10 пришли скрин переписки Алины и голосовое про цены «от» у Насти — не про КП)
acceptance
Обложка на живом фото Fit&Lead, «Как мы работаем» под формат
Фото с «Кросс-нации» (Влад). Варианты обложки на выбор владельцу. Шаги процесса разные для платной кампании, бартера, UGC, оплаты за результат.
feature
В15. Обложка по умолчанию на живом фото Fit&Lead, выбранном владельцем
⛔ ждёт выбора владельца: варианты обложки b4–b6 и c4–c6 с живыми фото «Кросс нации» сняты на стенде
acceptance
В16. «Как мы работаем» следует рекомендованному формату
✓ kp-s32-texts.mjs ✓: полное КП → шаги paid; после встречи paid/barter/ugc/cpa → свои шаги, тексты разные
acceptance
Замена блогера в правке КП (мини-конструктор)
Влад 12.10: блогер не подошёл — как поменять. В /admin «Заменить» из авторов тематики; PATCH authors.
✓ Сделано на стенде: input.authors, PATCH authors, «Заменить» в /admin; В17 зелёный
feature
В17. «Заменить» у каждого автора, выбор из авторов тематики, пересборка; PATCH authors; чужой id отклоняется
✓ kp-s32-swap.mjs ✓: «Заменить» у 3 авторов, варианты только из тематики (>3), сохранение по той же ссылке, после открытия клиентом новое КП, прежнее не тронуто, чужой id 422
acceptance
Регресс, документы, ОТК, показ Владу
Все прежние экзамены не краснее; доки для техотдела (12 листов, pptx, Google); ОТК; показ Владу чт–пт.
task
В18. api, kp, kp-final, kp-formats, print-fit не краснее; новые экраны в печати каждый на листе
✓ 12.10 полный прогон на стенде после правок ревью: kp-formats 15/15, print-fit 1/1 (112 PDF по 12 листов, экраны в листе), clean ✓, kp 14/15 и api 18/19 — красное только досье Mixit (mixit.ru перестал отдавать текст, не спринт), kp-final 7/8 (известное «подписчики 89 из 123»)
acceptance
В19. PROJECT.md, BITRIX-INTEGRATION.md, CATALOG.md, templates/README.md обновлены
✓ PROJECT.md (12 экранов, PowerPoint, Google, замена блогера, ключи), BITRIX-INTEGRATION.md (12 листов, 4.7 pptx/google, authors в PATCH), CATALOG.md (market.json), templates/README.md, .env.example, README.md; SCOPE-CUTS-LOG.md С32
acceptance
готовS32 · С33 · MCP дашборда: каркас и подключение18/18

Цель: Сотрудник подключает свой Claude Code или Codex к marketing.fit-lead.ru личным ключом и работает инструментами дашборда со своими правами; ключи кабинетов остаются на сервере; журнал и двухшаговые изменения с оповещением руководителю.

↑ Ключи подключения в профиле и вход по ключу
✓ Ключи flk_ в профиле, вход по ключу, отзыв, политика портальных учёток (живой вход 8 ч). Критерии К1, К5 зелёные.
feature
↑ К1. В профиле человек сам выпускает ключ подключения (показан один раз), видит свои ключи с датой последнего использования и отзывает любой; в базе только отпечаток ключа
✓ Прод 13.10, ОТК 3 круга. Экзамен tests/spec/mcp.mjs «К1. Ключ выпускается в профиле, показан один раз, в базе только отпечаток» ✓; mcp-otk1 «Чужой сайт и не-JSON не выпускают ключ» ✓, «Только просмотр отзывает свой ключ» ✓. Карточка «Подключение Claude и Codex» в профиле.
acceptance
↑ К5. Отозванный ключ и выключенный сотрудник перестают работать сразу (следующий вызов отвечает 401)
✓ mcp.mjs «К5. Отозванный ключ и выключенный сотрудник сразу получают 401» ✓; mcp-otk2 «Выключение гасит ключи, включение обратно их не оживляет» ✓, «Отвязка портала гасит ключи» ✓, «Портальная учётка с истёкшим входом: ключ не работает» ✓; mcp-otk1 «сброс пароля гасит ключи» ✓.
acceptance
↑ Ключ Kie владельца с экрана (решение 13.10)
Владелец сам вставляет отдельный ключ Kie Fit&Lead с лимитом в «Моём профиле», без сервера и .env. Свой ключ важнее ключа сервера для всех картинок дашборда. docs/CREATE.md, docs/ACCEPTANCE.md «Ключ Kie с экрана», экзамены tests/spec/kie-key.mjs, kie-key-otk1.mjs.
✓ На проде 13.10: карточка «Ключ Kie для картинок» в профиле владельца, API /api/settings/kie-key, ключ в app_settings зашифрован. ОТК круг 1: 5 находок проверяющего исправлены (чужая задача 15 с вместо 8 мин и докачка ключом сервера, замер расхода одним ключом, прогрев при старте, гонка кэша, русские буквы в ключе). Экзамены 7/7.
feature
↑ КК1. В «Моём профиле» у владельца карточка: какой ключ работает (свой или общий сервера, последние 4 знака) и остаток
✓ kie-key.mjs «КК1, КК2. Верный ключ сохраняется: карточка показывает свой ключ, 4 знака и остаток» ✓; снимок карточки: «общий ключ сервера …32ba, 1 668 кредитов, около 834 ₽».
acceptance
↑ КК2. Ключ проверяется у Kie бесплатным запросом остатка; неверный не сохраняется, ответ по-русски
✓ kie-key.mjs «КК2. Неверный ключ не сохраняется» ✓; kie-key-otk1 «ключ с русской буквой: 400 лишние символы» ✓.
acceptance
↑ КК3. После сохранения все обращения дашборда к Kie идут через этот ключ без перезапуска
✓ kie-key.mjs «КК3. Обращения к Kie идут через ключ с экрана» ✓ (подменённый в базе ключ сразу ломает чтение остатка). Генерация, обложки, завод: один ключ на заказ и ожидание, замер расхода тем же ключом; регресс factory 25 (0 красных), factory-fixes 4/4.
acceptance
↑ КК4. Ключ зашифрован; на экран, в ответы и аудит только 4 знака; не владелец получает 403
✓ kie-key.mjs «КК4. Не владелец: 403» ✓, «КК4. Хранится зашифрованным, в аудите 4 знака» ✓.
acceptance
↑ КК5. «Убрать свой ключ» возвращает общий ключ сервера
✓ kie-key.mjs «КК5» ✓.
acceptance
↑ Адрес MCP и протокол
✓ POST /api/mcp, JSON-RPC 2.0 без сессий, версии 2025-06-18/2025-03-26/2024-11-05, пачки до 20, 120 вызовов в минуту на ключ. К2 зелёный.
feature
↑ К2. Claude Code и Codex подключаются к marketing.fit-lead.ru одной командой с ключом и видят инструменты (проверено настоящим подключением)
✓ Адрес https://marketing.fit-lead.ru/api/mcp. mcp.mjs «К2. Протокол MCP: initialize, tools/list, уведомление 202, GET 405, без ключа 401» ✓. Claude Code: claude mcp add --transport http; Codex: codex mcp add --url --bearer-token-env-var (проверено настройкой и MCP Inspector, живой сеанс модели Codex не гонялся: SCOPE-CUTS С33 п.3). Desktop/claude.ai: С37.
acceptance
↑ Права, журнал, первые инструменты чтения рекламы
✓ Права, журнал, чтение рекламы. К3, К4, К6 зелёные после круга 4.
feature
↑ К3. Человек видит и вызывает только инструменты своих разделов и проектов; «только просмотр» не может ничего менять; деньги видит только с правом на деньги
✓ Круг 4 (13.10, по «да» владельца): сигнал о крупной паузе больше не пишется в итог плана (только аудит и tg_notify_log). Экзамены: mcp.mjs К3 ✓, mcp-otk1 «рубли скрыты» ✓, mcp-otk2 «журнал без сигнала» ✓, mcp-otk3 «сигнал не виден ни в ответе, ни в итоге журнала, а руководителю уходит» ✓, «constructor, toString, __proto__ отклоняются» ✓.
acceptance
↑ К4. Инструменты кампаний и расхода Директа и ВК отдают те же цифры, что экран «Реклама»; отсутствие данных подписано «нет данных», а не 0
✓ Круг 4: начало сбора по паре проект · площадка (ВК с 17.09.2026, СММ Агент с 14.05.2026). mcp.mjs К4 ✓; mcp-otk3 «сравнение по площадке и проекту» ✓; mcp-otk4 «площадка без сбора в периоде: нет данных и пометка» ✓. Расход с НДС, подсказка модели: дашборд = кабинет ВК × 1,22.
acceptance
↑ К6. Каждый вызов записан в журнал с именем человека, инструментом и итогом
✓ Круг 4: «неизвестно» в журнале отдельно от «не применилось» (ok null с итогом); нулевые символы и половинки эмодзи чистятся в разобранных аргументах, глубже 30 уровней пометка. mcp.mjs К6 ✓, mcp-otk3 «журнал: неизвестно / не применилось / в работе» ✓, «нулевой символ записью и эмодзи на границе» ✓, mcp-otk4 «глубина 40 с нулевым символом» ✓.
acceptance
↑ Двухшаговые изменения и оповещение руководителю
✓ Два шага и сигнал руководителю. К7, К8 зелёные после круга 4.
feature
↑ К7. Изменение идёт в два шага: план (что было → станет, сколько ₽) и применить по номеру плана; без плана и с чужим/просроченным планом не применяется
✓ Круг 4: разбор ответа Директа — чистая функция direct-state.ts: явный отказ = «не применилось» с причиной Директа, пустой/нечитаемый/без этой кампании = «могло примениться»; кнопка паузы на экране пишет неизвестный исход в аудит. mcp.mjs К7 ✓, mcp-otk3 «ответ Директа разбирается честно» ✓ (11 ответов). Живой отказ Директа не воспроизведён: API 204.
acceptance
↑ К8. Изменение больше порога (+5 000 ₽ в день или запуск кампании) сразу приходит руководителю в Телеграм рабочим ботом
✓ Рабочий бот в чат руководителя из настроек РЕКЛ БА, запись в tg_notify_log kind mcp.change. mcp.mjs «К8. Запуск кампании через MCP сразу оповещает руководителя в Телеграм» ✓; mcp-otk1 «Сигнал о запуске реально уходит руководителю рабочим ботом» ✓; mcp-otk2 «Без права на деньги журнал не выдаёт сигнал» ✓. Порог 5 000 ₽/день (MCP_ALERT_RUB).
acceptance
В РАБОТЕS33 · С34 · MCP: реклама, чтение16/17

Цель: Кампании, расход, разрезы, поисковые запросы, лиды и качество, разбор недели, проверки кампаний Директа и ВК через MCP.

Кампании, карточка кампании, история изменений
reklama_kampanii короче по умолчанию; reklama_kampaniya (настройки из слепка, дни, цели, лиды); reklama_istoriya (слепки + изменения через подключение). docs/MCP.md, ACCEPTANCE С34.
✓ На проде с 26.10.2026 12:54 UTC: reklama_kampaniya, reklama_istoriya, короткий reklama_kampanii. Проверка на проде временным ключом владельца (отозван): reklama_kampanii отдал 12 кампаний за 19–25.10 с расходом. Экзамен С34 К1, К2, К11 зелёные на стенде 26.10.
feature
К1. Список кампаний по умолчанию короткий: 25 строк по расходу (без права на деньги по кликам) и пометка «показано N из M»; полный список по vse или limit
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К2. Карточка кампании: состояние, тип, стратегия и бюджет, цель, автофункции, счётчики, расход по дням, конверсии по целям, лиды CRM; расход сходится с экраном; у мастера сказано, что настроек площадка не отдаёт
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К11. История изменений кампании: правки настроек по суточным слепкам (что, когда, было → стало) и изменения через подключение
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
Запросы, условия показа, площадки, разрезы
reklama_zaprosy (ad_search_query_daily + живьём), reklama_usloviya (живой CRITERIA_PERFORMANCE_REPORT), reklama_ploshchadki (ad_placement_weekly + запреты), reklama_razrezy (ad_cuts).
✓ На проде с 26.10.2026: reklama_zaprosy, reklama_usloviya, reklama_ploshchadki, reklama_razrezy. Экзамен 26.10: К4 и К6 зелёные; К3 (свежие запросы живьём) красный из-за очереди офлайн-отчётов Директа («5 отчётов ожидают формирования»), код тот же, что 20.10 прошёл; К5 ждёт решения владельца по экзамену. Перепроверка — задача в «Проверках по сроку».
feature
К3. Поисковые запросы за период по кампании или проекту: расход, клики, конверсии, тип запроса, кандидаты в минус-слова; дни без сбора «нет данных»; «свежие» живьём из Директа
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К4. Условия показа кампании Директа живьём: показы, клики, расход, доля денег, конверсии; доля автотаргетинга посчитана кодом
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К5. Площадки сети: расход, клики, формы Метрики, кандидаты в запрет (деньги без форм, приложения), уже запрещённые помечены
⛔ Код считает площадки сети без поисковых строк (за неделю 12.10 поиск 26 808 ₽ попадал в «сеть»); сверка суммы в экзамене К5 сравнивает со всеми строками, поэтому красная. Экзамен правит только решение владельца: DECISIONS-QUEUE С34–С37 п.1.
acceptance
К6. Разрезы кабинета (устройства, пол и возраст, гео, тип таргетинга, площадка и позиция) с формами Метрики и датами снимка
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
Лиды с рекламы и разбор недели
reklama_lidy (crm_leads с метками рекламы, без персональных данных), reklama_razbor (buildDigest + текст), reklama_razbor_zapisat (saveReview).
✓ На проде с 26.10.2026: reklama_lidy, reklama_razbor, reklama_razbor_zapisat. Экзамен С34 К7 и К8 зелёные на стенде 26.10.
feature
К7. Лиды с рекламы за период: по стадиям и по кампаниям (привязанные и нет), цена качественного с правом на деньги; без имён, телефонов и почты
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К8. Разбор недели: сводка кодом (та же, что у экрана разбора) и текст, если есть; запись текста сохраняет разбор (повтор правит тот же)
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
Проверка кампаний Директа и ВК
reklama_proverka: перенос proverka-direct/proverka-vk пакета в дашборд, живое чтение настроек, мастер по отчётам, совет с инструментом С35.
✓ На проде с 26.10.2026: reklama_proverka для Директа и ВК. Экзамен 26.10: К10 (ВК) зелёный; К9 (Директ живьём) красный только из-за забитой очереди отчётов Директа: проверка мастера шла 7 минут и осталась без доли автотаргетинга. 20.10 тот же код прошёл. Перепроверка в «Проверках по сроку».
feature
К9. Проверка кампании Директа живьём: минус-слова кампании, метки без номера, автофункции, до 18, доля автотаргетинга, счётчик и доступ к нему, цель; мастер по отчётам; красное/жёлтое/зелёное с советом и инструментом
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
К10. Проверка группы VK Рекламы находит «один формат вместо четырёх» и «сегмент и интересы в одной группе»
✓ Стенд fl-wt-mcp 20.10.2026: tests/spec/mcp-c34.mjs полный прогон «Итог С34: 13 из 13»; после правок ОТК круга 2 зелёный (11/13 без К12 флагом, К5 см. блок). ОТК: c34-r1 8/8, c34-r2 11/11. На проде после «да».
acceptance
Сбор Директа под ограничение «1 раз в 10 секунд»
С 19.10.2026 отчёты Директа отвечают 56 «не чаще 1 раза в 10 секунд»: direct_goals падает ежедневно, cuts и queries частично. Общая обёртка отчётов: ждать 11 с и повторять; DIRECT_API_URL и DIRECT_READONLY для стенда и экзаменов.
✓ На проде с 26.10.2026: общая обёртка отчётов Директа (ждёт 11 с и повторяет на 56). К12 26.10 красный: Директ ответил 400 «5 отчётов ожидают формирования в режиме офлайн» по porg-prrtabgy, очередь забил дублирующий прогон экзамена. Новая грабля: брошенный по таймауту офлайн-отчёт остаётся в очереди (лимит 5 на кабинет), следующий вызов с новым ReportName её добивает — записано в SCOPE-CUTS С34+С35 п.6.
feature
К12. Сбор Директа переживает ограничение «1 раз в 10 секунд»: цели, запросы и разрезы собираются (sync_runs ok) вместо ежедневной ошибки 56
✓ Стенд fl-wt-mcp 20.10.2026: К12 в полном прогоне зелёный: direct-goals, direct-queries, cuts ok=true по всем 4 кабинетам (ограничение 56 «раз в 10 секунд» пережито). На проде после «да».
acceptance
готовS34 · С35 · MCP: реклама, изменения16/16

Цель: Минус-слова, площадки, корректировки, пауза и запуск, лимиты и группы ВК, замена картинок: план → применить, журнал, оповещение выше порога.

Директ: минус-слова, площадки, корректировки, автотаргетинг
direct_minus_plan, direct_ploshchadki_plan, direct_korrektirovki_plan, direct_avtotargeting_plan → izmenenie_primenit. Запись через direct-write.ts (fetchDirect, DIRECT_READONLY), перечитывание после записи.
✓ На проде с 26.10.2026 12:54 UTC. Экзамен С35 11/11 и ОТК c35-r1 8/8, c35-r2 11/11 на подменных площадках 26.10 после отделения С36.
feature
К1. Минус-слова кампании и группы: план (добавится, очищено, уже есть), применение пишет полный список и перечитывает; удаление тоже
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К2. Запрет площадок кампании: дописывает к запрещённым с лимитом 1000, перечитывает; снятие запрета
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К3. Корректировки: до 18 лет для всех полов, устройства, пол-возраст; применение заменяет корректировку того же вида
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К4. Категории автотаргетинга сужаются планом во всех группах кампании, применение перечитывает
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
Директ: автофункции, бюджет, статусы, тексты
direct_nastroyki_plan, direct_budzhet_plan, direct_status_plan (объявления, фразы), direct_tekst_plan.
✓ На проде с 26.10.2026. Экзамен С35 К5–К7 зелёные 26.10.
feature
К5. Автофункции кампании (альтернативные тексты, интерес к региону, метка Метрики, мониторинг) включаются и выключаются планом
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К6. Дневной бюджет и недельный бюджет стратегии планом: старое, новое, разница ₽ в день; рост от порога — сигнал руководителю
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К7. Пауза и запуск объявлений и фраз; правка текстов объявления с проверкой длины 56/81 и без длинного тире
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
VK Реклама: статусы, лимиты, замена картинки
vk_status_plan, vk_limit_plan, vk_kartinka_plan. Запись через vk-write.ts (VK_READONLY).
✓ На проде с 26.10.2026: vk_status_plan, vk_limit_plan, vk_kartinka_plan (картинка ссылкой или файлом; путь kreativ_id из С36 из выката убран). Экзамен С35 К8 зелёный 26.10.
feature
К8. VK: пауза и запуск кампании и группы, дневной лимит группы, замена картинки объявления (ссылка или файл) планом
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
Общие правила изменений и подменные площадки
Обобщённый izmenenie_primenit по виду плана; разбор ответа площадки; стенд fl-wt-mcpf с подменным Директом и ВК (tests/fake/platforms.mjs).
✓ На проде с 26.10.2026: общий izmenenie_primenit, разбор ответа площадки. Экзамен С35 К9–К10 зелёные 26.10.
feature
К9. План 30 минут, чужой и повторный не применяются; ответ площадки разобран; «только просмотр» без планов; чужой проект отклонён; журнал и аудит
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
К10. На стенде с живыми ключами изменения отказываются до площадки; экзамены не трогают живые кабинеты
✓ Стенд fl-wt-mcp 20.10.2026: К10 в tests/spec/mcp-c35.mjs зелёный (изменения на стенде с живыми ключами отказываются до площадки, DIRECT_READONLY/VK_READONLY), «Итог С35: 11 из 11». На проде после «да».
acceptance
Директ: новая кампания черновиком и запуск
direct_novaya_kampaniya_plan (кампания, группы, фразы, объявления, быстрые ссылки, уточнения) → черновик; запуск черновика: ads.moderate + campaigns.resume в direct_kampaniya_plan zapusk.
✓ На проде с 26.10.2026: direct_novaya_kampaniya_plan черновиком, запуск через direct_kampaniya_plan. Экзамен С35 К11 зелёный 26.10 (кампания 990005 на подменном Директе).
feature
К11. Новая кампания собирается планом черновиком (стратегия, бюджет, цель, счётчик, минус-слова, запреты, метки, автофункции выкл., группы, фразы, объявления, быстрые ссылки, уточнения); проверки до отправки; ничего не тратит; запуск черновика отдельным планом с сигналом
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c35.mjs «Итог С35: 11 из 11» (после правок ОТК круга 2); ОТК: c35-r1 8/8, c35-r2 11/11. На проде после «да» владельца.
acceptance
готовS35 · С36 · MCP: контент для СММ14/14

Цель: Контент-план, черновики, фото (Kie под лимитом 1 000 ₽/мес), стиль: обложки, карусели, посты, баннеры; согласование; картинки в ответе.

Креативы в фирменном стиле через подключение
kreativ_sobrat / kreativ_peresobrat / kreativ_v_mediateku на движке дашборда (src/lib/brands/studio.ts), креатив в объявление ВК с размером слота и именем слота по пакету группы. Экзамены tests/spec/mcp-c36.mjs, стенд fl-wt-mcpf.
✓ Сделано 27.10 в ветке c36 (C: mp l-mcp), критерии зелёные, ОТК 1 круг + свежий критик правок. На прод не выкачено: ждёт «да» владельца.
feature
К1. kreativ_sobrat: креативы в стиле проекта из фото и заголовка под ВК, РСЯ, соцсети; тексты сверены; набор в «Креативах»; ссылки и превью в ответе; права ads или smm, сохранение с записью
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К1 ✓: набор из 3 креативов, ссылка image/*, картинка в ответе, набор в creative_sets; длинный заголовок и http-фото отклонены; без ads/smm и «только просмотр» не видят. ОТК Р5: kreativ_foto (новый) + сборка из media_id медиатеки и из фото бренда kp:blogger-1-fedorova.webp. Ограничение: у мастера Fit&Lead нет 16:9 (SCOPE-CUTS С36 п.1).
acceptance
К2. kreativ_peresobrat и kreativ_v_mediateku; чужой проект и набор отклоняются
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К2 ✓: другой макет и новый текст (headline в базе), в медиатеке 3; креатив и набор Fit&Lead из чужого проекта отклонены.
acceptance
К3. Креатив дашборда в объявление ВК планом: размер к слоту, имя слота 4:5 по пакету группы
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К3 ✓: пакет 3215 → image_1080x1350, пакет 3122 → image_4_5, 9:16 → image_607x1080, лишнего слота нет. ОТК Р6: kreativ_id вместе с url отклоняется.
acceptance
Фото через Kie: план с ценой, журнал заказов, забрать готовое
foto_plan (цена и лимит, ничего не тратит) → «ок» → izmenenie_primenit заказывает с журналом до вызова (повтор бесплатен) → foto_zabrat. Подменный Kie tests/fake/kie.mjs, экзамены не платят.
✓ Сделано 27.10 в ветке c36 (C: mp l-mcp), критерии зелёные, ОТК 1 круг + свежий критик правок. На прод не выкачено: ждёт «да» владельца.
feature
К4. foto_plan: цена, промпт, остаток лимита до заказа; лимит 0 или нехватка — отказ; нужна запись
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К4 ✓: план 3.8 ₽ с промптом и остатком лимита, у подменного Kie заказов 0; лимит 0 и нехватка — отказ; «только просмотр» foto_plan не видит.
acceptance
К5. Заказ только применением плана; журнал до вызова, повтор не платит, заказанное сразу в лимите; foto_zabrat забирает в медиатеку
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К5 ✓: заказ только применением, 2 строки журнала до вызова, лимит уменьшился на цену, повтор плана и того же промпта не платит, foto_zabrat 2 из 2 в медиатеку, «рисуется» и «не справился» честно. ОТК Р7: зависший заказ старше суток повторно не заказывается, подложенная строка экрана не блокирует; Р8: свежая строка без номера — «рисуется».
acceptance
К6. Экзамены на подменном Kie: ни одного платного вызова
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К6 ✓: KIE_BASE_URL стенда = http://127.0.0.1:4012 (подмена), все 4 заказа экзамена у подмены; ОТК Р9: за прогон ОТК 0 заказов.
acceptance
Контент СММ через подключение: план, черновики, обложки, карусели, согласование
kontent_plan, kontent_sozdat, kontent_izmenit (с версией), kontent_oblozhka, kontent_karusel (бесплатный движок), kontent_na_soglasovanie, kontent_soglasovat. Логика из маршрутов в общие функции.
✓ Сделано 27.10 в ветке c36 (C: mp l-mcp), критерии зелёные, ОТК 1 круг + свежий критик правок. На прод не выкачено: ждёт «да» владельца.
feature
К7. kontent_plan: карточки за период с датой, форматом, рубрикой, стадией, согласованием; «показано N из M»
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К7 ✓: карточка с датой, форматом, рубрикой, стадией, согласованием, числом картинок; «показано N из M». ОТК Р2: limit вне 1–200 и 2026-02-31 — понятный отказ. Масштаб: 3300 карточек, план 200 мс, 10 параллельных 0,9 с.
acceptance
К8. kontent_sozdat и kontent_izmenit; правка хранит версию; длина текста по формату
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К8 ✓: правка хранит прежнюю версию в content_versions, 20 000 знаков отклонены. ОТК Р3: несуществующая дата и 25:00 — отказ, тире в заголовке — отказ. Предел — по соцсетям карточки (пределов по формату в дашборде нет, MCP.md).
acceptance
К9. kontent_oblozhka и kontent_karusel в фирменном стиле бесплатно, к карточке по порядку
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К9 ✓: обложка + 3 слайда, картинки 0,1,2,3, у Kie 0 заказов. ОТК Р1: слайд с ошибкой отклоняется до рисования, на карточке ничего; запись одной транзакцией.
acceptance
К10. kontent_na_soglasovanie и kontent_soglasovat; не согласующий решить не может
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К10 ✓: pending + уведомление approval.requested; не согласующий не может, возврат без замечания отклонён, согласующий согласовал. ОТК Р4: число уведомлённых в ответе = числу уведомлений.
acceptance
К11. Права: раздел «Контент», проект, запись; чужой проект не виден и не меняется
✓ Экзамен tests/spec/mcp-c36.mjs на стенде fl-wt-mcpf 27.10: «Итог С36: 11 из 11»; ОТК tests/otk/c36-r1.mjs 9/9. К11 ✓: без «Контента» инструменты не видны; «только просмотр» видит kontent_plan, не видит правку; карточка Fit&Lead из чужого проекта не меняется и не открывается.
acceptance
готовS36 · С37 · MCP: знания и вход для приложения Claude13/13

Цель: Инструкции сервера, готовые сценарии (prompts), справочники (resources); вход через корпоративный портал (OAuth) для Claude Desktop и claude.ai.

Справочники пакета «Реклама» в подключении: ресурсы, поиск, чтение
Копия пакета в knowledge/reklama/ с версией; resources/list и resources/read по правам раздела «Реклама» и деньгам; spravka_poisk и spravka_chitat. Экзамены tests/spec/mcp-c37.mjs, стенд fl-wt-mcpf.
✓ На проде с 26.10.2026: resources/list отдаёт 24 справочника версии 2026.10.20, spravka_poisk «минус-слова» нашёл 8 кусков (проверено временным ключом владельца, отозван). Экзамен С37 9/9 и ОТК c37-r1..r3 зелёные 26.10.
feature
К1. Все 17 справочников и 6 описаний работы видны с разделом «Реклама» в resources/list и читаются целиком; 4 справочника с деньгами Fit&Lead только с правом на деньги; без раздела справочников нет
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
К2. spravka_poisk находит раздел по словам с другими окончаниями, до 8 кусков с адресом; уроки ищутся вместе; «не нашлось» с перечнем; spravka_chitat отдаёт справочник или раздел; деньги без права не видны
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
Готовые сценарии работы под инструменты подключения
prompts/list и prompts/get: начало работы, Директ, ВК, креативы, разбор, улучшение. Сценарии собраны из пакета под инструменты MCP.
✓ На проде с 26.10.2026: prompts/list отдаёт 6 сценариев (nachalo_raboty, direct, vk, kreativy, razbor, uluchshenie). Экзамен С37 К3 зелёный.
feature
К3. Шесть сценариев в prompts/list; все названные инструменты есть в tools/list сотрудника рекламы; prompts/get подставляет проект и задачу, без обязательного аргумента отказывает
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
Уроки сотрудников в очередь владельцу
urok_zapisat, uroki_ochered, urok_reshenie; сообщение руководителю рабочим ботом; принятые уроки сразу в поиске и в ресурсе.
✓ На проде с 26.10.2026: urok_zapisat, uroki_ochered, urok_reshenie. Экзамен С37 К4 зелёный.
feature
К4. urok_zapisat кладёт урок в очередь с номером и сообщением руководителю; очередь и решение только владельцу и руководителю; принятый сразу ищется и лежит в ресурсе; отклонённый не ищется; повтор не плодит записей
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
Вход для Claude: OAuth по спецификации MCP (claude.ai, Desktop, Claude Code)
Обнаружение (RFC 9728, 8414), описания клиентов Claude хранятся у себя (сервер в РФ, claude.ai ему отвечает «недоступно в регионе»), согласие на экране дашборда, коды с S256, токены с ротацией, свой вход в портал для учёток портала. Экзамены с подменным порталом tests/fake/portal.mjs.
✓ На проде с 26.10.2026: /.well-known/oauth-protected-resource и oauth-authorization-server отвечают 200 на marketing.fit-lead.ru, /api/mcp без ключа = 401 с resource_metadata. Экзамен С37 К5–К9 зелёные на подменном портале. Живой вход из claude.ai ещё не пробовали: первый сеанс в пилоте С38.
feature
К5. Без ключа 401 с resource_metadata; метаданные ресурса и сервера авторизации (S256, none, CIMD, iss); ключи flk_ как раньше
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
К6. Claude и Claude Code проходят вход через экран согласия; отказ неизвестному клиенту, чужому возврату, без S256, чужому resource, просроченному и повторному коду, неверному verifier; «Отказать» = access_denied; «только просмотр» сам не подключается
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
К7. Доступ час, обновление с ротацией и гашением при повторе; ошибки по RFC, no-store, form-urlencoded; права на каждом вызове; подключение в профиле и отзывается
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
К8. Учётка портала: свой вход в портал, сверка раз в 4 минуты, работает дольше 8 часов; закрытый доступ гасит подключение; портал молчит = 503
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
К9. Точки входа быстрее 2 с; журнал знает подключение; ключей и подключений вместе не больше 5, повторное подключение приложения заменяет старое
✓ Стенд fl-wt-mcpf 20.10.2026: tests/spec/mcp-c37.mjs «Итог С37: 9 из 9» (до кода 0/9); ОТК три круга: c37-r1 9/9, c37-r2 7/7, c37-r3 3/3. Живой вход claude.ai — после выката. На проде после «да».
acceptance
планS37 · С38 · MCP: ОТК и пилот с Артёмом и СММ0/0

Цель: Пилот на живых задачах рекламы и контента, ОТК, уроки в справочники.

задач нет

В РАБОТЕS38 · С39 · Блог Fit&Lead: волна 1 и выкладка5/13

Цель: 10 статей для ЗОЖ-брендов, блогеров и вебмастеров на fit-lead.ru/blogs: план по спросу и позиционированию, тексты, превью на согласование, канал выкладки (Content Hub или репозиторий сайта), включение проекта fitlead в заводе.

↑ План волны 1: 10 тем по спросу (Вордстат 21.08) и позиционированию вехи 4
C:/tmp/fitlead-articles/BRIEF.md (таблица тем), фактура FACTS.md со сверкой ст. 25 38-ФЗ и ч. 5 ст. 14.3 КоАП 13.10.2026
task
↑ Написать 10 статей волны 1 (сессия, без API)
C:/tmp/fitlead-articles/NN_<slug>.py → out/<slug>.json, проверка bash dryrun.sh
✓ 13.10.2026: 10 статей, 104 519 знаков тела, все 10 проходят проверки завода (dryRun ok, 6–7 разделов, 9,4–11,9 тыс. знаков). Исходники C:/tmp/fitlead-articles/NN_<slug>.py → out/<slug>.json. Нормы ст. 25, 38 38-ФЗ и ч. 1, 5, 16 ст. 14.3 КоАП сверены с текстом на Консультанте; цифры рынка из FACTS.md с источником в тексте.
task
↑ Превью на согласование: marketing.fit-lead.ru/blog-preview/fitlead/
каркас живой статьи fit-lead.ru, схемы рисует завод бесплатно (/api/factory/infographic)
✓ https://marketing.fit-lead.ru/blog-preview/fitlead/ — 10 статей в каркасе живой fit-lead.ru, 39 схем нарисованы заводом бесплатно, обложки — градиент до «ок». Проверено глазами: 1366 px и 390 px, без горизонтальной прокрутки.
task
↑ Канал выкладки: блог fit-lead.ru в Content Hub (проект, ключ ingest, сайт берёт ленту) — Дмитрий, Linear CDT-754
Сейчас /blogs читает src/content/site/blog-posts.json из репо sites/fit-lead.ru, хаба нет. Запасной путь — MR со статьями в blog-posts.json.
task
Включить проект fitlead в заводе: enabled, claims с сайта, ключ хаба, siteBlogBase, IndexNow
15.10.2026 выкачено по «да» владельца (2 пересборки, бэкап /tmp/fl-bak-20261015/): siteHosts + giftshub.fit-lead.ru, claims по сверке встреч, направления (рекламодатели / скауты и блогеры / витрина), стоп-слова маркетплейсов, нейтральный coverStyle без героини; docs/ARTICLE-FACTORY.md. Зеркало C:/tmp/fl-wt/int и E:-репо синхронизированы (md5). Осталось: enabled:true, ключ HUB_FITLEAD_INGEST_KEY, IndexNow-файл — после подключения блога к хабу (CDT-754).
task
Обложки 10 статей (Kie gpt-image-2, ~3 ₽/шт) — после «ок» на тексты и «трачу?»
приём с hold: POST /api/factory/articles без dryRun
✓ 15.10.2026 по «ок» владельца: 11 статей приняты заводом с hold (status held), 11 обложек gpt-image-2 через журнал завода (~33 ₽), схемы кодом. Превью с обложками: marketing.fit-lead.ru/blog-preview/fitlead/. Замечание: 10 обложек однотипные (одна героиня) — см. задачу на перерисовку.
task
↑ Вордстат: API Директа v4 (live/v4/json) отвечает HTTP 204 — замер спроса завода сломан
13.10.2026: GetWordstatReportList → 204 без тела и на /v4/json, и на /live/v4/json. Крон factory-demand 1-го числа упадёт. Новый API api.wordstat.yandex.net требует отдельного доступа; с cfru не открывается (только IPv6). Обход для ручных замеров: веб-Вордстат в Chrome владельца (залогинен) — wordstat.yandex.ru/?region=225&view=table&words=…
bug
Убрать «Тестовую статью» /blogs/test с fit-lead.ru до первой статьи
Дмитрий, репо sites/fit-lead.ru, src/content/site/blog-posts.json
task
↑ Волна 1 v2 по поправке владельца 13.10: без маркетплейсов, приоритет рекламодатели → скауты/блогеры → витрина, сверка с встречами
11 статей, 107 245 знаков, 10 проходят проверки завода (витрина ждёт адрес giftshub.fit-lead.ru в siteHosts). Сверка 34 встреч: C:/tmp/fitlead-articles/REALITY.md. Снята статья про внешний трафик на маркетплейсы (_snyato/), +скауты, +витрина подарков. Превью marketing.fit-lead.ru/blog-preview/fitlead/
task
Движок схем: вид formula всегда рисует «+» (деление и умножение не передать), длинные слова вылезают за карточку
13.10.2026: 4 формулы в волне Fit&Lead читались как «расходы + просмотры = цена просмотра», переведены в flow/steps. Чинить в src/lib/factory/infographic.ts: оператор между пунктами из данных (op: + × ÷), перенос длинных слов, ограничение 4 пунктов.
bug
↑ Сайт fit-lead.ru обещает то, чего нет в практике: маркетплейсы, «партнёрство с OZON», /webmasters «150+ рекламодателей, холд от 3 дней», блогерам «автоматическая маркировка», «от 30 000 ₽», IG*
Сверка REALITY.md раздел 7. Блог ссылается на /advertisers и /bloggers — до выкладки поправить тексты страниц (Дмитрий, по решению владельца).
task
Скауты: куда вести отклик из статьи «Скаут блогеров» (страницы на fit-lead.ru нет, лендинг скаутов «пока не делаем»)
В статье текстом «откликнуться на вакансию скаута Fit&Lead» без ссылки. Варианты: вакансия на hh.ru, Telegram HR, раздел на /bloggers. Подтвердить, что подбор скаутов идёт (02.09 «укомплектованы», 01.10 «возобновляется»).
task
Перерисовать 10 обложек разнообразнее (сюжеты готовы, ~30 ₽) — ждёт «да»
10 из 11 обложек вышли с одной и той же героиней (старый coverStyle «athletic blogger filming content»). Стиль заменён, в NN_*.py новые сюжеты (предметка, мужчины, зал, улица, кафе). По «да»: bash accept_hold.sh <slug…> (повторный приём, hold сохранится), затем fetch_covers.py + render_preview.py. Правило владельца: feedback-seo-covers-variety.
task
готовS39 · С40 · Завод статей v2: разнообразие и рост (СММ Агент, ИСКРА, Fit&Lead)5/5

Цель: Владелец 15.10.2026: статьи всех трёх заводов по одному шаблону (структура, подача, обороты, визуал). Сделать по 15 разных структур на проект, 3–5 авторских голосов, ротацию кодом, разнообразный визуал; добрать принципы роста для людей, поисковиков и ИИ (ресерч + вебинар про SEO-завод на 100 тыс. трафика). План доработки — владельцу до кода.

↑ Найти вебинар про SEO-завод (~100 тыс. трафика) в Телеграме/складе и вытащить принципы
✓ Найдено: пост «SEO-блог на 1200 визитов в сутки» (рассылка В. Сургая, 03.10), блог Ильи Филиппова blog.fillikam.com; 30–40 тыс. визитов/мес, ~450 статей. Принципы: C:/tmp/content-factory-v2/WEBINAR.md. Главное к нам: петля по метрикам.
task
↑ Ресерч: кейсы контент-заводов, риски масштабного ИИ-контента, Яндекс/Google 2025–26, GEO под ИИ-ответы, разнообразие
✓ C:/tmp/content-factory-v2/RESEARCH.md: ~300 ссылок, 21 кейс, 40 правил в 9 группах, таблица «что поменять в заводе», 6 решений владельцу.
task
↑ Аудит однообразия статей трёх заводов (структура, подача, обороты, визуал) + ограничения рендера сайтов
✓ C:/tmp/content-factory-v2/AUDIT.md: 74 статьи; жирный зачин 56% (Fit&Lead 92%), одинаковый набор блоков 74/74, каркас совпадает 57–64%, 0 таблиц и H2-вопросов, обложки однотипные. Шаблон порождают quality.ts и брифы.
task
↑ 15 структур статей × 3 проекта + 3–5 авторских голосов на проект + наборы визуала
✓ catalog-smm/iskra/fitlead .json + .md: по 15 структур, 5 голосов, 3 вёрстки, 6 новых видов схем; формат для кода STRUCTURE-SPEC.md. Страница: https://marketing.fit-lead.ru/dokumenty/zavod-statey-v2-dddfd2/
task
↑ План доработки завода (ротация кодом, проверки на шаблонность, новые блоки и виды схем, GEO) — владельцу до кода
План 6 спринтов + 9 решений владельцу на странице https://marketing.fit-lead.ru/dokumenty/zavod-statey-v2-dddfd2/ (C:/tmp/content-factory-v2/PLAN.md). Ждёт «ок» владельца до кода.
✓ 15.10.2026 решения владельца: подпись «Редакция», иногда «Александр Шамрай» (с его просмотром); внешние ссылки ТОЛЬКО на госсайты, СМИ и вендоров не ставим; таблицы — показан пример (uiskra.ru, на телефоне листается вбок), ждём реакцию; ИИ-боты — да (проверено: robots.txt всех сайтов уже пускает, боты получают полный HTML); банк фактов собираю сам; токен Вебмастера — даст владелец (поиск в переписке заблокирован классификатором); старые статьи не трогаем; сторонние площадки не делаем; «мелочи каталогов» — пояснить.
task
ревьюS40 · С40.1 · Завод статей v2: каталог и ротация10/11

Цель: Структуру, голос, вёрстку, схемы и обложку для каждой статьи СММ Агента, ИСКРЫ и Fit&Lead выбирает код из каталога (15 структур на проект) без повторов. Стенд готов, прод — по «да» владельца.

↑ Каталоги и ротация в коде завода: карточка статьи, бриф писателю, API catalog/card/simulate
src/lib/factory/variety.ts, catalogs/*.json, /api/factory/{catalog,card,card/simulate}, writer.ts (variety в ответе приёма). Механика: docs/ARTICLE-FACTORY.md «v2: каталог и ротация».
✓ На стенде fl-wt-intp :3208 (зеркало C:\tmp\fl-wt\int). ОТК круг 1: 2 проверяющих нашли 11+7 находок — все исправлены и доказаны проверкой otk-check (0 красных): бриф подогнан под проверку завода (объём, H2, продукт в конце), таблицы вычищены везде, задача по кириллице, аудитория Fit&Lead, «перевыбрать», замок от гонок, история 60 карточек (2000 карточек: 108 мс вместо 2,1 с). tsc 0 ошибок.
task
В1. Каталог: 15 структур, ≥4 голоса, ≥2 вёрстки на проект; без ключа 401
✓ экзамен ✓ на стенде 16.10 (15/5/3)
acceptance
В2. Карточка темы: структура, голос, вёрстка, визуал, обложка, бриф
✓ экзамен ✓; в 300 брифах нет просьб о таблицах, объём от 4500, продукт в конце
acceptance
В3. Карточка закрепляется за темой; другая — только по «перевыбрать»
✓ экзамен ✓; «перевыбрать» меняет структуру (iskra-s07 → iskra-s09)
acceptance
В4. Серия из 30 тем: квоты структур, голосов, схем, обложек
✓ экзамен ✓; 6 параллельных выдач — 6 разных структур
acceptance
В5. Структура под задачу темы ≥80%
✓ экзамен ✓; задача по русскому заголовку 6/6 (тест, цена, что такое, сравнение)
acceptance
В6. Ни одна карточка не требует таблицы
✓ экзамен ✓; таблицы вычищены из вёрсток, голосов, уникального элемента, заметок
acceptance
В7. Правила: «Редакция …», госсайты, без выдумок; ИСКРА — бесплатный старт
✓ экзамен ✓; стоп-обороты проекта у всех трёх (20/28/24)
acceptance
В8. Статья по карточке: в ответе структура и голос
✓ экзамен ✓; нет карточки — variety.missing в ответе
acceptance
В9. Регресс factory*.mjs без новых красных
✓ factory 0 красных (без Вордстата), post и fixes ✓; factory-index: проверка дня Маркера зависит от даты (пятница — день выкладки, стоп снят 08.10), код выкладки = прод
acceptance
↑ Выкат С40.1 на прод — ждёт «да» владельца
Файлы: variety.ts, catalogs/*.json, 3 роута, writer.ts, articles/route.ts, projects.ts (подпись СММ «Редакция СММ Агента»), docs. После выката: экзамены factory-v2-catalog.mjs на :3190.
task
ревьюS41 · С41 · Бот Насти: задачи Битрикса39/42

Цель: Бот менеджера ловит задачи Битрикса Насти: чужой лид, срок чтобы успеть, закрыто не по правилам. Без спама: вплетено в поток заявок, пачки склеиваются, исправления правят отправленное без звука.

↑ Чужой лид: задача на Насте, лид ведёт другой
docs/LEADS-REKL-BA.md «Задачи Битрикса» п.1; src/lib/reklBa/tasks.ts
✓ Код на стенде, экзамены зелёные, ОТК 3 круга (проверки ОТК 15/15). Ждёт выката на прод по «да».
feature
Т1. Чужой лид: одно сообщение с «лид не твой», задачей, сроком, лидом, кто ведёт, двумя ссылками; «новой задачи» нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т2. Повторный обход второго сообщения не даёт
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т3. Лид передали другому позже — одно сообщение с новым ответственным
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т4. Чужая сделка — сообщение со ссылкой на сделку
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т5. Ответственный id 1 или пусто — «у лида нет ответственного»
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т6. Три чужие за обход — одно сообщение, сгруппировано по ответственным
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т7. Своя, закрытый лид, закрытая задача, чужой исполнитель — сообщений нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т8. 20:00 и выходные — в 08:00 рабочего дня одно сообщение
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
↑ Срок: новая задача, план дня, напоминание за час
docs/LEADS-REKL-BA.md «Задачи Битрикса» п.2
✓ Код на стенде, экзамены зелёные, ОТК 3 круга (проверки ОТК 15/15). Ждёт выката на прод по «да».
feature
Т9. Новая задача со сроком сегодня — одно «новая задача»
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т10. Срок завтра и поставленная себе — «новой задачи» нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т11. Заявка + «Проверка лида» в одном обходе — строка в карточке, без отдельного сообщения
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т12. «Проверка лида» после карточки — карточка дополняется строкой
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т13. 08:00 «Сегодня срок у N задач», без завтрашних и закрытых, второго нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т14. Нет задач на сегодня — утреннего нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т15. За 61 рабочую минуту ничего, за 60 «через час срок», второго нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т16. Две задачи с одним сроком — одно напоминание
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т17. Срок 18:00 — напоминание в 16:00
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т18. Короткая задача и закрытая — напоминания нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
↑ Правила: закрыто не по правилам, чистота CRM
docs/LEADS-REKL-BA.md «Задачи Битрикса» п.3; src/lib/reklBa/taskRules.ts
✓ Код на стенде, экзамены зелёные, ОТК 3 круга (проверки ОТК 15/15). Ждёт выката на прод по «да».
feature
Т19. Без ссылки на коммуникацию — через 10 минут одно «закрыто не по правилам»
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т20. «Не результативный» без будущего типа и срока — оба пункта
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т21. Без текущего типа и итога — оба пункта
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т22. «Результативный», лид не двигали — «лид не переведён»
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»; ОТК нашёл, что перенос, поставивший задачу, засчитывался — исправлено, проверки ОТК Р1/Р2 зелёные, живой пример лид 14654
acceptance
Т23. «Проверка лида»: без ссылки; брак без причины
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»; правило уточнено после живого случая (брак чужими руками — не её), ждёт «ок» владельца, проверка ОТК Р3 зелёная
acceptance
Т24. «Напиши сообщение» без итога и ссылки; «повторное обращение» без движения сделки
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т25. По правилам, закрыто не менеджером, вид без правил — сообщений нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т26. Три закрытия подряд — одно сообщение через 10 минут после последнего
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т27. Дозаполнила — строка зачёркнута «исправлено», нового сообщения нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т28. Закрыто в 17:30 — в 08:00 рабочего дня одно
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т29. Закрыто больше суток назад — сообщения нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
↑ Вид, Лия, выключатель, регресс
docs/LEADS-REKL-BA.md «Задачи Битрикса»: вид, Лия
✓ Код на стенде, экзамены зелёные, ОТК 3 круга (проверки ОТК 15/15). Ждёт выката на прод по «да».
feature
Т30. 🟢 #заявка; 📋/⏰ #задача; ⚠️ #правила; просрочки 📋 #задача
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т31. Итог дня Лии: закрыто N, по правилам M из R, в срок K, чего не хватает, чужие лиды
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т32. Выключатель «Задачи из Битрикса» выключен — сообщений о задачах нет
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т33. Подставные задачи без лидов — 400; в обычный журнал не попадают
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ Стенд fl-wt-tb 19.10.2026: tests/spec/tasks-bot.mjs «Экзамены: 33, прошло 33, красных 0»
acceptance
Т34. Регресс tests/spec/rekl-ba.mjs 44/44
tests/spec/tasks-bot.mjs · стенд fl-wt-tb :3211: cd /opt/fitlead-night/wt/tb && set -a && . /opt/fitlead-night/env-tb && set +a && EXAM_BASE=http://127.0.0.1:3211 EXAM_PG="docker exec fl-night-pg psql -U night -d wt_tb -At -c" node tests/spec/tasks-bot.mjs
✓ tests/spec/rekl-ba.mjs на той же сборке: «Экзамены: 44, прошло 44, красных 0»
acceptance
↑ Выкат на прод marketing.fit-lead.ru
Ждёт «да» владельца. Перед выкатом сверить md5 прода с C: mp l-wtint (затронутые файлы), миграция crm_task_watch + 3 колонки lead_notifications, бэкап базы и образа.
✓ 19.10.2026 16:12 МСК по «выкатывай». Бэкапы: /root/backups/fitlead-2026-10-19-pre-s41.sql.gz, fitlead-dash-code-pre-s41-2026-10-19.tgz, образ fitlead-dash-app:pre-s41. Миграция 20261019120000_task_watch применена. На боевом: tasks-bot 33/33, rekl-ba 44/44, ОТК 15/15. Первый обход: Насте ушло «Задачи на тебе по чужим лидам: 4» (message_id 228). Зеркало C: mp l-wtint = прод по md5.
feature
Руками: живая чужая задача — Насте пришло, обе ссылки открываются
✓ Сообщение ушло (Телеграм принял, message_id 228). Осталось: Настя подтверждает, что ссылки открываются у неё
acceptance
Руками: #задача и #заявка в чате фильтруют по виду
acceptance
Руками: строка «Задача: Проверка лида до …» в карточке живой заявки
acceptance
готовS43 · С43 · MCP: Директ под ключ17/17

Цель: Сотрудник говорит Claude «сделай РСЯ/поиск на эту посадку» — Claude собирает ЕПК целиком: 7 заголовков, 3 текста, 5 картинок из дашборда, фразы, минус-слова, все настройки стандарта; проверка перед запуском кодом. docs/ACCEPTANCE.md С43.

↑ Сборка ЕПК: поиск, РСЯ, ретаргет, настройки стандарта
✓ Сделано 27.10 в ветке c43 (C:\tmp\fl-mcp), критерии зелёные по экзамену, ОТК 2 круга, масштаб прогнан. На прод не выкачено: ждёт «да» владельца.
feature
К1. Поиск и РСЯ отдельными кампаниями: стратегия, недельный бюджет, цель-заявка приоритетной, счётчик
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К1 ✓: rsya — Search SERVING_OFF, Network WB_MAXIMUM_CONVERSION_RATE с бюджетом 7000000000 и целью 585999776; poisk — Network SERVING_OFF, на кликах цель ключевой (PriorityGoals); set:true и неизвестный tip — отказ. ОТК Р15: кампания сети без блока Search распознаётся как сеть.
acceptance
К5. Настройки стандарта ставятся сами: метки, yclid, мониторинг, автофункции выкл., младше 18 исключено, автотаргетинг только целевые без бренда, b2b — платёжеспособность
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К5 ✓: метки {campaign_id}/{ad_id}, ADD_METRICA_TAG и мониторинг YES, альт. тексты и интерес к региону NO; AGE_0_17=0; b2b — VERY_HIGH 130 и HIGH 115, без b2b нет; автотаргетинг только EXACT + WITHOUT_BRANDS. ОТК Р8: суммы кратны копейке.
acceptance
К6. Минус-слова: база отдела + переданные, чистка символов, минус из целевой фразы — отказ; РСЯ — стартовые запреты площадок
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К6 ✓: база отдела (бесплатно, скачать, своими руками, вакансии, реферат…) + переданные, «18+»→«18», минус «блогеров» против фразы «реклама у блогеров…» — отказ с фразой; РСЯ — 752 стартовых запрета (список-образец 18 кампаний Fit&Lead), поиск без. ОТК Р2/П1: словоформы по окончаниям («блогер» режет «блогеров», «цена» — «цены», «курс» не режет «курсив»); Р3: минус группы против её фраз.
acceptance
К7. Группа: регион, 1–200 фраз, одна посадочная на группу; пороги фраз — предупреждение
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К7 ✓: без региона, 0 и 201 фраза — отказ, две посадочные — отказ; поиск 16 и РСЯ 10 фраз — предупреждение, 200 принято. ОТК Р4/П2: 8 слов, «18+», фраза из минус-слов — отказ, повторы убраны; Р5: одна посадочная с разными метками принята.
acceptance
К10. Ретаргет РСЯ: были на посадочной, заявку не оставили
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К10 ✓: без аудитории и с фразами — отказ; условие ANY 700100 и 2060077002, NONE 585999776, привязка к группе, без фраз, только сеть. ОТК Р7: цель-заявка в аудитории — отказ (пустая); Р14: группа без аудитории — красное перед запуском.
acceptance
↑ Комбинаторные объявления и картинки из дашборда
✓ Сделано 27.10 в ветке c43 (C:\tmp\fl-mcp), критерии зелёные по экзамену, ОТК 2 круга, масштаб прогнан. На прод не выкачено: ждёт «да» владельца.
feature
К2. Объявление ЕПК: до 7 заголовков, до 3 текстов, до 5 картинок, кнопка, цена, быстрые ссылки 4–8, уточнения; правила модерации и лимиты до отправки
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К2 ✓: ResponsiveAd 7 заголовков, 3 текста, картинки хешами, кнопка ORDER, цена от 990 ₽, быстрые ссылки, 4 уточнения; 20 отказов до отправки (8 заголовков, 4 текста, 57 знаков, слово 23, текст 82, повтор, #ключ#, {…}, лучший, №1, самый, два «!», капс, эмодзи, тире, 3 и 9 быстрых ссылок, без уточнений, 6 картинок, 4 объявления). ОТК Р1: ™ разрешён, «от самого производителя» не отказ, «наилучший» — отказ.
acceptance
К3. Картинки из «Креативов» и медиатеки загружаются в Директ сами; размер сверяется; РСЯ без картинок не собирается; чужой проект — отказ
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К3 ✓: kreativ_id и media_id загружены adimages.add и стоят хешами; 1080×1920 — отказ до отправки, в Директ ничего; РСЯ без картинок — отказ, поиск без картинок принят; креатив Fit&Lead из чужого проекта — отказ. 16:9 только ровно.
acceptance
К4. kreativ_sobrat direct_epk: квадраты 1080×1080; графические баннеры РСЯ встают графическими объявлениями
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К4 ✓: kreativ_sobrat direct_epk — 3 квадрата 1080×1080, набор в «Креативах», в медиатеку; номера используются в К3. Графические баннеры РСЯ сознательно не ставятся (SCOPE-CUTS С43 п.1, критерий уточнён до экзаменов).
acceptance
К8. Быстрые ссылки и посадочная проверяются на живость до плана
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К8 ✓: посадочная и быстрые ссылки проверены до плана, «dead-page» и «dead-landing» — отказ с адресом. ОТК Р6: 403 (защита от роботов) — предупреждение, не отказ; Р13: мёртвая ссылка перед запуском — красное.
acceptance
↑ Черновик, дособрать в готовую, проверка и запуск
✓ Сделано 27.10 в ветке c43 (C:\tmp\fl-mcp), критерии зелёные по экзамену, ОТК 2 круга, масштаб прогнан. На прод не выкачено: ждёт «да» владельца.
feature
К9. Черновик создаётся применением плана и перечитывается: что легло, расхождения, частичная сборка с номерами
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К9 ✓: ответ называет заголовки 7, тексты 3, картинки 2, быстрые ссылки, уточнения, корректировки, автотаргетинг; черновик в справочнике; потерянный заголовок — «расхождения … 6»; сбой на ads.add — «частично» с номером кампании. ОТК Р9: частичный шаг назван как есть; Р10: автотаргетинг созданных групп сужен; Р11: наборы без ложных расхождений.
acceptance
К11. direct_gruppa_plan: группа с фразами и объявлениями в готовую кампанию
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К11 ✓: direct_gruppa_plan — группа с регионом [2] в кампанию, комбинаторное объявление; длинный заголовок и РСЯ без картинок — отказ; чужой проект — отказ. ОТК Р12/П4: в работающей кампании (статус из Директа) объявления сразу на модерацию, план меняет расход.
acceptance
К12. Первый запуск черновика: чек-лист по кампании из Директа, красное — отказ, жёлтое — в плане и сигнале; рабочую после паузы не держит
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К12 ✓: испорченный черновик (альт. тексты, без младше 18) — отказ с перечнем; исправный — жёлтое про фразы, запуск включил; рабочая кампания после паузы не держится. ОТК Р13: мониторинг, выключенная «младше 18», мёртвая ссылка — красное, автотаргетинг шире — жёлтое; П5: ненайденная настройка — жёлтое. Масштаб: проверка 0,9 с на 10 группах.
acceptance
↑ Сценарий для Claude
✓ Сделано 27.10 в ветке c43 (C:\tmp\fl-mcp), критерии зелёные по экзамену, ОТК 2 круга, масштаб прогнан. На прод не выкачено: ждёт «да» владельца.
feature
К13. Сценарий sobrat_reklamu: посадка → семантика → минус → офферы и тексты → картинки → план → проверка → «ок» → черновик → запуск
✓ Экзамен tests/spec/mcp-c43.mjs на стенде fl-wt-mcpf (подменный Директ) 27.10: «Итог С43: 13 из 13»; ОТК c43-r1 15/15, c43-r2 5/5. К13 ✓: prompts/list содержит sobrat_reklamu; шаги по порядку: посадка, семантика, минус-слова, офферы, картинки (kreativ_sobrat direct_epk), direct_novaya_kampaniya_plan, проверка, «ок», черновик, запуск; отсылка к fitlead://spravka/fl-direct/standart.
acceptance
планS44 · С44 · MCP: ВК под ключ0/11

Цель: Та же сборка под ключ для VK Рекламы: аудитории (сообщества с конкурентами, интересы, фразы), кампания под цель, 4 формата картинок, лимиты, выключено на всех уровнях, проверка порогов перед запуском. docs/ACCEPTANCE.md С44.

↑ Аудитория ВК через подключение
feature
К1. Поиск сообществ (участники, фан-группы), интересов и соц-дема, ключевых фраз
acceptance
↑ Сборка кампании ВК
feature
К2. Цель → пакет и посадка (3122 сообщество, 3232 сайт, 3215 лид-форма); гео, возраст, пол явно; всё выключено
acceptance
К3. Группа-сегмент: фраз ≥10 + стоп, сообществ ≥8 с конкурентами; интересы ≥2 отдельной группой; смешение — отказ
acceptance
К4. Объявление: 4 формата картинок из «Креативов», иконка, все тексты и «о компании», кнопка по цели, метки
acceptance
К5. Деньги: лимит у каждой группы > 0, максимум результатов, потолок кампании
acceptance
К6. Применение перечитывает кампанию: группы, сегменты, интересы, объявления, слоты; частичная — с номерами
acceptance
К8. vk_gruppa_plan: группа в готовую кампанию
acceptance
↑ Проверка и запуск ВК
feature
К7. Первый запуск: пороги стандарта, площадки ≥ половины пакета; красное — отказ; включение кампания → группы → объявления, сигнал
acceptance
планS45 · С45 · MCP: семантика и посадка0/8

Цель: Вордстат через Yandex Cloud (API Директа выключен с 20.10), разбор фраз кодом, семантика из запросов кабинета без ключа, разбор посадки и выбор стратегии по правилу отдела. docs/ACCEPTANCE.md С45.

↑ Ключ Вордстата
feature
К1. Ключ и каталог Yandex Cloud вносит владелец на экране профиля, хранятся зашифрованно; без ключа — честно «замера нет»
acceptance
↑ Семантика
feature
К2. semantika_sobrat: частоты Вордстата за 30 дней по региону, замер с номером; фразы без замера помечены
acceptance
К3. Разбор фраз кодом: коммерческие, информационные и мусор в минус-кандидаты, двусмысленные во фразовом
acceptance
К4. Без ключа: семантика из поисковых запросов кабинета и списка человека
acceptance
↑ Разбор посадки
feature
К5. posadka_razbor: заголовок, оффер, форма, счётчик, цели с достижениями за 30 дней; стратегия по правилу A2
acceptance
ревьюS46 · С46 · MCP СММ: вход и загрузка13/14

Цель: Учётка СММщицы, вход из Claude и ChatGPT, загрузка с телефона и по ссылке прямо в карточку, карточка глазами модели, выкат С42. docs/ACCEPTANCE.md С46.

↑ MCP СММ: вход и загрузка
Учётка СММщицы, вход из Claude и ChatGPT, загрузка с телефона и по ссылке прямо в карточку, карточка глазами модели, выкат С42. docs/ACCEPTANCE.md С46.
✓ На проде с 28.10.2026 14:20 UTC (выкат С46–С50 одним релизом по «да» владельца, бэкап c46-c50-20261028-134858, откат образом pre-c46-c50). Осталось: учётка Анастасии (К1).
feature
К1. У Анастасии Москвичевой своя учётка: отдел СММ, проект Fit&Lead, раздел «Контент», галочка «Публикует в соцсети»; раздела рекламы и денег у неё нет. Мария Гришина подключается своей прежней учёткой, галочки «Публикует» у неё нет
У Анастасии Москвичевой своя учётка: отдел СММ, проект Fit&Lead, раздел «Контент», галочка «Публикует в соцсети»; раздела рекламы и денег у неё нет. Мария Гришина подключается своей прежней учёткой, галочки «Публикует» у неё нет
⛔ Учётку Анастасии на экране «Люди» заводит владелец (логин amoskvicheva, отдел СММ, разделы «Контент и СММ» и «Задачи», проект Fit&Lead, без денег, «Публикует»). Код на проде, проверка mcp-c46-prod.mjs К1 красная до учётки.
acceptance
К2. СММщица подключает claude.ai коннектором (вход паролем дашборда, «Разрешить»); `kto_ya` называет её, отдел СММ и инструменты контента; инструментов рекламы в списке нет
СММщица подключает claude.ai коннектором (вход паролем дашборда, «Разрешить»); `kto_ya` называет её, отдел СММ и инструменты контента; инструментов рекламы в списке нет
✓ Экзамен tests/spec/mcp-c46.mjs К2 зелёный на стенде fl-wt-smm 28.10: kto_ya называет СММщицу и отдел СММ, 19 инструментов, zagruzka_ssylka/fayl_po_ssylke/kartochka/kartochka_faily есть, reklama_*/direct_* нет; «только просмотр» видит kartochka без инструментов записи. Ветка smm (C:\tmp\fl-smm), на проде нет — ждёт «да».
acceptance
К3. ChatGPT (режим разработчика) подключается тем же адресом входом через дашборд: описание клиента вида `https://chatgpt.com/oauth/<код>/client.json` принимается без скачивания (сервер в России, chatgpt.com ему закрыт), страница согласия назыв
ChatGPT (режим разработчика) подключается тем же адресом входом через дашборд: описание клиента вида `https://chatgpt.com/oauth/<код>/client.json` принимается без скачивания (сервер в России, chatgpt.com ему закрыт), страница согласия называет приложение «ChatGPT», возврат только на адреса chatgpt.com (`connector_platform_oauth_redirect` и `connector/oauth/<тот же код>`); чужой адрес возврата или чужой домен описания — «подключение остановлено». Codex по ключу работает как раньше
✓ Экзамен К3 зелёный: согласие для https://chatgpt.com/oauth/<код>/client.json называет ChatGPT, оба адреса возврата chatgpt.com принимаются, чужой код/домен/http/обход пути — «подключение остановлено», полный вход даёт токен с инструментами, подключение в профиле «ChatGPT». ОТК: на согласии код коннектора и предупреждение от фишинга (c46-r1 Р8). Живое подключение из ChatGPT — руками после выката.
acceptance
К4. `zagruzka_ssylka` по номеру карточки отдаёт ссылку `…/z/<код>`; она открывается на телефоне без входа в дашборд, показывает название карточки и то, что уже лежит, и принимает фото, видео и документы. В карточке файлы встают после уже прикре
`zagruzka_ssylka` по номеру карточки отдаёт ссылку `…/z/<код>`; она открывается на телефоне без входа в дашборд, показывает название карточки и то, что уже лежит, и принимает фото, видео и документы. В карточке файлы встают после уже прикреплённых в порядке загрузки, автор загрузки — тот, кто выпустил ссылку
✓ Экзамен К4 зелёный: ссылка …/z/<код>, страница без входа показывает карточку и лежащие файлы, 2 файла встали после прикреплённого по порядку, автор — выпустивший.
acceptance
К5. Видео грузится частями: обрыв связи посередине не начинает загрузку заново, страница догружает с места обрыва; файл в карточке совпадает с исходным по размеру и отпечатку SHA-256. Видео до 1 ГБ, фото до 25 МБ, в карточке до 20 файлов; сверх
Видео грузится частями: обрыв связи посередине не начинает загрузку заново, страница догружает с места обрыва; файл в карточке совпадает с исходным по размеру и отпечатку SHA-256. Видео до 1 ГБ, фото до 25 МБ, в карточке до 20 файлов; сверх — отказ до загрузки с причиной
✓ Экзамен К5 зелёный: ролик 22 МБ кусками по 8 МБ, обрыв посередине второго куска, догрузка с подтверждённого места 8 388 608, SHA-256 совпал; 1 ГБ+1 и 25 МБ+1 — 413 до загрузки, ровно на пределе — 201; 21-й файл — 409. Масштаб: 20 файлов, 3×88 МБ параллельно 23 МБ/с (tests/otk/c46-r1-scale.mjs).
acceptance
К6. Фото HEIC с айфона ложится в карточку JPEG-ом с учётом поворота из EXIF и видно в превью; нерасшифровываемый файл — причина словами, а не битая картинка в карточке
Фото HEIC с айфона ложится в карточку JPEG-ом с учётом поворота из EXIF и видно в превью; нерасшифровываемый файл — причина словами, а не битая картинка в карточке
✓ Экзамен К6 зелёный: HEIC 1512×2016 (heif-enc) лёг image/jpeg, файл .jpg, sharp читает jpeg 1512x2016; битый HEIC — причина словами, в карточке ничего. libheif-tools в Dockerfile.
acceptance
К7. Тип файла проверяется по расширению из белого списка и по содержимому (фото jpg, png, webp, heic, gif; видео mp4, mov, m4v, webm; звук mp3, m4a, wav; документ pdf): svg, html, exe и разметка под именем `.jpg` отклоняются с причиной
Тип файла проверяется по расширению из белого списка и по содержимому (фото jpg, png, webp, heic, gif; видео mp4, mov, m4v, webm; звук mp3, m4a, wav; документ pdf): svg, html, exe и разметка под именем `.jpg` отклоняются с причиной
✓ Экзамен К7 зелёный: svg, html, exe, без расширения, js — 415 до загрузки; разметка под .jpg и .mp4 — отказ «внутри не фото», в карточке ничего. ОТК: m4a в контейнере mp4 принимается как звук (c46-r1 Р1), ролик под .mp3 отклоняется.
acceptance
К8. Ссылка живёт 24 часа (срок виден на странице) и перестаёт работать после отзыва, после публикации карточки и у выключенной учётки выпустившего; чужая, битая или старая ссылка — страница «ссылка не работает» (404 или 410), а не ошибка сервер
Ссылка живёт 24 часа (срок виден на странице) и перестаёт работать после отзыва, после публикации карточки и у выключенной учётки выпустившего; чужая, битая или старая ссылка — страница «ссылка не работает» (404 или 410), а не ошибка сервера. Код ссылки в базе хранится только отпечатком
✓ Экзамен К8 зелёный: срок 24 ч в ответе и «действует до» на странице; неизвестный код 404 «не работает»; код ни в одной строке ни одной таблицы, отпечаток в upload_links; просрочка, отзыв (otozvat), публикация карточки, выключенная учётка — 410.
acceptance
К9. Через ссылку можно вписать текст поста: он ложится в текст карточки, прежняя версия сохраняется в истории; длинное тире и превышение предела соцсети страница показывает до сохранения
Через ссылку можно вписать текст поста: он ложится в текст карточки, прежняя версия сохраняется в истории; длинное тире и превышение предела соцсети страница показывает до сохранения
✓ Экзамен К9 зелёный: проверка показывает тире и предел Телеграма 4096 без сохранения, сохранение с тире — 422, чистый текст лёг, прежний в content_versions.
acceptance
К10. `fayl_po_ssylke`: публичная ссылка Яндекс Диска (файл или папка до 20 файлов), Google Диска или прямая https-ссылка — файлы ложатся в карточку с теми же проверками, что К5–К7. Адреса внутренней сети и самого сервера (localhost, 127.*, 10.*,
`fayl_po_ssylke`: публичная ссылка Яндекс Диска (файл или папка до 20 файлов), Google Диска или прямая https-ссылка — файлы ложатся в карточку с теми же проверками, что К5–К7. Адреса внутренней сети и самого сервера (localhost, 127.*, 10.*, 172.16–31.*, 192.168.*, 169.254.*, внутренние IPv6) отклоняются, в том числе после переадресации
✓ Экзамен К10 зелёный: Я.Диск файл, папка (2 подходящих, evil.exe пропущен с причиной), Google Диск, прямая ссылка с переадресацией — 5 файлов; 10 внутренних адресов и переадресация в сеть дашборда отклонены. ОТК: повтор того же источника без дублей (sourceKey, c46-r1 Р6), папка при одном месте честно (Р7), pipeline и простой в скачивании.
acceptance
К11. `kartochka` отдаёт всё по карточке: заголовок, текст, формат, дату, рубрику, этап, согласование, площадки; файлы по порядку с номером, видом, размером, размером кадра, у видео длительность и есть ли звук; превью картинок прямо в ответе (до
`kartochka` отдаёт всё по карточке: заголовок, текст, формат, дату, рубрику, этап, согласование, площадки; файлы по порядку с номером, видом, размером, размером кадра, у видео длительность и есть ли звук; превью картинок прямо в ответе (до 6, 512 px) и ссылки на час; журнал публикаций. Карточка чужого или закрытого проекта — отказ
✓ Экзамен К11 зелёный: поля карточки, файлы по порядку (картинка 1080×1350, ролик 1080×1920 3 с со звуком), превью в ответе, ссылка на час открывается, журнал публикаций, чужой проект — отказ. ОТК: prevyu с номерами файлов (Р9), звук у аудио (Р1), бюджеты времени; масштаб: полная карточка 2,0 с.
acceptance
К12. `kartochka_faily` меняет порядок файлов (полный список номеров) и убирает файл из карточки; экран карточки показывает тот же порядок. Файл, на который ещё ссылаются медиатека, монтажная или журнал публикаций, с диска не стирается
`kartochka_faily` меняет порядок файлов (полный список номеров) и убирает файл из карточки; экран карточки показывает тот же порядок. Файл, на который ещё ссылаются медиатека, монтажная или журнал публикаций, с диска не стирается
✓ Экзамен К12 зелёный: порядок полным списком, экран видит тот же, неполный список — отказ, файл медиатеки на диске остался, ничейный стёрт, чужой проект — отказ. ОТК: файл из журнала публикаций (mediaId) не стирается (Р2), номера подряд после уборки (Р3).
acceptance
К13. На проде публикация во ВК из карточки (С42) работает у человека с галочкой «Публикует»; у Fit&Lead стоит месячный потолок платной генерации, заказ сверх потолка отказывается с остатком
На проде публикация во ВК из карточки (С42) работает у человека с галочкой «Публикует»; у Fit&Lead стоит месячный потолок платной генерации, заказ сверх потолка отказывается с остатком
✓ Прод 28.10 14:20 UTC: tests/spec/mcp-c46-prod.mjs К13 зелёный — миграция публикации ВК есть, потолок генерации Fit&Lead 2 000 ₽, загрузка /api/z отвечает «ссылка не работает» на битый код.
acceptance
готовS47 · С47 · MCP СММ: фото и карусели по гайдбуку9/9

Цель: Обработка фото кодом (кадр, свет, цвет), карусели из своих фото по мастеру, ИИ-ретушь в лимите СММ, проверка правил гайдбука, гайдбук справочником. docs/ACCEPTANCE.md С47.

↑ MCP СММ: фото и карусели по гайдбуку
Обработка фото кодом (кадр, свет, цвет), карусели из своих фото по мастеру, ИИ-ретушь в лимите СММ, проверка правил гайдбука, гайдбук справочником. docs/ACCEPTANCE.md С47.
✓ На проде с 28.10.2026 14:20 UTC (выкат С46–С50 одним релизом по «да» владельца, бэкап c46-c50-20261028-134858, откат образом pre-c46-c50).
feature
К1. `foto_obrabotat` по фото карточки бесплатно: кадр под 4:5 (1080×1350), 1:1, 9:16 и 3:4 точно в размер, главное (лицо, без лица — объект съёмки) целиком в кадре; тёмное фото становится светлее, цветной оттенок (синий, жёлтый) убирается; цвет
`foto_obrabotat` по фото карточки бесплатно: кадр под 4:5 (1080×1350), 1:1, 9:16 и 3:4 точно в размер, главное (лицо, без лица — объект съёмки) целиком в кадре; тёмное фото становится светлее, цветной оттенок (синий, жёлтый) убирается; цвет — фирменным пресетом (`avto`, `fitlead`, `teplyy`, `holodnyy` или без цвета). Результат — новая картинка сразу после исходной, исходник не меняется ни на байт; превью «до» и «после» в ответе; 0 ₽
✓ Экзамен tests/spec/mcp-c47.mjs К1 зелёный 28.10 (стенд fl-wt-smm): 4:5 1080×1350, 1:1, 9:16, 3:4 точно; красный круг у края кадра целиком (110 тыс. точек из ~112); тёмное 34→127; синий оттенок 78→0; исходник не изменился; превью до/после; 0 ₽. ОТК: ч/б фото (c47-r1 Р1). Глазами на настоящем фото: кадр по лицу хорошо. Ветка smm, на проде нет — ждёт «да».
acceptance
К2. `kontent_oblozhka` принимает фото (файл карточки или картинку медиатеки): обложка в рамке мастера с логотипом и заголовком поверх фото; движок не сообщает о столкновении заголовка с лицом или рамкой; чужой файл — отказ
`kontent_oblozhka` принимает фото (файл карточки или картинку медиатеки): обложка в рамке мастера с логотипом и заголовком поверх фото; движок не сообщает о столкновении заголовка с лицом или рамкой; чужой файл — отказ
✓ Экзамен К2 зелёный: обложка на фото карточки и картинке медиатеки, отличие от подложки 50, без столкновений; чужое фото — отказ. Глазами: заголовок на фото с крупной фигурой лёг на руки (выбор скелета движком С25) — SCOPE-CUTS С47 п.1.
acceptance
К3. `kontent_karusel` принимает фото на каждый слайд (файл карточки или медиатеки): внутренние карточки мастера по фото слайда, без фото — фирменная подложка; слайды встают по порядку просьбы
`kontent_karusel` принимает фото на каждый слайд (файл карточки или медиатеки): внутренние карточки мастера по фото слайда, без фото — фирменная подложка; слайды встают по порядку просьбы
✓ Экзамен К3 зелёный: 3 слайда по порядку, с фото и без (подложка), несуществующее фото — отказ. Глазами: слайд мастера на фото хорошо.
acceptance
К4. `karusel_iz_foto`: обложка и слайды из фото карточки одним вызовом (по умолчанию все картинки карточки по порядку, до 10), тексты слайдов от модели; пустые заготовки (`TODO`, `{{…}}`, `XXX`), длинное тире и превышение длины отклоняются до р
`karusel_iz_foto`: обложка и слайды из фото карточки одним вызовом (по умолчанию все картинки карточки по порядку, до 10), тексты слайдов от модели; пустые заготовки (`TODO`, `{{…}}`, `XXX`), длинное тире и превышение длины отклоняются до рисования; ничего не записывается, если упал хоть один слайд
✓ Экзамен К4 зелёный: +3 картинки одним вызовом; TODO, {{…}}, XXXXXXXX, тире, 11 картинок — отказ без записи. ОТК: XXX (Р2), без задвоения исходника и слайдов (Р3), предел 20 файлов под замком (Р9). Масштаб: 10 картинок за 4,0 с.
acceptance
К5. Платная ИИ-обработка в два шага: `foto_ii_plan` (ретушь, убрать фон, заменить фон, убрать предмет, дорисовать кадр под формат) показывает цену и остаток лимита СММ и ничего не тратит; `izmenenie_primenit` заказывает у Kie с исходным фото ка
Платная ИИ-обработка в два шага: `foto_ii_plan` (ретушь, убрать фон, заменить фон, убрать предмет, дорисовать кадр под формат) показывает цену и остаток лимита СММ и ничего не тратит; `izmenenie_primenit` заказывает у Kie с исходным фото карточки на входе; повтор того же заказа не оплачивается; `foto_zabrat` кладёт готовое в карточку сразу после исходника
✓ Экзамен К5 зелёный: план 5,7 ₽ с остатком, ничего не заказано; применение — заказ Kie с исходником по публичной ссылке; повтор не оплачивается; foto_zabrat кладёт сразу после исходника. ОТК: два параллельных забора — одна картинка (Р4), удалённый исходник — не заказывается (Р10).
acceptance
К6. Лимит платной генерации считается по отделу: у Fit&Lead СММ 1 000 ₽/мес и реклама 1 000 ₽/мес отдельно; трата СММ не съедает рекламу и наоборот; сверх лимита отдела — отказ с остатком; без лимита отдела действует прежний общий лимит проекта
Лимит платной генерации считается по отделу: у Fit&Lead СММ 1 000 ₽/мес и реклама 1 000 ₽/мес отдельно; трата СММ не съедает рекламу и наоборот; сверх лимита отдела — отказ с остатком; без лимита отдела действует прежний общий лимит проекта
✓ Экзамен К6 зелёный: СММ упёрся в лимит отдела 100, реклама не задета, без лимита отдела — общий. ОТК: резерв голоса рекламы не уменьшает остаток СММ (Р6). Сид миграции: СММ 1000, реклама 1000.
acceptance
К7. `proverka_gaidbuka` по картинкам карточки: подходит ли размер и пропорция площадкам карточки (ВК, Телеграм, Инстаграм, MAX), у слайдов движка — итог проверок движка при сборке (столкновения, кромки, висячее слово, пустые карманы), у текста
`proverka_gaidbuka` по картинкам карточки: подходит ли размер и пропорция площадкам карточки (ВК, Телеграм, Инстаграм, MAX), у слайдов движка — итог проверок движка при сборке (столкновения, кромки, висячее слово, пустые карманы), у текста поста — длинное тире, пустые заготовки и предел соцсети; по каждому пункту зелёное или красное со словами и советом
✓ Экзамен К7 зелёный: высокое фото — красное для Инстаграма, маленькое — красное, слайд движка — итог движка, тире в тексте — красное, есть зелёные. ОТК: текст у кромки красное, старый слайд без паспорта без ложного «нет столкновений», 3:4 зелёное (Р7).
acceptance
К8. Гайдбук для модели: ресурс `fitlead://smm/gaidbuk` (цвета и шрифты из токенов мастера, рубрики, форматы площадок, правила текста отдела, маркировка рекламы) собран из данных движка, а не пересказом; `spravka_poisk` находит его разделы; виде
Гайдбук для модели: ресурс `fitlead://smm/gaidbuk` (цвета и шрифты из токенов мастера, рубрики, форматы площадок, правила текста отдела, маркировка рекламы) собран из данных движка, а не пересказом; `spravka_poisk` находит его разделы; виден с разделом «Контент»
✓ Экзамен К8 зелёный: ресурс fitlead://smm/gaidbuk, все 10 цветов card-tokens.css, все 13 рубрик, 1080×1350; spravka_poisk находит; без «Контента» не виден. ОТК: уроки рекламы не видны только СММ (Р5).
acceptance
готовS48 · С48 · MCP СММ: публикация7/7

Цель: Публикация из Claude: ВК, Телеграм, MAX сейчас и к дате, Инстаграм/Threads/TikTok/YouTube пакетом на телефон. docs/ACCEPTANCE.md С48.

↑ MCP СММ: публикация
Публикация из Claude: ВК, Телеграм, MAX сейчас и к дате, Инстаграм/Threads/TikTok/YouTube пакетом на телефон. docs/ACCEPTANCE.md С48.
✓ На проде с 28.10.2026 14:20 UTC (выкат С46–С50 одним релизом по «да» владельца, бэкап c46-c50-20261028-134858, откат образом pre-c46-c50).
feature
К1. `publikaciya_plan` по карточке для каждого её аккаунта показывает, куда (площадка и аккаунт), что (текст символ в символ, файлы по порядку) и когда (сейчас или к дате плана) уйдёт, что не уйдёт и почему; аккаунты ручных площадок перечислены
`publikaciya_plan` по карточке для каждого её аккаунта показывает, куда (площадка и аккаунт), что (текст символ в символ, файлы по порядку) и когда (сейчас или к дате плана) уйдёт, что не уйдёт и почему; аккаунты ручных площадок перечислены с отсылкой к пакету; ничего не публикует
✓ Экзамен tests/spec/mcp-c48.mjs К1 зелёный 28.10 (стенд fl-wt-smm, подменные ВК/Телеграм/MAX): по 5 аккаунтам куда/что/когда/что не уйдёт, Инстаграм вручную со ссылкой на пакет, ничего не опубликовано. Ветка smm, прод — ждёт «да».
acceptance
К2. `izmenenie_primenit` публикует: ВК по механике С42; Телеграм — текст (`sendMessage`), одно фото (`sendPhoto`), 2–10 фото альбомом (`sendMediaGroup`), ролик до 50 МБ (`sendVideo`), подпись длиннее 1 024 знаков под медиа уходит отдельным сооб
`izmenenie_primenit` публикует: ВК по механике С42; Телеграм — текст (`sendMessage`), одно фото (`sendPhoto`), 2–10 фото альбомом (`sendMediaGroup`), ролик до 50 МБ (`sendVideo`), подпись длиннее 1 024 знаков под медиа уходит отдельным сообщением; MAX — текст и фото (загрузка, затем сообщение в канал). Ссылка на пост ложится в журнал карточки и в карточку, если ссылки ещё нет; стадия «Опубликовано»
✓ Экзамен К2 зелёный: ВК (С42), Телеграм альбом в оба канала, MAX 2 фото + текст; варианты sendMessage, sendPhoto, sendVideo, длинная подпись отдельным сообщением; ссылки в журнале и карточке. MAX живьём не проверен (SCOPE-CUTS С48 п.1).
acceptance
К3. Публикует только человек с галочкой «Публикует в соцсети» и только согласованную карточку; при согласовании запоминается отпечаток карточки (заголовок, текст, файлы и их порядок): карточку изменили после согласования — план отказывает «согл
Публикует только человек с галочкой «Публикует в соцсети» и только согласованную карточку; при согласовании запоминается отпечаток карточки (заголовок, текст, файлы и их порядок): карточку изменили после согласования — план отказывает «согласуйте заново», `kartochka` показывает «изменено после согласования»
✓ Экзамен К3 зелёный: несогласованное и без галочки — отказ; правка после согласования — «согласуйте заново», kartochka «изменено после согласования», старый план не применяется. ОТК: согласование через монтажную пишет отпечаток (c48-r1 Р1).
acceptance
К4. «К дате плана»: ВК — отложенной записью (С42), Телеграм и MAX — очередью дашборда: запись «в очереди» с временем, крон `POST /api/cron/publish` (секрет `x-cron-secret`) отправляет созревшие; карточку изменили после постановки — не отправляе
«К дате плана»: ВК — отложенной записью (С42), Телеграм и MAX — очередью дашборда: запись «в очереди» с временем, крон `POST /api/cron/publish` (секрет `x-cron-secret`) отправляет созревшие; карточку изменили после постановки — не отправляет, пишет причину; `publikaciya_otmena` снимает запись из очереди до отправки
✓ Экзамен К4 зелёный: ВК отложенной записью, Телеграм и MAX в очередь; крон без секрета — отказ, несозревшее не шлёт, созревшее шлёт, изменённое не шлёт, отмена снимает. ОТК: крон перепроверяет согласование, дату, канал (Р2–Р4), зависшие → неизвестно (Р6).
acceptance
К5. Дубля нет: одна живая отправка на пару «карточка + аккаунт» (в том числе в очереди); обрыв связи с площадкой — «неизвестно», повтор закрыт, пока человек не проверит канал (как С42)
Дубля нет: одна живая отправка на пару «карточка + аккаунт» (в том числе в очереди); обрыв связи с площадкой — «неизвестно», повтор закрыт, пока человек не проверит канал (как С42)
✓ Экзамен К5 зелёный: повтор в тот же канал блокируется, обрыв — «неизвестно», повтор закрыт. ОТК: «пост не вышел» считается от начала отправки (Р5), поздний итог не теряется.
acceptance
К6. Ручные площадки: `paket_ssylka` даёт ссылку на страницу «Пакет для выкладки» на телефон (без входа, сутки): каждый файл скачивается одним нажатием, картинки — и как есть, и в формате площадки (Инстаграм 4:5), текст копируется одной кнопкой,
Ручные площадки: `paket_ssylka` даёт ссылку на страницу «Пакет для выкладки» на телефон (без входа, сутки): каждый файл скачивается одним нажатием, картинки — и как есть, и в формате площадки (Инстаграм 4:5), текст копируется одной кнопкой, по каждой ручной площадке поле ссылки на вышедший пост; `publikaciya_ssylka` вписывает ссылку из Claude; ссылка ложится в журнал как «опубликовано вручную» и в карточку, если ссылки ещё нет
✓ Экзамен К6 зелёный: пакет /p/<код> без входа, файлы как есть и 4:5 (1080×1350), кнопка копирования, ссылка со страницы и publikaciya_ssylka, журнал «вручную», javascript: отклонена. ОТК: только с галочкой, только ручные площадки, только домен площадки (Р7).
acceptance
готовS49 · С49 · MCP СММ: монтаж своим Claude или ChatGPT7/14

Цель: Разбор сырья (раскадровка, расшифровка), монтажный лист моделью, сборка ffmpeg на сервере, правки словами. docs/ACCEPTANCE.md С49.

↑ MCP СММ: монтаж своим Claude или ChatGPT
Разбор сырья (раскадровка, расшифровка), монтажный лист моделью, сборка ffmpeg на сервере, правки словами. docs/ACCEPTANCE.md С49.
✓ На проде с 28.10.2026 14:20 UTC (выкат С46–С50 одним релизом по «да» владельца, бэкап c46-c50-20261028-134858, откат образом pre-c46-c50).
feature
К1. `montazh_razbor` по видео карточки (номер файла из `kartochka`): лист раскадровки картинкой в ответе (кадр раз в 2 с с таймкодом), длительность, размер кадра, есть ли звук, паузы длиннее 0,6 с с началом и концом (кодом); если расшифровка уж
`montazh_razbor` по видео карточки (номер файла из `kartochka`): лист раскадровки картинкой в ответе (кадр раз в 2 с с таймкодом), длительность, размер кадра, есть ли звук, паузы длиннее 0,6 с с началом и концом (кодом); если расшифровка уже есть — текст фразами со временем. Бесплатно. Не видео или файл чужой карточки — отказ
✓ Экзамен tests/spec/mcp-c49.mjs К1 зелёный 28.10 (стенд fl-wt-smm): лист раскадровки картинкой, кадров 5 на 10 с, пауза 3–4 с найдена кодом, длительность, кадр, звук; фото и чужая карточка — отказ. ОТК c49-r1 Р9: ролик 200 с — 100 кадров на 3 листах, шаг 2 с. Масштаб: разбор 10 минут 1080p за 44 с. Ветка smm, прод — ждёт «да».
acceptance
К2. Расшифровка речи по словам со временем (ElevenLabs Scribe) в два шага: `montazh_rasshifrovka_plan` показывает цену по длительности и остаток лимита отдела СММ и ничего не тратит; `izmenenie_primenit` расшифровывает, трата ложится строкой ра
Расшифровка речи по словам со временем (ElevenLabs Scribe) в два шага: `montazh_rasshifrovka_plan` показывает цену по длительности и остаток лимита отдела СММ и ничего не тратит; `izmenenie_primenit` расшифровывает, трата ложится строкой расхода отдела СММ; повтор того же файла не оплачивается (готовая отдаётся сразу); сверх лимита — отказ с остатком; отказ Scribe — денег нет; без ключа на сервере — причина словами, разбор работает
✓ Экзамен К2 зелёный (подменный Scribe): план с ценой 1 ₽ и остатком, Scribe не вызван; применение — 12 слов, строка расхода СММ; повтор бесплатно; сверх лимита отказ; отказ Scribe — цена 0. ОТК Р4: 429 — денег нет; Р5: живая попытка — «уже идёт». Ключ ElevenLabs на проде ждёт решения, Scribe живьём не проверен.
acceptance
К3. `montazh_plan` проверяет монтажный лист кодом до сборки и отдаёт ошибки списком, ничего не собирая: куски (файл карточки, начало и конец внутри исходника) по порядку, длительность ролика 3–180 с, крючок до 60 знаков, субтитры по словам толь
`montazh_plan` проверяет монтажный лист кодом до сборки и отдаёт ошибки списком, ничего не собирая: куски (файл карточки, начало и конец внутри исходника) по порядку, длительность ролика 3–180 с, крючок до 60 знаков, субтитры по словам только при расшифровке всех роликов листа, плашки (текст, время внутри ролика, место: верх, центр, низ), текст в безопасной зоне 9:16 по ширине строки, без длинного тире и пустых заготовок, шрифт только бренда, музыка из библиотеки, громкость 0–1; `proverit` — только проверка
✓ Экзамен К3 зелёный: лист с ошибками — 10 ошибок списком (конец за исходником, длительность, крючок 60, тире, TODO, плашка вне ролика, безопасная зона, шрифт, музыка, громкость), слова без расшифровки — отказ, proverit ничего не собирает. ОТК Р6: плашка на крючке и mesto «constructor» — ошибки.
acceptance
К4. Сборка на сервере по листу без ошибок: 1080×1920 (или 1:1, 4:5), субтитры по словам с подсветкой текущего слова, крючок в первые 3 с, плашки, логотип, музыка с приглушением под голос; минутный ролик собирается не дольше 5 минут; одновременн
Сборка на сервере по листу без ошибок: 1080×1920 (или 1:1, 4:5), субтитры по словам с подсветкой текущего слова, крючок в первые 3 с, плашки, логотип, музыка с приглушением под голос; минутный ролик собирается не дольше 5 минут; одновременно не больше двух сборок (третья — «повторите через минуту»)
✓ Экзамен К4 зелёный: 1080×1920, по пикселям крючок, плашка цветом бренда, подсветка слова жёлтым, логотип; приглушение музыки под речью 18 дБ; минутный ролик за 41–64 с при двух сборках, третья — отказ. ОТК Р7: 1:1 и 4:5 в свой размер; Р1/Р2: одна сборка на заказ, один заказ при одновременных листах.
acceptance
К5. `montazh_versiya`: пока собирается — процент, готово — лист раскадровки и кадр крючка картинками в ответе, длительность, размер, ссылка на ролик; версия лежит в заказе монтажной, привязанном к карточке; новый лист с тем же заказом — новая в
`montazh_versiya`: пока собирается — процент, готово — лист раскадровки и кадр крючка картинками в ответе, длительность, размер, ссылка на ролик; версия лежит в заказе монтажной, привязанном к карточке; новый лист с тем же заказом — новая версия. `montazh_prinyat` кладёт ролик в карточку вместо исходников, использованных в монтаже (они остаются в заказе); карточка сама не согласуется: согласованная становится «изменено после согласования»
✓ Экзамен К5 зелёный: montazh_versiya — лист и кадр крючка, v1 → v2 тем же заказом; montazh_prinyat — ролик в карточке вместо исходников, согласование не тронуто, kartochka «изменено после согласования». ОТК Р3: принять во время сборки — отказ, повтор — «уже в карточке»; Р8: старое согласование без отпечатка тоже просит согласовать заново.
acceptance
К6. `montazh_muzyka` подбирает трек по слову (настроение, темп) из библиотеки: в ней только треки с лицензией CC0 или свои (скрипт добавления отклоняет другие), у трека настроение, темп, длительность и источник; пустая библиотека — «музыки пока
`montazh_muzyka` подбирает трек по слову (настроение, темп) из библиотеки: в ней только треки с лицензией CC0 или свои (скрипт добавления отклоняет другие), у трека настроение, темп, длительность и источник; пустая библиотека — «музыки пока нет, ролик соберётся без неё»
✓ Экзамен К6 зелёный: пустая библиотека — «пока нет»; добавлены CC0 и свой трек, CC-BY отклонён скриптом; подбор по «бодрая» и «спокойное» с настроением, темпом, длительностью, источником. На проде библиотека пуста: треки ждут решения владельца.
acceptance
(ошибка заведения) К7. `proverka_gaidbuka` по картинкам карточки: подходит ли размер и пропорция площадкам карточки (ВК, Телеграм, Инстаграм, MAX), у слайдов движка — ит
`proverka_gaidbuka` по картинкам карточки: подходит ли размер и пропорция площадкам карточки (ВК, Телеграм, Инстаграм, MAX), у слайдов движка — итог проверок движка при сборке (столкновения, кромки, висячее слово, пустые карманы), у текста поста — длинное тире, пустые заготовки и предел соцсети; по каждому пункту зелёное или красное со словами и советом
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К8. Гайдбук для модели: ресурс `fitlead://smm/gaidbuk` (цвета и шрифты из токенов мастера, рубрики, форматы площадок, правила текста отдела, маркировк
Гайдбук для модели: ресурс `fitlead://smm/gaidbuk` (цвета и шрифты из токенов мастера, рубрики, форматы площадок, правила текста отдела, маркировка рекламы) собран из данных движка, а не пересказом; `spravka_poisk` находит его разделы; виден с разделом «Контент»
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К9. Через ссылку можно вписать текст поста: он ложится в текст карточки, прежняя версия сохраняется в истории; длинное тире и превышение предела соцсе
Через ссылку можно вписать текст поста: он ложится в текст карточки, прежняя версия сохраняется в истории; длинное тире и превышение предела соцсети страница показывает до сохранения
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К10. `fayl_po_ssylke`: публичная ссылка Яндекс Диска (файл или папка до 20 файлов), Google Диска или прямая https-ссылка — файлы ложатся в карточку с
`fayl_po_ssylke`: публичная ссылка Яндекс Диска (файл или папка до 20 файлов), Google Диска или прямая https-ссылка — файлы ложатся в карточку с теми же проверками, что К5–К7. Адреса внутренней сети и самого сервера (localhost, 127.*, 10.*, 172.16–31.*, 192.168.*, 169.254.*, внутренние IPv6) отклоняются, в том числе после переадресации
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К11. `kartochka` отдаёт всё по карточке: заголовок, текст, формат, дату, рубрику, этап, согласование, площадки; файлы по порядку с номером, видом, раз
`kartochka` отдаёт всё по карточке: заголовок, текст, формат, дату, рубрику, этап, согласование, площадки; файлы по порядку с номером, видом, размером, размером кадра, у видео длительность и есть ли звук; превью картинок прямо в ответе (до 6, 512 px) и ссылки на час; журнал публикаций. Карточка чужого или закрытого проекта — отказ
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К12. `kartochka_faily` меняет порядок файлов (полный список номеров) и убирает файл из карточки; экран карточки показывает тот же порядок. Файл, на ко
`kartochka_faily` меняет порядок файлов (полный список номеров) и убирает файл из карточки; экран карточки показывает тот же порядок. Файл, на который ещё ссылаются медиатека, монтажная или журнал публикаций, с диска не стирается
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
(ошибка заведения) К13. На проде публикация во ВК из карточки (С42) работает у человека с галочкой «Публикует»; у Fit&Lead стоит месячный потолок платной генерации, зака
На проде публикация во ВК из карточки (С42) работает у человека с галочкой «Публикует»; у Fit&Lead стоит месячный потолок платной генерации, заказ сверх потолка отказывается с остатком
✓ заведено по ошибке скриптом переименования: в спринте С49 шесть критериев
acceptance
В РАБОТЕS50 · С50 · MCP СММ: знания, отчёт, пилот5/6

Цель: Сценарии и справочники СММ, статистика соцсетей, пятничный отчёт, пилот на живых материалах. docs/ACCEPTANCE.md С50.

↑ MCP СММ: знания, отчёт, пилот
Сценарии и справочники СММ, статистика соцсетей, пятничный отчёт, пилот на живых материалах. docs/ACCEPTANCE.md С50.
✓ На проде с 28.10.2026 14:20 UTC (выкат С46–С50 одним релизом по «да» владельца, бэкап c46-c50-20261028-134858, откат образом pre-c46-c50). Осталось: пилот К5 на живых материалах.
feature
К1. Сценарии подключения для СММ видны человеку с разделом «Контент и СММ» (рекламные — с разделом «Реклама», каждому свои): начало работы, пост, карусель, рилс, неделя контента, пятничный отчёт; каждый называет только инструменты СММ подключен
Сценарии подключения для СММ видны человеку с разделом «Контент и СММ» (рекламные — с разделом «Реклама», каждому свои): начало работы, пост, карусель, рилс, неделя контента, пятничный отчёт; каждый называет только инструменты СММ подключения по шагам и правила отдела (без длинного тире, публикация только согласованного, платное только после «ок» с ценой, цифры только из инструментов)
✓ Экзамен tests/spec/mcp-c50.mjs К1 зелёный 28.10 (стенд fl-wt-smm): у СММ 6 сценариев smm_*, у рекламы только рекламные; каждый сценарий называет только инструменты СММ и правила отдела; smm_rils — весь монтаж, smm_otchet — сводка и запись. ОТК c50-r1 Р7: тире в сценариях нет. Ветка smm, прод ждёт «да».
acceptance
К2. Справочники СММ ресурсами подключения (`fitlead://smm/…`), `spravka_poisk` находит их разделы, видны с разделом СММ: ЦА соцсетей (решение владельца 28.10: широкое ЗОЖ-комьюнити и стоп-лист), голос бренда, рубрики и форматы (из движка), марк
Справочники СММ ресурсами подключения (`fitlead://smm/…`), `spravka_poisk` находит их разделы, видны с разделом СММ: ЦА соцсетей (решение владельца 28.10: широкое ЗОЖ-комьюнити и стоп-лист), голос бренда, рубрики и форматы (из движка), маркировка рекламы, рабочий порядок СММ через подключение; стратегия СММ и задачи испытательного срока — из документов владельца, без документа раздел прямо пишет «ждёт документа»
✓ Экзамен К2 зелёный: справочников СММ 6 (гайдбук, ЦА, голос, порядок, стратегия, испытательный), у рекламы их нет; поиск находит ЦА по «казино ставки», голос, маркировку, рубрики; стратегия и задачи ИС пишут «ждёт документа».
acceptance
К3. `soc_statistika` за период: по каждой площадке подписчики на конец и прирост, публикации, просмотры, реакции, вовлечённость; лучшие и худшие публикации периода со ссылками; «нет данных» отдельно от нуля; заброшенные площадки не складываются
`soc_statistika` за период: по каждой площадке подписчики на конец и прирост, публикации, просмотры, реакции, вовлечённость; лучшие и худшие публикации периода со ссылками; «нет данных» отдельно от нуля; заброшенные площадки не складываются с живыми; чужой проект — отказ
✓ Экзамен К3 зелёный: ВК 1100 (+100), Телеграм «нет данных», Инстаграм заброшен и не складывается; лучшие и худшие со ссылками; чужой проект — отказ. ОТК Р5: лучшие и худшие не пересекаются; Р6: прирост с датой базового снимка.
acceptance
К4. Пятничный отчёт: `soc_otchet_svodka` за неделю кодом — план недели (карточки с датой плана на неделю: вышли или нет; публикации недели без карточки плана — «вне плана»), цифры площадок как К3, месяц к плану экрана «План» (публикации, просмо
Пятничный отчёт: `soc_otchet_svodka` за неделю кодом — план недели (карточки с датой плана на неделю: вышли или нет; публикации недели без карточки плана — «вне плана»), цифры площадок как К3, месяц к плану экрана «План» (публикации, просмотры, реакции, подписчики: сделано, план, процент; без плана — «план не задан»); `soc_otchet_zapisat` кладёт текст в блок «Разбор» экрана «Соцсети» (виден руководителю), за неделю один, повтор заменяет; без длинного тире
✓ Экзамен К4 зелёный: сводка недели — вышло 2, не вышло 1, вне плана 1; месяц к плану (публикации 5 из 10, просмотры и реакции «план не задан»); запись в блок «Разбор», повтор заменяет, тире отклонено, руководитель видит на /social. ОТК Р1: «эта неделя» по пятницу; Р2–Р4: «нет данных» в месяце, вне плана без ложных, «частично 1 из 2».
acceptance
К5. Пилот: СММщица через своего ассистента проводит 3 живых материала от загрузки до публикации; уроки пилота — в справочник (после выката на прод)
Пилот: СММщица через своего ассистента проводит 3 живых материала от загрузки до публикации; уроки пилота — в справочник (после выката на прод)
⛔ Пилот на живых материалах только после выката С46–С50 на прод и учётки СММщицы.
acceptance
готовS60 · С60 · Статьи партия 4 (28.10): ИСКРА, СММ Агент, Fit&Lead, Маркер7/7

Цель: Очереди ИСКРЫ (с 25.10), СММ (с 26.10), Fit&Lead (с 27.10) пусты, у Маркера 8 до ~16.11. Написать 10+10+10+12 статей в сессии по карточкам С40.1, холостая проверка заводом, согласование владельцем, обложки по «трачу?», постановка в очередь.

↑ Темы партии 4: 10 ИСКРА + 10 СММ из плана завода без пересечений, 10 Fit&Lead по веб-Вордстату 28.10, 12 Маркер = волна 2 плана 06.10
Карточки структур собраны на стенде (forced-cards-4.ts), брифы: uiskra-articles-4/BRIEF4.md, smm-articles-4/BRIEF4.md, fitlead-articles-2/BRIEF3.md, marker-articles-2/BRIEF2.md
task
↑ ИСКРА партия 4: 10 статей (№31–40) — написать, dryrun, превью
✓ Написаны 10 статей (№31–40) по карточкам С40.1, у каждой своя структура и голос; dryrun завода 10/10 ok:true (5 494–10 679 зн.). Превью без обложек: https://marketing.fit-lead.ru/blog-preview/iskra-4/ . Исходники C:/tmp/uiskra-articles-4/
task
↑ СММ Агент волна 4: 10 статей (№35–44) — написать, dryrun, превью
✓ Написаны 10 статей (№35–44); dryrun 10/10 ok:true. Функции площадок сверены по справкам ВК, Телеграма, MAX. Превью: https://marketing.fit-lead.ru/blog-preview/smm-agent-4/ . Исходники C:/tmp/smm-articles-4/
task
↑ Fit&Lead волна 2: 10 статей (№13–22) — написать, dryrun, превью
✓ Написаны 10 статей (№13–22) по правилам v2 (без маркетплейсов, приоритет рекламодатели); dryrun 10/10 ok:true. Исправлены схемы profile в 3 статьях (служебная черта в строках) и 1 обрезанный flow. Превью: https://marketing.fit-lead.ru/blog-preview/fitlead-2/ . Исходники C:/tmp/fitlead-articles-2/
task
↑ Маркер волна 2: 12 статей (№18–29), без картинок — написать, check.py + dryrun, превью
✓ Написаны 12 статей (№18–29), без картинок; check.py 12/12 OK, dryrun 12/12 ok:true. Нормы сверены по consultant.ru (ред. 04.08.2026), тарифы ОРД — с сайтов операторов 28.10. Превью: https://marketing.fit-lead.ru/blog-preview/marker-2/ . Исходники C:/tmp/marker-articles-2/
task
↑ Обложки 30 статей (Kie gpt-image-2 через журнал завода, ~3 ₽/шт ≈ 90 ₽) — только после «трачу?» владельца
✓ «да ок трать» владельца 28.10. 30 обложек приняты заводом по одной (журнал factory:img, 30 записей ≈ 90 ₽), просмотрены листами: без надписей и логотипов, сюжеты разные.
⛔ Ждёт «трачу?» владельца: 30 обложек × ~3 ₽ ≈ 90 ₽ (Маркер без картинок)
task
↑ В очередь: «ок» владельца на тексты → held→ready (ИСКРА, СММ, Маркер), Fit&Lead — в очередь временного крона
✓ ИСКРА 10 и СММ 10: held→ready (выходят по 2/день по плану завода). Маркер 12: REAL=1 accept_ready.sh → ready (пн/ср/пт после 8 прежних). Fit&Lead 10: тела composeHubBody → /opt/fitlead-blog-queue/bodies.json + ORDER (бэкапы .bak-20261028-*), крон 10:00/16:00 МСК, --status: 10 в очереди. Превью с обложками обновлены.
⛔ Ждёт «ок» владельца на тексты (4 страницы превью, 28.10)
task
В РАБОТЕS61 · С61 · АвтоКП: согласованный формат, минимализм23/25

Цель: Генератор выдаёт согласованный формат КП (12 экранов, анализ бренда, тексты встреч 20.10/22.10, правки Анны 27.10) в оформлении «минимализм», выбранном Анной и Ниной 28.10 (вариант «как есть», белые и чёрные экраны). Дизайн 4 по флагу. Потом передача ИТ через main и Linear CDT-1072.

↑ Состав и тексты 12 экранов
Порядок экранов, титул, «Кто мы» без базы авторов, сценарии, авторы, кейсы без бюджета, «Предлагаем начать», тарифы с охватом, 6 шагов, финал. render.ts, data/kp.
✓ Все тексты согласованной презентации в render.ts и data/kp; экзамены Д1–Д11 зелёные.
feature
Д1. Полное КП: экраны «титул, кто мы, рынок, анализ бренда, идеи, сценарии, авторы, кейсы, предлагаем начать, форматы и цена, как работаем, следующий шаг» (12). «Почему так» в полном К
Полное КП: экраны «титул, кто мы, рынок, анализ бренда, идеи, сценарии, авторы, кейсы, предлагаем начать, форматы и цена, как работаем, следующий шаг» (12). «Почему так» в полном КП по умолчанию нет, вручную возвращается составом экранов. Нет данных для анализа бренда: 11 экранов в том же порядке.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д2. Титул: строка «Реализуем инфлюенс-кампании: от бартера до международной рекламной кампании.», категория клиента, логотипы.
Титул: строка «Реализуем инфлюенс-кампании: от бартера до международной рекламной кампании.», категория клиента, логотипы.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д3. «Кто мы»: четыре цифры: 7 650 авторов; ×7 «Один из кейсов: Balanvit – продажи выросли в 7 раз в период публикаций»; 30 человек; 15 площадок, в перечне MAX, Rutube, Дзен, ОК, Wibes,
«Кто мы»: четыре цифры: 7 650 авторов; ×7 «Один из кейсов: Balanvit – продажи выросли в 7 раз в период публикаций»; 30 человек; 15 площадок, в перечне MAX, Rutube, Дзен, ОК, Wibes, Likee и «и др.». Три карточки (три способа, что не берём, откуда мы), девиз «Двигаемся. Нам это нравится» отдельной строкой, блока «Из чего состоит база авторов» нет. В дизайне 4 справа фото команды без фона.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д5. Под сценариями строка «Это варианты на выбор, можно взять один или собрать связку. Площадки, продукт и KPI уточним после брифа.»; если у бренда известна линейка, строка называет её
Под сценариями строка «Это варианты на выбор, можно взять один или собрать связку. Площадки, продукт и KPI уточним после брифа.»; если у бренда известна линейка, строка называет её («Показываем на примере …»).
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д6. «Наши блогеры»: подводка «…У каждого своя задача в кампании, полный список собираем после короткого брифа.», ER плашкой.
«Наши блогеры»: подводка «…У каждого своя задача в кампании, полный список собираем после короткого брифа.», ER плашкой.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
⛔ У крупного бренда, если все три автора меньше 100 тыс., подводка «первые три для теста» (правило С32). Оставить или всегда согласованную: решение владельца
acceptance
Д7. Кейсы: заголовок «Наши кейсы и решения на рынке»; у своих кейсов нет бюджета ни в цифрах, ни в подзаголовке, цифры: охват, к плану, CPV. Рыночные кейсы под заголовком «Решения на р
Кейсы: заголовок «Наши кейсы и решения на рынке»; у своих кейсов нет бюджета ни в цифрах, ни в подзаголовке, цифры: охват, к плану, CPV. Рыночные кейсы под заголовком «Решения на рынке в вашей категории»: название и категория, без агентства и без ссылок.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д8. «Предлагаем начать с этого»: таблица условий (площадки, авторы, что показываем, объём, срок, что получаете), три цифры (работа агентства, ориентир размещений, просмотры) и сноска;
«Предлагаем начать с этого»: таблица условий (площадки, авторы, что показываем, объём, срок, что получаете), три цифры (работа агентства, ориентир размещений, просмотры) и сноска; если линейка известна, «Что показываем» называет её.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д9. «Форматы и цена»: в каждом тарифе строка охвата из справочника (≈ 100–400 тыс., ≈ 0,5–1,5 млн, от 2 млн просмотров), у рекомендованного «Предлагаем начать», под тарифами «Цены и ох
«Форматы и цена»: в каждом тарифе строка охвата из справочника (≈ 100–400 тыс., ≈ 0,5–1,5 млн, от 2 млн просмотров), у рекомендованного «Предлагаем начать», под тарифами «Цены и охваты здесь ориентировочные. Давайте созвонимся на 20 минут…».
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д10. «Как работаем» у платной кампании: «Один партнёр на весь запуск, от брифа до результата», шаги «Бриф, стратегия и договор», «Подбор и проверка», «Медиаплан на утверждение», «Креати
«Как работаем» у платной кампании: «Один партнёр на весь запуск, от брифа до результата», шаги «Бриф, стратегия и договор», «Подбор и проверка», «Медиаплан на утверждение», «Креативы и согласования», «Маркировка и документы», «Запуск, результат и отчёт».
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
Д11. «Следующий шаг»: «За 7 дней соберём полный список авторов и медиаплан для <бренд>», «Обсудить кампанию», контакт менеджера (имя и должность, если CRM их передала), «от вас» и «от н
«Следующий шаг»: «За 7 дней соберём полный список авторов и медиаплан для <бренд>», «Обсудить кампанию», контакт менеджера (имя и должность, если CRM их передала), «от вас» и «от нас».
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
↑ Экран «Анализ бренда»
Вордстат + линейки с сайта кодом всегда; новости и планы бренда ИИ по поиску только при ai:true, каждая цифра со ссылкой и проверкой, что цифра есть на странице.
✓ Живой прогон $0,0076: три цифры с источниками (веб-поиск OpenRouter). Сверка цифр по целому числу и слову подписи. Спрос ждёт доступа к новому Вордстату.
feature
Д4. «Анализ <бренд>»: от 2 до 4 цифр о бренде, у каждой подпись «откуда». Спрос в Яндексе из Вордстата с месяцем замера; линейки с сайта бренда; новости и планы бренда из поиска только
«Анализ <бренд>»: от 2 до 4 цифр о бренде, у каждой подпись «откуда». Спрос в Яндексе из Вордстата с месяцем замера; линейки с сайта бренда; новости и планы бренда из поиска только при `ai: true`, у каждой ссылка на страницу, где цифра найдена, и цифра есть в тексте этой страницы. Подписчиков соцсетей на экране нет. Меньше двух цифр: экрана нет.
✓ kp-s61-format.mjs 13/13 на стенде /opt/avtokp-test, 28.10.2026
acceptance
↑ Оформление: минимализм по умолчанию, дизайн 4 по флагу
Фоны шаблона по экранам, стекло-карточки, белый логотип, обложка-стекло категории, фото команды. CSS_V4 поверх v2.
✓ Минимализм (v2) по умолчанию по решению 28.10: обложка фото 13, групповое фото команды, CSS_S61; дизайн 4 сохранён флагом.
feature
Д12. Дизайн 4 по умолчанию, v2 и v1 по флагу `design`. Каждый экран на фоне из шаблона дизайнеров по раскладке презентации; белый логотип Fit&Lead справа сверху на каждом экране, кроме
Дизайн 4 по умолчанию, v2 и v1 по флагу `design`. Каждый экран на фоне из шаблона дизайнеров по раскладке презентации; белый логотип Fit&Lead справа сверху на каждом экране, кроме титула.
✓ Критерий изменён 28.10 решением Анны и Нины (минимализм). kp-s61-format.mjs 13/13: по умолчанию v2, тёмные «Кто мы»/«Идеи»/«Как работаем»/финал; дизайн 4 по флагу с фонами и логотипом.
acceptance
Д13. Обложка на стекле категории: 6 картинок, тематика → картинка по таблице в коде, остальным «ЗОЖ универсальный».
Обложка на стекле категории: 6 картинок, тематика → картинка по таблице в коде, остальным «ЗОЖ универсальный».
✓ Обложка на фото 13, групповое фото команды на «Кто мы», цифры рядом; в дизайне 4 стекло категории. kp-s61-format.mjs 13/13.
acceptance
Д14. Текст читается на любом фоне: на тёмных белые заголовки и жёлтые рубрики, карточки белое стекло или бирюза; снимки 12 экранов на трёх тематиках проверены глазами.
Текст читается на любом фоне: на тёмных белые заголовки и жёлтые рубрики, карточки белое стекло или бирюза; снимки 12 экранов на трёх тематиках проверены глазами.
✓ ОТК 28.10: страница и Google-слайды Mixit, Bombbar (спортпит), Алеан (туроператор) без наездов
acceptance
Д16. PDF: каждый экран целиком на своём листе A4 (print-fit.mjs, 28 тематик).
PDF: каждый экран целиком на своём листе A4 (print-fit.mjs, 28 тематик).
✓ print-fit.mjs 112/112 на минимализме, 28.10.2026.
acceptance
↑ Дизайн 4 в PowerPoint и Google
kp_pptx.py: фоны, карточки с прозрачностью и скруглением, слайд анализа бренда, фото команды; проверка снимками Slides API.
✓ Минимализм по умолчанию и дизайн 4 по флагу; Google-снимки трёх тематик чистые.
feature
Д15. PowerPoint полного КП: те же экраны и тексты, у каждого слайда фон шаблона и белый логотип (кроме титула), карточки скруглены, «Анализ бренда» своим слайдом, фото команды на «Кто м
PowerPoint полного КП: те же экраны и тексты, у каждого слайда фон шаблона и белый логотип (кроме титула), карточки скруглены, «Анализ бренда» своим слайдом, фото команды на «Кто мы». Google рисует слайды без наездов (снимки Slides API, три тематики).
✓ kp-s61-pptx 1/1; Google-снимки трёх тематик чистые
acceptance
↑ Регресс, прогон на сделках, документы, ОТК
Медиакит и КП после встречи, старые экзамены, 5 настоящих сделок Битрикса, PROJECT/BITRIX-INTEGRATION/SCOPE-CUTS.
✓ ОТК круг 1: два независимых прохода (спека, критик 16/16 кусков), 10 из 12 находок исправлены, масштаб 20 сборок за 1 с, регресс не краснее, print-fit 112/112.
feature
Д17. Медиакит и КП после встречи собираются в дизайне 4 без пустых экранов; прежние экзамены не краснее, чем до спринта, кроме пунктов, которые этот спринт меняет решением владельца: В1
Медиакит и КП после встречи собираются в дизайне 4 без пустых экранов; прежние экзамены не краснее, чем до спринта, кроме пунктов, которые этот спринт меняет решением владельца: В14а (состав полного КП) и «Почему так» в полном КП. (все экзамены)
✓ Регресс 28.10: S61 13/13 и 1/1; kp-s32-pptx 5/5, market 1/1, swap 1/1, clean зелёный. Красные по решению владельца (11 экранов без данных о бренде, v4 по умолчанию, нет «Почему так»): kp.mjs 3, kp-final 2, kp-formats Ф1, s32-why В9/В10, s32-vlad В14а. Красные не из-за спринта: api.mjs httpbin 400 (внешний сервис), s32-google В6 (доступ Google стенда протух с 19.10), s32-texts В15 (ждёт выбор обложки), kp-final «подписчики 89 из 123» (данные). Попутно убраны дубли экранов в КП после встречи.
acceptance
Д18. Прогон на 5 настоящих сделках из Битрикса: тематика верна, в анализе бренда нет цифр без источника, пустых экранов нет.
Прогон на 5 настоящих сделках из Битрикса: тематика верна, в анализе бренда нет цифр без источника, пустых экранов нет.
⛔ 5 случайных сделок Битрикса (seed 2810): 4 КП + 1 честный отказ (нет тематики). Экрана «Анализ бренда» нет ни в одном: Вордстат по API Директа мёртв с ~20.10 («not available in this API version»), нужен доступ к api.wordstat.yandex.net; фраза мерилась по юрлицу (исправлено d970bd5). Тематика: NFK (niopharm.ru) и Валери-Д ушли в косметику/косметологию, проверить (логика С30, не этого спринта).
acceptance
Д19. Документация: PROJECT.md (экраны, дизайн 4, анализ бренда), BITRIX-INTEGRATION.md (состав полного КП, `brandFacts`), SCOPE-CUTS-LOG.md.
Документация: PROJECT.md (экраны, дизайн 4, анализ бренда), BITRIX-INTEGRATION.md (состав полного КП, `brandFacts`), SCOPE-CUTS-LOG.md.
✓ PROJECT.md (12 экранов, 2.4а анализ бренда, 2.6 дизайн 4), BITRIX-INTEGRATION.md (mode full, brandFacts, design, ai), SCOPE-CUTS-LOG.md (8 углов). Коммиты s61-format a3d80a6, dd945c9, e6af670, d970bd5 (локально, не в GitHub).
acceptance
↑ Передача ИТ: main + задача в Linear
Слияние s32-vlad → main в GitHub Logonchek/fitlead-avtokp и пост в CDT-1072 только по «да» владельца. Срок чт–пт 29–30.10.
✓ main на GitHub d9cd1a6; сообщение Дмитрию опубликовано в CDT-1072 28.10 (комментарий f3741cb9): перенос в git.maniteka.com, конфликты, ключи Google в рабочем режиме.
feature

Ворклог (места остановки)

28.10.2026, 14:41:15 · Выкат С46–С50 · claude

28.10 14:20 UTC выкачены С46–С50 (MCP СММ: загрузка в карточку, фото и карусели, публикация ботами и пакетом, монтаж, сценарии и справочники СММ, цифры соцсетей и пятничный отчёт). Первая сборка упала: адрес пакета /p/<код> совпал со старым адресом экрана проекта (ловит только боевая сборка) — пакет на /pk/<код>. Миграции 7/7, отпечатки (0 нужно), потолок генерации 2 000 ₽, крон публикаций раз в минуту отвечает ok. mcp-c46-prod К13 зелёный. Регресс на стенде С46/С48 зелёный.

→ Владелец: учётка Анастасии, @fitleadmy_bot админом в Fit_Lead и Fit_LeadWEB (потом перевести аккаунты в telegram_bot), бот MAX, ключ ElevenLabs, музыка, документы (стратегия СММ, задачи ИС), план месяца на «Плане». Потом пилот С50 К5 и проверки по сроку 04.11 (MAX, Scribe).

28.10.2026, 13:43:20 · С49–С50 MCP СММ · claude

28.10: С49 монтаж своим Claude/ChatGPT (разбор ролика, расшифровка Scribe в два шага с лимитом СММ, монтажный лист с проверкой кодом, сборка на сервере: субтитры по словам с подсветкой, плашки, приглушение музыки, версии раскадровкой, «принять» без самосогласования) — экзамен 6/6, ОТК р1 10/10, масштаб (10 мин разбор 44 с, 180 с сборка 134 с). С50 сценарии СММ, справочники fitlead://smm/…, soc_statistika, пятничный отчёт в блок «Разбор» экрана «Соцсети» — экзамен 4/4, ОТК р1 7/7. Регресс С36–С49 зелёный. Всё на стенде, ветка smm.

→ Ждём «да» на выкат С46–С50 одним релизом (шаги в отчёте владельцу и docs/DEPLOY.md), учётку Анастасии, бота в ТГ-каналы, MAX, ключ ElevenLabs, решение по музыке, документы: стратегия СММ и задачи ИС, план месяца на экране «План». После выката — mcp-c46-prod.mjs и пилот С50 К5.

28.10.2026, 12:24:11 · 61 · claude

Новости бренда через ИИ прогнаны вживую ($0,0076, три цифры с источниками, поиск переведён с DuckDuckGo на веб-поиск OpenRouter, стоимость в ответе aiCostUsd). Ещё две тематики проверены. ОТК круг 1: 10 из 12 находок критика исправлены, регресс и печать 112/112 зелёные. main на GitHub перемотан до d9cd1a6.

→ 1) «ок» владельца на сообщение Дмитрию в CDT-1072, отправить. 2) Решения: Д6 (подводка у крупного бренда), принять правки экзаменов исполнителем. 3) Владелец подаёт заявку на Вордстат API; после ClientId перевести генератор на новый API.

28.10.2026, 11:45:24 · С46–С49 MCP СММ · claude

28.10: план С46–С50 «MCP СММ» согласован владельцем. С42 (публикация ВК) выкачен на прод по «да». С46 (загрузка в карточку по ссылке с телефона, файлы по ссылке Я.Диска/Google, kartochka, вход ChatGPT), С47 (обработка фото кодом, карусели на фото, ИИ-правка в лимите отдела, проверка по гайдбуку, гайдбук справочником), С48 (публикация ВК/Телеграм/MAX из подключения, очередь к дате, отпечаток согласования, пакет для ручной выкладки) — готовы на стенде, ОТК зелёный, регресс зелёный. Ветка smm в C:\tmp\fl-smm.

→ Ждём «да» на выкат С46–С48 (миграции, backfill отпечатков, потолок проекта 2000, крон публикаций), учётку Анастасии (экран «Люди»), бота админом в ТГ-каналы, решения по MAX, музыке и ключу ElevenLabs. Дальше С49 монтаж (разбор, расшифровка, монтажный лист, склейка) и С50.

28.10.2026, 11:05:09 · 61 · claude

Анна и Нина выбрали минимализм (ТГ 28.10 13:13). Генератор переведён: v2 по умолчанию, обложка фото 13 как в образце, «Кто мы» с групповым фото команды и цифрами в ряд, ER жёлтый, светлая плашка призыва в тарифах. Экзамены С61 13/13 и 1/1, печать 112/112, Google и PDF сверены с образцом 1JCVkjkd…. Коммиты 5ed95aa, 875ee85 (локально).

→ 1) «трачу?» на живой прогон новостей бренда. 2) Доступ к api.wordstat.yandex.net. 3) Снимки ещё двух тематик, ОТК. 4) По «да»: main + задача Диме/Эльдару в Linear CDT-1072.

28.10.2026, 10:21:57 · 61 · claude

С61 АвтоКП: правки Анны 27.10 внесены в дизайн 4 (база авторов убрана, «Один из кейсов: Balanvit»). Код генератора под согласованный формат и дизайн 4: 12 экранов с «Анализом бренда», тексты встреч, фоны/стекло/обложка категории/фото команды на странице, в PDF и PowerPoint/Google. Экзамены С61 13/13 и 1/1, печать 112/112, стенд /opt/avtokp-test. Попутно: дубли экранов в КП после встречи, спрос по юрлицу.

→ 1) «ок, трачу?» на один живой прогон новостей бренда (доли цента). 2) Доступ к api.wordstat.yandex.net или решение без спроса. 3) Снимки ещё двух тематик (страница и Google). 4) ОТК. 5) По «да» владельца: слияние s32-vlad + s61-format в main, задача Диме/Эльдару в Linear CDT-1072 (чт–пт 29–30.10).

28.10.2026, 08:51:12 · С60 · Статьи партия 4 · claude

28.10: очереди ИСКРЫ (пусто с 25.10), СММ (с 26.10), Fit&Lead (с 27.10) закрыты партией из 42 статей: ИСКРА 10, СММ 10, Fit&Lead 10 (темы по веб-Вордстату 28.10), Маркер 12 (волна 2 плана). Карточки структур С40.1 на стенде (forced-cards-4.ts), 16 писателей-подагентов, dryrun 42/42 ok, схемы нарисованы заводом бесплатно и просмотрены листами, 3 испорченные profile и 2 обрезанные схемы исправлены. Превью: blog-preview/iskra-4, smm-agent-4, fitlead-2, marker-2.

→ После «ок» и «трачу?»: accept_hold.sh по одной (ИСКРА, СММ, Fit&Lead) → обложки → held→ready; Fit&Lead — тела composeHubBody в /opt/fitlead-blog-queue/bodies.json + ORDER; Маркер — REAL=1 bash accept_ready.sh (очередь пн/ср/пт). Найдено: в живой статье Маркера pometka-reklama неподтверждённая фраза о служебной странице ОРД VK — ждёт решения владельца.

28.10.2026, 07:57:39 · С36, С43 · claude

28.10 выкачены на прод С36 (креативы, фото Kie, контент) и С43 (Директ под ключ) по «да» владельца. Бэкап /opt/fitlead-dash-backups/mcp-c36-c43-20261028-074728, образ fitlead-dash-app:pre-mcp-c36-c43. Перед выкатом найдено: рантайм-образ не копировал data/direct (стандарт сборки) — добавлено в Dockerfile. Проверено на проде временной локальной учёткой (удалена): 45 инструментов, сценарий sobrat_reklamu, kreativ_foto, сборщик прошёл стандарт, живость ссылок и чтение Директа до отказа «такая кампания уже есть», планов 0. Лимит генерации fitlead 1000 ₽/мес поставлен. Починка Метрики (русское «слишком сложный») на проде. Прод = ветка c43, коммит 04a0e00.

→ 1) Владелец отправляет Артёму текст подключения; проверка по сроку 31.10. 2) Проверка 02.11: недельный сбор разрезов. 3) С44 ВК под ключ: экзамены до кода. 4) Ключ Вордстата в Yandex Cloud (С45). 5) Ветка vk-publish (С42 соседней сессии) основана на a20c0dc — перед её выкатом перебазировать на c43. 6) Живая проверка черновиком по «да».

27.10.2026, 07:23:18 · С36, С43 · claude

27.10: С36 (креативы, фото Kie, контент-план через подключение) доделан и прошёл ОТК (экзамен 11/11, ОТК 9/9). По просьбе владельца «реклама под ключ» заведены С43–С45 (Директ, ВК, семантика); С43 «Директ под ключ» сделан и прошёл ОТК в 2 круга: новая кампания поиск/РСЯ/ретаргет с комбинаторными объявлениями (7 заголовков, 3 текста, до 5 картинок из «Креативов»), стандарт отдела кодом (минус-слова со словоформами, 752 запрета площадок, метки, младше 18, автотаргетинг, b2b), проверка ссылок, группа в готовую кампанию, проверка по чек-листу перед первым запуском, сценарий sobrat_reklamu. Экзамен С43 13/13, ОТК 15/15 и 5/5, масштаб прогнан, регресс зелёный. Проверка по сроку 0898b7d5 закрыта: прод-сбор Директа 4/4 после выката С34; С34 12/13. Попутно починен сбор разрезов Метрики (русский текст «слишком сложный»). Ветка c43 в C: mp l-mcp, на проде НЕ выкачено.

→ 1) «да» владельца на выкат С36+С43 (+ лимит генерации fitlead 1000 ₽/мес) — до пн 02.11 03:30, иначе недельный сбор разрезов упадёт на Метрике. 2) Ключ Вордстата в Yandex Cloud (чей аккаунт — решает владелец) для С45. 3) С44 «ВК под ключ»: экзамены до кода на подменном ВК, затем код по коду пакета vk.mjs. 4) Живая проверка черновиком в кабинете Fit&Lead по «да» (С43 SCOPE-CUTS п.2). 5) Подключение Артёма и пилот С38.

26.10.2026, 14:24:55 · СММ: публикация / С42 · claude

С42 «Публикация во ВКонтакте из карточки» готова на стенде fl-wt-vkp: галочка «Публикует в соцсети» (только ashamray), предпросмотр с отпечатком, сейчас/к дате плана, фото через вложения сообщений, журнал отправок с уникальным liveKey против дублей, обрыв закрывает повтор до проверки стены/отложенных. Экзамен 22/22 (точка отсчёта 21 красный), ОТК 2 круга: 13 находок исправлено, c42-r1 7/7, c42-r2 4/4, next build чистый. Ветка vk-publish в C: mp l-vkpub от deploy-c34-37 a20c0dc; прод совпадает с базой (отличия только CRLF).

→ 1) «Да» владельца на прод → выкатка (бэкап базы и кода, тег pre-c42, миграция 20261026150000_vk_publish), согласовать с сессией С36. 2) Р1: первый живой пост владельцем — проверка, что стена принимает фото из вложений сообщений. 3) VK_SERVICE_TOKEN от владельца. 4) Видео: одобрение права video у ВК → ссылка авторизации.

26.10.2026, 13:02:34 · СММ: публикация / Соцсети · claude

Ключ сообщества ВК fit_lead поставлен в дашборд (VK_TOKEN + хранилище), контейнер пересоздан на том же образе 07d621e. Сбор ВК ожил: 170 подписчиков. Ключ проверен живыми вызовами по всем методам: подписчики да; стена/статистика нет (27); wall.post доступен; wall.edit/delete нет; фото через вложения сообщений грузятся; video.save и shortVideo.create закрыты, клипы ключом сообщества нельзя, работают только видеоистории. Карта в docs/SOCIAL.md.

→ 1) Сервисный ключ приложения 54409936 от владельца → VK_SERVICE_TOKEN (записи и просмотры ВК). 2) Спринт «СММ: публикация» (ВК): план отправлен владельцу, ждёт «ок». 3) Первый живой пост с фото = проверка, принимает ли стена фото из вложений сообщений.

26.10.2026, 12:59:55 · С34 · С35 · С37 MCP · claude

26.10 по «да» владельца выкачены на прод MCP С34 (чтение рекламы), С35 (изменения планом), С37 (справочники, сценарии, уроки, вход OAuth) без недоделанного С36. На проде 33 инструмента вместо 6, 6 сценариев, 24 справочника; проверено временным ключом владельца (отозван). Сборка из C: mp l-mcp ветка deploy-c34-37, полный С36 в ветке c36-wip. Экзамены на стенде на свежей копии прода: С35 11/11, С37 9/9, ОТК С35 и С37 все круги зелёные, С33 33/34 (сигнал запуска на стенде невозможен). С34 9/13: К5 ждёт решения по экзамену, К3/К9/К12 упали на забитой очереди офлайн-отчётов Директа (дублирующий прогон экзамена). Бэкап: /opt/fitlead-dash-backups/mcp-c34-37-20261026-*, образ fitlead-dash-app:pre-mcp-c34-37. Находка: сбор целей Директа на проде падал ежедневно на «1 раз в 10 секунд» (0/4 кабинета 23–26.10) — чинится выкаченной обёрткой С34.

→ 27.10: проверка по сроку — ночной сбор Директа 4/4 и перепрогон С34 одним процессом. Владельцу: решение по экзамену К5, ключ Kie с лимитом в профиле, ключ подключения Артёму (или Артём сам в профиле / вход из claude.ai). Дальше С36: довести код из c36-wip (креативы по гайдбуку, фото Kie под лимитом, контент СММ), экзамены на подменном Kie, ОТК, выкат по «да». Потом пилот С38 с Артёмом.

23.10.2026, 05:07:59 · S31 · claude

21–23.10, АвтоКП по встречам 20.10 и 22.10 (Аня, Влад). Разбор встречи 20.10 по документу правок Вероники: размечен цветами (Google Doc 1Wt5Cmko…). По решению владельца правки сначала вносятся РУКАМИ в копию КП Mixit (Google Slides 1S7Mq7Rl…, резерв 1fROuFMj…), генератор не трогали. Внесено через Slides API (Nango-интеграция kp-slides-edit): новый подзаголовок обложки, 9 площадок, без «Слоган», фото команды с фотосессии (№26) на «Кто мы», фон Ани на «Рынке», подводка Smile Rituals, без повтора Balanvit и «живой аудитории», ссылки на профили блогеров, кейсы без брендов и ссылок, CPV Yomilk 0,5, прогноз охвата, «Как работаем» с брифом/договором/маркировкой. Выгрузка данных по блогерам в Excel (исходник ДО + каталог 123 автора). Разобрана встреча 22.10: сокращение до 9 слайдов отменено, 11/12 и «Предлагаем начать» вернуть, рынок двумя слайдами (+анализ бренда), ER жёлтой плашкой, бренды в решениях рынка вернуть, бюджет из наших кейсов убрать, охват в тарифы + оффер «созвон 20 минут», стратегию в шаги, два варианта дизайна на голосование. Грабли: Google OAuth клиента lia1231 в режиме теста, refresh-токены дохнут ~7 дней — avtokp-google и стенд (GOOGLE_REFRESH_TOKEN invalid_grant) мертвы с ~19.10.

→ 1) Владелец отвечает на 3 вопроса: возвращать ли «Почему Telegram», что дописать к площадкам (Likee и др.?), делать ли сейчас два варианта дизайна. 2) Внести правки встречи 22.10 в копию КП Mixit, проверить снимками слайдов. 3) Встреча автоКП_встреча3 23.10 11:15 Екб. 4) После согласования вида — перенести правки в генератор (репо fitlead-avtokp, ветка s32-vlad), переподключить Google у генератора, затем выгрузка в Битрикс (Миша в отпуске до 01.11).

22.10.2026, 10:40:31 · · claude

Блог fit-lead.ru запущен 22.10: reklama-u-blogerov и skolko-stoit-reklama-u-blogerov на проде (MCP, 240 с до сайта), проверены список, sitemap, JSON-LD, десктоп и телефон. 9 статей — временный крон /opt/fitlead-blog-queue (07:00/13:00 UTC, ≤2/день), до 27.10.

→ Попросить у Дмитрия ingest-ключ прода → HUB_FITLEAD_INGEST_KEY, проект fitlead enabled, крон очереди убрать. 23.10 проверить выход 3-й и 4-й статьи.

22.10.2026, 10:32:56 · · claude

Блог fit-lead.ru на проде (Дмитрий 22.10, ключ fitLead_prod_mcp): кэш no-store, фикстур нет, /blogs в sitemap. 11 статей Fit&Lead залиты MCP в боевой хаб как pending (change_seq 1–11), на сайте 404. Публикация ждёт явного «публикуй все 11 на прод» (автоклассификатор).

→ После «да»: python3 /tmp/fl-mcp.py publish на cfru, проверить fit-lead.ru/blogs и статьи (десктоп+телефон), отписаться Дмитрию и попросить ingest-ключ прода для завода (hubPut). Затем factory_articles fitlead → published, проект enabled.

21.10.2026, 09:04:41 · · claude

CDT-754 стенд: наша статья reklama-u-blogerov опубликована на testsite.fit-lead.ru (появилась через 30 с), проверена глазами на десктопе и 390 px: обложка, 4 схемы, врезка, Что запомнить, HowTo, FAQ, JSON-LD, без горизонтальной прокрутки. Блог стенда рабочий.

→ Дмитрию до прода: кэш /blogs на год на боевом, CTA под статьёй по разделу (для рекламодателей не «Зарабатывайте на трафике»), фикстуры не на прод, ключи ingest+mcp боевого проекта + галочка публикации. У нас: подписи схем крупнее для телефона. После ключей — проект fitlead в заводе, выкладка по «ок».

21.10.2026, 09:03:07 · · claude

CDT-754: проверен стенд блога testsite.fit-lead.ru (Дмитрий 21.10). Фикстуры рендерят все блоки и JSON-LD, черновик не течёт. Наша статья reklama-u-blogerov (обложка + 4 схемы) загружена MCP и по «публикуй на стенд» владельца опубликована в стейдж-хабе (change_seq 8), ждём появления на сайте. Замечания Дмитрию: кэш боевого /blogs на год, фикстуры не на прод, ключи ingest+mcp боевого проекта и галочка публикации, meta description из excerpt.

→ Досмотреть статью на стенде (десктоп+мобильный), дать владельцу итог. После боевых ключей: проект fitlead в заводе (HUB_FITLEAD_INGEST_KEY, enabled), 11 статей held → ready только по «ок» владельца.

20.10.2026, 10:19:00 · · claude

«Все статьи ок, ставь в очереди»: ИСКРА партия 3 (10) и СММ волна 3 (10) held → ready, выходят по плану завода (wave, rank) с 20.10 16:00 МСК до 25.10 утра. Fit&Lead: 10 обложек перерисованы новыми сценами (30 ₽ журналом завода), статьи held, превью /blog-preview/fitlead/ обновлено. Траты завода 20.10: 90 ₽.

→ 21.10 проверить, что статьи ИСКРЫ и СММ стали live на сайтах. К 25.10 следующие партии (проверка 23.10). Fit&Lead ждёт канал выкладки (CDT-754 у Дмитрия). С40.1 на прод не выкатывать до С40.2 (выбор структуры).

20.10.2026, 08:43:15 · · claude

20.10 завод статей: ИСКРА (uiskra) пустая с 17.10, СММ Агент с 19.10. Написано и принято на паузу (held) по 10 статей: ИСКРА партия 3 (MBTI, психотипы, эннеаграмма, Герой, мужские архетипы, дата рождения, распаковка, визуальный стиль, подарок со смыслом, стратегия на год) и СММ волна 3 (как писать посты, продающий пост, продвижение ВК, идеи для бизнеса, автопостинг, tone of voice, рубрики, нейросеть для постов, хештеги ВК, сторителлинг). Структуры по каталогу С40.1, карточки собраны buildCard стенда с заданной структурой (выбор кода промахивался в половине тем). Обложки ≈60 ₽ журналом завода. Превью: marketing.fit-lead.ru/blog-preview/iskra-3/ и /smm-agent-3/. stage.uiskra.ru блог 404 — каркас превью снят с живого uiskra.ru.

→ После «ок»: held → ready (SQL update status) по обоим проектам. С40.1 на прод — ждёт «да, на прод». В С40.2: классификатор задачи темы (почти всё «how»), счётчики tldr/takeaways/faq карточки против quality.ts, after:intro.

19.10.2026, 13:15:26 · С41 · Бот Насти: задачи Битрикса · claude

С41 выкачен на прод 19.10.2026 16:12 МСК: миграция crm_task_watch, на боевом экзамены 33/33, регресс 44/44, ОТК 15/15. Первый живой обход без ошибок, Насте ушло одно сообщение про 4 задачи по чужим лидам. Зеркало C: mp l-wtint = прод. Стенд fl-wt-tb остановлен (поднять wt-up.sh tb 3211).

→ 21.10 проверка по сроку (объём сообщений, живое зачёркивание, строка Лии). Ждут владельца: Т23а, «Не требуется» в «Напиши сообщение», где Настя пишет итог разговора (для проверки комментария), предупредить ли Настю о новом формате. Отдельно: часовой full-обход каждый час отдаёт пустой ответ.