За месяц я построил машину, которая оценивает сценарий Reels ещё до съёмки. На свежей нетронутой выборке из 25 рилсов получил Spearman 0.535, p=0.007. И всё равно «формулы виральности» не существует: одни и те же хуки попадают и в топ-15, и в дно-15 у одного автора. Текст хука — 20% сигнала. Остальные 80% — arousal, ритм, момент публикации. Маркетологи продают вам формулу на двадцать процентов и называют это наукой.
Зачем
Одна простая органическая система давала мне 45 000 валидных лидов в месяц без рекламного бюджета. Стоимость продакшена — копейки. Интуиция в этой игре не масштабируется: на рынке миллионы людей с интуицией не хуже моей.
Чтобы расти кратно из месяца в месяц, нужна не «гениальная идея ролика», а система, которая повышает вероятность того, что следующий выстрел зайдёт.
Не оракул. Не «генератор виралов». Машина из компонентов: банк хуков, формула скоринга, фильтр анти-плагиата, изоляция тестового стенда. Каждый прибавляет вероятность на единицы процентов. На горизонте ста рилсов эти проценты складываются.
Точечный выстрел оценивается по одному ролику. Система — по распределению из ста.
Идея харнесса
Карпати в karpathy/autoresearch показал каркас, где AI-агенты автономно крутят циклы экспериментов на nano-LLM training. Применил ту же идею к виральности — только цикл не пять минут на тренировку, а секунды на исторический backtest:
- Берём проаудиченных доноров — авторов с виралами и дохляками.
- Извлекаем text-features из каждого ролика.
- Субагент-оценщик получает только сценарий (без plays/likes), выдаёт
predicted_viral_index. - Оркестратор знает actuals — сравнивает predict vs actual.
- Через 100 итераций harness либо стабилизируется, либо мы понимаем, что универсальной формулы нет.
Параллель не выдуманная. Hit Song Science — академическая дисциплина с 1999 года, предсказывает хиты по звуковым признакам. Лучшие модели достигают R² ≈ 0.6 при тщательном feature engineering. Если для песни с миллионами размеченных треков — 0.6, наивно ждать большего на short-form video.
Потолок задан с самого начала. Не «всегда угадывает», а вытаскивает максимально возможный сигнал в пределах потолка.
Данные. Survivorship bias и dead-zone
Я попробовал автоматизировать выбор доноров: отсортировал 109 baseline-конкурентов по росту followers за 17 дней, выкатил top-13.
С клиентом-стратегом прошёл вручную по списку. 10 из 13 забраковали. AI-мультики, шлак-новости, копипаст без своего голоса.
Follower-growth измеряет активность алгоритмической воронки, а не качество контента. Растут конвейеры с cadence ≥3 рилсов в день. Авторские эксперты с одним рилсом в три дня в эту автосортировку не попадают, хотя именно их паттерны переносимы.
После ручного отбора — 9 доноров: 4 RU и 5 EN. Имена не привожу: некоторые — прямые конкуренты. У всех talking head + авторский голос. Через Apify выкачал по 100 рилсов на каждого, через Gemini Lite прогнал extract по 33-полевому промпту. Стоимость — около $1.50 за полного донора.
Сначала я делал то, что делают все: брал top-15 у каждого автора и строил банки хуков. Получился банк на 689 hooks.
И тут пришёл первый честный момент. Заказчик спросил:
«Виральные = чёрный лебедь? Это же актуальность рынка. У нас по 30 у каждого, не все вирусные. Как мы учитываем?»
Survivorship bias. Если ты строишь модель только на победителях, ты никогда не узнаешь, что из их паттернов реально работает, а что — стандартная практика, которая иногда вирусит по удаче.
Решение — dead-zone class. Те же 9 доноров, но bottom-15 рилсов каждого, с фильтром age_days ≥ 14. Re-pull, extract, отдельный каталог. Всего 131 dead-zone reel. В банк хуков для генератора не идёт — иначе генератор начнёт повторять «не работает».
Асимметрия данных:
- RU AI-инфобиз-автор (~100K followers): bottom — 110–240 plays. Top — до 1.25M. Размах в 5000×.
- EN tech-creator с supersized-аудиторией: bottom — 200–360K plays. На дне он на двух порядках выше других доноров.
- EN AI-tutorial-конвейер: bottom — 8–1597 plays.
«Bottom» — относительная категория. Cross-author классификатор с target=abs plays учится на размере аудитории, а не на качестве контента. Формула должна быть within-author, не universal.
Изоляция: harness должен быть неподкупным
Если оценщик знает, что у ролика 1.25M plays, он подгонит scoring под результат. Не специально — просто механика LLM. Attention-слой использует все доступные сигналы, включая «знакомый автор», «уже видел этот shortcode».
Поэтому оценщик у меня запускается через prompt-isolation: видит только сценарий и формулу, к файлам с метриками доступа нет физически. После него отдельный аудитор-субагент проверяет каждую цитату-evidence против транскрипта. На первом батче поймал: ChatGPT записан как named_enemy (это инструмент, не антагонист), specificity=6 даёт +0.5 (rubric требует ≥7).
Harness должен быть неподкупным. Может ошибаться — это нормально. Но если он подгоняет результат под ответ, он не ошибается. Он майнит шум.
Промах #1. Train-on-test artifact
Стартовая rubric_v1 — transplant V6 формулы, которую я калибровал раньше на medical-нише: polarizing_audio (+2.0), named_enemy (+1.5), identity_hook (+1.0), calm_authority × 1.5.
Прогнал на пяти AI-tech-роликах. Spearman 0.40 на n=5. Праздник.
Перепроверил, чуть подкрутив веса, на тех же пяти — Spearman 0.90. Ещё больший праздник.
Расширил до stratified 25 (5 квинтилей × 5) — Spearman 0.11, p=0.60.
Train-on-test artifact в чистом виде. Я калибровал формулу на тех же пяти роликах, по которым её и проверял. Она «работала», потому что просто запоминала ответы.
Простая формула не вытянула. Я остановился:
«Кто решал такие задачи и как? В мире много умных людей, наверняка кто-то уже пытался — может, оттуда что-то возьмём?»
Сначала простой каркас на интуиции — это нормально. Сразу прыгать в чужую методологию я не люблю: не чувствуешь, какие куски действительно нужны, какие — карго-культ. Когда упёрся — иди читать тех, кто решал эту задачу до тебя.
Peer-reviewed pivot: arousal vs calm
Тяжёлой артиллерии оказалось много. Индустрия и академия 20+ лет занимаются ровно этой задачей: Berger & Milkman 2012 (анализ 7000 NYT-статей), STEPPS, Hopkins «Scientific Advertising» (1923), Schwartz «Breakthrough Advertising» (1966), Cialdini «Influence», Stanford SNAP cascade prediction, TikTok ML papers.
Запустил research-субагент. Через 30 минут вернулся со списком из 15 признаков, которых нет в rubric_v1, и одним выводом, который перевернул весь подход:
Berger & Milkman, JMR 2012. На 7000 NYT-статей: виральность driven by physiological arousal, не valence. High-arousal positive (awe) и high-arousal negative (anger, anxiety) — оба more viral. Low-arousal sadness — anti-viral.
Shelepenkov & Kosonogov, SSRN 2025. EEG + EMG + GSR на TikTok-просмотрах: R²=0.51 виральности объясняется autonomic arousal зрителя.
То есть calm_authority × 1.5 в нашей V6 — прямая инверсия peer-reviewed evidence. Я строил формулу против 7000 NYT-статей и не знал об этом. На массовой выборке short-form video calm = low arousal = anti-share. V6 работала на medical именно потому, что medical — исключение, где trust beats arousal. В AI-tech — нет.
Так появилась rubric_v2 на peer-reviewed основе:
- Berger-Milkman / Shelepenkov — arousal как primary driver.
- STEPPS — Social Currency, Triggers, Emotion, Public, Practical Value, Stories. Каждый — bool с required evidence, max +3.0.
- Hopkins — caption_pattern: hook_loop / payoff_promise. 80% решения зрителя — по caption.
- Schwartz — 5 levels of awareness. Most Aware на cold reach = anti-viral, штраф −1.5.
- Loewenstein — information gap (0–3), сильный gap + binding stakes = +1.0.
Прогнал — Spearman 0.31 на новой формуле. Лучше шума, но недостаточно для production. А потом — второй поворот.
Промах #2. Главный фикс был не в формуле, а в target
Отправил спеку v2 на два независимых ревью.
Codex нашёл target mismatch. Эффект оказался больше, чем оба рецензента ожидали.
В спеке прописано:
target_v2 = log(age_normalized_views + 1) − log(rolling_pre_publish_median + 1)
Plays нормализуются по возрасту, делятся на rolling median последних 20 рилсов до публикации этого ролика (никакого leak’а из будущего), log-разница.
А в коде я считал:
viral_index = plays / median_author, гдеmedian_author— константа по всем рилсам автора, включая свежие.
Корреляция между ними 0.929. То есть в 7% случаев они меняют ranking. Эти 7% — критические.
Заменил target. Не трогал ни одну строчку формулы. На нетронутой отложенной выборке 25 свежих рилсов:
Spearman 0.535, p=0.007
Quintile monotonicity идеальная: Q1 → 4.00, Q2 → 4.90, Q3 → 5.88, Q4 → 6.58, Q5 → 7.00.
Главный fix — не в формуле, а в target. Когда формула плохо работает, инстинкт — крутить веса. Сначала проверь, что target соответствует спеке.
Побочный вывод про рецензентов. Codex поймал target bug — это и был главный fix. Но оба ревьюера ошиблись в предсказаниях generalization: Claude max сказал «на свежих упадёт до 0.10–0.20» (реальность 0.535, выше чем на калиброванных), Codex предсказал, что audience_breadth решит проблему (реальность ρ=−0.016). Sharp independent review ловит баги. Но плохо предсказывает, что сломается на свежих данных, — у самих рецензентов нет out-of-sample test’а.
Главное открытие. Универсальной формулы нет
Со Spearman 0.535 на одном авторе пошёл проверять — работает ли это на других.
Не работает.
| Автор | Тип | n | Spearman v2 |
|---|---|---|---|
| Автор D | EN AI-tutorial | 24 | 0.535 |
| Автор A | RU AI-инфобиз | 30 | 0.362 |
| Автор B | RU philosophy/AI | 27 | 0.115 |
| Автор C | RU AI-обзоры | 30 | 0.156 |
| mixed cross-author | смесь | 25 | 0.11 |
На mixed cross-author — 0.11. Шум.
Перевожу на человеческий: формула, которая работает у одного автора, у другого даёт мусор. Внутри одного автора она ловит сигнал — какие из его сценариев зайдут лучше других. Cross-author — не ловит. У каждого свой baseline reach, аудитория, стиль, алгоритмический бэкграунд. Одни и те же rubric-features в разных аккаунтах работают по-разному.
И тут второе открытие, которое я не ожидал. Я начал смотреть, какие хуки попали и в top-15, и в bottom-15 у одного автора. Оказалось — многие. Хуки вида «X не знает Y», «3 facts about Z», «AI just dropped W» встречаются и в виралах, и в дохляках. То есть сам текст хука — 20–30% сигнала. Остальное — arousal, каданс, новизна паттерна, авторитет, аудио, момент публикации, Schwartz-уровень, кадровый ритм.
На Авторе C это видно эталонно. Top-плейс median 25K, dead median 4.9K. Разница — 5×, и universal rubric_v2 даёт отрицательный separation (−0.20): топы по формуле получают score ниже dead’ов. Его топы ничем не отличаются от dead’ов по тексту. Разница где-то ещё — момент публикации, алгоритмический weather, накопленный engagement. Контент-формула это не ловит.
Формулы виральности нет. Есть инструмент, который повышает шансы внутри одного автора процентов на пятьдесят при наличии калибровки. Это много. Кто продаёт больше — врёт.
Reels Director: продукт из формулы
Из всего этого выросло два slash-команды в Claude Code.
/director генерирует сценарии. Семплирует hook от одного донора, setup от другого, payoff от третьего, CTA от четвёртого — анти-плагиат и cross-niche bridging одновременно (банки на 689 hooks и три параллельных по setup / payoff / CTA). Субагент-rewriter натягивает на тему, сохраняя hook-структуру. Self-evaluate по rubric_v2. Отдельный adversarial-субагент с промптом «найди что плохого». Hard-constraint gate (news_drop без актуальности → black_swan flag). Multi-stage dedupe. На выходе — top-5 в Markdown.
Запуск: /director "монетизация Telegram-бота через AI". Около 3 минут, копейки на rewrite.
/evaluate-v2 оценивает готовый драфт. Layer 1–6 — universal peer-reviewed rubric_v2 (Berger-Milkman / STEPPS / Hopkins / Schwartz / Loewenstein) → predicted_v1. Layer 7 — project-specific надбавки на основе анализа 9 доноров и 131 dead-zone reels (news_drop_pattern, series_numbering, pinned_keyword_first_comment_hint). Layer 8 — donor neighborhood (топ-3 ближайших ролика). Layer 9 — dead-zone proximity (cosine sim к центроиду 131 дохляка; sim ≥ 0.7 → warning).
Вывод: два score (v1/v2), что прибавилось/вычлось, top-3 фикса с expected_lift.
Один пример из живого банка. У одного из RU-доноров — ролик с хуком про «ИИ-аккаунты, набирающие миллионы просмотров». Plays — 1.25M. Структура: split-screen AI-fake influencer + listicle overlay + keyword-якорь + double-redirect (DM + pinned stories). Это единица данных, на которую ссылается генератор.
Три раунда валидации
Раунд 1 на одном RU-доноре (n=30, 15 топ + 15 dead). Layer 7 на чистых регулярках. v2 теряет 0.10 на global Spearman, но даёт +36% больший разрыв между top и dead. Confusion matrix на threshold ≥5.5: v2 ловит на 1 больше реальных топов без false positives. Принимаю.
Раунд 2 на трёх RU-донорах (n=87). Layer 7 даёт +0.37–0.46 к top-dead separation на всех трёх. Сигнал стабильный. Засветились слабые места: hashtag_stuffing мёртвый (никто на RU AI-tech не стаффит хэштеги), cta_vacuum срабатывает у 70–85% всех reels — не дискриминирует, news_drop слишком широкий, caption=description штрафуется неправильно (на RU AI-tech 70–85% top-reels именно в description-стиле).
Раунд 3. Ужесточил детекторы → v2.1. v2.1 хуже v2 на двух из трёх авторов. news_drop_strict (entity + announcement_verb + numeric) развалился. RU-доноры используют news framing без канонических announcement-глаголов: «вышел», «появился», «научил», «теперь умеет». Я не прописал их в ANNOUNCEMENT_VERBS_RU. Ужесточение убило 22 из 30 trigger’ов, причём преимущественно топов.
«Ужесточение детектора» на интуиции — почти всегда overcorrection. Если изначальный сигнал не falsifiable strict-метриками, пытаться его строжить = обнулять.
Сейчас в работе четвёртый раунд: regex заменяю на LLM-judgment. Claude Opus читает каждый сценарий целиком, интерпретирует STEPPS / arousal / Schwartz / info_gap. Гипотеза: regex даёт baseline, LLM даёт реальную оценку, разница покажет, сколько сигнала мы теряем на регулярках. Цель — пробить 0.40 на pooled cross-author. Это honest потолок.
Что не работает
- Cross-author universal rubric — не существует. Это не временный gap, который закроется на n=200. Это структурное свойство нелинейной системы Instagram + автор + аудитория.
- News-driven автор-only signal слабый. На EN news-reactor — Spearman 0.187 при n=11. Нужно n≥30.
- Topic_breadth as rubric layer не работает. ρ = −0.016.
- Cold-start vs algorithmic suppression. Dead-zone у автора с большой базой — это подавленные рилсы, а не «cold-start не зашёл». Разные феномены, в текущей когорте я их не разделил.
- Forward-test не сделан. Все 87 reels — backtest. Forward-test (партнёр публикует 5 рилсов из генератора) обязателен перед production scaling.
Финальный вердикт
Я не пишу эту статью, чтобы продать продукт. Reels Director у меня живёт как два slash-команды в Claude Code — без UI, без API, без лендинга. Инструмент для моего контент-конвейера.
Один сдвиг есть. Я перестал выбирать темы рилсов «нравится / не нравится». Теперь гоняю драфт через /evaluate-v2, смотрю breakdown по 6 layer’ам, исправляю что фиксится, оставляю что не фиксится без штрафа.
И самое нечестное про всю эту работу — формула не предскажет, какой ролик заберёт миллион просмотров. Три false negative’а у Автора A (514K plays при v2=4.0; 360K при 4.5; 126K при 4.5) — рилсы, которые формула посчитала средними, а они вирусят. Возможные причины: relatable identity hook, hidden controversy, audio-driven push, чисто алгоритмический подкат. На уровне текста этого не видно.
Финальный вердикт — честный инструмент, не оракул. Spearman 0.535 на нетронутой отложенной выборке. Top-Dead separation +1.73 у Автора A. Банк на 689 hooks из 9 доноров. 131 dead-zone reel как negative-class. Изоляция оркестратор/оценщик/аудитор. Adversarial review. Hard-constraint gate.
Этого хватает, чтобы систематически повышать вероятность того, что ролик зайдёт. Этого не хватает, чтобы заменить контент-стратегию на «AI запустит за тебя 100 рилсов и угадает, какой выстрелит». Возможно, это и хорошо. Если бы машина действительно умела предсказывать виральность, в Reels уже не было бы никого, кроме автоматических конвейеров. Пока этого не произошло — у автора с головой и системой остаётся преимущество.
Если читаешь это и думаешь — на твоих данных тоже могло бы работать
Пиши в Telegram. Если хочешь — соберём под твою нишу: 9–12 доноров, dead-zone, калибровка на твоих роликах. Если у тебя уже есть выборка на 100+ роликах — присылай, добавлю в общий банк.