Direct response to the v1.1.6 packaging gap, where the prompt-chain nodes
(combiner, refiner, negative) were authored under nodes/ but never wired
into NODE_CLASS_MAPPINGS, so they silently failed to ship.
- __init__.py now raises RuntimeError at import time if NODE_CLASS_MAPPINGS
and NODE_DISPLAY_NAME_MAPPINGS drift apart. ComfyUI startup logs surface
the mismatch instead of dropping the node from the menu silently.
- New tests/unit/test_node_registration.py contract suite (8 tests):
* Expected 5 keys are registered.
* Display names cover every class.
* Each registered class satisfies the ComfyUI node interface
(INPUT_TYPES classmethod, RETURN_TYPES, FUNCTION, CATEGORY,
and the FUNCTION attribute resolves to a callable method).
* Every nodes/*_node.py module on disk is reachable from the mapping —
this is the regression guard that would have caught v1.1.6.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>