DynamicOutputs: fix block_execution sizing, harden validation, trim comments

Address code-review feedback:

* Fix pre-existing bug surfaced by this work: a V3 node returning a bare
  ExecutionBlocker (normalized to NodeOutput(block_execution=msg) with no
  positional/named result) was silently dropped in get_output_from_returns.
  block_execution now takes precedence and shapes the blocker tuple to the
  active output count first.
* Reject malformed linked-input source node ids (non-string) up front in
  validate_inputs as 'bad_linked_input' instead of letting them fall into
  the type resolver.
* Schema.validate(): reject duplicate DynamicOutputs group ids.
* Drop a couple of over-defensive / restating comments.

New tests: blocker sizing through both the NodeOutput and bare-blocker paths
for dynamic nodes, and duplicate-group-id schema rejection.

Amp-Thread-ID: https://ampcode.com/threads/T-019e8568-f382-743d-a97f-0de3ff29d501
Co-authored-by: Amp <amp@ampcode.com>
This commit is contained in:
Jedrzej Kosinski
2026-06-01 20:48:08 -07:00
parent 54f87a09a5
commit 188065c011
5 changed files with 124 additions and 24 deletions
+1 -5
View File
@@ -233,11 +233,7 @@ class TypeResolver:
return ANY_TYPE
def _get_finalized_outputs(self, node: dict | None, class_def) -> io.FinalizedOutputs | None:
"""Return ``FinalizedOutputs`` for V3 nodes with DynamicOutputs groups, else ``None``.
``None`` means "use the class-level static arrays" (V1 nodes or V3
without any dynamic group), keeping the hot path zero-cost.
"""
"""Return ``FinalizedOutputs`` for V3 nodes with DynamicOutputs groups, else ``None``."""
if not (isinstance(class_def, type) and issubclass(class_def, _ComfyNodeInternal)):
return None
try: