Commit Graph
422 Commits
Author SHA1 Message Date
digital-garbageandClaude Sonnet 5.5 f57910da2d feat: rule-based camera moves for [Shot N] blocks, Editor toggle
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 16:47:07 +03:00
digital-garbageandClaude Sonnet 5.5 a01ffbd154 feat: image-vs-composition dislikes and effect-weighted ratings for the rated dials
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 16:18:30 +03:00
digital-garbageandClaude Sonnet 5.5 942202c963 fix: camera move runs on GPU, stands down for multi-call samplers and says so, H3-only in the Editor
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 16:02:16 +03:00
digital-garbageandClaude Sonnet 5.5 6d606b881c feat: camera move works on the running latent from a chosen step (starting-noise version removed)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 15:53:53 +03:00
digital-garbageandClaude Sonnet 5.5 0bdf070fba fix: camera noise declares the FreeNoise collision, matches the probe path, clamps pan; states the zoom-in cost
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 15:35:02 +03:00
digital-garbageandClaude Sonnet 5.5 aec5ac4a50 feat: camera move (pan/zoom/focus) written into the starting noise
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 15:30:49 +03:00
digital-garbageandClaude Sonnet 5.5 aa352de959 fix: decisiveness declares a schedule it cannot act on and stops learning there; new features' logs colour by state
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-09-30 15:18:54 +03:00
digital-garbageandClaude Opus 5.5 81d8a9b094 feat: upscale finished renders with an upscale model (never / always / Upscale button)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 22:30:37 +03:00
digital-garbageandClaude Opus 5.5 c072a088ec fix: input steer says when a 1-step schedule leaves it nothing to do
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 21:40:25 +03:00
digital-garbageandClaude Opus 5.5 915ba4a65b fix: input steer never hands a push to another call of the same step; size change is said
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 21:32:03 +03:00
digital-garbageandClaude Opus 5.5 9b53eecddb fix: H3 step wrappers steer the next step's input, never the output step
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 21:27:15 +03:00
digital-garbageandClaude Opus 5.5 c782a63fdb fix: shot memory only ever turns a reused layout down, never up (few-cell frames)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 20:50:47 +03:00
digital-garbageandClaude Opus 5.5 454edace23 fix: shot memory skips frames too small for a layout (1-cell grid made the noise NaN)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 20:46:00 +03:00
digital-garbageandClaude Opus 5.5 e87fde3c2d fix: shot memory keeps a normal-strength layout when a shot is reused with its own seed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 20:37:50 +03:00
digital-garbageandClaude Opus 5.5 8bc7cb643e fix: late-branch guidance no longer leaks the model
Its step wrapper held its own ModelPatcher, a cycle only a full gc frees;
that gc clears ComfyUI's weak link to the parent copy first, leaving it
tracking a dead model ("memory leak with model MiniMaxH3").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 20:17:32 +03:00
digital-garbageandClaude Opus 5.5 106163d039 fix: STAS does not count late-branch weak calls; real-ComfyUI clone test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:54:17 +03:00
digital-garbageandClaude Opus 5.5 aaa1c75240 fix: step wrappers find the picture/sound split on a ModelPatcher
_get_latent_shapes only looked under a CFGGuider's conds; wrappers hold a
ModelPatcher, so on packed AV latents every video-only wrapper passed through
unchanged. Also: late-branch and STAS say when they applied nothing, and a
learned value is only rated when the feature actually applied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:45:08 +03:00
digital-garbageandClaude Opus 5.5 ce2de22b2e feat: STAS for H3; late-branch guidance skips negative-prompt calls
STAS (arXiv 2603.17825) sets massive-activation channels on frame 0 and
frame edges to alpha x peak at one block over the first 40% of steps.
Rating-learned dials now share rated_dial.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:35:29 +03:00
digital-garbageandClaude Opus 5.5 a9c2bd30c3 feat: late-branch guidance for H3, strength learned from ratings
Skip guidance at CFG 1: the weak copy reuses blocks before the branch and
skips the branch block, so only the tail runs twice. Picture only; capture
hooks ignore the weak pass; compiler off while installed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 19:26:26 +03:00
digital-garbageandClaude Opus 5.5 63bd1f5ed6 feat: editable reference intro for the prompt enhancer; typo fixed
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 17:54:07 +03:00
digital-garbageandClaude Opus 5.5 2f3c9f5c1a feat: shot memory and decisiveness, both learned from ratings
Shot memory reuses a liked gen's coarse starting noise (layout) with fresh
fine noise; reuse-vs-fresh, which shot and how strongly are learned.
Decisiveness is Temporal Score Rescaling (arXiv 2510.01184) on the picture
rows, k learned per key or set by hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-28 15:19:45 +03:00
digital-garbageandClaude Opus 5.5 178e025a64 feat: chat runs show the whole message sent to the enhancer, instructions included
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:44:17 +03:00
digital-garbageandClaude Opus 5.5 eeddf46f71 fix: enhancer chat no longer echoes the conversation; it revises its last rewrite
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:30:57 +03:00
digital-garbageandClaude Opus 5.5 dfae8915fc feat: enhancer's Last run shows the chat the model was sent
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:06:54 +03:00
digital-garbageandClaude Opus 5.5 6ed743a930 feat: chat with the prompt enhancer; it reads its last rewrite and your comments
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:48:27 +03:00
digital-garbageandClaude Opus 5.5 1cc60d1f75 fix: shadow negative crashed with 'aimdo memory compile error'
It replaces every block's forward, so the model compiler must be off for that
call, as it already is for block repeat and REINS injection. Never seen before
because until d4d4e29 shadow negative never ran.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:58:00 +03:00
digital-garbageandClaude Opus 5.5 88e4dbceb5 fix: block repeat 'video only' no longer repeats the audio
H3 blocks add their residual into the input in place, so the kept single-pass
tensor was overwritten by the next pass and audio was restored from the
repeated stream. Keep a copy instead (block repeat and span loop).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:43:29 +03:00
digital-garbageandClaude Opus 5.5 d4d4e29ee2 fix: H3 shadow negative never ran; now it does, i2v scenes too
It read the prompt length from transformer_options['c_crossattn'], which
ComfyUI never sets, so every block ran the stock forward. A model wrapper now
records it per call. Per-token mod rows (any pinned frame) no longer disable
it, and the step window reads the real schedule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:41:04 +03:00
digital-garbageandClaude Opus 5.5 94f755bb4b feat: prompt enhancer's rewrite shows in Enhance while the video still renders
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 17:41:11 +03:00
digital-garbageandClaude Opus 5.5 eadd455cbd feat: Enhance ▸ Last run shows the model's thinking
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-25 17:10:07 +03:00
digital-garbageandClaude Opus 5.5 ca3e460e03 fix: Enhance reference finds a shortcut by any meaningful word of its content
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 02:27:35 +03:00
digital-garbageandClaude Opus 5.5 18d1df960a fix: Enhance reference missed shortcuts holding $variables and matched partial words
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:21:43 +03:00
digital-garbageandClaude Opus 5.5 7313cb2dcf feat: Enhance ▸ Last run shows the reference sent with each prompt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 01:11:37 +03:00
digital-garbageandClaude Opus 5.5 dbe77d145f feat: Enhance ▸ Reference takes a whole shortcuts file
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:58:28 +03:00
digital-garbageandClaude Opus 5.5 7a7fb79d4a feat: Composer ▸ Enhance ▸ Reference — shortcuts and lorebooks for the enhancer
Name + content appended after the prompt: what it mentions, else the whole source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 00:54:48 +03:00
digital-garbageandClaude Opus 5.5 a44074fe52 fix: skip Studio's own prompt enhancement when nothing reads its conditioning
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 23:45:15 +03:00
digital-garbageandClaude Opus 5.5 85e5173c7c feat: linked input "Studio · Enhanced prompt (else prompt + postfix)"
Studio gains an enhanced_prompt output; the link wires to it. Enhancer off or failed sends prompt + postfix unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 23:41:03 +03:00
digital-garbageandClaude Opus 5.5 b48a6a2ead fix: enhancer instructions and image never reached ComfyUI text encoders
ComfyUI tokenizers drop an unknown system_prompt kwarg, and Gemma skips its chat template by default. Instructions now go in the user turn of the model's own template, which also places the image.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 23:05:21 +03:00
digital-garbageandClaude Opus 5.5 fa04d6c200 fix: H3 enhancements that crashed, steered the wrong rows, or did nothing
- region lock: layout patch matched the old PackedLayout signature and crashed every H3 run; interior pins now use upstream's native any-frame placement
- REINS/Q-steer/AV decouple/probes: masks cover the target video/audio rows only, not pins, refs or vision pads
- video detail: works with the PDD FinalLayer signature; now in Engine Settings
- Q-steer: steers queries before RoPE, not after (old banks are not reused)
- ALG anchor: blurs the frame-0 pin on H3
- temporal style: hidden on H3
- shadow negative: main-window chip names what it switches off without compose

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 22:51:03 +03:00
digital-garbageandClaude Opus 5.5 0bb682b67c feat: prompt enhancer moves to Composer ▸ Enhance
Own tab with its full sampling settings (temperature, top-p, top-k, min-p,
repetition/presence penalty, seed, greedy) and a last-run before/after view.
Studio's source_image now reaches the enhancer on the per-scene path too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 22:11:42 +03:00
digital-garbageandClaude Sonnet 5 27a82eead1 feat: server-side media thumbnails, cached, instead of the full original file
The media bin's grid always requested the FULL original file for a
thumbnail (an <img>/video-frame decode of the whole thing, only
cropped down visually via CSS/canvas afterward). A 4K photo or a
multi-MB clip got fully downloaded and decoded just to show a 96px
square, every render.

Added GET /api/media/{mid}/thumb: generates a small JPEG on first
request (Pillow resize for images, one ffmpeg frame-grab for video),
caches it under media/thumbnails/, and serves that instead. Deleting
a media item removes its cached thumbnail too. mediabrowser.js now
loads from this endpoint for both image and video kinds -- the same
canvas-drawing path as before, just fed a file that's already small
instead of the original. Measured live: a 1.57MB test clip's cached
thumbnail is 1.6KB.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 18:05:26 +03:00
digital-garbageandClaude Sonnet 5 14ae90c9be fix: explore_first_step candidate scoring crashed on every real GPU run
_select_best_seed called value_fn.forward()/compress() directly on a
candidate's captured prediction with no device handling -- the value
function loads CPU-only (map_location='cpu'), but the candidate tensor
lives on whatever device the model ran on (cuda in production). Every
candidate failed to score on every real GPU generation since this
feature shipped; _select_best_seed always fell back to the unchanged
seed, silently a no-op the entire time despite passing all tests
(the suite is CPU-only, so a mismatch never had two devices to hit).

Every other value_function.py call site (gradient/ascend/search) moves
its input onto next(self.parameters()).device first -- this was the
one path that skipped that. Mirrored it: compress on the candidate's
own device (cheap reduction), then move the small compressed vector
onto the value function's device before scoring.

Added a regression test using a real second torch device (mps on this
box, cuda in CI/production) to reproduce the exact cross-device
failure, and fixed three pre-existing value_fn test doubles that were
missing parameters() and had silently started hitting this same
crash branch once the fix started calling it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 16:20:18 +03:00
digital-garbageandClaude Sonnet 5 37c9c501bc fix: shadow-negative compose remedy + explore_first_step silent failures
Compose-mode message and Editor tooltip were stating a false remedy
(turn REINS down to passive-capture-only/strength 0 to free blocks) --
REINS claims all 50 blocks the moment it's on at all, strength only
gates injection not installation. Corrected to say only fully
disabling REINS frees any blocks.

_select_best_seed had three silent failure paths (no usable
prediction, a scoring exception, zero candidates scored) that burned
real GPU compute and reported nothing. Added prints to all three.
Added _output_value_fn_sample_count so "not ready yet" messages show
the actual banked sample count instead of leaving the user blind on
how close they are to the threshold.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 15:27:40 +03:00
digital-garbageandClaude Sonnet 5 1ea5bf179e test: output value function snapshot fires on H3 too
Adversarial review of 77cf37e found a real, cheaply-closable test gap: this
file already calls node.sample() end-to-end with a monkeypatched value
function for the explore_first_step tests, so the same pattern (plus
spoofing minimax_h3.is_h3_model) proves the snapshot save is no longer
skipped for H3.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 14:49:58 +03:00
digital-garbageandClaude Sonnet 5 68d1657a50 feat: H3 shadow negative -- optional coexistence with REINS/Q-steer
h3_shadow_negative's non-composing install was silently starving REINS/
Q-steer of their own per-block capture, so ratings never trained them while
shadow negative was on (0/0 liked/disliked no matter how much was rated).

Add h3_shadow_negative_compose ("Allow when REINS/Q-steer are active"): when
on, shadow negative skips any block another dit-patch mechanism already
claimed, leaving it to keep capturing/steering there, and only pushes on the
rest. Structural coexistence, not per-block math blending -- disclosed as
such in the docstring and tooltip. Off by default, unchanged behavior.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 14:37:01 +03:00
digital-garbageandClaude Sonnet 5 38bdf9f674 feat: H3 shadow negative -- give the negative prompt a job at CFG 1
Native port of the community "H3 Shadow Negative" pack's Basic scope: runs the
negative CONDITIONING (already threaded through the sampler, otherwise dead
weight since H3's CFG is fixed at 1.0) through H3's DiT blocks as a second
shadow stream and pushes the real stream's attention output away from it,
NAG-style. Non-composing with REINS/Q-steer/av_decouple/block-repeat/
attn_temperature by design -- replaces a block's forward outright and prints
which existing patches it superseded.

Full Editor (Cutting Room) UI exposure lands in this same change, along with
explore_first_step's own missing Editor UI from an earlier session.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 13:22:08 +03:00
digital-garbageandClaude Sonnet 5 99c784921d feat: explore_first_step -- branch-then-commit seed search at step 1
Tries N candidate seeds with one throwaway denoising step each, scores
each with the trained output-space value function, commits to the
best-scoring seed for the real full pass. Candidates are scored fully
isolated from the scene's own guidance stack (model_function_wrapper
chain, context_windows, v2a_grad_scale, identity_overlap -- each torn
down and reinstalled around the candidate-scoring window) against the
scene's fully-finalized conditioning. Any failure in the value
function, schedule, or the isolation cycle itself degrades to a
silent no-op, declared in the run report, never a crash.

Also hardens _install_context_windows/_install_v2a_scale to roll back
partial state on failure (a leaked context_handler key was silently
re-enabling windowing for later scenes) and fixes the original
non-explore v2a install call site to degrade like its sibling
mechanisms instead of aborting the render.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-22 01:00:34 +03:00
digital-garbageandClaude Sonnet 5 3052037519 fix: phrase blend -- position-by-position average, not a mean-vector blur
Corrected the actual design: encode two FULL conditionings ($style
SHORTCUT1 $postfix and $style SHORTCUT2 $postfix) and average them row by
row -- (1-strength)*A + strength*B per position, strength=0.5 giving
exactly (A+B)/2 as originally specified. The prior mean-vector version
collapsed phraseB's whole sentence into one flat direction applied
identically everywhere, discarding its own word-by-word content.

Resamples the shorter side (linear interpolation along the token axis)
when the two shortcuts tokenize to different lengths, so both sides line
up for the average without changing the output's token count.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 23:03:01 +03:00
digital-garbageandClaude Sonnet 5 dde02f5cd7 fix: phrase blend -- shift the whole prompt, not just the phrase's own rows
Confirmed on the rental: the previous version (phrase-scoped shift) showed
zero visible effect even at strength 1.5. Qwen's rows are contextual, so
every word in "a cat sits on a mat" already carries "sits", not just the
verb's own row -- editing 1-4 rows out of the sentence left the rest still
pointing at phraseA's action. Now shifts the whole prompt-token range toward
the alt sentence's own whole-prompt mean.

Multiple [a|b] spans in one prompt are additive: each span's delta is
measured against the original conditioning, not against a prior span's
already-shifted result, so they don't compound order-dependently.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 22:33:00 +03:00
digital-garbageandClaude Sonnet 5 8a6ab12ce6 feat: phrase blend -- per-blend strength override, [a|b:0.8]
Default 0.5 shift left phraseA dominating the video. [phraseA|phraseB:N]
overrides strength per blend. Fixed a shared regex gap along the way: every
weight/strength markup in this file (not just blend) silently rejected
leading-dot decimals like ".8" -- fell through to literal text with no
error, reproducing the exact "override did nothing" bug this feature exists
to fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 22:05:22 +03:00