Restore a valid selection after reconnecting the last Switch input and remove
the redundant loading check after the early return.
Add Chrome regressions for workflow loading, routing, reconnection, legacy
Switch names, and image, mask, SEGS, conditioning, and regional-prompt combine
nodes. Wait for imported nodes to replace the previous graph, and check
non-default selections and fresh outputs after editing.
Keep the different-size mask batch test as a documented pre-existing failure;
its backend implementation is outside this change.
- 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.
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).