Графика: почему говно и что делаем
Разбор по серверным логам за неделю и коду apple_gfx / реестра шаблонов. Претензии твои: невовремя · кривая-косая · смыслы хуйня · одни и те же шаблоны. Все четыре подтвердились цифрами.
45 из 55
слотов от правил — ОДИН шаблон num.tile («N пунктов»)
25
деградов за неделю: мозг смыслов умер об дневной лимит Groq
33/100
разнообразие в индексе графики — стабильно
0–28
ровность: биты кучкуются, полролика пустые
107
шаблонов в библиотеке — доступны только живой нейронке
1 Мозг смыслов сидит на бесплатном Groq — и он мёртв полдня
Пачки «какой шаблон на какую фразу» идут на бесплатный Groq: 100 тыс. токенов в сутки = 4–6 роликов. Дальше «нейронка не ответила на 12 слотов из 12» — и вся смысловая часть падает в тупые правила. Это корень «смыслы хуйня»: полдня графику выбирает не мозг, а регулярка.
- ✅ ВНЕДРЕНО: мёртвые пачки добираются через Claude (подписка, без дневного лимита). Цена ~10с платится только когда Groq уже отказал.
- → круг 2: кэш пачек по отпечатку фраз — пересборка того же ролика не тратит ни токена.
- → круг 2: ужать меню шаблонов в промпте вдвое (сейчас ~4 тыс. токенов на пачку) — лимита хватит на вдвое больше роликов.
- Платный тариф Groq dev — лимиты вырастают на порядки за копейки (себестоимость ролика сейчас 1.3 цента, +1–2 цента не роняют маржу).
- Gemini Flash бесплатным вторым фолбэком (свой лимит, отдельный от Groq).
- OpenRouter: бесплатные модели третьим эшелоном.
- Локальная Qwen на сервере — нулевая цена, ночной вариант (уже есть .venv-qwen3 наработка).
- Приоритизация: пачки с богатой речью (числа, списки) идут первыми, пока лимит жив.
- Бюджет-трекер токенов в боте: видеть в /stats, сколько лимита съедено сегодня.
- Деград — событие для сторожа: пинг тебе, если за день умерло больше 3 пачек.
2 Запасные правила знают 4 семейства из 22
Когда нейронка молчит, слоты добирает pair_by_rules — а он умеет: процент → кольцо, срок → часы, число → цифра, список → счётчик пунктов. Всё. Ни сравнений, ни схем, ни акцентов. Отсюда «одни и те же шаблоны»: num.tile 45 раз из 55.
- ✅ ВНЕДРЕНО: потолок num.tile — не больше 2 на ролик; третий и дальше отбрасываются ради разнообразия.
- → круг 2: правило «раньше/сейчас» в речи → семейство compare (сравнение) — ты это отдельно просил ещё 14.08.
- → круг 2: вопрос в фразе → семейство hook (крючок).
- → круг 2: ключевое слово фразы (_key_word уже считается) → chip/word-акцент.
- Шаги/этапы («сначала… потом…») → flow (схема со стрелками).
- Боль/страх в лексике → pain-семейство.
- Призыв в конце → cta.word (уже есть частично).
- Ротация 5 вариантов внутри семейства по хэшу фразы — даже одно семейство перестаёт выглядеть одинаково.
- Запрет одинакового семейства в соседних слотах (сейчас наоборот поощряется цепочка).
- Карта «признак речи → семейство» одним файлом — чтобы правило добавлялось строкой, а не веткой кода.
3 Разнообразие 33/100 даже при живой нейронке
Промпт просит «бери разные», но квоты нет — модель склонна повторять надёжное. Плюс соседние слоты одного семейства нарочно склеиваются в цепочку — это давало «перетекание», а на выходе даёт монотонность.
- → круг 2: квота: одно семейство максимум дважды на ролик (кроме text — тому одна).
- → круг 2: в промпт пачки передавать «уже использованы: …» — модель видит, что занято.
- Температура выше только на выборе id внутри семейства (смысл стабилен, вариант гуляет).
- Сид по плану: тот же ролик собирается так же, разные — по-разному.
- Гейт: разнообразие < 50 → пересборка слотов с жёсткой квотой.
- Штраф в score за повтор семейства подряд.
- Пул «редких» семейств с бонусом (geo, matrix, progress не выпадают никогда).
- Разнообразие подач: duo/split/blur квотами (сейчас в структуре block 6 / всё остальное 0).
- А/Б замер: индекс разнообразия в недельном отчёте.
- Витрина: раз в неделю авто-галерея карточек ролика — глазами видно, что повторяется.
4 Ровность 0–28: биты кучкуются в начале, хвост голый
Метрика ровности штрафует длинную дыру без графики — и она у нас почти нулевая: биты лепятся там, где нейронка нашла фактуру, а не распределяются по ролику. Зритель видит салют в первые 10 секунд и пустоту дальше.
- → круг 2: целевая сетка: 1 бит на каждые N секунд; дыра больше 2N — бит переносится в неё принудительно.
- _fill_gaps агрессивнее: в дыру идёт слабый кандидат вместо никакого (с порогом качества).
- Балансировка на финальном проходе «карта» (он уже видит весь ролик целиком).
- Резерв битов: не тратить все сильные карточки на первую треть.
- Гейт по ровности < 40 → перекладка слотов.
- Дыры закрывать дешёвыми подачами (chip/word), а не полноэкранными.
- Равномерность считать по СЕКУНДАМ, а не по слотам (фразы разной длины).
- Хвост ролика (после 70%) — минимум один бит обязателен, кроме CTA-зоны.
- Печатать карту дыр в лог сборки (есть _gap_report — включить всегда).
- Недельный отчёт: медиана ровности по всем роликам.
5 «Невовремя»: биты живут по сетке субтитров, не по смыслу
Карточка появляется на границе фразы из распознавания, а не на ударном слове. Для карточек снап уже подкручен (SNAP_EARLY 0.35 — ты сверял с ручной сборкой), но остальные подачи появляются по слоту.
- → круг 2: распространить снап к своему слову на ВСЕ подачи (блоки, plates, duo), не только карточки.
- Появление на вдохе: если перед фразой пауза ≥ 0.3с — бит входит в паузе, а не по первому слову.
- Уход бита ДО начала следующей мысли, а не по таймеру.
- Ударное слово от нейронки: в пачке уже спрашивать «на каком слове показывать».
- Судья таймингов: второй проход «бит не опаздывает?» (судья речи уже есть — расширить).
- Числа появляются точно на произнесении числа (слово-триггер, не фраза).
- Минимальная жизнь бита 1.8с — мигание короче не читается.
- Запрет входа бита в последние 0.5с фразы.
- Синхрон с музыкой: вход бита на долю (bpm уже считается для нарезки).
- Замер: доля битов, вошедших в пределах 0.2с от своего слова, — в индекс графики.
6 «Кривая-косая»: рендерим вслепую, результат никто не видит
После рендера ни одна проверка не смотрит на пиксели: длинное слово вылезло за плашку, перенос порвал цифру, текст упёрся в safe-зону — узнаёт об этом только зритель. Все сторожа стоят ДО рендера, на данных.
- → круг 3: пиксельный линтер: 3–4 кадра с графикой → проверка «текст не обрезан краем плашки, ничего не вылезает за safe 170…1560».
- → круг 3: авто-пере-рендер виновной карточки кеглем −15% (одна итерация).
- Зрение (Groq vision) на контрольных кадрах: «читается? криво?» — вердикт в лог.
- Запрет переносов внутри чисел и коротких заголовков (CSS white-space на уровне шаблона).
- Эталонные скрины всех 107 шаблонов с длинными строками — регресс при правке темы.
- Лимит длины текста на шаблон в реестре (fields уже описаны — добавить max).
- Замер ширины текста ДО рендера (canvas measureText в Node) — брак до Chromium.
- Общая линия посадки для соседних битов (прыжки базовой линии — «косо»).
- Галерея-витрина после сборки тебе по кнопке — глазами за 10 секунд.
- Жалоба юзера «графика кривая» голосом → карточка и кадр в мой разбор автоматически.
7 Все подачи схлопнулись в одну: block 6 / split 0 / duo 0 / blur 0
Структурный лог показывает: живёт только блочная подача. Кружки, сплиты, размытия, дуо — по нулям, хотя движок их умеет. Причина — деграды (п.1) убивают структурный проход раньше, чем он распределит подачи.
- ✅ лечится п.1: живой мозг вернёт структурному проходу материал для split/duo/blur.
- → круг 2: квоты подач от длины: до минуты — минимум 1 не-блочная; дальше по дозировке кружков.
- Партитура подач по драматургии: хук — чисто, середина — плотно, CTA — пусто (частично есть).
- Duo на «раньше/сейчас» автоматически (связка с причиной 2).
- Blur-подача на длинных статичных планах (детект статичности есть в offcam).
- Не давать одной подаче два слота подряд.
- Показ подач в превью стилей (человек выбирает глазами — уже просили юзеры).
- Тема задаёт доступные подачи (glass любит плиты, neo — плашки) — сейчас всем одно.
- Метрика «подачность» в индекс (доля не-блочных).
- Витрина структуры в логе после каждой сборки (уже печатается — добавить в недельный отчёт).
Комбо — что уже в бою и что дальше
Круг 1 — внедрено сегодня: мёртвые пачки добираются Claude (главная причина «смыслов-хуйни» закрыта) · потолок num.tile 2 на ролик (обои из «N пунктов» кончились). Проверка — твои следующие ролики: в логе появятся «🧠 пачки добраны через Claude» и упадёт доля num.tile.
Круг 2 (следующий): правила на compare/hook/chip + квоты семейств и подач + равномерность по секундам + снап всех подач к своему слову + кэш пачек + ужать меню в промпте.
Круг 3: Lottie-банк про-анимаций поверх Remotion + пиксельный линтер с авто-пере-рендером + эталонные скрины 107 шаблонов в регресс.
Мерило одно: индекс графики (сейчас 43–53) — цель после круга 2: стабильно 70+, после круга 3: 80+.