16:39 — Evolink пополнен. Первый прогон shot_legs_backlight_5lite с M1 + mockup → generation_timeout. Второй — то же самое. Задача болталась на 95% и падала по серверному таймауту.
«Последняя таска отработала task-unified-1776347645-4ao4jaji»
Пользователь сам подсказал ID отработавшей задачи. Скачал — это shot_legs_backlight_5lite.png:

«Не, фон не размылся, к сожалению. Наверное это не было в промпте»
Добавил shallow depth of field → shot_legs_backlight_dof.png:

«А можно сильнее DOF?»
Три следующих запроса (f/1.4, extreme bokeh) — все упали по timeout. Каждый висел 10 минут на 95%. Evolink стабильно не отвечал.
17:25 контекст затёрся (/compact). Пользователь попросил перечитать всё и запустить снова. Новый запуск — SSLError EOFError на upload к Evolink.
Агент вспомнил, что в seedance_video.py прокси есть, а в seedream_gen.py нет. Добавил прокси из .config.json во все 4 вызова requests (upload, generate, poll, download). Плюс fix encoding cp1251 на ошибочных print'ах.
Три запуска подряд с прокси — всё равно generation_timeout. Evolink сервер просто лежит.
Переключился на Flux через OpenRouter (он не зависает). Без слова "hanging" в промпте.

DOF недостаточный, фон почти в фокусе. Переделал: один ref (mockup), агрессивнее про размытие:

«Dof3 хорош, но я сейчас понял, что на других кадрах штаны закрывали туфли, а тут голые ноги видно. Это можно поправить или нужно с 0 весь пайплайн?»
Не с 0 — правим промпт. Добавил "trousers cover the legs completely":


«И штаны некрасивые, нужно ещё пробовать»
Три варианта параллельно — разная одежда:


v6c (босые ноги) — Flux зацензурил: "bare feet hanging" триггернуло safety.
«Какие кеды? Посмотри мастер-кадр утверждённый, чел в костюме и туфлях»
Костюмные брюки + туфли с DOF от v6b:

v7b с corpse ref перетянул всё на общий план вместо детали. v7c ("full break trousers") — Flux поставил на пол.


Flux бьётся между "висят" и "штаны закрывают ботинки": когда штаны длинные — ставит на пол, когда висят — щиколотки.
Попытка v7b с shot1_pinata_corpse.png как вторым ref — перетянул на общий план:

v7c с "full break trousers, no skin" — Flux поставил на пол:

«А может из dof3 делать редактирование — чисто удлинить штаны?»
Отличная идея. Flux edit "extend trousers" не понял (края щиколоток остались):

Переключился на Gemini. Первый запрос — google/gemini-2.5-flash-preview → 400 invalid model. gemini-3-flash-preview → 404 "no image output". gemini-3-pro-image-preview — единственная Gemini с image output:

«Не, всё шикарно. Утверждаю от Gemini версию»

Второй утверждённый кадр. Gemini 3 Pro Image Preview встал в инструментарий — для точечных правок на готовом изображении он лучше Flux-edit'а.
«Дальше коммит»
1ccac69 — 41 файл (shot2 + все итерации + прокси в seedream_gen).
«Только ты в архив лишнее не убрал»
Перенёс 32 итерации body_ref_side_legs_*, m2_window_*, shot_legs_* в archive/. 887fc8a.
«А зачем нам мокапы ног, мы же уже их использовали?»
Ещё два файла (m2_legs_mockup.png, m2_window_tight_v2.png) → archive. d710eac.
«Теперь нужно на основе кадра сделать видео на 8 секунд Seedance-ом, где ноги немного покачиваются (чел же висит в петле)»
Минимальный промпт из гайда image-to-video: не описывать внешность (модель видит картинку), @Image1 as first frame, физическое описание движения, negatives.
v1: "feet sway gently side to side in slow pendulum motion".
«Да, но там проблема — он ими шевелит, чел живой )»
v2: "feet are completely limp, dead weight, slight draft causes body to rotate slowly":
«Они мёртвые, но они не качаются как маятник, а крутятся ((»
v3: убрал rotate, вернул pendulum с "dead weight, lifeless":
«Ну неплохо, единственно, ноги двигаются независимо, а не вместе как если бы их двигало туловище. И само движение нужно ещё меньше, ещё незаметнее»
v4: "body drifts as one rigid unit, both legs together, millimeters of drift":
«Движение слишком большое к сожалению, и поворот тоже появился»
Закономерность: Seedance чем больше описываешь движение, тем больше добавляет. Обратный подход — почти полная неподвижность, только атмосфера:
v5: "almost completely still, feet are frozen, dust particles float, curtain shifts slightly":
«Блин, а теперь они вообще не качаются (((»
v6: золотая середина с метриками ("5 сантиметров"). Пользователь:
«Он не математик и не нужно писать в сантиметрах»
Переписал: "like a weight on a string". Без метрик, две фразы:
«Ладно, давай берём v5 как утверждённый, переделаем старые кадры»
Третий утверждённый видео-шот. Правило: для "едва-заметного движения" в Seedance нужна формула "almost completely still + атмосфера (пыль, шторы) + faintest micro-sway", а не прямое описание маятника.
«Shot1_door_closed — тут нужно по левому краю кадра повесить ноги (по пояс), чтоб носки смотрели вправо и на нас под 45»
«А думаешь банана не сможет сразу ноги нарисовать? Или Flux?»
Запустил оба edit'а параллельно.


Попробовал уточнить Gemini — убрать стул, развернуть ноги под 45°:

«shot1_door_with_foot_v2.png — вот, я сам сделал»

«Теперь нужно видео на 5с, где есть вот это микродвижение из пред одобренного видео, дверь не надо открывать, только движение ног»
Тот же промпт что работал на shot2_legs_video_v5. Запустил → 402 insufficient_quota (67.5 надо, 28.3 осталось).
«Пополнил»
v1 — shot1_door_foot_video_v1.mp4:
«Нет, они летают. И ещё проблема — я забыл сделать кадр 16:9, нужно заново»
«Я уже сделал»
v2 — минималистичнее промпт (как v5):
«Вышло. Теперь я это уже на после скрестил с выбиванием и вышло неплохо»
«Давай мастер-кадр shot1_pinata_corpse_16_9. 5с то же микродвижение»
v1: тот же "almost completely still" промпт.
«Это просто обман, движения нет вообще в кадре, это просто статический кадр на 5с. Пыль не летает, тело вообще 0 движения»
v2: вернул движение "sways forward and backward toward camera":
«Хуйня, он прям болтается с огромной амплитудой. Знал я блин, что хуйня это всё про маятники»
v3: атмосфера только, тело motionless:
«Пыль 2, но тело заморожено, 0 движения, а минимальное нужно»
Агент предложил "tremor, fabric ripples":
«Ну какой нахуй тремор, он его оживит»
Упростили до:
«Оставь только very slightly. Ну помоги как сформулировать»
v4: "The hanging body moves very slightly. Dust particles float. Fixed camera." — две фразы, без направлений.
Параллельно пользователь заметил:
«Может ему дать готовое видео и сказать "возьми этого референса движение тела"? Вот отсюда — shot1_door_foot_video_v2.mp4»
Агент начал объяснять что в скрипте только картинки и что это потребует image-to-video → reference-to-video. Пользователь:
«А зачем ты блять используешь image-to-video вообще? А не всегда берёшь reference? Там же мощнее, до 9 рефов, и первый кадр тот же»
Прав. Переписал seedance_video.py:
- Убрал --model, всегда seedance-2.0-reference-to-video.
- Upload поддерживает и картинки, и видео (.mp4/.mov/.webm/.avi).
- До 12 рефов.
Первый запуск с видео-рефом → 400. Evolink не принимает видео в image_urls. Поправил payload — разделил image_urls и video_urls:
«Ладно, я взял v4 и на посте из него что-то сделал, беру v4»
Коммит 4bc49fa (видео в approved + rewrite seedance_video.py).
«m1_priton_v7_max — теперь берём этот кадр и генерим противоположную стену. Flux, 16:9, просто обои и часы в левой части кадра»
Агент включил "16:9" в промпт.
«16 разве в промпте? Не в параметрах?»
«Ты чё блять. Я спросил, разве 16:9 — это промпт? Это же параметры генерации»
Правда, параметры. Убрал из промпта, передал через --aspect 16:9:

Часы получились по центру, не слева. Пользователь:
«Да не, норм»
«Теперь нужно сделать видео, которое будто из глаз трупа, будто камера на верёвке»
v1: POV, камера качается как маятник:
«Давай неподвижный кадр, только часы идут. Движение на посте сделаю»
v2: "only the clock moves, pendulum swings slowly, second hand ticks":
Правило подтвердилось: сложное движение на посте, модель делает простой анимированный атом. Коммит 495321f.
«m1_priton_v7_max — сделай этот кадр 16:9 (копию), обрежь по центру. Потом сгенерируй копию Флюксом, чтоб дверь была открыта и стоял наш бандит»
Обрезал M1 до 16:9 → m1_priton_16_9.png. Flux edit: "a man in a dark suit stands in the open doorway":

«Какой ещё блять дарк сьют, вот наш бандит char_bandit_front»
Переписал под реального персонажа: "bald, stocky, worn leather jacket, backlit from hallway":
На этом сессия прервалась — пользователь ушёл в следующий день с новой задачей про биту на стене.
За шесть часов:
- shot2_legs_backlight.png — утверждён (Gemini edit на Flux dof3).
- shot2_legs_video.mp4 — v5 "almost completely still" формула для near-static шотов.
- shot1_door_with_foot_v2.png — пользователь сам собрал в Photoshop (Flux/Gemini edit не справились).
- shot1_door_foot_video_v2.mp4 — микродвижение перед закрытой дверью, склеено с door_kick на посте.
- shot1_corpse_video.mp4 — v4 "moves very slightly + dust" формула для мастер-кадра.
- m3_opposite_wall_v1.png — третья стена с часами.
- shot3_pov_corpse_v2.mp4 — POV трупа (только часы, движение камеры на посте).
- m1_priton_16_9.png — обрезка мастера под 16:9.
- shot4_bandit_door_v2 — первая композиция бандита в открытой двери.
- Прокси в seedream_gen.py — фикс SSL из РФ (критично).
- reference-to-video — всегда, убрали image-to-video как ограниченный режим.
- video_urls vs image_urls — раздельные поля в Evolink payload.
- Gemini 3 Pro Image Preview — единственная Gemini с image output, используем для точечных правок на готовом изображении.
- Формула "near-static + атмосфера" в Seedance — единственный рабочий способ для минимального движения, прямое описание маятника всегда даёт либо 0, либо огромную амплитуду.
- "16:9 — параметры, не промпт" — правило, попавшее в память.