Commit Graph
43 Commits
Author SHA1 Message Date
digital-garbageandClaude Sonnet 5.5 1fc5d99dcc feat: MiniMax H3 Reference to Video works text-only; with no picture a plain stand-in of the Width/Height shape feeds the size chain (found on a real GPU)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-15 15:03:52 +03:00
digital-garbage 23b46559cc fix: hints and labels now say what the control does (menus, inspector, timeline, takes, ideas, enhancer, context windows, montage, modes); H3 project negative prompt reaches the negative slot 2026-10-15 12:55:40 +03:00
digital-garbageandClaude Sonnet 5.5 d59a9ecba4 fix: a loaded project file is saved cleared; the shot camera node always gets the project id; infusion skips a word the shot already says
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 07:11:54 +03:00
digital-garbageandClaude Sonnet 5.5 090f8cfbb8 feat: focus infusion draws only on words the current project's own prompts keep returning to
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 06:29:41 +03:00
digital-garbageandClaude Opus 5.5 99f00f2950 feat: FunPack Save Video takes frames, sound and fps directly; Create Video dropped from the presets
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:08:28 +03:00
digital-garbageandClaude Opus 5.5 82d18494ad feat: FunPack Save Video: H.265 on NVENC (hvc1, plays in Mac Chrome/Safari), H.264 option; no NVENC = H.264 on every CPU core (core SaveVideo used one); presets use it
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 15:43:18 +03:00
digital-garbageandClaude Opus 5.5 05fde80caf feat: H3 decode logs where its time goes: picture vs sound seconds, VAE precision, and whether the VAE was fully on the GPU
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 15:26:31 +03:00
digital-garbageandClaude Opus 5.5 109ea2fb4f revert: H3 decode in one piece showed a tile grid (the decoder is trained on 256px tiles); back to ComfyUI's own tiling, tooltip says so
Reverts b015ce3f.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 15:01:07 +03:00
digital-garbageandClaude Opus 5.5 b015ce3f87 fix: H3 decode with tile size 0 decodes each frame in one piece (core tiled at 256 regardless); out of memory steps down to 512, then 256 tiles
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 14:51:11 +03:00
digital-garbageandClaude Opus 5.5 ef84df4286 fix: views redraw when a project's pipeline goes in; project switches wait for edits in flight and load one at a time; modifier settings hide when the pipeline cannot install them; refusals name the setting the person sees; older SD1.x files are recognised; stale load retries are cancelled
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 09:23:18 +03:00
digital-garbageandClaude Opus 5.5 6fa6c4c6ee fix: a preset, import or wizard pipeline reopens exactly as saved (roles too); Taste key hides when no learning feature is on; a broken node schema no longer takes the module list down; a failed model probe is retried
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 04:40:32 +03:00
digital-garbageandClaude Opus 5.5 927d8d7358 feat: Stable Diffusion 1.5 model module, so the whole pipeline runs on a Mac (picture held for the clip's length)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 04:19:20 +03:00
digital-garbageandClaude Sonnet 5.5 054f18a525 fix: Generate reads the live screen, not a save; autosave delay is a setting that waits for typing; H3 preset always carries a LoRA loader (None = untouched)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 15:51:40 +03:00
digital-garbageandClaude Sonnet 5.5 dce64c1813 feat: shot camera (cut times, views, camera moves for [Shot N]) with rating-taught memory
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 14:07:03 +03:00
digital-garbageandClaude Sonnet 5.5 3f8607b343 feat(h3): Negative Erase node — the negative prompt takes its direction out of the positive at CFG 1 (off at strength 0)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 12:05:10 +03:00
digital-garbageandClaude Sonnet 5.5 1343486f87 feat(ltx): 'Anchor as guide' pipeline preset (stock LTXVAddGuide at frame 0, empty latent, guides cropped before decode)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 12:01:55 +03:00
digital-garbageandClaude Sonnet 5.5 69c678e97e fix(ui): a run already finished at reload is recorded at once instead of locking the page; recovered length uses the shared-frame rule; H3 second pass gets a fresh seed too
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 20:02:46 +03:00
digital-garbageandClaude Sonnet 5.5 e0a23b93b5 fix(ui): fresh seed per run (generation.seed role), a unit is made at its clips' length, all-excluded units skip (not just the root), monitor stops at a clip's own length, inspector follows the pipeline, settings capped at the file's limit
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 19:46:14 +03:00
digital-garbageandClaude Sonnet 5.5 d14bc51c2d fix(ui): left-edge trim direction, one source for length/fps (roles 'drive' it), whole-number settings only, stop/queue/no-prompt/adopt messages, ghost remove, cut halves read-only prompt, preview start+end; font test sees app/ui fonts
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 19:32:36 +03:00
digital-garbageandClaude Sonnet 5.5 a51faa729b feat: LTX modules — video->audio coupling, context windows, identity transfer (Best-FaceID); TinyLTX real-model fixture; ltx_av trait
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 10:48:36 +03:00
digital-garbageandClaude Sonnet 5.5 47752491db fix: LTX — tiled decode asked the way comfy asks it, picture found for ALG/DynaShift/guidance (shared av_video_stream), odd sizes said
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 10:30:37 +03:00
digital-garbageandClaude Sonnet 5.5 6bfeb63c4c feat: LTX 2.x model module — recognised from the checkpoint header, joint video+audio latent sized from the audio VAE, decode, text/image-to-video pipelines
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-03 10:24:43 +03:00
digital-garbageandClaude Sonnet 5.5 fd236a6e97 fix: phrase probe re-installs when its switch flips (cache key), sits innermost so other features' extra forwards are not measured, panel keeps peaks; enhancer reads Qwen-style tokenizers, chat comments key on the typed prompt; scenes get eff_frames/eff_fps
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-02 15:35:37 +03:00
digital-garbageandClaude Sonnet 5.5 8be3770080 feat: H3 tiled and X2 Detail VAE decode, phrase probe with Settings panel
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-02 15:17:03 +03:00
digital-garbageandClaude Sonnet 5.5 b29fda7a0e feat: prompt enhancer (node module, H3 preset slot, Composer Enhance + Chat tabs, readout route)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-02 15:05:22 +03:00
digital-garbageandClaude Opus 5.5 0bb7e3a01a fix: H3 picture found in the packed model output; latent steering was off on every real run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 19:01:13 +03:00
digital-garbageandClaude Opus 5.5 f99944e5e4 fix: DynaShift and taste guidance read the step from ComfyUI's positional call; they never steered
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:53:51 +03:00
digital-garbageandClaude Opus 5.5 b831372879 feat: DynaShift steers late steps away from disliked clips, banked on the taste key
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:34:16 +03:00
digital-garbageandClaude Opus 5.5 53cbc29948 feat: taste steering + taste attention learn from ratings; a failing wrapper no longer re-runs sampling
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:31:10 +03:00
digital-garbageandClaude Opus 5.5 9d028ccc92 feat(v5): prompt markup for H3 -- (word:1.5), [phrase@t0-t1], [a|b]
Prompt Markup strips it before the encoder; Apply Prompt Markup puts weights
and timed windows on attention and blends on the conditioning. Where the words
sit is the H3 module's (text_tokenizer, prompt_rows, video_time_rows). Wired
into both H3 presets.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 18:11:51 +03:00
digital-garbageandClaude Opus 5.5 6838e3b997 feat(v5): cut opening frames -- keep the anchor's transfer, drop the still
Cuts decoded frames and the same time off the sound. In both H3 presets,
0 by default.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:56:15 +03:00
digital-garbageandClaude Opus 5.5 5787190b3f feat(v5): H3 second pass as graph -- upscaler loader, latent resample, typed pass-2 schedule
H3's latent upscaler loads through the H3 module (ComfyUI's loader has no
branch for it); an upscale resizes H3's anchor pin so pass 2 stays pinned.
FunPack Sampler takes an optional wired schedule, run exactly as written.
New preset: H3 Reference to Video + second pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:49:39 +03:00
digital-garbageandClaude Opus 5.5 56490ec769 feat(v5): ALG loosens H3's pinned opening keyframe
The H3 module offers anchor_pin, so ALG blurs the pin's latent without
learning H3's payload layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:37:49 +03:00
digital-garbageandClaude Opus 5.5 c3ad0dfd79 feat(v5): randomizer and block repeat modules for H3, on shared chainable block hooks
Block repeat's video-only mode now really keeps audio single-pass: H3 blocks
write in place, so v4 restored audio from an already-repeated stream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:29:42 +03:00
digital-garbageandClaude Opus 5.5 ec6e9893b4 feat: hide settings the picked model cannot use, as soon as the file is picked
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 17:20:59 +03:00
digital-garbageandClaude Sonnet 5 776529e0d8 feat: assign category to every remaining module
The port plan calls for every module under modules/ to declare a
CATEGORY so Settings/Engine panels can group by it. Only alg, sharpen,
appearance, and full_control had one; the other 12 (loaders, empty
latent, media load, minimax_h3, output decode, sampling modifiers/
sampler, system pipeline) are plain infrastructure with no user-facing
settings dial, so they land in "system" except output_decode (post,
matching its STAGE) and the two sampling modules (sampling). Verified
against core/tests (548 passed) -- category validation and the
registry's field-mapping catch a typo here, per the earlier fixture-gap
fix.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 09:46:58 +03:00
digital-garbage 4744d30087 fix: H3 preset combo values rejected by real node schemas
keep_proportion/extra_padding/invert_crop (ImageTransformKJ) and format
(SaveVideo) were wrapped in a redundant {"field": "value"} dict instead of
the plain string ComfyUI's own DynamicCombo expansion expects at the wire
level -- every one of them silently failed graph validation and fell back
to the node's own default, undermining the "total_pixels" resolution-fit
behavior this preset exists for. Found by loading the preset in a real
browser against real node schemas; the dev server never had comfy_extras
or KJNodes registered before now, so this was invisible locally until
tools/devserver.py also gained real node registration (init_extra_nodes +
KJNodes' load_custom_node, matching what the pytest `registered` fixture
already did).

The two pipeline_preset tests that were supposed to catch this had too
broad a filter -- it excluded ANY "is not one of" message as an assumed
"combo not chosen yet" state, which in this codebase actually shows up as
"needs X and nothing fills it" instead. Tightened to exempt only the three
loader-file combos genuinely left unset on a fresh install.

Verified live: preset loads with zero combo-validation problems, only the
three expected unset-loader-file messages remain, and Generate correctly
refuses with an honest reason rather than a false success.
2026-09-11 13:32:52 +03:00
digital-garbage 3931677507 feat: per-scene resolution source + references, picked from the Media bin
Pieces B and C: Scene gains source_image (aspect-ratio reference only --
resolution itself stays a project.video setting, ImageTransformKJ's
"total_pixels" keep_proportion fits the picture's aspect into that budget)
and references (media ids, in order). Inspector's Scene tab gets pick/clear/
remove controls; picking routes through the existing Media bin via a small
pending-pick handshake in boot.js (one bin, one onPick, so "which field
asked" has to be tracked between the click that asked and the click that
answered).

References wire into MiniMaxH3ReferenceToVideo's ref_images autogrow input
dynamically, per run, only for what a scene actually has -- an unwired slot,
not an empty image, is what "not in use" means to that node. The target is
data on the role itself (wireTo), not a slot id boot.js would otherwise have
to know, keeping the "core never names an implementation" contract intact
one layer up into the app.

Verifying this exposed a second real core gap (after the MatchType one):
core/graph.py had no idea what an Autogrow (V3's io.Autogrow) input even
is -- "ref_images" reported as one opaque COMFY_AUTOGROW_V3 slot, its real
per-instance sockets (ref_image_0, ref_image_1, ...) invisible to
declared()/build(), so a wire naming one was refused as an input the node
does not have. Fixed generically in comfy_types.py (autogrow_instances())
and graph.py, confirmed against ComfyUI's own _io.py (finalize_prefix's
dotted join, build_nested_inputs's runtime un-nesting) -- not guessed, and
proven end to end with a real override()+build() test using the exact edit
boot.js makes.
2026-09-11 12:00:16 +03:00
digital-garbage ceac622f2c feat: MiniMax H3 Reference-to-Video pipeline preset, and a real MatchType fix it surfaced
Piece A of the H3 workflow port: the loader/SigmaShift/ImageTransformKJ/
R2V/sampler-at-CFG-1/decode/video-mux chain the H3 user runs by hand today,
offered as a preset (GET /api/pipeline/presets) loadable into the same
editable pipeline core/graph.py already supports -- not a second "default",
which module-load order would make ambiguous.

References are deliberately NOT pre-wired into R2V's ref_images autogrow;
an unwired optional slot is what "not in use" means to that node (absent
from its ref_images dict), not an empty image degrading its <Picture i>
numbering. boot.js wires them per-run based on what's actually picked --
next commit.

Building this against a real ComfyUI+KJNodes registration (not a fake
schema) surfaced a genuine core bug: core/graph.py's from_comfyui() had no
idea what to do with a V3 MatchType socket (ImageTransformKJ's own image
input) -- its bare type name "COMFY_MATCHTYPE_V3" matched nothing, so a
completely legal IMAGE wire into it was refused. Fixed generically in
comfy_types.py (match_type_union()) and graph.py, for any node using
MatchType, not special-cased to this one.
2026-09-11 11:46:48 +03:00
digital-garbageandClaude Sonnet 5 93bdd27b32 app, core: a node's outputs are visible, and model family detection
Every node's own OUTPUTS were invisible on its own panel in the pipeline
editor -- wiring an input already let you pick a source, but opening the
node that PRODUCES something told you nothing about what it makes or
whether anything reads it. Found live, by a real user just looking at a
node, after two full review rounds that only ever checked the consuming
side. Fixed with a read-only "Outputs" section per node, naming each
output, its type, and who (if anyone) currently wires from it.

Also: model family detection. core/probe.py reads a safetensors header
(tensor names only, no weights) and asks every installed model module,
through the same capability-lookup mechanism already used for
empty_latent/decode, whether the file is its own -- core never names a
family itself. A real, adversarially-found bug in the ported signature:
one of MiniMax H3's three candidate prefixes doesn't correspond to any
prefix ComfyUI's own loader actually resolves to, traced through
comfy/model_detection.py and comfy/sd.py -- the probe could have called a
file H3 that ComfyUI's real loader would refuse. Removed, and pinned with
a dedicated test module. A second finding narrowed the folder search to
only the folders FunPack's own loaders actually read from.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 10:54:28 +03:00
digital-garbageandClaude Opus 5 a81ac48083 model support is a folder, and a modifier you can watch working
Decode now takes the MODEL, so a provider answers "is this mine" by identity
instead of by shape. H3 was claiming any latent that happened to have two
parts -- right today because it is the only thing producing one, wrong the
moment a second AV model exists, and wrong in the way that reads as an
unrelated fault rather than an error. It declines when the model is not
wired, and the node says that is what is missing.

That completes the shape a model module should have: one folder saying how
this model behaves at each stage -- what it is, how its latent is built, how
its output is decoded -- instead of that knowledge spreading through the
conditioning and sampling code as special cases.

Added a modifier that runs on SD1.5, because a feature nobody can watch is a
feature nobody can check. It declares no traits, so it applies everywhere,
which is the other half of the rule ALG demonstrates by narrowing. Measured
on this machine at a fixed seed: off and on differ, 0.4 gives a visibly
richer picture that still reads correctly, and 1.2 blows the highlights --
so the range is -1..1, set from what was measured rather than from a round
number. A slider whose top half destroys the image lies about its range.

Two things found while building it. ComfyUI has a real circular import
between nodes_latent and nodes_post_processing that resolves only because
init_extra_nodes reaches one first; a custom node has to break it the same
way. And the accumulation bug returned through a third door: stripping
handled keyed wrappers but not the anonymous function lists on
model_options, so chaining doubled the effect. Tagging is now generic -- it
looks for our mark rather than for a list of hook names that would need
keeping current.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 13:33:09 +03:00
digital-garbageandClaude Opus 5 134cee78b7 output: decode, which is the last thing FunPack needs to own
Core already turns images into a video and writes the file, and handles
containers, codecs and muxing properly. Writing our own would be a worse
copy of tested code, so there is no FunPack save node and no reason for VHS
either.

What core cannot generalise is decoding a latent that is not one tensor: an
AV latent has two branches wanting different VAEs, and their arrangement is
the model's business. Same rule as the empty latent -- a model module may
claim it, and H3 now does. A nested latent nobody claims is refused rather
than handed to vae.decode, which would raise somewhere confusing or quietly
decode one branch as the picture. A missing audio VAE is named, because
returning no audio looks exactly like a model that makes none.

With this the pipeline closes end to end using FunPack's eight nodes and
core's samplers and video nodes -- verified by loading both together. That
matters more than the node count: until now nothing FunPack produced could
be measured, only reasoned about.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 13:02:11 +03:00
digital-garbageandClaude Opus 5 fa2caa8860 latent: an empty latent the model decides the shape of
Derived from latent_format where that is possible, which is every
single-tensor model: SDXL, Wan21 and LTXV all come out matching the numbers
core's own nodes compute, including models that ship after this.

H3 cannot be derived and is the reason modules exist. Its latent is a
NestedTensor of a video and an audio branch, its video channel count is not
the latent_channels its format reports, and its length snaps to a frame
grid. So modules/models/minimax_h3 claims it and builds it, importing the
grid from ComfyUI rather than copying a second definition of it.

Nothing outside that folder names a model, and nothing here assumes video:
a 2-D latent format yields an image latent with no branch anywhere.

Modules reach core through modules/_core.py. ComfyUI imports a pack by file
location, so an absolute `import core` in a module resolves under pytest and
not under ComfyUI -- the node then never registers, silently. That cost the
same bug twice, so there is now a test that loads the pack the way ComfyUI
does, in an isolated subprocess whose cwd is NOT the repo. The first version
of that test passed with the bug reintroduced, because cwd was on sys.path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-29 12:21:25 +03:00