Importing is a carve: you choose a boundary inside someone's ComfyUI workflow, and everything follows from where it falls. Links wholly inside survive; links it cuts become the atom's inputs and outputs. This walks one real carve — ltx_i2v out of the full LTX pipeline — a stage at a time.
The eight links cut here are the same ones the composition explainer shows being wired back to ltx_models at generate time. One boundary, two directions.
Every link, classified
Relative to the selection, a link can only be one of three things. That is the whole of the carve.
- Internal54 links
both ends inside the carve
stay as [id, slot] references
- Dangling input8 links
the source is outside
__INPUT_<name>__ + boundary_inputs (type, node, class)
- Dangling output2 links
the destination is outside
exit_slots, deduped by node:slot
Counts are the real ones for ltx_i2v as the library holds it today.
The source
A ComfyUI workflow export — the UI-format JSON, exactly as the host saved it.
When a Save (API Format) export is supplied alongside it, that becomes the authoritative widget source, matched to the UI export by node id. The UI export still drives group membership and link topology, because only it has them.
Why the boundary is the whole decision
Both of the library's real failure modes come from a boundary nobody could see. A carve that cuts a model link without anyone noticing produces an atom that looks healthy and cannot compose — that is what boundary_inputs and the incomplete verdict exist to catch. A carve that drops a dependency on a part you did not select produces an atom that never declares what it needs.
Cutting along a native ComfyUI Subgraph avoids most of this: its declared boundary maps straight onto the atom's ports, with no bounding-box inference.
What else the carve decides
Editor-only nodes are dropped, a forceInput input is a link rather than a widget, and a node that writes text (SaveText) counts as an output. The capabilities an atom requires are inferred from what the carve cut, which is why ltx_i2v declares ltx_models.
The values the source workflow had for each open input are kept as the atom'ssuggested_defaults — and at generate time they beat the global defaults. A seed is deliberately never carried over.
A carve is not the only way an item is born. A session's chain, or an agent-made plan, can be promoted to a workflow (with its plan, since MIL-1016), and http andagent atoms have no graph to carve at all.
Source of truth for this page: packages/atom-converter(convertWorkflowToAtom, classifyWires, resolveRouting). The counts shown are the real ones for ltx_i2v as the library holds it today.