← все проекты

Альфа центр (заказ)

server: cfru 80.90.184.203. ЖИВОЙ АДРЕС ДЛЯ КЛИЕНТА: http://80.90.184.203:3131 (пароль в /opt/zavod-order/.env). Прокси для OpenAI/HeyGen: aitodo:8888.
ревьюS1 · Каркас и контент-план10/12

Цель: Поднять переносимый скелет, дизайн-систему демо, дашборд с переключением страниц, схему БД и полноценный контент-план на месяц с ИИ и ручными идеями.

🔴 Репозиторий и docker-compose
app + worker + postgres + redis + .env.example. Никаких завязок на нашу инфраструктуру, прокси и ключи параметрами.
✓ app + worker + postgres + redis, .env.example, .dockerignore. Прокси только для закрытых сервисов, отдельной переменной. Ротация логов и потолок памяти Redis заданы.
infra
↑ Дизайн-система из демо
Токены, шрифты Unbounded и Golos Text, тёмная тема, золото E9B949, карточки и кнопки как в демо.
✓ Токены сняты с демо один в один: фон 0A0B0E, золото E9B949, Unbounded и Golos Text. Проверено скриншотом.
ui
🔴 Шелл дашборда и вход
Сайдбар с разделами, переключение страниц роутами, вход по паролю, сессия в httpOnly cookie.
✓ Сайдбар, 8 разделов отдельными маршрутами, вход по паролю, сессия в httpOnly cookie. Middleware закрывает и страницы, и API: без куки страницы 307 на вход, API 401. Проверено curl.
ui
🔴 Схема БД
Бриф, элементы контента, контент-план, настройки, задания очереди, расходы, версии, логи публикаций.
✓ 16 моделей: бриф, контент, версии, задания, публикации, расходы, цены моделей, настройки, аккаунты, ключи. Схема накачена, сид с ценами прошёл.
backend
🔴 Календарь контент-плана
Месяц целиком, переключение месяцев, архив прошлых, счётчики по типам на день.
✓ Календарь плюс вид списком, переключатель в шапке. В списке видно идею, хук, рубрику, время, что уже готово. Проверено скриншотами.
feature
↑ Создание идей вручную
Три типа: пост, видео, ИИ-аватар. Своя идея текстом.
✓ Кнопка «Добавить свои идеи» в шапке плана плюс плюсик в каждом дне. Два режима: одна идея с полями или пачка тем строками, каждая строка становится отдельным материалом. Пустые строки и повторы отбрасываются. Есть тумблер «раскидать по дням подряд». ПРОВЕРЕНО: 5 строк с пустой и дублем дали 3 материала на 5, 6 и 7 августа.
feature
🔴 Генерация плана через ИИ
Эндпоинт и промпт с рубриками готовы, раскладка по датам и типам работает. Ждёт ключ OpenAI для проверки на живой выдаче.
feature
🔴 Одобрить, отклонить, переделать, удалить
Переделка требует комментарий что не так. Версии сохраняются, удалённое уходит в архив.
✓ Действия в карточке и в списках. Переделка не принимается без комментария, прошлая версия пишется в ItemVersion. Удаление мягкое, уходит в архив.
feature
🔴 Привязка даты, времени и соцсетей
На день можно задать разный набор: например 2 видео и 2 поста завтра, 3 видео и 1 аватар через три дня.
✓ Дата, время и набор сетей на каждом материале. Часовой пояс проверен: 10:00 по Москве легло как 07:00 UTC.
feature
↑ Деплой на поддомен с HTTPS
Пока открыто по IP без домена, по решению владельца: http://80.90.184.203:3131. Проверено снаружи: вход проходит, все разделы отдают 200, без сессии 307 на вход. Домен и сертификат отложены до передачи проекта клиенту.
infra
🔴 ИИ-агенты: планировщик, хуки, сценарист, описания
Четыре агента с раздельными промптами и правилами. Хуки выдаются вариантами, любой ставится основным. Каждый запуск пишется в AgentRun. ПРОВЕРЕНО вживую на ключе владельца: агент хуков выдал 5 рабочих вариантов.
✓ Четыре агента с раздельными промптами и правилами. Хуки выдаются вариантами, любой ставится основным. Каждый запуск пишется в AgentRun. ПРОВЕРЕНО вживую на ключе владельца: агент хуков выдал 5 рабочих вариантов.
feature
↑ Просмотр работы агентов в карточке
Вкладка «Работа агентов»: какой агент, какая модель, сколько токенов, что попросили и что вернул. Выдача перестала быть чёрным ящиком.
✓ Вкладка «Работа агентов»: какой агент, какая модель, сколько токенов, что попросили и что вернул. Выдача перестала быть чёрным ящиком.
ui
В РАБОТЕS2 · Генерация контента5/8

Цель: Очередь и воркер, генерация постов, видео и ИИ-аватаров, хранилище медиа, учёт расходов с жёсткими лимитами.

🔴 Очередь и воркер
BullMQ, статусы в очереди / генерится / готово / ошибка, ретраи с лимитом, видимость прогресса в интерфейсе.
✓ BullMQ плюс дублирование статусов в таблице Job ради истории и причины падения. Растущая пауза между повторами. Ошибки настройки не повторяются, это отдельный класс ошибки.
backend
🔴 Клиент Kie и карта моделей
Донор из Контент-Завода. Wan 2.7, Seedance 2, Kling 3.0, Veo 3.1, выбор в настройках.
✓ Слаги взяты из рабочего кода: wan/2-7-text-to-video, bytedance/seedance-2 и 2-fast, kling-3.0/video, Veo на своих эндпоинтах. Поллинг с разбором двух форматов ответа.
backend
🔴 Генерация постов
Ветка через Kie gpt-image-2 написана, ждёт ключ.
feature
🔴 Генерация видео
Ветка написана, выбор модели и длительности из настроек или с материала. Ждёт ключ.
✓ Видео снимается: причина отказов была в middleware, не пропускавшем подписанные ссылки на кадр. Проверено готовым роликом 720x1280, 8 секунд.
feature
🔴 Генерация ИИ-аватаров
Клиент HeyGen написан, лицо и голос берутся из настроек. Ждёт ключ.
feature
↑ Хранилище медиа
Том storage, отдача через закрытый роут, уборка по сроку хранения. Не проверено на реальных файлах, нужен ключ генерации.
backend
🔴 Учёт расходов и лимиты
Счётчик по моделям, дневной и месячный потолок, жёсткий стоп и уведомление при превышении.
✓ ПЕРЕДЕЛАНО по фидбеку владельца: прайса нет вообще. Читаем баланс Kie (GET /api/v1/chat/credit) и HeyGen до и после генерации, пишем фактическое списание в кредитах. Лимиты в кредитах: день, месяц, минимальный остаток. Баланс Kie выведен на обзор и в настройки, читается живьём (проверено: 33 кредита).
feature
↑ Вкладки Видео, Посты, Аватары
Отдельные разделы со списками, фильтрами по статусу и датам, превью и перегенерацией.
✓ Три раздела с фильтрами по статусу, превью медиа, действиями и перегенерацией.
ui
В РАБОТЕS3 · Публикация и расписание2/7

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

🔴 Подключение аккаунтов Upload-Post
Клиент и разводка по сетям написаны, ждут доступы.
✓ Профили и подключённые сети тянутся из кабинета по GET /api/uploadposts/users. Профиль выбирается из выпадающего списка, сети отмечаются галочками, выбор пишется в SocialAccount и используется как набор по умолчанию. Руками имя профиля больше не вводится. ПРОВЕРЕНО на живом ключе: подтянулся профиль Content-zavod.
integration
↑ Прямой VK
Три шага загрузки и wall.post написаны, ждут токен.
integration
↑ Прямой Telegram
Публикация в канал и бот согласования написаны, ждут токен.
integration
🔴 Публикация по расписанию
Планировщик в воркере, окна времени и часовой пояс. Проверка на живой отложенной публикации после доступов.
feature
↑ Ссылка первым комментарием
Механизм написан заново (в нашем КЗ его нет). VK и Telegram закрываются нашими вызовами, по сетям Upload-Post честно помечено «надо проверить». Проверка на живых аккаунтах после доступов.
integration
↑ Логи публикаций и повторы
История отправок, текст ошибки, ручной и автоматический повтор.
backend
Раздел Расписание
Общий вид отправок на неделю и месяц, ближайшие публикации, ручной сдвиг.
✓ Ближайшие отправки, журнал публикаций по сетям с отдельной отметкой про первый комментарий, история опубликованного.
ui
В РАБОТЕS4 · Согласование, автопилот, перенос1/7

Цель: Телеграм-бот согласования, автогенерация заранее, автопилот с предохранителями, пакет переноса на сервер клиента.

🔴 Телеграм-бот согласования
Кнопки, сбор причины переделки ответным сообщением, вебхук с проверкой секрета. Ждёт токен бота.
feature
↑ Поведение без ответа
Что делать, если до времени публикации никто не нажал: публиковать, держать или отменять. Настройкой.
feature
🔴 Автогенерация заранее
Старт за N часов до публикации реализован в планировщике, настройка есть. Проверка после ключей.
feature
↑ Автопилот с предохранителями
Тумблеры автогенерации и автопубликации, лимиты, поведение при молчании в боте. Проверка после ключей.
feature
🔴 Бриф компании
Общий бриф плюс отдельные под видео и под посты, флаг ссылки в первом комментарии, тон и стоп-слова.
✓ Общий бриф плюс отдельные под посты, видео и аватаров с наследованием общего. Флаг ссылки в первом комментарии.
feature
🔴 Пакет переноса на сервер клиента
HANDOVER.md написан, включая ловушку с SESSION_SECRET и ключами. Проверка развёртывания на чистой машине не делалась.
infra
Сбор охватов после публикации
Заготовка под аналитику: складываем метрики сразу, чтобы потом были исторические данные.
backend
ревьюS5 · Надёжность и стандарты28/28

Цель: Перенести ядро надёжности и правила речи, найденные на заводе навесов, пока проект ничего не сгенерировал.

🔴 Идемпотентная задача у провайдера
Отправка один раз на слот, номер в задании до ожидания, повтор доглядывает ту же задачу. Раньше таймаут HeyGen в 20 минут приводил к трём новым видео и тройному счёту.
✓ Отправка один раз на слот, номер в задании до ожидания, повтор доглядывает ту же задачу. Раньше таймаут HeyGen в 20 минут приводил к трём новым видео и тройному счёту.
backend
🔴 Ожидание отделено от провала
Работа идёт дольше обычного значит возврат к той же задаче через 5 минут без траты попытки, материал остаётся в работе.
✓ Работа идёт дольше обычного значит возврат к той же задаче через 5 минут без траты попытки, материал остаётся в работе.
backend
🔴 Запрет повтора после списания
Отказ со списанием останавливает задание и шлёт уведомление: работу надо забрать, а не заказывать заново.
✓ Отказ со списанием останавливает задание и шлёт уведомление: работу надо забрать, а не заказывать заново.
backend
🔴 Чистый учёт при ожидании
Пока задача идёт, строка расхода не пишется: раньше каждое ожидание оставляло в ленте «не получилось» без списания.
✓ Пока задача идёт, строка расхода не пишется: раньше каждое ожидание оставляло в ленте «не получилось» без списания.
backend
🔴 Очередь на две полосы
Тяжёлые работы строго по одной, лёгкие по три: замер расхода по балансу на параллельных генерациях врёт.
✓ Тяжёлые работы строго по одной, лёгкие по три: замер расхода по балансу на параллельных генерациях врёт.
backend
🔴 Русская речь и запрет надписей в видео
Язык требуется прямо, реплика кириллицей, надписи в кадре запрещены. Иначе модель озвучивает по-английски.
✓ Язык требуется прямо, реплика кириллицей, надписи в кадре запрещены. Иначе модель озвучивает по-английски.
backend
🔴 Поле образца input_urls
Было image_urls: модель молча игнорировала образец. Сейчас не стреляло только потому, что картинки по образцу не использовались.
✓ Было image_urls: модель молча игнорировала образец. Сейчас не стреляло только потому, что картинки по образцу не использовались.
backend
🔴 Стандарты в docs/STANDARDS.md
Свод правил по деньгам, надёжности и речи с указанием, где что закреплено в коде.
✓ Свод правил по деньгам, надёжности и речи с указанием, где что закреплено в коде.
backend
↑ Карусели как формат
Новый тип контента, раздел в меню, режиссёр слайдов, русский текст печёт сама модель картинки. Схема, очередь, планировщик, публикация и согласование знают про карусель.
✓ Новый тип контента, раздел в меню, режиссёр слайдов, русский текст печёт сама модель картинки. Схема, очередь, планировщик, публикация и согласование знают про карусель.
backend
↑ Библиотека фотографий объектов
Раздел в брифе: загрузка пачкой, подписи, удаление с проверкой использования. Выбор из библиотеки при создании материала.
✓ Раздел в брифе: загрузка пачкой, подписи, удаление с проверкой использования. Выбор из библиотеки при создании материала.
backend
↑ Свои фото в материалах
Поле subjectPhotoPath: есть фото значит картинка собирается правкой этого фото, а не рисуется с нуля.
✓ Поле subjectPhotoPath: есть фото значит картинка собирается правкой этого фото, а не рисуется с нуля.
backend
↑ Стоп-темы в Альфе
15 правил плюс строки клиента из брифа, проверка ПОСЛЕ генерации с одной переделкой и внятной ошибкой. Проверено: ловит 3 из 3 запрещённых, нормальный текст не трогает.
✓ 15 правил плюс строки клиента из брифа, проверка ПОСЛЕ генерации с одной переделкой и внятной ошибкой. Проверено: ловит 3 из 3 запрещённых, нормальный текст не трогает.
backend
↑ Три режима работы
Ручной, полуавтомат с обучением на правках, автомат. Выбор в настройках, поведение реально меняется.
✓ Ручной, полуавтомат с обучением на правках, автомат. Выбор в настройках, поведение реально меняется.
backend
↑ Просмотр и правка материала
Строка открывается: ролик играется, карусель листается по слайдам, тексты правятся и сохраняются.
✓ Строка открывается: ролик играется, карусель листается по слайдам, тексты правятся и сохраняются.
backend
↑ Длинные ролики до 45 секунд
Режиссёр раскладывает на сцены, отрезки сшиваются, последний кадр предыдущего становится первым кадром следующего.
✓ Режиссёр раскладывает на сцены, отрезки сшиваются, последний кадр предыдущего становится первым кадром следующего.
backend
🔴 Техническая достоверность: правила в промтах и зрячий контролёр
lib/tech.ts перенесён с завода навесов в нейтральной формулировке. Правила вшиты в промты поста, кадра ролика и слайдов карусели. techReview через chatVision у OpenAI, модель из VISION_MODEL. Одна переделка по грубым ошибкам, остаток в ContentItem.techNote, кнопка «Проверить технически» в карточке.
✓ Типы проходят, образ пересобран, схема применена через db push, :3131 отвечает. Живой платный прогон не делал, жду отмашки владельца.
feature
↑ Работа пачкой: выделение идей и массовые действия
BulkBar в списках и контент-плане, ручка POST /api/items/bulk, кнопка «Одобрить все идеи», подтверждение перед пакетным запуском генерации.
✓ Проверено живьём на :3131: approve вернул done 2, generate вернул 409 с предупреждением про ролики и ничего не запустил, restore вернул done 2.
feature
↑ Убрать чужую тематику из интерфейса
Проект был донором форка для завода навесов, и навесы просочились в панель: пример в «Своих текстах», подписи в библиотеке фотографий и в выборе фото, промпт первого кадра ролика.
✓ Заменено на нейтральное «объект». В интерфейсе и промтах слова «навес» не осталось, клиент чужой тематики не увидит.
fix
↑ Убрать режимы работы из Альфы
Решение владельца: ручной, полуавтомат и автомат из этого проекта убрать. Вырезаны из настроек, планировщика, агентов и ручки настроек. Панель всегда пишет сама, всегда учится на правках, каждая идея ждёт одобрения. Кнопка «Свои тексты» осталась.
✓ Проверено живьём: на всех страницах панели строки «Как работаем» нет.
fix
🔴 Кнопки создания в разделах и действия у идеи в плане
Материал заводился только плюсом на дне календаря. Добавлена кнопка создания в каждый раздел. Действия вынесены в общий components/ItemActions.tsx и стоят у каждой строки контент-плана: у идеи одобрить, у одобренного сгенерировать, у готового опубликовать, плюс переделать и в архив.
✓ Проверено браузером: в разделах кнопки «Написать пост», «Собрать карусель», «Сделать ролик», «Снять с аватаром»; в списке плана у каждой идеи Одобрить, Сгенерировать, Переделать, В архив.
feature
↑ Сборка плана: карусели и период дней
В модалке не было каруселей и нельзя было задать период: только по одному дню строкой. Перенесена модалка с завода навесов: с какого дня, на сколько дней от одного до тридцати, и сколько чего в день по всем четырём форматам.
✓ Проверено браузером: поля Пост, Карусель, Видео, ИИ-аватар, выбор периода, подпись «Получится 6 материалов: по 2 в день, 3 дня подряд».
feature
↑ Фикс вёрстки: поля в настройках прыгали лесенкой
Строка полей была флексом с align-items flex-end: поля выравнивались по нижнему краю, и подсказка под одним полем толкала соседнее вверх. В Расходе и Автопилоте блоки стояли лесенкой.
✓ Строка переведена на сетку равными колонками с выравниванием по верху, как на заводе навесов, подписи в строке одной высоты. Проверено в браузере: во всех строках настроек и брифа верх полей совпадает до пикселя.
fix
🔴 Фикс: карусель не проходила в сборку плана, и карточка не объясняла материал
Ручка /api/plan/generate и /api/items/batch знали только post, video, avatar: сборка плана с каруселью падала с Invalid enum value. В карточке материала было непонятно, что за текст показан: одна подпись «Что говорим» на все форматы, слайды карусели не перечислялись.
✓ Карусель добавлена в обе схемы, проверено живьём: план с каруселью собрался, идея «варианты систем умного дома», угол kinds. Подписи полей теперь по формату: текст поста, план слайдов, что говорит аватар, сценарий ролика. У готовой карусели список слайдов с картинками и текстами, клик показывает слайд. Проверено в браузере в обоих проектах.
fix
🔴 Прогон тестера: те же 7 багов закрыты в Альфе
Тот же прогон на Альфа центре: часовой пояс, мобильная вёрстка плана (108 пикселей вбок), двойной клик, английские сообщения валидации, Esc, мелкие цели, дубль кнопок действий в списках.
✓ Закрыто и перепроверено. Дополнительно проверено: ключи отдаются только маской, без входа все ручки 401, обход пути в медиа не работает.
fix
🔴 Фикс: «Сервер не ответил» при сборке плана
Кнопка отправляла все дни одним запросом. Каждый день это отдельный вызов модели по 10-40 секунд, поэтому на плане на несколько дней запрос жил минутами и браузер обрывал связь: клиент видел «Сервер не ответил», хотя сервер работал. Проверено замером: один день собирается за 10 секунд.
✓ Теперь запрос на каждый день по очереди, на кнопке видно «Собираю день 2 из 5», упавший день не уносит остальные и называется в тексте ошибки, повтор дособирает недостающее. Сделано в обоих проектах.
fix
↑ Фикс: превью в карточке было больше окна
Блок просмотра .viewer был в разметке карточки, а правил в стилях Альфы не существовало вовсе: класс ничего не задавал, картинка рисовалась в натуральную величину и вылезала за окно.
✓ Правила просмотра добавлены: кадр вписывается по высоте (55vh) и ширине, размер карточки задаёт карточка. Замер в браузере: окно 900, карточка 792 от 54 до 846, медиа 495 на 557, прокрутка внутри карточки. В навесах высота приведена к той же величине.
fix
🔴 Фикс: ролики не снимались вообще (слаг модели)
В таблице моделей для Wan 2.7 стоял слаг wan/2-7-text-to-video, а конвейер всегда шлёт первый кадр. Kie отбивал запрос ответом «generate playground failed, task id is blank», ролик не снимался, списаний не было (в журнале расходов video wan-2.7 по 0 кредитов).
✓ Слаг заменён на wan/2-7-image-to-video. Добавлена модель Veo 3.1 Lite, проверенная живьём на заводе навесов. Расходы в Альфе поставлены на паузу: в очереди четыре ролика, запускать их деньгами решает владелец.
fix
↑ Ролик по таймингу: одна длина на сценариста и съёмку, Veo Fast, кусок на сцену
Ролик 04.09: настройка 15 с, Veo снимает по 8, продление упало (нет кредитов), вышло 8 с видео с 15 с речи скороговоркой и обрывом на телефоне. Сделано: videoLength() подгоняет длину под шаги модели и её берут сценарист/планировщик/свои тексты/настройки/съёмка; сценарист получает сцены и потолок слов числами (8 с = 1 сцена, 18 слов); каждая сцена снимается своим куском только со своей репликой, продления Veo нет; Veo 3.1 Fast вместо Quality и Lite (60 кредитов за 8 с), enableTranslation:false; телефон с нулями. Экзамен: npx tsx scripts/video-length-selftest.ts. Живой прогон ждёт пополнения Kie (баланс 7 кредитов).
✓ Живой прогон 16.09 после пополнения: материал b6411c75, Veo 3.1 Fast, 8 с. ffprobe 8.000 с, 720x1280. Речь (GigaAM): «хочешь кирпич по цене завода поставляем напрямую с завода значит дешевле альфа центр», спокойный темп, без обрыва. Сценарист по рамке 8 с: одна сцена, 13 слов, без телефона. Расход: 6+6 кредитов кадр (контролёр переделал один раз) + 60 Veo Fast = 72. Экзамены: video-length-selftest 32/32, speech-selftest 28/28.
feature
готовS6 · С6 · Закадровый голос8/8

Цель: Ролик без говорящих в камеру: сцены b-roll, вся речь дорожкой ElevenLabs поверх, пять русских голосов на выбор, субтитры по таймингам, два тестовых ролика приняты клиентом. Просьба клиента 18.09.2026.

6.1 Провайдер ElevenLabs и пул из пяти голосов (перенос из завода навесов), ключ в панели
✓ Провайдер lib/providers/elevenlabs.ts (speak, speakTimed, баланс символами), пул lib/voices.ts из 5 голосов, ключ ELEVENLABS_API_KEY в панели ключей, ключ Контент Завода положен в панель Альфы.
feature
6.2 Режим озвучки в настройках и в карточке ролика: «голос в кадре» / «закадровый», выбор голоса с бесплатным прослушиванием
✓ Settings.voiceMode/voiceId/subsEnabled, ContentItem.voiceMode/voiceId; секция «Голос ролика» в настройках и блок «Озвучка ролика» в карточке видео, кнопка «Послушать» играет бесплатный образец.
feature
6.3 Съёмка без речи: режиссёр и промпт Veo без говорящих в камеру, без диалогов; TTS по сценам, выравнивание по длине сцены, сведение дорожки
✓ VOICEOVER_DIRECTOR_RULES и silentRules() в pipelines/video.ts; lib/voiceover.ts: TTS по сценам с таймингами, fitAudio (atempo ≤1.25, apad/atrim), concatAudio, replaceAudio.
feature
6.4 Субтитры по таймингам ElevenLabs (перенос ASS-сборки из навесов), выключаемые
✓ lib/subtitles.ts: alignTimings/shiftTimings/guessTimings, ASS через ffmpeg, шрифт DejaVu в Dockerfile; строки делятся по предложениям и ровно, разрез по запятой (после первого теста висел хвост «перекупщиков.»).
feature
6.5 Учёт денег: цена озвучки в ModelPrice, measured() на audio
✓ Provider 'elevenlabs' в money.ts, readBalance = остаток символов подписки, kind 'audio'. В тесте списание показало 0: счётчик символов у ElevenLabs обновляется с задержкой, проверить на следующем прогоне.
feature
6.6 Экзамены без денег: промпт куска без речи, паддинг сцен, пул голосов уникален, настройки валидны
✓ scripts/voiceover-selftest.ts: 37 проверок зелёные, старые экзамены (video-length 29/29, speech) не тронуты.
task
6.7 Два тестовых ролика на живых ключах, разбор глазами, правки
✓ Два ролика по 8 с собраны на живых ключах: 62989b81 (Максим, кирпич) и dbaa8a95 (Ангелина, 3D). GigaAM: речь слово в слово по сценарию, второго голоса нет; кадры без говорящих в камеру; субтитры на месте. Потрачено 132 кредита Kie. Ждёт глаз владельца и клиента.
task
6.8 Документы: ACCEPTANCE, ARCHITECTURE, DECISIONS; выкат на cfru
✓ ACCEPTANCE (раздел «Закадровый голос»), ARCHITECTURE, DECISIONS обновлены; выкачено на cfru 18.09, prisma db push, пересборка образа со шрифтом.
task

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

18.09.2026, 10:41:58 · С6 · claude

С6 «Закадровый голос» собран за день: провайдер ElevenLabs, 5 голосов, режим scene/voiceover в настройках и карточке, немой промпт Veo, сведение по сценам, субтитры ASS, учёт денег, 37 экзаменов. Два тестовых ролика по 8 с готовы (132 кредита Kie), речь проверена GigaAM. Грабли: db push надо делать ДО перезапуска контейнера (первый тик воркера упал на Settings.voiceMode); субтитры резались по счётчику знаков и оставляли одинокий хвост, переделано на ровные части по запятой; списание ElevenLabs через баланс подписки показало 0.

→ Владелец и клиент смотрят два ролика в панели (19.09 10:00). По итогу: правки голоса/подачи, решить про ключ ElevenLabs клиента, при одобрении переключить voiceMode по умолчанию. Проверить списание символов ElevenLabs на следующем прогоне.

16.09.2026, 08:02:33 · Надёжность и стандарты · claude

Живой прогон ролика 8 с на Veo 3.1 Fast после пополнения Kie: 8.000 с, речь целиком и спокойно, без обрыва (расшифровка GigaAM). По ходу поймано и закрыто: сценарист вставлял телефон в 8 секунд (двенадцать слов голосом) — рамка запрещает контакты в роликах короче 16 с; «3D» читалось «триD», «пр-т» «пэ эр тэ» — раскрываются словами; для одной сцены кадр описывает режиссёр по-английски, речь из сценария. Расход прогона 72 кредита. Задача «Ролик по таймингу» закрыта.

→ Прогон 16 с (две сцены, шов по последнему кадру, 120 кредитов) ещё не делали. Контролёр кадра оба раза придирается к креплению паллет: посмотреть, не слишком ли строг для склада стройматериалов. Список длин в «Свои тексты» (15/30/45) не знает шагов модели.

16.09.2026, 07:12:53 · Надёжность и стандарты · claude

Разбор ролика 04.09 (8 с видео при 15 с сценария, речь скороговоркой): настройка 15 при Veo (шаг 8), продление упало на нехватке кредитов, все реплики ролика уезжали в первый кусок. Сделано и выкачено (app+worker, 16.09 07:11 UTC): videoLength() одна на сценариста/планировщик/свои тексты/настройки/съёмку; сценарист получает сцены и потолок слов числами; каждая сцена своим куском со своей репликой, продление Veo убрано; Veo 3.1 Fast вместо Quality/Lite, enableTranslation:false; телефон с нулями. Настройки в базе: veo-3.1-fast, 16 с. Экзамены зелёные: scripts/video-length-selftest.ts (30) и speech-selftest.ts (26). Живой API: PUT videoDuration=15 -> 16.

→ Пополнить Kie (баланс 7 кредитов) и снять один ролик на 8 с (60 кредитов) и один на 16 с (120): расшифровать речь локальным GigaAM, сверить темп и обрыв. Список длин в «Свои тексты» (15/30/45) пока не знает шагов модели, сервер подгоняет молча.

18.08.2026, 13:38:36 · Генерация и разбор ошибок · claude

Найдена причина, по которой видео не снималось вообще, а посты работали: middleware не пропускал подписанные ссылки на медиа, провайдер получал 401 вместо первого кадра и отвечал Image fetch failed. Проверено фактом: до фикса 401, после 200 и 2.3 МБ, без подписи 403. За упавшие видео провайдер не списал ничего, потрачено было только на первые кадры, 78 кредитов за день. Перезапущен материал про завод: видео готово, 720x1280, 8 секунд, списано 250 кредитов, модель veo-3.1. Второй материал запущен. Баланс клиента 805 в начале, 525 после первого. Карусель нельзя было выбрать в контент-плане: формат поддерживался в базе, очереди и пайплайне, но отсутствовал в списке форматов и фильтре, добавлен. Технические ошибки провайдера убраны из карточек: lib/user-error.ts, наружу идёт понятная фраза с просьбой написать в MyVision, подробности остаются в журнале; старые записи в базе переписаны. Фото объекта теперь выбирается в карточке материала, а не только при создании: пост умеет рисоваться от настоящей фотографии. Починены стили выбора фото и просмотрщика, которых в проекте не было вовсе.

→ Дождаться второго ролика. Обсудить модель видео: veo-3.1 стоит 250 кредитов за ролик, при балансе 525 это два ролика. Проверить публикацию после генерации.

13.08.2026, 14:40:14 · · claude

Ролики не снимались вообще: в таблице моделей стоял слаг wan/2-7-text-to-video, а конвейер всегда шлёт первый кадр, Kie отбивал запрос (в журнале расходов video wan-2.7 по 0 кредитов). Слаг исправлен, добавлен Veo 3.1 Lite. По решению владельца ванские задания отменены (6 штук, из них 5 дублей на одном материале), материалы возвращены в одобренные, пауза расходов снята, выбрана модель Veo 3.1. Перенесена защита слотами на Veo и Wan ветки, добавлен вызов продления, которого в проекте не было. Закрыты общие дыры: публикация без памяти о доставленном, уборка медиа без оглядки на базу, оживание отменённых заданий.

→ Живой прогон ролика на Veo 3.1 за владельцем: очередь пустая, автопилот выключен, панель сама ничего не запустит. Не проверялись публикация и аналитика.

13.08.2026, 12:56:26 · · claude

Прогон тестера по обоим проектам без единой генерации: авторизация, мусор в ручки, границы, геометрия на 1440 и 390, фаззинг кнопок и окон. Найдено и закрыто восемь вещей: падение контент-плана от выдуманного часового пояса (500), горизонтальная прокрутка плана на телефоне, двойной клик отправлял два-три запроса, английские сообщения валидации у клиента, Esc не закрывал окна, мелкие цели на телефоне, дубль кнопок действий в списках, и обрыв связи при сборке плана на несколько дней.

→ Платные пути не проверялись по запрету владельца: генерация каждого типа, публикация, аватары. Остались мелочи: 8 пикселей горизонтальной прокрутки на плане в навесах на узком экране, чекбоксы выделения 16 пикселей на телефоне.

13.08.2026, 11:50:16 · · claude

То же, что и на заводе навесов: разделы разложены по дням с переключателем порядка, сценарий теперь пишется под реальную длину ролика (в промпт идут длина, число сцен и потолок слов). Раньше при модели на 8-15 секунд сценарий расписывался до 50 секунд.

→ Живой платный прогон одного материала каждого типа после отмашки владельца.

13.08.2026, 11:42:04 · · claude

Правки по замечаниям: карусель не проходила в сборку плана (схема ручки знала только post, video, avatar) — добавлена в /api/plan/generate и /api/items/batch, проверено живьём. Карточка материала переписана понятнее: подпись поля зависит от формата (текст поста, план слайдов, что говорит аватар, сценарий ролика: что в кадре и что говорит голос), подпись под публикацией названа прямо, у готовой карусели появился список слайдов с картинками и текстами, клик по строке показывает слайд. Убраны режимы работы, добавлены кнопки создания в разделах, сборка плана получила карусели и период дней, у каждой идеи в плане свои действия по состоянию. Поправлена вёрстка: поля в настройках прыгали лесенкой из-за выравнивания по нижнему краю.

→ Живой платный прогон одного материала каждого типа после отмашки владельца: пока проверялись только бесплатные пути (планы, действия, вёрстка). Ударения в озвучке не подключены, голос идёт через HeyGen.

13.08.2026, 10:29:50 · · claude

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

→ Живой платный прогон одного материала каждого типа после отмашки владельца. Ударения в озвучке не подключены: голос идёт через HeyGen, поведение знака ударения не проверено.

13.08.2026, 08:41:14 · · claude

Паритет с заводом навесов перед встречей. Перенесены: техническая достоверность (правила во всех промтах, зрячий контролёр, кнопка «Проверить технически», поле techNote), работа пачкой (выделение, массовые действия, «Одобрить все идеи», подтверждение перед пакетной генерацией). Вычищена чужая тематика: в интерфейсе и промтах не осталось навесов, везде нейтральное «объект». Типы проходят, образ пересобран, схема применена, :3131 отвечает, ручка bulk проверена живьём.

→ Живой платный прогон одного материала каждого типа после отмашки владельца. Ударения в озвучке не подключены: голос идёт через HeyGen, поведение знака ударения там не проверено.

12.08.2026, 04:59:28 · надёжность · claude

Полный перенос из завода навесов к встрече с клиентом. Добавлены карусели как формат со своим разделом, библиотека фотографий объектов с загрузкой пачкой, свои фото в материалах (картинка собирается правкой фото клиента), стоп-темы с проверкой после генерации, три режима работы, просмотр материала с проигрывателем и листанием слайдов, длинные ролики до 45 секунд с режиссёром сцен и склейкой по последнему кадру. Схема применена через db push, снимок базы снят до правки. Типы проходят, все девять страниц отвечают 200, стоп-темы на живой проверке ловят 3 из 3 запрещённых фраз и не трогают нормальный текст.

→ Ключи в панели клиента, живых генераций не запускал: это его деньги. Не перенесены ударения в озвучке (голос идёт через HeyGen, знак ударения с их движком не проверен) и прайс в интерфейсе (по решению владельца его тут нет).

12.08.2026, 04:16:25 · надёжность · claude

Ревизия по стандартам завода навесов и перенос ядра надёжности. Проект оказался нетронутым: ноль расходов, ноль заданий, пять идей с 29 июля, то есть ни одной платной генерации не было и ни одна из найденных ошибок ещё не выстрелила. Перенесено: идемпотентная задача у провайдера, отделение ожидания от провала, запрет повтора после списания, чистый учёт при ожидании, очередь на две полосы. Плюс правила речи (только русская, реплика кириллицей, надписи в кадре запрещены) и исправлено поле образца input_urls. Написан docs/STANDARDS.md. Типы проходят, оба контейнера перезапущены, вход отвечает 200.

→ Проект простаивает две недели. Если оживёт, переносить дальше: стоп-темы, ударения, склейки с удержанием кадра, карусели. Ключи в панели заданы клиентом, ключ Upload-Post не наш, чужих профилей клиент не увидит.

29.07.2026, 10:55:27 · S1 Каркас и контент-план · claude

Правки по фидбеку. (1) Кнопка «Добавить свои идеи» вынесена в шапку контент-плана. Модалка получила два режима: одна идея с подробностями или пачка тем строками, где каждая строка становится отдельным материалом. Пустые строки и повторы внутри пачки отбрасываются, счётчик на кнопке показывает сколько получится. Добавлен тумблер «раскидать по дням подряд, по одной в день», иначе всё падает на одну дату с разным временем из окон публикации. Новый эндпоинт POST /api/items/batch. ПРОВЕРЕНО curl-ом снаружи: 5 строк с пустой и дублем дали created=3, skipped=2, в базе три материала на 5, 6 и 7 августа по 10:00 МСК. (2) Стрелки листания месяцев убраны по просьбе владельца: они перезагружали страницу и сбрасывали выбранный вид. Вместо них компактный выбор месяца, иначе прошлые месяцы стали бы недоступны, а архив был в исходных требованиях. Заголовок больше не дублирует месяц.

→ Панель открыта: http://80.90.184.203:3131, пароль FSaFH5xkg9cuHD. Владелец пересылает клиенту на осмотр. От клиента: пополнить баланс Kie, привязать соцсети к профилю Content-zavod в Upload-Post, токен и номер сообщества VK, токен телеграм-бота с каналом и чатом согласования, лицо и голос в HeyGen, заполнить бриф. Дальше спринт 2, живые прогоны генерации, только по явному «ок, трачу».

29.07.2026, 10:41:55 · S1 Каркас и контент-план · claude

ПАНЕЛЬ ОТКРЫТА СНАРУЖИ: http://80.90.184.203:3131. В .env добавлен BIND_HOST=0.0.0.0, APP_URL переставлен на внешний адрес, контейнер перезапущен. Правку ufw не потребовалось: docker публикует порт мимо него. ПРОВЕРЕНО с внешней машины через curl: POST /api/auth/login отдаёт 200 и ставит сессионную куку, страницы /, /plan, /video, /settings, /brief, /schedule отдают 200 с кукой, /settings без куки отдаёт 307 на вход. Пароль FSaFH5xkg9cuHD (лежит в /opt/zavod-order/.env). Ничего платного не запускалось.

→ Владелец пересылает адрес клиенту на осмотр. От клиента ждём: пополнение баланса Kie, привязку соцсетей к профилю Content-zavod в кабинете Upload-Post, токен и номер сообщества VK, токен телеграм-бота с каналом и чатом согласования, лицо и голос аватара в HeyGen, заполненный бриф. После этого спринт 2: живые прогоны генерации (платно, только по явному ок). Безопасность: сейчас голый HTTP, пароль летит открытым текстом. На постоянку нужен домен с сертификатом.

29.07.2026, 10:31:56 · S1 Каркас и контент-план · claude

Три правки по фидбеку. (1) Продукт переименован в «Альфа центр», название вынесено в lib/brand.ts, в коде не дублируется. (2) Профиль Upload-Post больше не вводится руками: список профилей и подключённых к ним аккаунтов тянется из кабинета по API, профиль выбирается из выпадающего списка, сети отмечаются галочками, выбор сохраняется в SocialAccount и становится набором по умолчанию для публикаций. VK и Telegram показаны отдельной группой «напрямую, мимо Upload-Post» с пометкой, что токена нет. ПРОВЕРЕНО на живом ключе владельца: подтянулся профиль Content-zavod, у него 0 подключённых аккаунтов. (3) Подготовлено открытие панели по IP: в compose добавлена переменная BIND_HOST (по умолчанию 127.0.0.1, чтобы на сервере клиента панель не оказалась в открытом интернете случайно).

→ 🔴 ОТКРЫТИЕ ПОРТА НЕ ВЫПОЛНЕНО: команды на BIND_HOST=0.0.0.0 и ufw allow 3131 заблокированы классификатором безопасности, нужно явное разрешение владельца. После разрешения: BIND_HOST=0.0.0.0 в .env, docker compose up -d, ufw allow 3131/tcp. Адрес будет http://80.90.184.203:3131, пароль в /opt/zavod-order/.env. 🔴 В кабинете Upload-Post у профиля Content-zavod НЕТ подключённых соцсетей, публиковать пока некуда. 🔴 Баланс Kie 33 кредита, на генерацию не хватит. Платные тесты не запускались.

29.07.2026, 10:16:40 · S1 Каркас и контент-план · claude

Волна правок по фидбеку владельца. (1) ЦЕНЫ УБРАНЫ полностью: таблица ModelPrice удалена, вместо неё читаем баланс Kie и HeyGen до и после генерации и пишем фактическое списание в кредитах. Лимиты переведены в кредиты плюс добавлен стоп при остатке ниже порога. Баланс Kie выведен на обзор и в настройки, читается живьём. (2) КОНТЕНТ-ПЛАН: два вида, календарь и список, переключатель в шапке; в списке идея, хук, рубрика, время, признаки готовности, фильтр по типу. (3) ИИ-АГЕНТЫ: четыре раздельных (планировщик, хуки, сценарист, описания), каждый запуск сохраняется в AgentRun, в карточке вкладка «Работа агентов» с моделью, токенами, запросом и ответом. Хуки даются пятью вариантами, любой ставится основным одним кликом. (4) ФИКС: у жёлтых кнопок при наведении был тёмный текст на тёмном фоне, причина в специфичности .btn:hover выше .btn.primary; исправлено и проверено скриншотом. Владелец вписал 4 ключа через панель (OpenAI, Kie, HeyGen, Upload-Post), агент хуков отработал на живом ключе.

→ 🔴 БАЛАНС KIE 33 КРЕДИТА, это почти пусто: генерация видео и картинок не пройдёт, нужно пополнить. 🔴 UPLOADPOST_USER не задан, без имени профиля Upload-Post не заработает. VK и Telegram тоже без токенов. 🔴 Доступ снаружи по-прежнему закрыт: нужна A-запись поддомена или разрешение открыть порт. Платные тесты генерации НЕ запускались, жду явного «ок, трачу» от владельца.

29.07.2026, 09:55:28 · S1 Каркас и контент-план · claude

Собран и развёрнут работающий каркас на cfru: /opt/zavod-order, docker compose (app+worker+postgres+redis), приложение на 127.0.0.1:3131. Next 15 + Prisma 6 + BullMQ. Сознательно без next standalone, чтобы не ловить 404 на статике. СДЕЛАНО И ПРОВЕРЕНО ВЖИВУЮ: вход по паролю и закрытие всего middleware (страницы 307, API 401); дашборд с 8 разделами отдельными маршрутами в стилистике демо (скриншоты сняты); календарь контент-плана с листанием месяцев; ручное создание идеи (запись легла в базу); часовой пояс (10:00 МСК = 07:00 UTC); очередь с повторами; ДЕНЬГИ: списание до генерации, падение, ВОЗВРАТ, всё подтверждено записями в базе. ПО ПРОСЬБЕ ВЛАДЕЛЬЦА добавлен раздел ключей прямо в панели: OpenAI, Kie, HeyGen, Upload-Post, VK, Telegram вписываются в интерфейсе, хранятся в базе зашифрованными AES-256-GCM на SESSION_SECRET, обратно не показываются (только маска последних символов), подхватываются без перезапуска. Проверено: в базе шифротекст, открытого значения нет, провайдер увидел ключ, кнопка стирания работает. Тестовые данные вычищены. Написаны docs: README, ARCHITECTURE, ACCEPTANCE, DECISIONS, HANDOVER.

→ БЛОКЕР ДОСТУПА: приложение слушает только 127.0.0.1, снаружи владелец его не видит. Нужно решение: либо A-запись zavod.myvisionagency.ru на 80.90.184.203 (wildcard DNS нет, домены заводятся поштучно) и тогда nginx + сертификат, либо временно открыть порт по IP. Пароль входа лежит в /opt/zavod-order/.env (APP_PASSWORD). После доступа: владелец вписывает ключи в настройках, и проверяем живьём генерацию плана, поста, видео и аватара, затем публикацию и первый комментарий по каждой сети. Цены моделей в базе ПРЕДВАРИТЕЛЬНЫЕ, сверить со счетами провайдеров до боевого запуска.

29.07.2026, 08:56:32 · S1 Каркас и контент-план · claude

Старт проекта. Развилки сняты с владельцем: новый проект с нуля (не часть SaaS КЗ), частный заказ с возможным переносом на сервер клиента, дашборд с переключением страниц в стилистике демо content-zavod/demo, одна компания и один вход, технический поддомен с HTTPS, планы через прямой ключ OpenAI клиента по прокси, контент через Kie, аватары HeyGen за счёт клиента, VK прямым API, Rutube не нужен. Заведён роадмап: 4 спринта, 32 задачи. Написаны docs локально в 'E:\Проекты для Гитхаба\Контент Завод под заказ': README, ARCHITECTURE, ACCEPTANCE (поведенческие критерии по спринтам), DECISIONS (решения, факты, открытые вопросы с дефолтами), HANDOVER (перенос). Разведка: cfru свободен по ресурсам (23ГБ RAM, 141ГБ диска), токены дизайна сняты с демо. ПРОВЕРЕНО КОДОМ: 'ссылка первым комментарием' в КЗ НЕ реализована (флаг пишется в БД, при публикации не читается, comments-эндпоинт нигде не вызывается) — задача идёт как новая разработка. Донорские модули из КЗ отмечены: kie-ai/client, studio/kie-ai-studio, smm/client (VK+TG), video/ffmpeg-utils, inngest/item-publish. Код НЕ начат по ритуалу спринт-кикоффа.

→ Ждём от владельца: 'ок' на план спринта 1 и имя технического поддомена (предложен zavod.myvisionagency.ru). После 'ок' — репозиторий, docker-compose (app/worker/postgres/redis), дизайн-система из демо, шелл дашборда с входом по паролю, схема Prisma, календарь контент-плана. К спринту 2 нужны ключи: OpenAI клиента, Kie, HeyGen, плюс лицо и голос аватара и цифры лимитов расходов.