16:39 — Evolink topped up. First run of shot_legs_backlight_5lite with M1 + mockup → generation_timeout. Second one — same. Task hung at 95% and died on server timeout.
"The last task did finish — task-unified-1776347645-4ao4jaji."
The user himself surfaced the ID of the completed task. Downloaded — that's shot_legs_backlight_5lite.png:

"Nope, the background didn't get blurred, unfortunately. Probably wasn't in the prompt."
Added shallow depth of field → shot_legs_backlight_dof.png:

"Can we get more DOF?"
The next three requests (f/1.4, extreme bokeh) — all died on timeout. Each hung 10 minutes at 95%. Evolink consistently unresponsive.
17:25, context wiped (/compact). User asked to re-read everything and try again. New run — SSLError EOFError on upload to Evolink.
The agent remembered that seedance_video.py has a proxy but seedream_gen.py doesn't. Added the proxy from .config.json to all 4 requests calls (upload, generate, poll, download). Plus a cp1251 encoding fix on broken print statements.
Three runs in a row with proxy — still generation_timeout. The Evolink server is just down.
Switched to Flux through OpenRouter (it doesn't hang). Without the word "hanging" in the prompt.

DOF insufficient, background almost in focus. Reworked: one ref (mockup), more aggressive on blur:

"Dof3 is good, but I just realized — in other shots the trousers covered the shoes, and here you can see bare legs. Can we fix this or rebuild the whole pipeline?"
Not from scratch — fix the prompt. Added "trousers cover the legs completely":


"And the trousers are ugly, more attempts needed."
Three variants in parallel — different clothing:


v6c (bare feet) — Flux censored: "bare feet hanging" triggered safety.
"What sneakers? Look at the approved master shot — dude is in a suit and dress shoes."
Suit trousers + dress shoes with the DOF from v6b:

v7b with corpse ref pulled everything to a wide shot instead of detail. v7c ("full break trousers") — Flux put him on the floor.


Flux is torn between "hanging" and "trousers cover the boots": when trousers are long — it stands him on the floor, when hanging — ankles.
Attempt v7b with shot1_pinata_corpse.png as second ref — pulled to a wide shot:

v7c with "full break trousers, no skin" — Flux put him on the floor:

"Maybe we can edit dof3 — just lengthen the trousers?"
Great idea. Flux edit "extend trousers" didn't get it (ankle edges remained):

Switched to Gemini. First call — google/gemini-2.5-flash-preview → 400 invalid model. gemini-3-flash-preview → 404 "no image output". gemini-3-pro-image-preview — the only Gemini with image output:

"Nah, perfect. Approving the Gemini version."

Second approved frame. Gemini 3 Pro Image Preview joined the toolkit — for spot edits on a finished image it's better than Flux-edit.
"Now commit."
1ccac69 — 41 files (shot2 + all iterations + proxy in seedream_gen).
"But you didn't move the extras to archive."
Moved 32 iterations of body_ref_side_legs_*, m2_window_*, shot_legs_* to archive/. 887fc8a.
"Why do we still have the leg mockups, we already used them?"
Two more files (m2_legs_mockup.png, m2_window_tight_v2.png) → archive. d710eac.
"Now we need an 8-second Seedance video on top of this frame, where the legs sway gently (the guy is hanging in a noose)."
Minimal prompt from the image-to-video guide: don't describe appearance (model sees the picture), @Image1 as first frame, physical description of motion, negatives.
v1: "feet sway gently side to side in slow pendulum motion".
"Yeah, but the problem — he's wiggling them, the dude's alive."
v2: "feet are completely limp, dead weight, slight draft causes body to rotate slowly":
"They're dead, but they don't sway like a pendulum, they rotate ((."
v3: removed rotate, brought back pendulum with "dead weight, lifeless":
"OK pretty good, except the legs move independently, not together like a torso would move them. And the motion needs to be even smaller, even less noticeable."
v4: "body drifts as one rigid unit, both legs together, millimeters of drift":
"Motion still too big, unfortunately, and a rotation crept in too."
Pattern: the more you describe motion in Seedance, the more it adds. Reverse approach — almost total stillness, only atmosphere:
v5: "almost completely still, feet are frozen, dust particles float, curtain shifts slightly":
"Damn, now they don't sway at all (((."
v6: middle ground with metrics ("5 centimeters"). User:
"It's not a mathematician, no need to write centimeters."
Rewrote: "like a weight on a string". No metrics, two phrases:
"OK, let's take v5 as approved, we'll redo the older shots."
Third approved video shot. Rule: for "barely-noticeable motion" in Seedance, the formula is "almost completely still + atmosphere (dust, curtains) + faintest micro-sway", not a direct pendulum description.
"Shot1_door_closed — we need to hang legs on the left edge (waist down), with toes pointing right and toward us at 45°."
"Think Banana can draw legs in a single shot? Or Flux?"
Ran both edits in parallel.


Tried to refine Gemini — remove the chair, rotate the legs to 45°:

"shot1_door_with_foot_v2.png — here, I did it myself."

"Now a 5-sec video with that micro-motion from the previously approved video — no need to open the door, just leg motion."
Same prompt that worked on shot2_legs_video_v5. Run → 402 insufficient_quota (need 67.5, have 28.3).
"Topped up."
v1 — shot1_door_foot_video_v1.mp4:
"No, they're flying. And another problem — I forgot to make the frame 16:9, need to redo."
"Already did."
v2 — more minimal prompt (like v5):
"Worked. I already crossed it with the door-kick in post and it came out fine."
"Now master shot shot1_pinata_corpse_16_9. 5 sec, same micro-motion."
v1: same "almost completely still" prompt.
"This is just fraud, no motion in the frame at all, just a static frame for 5 sec. Dust isn't floating, the body has 0 motion."
v2: brought motion back "sways forward and backward toward camera":
"Crap, he's swaying with huge amplitude. I knew it, this whole pendulum thing is crap."
v3: atmosphere only, body motionless:
"Dust 2/2, but body frozen, 0 motion, and we need a minimum."
The agent suggested "tremor, fabric ripples":
"What tremor, it'll bring him back to life."
Simplified to:
"Just leave 'very slightly'. Help me phrase it."
v4: "The hanging body moves very slightly. Dust particles float. Fixed camera." — two phrases, no directions.
In parallel, the user noted:
"Maybe give it a finished video and say 'use this reference's body motion'? Like from shot1_door_foot_video_v2.mp4?"
The agent started explaining that the script only handles images and that this would require switching from image-to-video → reference-to-video. User:
"Why the hell are you using image-to-video at all? Why not always reference? It's stronger, up to 9 refs, and the first frame is the same."
Right. Rewrote seedance_video.py:
- Removed --model, always seedance-2.0-reference-to-video.
- Upload supports both images and videos (.mp4/.mov/.webm/.avi).
- Up to 12 refs.
First run with a video ref → 400. Evolink doesn't accept video in image_urls. Fixed payload — separated image_urls and video_urls:
"OK, took v4 and built something out of it in post, taking v4."
Commit 4bc49fa (videos in approved + rewrite seedance_video.py).
"m1_priton_v7_max — now we generate the opposite wall from this shot. Flux, 16:9, just wallpaper and a clock on the left side of the frame."
The agent included "16:9" in the prompt.
"Is 16:9 in the prompt? Not in the params?"
"What the hell. I asked, is 16:9 a prompt? It's a generation parameter."
Right, parameters. Removed from the prompt, passed via --aspect 16:9:

The clock came out in the center, not on the left. User:
"Nah, fine."
"Now we need a video that's like through the corpse's eyes, like the camera is on the rope."
v1: POV, camera swinging like a pendulum:
"Make it a still frame, only the clock moves. I'll do the motion in post."
v2: "only the clock moves, pendulum swings slowly, second hand ticks":
The rule confirmed: complex motion goes in post, the model produces a simple animated atom. Commit 495321f.
"m1_priton_v7_max — make a 16:9 copy of this frame, crop it center. Then use Flux to generate a copy where the door is open and our bandit is standing there."
Cropped M1 to 16:9 → m1_priton_16_9.png. Flux edit: "a man in a dark suit stands in the open doorway":

"What dark suit, here's our bandit char_bandit_front."
Rewrote for the actual character: "bald, stocky, worn leather jacket, backlit from hallway":
The session ended here — the user moved into the next day with a new task about the bat on the wall.
In six hours:
- shot2_legs_backlight.png — approved (Gemini edit on Flux dof3).
- shot2_legs_video.mp4 — v5 "almost completely still" formula for near-static shots.
- shot1_door_with_foot_v2.png — user assembled it himself in Photoshop (Flux/Gemini edit couldn't pull it off).
- shot1_door_foot_video_v2.mp4 — micro-motion in front of the closed door, glued with door_kick in post.
- shot1_corpse_video.mp4 — v4 "moves very slightly + dust" formula for the master shot.
- m3_opposite_wall_v1.png — third wall with a clock.
- shot3_pov_corpse_v2.mp4 — corpse POV (only clock, camera motion in post).
- m1_priton_16_9.png — master crop to 16:9.
- shot4_bandit_door_v2 — first composition of the bandit in the open doorway.
- Proxy in seedream_gen.py — SSL fix from RU (critical).
- reference-to-video — always, dropped image-to-video as the limited mode.
- video_urls vs image_urls — separate fields in the Evolink payload.
- Gemini 3 Pro Image Preview — the only Gemini with image output, used for spot edits on a finished image.
- The "near-static + atmosphere" formula in Seedance — the only working way to get minimal motion, direct pendulum descriptions always give either 0 or huge amplitude.
- "16:9 is a parameter, not a prompt" — rule that landed in memory.