Modules & Input/Output Contracts — проектируем ветки как заменяемые блоки
Профессиональный workflow легче строить и обслуживать, если каждая крупная ветка имеет одну ответственность, понятные входы, понятный выход и независимый checkpoint. Тогда Master Workflow превращается из монолита в систему модулей.
Модуль — это законченная ответственность, а не просто цветная рамка
Группа становится инженерным модулем только тогда, когда можно сформулировать её задачу одной фразой, перечислить обязательные inputs и назвать один или несколько ожидаемых outputs.
Хороший модуль можно временно отделить от Master Workflow, подать тестовые входы, получить результат и понять, исправен ли он сам по себе.
Input contract говорит, что модуль имеет право ожидать
Нельзя проектировать ветку с неявными предположениями. Если модулю нужен IMAGE 1536 px, MASK того же canvas, MODEL определённого семейства и FLOAT denoise, это должно быть известно до подключения.
Input contract включает не только тип socket, но и форму данных: размер, batch, coordinate space, polarity, model family и обязательность параметра.
| Contract field | Пример |
|---|---|
| Type | IMAGE / MASK / LATENT / MODEL |
| Dimensions | 1536 × 1024 |
| Batch | 1 image / N masks |
| Coordinate space | Same as BASE IMAGE |
| Model family | SDXL / FLUX-compatible |
| Required / optional | BASE IMAGE required; reference optional |
Output contract определяет, что downstream может безопасно получить
Output должен быть пригоден для следующего модуля без догадок. Если PEOPLE branch возвращает composited IMAGE того же canvas, downstream FLUX может использовать его как предсказуемый source. Если branch возвращает crop другого размера, это уже другой contract.
Return point — официальный выход ветки обратно в Master Workflow
У сложной ветки должен быть один хорошо читаемый return point. Это место, где локальная задача завершена и результат снова становится частью основного data plane.
Return point полезно маркировать отдельно: он облегчает extraction standalone JSON, debug и замену реализации модуля без перестройки всего downstream.
Один модуль — одна основная задача
| Модуль | Ответственность |
|---|---|
| CONTROLNET | Создать/применить geometry guidance |
| SDXL | Получить base generation / img2img result |
| MASKS | Сформировать области защиты/изменения |
| PPL | Создать или заменить людей и вернуть composite |
| MAIN FLUX | Выполнить controlled final refinement |
| UPSCALE | Увеличить output с сохранением согласованности |
| OUTPUT | Сохранить / показать delivery result |
У каждого модуля должен быть собственный доказуемый результат
Если единственный preview находится в самом конце Master Workflow, невозможно быстро понять, какой module сломался. Поэтому локальный output модуля должен иметь Preview / MaskPreview / comparer или другой диагностический probe.
Master Workflow должен собираться как LEGO из изученных модулей
Практика: оформить contract для одной знакомой ветки
- Выбрать одну ветку текущего workflow.
- Сформулировать её ответственность одной строкой.
- Выписать все external incoming links.
- Для каждого input записать type, size/batch и required/optional.
- Назвать один официальный output/return point.
- Добавить checkpoint непосредственно перед return.
- Проверить, можно ли заменить upstream тестовыми inputs и запустить ветку отдельно.