Summary
14 of the 31 bundled workflows in invokeai/app/services/workflow_records/default_workflows/ pin invocation versions that no longer match the invocations they reference. Three reference node types that have been deleted from the registry outright, and two carry inputs that are no longer fields of the invocation.
Nothing catches this. tests/app/services/workflow_records/test_default_workflows_registry.py asserts exactly these invariants — every node type registered, every embedded version equal to the invocation's, every embedded input a real field — but only over a glob of the Wan and MiniMax H3 video workflows. The other 14 files are never checked, so the drift accumulated silently.
User-visible effect
getNeedsUpdate (invokeai/frontend/web/src/features/nodes/util/node/nodeUpdate.ts:32) flags any string inequality, so a user opening e.g. Text to Image - SD1.5 sees "needs update" badges on five of its nodes. Where only the minor differs, getMayUpdateNode permits an in-place update, so it is mostly cosmetic noise. Where it is not:
flux_denoise is pinned 3.0.0 against a current 4.6.0 in FLUX Image to Image and Flux Text to Image — a major-version gap, which is exactly the case in-place update refuses.
- Those same two files list
flux_denoise.board and flux_denoise.metadata as inputs. FluxDenoiseInvocation no longer inherits WithBoard/WithMetadata, so neither is a field any more and both are dropped on load.
- Three files reference node types that no longer exist at all, so those nodes cannot render:
canny_image_processor — ESRGAN Upscaling with Canny ControlNet, Face Detailer with IP-Adapter & Canny, Multi ControlNet (Canny & Depth)
midas_depth_image_processor — Multi ControlNet (Canny & Depth)
Full report
Generated against the live InvocationRegistry.
Deleted node types
| Workflow |
Missing node type |
| ESRGAN Upscaling with Canny ControlNet |
canny_image_processor |
| Face Detailer with IP-Adapter & Canny |
canny_image_processor |
| Multi ControlNet (Canny & Depth) |
canny_image_processor, midas_depth_image_processor |
Inputs that are no longer fields
| Workflow |
Input |
| FLUX Image to Image |
flux_denoise.board, flux_denoise.metadata |
| Flux Text to Image |
flux_denoise.board, flux_denoise.metadata |
Version drift
Distinct invocations, with the pinned value(s) found and the current version:
| Invocation |
Pinned |
Current |
cogview4_denoise |
1.0.0 |
1.1.0 |
collect |
1.0.0 |
1.1.0 |
compel |
1.2.0 |
1.2.1 |
controlnet |
1.1.2 |
1.1.3 |
denoise_latents |
1.5.3 |
1.6.0 |
flux_denoise |
3.0.0 |
4.6.0 |
flux_model_loader |
1.0.4 |
1.1.0 |
flux_text_encoder |
1.0.0 |
1.1.2 |
flux_vae_decode |
1.0.0 |
1.0.2 |
flux_vae_encode |
1.0.0 |
1.0.1 |
i2l |
1.1.0 |
1.2.0 |
ip_adapter |
1.4.1 |
1.5.1 |
l2i |
1.3.0 |
1.3.2 |
lora_loader |
1.0.3 |
1.0.4 |
main_model_loader |
1.0.3 |
1.0.4 |
model_identifier |
1.0.0 |
1.0.1 |
noise |
1.0.2 |
1.1.0 |
sd3_denoise |
1.0.0 |
1.2.0 |
sd3_l2i |
1.3.0 |
1.3.2 |
sd3_model_loader |
1.0.0 |
1.0.1 |
sd3_text_encoder |
1.0.0 |
1.0.1 |
sdxl_compel_prompt |
1.2.0 |
1.2.1 |
sdxl_model_loader |
1.0.3 |
1.0.4 |
tiled_multi_diffusion_denoise_latents |
1.0.0 |
1.0.1 |
vae_loader |
1.0.3 |
1.0.4 |
Affected workflows: CogView4_TextToImage, ESRGAN Upscaling with Canny ControlNet, FLUX Image to Image, Face Detailer with IP-Adapter & Canny, Flux Text to Image, Multi ControlNet (Canny & Depth), MultiDiffusion SD1.5, MultiDiffusion SDXL, Prompt from File, SD3.5 Text to Image, Text to Image - SD1.5, Text to Image - SDXL, Text to Image with LoRA, Tiled Upscaling (Beta).
Clean (17): all Wan and MiniMax H3 video workflows, plus Wan 2.2 Image to Image and Wan 2.2 Text to Image — i.e. exactly the set the existing test covers.
Suggested fix
- Widen
test_default_workflows_registry.py from its Wan/MiniMax glob to the whole default_workflows directory, so this cannot drift again.
- Re-pin the versions and drop the two dead
flux_denoise inputs. Mostly mechanical — a script can re-pin from the registry.
- Decide what to do about the three workflows referencing deleted node types: repoint them at the replacement processors, or retire the workflows.
Steps 1 and 2 should land together, since widening the test fails until the files are re-pinned.
Reproduction
import glob, json
from invokeai.app.invocations.baseinvocation import InvocationRegistry
from invokeai.app.services.shared.graph import Graph # registers invocations
by_type = {i.get_type(): i for i in InvocationRegistry.get_invocation_classes()}
for path in sorted(glob.glob("invokeai/app/services/workflow_records/default_workflows/*.json")):
for node in json.load(open(path))["nodes"]:
data = node["data"]
cls = by_type.get(data["type"])
if cls is None:
print(f"{path}: unknown node type {data['type']}")
continue
if data.get("version") != cls.UIConfig.version:
print(f"{path}: {data['type']} pinned {data['version']} != {cls.UIConfig.version}")
for field in data.get("inputs", {}):
if field not in cls.model_fields:
print(f"{path}: {data['type']}.{field} is not a field")
Found while reviewing #113, which touches the video workflows in the same directory.
Summary
14 of the 31 bundled workflows in
invokeai/app/services/workflow_records/default_workflows/pin invocation versions that no longer match the invocations they reference. Three reference node types that have been deleted from the registry outright, and two carry inputs that are no longer fields of the invocation.Nothing catches this.
tests/app/services/workflow_records/test_default_workflows_registry.pyasserts exactly these invariants — every node type registered, every embedded version equal to the invocation's, every embedded input a real field — but only over a glob of the Wan and MiniMax H3 video workflows. The other 14 files are never checked, so the drift accumulated silently.User-visible effect
getNeedsUpdate(invokeai/frontend/web/src/features/nodes/util/node/nodeUpdate.ts:32) flags any string inequality, so a user opening e.g. Text to Image - SD1.5 sees "needs update" badges on five of its nodes. Where only the minor differs,getMayUpdateNodepermits an in-place update, so it is mostly cosmetic noise. Where it is not:flux_denoiseis pinned 3.0.0 against a current 4.6.0 in FLUX Image to Image and Flux Text to Image — a major-version gap, which is exactly the case in-place update refuses.flux_denoise.boardandflux_denoise.metadataas inputs.FluxDenoiseInvocationno longer inheritsWithBoard/WithMetadata, so neither is a field any more and both are dropped on load.canny_image_processor— ESRGAN Upscaling with Canny ControlNet, Face Detailer with IP-Adapter & Canny, Multi ControlNet (Canny & Depth)midas_depth_image_processor— Multi ControlNet (Canny & Depth)Full report
Generated against the live
InvocationRegistry.Deleted node types
canny_image_processorcanny_image_processorcanny_image_processor,midas_depth_image_processorInputs that are no longer fields
flux_denoise.board,flux_denoise.metadataflux_denoise.board,flux_denoise.metadataVersion drift
Distinct invocations, with the pinned value(s) found and the current version:
cogview4_denoisecollectcompelcontrolnetdenoise_latentsflux_denoiseflux_model_loaderflux_text_encoderflux_vae_decodeflux_vae_encodei2lip_adapterl2ilora_loadermain_model_loadermodel_identifiernoisesd3_denoisesd3_l2isd3_model_loadersd3_text_encodersdxl_compel_promptsdxl_model_loadertiled_multi_diffusion_denoise_latentsvae_loaderAffected workflows: CogView4_TextToImage, ESRGAN Upscaling with Canny ControlNet, FLUX Image to Image, Face Detailer with IP-Adapter & Canny, Flux Text to Image, Multi ControlNet (Canny & Depth), MultiDiffusion SD1.5, MultiDiffusion SDXL, Prompt from File, SD3.5 Text to Image, Text to Image - SD1.5, Text to Image - SDXL, Text to Image with LoRA, Tiled Upscaling (Beta).
Clean (17): all Wan and MiniMax H3 video workflows, plus Wan 2.2 Image to Image and Wan 2.2 Text to Image — i.e. exactly the set the existing test covers.
Suggested fix
test_default_workflows_registry.pyfrom its Wan/MiniMax glob to the wholedefault_workflowsdirectory, so this cannot drift again.flux_denoiseinputs. Mostly mechanical — a script can re-pin from the registry.Steps 1 and 2 should land together, since widening the test fails until the files are re-pinned.
Reproduction
Found while reviewing #113, which touches the video workflows in the same directory.