Standardized Topological Notation for Workflows

This is a notation format I have developed for describing workflows. It is Topology based, shows explicit connection points, is rule based.

COMFYUI WORKFLOW NOTATION STANDARD

PURPOSE

This notation exists to communicate ComfyUI workflows with engineering precision.

Goals:

  • Eliminate ambiguity
  • Allow exact workflow reconstruction
  • Clearly distinguish reused nodes vs new nodes
  • Preserve workflow topology visibility
  • Make debugging easier
  • Prevent hidden assumptions
  • Make workflows readable like electrical schematics

==================================================

RULE 1 — EXACT NODE NAMES

Always use exact ComfyUI node names.

GOOD:

Load Checkpoint
KSampler BASE
Apply Regional IPAdapters
Load ControlNet Model

BAD:

Checkpoint Loader
Sampler
ControlNet Thing

No aliases.
No shorthand.

==================================================

RULE 2 — PRIMARY INPUT PORT

Primary consumed datatype appears beside node.

Format:

Node Name (primary_input)

Examples:

KSampler BASE (latent_image)

VAE Encode (pixels)

Load Image (image)

Apply ControlNet (positive)

==================================================

RULE 3 — INBOUND CONNECTIONS

Secondary inputs appear vertically aligned.

Format:

Node Name (primary)

           (input) ← Source Node (output)
           (input) ← Source Node (output)

Example:

KSampler BASE (latent_image)
(model) ← Apply Regional IPAdapters (model)
(positive) ← Final Apply ControlNet (positive)
(negative) ← Final Apply ControlNet (negative)

Rules:

  • Inputs align vertically
  • Arrow points toward consumer
  • Datatype shown explicitly

==================================================

RULE 4 — OUTBOUND CONNECTIONS

Outputs leave node through outbound block.

Format:

Node Name

outbound
    (datatype)
    ↓

Example:

VAE Decode BASE

outbound
    (image)
    ↓

Fan-out:

VAE Decode BASE

outbound
    (image) → Save Image (images)
    (image) → Upscale Image By (image)
    ↓

Rules:

  • Show all fan-outs
  • Shared outputs shown explicitly
  • Never assume downstream nodes

==================================================

RULE 5 — FLOW DIRECTION

Workflow flow moves top to bottom.

GOOD:

Load Image

VAE Encode

KSampler

VAE Decode

BAD:

Load Image → VAE Encode → KSampler

==================================================

RULE 6 — PARAMETERS

Parameters belong inside node block.

Example:

KSampler BASE

seed: 12345
steps: 25
cfg: 7
sampler_name: dpmpp_2m
scheduler: karras
denoise: 0.35

Rules:

  • Consistent indentation
  • Show important parameters
  • Avoid hidden settings

==================================================

RULE 7 — NODE REUSE

Reused nodes referenced explicitly.

GOOD:

Load Checkpoint

outbound
    (model) → KSampler BASE
    (model) → KSampler REFINE

BAD:

Load Checkpoint BASE

Load Checkpoint REFINE

Reuse existing nodes.

==================================================

RULE 8 — NODE LABELS

Multiple similar nodes require labels.

GOOD:

KSampler BASE

KSampler REFINE

VAE Decode BASE

VAE Decode FINAL

BAD:

KSampler

KSampler

==================================================

RULE 9 — MASK RULES

Mask semantics written explicitly.

Example:

Load Image MASK

mask rule:

WHITE = editable

BLACK = protected

Example:

WHITE = oval interior only

BLACK = bat
BLACK = lettering
BLACK = mud
BLACK = border

Never assume mask meaning.

==================================================

RULE 10 — CONDITIONING PATHS

Positive and negative conditioning shown completely.

Example:

CLIP Text Encode POSITIVE

text:
"muddy rallycross bat"

CLIP Text Encode NEGATIVE

text:
"extra limbs blur"

KSampler

(positive) ← CLIP POSITIVE
(negative) ← CLIP NEGATIVE

No hidden conditioning.

==================================================

RULE 11 — CONTROLNET PATHS

Preprocessors must be shown.

Example:

Load Image

outbound
    (image)
    ↓

Canny Edge Preprocessor

outbound
    (image)
    ↓

Apply Advanced ControlNet

           (control_net)
           (image)
           (positive)
           (negative)

==================================================

RULE 12 — VAE PATHS REQUIRED

Always show latent transitions.

Required structure:

Load Image

VAE Encode

KSampler

VAE Decode

Do not omit VAE nodes.

==================================================

RULE 13 — COMPOSITE OPERATIONS

Composite operations require all inputs shown.

Example:

Image Composite Masked

(source)
(destination)
(mask)

==================================================

RULE 14 — NO HIDDEN ASSUMPTIONS

If reconstruction requires guessing:

Notation incomplete.

Show:

seed
cfg
steps
scheduler
sampler
denoise
mask blur
resize scale
model source
vae source

No assumptions.

==================================================

RULE 15 — VARIABLE LOCKING

Workflow debugging principle:

LOCK EVERYTHING

CHANGE ONLY X

CFG testing:

LOCK:
seed
steps
model
sampler
prompt

CHANGE:
cfg

Logo editing:

LOCK:
bat
text
mud
border

CHANGE:
oval gray

IPAdapter tuning:

LOCK:
weight

CHANGE:
noise

==================================================

RULE 16 — ENGINEERING STANDARD

Workflow notation should read like:

  • electrical schematic
  • wiring diagram
  • engineering drawing

Goal:

Someone unfamiliar with workflow reconstructs it exactly.

If guessing required:

Notation incomplete.


Here is the default ComfyUI workflow shown in this notation format:

===== DEFAULT COMFYUI WORKFLOW =====

# ===== DEFAULT COMFYUI WORKFLOW =====

Load Checkpoint  (#4)   (model)
    checkpoint:
        Juggernaut_X_RunDiffusion.safetensors

    outbound
        (model) → KSampler (#3) (model)
        (clip)  → CLIP Text Encode POSITIVE (#6) (clip)
        (clip)  → CLIP Text Encode NEGATIVE (#7) (clip)
        (vae)   → VAE Decode (#8) (vae)



CLIP Text Encode POSITIVE (#6)      (clip)
                                    (clip) ← Load Checkpoint (#4) (clip)
    text: "beautiful scenery nature glass bottle landscape,
     purple galaxy bottle,"

    outbound
        (conditioning)
        ↓


CLIP Text Encode NEGATIVE (#7)      (clip)
                                    (clip) ← Load Checkpoint (#4) (clip)
    text: "text, watermark"

    outbound
        (conditioning)
        ↓


Empty Latent Image (#5)   (latent)

    width:      512
    height:     512
    batch_size: 1

    outbound
        (latent)
        ↓


KSampler (#3)     (latent_image)
                  (model)        ← Load Checkpoint (#4) (model)
                  (positive)     ← CLIP Text Encode POSITIVE (#6) (conditioning)
                  (negative)     ← CLIP Text Encode NEGATIVE (#7) (conditioning)
                  (latent_image) ← Empty Latent Image (#5) (latent)

    seed:  156680208700286
    control_after_generate: randomize
    steps: 20
    cfg: 8.0
    sampler_name: euler
    scheduler: normal
    denoise: 1.00

    outbound
        (latent)
        ↓

VAE Decode (#8)      (samples)
                     (vae) ← Load Checkpoint (#4) (vae)
    inbound
        (samples) ← KSampler (#3) (latent)

    outbound
        (image)
        ↓

Save Image (#9)        (images)
    filename_prefix: ComfyUI

    inbound
        (images) ← VAE Decode (#8) (image)