The checklist for supporting a new image-generation architecture ("baseline") end to end. The mechanics of authoring the pipeline itself are in adding-a-pipeline.md; this page covers the baseline-specific extras.
The CI tripwire tests/pipeline/test_baseline_coverage.py fails the moment a new
KNOWN_IMAGE_GENERATION_BASELINE enum value appears in horde_model_reference, and stays
red until the baseline is consciously classified — either by completing this checklist or
by adding it to the test's UNSUPPORTED_BASELINES set.
Baseline-conditional logic must use KNOWN_IMAGE_GENERATION_BASELINE enum members — never
raw strings — and is confined to:
hordelib/pipeline/families/image_gen/baselines.py— theBaselineProfiletable (loader kind, force-load policy) and the named baseline groupings (FLUX_BASELINES, ...)hordelib/pipeline/families/image_gen/— per-pipeline selectors and patch stepshordelib/pipeline/context.py— theModelContextdata structure (itsbaselinefield is the typed input every selector reads; no conditional logic lives here)
ModelContext carries no per-baseline boolean properties. Every pipeline selects by
declaring a baseline set on its ImageSelector (baselines=frozenset({...})); a family that
spans several baselines (as flux does) declares a named frozenset grouping in baselines.py
and reuses it.
- Model reference: the baseline exists as a
KNOWN_IMAGE_GENERATION_BASELINEmember and the models are present instable_diffusion.json(horde_model_reference). - Pipeline: follow adding-a-pipeline.md — graph export, a
definition module in
families/image_gen/selecting on the baseline atSelectionTier.BASELINE_FAMILY, and a spot inIMAGE_PIPELINES. - Baseline profile: if the baseline loads split files (bare diffusion model + separate
CLIP/VAE) or its models must not be force-loaded into VRAM on weaker cards, add a
BaselineProfilerow inhordelib/pipeline/families/image_gen/baselines.py(loader=LoaderKind.UNETand/orforce_load_skip_classes=("<comfy model_base class>",)) and mirror any new comfy class names inFORCE_LOAD_SKIP_CLASS_NAMES(hordelib/execution/comfy_patches.py— kept horde_model_reference-free on purpose; the startup tripwire fails if the two disagree). Consumers then pass the enum member toinitialise(models_not_to_force_load=...). - Classify in the tripwire: move the baseline from
UNSUPPORTED_BASELINEStoBASELINE_EXPECTED_TEMPLATEintests/pipeline/test_baseline_coverage.py, mapping it to the new pipeline's name. - GPU oracle: add an inference test (
tests/test_horde_inference_<name>.py) with reference outputs inimages_expected/. - Worker: zero changes required. The worker resolves models via the reference and
passes baseline enums through
hordelib.api; new baselines flow through automatically once the worker's model list includes them.