Контент Завод (SaaS)
SaaS генерации контента: видео/карусели/посты, 40+ моделей, автопостинг. Прод 24contentzavod.ru, стейдж test.24contentzavod.ru.
ревьюS1 · Спринт качества контента9/9
Цель: Голоса-пул, дизайнер+фон, Wan 2.7, Студия native
В РАБОТЕS2 · Взрослый редизайн СММ-Центра19/26
Цель: Не MVP. Хаб «Создать контент» (обёртка Студии), компания над фабрикой, честные Расходы/Дашборд/Аналитика по разрезам, Ролс-канвас. Спек: myvisionagency.ru/lab/smm-redesign. Согласовать до кода.
В РАБОТЕS3 · Леджер и платежи1/2
Цель: Единая таблица transactions, симметрия списаний
планS4 · Качество видео — докрутка0/5
Цель: Динамика и подача роликов: промты, хук↔озвучка, мягкий бренд, банк структур
ревьюS5 · СММ-Центр: Каркас + Дашборд + Бриф6/6
Цель: Отдельный раздел со своим layout, дашборд-домашняя с ИИ-рекомендациями, единый бриф компании
ревьюS6 · СММ-Центр: Календарь + Публикации + Загрузка-как-есть7/7
Цель: Пульт: редакционный календарь, согласование, загрузка своего медиа, per-network времена/превью
планS7 · СММ-Центр: Российский слой публикации0/4
Цель: Заменить/дополнить Upload-Post российским API: Rutube, VK органика рилсов, OK, Дзен
ревьюS8 · СММ-Центр: Входящие + автоответы6/6
Цель: Единый инбокс комменты+директ; 2 тира автоответов (канные дёшево / ИИ платно) + база знаний
ревьюS9 · СММ-Центр: Аналитика + Тренды + Расходы4/4
Цель: Кросс-сетевая аналитика всех типов, white-label отчёты, тренды по нише, журнал расходов
ревьюS10 · СММ-Центр: ИИ-копайлот + Команда4/4
Цель: Лия-для-СММ, роли/команда, мульти-компания, авто-правила
ревьюS11 · СММ-Центр: Бренд-ассеты и шаблоны3/3
Цель: Шаблоны постов (reference-driven) + интро/аутро видео (bumpers)
ревьюS12 · Обучение, онбординг и связь с клиентом26/30
Цель: Инструкции со скриншотами по СММ-Центру, Заводу и Студии; онбординг первого входа; регистрация с почтой и телефоном, письма и второй канал связи
В РАБОТЕS13 · Пайплайны: разбор, сценарии, починка29/41
Цель: Э0-Э3 плана docs/FIX-ROADMAP.md: мерки, ремонт контракта холст-сервер, деньги под контролем, Задание (TaskSpec) вместо догадок
планS14 · Продуктовые пробелы по ролям0/10
Цель: Э4-Э5 плана docs/FIX-ROADMAP.md: превью до денег, сверка результата, память задач, продуктовые пробелы по ролям
В РАБОТЕS15 · Фундамент: стабильность под нагрузкой13/26
Цель: Убрать причины внезапных отказов и подготовить систему к росту числа клиентов. Основание: docs/STABILITY-AUDIT.md, снят с прода 05.08.2026.
готовS16 · Проверки по сроку2/2
Цель: Отложенные проверки «сработало ли» с командой проверки в detail
Ворклог (места остановки)
14.10 починена регистрация по почте на рабочем 24contentzavod.ru. Причина: ящик no-reply@24contentzavod.ru (smtp.timeweb.ru) отвечал 535 Incorrect authentication data, каждая регистрация по почте падала 500 «Error sending confirmation email» (≈17 адресов за 16 дней, 5 за 13.10), приветственные письма не уходили с 31.08. Владелец сбросил пароль в Timeweb; новый вписан в /opt/cf-supabase/.env (GOTRUE_SMTP_PASS через compose), /var/www/content-factory-prod/.env и .next/standalone/.env, стенд /var/www/content-factory (без перезапуска); копии *.bak-20261014-smtp. docker compose up -d --no-deps auth + pm2 restart content-factory-prod. Проверка без новой регистрации: SMTP login OK, /auth/v1/recover на учётку владельца → 200 за 1,2 с (было 500), сайт 200. Очередь писем: 136 из 138 исчерпали 5 попыток и сами не уйдут, 2 письма ушли повторно.
→ Решение владельца: писать ли ~17 людям, не сумевшим зарегистрироваться (адреса из журнала входа). Вписать проверку почты (SMTP login) в гейт ядра и книгу дня переключения: служба входа общая с ядром.
03.10 00:53 второй выкат прода по «да» владельца: Д-6 «Премиум» в студии картинок 2K (bbfbf205). Проверено: экзамен 3/3, в бандле прода resolution 2K, сайт и вход 200, ошибок в журнале нет.
→ Проверки по сроку 05.10 (правило REST не режет честные записи) и 09.10 (Студия: ролики не падают). Wan 2.7 Pro, grok-video, runway, openai-4o — флаги фото после своих прогонов.
03.10 ночь по «да» владельца: закрыта дыра в деньгах на проде (fix.sql + nginx, проверено); старый сервис выкачен на прод (eec4be03: фото, утечка замысла, журнал денег, MJ, видео-агент); Д-4 Wan-анимация выкл.; Д-5 MJ — пробный прогон отказ Kie, 5 ₽ вернулись, MJ выкл.; Д-9 Wan 2.7 с фото проверен через kiegen и включён (Pro нет); Д-10 Hailuo сходится с каталогом Kie.
→ Второй выкат прода с Д-6 («Премиум» 2K, 4a708526 + 29364acb) — команду выката не пропустил классификатор, нужно разрешение владельца или его запуск /tmp/build-prod-cf.sh после слияния стенда. Проверка по сроку 05.10 (правило REST) и 09.10 (Студия).
03.10: на стенде (test/sprint-3-quality, 15e0496e + c497c814, не запушено) — утечка замысла ролика между клиентами (globalThis), фото глоталось «Бюджетом» и t2i-моделями, квадрат Veo → 16:9, поля Kling Turbo/Hailuo/Grok/Qwen по доке, логотип и доли возврата фотосессии, MJ без возврата, СММ-агент списывал без фото, видео-агент с Sora на Veo Lite, журнал трат фотосессии, «Тест генерации» убран. Экзамены 90/90, стенд собран, 6 экранов × 2 размера проверены. НАЙДЕНО НА ПРОДЕ: increment_balance и ещё 6 денежных функций вызываются через /rest/v1/rpc без входа (проверено, HTTP 200); клиент может менять себе balance/is_admin. Следов использования за 2 недели нет. Правка готова в docs/security (c9ac0625), не применена.
→ 1) «Да» владельца → применить docs/security/2026-10-03-fix.sql и nginx-rest-money.conf на 24contentzavod.ru и test., проверка proverka.sh с ПК. 2) «Да» → выкат 15e0496e + c497c814 на прод (сборка в сторону). 3) Решения Д-4…Д-10 в DECISIONS-QUEUE. 4) Проверка по сроку 09.10 (Студия: ролики не падают, герои нужной внешности).
02.10 04:06 UTC: починка Студии выкачена на прод по «да на прод». Мерж 06b6dcda, сборка в сторону и подмена папки, простой ~2 с. На боевом сайте проверено: фото в простом режиме доходит до генерации, подсказка про фото, честный тариф. Журнал прода чистый (только шум сканера).
→ Проверка по сроку 09.10 (доля упавших роликов, внешность героев, срабатывание автоповтора). Через неделю без проблем — убрать .next/standalone.old-20261002, /var/www/cf-prod-standalone-backup-20261002 и /var/www/content-factory-prod/.next-build (rm -rf — по согласию владельца). Решения Д-1…Д-3 в docs/DECISIONS-QUEUE.md.
02.10: разбор жалобы «ролики кривые, темнокожие, много ошибок». Студия прода, клиентка vladlenazvorygina: 6 роликов Veo Lite, 4 упали (Kie 500 Internal Error), 2 с темнокожими героями. Причины найдены и починены на стенде: простой режим выбрасывал приложенное фото; нет правила внешности; помощник писал мини-фильм; нет автоповтора сбоя Kie; тариф «Оптимально» обещал 12 с/80 ₽ при 8 с/50 ₽; возврат без защиты от двойного. Попутно: nginx cfru с 01.10 18:17 UTC отдавал 500 на все загрузки — починено chown без перезапуска. Коммиты dece6e5b, 533cd37b (test/sprint-3-quality, запушено).
→ Ждёт «да, на прод» для выката починки Студии (ветка прода fix/impersonate-on-v1.4, мерж test/sprint-3-quality как раньше). Решения в docs/DECISIONS-QUEUE.md: Д-1 тариф «Оптимально», Д-2 банк художественных промтов, Д-3 кто запускает nginx без user. Проверка по сроку 09.10.
Разбор сбоя от Лии 30.09: cfru перезагрузился в 06:27 МСК (обновление ядра 138→142). Проверка публикаций на проде в 06:35 один раз получила 500 (Could not query the database for the schema cache), потому что база ещё запускалась. Все запуски после этого проходят с кодом 200, 27 заводов, ошибок 0. cz-worker 8 раз не достучался до базы по старому адресу, с 9-й попытки подключился сам (сработал docker-hosts-sync, поставленный после аварии 24-25.08). Сайт, вход, REST, auth, storage, cz-core и рендеры проверены, всё отвечает. Мёртвый крон vd-prod-scheduler.sh (VD, старый клиент) убран из crontab по согласию владельца, копия: /root/crontab.backup-2026-09-30-vd.
→ Ждёт «да» владельца: удалить из graphile_worker 5 мёртвых заказов «собрать-заказ» от 28-31.08 (попытки 5/5 исчерпаны). По желанию: чтобы Лия не присылала одиночную ошибку в первые 10 минут после старта сервера.
Ролик «Ночная тренировка» для Фабрики Брендосс: пустой неоновый спортзал, диван отрабатывает подходы спинкой с полотенцем на ней, на финале одним движением раскладывается в ровную кровать, полотенце сползает, бутылка опрокидывается, табло вспыхивает. Шутка совпадает с главным свойством товара. Снят одним планом в одном помещении, оба опорных кадра с одной точки, речь своя через ElevenLabs, проверена обратной транскрипцией. Карусель «Диваны в разных странах» опубликована в Instagram brendoss1 по команде владельца, YouTube платформа пропустила сама (не принимает карусели картинок). Страница согласования myvisionagency.ru/lab/brendoss-soglasovanie обновлена: в ожидании решения ролик «Ночная тренировка» и карусель «Что внутри дивана».
→ МОЙ ПРОМАХ, записываю чтобы не повторить: диагностика ответа Kie была написана как реальный POST на createTask с промтом test, и она создала настоящую задачу генерации. Сгорела одна генерация 15 секунд Wan (по прайсу завода 180 руб), результат негодный — статичный кадр уже разложенного дивана. Правило: проверять ответ API на чтении (recordInfo по известному номеру), а создание задачи никогда не использовать как пробу. Причина исходного сбоя оказалась разовой: Kie вернул ответ без номера задачи при HTTP 200, обёртка kie() проглотила это и поллинг ушёл крутиться по taskId=undefined. Стоит добавить в обёртку проверку code!==200 и наличия taskId, иначе такие сбои будут висеть до таймаута.
Ролик «Его станция — твоя комната» опубликован в живые соцсети клиента: YouTube «BRENDOSS мебель» (@brendoss670) и Instagram brendoss1 через Upload-Post, обе записи success, работа переведена в published. Перед публикацией проверил подключения профиля factory_329f630e_divan — обе сети живые, переавторизация не требуется. Upload-Post в этой интеграции не возвращает ссылки на посты, поле published_url пустое у всех публикаций, проверять приходится глазами. Собрана карусель «Диваны в разных странах» на проверенных фактах: японский футон и стенной шкаф осиирэ, корейский ондоль с обогревом через пол вместо мебели, реклайнер 1928 года Кнабуша и Шумейкера с конкурсом на имя La-Z-Boy, и наши хрущёвки с 1956 года, из которых родился диван-кровать. Пятую страну сознательно не добавлял, она была бы наполнителем.
→ НАЙДЕНА ПРИЧИНА 502 «Image fetch failed» в отрисовке карусели: слишком тяжёлый суммарный набор референсов. Три style-референса по 2 МБ плюс фото товара (около 7,4 МБ) валят обложку стабильно, два прогона подряд; с одним референсом 1,3 МБ тот же слайд рисуется за 87 секунд. Ссылки при этом живые, отдают 206 и верный content-type, то есть проблема на фетче у генератора. Правило: один-два лёгких референса, стиль серии держать текстом seriesStyle. Записано в память content-factory-carousel-ref-weight-limit. Отдельно встречается 502 по таймауту генератора на одном слайде, лечится повтором этого слота, деньги возвращаются сами. Индекс памяти MEMORY.md вырос до 31 КБ и перестал влезать в лимит чтения — механическая обрезка ломает смысл строк, нужен разбор руками. Кинематографичный рекламный ролик: владельцу предложены три концепта, ждёт выбора.
Ещё ролик и карусель для «Фабрики Брендосс». РОЛИК «Его станция — твоя комната»: диван едет в метро как обычный пассажир, сосед засыпает на его спинке, а двери вагона открываются не на станцию, а в тёплую комнату. Снят одним планом и намеренно в ОДНОМ пространстве (вагон) — так у модели нет соблазна склеивать локации. Финальный кадр пришлось перерисовать: в первой версии пассажир тащил диван руками, что ломало шутку про самостоятельного пассажира, в промт добавлен явный запрет «никто не трогает, не несёт, не толкает». КАРУСЕЛЬ «Что внутри дивана»: плотность ППУ и как её прочитать на этикетке (ST 2536, первые две цифры), буквы маркировки ST/EL/HR/HS, змейка, боннель, независимый блок. Факты собраны поиском, не выдуманы: для сиденья хватает 25, для ежедневного сна нужно 30-35, плотный ППУ держит форму 8-12 лет, боннель примерно до 110 кг. Схемы в том же чертёжном языке, что и «Механизмы» — строгая боковая проекция, разрезы, стрелки нагрузки; все шесть вышли механически верными с первого раза, перерисовывать не пришлось.
→ Два наблюдения по надёжности. 1) Скрипты-однодневки из /tmp вычищаются: раннер карусели пропал и прогон упал с MODULE_NOT_FOUND. Это ещё один довод перенести приёмы (чертёжные схемы, ведение клипа двумя кадрами из одной точки) в сам завод, а не держать их в скретчпаде. 2) Роут отрисовки иногда отдаёт 502 «Image fetch failed» на отдельном слайде и корректно возвращает деньги; лечится повторным запуском только этого слота, но в UI такого ретрая нет. Открытое прежнее: тип ткани 304 клиент не подтвердил, лишняя кривая карусель про механизмы (4456618f) ждёт решения снести.
Переделка двух работ для «Фабрики Брендосс» после разбора от владельца: обе прошлые версии были сделаны правдоподобно, а не правильно. КАРУСЕЛЬ «Механизмы диванов» v2: тексты переписаны на проверенные факты (клик-кляк 7-10 лет и 120-140 кг, убивает незащёлкнутый затвор; у еврокнижки ломаться нечему, срок жизни определяет обивка, ролики лечатся силиконовым спреем раз в полгода; аккордеон тяжелеет и метит пол; дельфин самый нагруженный — рычаги, крепления, люфт; книжка живучая, но усилие и стык). Прошлый текст был набором очевидностей вида «нужен метр перед диваном». Схемы перерисованы: строго боковая проекция вместо изометрии, ДВЕ фазы вместо трёх, обе на одной линии пола, фиксированный ракурс и явный запрет поворачивать диван между фазами — механика на всех шести слайдах вышла верной, перерисовывать не пришлось ни одного. РОЛИК «Он бежал к тебе» v2: снят ОДНИМ непрерывным планом, камера за спинкой дивана как в гоночной игре. Погоня, гигантские руки слева и справа, подворотня, лестница, дверь. Музыка и шумы родные от Wan, три реплики свои (ElevenLabs, голос Антон), дорожка модели приглушена до 0.62, наличие речи подтверждено обратной транскрипцией Whisper.
→ Три приёма, которые пора зашивать в завод, а не собирать руками скриптом. 1) Схемы механики: боковая проекция + две фазы + жёстко зафиксированный ракурс; изометрия с тремя фазами наложением даёт кашу и разные пропорции. 2) Один непрерывный план: оба опорных кадра обязаны быть сняты ИЗ ОДНОЙ ТОЧКИ — при разных ракурсах модель мирит их и разворачивает объект (так диван побежал назад в первом дубле). 3) Речь: Wan даёт русскую речь в кадре с человеком, но не даёт говорящей мебели — там кладём свою озвучку и проверяем обратной транскрипцией, а не на слух. Открытое: тип ткани 304 клиент так и не подтвердил; в заводе лежат две карусели про механизмы, старую кривую (4456618f) предложено снести; владельцу описана следующая карусель «Пять минут у двери» про приёмку дивана у курьера, ждёт решения.
Разбор жалобы «не работает кнопка войти» на боевом сервисе. Вход оказался исправен, лежал слой данных: PostgREST упал при перезапуске базы в 02:25 и не поднялся, два часа весь /rest/v1 отдавал 503. Кабинет не мог прочитать профиль и заводы, поэтому после верного пароля человека возвращало на форму. Заводы всё это время ничего не выпускали. Поднял supabase-rest и перезапустил kong, который держал в кэше мёртвый адрес. Проверено снаружи: rest 200, auth 200, планировщик без ошибок.
→ Владельцу на решение: падение такого слоя сейчас видно только тогда, когда клиент не может войти, то есть два часа простоя вслепую. Предложено добавить в compose Supabase зависимость rest от базы с проверкой здоровья и внешнюю проверку /rest/v1 с оповещением в Телеграм. Это правка боевого стека, жду «да». Заведена проверка по сроку на 31.08: встаёт ли REST сам после перезапуска базы, с командой и порядком починки (docker start supabase-rest, затем docker restart supabase-kong). По ядру cz-core работа не двигалась: вся сессия ушла на прод.
Продакшн для «Фабрики Брендосс», заход в новом креативном регистре: владелец забраковал бытовые идеи и попросил концепты, пробивающие баннерную слепоту. Ролик «Он бежал к тебе»: ночной мультяшно-кинематографичный город, диван удирает на своих ножках от гигантских рук, которые расхватывают чужие диваны, добегает до своей комнаты и раскладывается в кровать. Собран ДВУМЯ клипами Wan 2.7 (8 с погоня + 7 с прибытие) вместо одного пятнадцатисекундного: разные сцены, в одном i2v модель половину действия придумывает сама, а по деньгам одинаково, Wan тарифицируется посекундно. Четыре кадра gpt-image-2 цепочкой image-to-image от фото товара, каждый клип ведётся первым и последним кадром, склейка встык на действии. Карусель «Механизмы диванов»: клик-кляк, еврокнижка, аккордеон, дельфин, выкатной — у каждого не только плюс, но и честный минус (метр пола спереди, два стыка, нагруженный узел, сон почти у пола). Слайды сделаны как дорогие инженерные изометрии с фазами раскладывания, стрелками движения и выносками, палитра серии сохранена. 49 ₽.
→ Приём, который теперь работает стабильно и стоит перенести в пайплайн: сложное действие резать на два клипа по первому и последнему кадру вместо одного длинного, кадры генерить цепочкой i2i от фото товара. Тип ткани 304 всё ещё не подтверждён клиентом — на CTA новых каруселей утверждение про велюр не ставим.
Разбор «на проде затёрли выставление счетов» — и нашлось кое-что похуже. 1. ТОЧКА. Никто ничего не затирал: ключей на проде НЕ БЫЛО НИКОГДА, в бэкапе от 30.07 их тоже ноль. Они всегда стояли только на стенде. А счета от 30.07 видны в базе потому, что стенд и прод пишут в ОДНУ базу — выставлены они со стенда. Ключи перенесены на прод (.env и .next/standalone/.env, оба с бэкапом), проверены напрямую у банка: запрос состояния счёта вернул 200 и «payment_waiting». Доступы рабочие. 2. ГЛАВНОЕ: ВНУТРЕННИЕ ВЫЗОВЫ ПРОДА ШЛИ НА СТЕНД. Прод слушает 3002, стенд — 3001. У прода не была задана INTERNAL_BASE_URL, а значение по умолчанию в коде — http://127.0.0.1:3001. То есть очередь картинок СММ, публикация и сбор аналитики прода выполнялись КОДОМ СТЕНДА: другой версией, с другими ключами, с логами в чужом файле. База одна, поэтому со стороны всё выглядело работающим. Задано INTERNAL_BASE_URL и INNGEST_INTERNAL_BASE_URL на 3002. 3. СЕКРЕТ ВЕБХУКА MAX. На проде не задан, а проверка в коде пропускается, когда секрет пуст: обработчик принимал ЛЮБОЙ запрос. Открытая дверь, не поломка. Секрет перенесён. Прод перезапущен, отвечает 200, /api/inngest — 401 (не 500) и по внутреннему адресу, и по публичному. Копировать со стенда всё подряд не стал: остальные четыре настройки (KZ_OPS_TOKEN, PROMPT_ENV, DEBUG_CRITIC_KEY, BACKOFFICE_LIA_CHAT_URL) стендовые по смыслу.
→ Проверить руками то, что нельзя проверить отсюда: выставить счёт юрлицу из кабинета прода (это боевой банковский счёт, без спроса документ не создаю). Присмотреть за очередью пару дней: теперь она работает своим кодом, а не стендовым — если где-то была зависимость от стенда, она вылезет.
Ещё один продакшн-заход для завода «Фабрика Брендосс». Ролик «Диван-победитель»: турнир, соперников давят грузами и греют лампой, они оседают, наш 304 берёт медаль под 3D-надписью БРЕНДОСС. Первый и последний кадр нарисованы gpt-image-2 (последний — image-to-image от первого, иначе сцены не совпадают), Wan 2.7 i2v по обоим кадрам. Камеру удержали статичной через промт плюс negative_prompt (zoom, push in, close-up, human face) — после случая с макро-портретом в прошлом ролике это теперь обязательная часть промта. Кириллица в 3D-надписи собралась без ошибок. Реплику «Ура! Я победил!» модель не проговорила (Whisper с дорожки снял типовую галлюцинацию на музыке) — положили свою озвучку ElevenLabs на 11.2 с поверх фанфар, проверено обратной транскрипцией. Карусель «Какая ткань от какой беды»: дети и пролитый сок, кот и когти, выгорание у окна, аллергия и пыль, велюр ради удовольствия — 7 слайдов gpt-image-2, стиль серии подхвачен через styleRefUrls, 49 ₽.
→ Тип ткани 304 по-прежнему не подтверждён — на CTA новой карусели специально написано «состав обивки смотрите в карточке», чтобы не давать непроверенное утверждение. У прошлой карусели на CTA стоит «велюр на металлокаркасе»: как только клиент подтвердит состав, либо оставляем, либо перерисовываем слайд за 7 ₽. Наблюдение в копилку Г23: Wan проговаривает реплику не всегда — в кадре без людей (говорящая мебель) речи не дал, в кадре с человеком дал обе фразы.
Продакшн для клиента Оксана Яхина (завод «Фабрика Брендосс») плюс два дефекта пайплайна, найденных по ходу. Вчерашний премиум-ролик «Диван приезжает домой» приехал с пустой дорожкой (-58 dB) — озвучили: ElevenLabs, голос Виктория, текст через словарь произношения завода (Брэ́ндос, Ва́йлдберриз, велю́р), сведение -16 LUFS. Сабы продуктовый роут собрал негодные: Whisper по нашей же озвучке дал «комната ям» и «Брэндес», куски по 70 символов — пересобрал по таймингам ElevenLabs with-timestamps, 11 коротких фраз, PlayRes по реальному кадру. Собрана карусель «Ткани для дивана», 7 слайдов gpt-image-2 3:4, стиль подхвачен с прошлой серии через styleRefUrls, копирайт свой (Мартиндейл, рогожка, шенилл, флок, велюр) — 49 ₽. Снят вирусный ролик «Готовь сани летом»: первый кадр gpt-image-2 i2i от фото товара, Wan 2.7 720p 15 с. Первый дубль забраковал (камера ушла в макро-портрет, товара не видно 11 из 15 с), во втором задал negative_prompt против крупных планов и отъезд камеры — вышли обе русские реплики нативно от модели, финал с оленями над лесом, титр наложен своим ffmpeg. Обе работы и карусель лежат в заводе, две работы перенесены из служебного «Без завода» в «Фабрику Брендосс».
→ Открытый вопрос: на CTA-слайде карусели написано «велюр на металлокаркасе», а тип ткани в карточке товара не указан — подтвердить у клиента, иначе перерисовать слайд (7 ₽). Заведены Г22 (сабы должны брать наш текст, а не расшифровку) и Г23 (Wan i2v уезжает в 3:4 и не просит речь) — оба воспроизводимы, в деталях лежат рецепты.
Собран аудит стабильности с доказательствами из живого прода (docs/STABILITY-AUDIT.md) и закрыты первые зоны: индексы под проверку прав, журнал ошибок служебным ключом, таймауты и повторы для Kie. Появился смоук-прогон на Playwright, встроенный в выкладку: 14 проверок на двух ширинах, красный прогон возвращает сборку. Он сразу нашёл реальный баг с шириной холста. Починены: уезжающие за экран окна (общая причина для 23 окон раздела), гонка с незапущенной отрисовкой, зависимость работы от открытой вкладки, врущий показ хода, пресет-копировальщик, весь план карусели на одном слайде. В поддержке появились отметки доставки. Мобильный Центр пересобран: две строки вместо шести плашек, голосовой ввод, лёгкие превью в списках.
→ Открыто: работа без завода не видна в «Моих работах» (поймано на клиентском контенте); у Ролса нет служебного входа; из аудита ждут атомарное списание, генерации в фон, чистка базы от base64, воркер вместо крона, контроль публикаций. По клиенту Брендосс: карусель из семи слайдов готова и лежит в кабинете, АСМР-ролик забракован владельцем (нарезался на четыре клипа вместо одного пятнадцатисекундного и не показывал товар), переделка по правильной схеме ждёт разрешения на трату.
Аватар доведён технически. Найдена настоящая причина серии отказов: не кадр, не формат и не длина аудио, а гонка — провайдер шёл за файлом раньше, чем хранилище начинало его отдавать (доказано: те же файлы вручную минутой позже прошли дважды). Теперь ждём доступности ссылки перед отправкой. Приёмщик обрывался на длинном ответе и отдавал пустое задание — лимит поднят, добавлен повтор; в карточку уходит полный текст задачи. Ролик идёт одним куском до 30 секунд с автонарезкой только при отказе. Починена обратная связь при нажатии. Прогон владельца: ролик на 30 секунд собрался целиком.
→ Открыт вопрос ценности формата: владелец оценивает результат в 150 руб при цене 660 и себестоимости 400. Следующий шаг не в коде, а в подборе голоса и постановки на коротких дешёвых прогонах; по итогу решить, остаётся ли ИИ-аватар в витрине. Отдельно ждёт своей очереди пересборка интерфейса холста единым макетом для пяти форматов.
Разобрана настоящая причина отказов оживления: не кадр и не формат, а длина аудио — 28 секунд провайдер отбивает, 10 перекодированных принимает (падающие задачи бесплатны, поэтому границу искали прогонами). Режем теперь звук по паузам на равные части до 15 секунд, текст при этом цел. Починен звук: amix делил громкость на число дорожек, из-за чего ролик выходил на -36 dB и фон был неразличим; после normalize=0 и loudnorm стало -19.4 dB, владелец подтвердил, что улица слышна. Кадр при описанном движении рисуется планом от колен. Действия над готовой работой сведены в общий компонент и стоят одинаково во всех холстах.
→ Живой прогон 30 секунд: ждём две части по 14.4, склеенные в один ролик, весь текст, вертикаль, слышный фон. Если фон покажется петлёй — заводим базу готовых записей вместо генерации.
Аватар упрощён до прямого пути: весь текст одной озвучкой, одно оживление, никакой нарезки. Раньше моя же защита от перерасхода резала речь (из четырёх реплик озвучивались две) и плодила швы. Кадр теперь 9:16, а не 3:4. Атмосфера места слышна (0.28 вместо 0.12 плюс срез гула). Подключён словарь произношения. Текст-хук только когда сценарий пишем мы. Отдельно: действия над готовой работой сведены в общий компонент и стоят в одном месте во всех холстах — раньше в карусели были кнопки, в видео и аватаре не было ничего.
→ Прогон владельца на 30 секунд: ожидаем один ролик целиком, все реплики, вертикаль, слышный фон улицы. Дальше — пересборка интерфейса холста единым макетом для пяти форматов.