Module Contract Lab: INPUT → PROCESS → CHECKPOINT → RETURN
Третий практикум превращает группу из визуальной рамки в инженерный модуль. Мы соберём маленькую ветку только на core ComfyUI nodes и явно зададим её input contract, responsibility, checkpoint и return point.
Научиться видеть границу ответственности
В больших workflow одна из главных причин хаоса — неясно, где заканчивается одна задача и начинается следующая. LAB 03 заставляет провести эту границу буквально на canvas.
После упражнения ты должен уметь взять любую ветку Hansen и сформулировать: что она получает, что делает, где проверяется и что официально возвращает в Master Workflow.
Минимальный IMAGE-модуль без моделей
- LoadImage оставь вне MODULE_01_INVERT: это upstream / Master Input.
- ImageInvert помести внутрь группы MODULE_01_INVERT.
- Первый PreviewImage помести внутрь группы и подпиши CHECKPOINT · MODULE RESULT.
- Второй PreviewImage оставь снаружи и подпиши MASTER DOWNSTREAM / OUTPUT.
- Один IMAGE output ImageInvert подключи одновременно к локальному checkpoint и downstream output.
Запиши contract до запуска
Почему это contract
Модуль не имеет права скрыто требовать prompt, model, seed или mask. Его единственная внешняя зависимость в этой лаборатории — IMAGE.
| Поле | LAB 03 |
|---|---|
| Required input | IMAGE |
| Source | MASTER INPUT · LoadImage |
| Dimensions | принимаются от source image |
| Batch | передаётся вместе с IMAGE tensor |
| Coordinate space | тот же canvas, что у входного IMAGE |
| Optional inputs | нет |
Сформулируй задачу одной строкой
Ответственность MODULE_01_INVERT: принять IMAGE и вернуть инвертированный IMAGE. Всё. Он не загружает файл, не сохраняет delivery result, не выбирает route и не управляет другими группами.
Если описание модуля требует длинного предложения с несколькими независимыми задачами, граница, скорее всего, проведена плохо.
Checkpoint доказывает исправность модуля до downstream
Запусти workflow и сначала смотри только LOCAL CHECKPOINT. Не оценивай MASTER OUTPUT, пока локальный результат не доказан.
Это очень простое правило позже спасает часы в PPL, masks и main FLUX: локальная ветка должна уметь доказать собственный результат независимо от того, что происходит после return.
Return — это граница, а не обязательно отдельная нода
В LAB 03 return point — IMAGE link, который пересекает правую границу MODULE_01_INVERT и идёт в MASTER OUTPUT. Отдельная Return node не обязательна: важна однозначность интерфейса.
В большом production graph return полезно дополнительно маркировать reroute/label/note, особенно если module extraction планируется как standalone JSON.
| Return field | LAB 03 |
|---|---|
| Type | IMAGE |
| Meaning | Processed module result |
| Canvas | same logical image canvas as input |
| Downstream assumption | получатель не должен знать внутреннюю реализацию module |
Replacement test: модуль должен быть заменяемым
Создай вторую группу MODULE_02_PASS_THROUGH. Её задача — вернуть исходный IMAGE без изменения. Затем поставь selector после двух module outputs и переключай MODULE_01_INVERT / MODULE_02_PASS_THROUGH.
Если downstream продолжает принимать один и тот же contract IMAGE, значит modules совместимы на уровне интерфейса, даже если делают совершенно разную внутреннюю работу.
Как этим читать любую ветку Hansen
| LAB 03 вопрос | Пример production branch |
|---|---|
| INPUT CONTRACT? | BASE IMAGE / MASK / MODEL / prompt / controls |
| ONE RESPONSIBILITY? | например Generate Person или Segment Person |
| LOCAL CHECKPOINT? | raw generation / bbox / mask / clean cutout / composite |
| RETURN CONTRACT? | IMAGE / MASK / LATENT, который возвращается downstream |
| HIDDEN DEPENDENCIES? | shared seed, size, selector, loader, prompt fragment |
LAB 03 пройден, если ты можешь спроектировать модуль до нод
- Ты сначала пишешь responsibility и contracts, а потом выбираешь nodes.
- Ты отличаешь локальный checkpoint от финального Master output.
- Ты можешь показать точный return point на canvas.
- Ты умеешь найти incoming links, пересекающие границу module.
- Ты понимаешь, почему два разных modules могут быть взаимозаменяемыми при одинаковом contract.
- Ты можешь объяснить, почему hidden dependency ломает standalone extraction.
После трёх LAB
LAB 01 учит route selection; LAB 02 — centralized group control; LAB 03 — module boundaries. Вместе они дают минимальный практический фундамент для чтения Hansen production graph.