После марафона пиньяты пошли детали: поменять обои в shot10, подменить конфеты на советские, снять поедание конфеты.
«Shot10_bandit_low_angle_v2 — давай исправим обои справа, чтоб были как на рефе shot1_door_closed»
Gemini сменил обои с первого раза:

Пользователь увеличил кадр в фотошопе, получил shot10_bandit_low_angle_v2_wallpaper_zoom.jpg:

Дальше — два часа попыток Gemini повернуть взгляд бандита чуть влево и вниз. Ключевые итерации:





«Слишком сильно налево» → «никак, почти ничего не изменилось» → «стал вправо смотреть» → «будто ноги путает» → «никак, он вправо смотрит, а не влево»
Ключевой инсайт от пользователя:
«Блять, может дело в том, что я имею в виду влево по кадру, а модель понимает влево по человеку?»
Точно — "left" модель трактует с точки зрения субъекта, а не камеры. Исправили — v7 получился правильным направлением, но слишком сильно.
После 12 итераций и 5 отказов Gemini подряд (IMAGE_OTHER) — тупик:
«Эта мелочь с направлением взгляда Gemini не тянет. Мой голос — довернуть голову в Photoshop вручную»
«Ну я не знаю, как в фотошопе можно поменять направление взгляда варпом. Вот ты фантазёр»
Прав, warp не работает — глазные яблоки пришлось бы перерисовывать.
«Я нашёл программу, которая сделала — shot10_gaze_v7_sight.png. Там можно менять только взгляд»

Вывод сессии: Gemini с иллюстративным промптом "посмотри туда-то" имеет огромный разброс — 20 попыток не дали стабильный результат. Для микроправок взгляда/мимики нужен специализированный tool (пользователь нашёл какой-то отдельный).
«Shot9_pov_candies_v10 — теперь нужно тут заменить конфеты на советские. Очень важно не менять размера и положения конфет, освещения, а только обёртки»
Gemini с любой формулировкой вернул идентичный файл — модель считала что задача "сохрани большую часть" важнее "поменяй обёртки". 3 попытки — ни одного изменения.
«Ну ты же понимаешь, что ты просто создаёшь иллюзию выбора. У тебя тут 2 варианта очевидно тупые, зачем так делать?»
Агент признал что у него нет хороших идей. Параллельно запустил Flux, Seedream 4K, Gemini с переставленными рефами — все плохо. Seedream отдал 454KB (деградация).
«Ну ты же понимаешь, что ты просто раз за разом предлагаешь "и так сойдёт". Чтоб тебе видеокарты ставили в твои дата-центры по такому принципу»
Пользователь решил проблему двухэтапно:
1. Попросил модель сделать обёртки однотонными (reset композиции)
2. Потом на результат — "сделай советскими конфетами, перечислил названия"
Это сломало "preservation bias" Gemini — модель перестала защищать исходник.

«Вот почему я сам все сложные случаи делаю, без твоей помощи?»
Агент: "запомнил паттерн — для задач типа 'поменять только X' делать через промежуточный reset, а не прямую правку".
«Давай делаем видео то же самое pov, только этот реф, а не старый. Помнишь промпт?»
«Кстати, как тебе идея, чтоб генератор видео сохранял параметры с которыми был запущен в лог»
Записал каждую генерацию в generations.log.jsonl. Нашёл предыдущий промпт для POV candy pickup.
v1: рука не ч/б (осталась цветной), движение "тянется в пустоту и материализует конфету из воздуха":
v2: добавил явно "hand and arm strictly black and white", "candy physically lifted out of the pile, does not appear from thin air":
«А что такое шел хистори? То есть мы можем этот лог сейчас сразу оттуда заполнить?»
Shell history в Claude Code не сохраняется между вызовами. Но есть транскрипт проекта — 46MB JSONL, где все команды. Написал backfill_generations_log.py — прошёл по транскрипту, извлёк 77 запусков seedance_video.py с параметрами (prompt, refs, duration, quality, aspect, model, task_id).
Дальше допилил seedance_video.py — каждый успешный запуск дописывает _append_log() в generations.log.jsonl.
«Также backfill оверрайдит лог, а не добавляет. Что это значит?»
«Так бекфилл зачем вообще нужен? Мы его один раз вызвали и всё»
Прав — backfill для разовой миграции, live-логгинг делает остальное.
«Теперь из shot10_gaze_v7_sight — сделаем кадр, где бандит присаживается на корточки, камера следует за ним, 4с, 720»
«Кстати, давай везде явно писать, что музыка не нужна»
Добавил "No background music, no soundtrack" в промпт и в правило 18a.
«Теперь бы как-то сделать видео, как он есть конфету. Нужно сделать из последнего кадра приседа отдельный кадр бананой»
Extract last frame → shot10_squat_lastframe.png (720p, размыто). Gemini-апскейл до 2K:

v1: идеальное разворачивание, светящаяся жёлтая конфета красиво.
«Только он почему-то из светящейся конфеты достал ещё одну не светящуюся и её съел»
Модель "раздвоила" — создала вторую конфету для eating phase.
v2: явно "Only one candy exists", "no duplicate, nothing new produced" — раздвоение ушло, но конфета стала в 3 раза больше упаковки:
«Он слишком долго разворачивает. И в v2 конфета стала больше раза в 3 после разворачивания, то есть содержимое больше упаковки»
v3: "quick two-motion unwrap", "same size as the wrapper":
«Херня, теперь обёртка вообще сама спала, он даже не подносил вторую руку»
v4: явно "both hands", "left holds while right tears open":
«Разворот терпимый, но хуже чем в v1. Конфета опять сильно увеличилась — кубик огромный вместо брусочка»
Пользователь поймал ключевую проблему: "brick-shaped" → модель интерпретирует как строительный кирпич (кубический).
«Мне кажется, оно додумает не такую конфету как надо, ты пишешь small. Он подумает, что леденец или драже»
«Ты пишешь коробок, но конфета она с коробок только по длине, а по ширине в 2 раза меньше. Может, ты его этим сбиваешь?»
Агент объяснил: диффузионные модели не меряют сантиметры физически, но сравнение с "stick of chewing gum" работает как визуальный якорь.
«А почему он правильно понимает изначальный размер конфеты в упаковке?»
Инсайт: обёрнутая конфета привязана к руке в ref-кадре (рука + обёртка в руке — контекст). А развёрнутая генерится заново от слова "candy", и "brick-shaped" становится строительным кирпичом.
«То есть нужно не добавлять, а убрать то, что сбивает»
v5: убрал "brick-shaped" полностью — маленький жёлтый шарик. Не конфета:
«В v1 не было формы у конфеты?»
Нашёл через grep generations.log:
v1: "hands work to unwrap a brick-shaped candy with a yellow wrapper"
В v1 было "brick-shaped" но размер корректный до разворачивания (контекст обёртки). После — модель взяла тот же стиль.
v6: v1-стиль распаковки + anti-dup — шарик остался:
v7: "rectangular bar candy in a yellow wrapper" — форма стала норм:
«Кубическая, но разве хороший. А ты что убрал про статичную камеру?»
v8: вернул "Fixed camera, no camera movement" + "no text or labels on the wrapper":
«Коммит»
bb535e2 — shot9 pinata + shot10 squat/candy + generations log. b52ce1c — movie-workflow rules + hook в main repo.
«Ну что у нас дальше по сценарию?»
По сценарию после поедания — трип, деревня, жена, медведь, дети.
«Отдельный клоуз-ап не нужен, конечно там сразу деревня»
Цитата из сценария:
«КАРТИНКА СТАНОВИТСЯ НЕВЕРОЯТНО ЯРКОЙ И НАСЫЩЕННОЙ. Бандит, теперь одетый в простую рубаху, сидит на завалинке у бревенчатой избы. Вокруг — идиллический деревенский пейзаж. Светит солнце, поют птицы. К нему подходит красивая ЖЕНА в сарафане и кокошнике...»
Пользователь скорректировал:
«Я понял, ну скорее в сценарии неточно. Нужно: Играет медведь на балалайке. Румяные детишки танцуют рядом. К бандиту подходит ЖЕНА в сарафане и кокошнике. Жена нежно целует бандита несколько раз. Это всё один кадр на 8с. Камера динамическая»
Агент начал с first frame через Gemini.
«А думаешь тут нужен Gemini? Может дать Seedance свободу?»
Пользователь предложил дать Seedance генерить с char-ref'ом без зажатого первого кадра — модель сфантазирует деревню свободнее.
«Ну можно бандита цветного в рубахе сделать, кстати, сначала»
char_bandit_rubaha_v1: Gemini с ref'ом → IMAGE_OTHER.
char_bandit_rubaha_v2: без ref'а → получился похожий, но не наш бандит.
«Не понял, а почему лицо другое?»
Прав, без ref'а Gemini генерит обобщённого мужика.
«char_bandit_face.jpg — ты этот реф давал?»
Нет, давал ч/б. Попробовал цветной char_bandit_face.jpg → v3 с нашим лицом в рубахе.
«shot5_bandit_closeup_v5.png — нужно этот реф лица»
v4: тот же бандит из shot5 closeup, в рубахе с красной вышивкой.

На этом сессия прервалась.
За 5 часов:
- 20 попыток правки взгляда — Gemini не тянет микро-направление взгляда. Для таких правок нужен специализированный tool (пользователь нашёл стороннюю программу).
- Двухэтапный reset для Gemini: чтобы заменить элемент на изображении, сначала "сбросить до однотонного", потом "сделать в новом стиле". Прямая правка включает preservation bias.
- shot9_candy_pickup_pov_soviet_v2 — утверждён (POV рука берёт конфету, с явным "physically lifted out, does not appear from thin air").
- shot10_bandit_squat_v1 — утверждён (4с присед).
- shot10_candy_eat_v8 — утверждён (7с разворачивает и ест светящуюся жёлтую конфету).
- Урок про форму: "brick-shaped" → строительный кирпич. Физические сантиметры модель не понимает. Визуальные якоря из known объектов — лучше. Иногда убрать сбивающее слово важнее чем добавить описание.
- generations.log.jsonl + backfill_generations_log.py — 84 прошлых запуска логированы, каждый новый seedance_video.py live-append'ится.
- Правило 18a: в Seedance промпт всегда писать "No background music, no soundtrack" — по умолчанию модель добавляет фоновую музыку.
- char_bandit_rubaha_v4 — цветной бандит в рубахе для сцены 3 (деревня). Нужен цветной face-ref, не ч/б.