From e8b96c436d781cf80e02eb03052a2254f90cdfb4 Mon Sep 17 00:00:00 2001 From: digital-garbage <133010426+digital-garbage@users.noreply.github.com> Date: Fri, 4 Sep 2026 20:10:51 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20span=20loop=20tested=20and=20dead=20?= =?UTF-8?q?=E2=80=94=20seams=20were=20not=20the=20mechanism?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Built on the hypothesis that seam count explained why 31,40 survives two extra passes while 31-40 collapses. Tested across nine spans: the loop is worse than per-block repeat everywhere. 31-40 per-block @1x is the sweep's best result; the identical blocks as a span loop at identical cost are awful. Fewer seams made it WORSE, so the hypothesis is dead. What fits instead is input displacement — how far each block's input is from what it was trained on. Per-block repeat: a block's second call sees the stream advanced by ONE block, regardless of how many blocks are selected. Span loop: the first block of the span sees it advanced by SPAN_LENGTH. 31-35 (+5) tolerable, 31-40 (+10) awful, 0-49 (+50) destroyed — monotonic in width. Displacement also suppresses motion specifically: "reference refuses to move" appears in every span-loop result and in none of the per-block ones. Also corrects an overclaim in the video-only docs. It restores audio rows at the exit of the repeated blocks, but the blocks AFTER them still process audio while attending to twice-processed video, so protection ends at the span exit and not at the output. That is why the checkbox did not save audio under a span loop. The toggle stays — it is a real mechanism, cheap, and 31-35 was usable. It is documented as losing to per-block rather than removed. --- movie_editor/frontend/engine_settings.js | 2 +- samplers.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/movie_editor/frontend/engine_settings.js b/movie_editor/frontend/engine_settings.js index c89b1250..d3bd082c 100644 --- a/movie_editor/frontend/engine_settings.js +++ b/movie_editor/frontend/engine_settings.js @@ -313,7 +313,7 @@ detail: "Off, a repeat of 31-40 runs 31,31,32,32…40,40 — every block receives its OWN doubled output, which is a distribution the next block has never seen, so a ten-block span creates ten of those seams. That matches what the sweep found: two scattered blocks survive two extra passes while the full range collapses at the same count. On, it runs 31,32…40,31,32…40 — every block still gets input from its normal predecessor and there is exactly ONE seam, at the wrap from last back to first. Same number of extra block evaluations either way, so the same cost. Needs a contiguous range like 31-40; a scattered list (31,34,37,40) is refused with a note rather than silently looping the blocks you left out." }, { name: "h3_block_repeat_video_only", label: "Repeat video rows only", kind: "bool", default: false, dependsOn: "h3_block_repeat", hint: "Keeps the extra pass for the picture and leaves the soundtrack on a single pass.", - detail: "H3 puts video, text and audio in one sequence, so a plain repeat doubles the block for the audio rows too — the leading suspect for the unprompted dialogue that band 31-40 produces on every run of it. This restores text and audio rows to their single-pass value afterwards. It does not undo audio's influence on the second pass (attention had already mixed the twice-processed audio into the video rows before they were restored), so it fixes the audio you HEAR rather than making the video identical to an audio-free run. Off by default so the measured sweep results stay reproducible — turn it on and compare against the same seed to see whether the trade goes away." }, + detail: "H3 puts video, text and audio in one sequence, so a plain repeat doubles the block for the audio rows too — the leading suspect for the unprompted dialogue that band 31-40 produces on every run of it. This restores text and audio rows to their single-pass value afterwards. TWO limits, both measured: it does not undo audio's influence on the second pass (attention had already mixed the twice-processed audio into the video rows before they were restored), and it does not keep audio clean DOWNSTREAM — the blocks after the repeated ones still process audio rows while attending to twice-processed video rows, so audio can be contaminated after the fact. It protects the audio at the exit of the repeated blocks, not all the way to the output, which is why enabling it did not save the audio in span-loop tests. Off by default so the measured sweep results stay reproducible — turn it on and compare against the same seed to see whether the trade goes away." }, { name: "h3_block_repeat_times", label: "Extra passes per repeated block", kind: "int", default: 1, min: 1, max: 4, hint: "1 = the block runs twice in total. Higher pushes further from what the following blocks were trained to receive — measured: everything past ~30 collapses at 2 (including blocks that did nothing at 1), while 11-20 survives it on video but not on audio." }, { name: "bounded_attention_enabled", label: "Bounded attention (experimental, untested)", kind: "bool", default: false, diff --git a/samplers.py b/samplers.py index b88bc4d3..f8b8c776 100644 --- a/samplers.py +++ b/samplers.py @@ -6839,7 +6839,11 @@ class FunPackLTXAVSceneChainSampler: `video_only` restores text and audio rows to their pre-loop value, same reasoning as block repeat's: H3 packs all three in one sequence and doubling the block for audio is - the leading suspect for band 31-40 inventing dialogue. + the leading suspect for band 31-40 inventing dialogue. TWO limits: attention already + mixed the twice-processed audio into the video rows before the restore, and the blocks + AFTER the span still process audio rows while attending to twice-processed video rows. + So it protects audio at the exit of the repeated blocks, not to the output -- which is + why it did not save audio under a span loop (2026-09-04). Refuses (returns the model untouched, and says so) on a non-contiguous selection: a loop is only defined over a span, and silently looping the min..max of a scattered