Resolve direct string constants before execution and retain requested seeds
for list-producing inputs. Preserve native widget values and scalar reuse.
Cover cold queues, mapped lists and Control combinations with actual core
cache checks and Chrome tests. Limit the Bypass xfail to the known Processor
case so Encode failures remain visible.
Prompt validation runs after the hook and rewrites FLOAT values sent as
whole numbers and __value__ list widgets, so upstream chains containing
them never matched. The fingerprint now applies the same normalization.
Only [node_id, slot] pairs are followed as links; list widget values
crashed the hook.
Each wildcard node keeps only its last static run. ComfyUI's default
and classic caches drop results of earlier prompts, so older records
were never hit. A run that receives syntax clears the record.
Linked populated_text keeps its seed at submission, since its runtime
value is unknown there. When a finished run receives text without
wildcard syntax, the node records that run's seed for the same upstream
inputs. Later submissions with identical upstream inputs reuse it, so
the wildcard node and downstream nodes stay cached.
Upstream nodes that declare IS_CHANGED/fingerprint_inputs or are not
registered are never recorded, matching ComfyUI's own cache assumption.
Clamp finite mask values to [0, 1] before uint8 contour conversion while
preserving input arithmetic dtype, batch handling and combined behavior.
Add CPU and native-workflow regression coverage for range boundaries,
tutorial mask behavior, widget serialization and fresh browser execution.
Document the isolated test environment and regression verification scope.
Keep original automatic-mode candidates and empty selections, retain entry punctuation, and reject cross-drive paths without breaking category discovery.
Keep wildcard sampling on its per-call NumPy generator and remove Python RNG seeding and state restoration. Preserve the negative seed normalization from #1224.
Add 19 seed regressions covering fixed outputs, signed seeds, shared RNG preservation on success and failure, and concurrent consumers. All 117 standalone tests pass; the two concurrency cases fail again when the PR implementation is restored.
Fix lazy Switch inputs, Inversed Switch fan-out, and valid ANY connections.
Use target input slots for output connection guards, preserve mask batches
and one-pixel dimensions during resizing, and restore label-filter defaults.
Keep existing widget names and order and remove noisy selection logging.
Add Chrome regression coverage for routing, execution results, and tutorial
workflows. Add a UI-created catalog of 197 registered nodes and 712 ordered
widget values to detect native workflow loading regressions.
Require Full Cache mode and trusted-baseline checks before catalog additions.
Verify candidate workflows and browser cleanup before publishing fixtures.
Document the widget compatibility, test setup, and catalog-extension rules.
- read_wildcard_dict wraps each file in try/except and logs a warning with the file path and error
- per-file body moved to _read_wildcard_file; empty YAML files are skipped in eager mode as in on-demand mode
- test: a malformed YAML is skipped and named while good txt/yaml files still load (eager and on-demand)
- Honor user settings when optional configuration keys are absent and
report fallback to defaults.
- Share UTF-8/BOM decoding across wildcard loaders, retain logged
Latin-1 fallback, and warn when expansion reaches its limit.
- Cover configuration and loader paths with isolated pytest regressions
and enforce time limits for circular expansion.
- Exercise wildcard editing and Detailer workflows through Chrome,
preserving original errors and traces when cleanup fails.
- Run API encoding checks against prepared test servers without
changing configuration or managing server processes.
tensor_convert_rgb is typed for NHWC torch tensors, but with prefer_copy it called image.copy(), which torch.Tensor does not have, so every RGBA image raised AttributeError. Use clone() for a tensor and keep copy() for a numpy array.
Fixes#1194, fixes#1178.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
np.random.default_rng() raises ValueError on a negative seed, which skips
wildcard population and leaves the previous populated text in place.
process() also left the global random module seeded, which affects other
nodes that draw from the global RNG afterwards.
Resolves `AttributeError: 'DifferentialDiffusion' object has no attribute
'execute'` on older ComfyUI (<0.3.63) where the V3 schema migration has
not landed yet. The prior code called `.execute(model)[0]` directly,
breaking anyone still on the legacy `.apply(model)` API.
Introduce `modules/impact/utils.apply_differential_diffusion(model)`
which uses `hasattr` to pick the correct branch at runtime:
- `.execute` -> V3 classmethod (ComfyUI >= 0.3.63)
- `.apply` -> legacy instance method (older)
- otherwise -> AttributeError with upgrade guidance
Replace all 7 direct call sites (animatediff_nodes, core x2,
impact_pack x2, segs_nodes, segs_upscaler) with the helper. The
existing import guard in segs_upscaler is preserved; the helper's
deferred import means ImportError still propagates for very old
ComfyUI builds without `comfy_extras.nodes_differential_diffusion`.
Fixes GitHub issue #1177.
Also add an E2E test harness:
- docs/E2E_TEST_STRATEGY.md — isolated-launch workflow with
--disable-all-custom-nodes + --whitelist-custom-nodes, Playwright
smoke test, workflow execution via /prompt + /history + /view,
verification criteria, operational notes.
- tests/e2e_dd_compat.py — reference test that runs SEGSDetailer
with noise_mask_feather=20 on a real input image, asserting
status==success and non-zero pixel delta between input and paste
previews (proves the detailer loop and compat shim actually ran).
- Move readLinkedNumber, getDrawColor, computeCanvasSize to common.js
- Import shared functions in mask-rect-area.js and mask-rect-area-advanced.js
- Remove duplicate implementations from both MaskRectArea modules
- Clean up unused debug parameter in syncLinkedInputsToProperties
## Overview
This PR improves both MaskRectArea and MaskRectAreaAdvanced nodes by allowing them to accept values from connected INT nodes, while preserving backward compatibility with existing workflows.
It also fixes several UI and preview issues that prevented the canvas from updating correctly when values were driven by links.
Fixes#1126
## Key changes
### 1. Typed INT inputs support (backend)
- Both MaskRectArea and MaskRectAreaAdvanced now declare proper INT inputs in INPUT_TYPES.
- This allows parameters such as x, y, width, height, and blur_radius to be driven directly by other nodes.
- Existing workflows that relied on node properties remain supported via fallback logic using extra_pnginfo.
### 2. Live preview correctly updates when inputs are linked (frontend)
- The canvas preview now updates immediately when values come from linked INT nodes.
- This is achieved by synchronizing linked input values into node.properties during canvas rendering, avoiding reliance on widget callbacks or execution timing.
- This directly resolves the behavior reported in issue #1126.
### 3. Node height and layout fix (frontend)
- The node height calculation was corrected to use the actual widget layout (last_y) instead of input/output counts.
- Nodes can now both grow and shrink correctly when resized or when widget content changes.
- This removes excessive empty space below the widgets and canvas.
### 4. Widget duplication prevention
- Frontend logic now detects when widgets are already created by Python and avoids recreating them in JavaScript.
- This prevents duplicated widgets and keeps the node UI consistent.
### 5. Comment cleanup
- Remaining comments in Spanish were translated to English for consistency and maintainability.
## Backward compatibility
- Existing workflows continue to work without modification.
- Default behavior and mask output remain unchanged unless inputs are explicitly linked.
## Motivation
These changes make the nodes composable with the rest of the graph (especially math and control nodes), improve the reliability of the preview, and fix UI inconsistencies without introducing breaking changes.
* Update dims getting logic in IterativeLatentUpscale to assume that
height and width are at the end of the latent's dimensions.
* Update dims getting logic in IterativeLatentUpscale to assume that
height and width are at the end of the latent's dimensions.
* re-order args
Fix Reactor Masking Helper tensor concatenation issues
- Ensure all tensors are on the same device before concatenation.
- Add batch dimension to single images to support batched concatenation.
- Enforce height and width matching via upscaling to prevent dim mismatch.
- Handle channel mismatches by truncating to the minimum channel count.
- Remove unsafe tensor repetition to avoid excessive RAM usage.
- Prevent RuntimeErrors when concatenating images of varying sizes or devices.