Контент завод (навесы)
ревьюS1 · Каркас, бриф под навесы, прайс10/10
Цель: Поднять форк на cfru под своими портами, назвать продукт, завести схему под четыре типа контента и аватаров, заполнить бриф фактурой клиента и включить показ цены с наценкой 15 процентов.
В РАБОТЕS2 · ИИ-аватары9/10
Цель: Раздел на десять аватаров: создание лица по описанию, утверждение или переделка, русский голос, и полный пайплайн говорящего ролика 15 секунд через кадр под навесом, озвучку и липсинк.
В РАБОТЕS3 · Ролики, посты, карусели, тексты под сети8/9
Цель: Veo Lite как основа роликов и Wan 2.7 как премиум, посты и карусели с русским текстом, отдельный текст под каждую сеть, примеры работ и банк референсов.
В РАБОТЕS4 · Соцсети, календарь, автопилот1/11
Цель: Подключение соцсетей кнопкой изнутри панели, публикация в Upload-Post плюс прямые ВКонтакте и Телеграм, контент-план с одобрением и автопилот, который генерит заранее и публикует сам.
планS5 · Аналитика и сдача0/7
Цель: Цифры из Upload-Post по профилю и по каждому посту, расход за период, прогон ревьюера, инструкция переноса и чистка тестовых данных.
В РАБОТЕS6 · Свои фото, очередь и режимы работы33/36
Цель: Клиент загружает настоящие фото навесов и людей, десятки роликов не наслаиваются, и есть три режима работы от ручного до полностью автоматического.
В РАБОТЕS9 · Проверки по сроку0/2
Цель: Отложенные проверки: вернуться и убедиться, что сработало.
Ворклог (места остановки)
Очереди: разобрал, почему слайд карусели делался пять раз. Сама очередь здорова (тяжёлые задания по одному, дублей Job нет), но ручные шаги идут не через очередь, а прямо в запросе, и два нажатия запускали две платные генерации. Защита в три слоя, решает нижний: частичный уникальный индекс ManualStep_one_running по status=running. Проверено тремя одновременными запросами: один 200, два 400 с понятным текстом. Просмотр материалов: в карточке ручника вкладки Просмотр и Работа, карусель листается, готовое открывается результатом. Материалы, собранные автоматом, подхватываются в шаги (раньше готовый ролик выглядел как несделанный). Плитка считает уникальные слайды, а не версии (было 4 из 3). Альфа центр: видео падало Image fetch failed из-за middleware, не пропускавшего подписанные ссылки, теперь 200 снаружи и 403 без подписи; карусель добавлена в контент-план; технические ошибки провайдера заменены человеческим текстом; в карточку добавлен выбор фото объекта и стили для него.
→ Ждёт решения владельца: перезапуск второго упавшего материала Альфы (Veo 3.1, 250 кредитов за ролик, баланс 525) и смена модели на более дешёвую. В навесах остаётся платный прогон ручника целиком и отдельный ключ Kie. Не доделано: агент графики применяется только к роликам, длинная склейка в ручнике не проверена вживую.
Речь: числа и сокращения раскрываются словами до синтеза, lib/speech.ts, самопроверка 27 фраз. Приёмщик речи слушает дорожку ДО липсинка и переписывает смятые цифры: Scribe, доли рубля, двойное прослушивание против ложных тревог, три дубля и стоп. Субтитры: тайминги приходят с озвучкой бесплатно, alignTimings показывает свой текст с цифрами; у обычных роликов речь распознаётся из готового файла за 0.1 руб, иначе субтитры не совпадали с речью. Графика: lib/video/motion.ts, оживление фото наездом и панорамой, плашки с четырьмя стилями, позицией и превью кадра до наложения, всё ffmpeg за ноль. Слои плашек, субтитров и логотипа пересобираются от чистого ролика и кладутся на готовый без пересъёмки. Ручник: создание сведено к названию и дате, остальное на шагах; карусель по новому пайплайну, первый слайд эталон стиля, следующие получают две картинки, стиль и объект; слайд стал карточкой с растущим полем и редактируемым промптом; выбор голоса, образа аватара, логотипа, загрузка готовой картинки. Уроки для ИИ: раздел в настройках, попадают во все промпты. Гардероб аватаров: образы с проверкой лица двумя картинками. Надёжность: подбор потерянных заданий вытащил оплаченный ролик, висевший пять дней; номера задач пишутся до ожидания; пороги зависших шагов по видам; деплой собирает оба образа.
→ Живой платный прогон ручника целиком и склейки длинного ролика за владельцем. Отдельный ключ Kie под навесы. Тексты под соцсети и раздел Примеры закрыты.
Ручная генерация переделана по разбору UX: форма без дублирующих промптов, объект переключателем, название само; рабочий экран это степпер с состояниями, ценами и причинами блокировки; итог по материалу всегда на виду; у аватара озвучка идёт первой и цена липсинка считается по фактической длине речи; появились «Ещё вариант» с лентой вариантов и бесплатным возвратом, своё фото первым кадром за ноль, раскладка слайдов карусели с фото и текстом на каждый слайд, копия материала. Всё проверено прощёлкиванием без единой платной генерации.
→ Осталось из плана: предпросмотр карусели как в ленте, история промптов с кнопкой взять, отмена длинного шага, автосохранение черновика в базу, мобильный вид таблицы слайдов, агент графики и точные тайминги озвучки для караоке. Живой платный прогон одного материала руками ждёт отмашки владельца.
Ручная генерация доведена до управляемой: выбор модели и длительности ролика, число слайдов карусели, своё фото на каждый слайд, дата постановки в контент-план. Пошаговая карточка: кадр смотрят до съёмки, озвучку слушают до липсинка, слайды делаются по одному, любой шаг переделывается отдельно и показывает цену заранее.
→ Осталось по документу: история вариантов с возвратом к прошлому шагу без оплаты, дорисовка недостающих слайдов карусели пачкой, агент графики и точные тайминги озвучки для ровного караоке. Живой платный прогон ручной сборки ждёт отмашки владельца.
Сделан первый шаг ручной генерации: раздел с четырьмя подкатегориями и плитками свежим вперёд, таблица ManualStep с историей вариантов, пять ручек. Промпт человека уходит в модель как есть, панель добавляет техтребования, формат кадра, стоп-темы и контролёра. Каждый платный шаг спрашивает цену до запуска. Плюс раньше в этой сессии: субтитры (раздел настроек, наложение ASS через ffmpeg, кнопка на готовом ролике) и логотип (раздел настроек, наложение на посты, слайды, ролики и аватары).
→ Шаг 2 по документу: карусель целиком (несколько своих фото с назначением по слайдам, недостающие слайды дорисовываем, число слайдов меняется руками) и пошаговая карточка материала с переделкой отдельного шага. Ещё ждёт: точные тайминги озвучки от ElevenLabs для ровного караоке.
Добавлен логотип: раздел в настройках (файл, положение, размер в процентах ширины кадра, плотность, ставить всегда) и наложение в конце генерации на посты, каждый слайд каруселей, ролики и ролики с аватаром. У материала своя галочка, которая важнее общей настройки, её переиспользует ручной режим. Логотип накладывается ffmpeg бесплатно, моделью не рисуется.
→ Ждёт отмашки на ручную генерацию: первый шаг это таблица ManualStep, ручки и раздел с подкатегориями и плитками свежим вперёд. Живьём логотип проверить на следующей генерации материала.
Корневая причина горизонтальных роликов: в запрос на генерацию по фотографии уходил aspect_ratio auto, и модель повторяла пропорции телефонного снимка. Исправлено правильно: формат задаётся до генерации, исходник режется под нужные пропорции, auto в коде больше нет. Аварийная проверка размеров осталась, но теперь режет, а не подкладывает размытые поля. Документ ручной генерации обновлён под решения владельца: подпись пишет ИИ с правкой, число слайдов меняется руками, недостающие слайды карусели дорисовываются, караоке-субтитры везде включая обычные ролики. Плюс закрыты стабильность звука и техничка в интерфейсе.
→ Начинать ручную генерацию с первого шага: таблица ManualStep, ручки, раздел с подкатегориями и плитками свежим вперёд. Живьём проверить вертикаль на следующем ролике с аватаром по своему фото.
Из интерфейса убрана вся техничка провайдеров: номера задач, кредиты, токены, имена моделей и английские ответы чужого API заменены одной фразой «Ой, что-то сломалось», понятные человеку сообщения остались. Проверено в браузере на всех страницах: ноль упоминаний. Усилена устойчивость агентов: кривой JSON от модели больше не роняет материал (одна строгая повторная попытка), упавший агент описаний не отменяет съёмку. Написано предложение по разделу «Ручная генерация» (docs/MANUAL-STUDIO.md): пошаговая студия, где виден результат каждого шага и цена следующего, переделка одного слайда или кадра вместо всего материала.
→ Жду решения по трём вопросам в конце документа: отдельный раздел или кнопка в существующих разделах, пускать ли в ручную генерацию с пустой темой, нужен ли выбор из трёх вариантов картинки. После ответа начинаю с таблицы шагов и ручек без интерфейса.
Разбор жалоб владельца и ревизия архитектуры. Корень проблем один: повтор без памяти. При неудаче воркер создавал НОВОЕ задание, а слоты отправленных задач живут внутри задания, поэтому съёмка начиналась заново и оплачивалась второй раз (в журнале два списания 135 и 156 рублей за один материал), а на один материал накопилось до четырёх заданий. Починено: повтор возвращает то же задание, погашены 8 дублей, отменённое задание больше не оживает из очереди Redis. Та же болезнь закрыта ещё в трёх местах: премиальная ветка Wan снимала отрезки без слотов, публикация не помнила куда уже ушло (грозило дублями в ленте клиента), уборка медиа сносила файлы опубликованных материалов. Причина отказа Kie теперь читается из обоих форматов ответа (у veo это errorMessage и errorCode), при падении продления материал отдаётся коротким роликом вместо потери. Три оплаченных ролика, потерянных из-за дублей, найдены по parentTaskId в архиве провайдера и заведены материалами.
→ Не проверялись живьём: публикация в соцсети и аналитика (нужен реальный аккаунт и пост наружу, спрошу отдельно). Ролики с аватаром ждут, пока у ByteDance поднимется OmniHuman (их 500, списаний нет). Остаётся отдельный ключ Kie под навесы.
Прогон тестера: восемь находок закрыты (часовой пояс ронял план в 500, мобильная вёрстка, двойной клик, английские ошибки, Esc, мелкие цели, дубль кнопок, сборка плана по дням). Перепроверено после правок: страницы отвечают, тройной клик даёт один запрос, Esc закрывает окно, горизонтальной прокрутки на телефоне нет.
→ Ждут отмашки платные прогоны: ролик 8 секунд около 26 руб, склейка Wan 45 секунд около 90 руб. Отдельный ключ Kie под навесы.
Разделы разложены по дням: заголовок даты с числом материалов и переключатель порядка, без даты отдельной группой в конце. Плюс фикс: сценарий не влезал в длину ролика. Сценаристу и планировщику теперь передаётся длина съёмки числом, число сцен и потолок слов; при 15 секундах сценарий вышел на две сцены 0:00-0:08 и 0:08-0:15 вместо прежних 0-50.
→ Ждут отмашки платные прогоны: ролик 8 секунд с русской речью около 26 руб, склейка Wan 45 секунд около 90 руб. Отдельный ключ Kie под навесы.
Карточка материала стала объяснять сама себя: подписи полей по формату, у карусели список слайдов с картинками и текстами. Плюс фикс выбора аватара: в форме создания начальное значение бралось из всех аватаров вместо утверждённых, и в ролик уходил чужой (падало «Аватар Аня не утверждён», хотя выбирали Сергея). Добавлена проверка на сервере при создании. Материал владельца перепривязан на Сергея.
→ Ждут отмашки платные прогоны: ролик 8 секунд с русской речью около 26 руб, склейка Wan 45 секунд около 90 руб. Отдельный ключ Kie под навесы.
Разнообразие и деньги владельца. План теперь помнит последние сто тем и не повторяет их, повторы дополнительно ловятся кодом; у каждого материала свой угол подачи с ротацией по базе, у каруселей свои углы (виды, чем кроют, узлы, факты, сравнение, чек-лист, словарь, эксплуатация). Доводы про компанию раздаются по одному на материал: раньше в каждый промпт уходил весь список преимуществ, и каждый пост пересказывал производство и сроки. Режимы работы стали настоящими: ручной запрещает ИИ придумывать темы, автомат сам мешает форматы и выпускает идеи одобренными. Добавлен скрытый потолок 20000 руб в месяц по себестоимости и недельная сводка владельцу в Телеграм ботом Лии, плюс ручка по ключу. Починены карточка (карусель показывала пустой видеоплеер, вертикальное фото растягивало модалку) и обзор (готовые материалы без обложек и без клика). Массовое одобрение больше не откатывает статус готовым: 11 материалов восстановлены в ready.
→ Ждут отмашки платные прогоны: ролик 8 секунд с русской речью около 26 руб и склейка Wan 45 секунд около 90 руб. Отдельный ключ Kie под навесы. Проверить на живом плане, что углы не повторяются на горизонте месяца.
Работа пачкой и техническая достоверность. Выделение идей галочками в списках и в контент-плане, панель действий (одобрить, сгенерировать, перегенерировать одним замечанием, удалить) и кнопка «Одобрить все идеи»; ручка /api/items/bulk считает общую сумму и требует подтверждения до запуска, одна неудача не отменяет остальные. Технические правила вшиты во все промты: картинка поста, первый кадр ролика, слайд карусели, кадр аватара, планировщик и сценарист; тексты больше не выдумывают сечения и марки стали. Появился зрячий контролёр (lib/tech.ts): смотрит готовую картинку, одна переделка по грубым ошибкам, остаток замечанием в карточке. У ролика и аватара кадр проверяется ДО дорогой съёмки. Живой прогон контролёра на реальной картинке нашёл ровно то, на что указал владелец: раскос в воздухе, штангенциркуль меряет не то, стойка без пятки.
→ Ждём отмашки на платные прогоны: ролик 8 секунд с русской речью (около 26 руб) и склейка Wan на 45 секунд (около 90 руб). Отдельный ключ Kie под навесы, чтобы расход клиента не смешивался с другими проектами. Место в очереди на карточках списка.
Взрослая надёжность и стандарты. Задача у провайдера теперь идемпотентна: отправляется один раз на слот, номер пишется в задание ДО ожидания, повтор доглядывает ту же задачу вместо новой. Долгое ожидание больше не считается провалом: задание возвращается к работе через пять минут и не тратит попытку, материал остаётся в работе. Отказ со списанием останавливает всё и шлёт уведомление: повтор запрещён, работа оплачена и её надо забрать. Отказ без списания освобождает слот и разрешает переотправку. Речь: режиссёр пишет реплики по-русски кириллицей, они жёстко кладутся в промпт обеих веток (Veo и Wan), надписи в кадре запрещены везде, текст только на картинках. Появился звукорежиссёр: раскладывает монолог по отрезкам по границам законченных мыслей, а не по числу символов, с механическим запасным вариантом. Написан docs/STANDARDS.md: речь и текст, длина и склейка, деньги и надёжность, что видит клиент, три режима, чек-лист перед словом готово.
→ Живая проверка: ролик 8 секунд на русской речи около 26 рублей, длинный на 45 секунд со склейкой около 90. Отдельный ключ Kie под навесы.
Три режима работы, библиотека фотографий и починенная речь. Ролик выходил с английской озвучкой: модель озвучивает сама и по умолчанию говорит по-английски. Теперь режиссёр возвращает реплики по-русски, они кладутся в промпт кириллицей, язык требуется прямо, а любые надписи в кадре запрещены: текст в продукте появляется только на картинках. Библиотека фотографий навесов в разделе «О компании»: загрузка пачкой, подписи, удаление с проверкой использования; выбор из неё есть у ролика, поста и карусели. Три режима: ручник (свои тексты подгоняются под длину и раздаются разным аватарам и навесам), полуавтомат (правки владельца запоминаются и подкладываются в промпт следующих текстов), автомат (сам чередует форматы). Плюс просмотр материала с проигрывателем и листанием слайдов, правка из расписания, честный обзор по соцсетям и подсказка у цифры в меню.
→ Проверить живьём новый ролик на русской речи, это около 26 рублей. Отдельный ключ Kie под навесы. Показать место в очереди на карточках списка, сейчас видно только в карточке материала.
Разбор замечаний по интерфейсу. Починено враньё обзора: писал «подключено» на пустом профиле Upload-Post, теперь спрашивает, какие аккаунты реально привязаны. Аватар не создавался из-за моего же стопа расходов, оставленного включённым, стоп снят. Появился просмотр материала: строка открывается, ролик играется со звуком и перемоткой, карусель листается по слайдам, тексты правятся прямо там и сохраняются. Тот же список поставлен в расписание, поэтому контент правится и оттуда. Библиотека загруженных фото: выбираешь навес из ранее загруженных или кладёшь новый, пусто значит нарисуем по описанию. Фото теперь работает не только у роликов, но и у постов и каруселей: слайды делаются на основе настоящего объекта. Контент-план для роликов с аватаром сам подбирает пару, кто говорит и у какого навеса, по кругу и со сдвигом, чтобы не повторялось. Окно сборки плана переделано: с какого дня, на сколько дней и сколько чего в день, вместо ручного перечисления дат. У цифры в меню появилась подсказка «ждут решения».
→ Три режима работы (ручник, полуавтомат, автомат) ещё не сделаны, задачи заведены. Дальше по ним.
Загрузки, очередь и стоп-темы. Клиент теперь может загрузить настоящее фото навеса и привязать его к ролику: кадр собирается правкой этого фото, поэтому в ролике его объект, а не похожий. Аватара можно завести своей фотографией человека, а не только описанием. Очередь разведена на две полосы: тяжёлые работы строго по одной (у липсинка лимит одновременных задач, а замер расхода по балансу на параллельных генерациях врёт), лёгкие по три. Появились стоп-темы: 15 правил плюс свои строки клиента, проверка стоит ПОСЛЕ генерации с одной переделкой. Тест поймал дыру: \w в JS не понимает кириллицу, из-за чего «бесплатный замер» и «гарантия 5 лет» проходили насквозь; после правки ловится 9 из 9 запрещённых и ни одного ложного срабатывания на нормальном тексте.
→ Три режима работы (ручник, полуавтомат, автомат) заведены задачами и ещё не сделаны. Показать место в очереди на карточке. Уроки перенесены задачами в Контент Завод. Отдельный ключ Kie под навесы: сейчас в кабинете видны чужие генерации и месячный расход клиента честно не посчитать.
Заложил механику длинных роликов и проверил живьём три типа контента из четырёх. Длина до 45 секунд и у роликов, и у аватаров. Три механизма непрерывности: у Veo продолжение делает сам провайдер (склейки не видно, потому что её нет), у премиального Wan и у аватара из готового отрезка вынимается последний кадр и становится первым кадром следующего, а ИИ-режиссёр заранее раскладывает сценарий на сцены с требованием продолжать предыдущую. Живые тесты: пост 9 руб, карусель на трёх слайдах 22 руб, ролик Veo Lite 8.00 сек 720x1280 со звуком 26 руб. Русский текст на картинках идеальный. Две находки до этого: поле образца у gpt-image-2 называется input_urls, а не image_urls (из-за чего в кадр попадал посторонний человек вместо аватара), и озвучка через Kie не работает вообще, переведена на прямой ElevenLabs через прокси. Три оплаченных кадра не пропали: заведены готовыми постами с написанными руками текстами. Всего по проекту потрачено 69 рублей.
→ Ждём решения владельца по тесту липсинка: 5 секунд за 75 руб, 15 секунд за 208 руб или 45 секунд со склейкой за 615 руб. Это же проверит подхват лица аватара после исправления input_urls. Дальше по спринту 3: тексты под каждую сеть отдельно, выбор модели у отдельного материала, раздел «Примеры» и банк референсов.
Аватары переведены в полный рост по наказу владельца: липсинк оживляет всю фигуру и умеет шаг, портрет по плечи это выбрасывал. Сделаны два живых аватара: Аня (девушка, ведёт канал) и Сергей (прораб в каске и робе), оба во весь рост, лежат на нашем сервере. Голос по умолчанию теперь подбирается по описанию: женскому аватару женский. Весь контент хранится у нас, у провайдера ничего не остаётся: лица, кадры, озвучка, клипы, слайды и готовые ролики скачиваются в том проекта. Три находки на живых вызовах: OpenRouter с нашего сервера отдаёт 403 и заведён через прокси; gpt-image-2 игнорирует запрос 9:16 и отдаёт 3:4, поэтому кадр доводится до вертикали своим ffmpeg бесплатно; картинка стоит вдвое дороже каталожной, прайс исправлен по факту списания.
→ Живой тест ролика с аватаром ждёт разрешения: около 215 рублей себестоимости и до 35 минут рендера. Аватаров надо утвердить кнопкой, иначе в ролик их ставить нельзя.