Nodes/comfyui-nodes/Task Specs (Symbiotica)
ComfyUI Node

Task Specs (Symbiotica)

One wire in, thirteen useful ones out

By symbiotica-ai·Created 6 months ago·Updated about 12 hours ago· 3
Task Specs (Symbiotica)
  • specs
  • asset_name
  • category
  • client_prompt
  • save_path
  • order
  • event_order
  • bucket
  • ref_image
  • ref_mask
  • ref_name
  • category_recipe
  • width
  • height

Task Specs is the second half of a deliberately lopsided pair. Task (Symbiotica) is the browsing node - big tree, thumbnails, the client's prompt under the picture, one output. That wire is a bundle: which asset, which event, which project, which reference you clicked. Task Specs is where it comes apart into the thirteen values a workflow actually wires, with no widgets and nothing to pick - being asked the same question twice was the click this pair was built to remove.

Why it exists

A pipeline rendering for a client has one canonical identity for the thing being rendered, and every node downstream has to agree with it: the prompt to the encoder, the save path to Save Image, the canvas size to the latent, the reference art into an IPAdapter or ControlNet. Four nodes, four chances to disagree, and a disagreement files a good render under the wrong name. That's the plumbing-layer rule - one authoritative source, many consumers - applied to a record instead of a number.

The reason for the split rather than one tall node: a browsing node thirteen sockets high is a browsing node you park off-screen.

How it works

One input, specs, typed SYMBIOTICA_ORDER - a Task's output, or an Asset Focus's order output. Feed it a whole event and you get the event's first asset, which is a convenience, not something to build on. Feed it anything that isn't an order and it refuses by name.

The outputs are built by the same code that builds Asset Focus's own columns, so the two can't drift. Each is a list of one - a single-element list behaves like a scalar downstream, so the graph still runs once per queue.

The outputs worth wiring

client_prompt is what the client wrote, for a human and a game rather than a diffusion model. Straight into CLIP Text Encode it works and produces mush the moment the sheet reads like a packing list. This is the joint where people drop an LLM step in; the pack's own Claude and Gemini nodes are for exactly that job, and an LLM rewriting a prompt inside the graph is a mainstream move, not a hack.

save_path is month/feature/category/asset, every segment slugged - lowercase, apostrophes dropped, everything else flattened to a dash - e.g. october/mini-2-purrfection-sweets/decoration/black-cat-fortune-booth. Save Image's filename_prefix takes it as-is, and so does the Order Tracker. The feature segment is the event label: the order code plus the client's own name for the event, so the folder won't always match what you typed.

width and height are the asset's canvas in pixels, 0 when the sheet names none. Wire them into an empty latent to render at the game's own size - but a row with no canvas gives you a 0×0 latent, so check before you trust.

ref_image, ref_mask, ref_name are the client's reference art and its alpha. The image is composited onto the sheet's grey rather than converted, because these files keep live pixels under their transparent regions - dropping the alpha lights up every soft edge. An asset the client sent no art for gets a one-pixel plate and an empty ref_name rather than an error, and that's the tell: test ref_name, not whether ref_image is empty.

order and event_order are the two flavours of the same record: order narrowed to the focused asset, event_order the whole event, deliberately stable so an Order Tracker's board doesn't redraw every time you focus something else. The second one is what you wire into the tracker.

bucket narrows the category rather than replacing it - Drinks for a Food row whose Prep line is an empty cup on a saucer, empty for everything else. It names <category> - <bucket> where the prompt book holds one, and a bucket with no entry of its own just renders the category's ordinary way. category_recipe is the category plus its canvas in tiles: the tooltip prints Appliance 1x2, what lands on the wire is the slug appliance-1x2, and that's the name a recipe is filed under. asset_name and category come out flat-slugged too, the shape the save paths use.

Installing it

Same pack, same two steps. Manager → search Symbiotica, or:

cd ComfyUI/custom_nodes
git clone https://github.com/symbiotica-ai/comfyui-nodes.git symbiotica
pip install -r symbiotica/requirements.txt

Restart afterwards. Dependencies are requests and pillow, there are no model files, and no API key is involved - this node is a fan-out over a dict. Use a current ComfyUI; the pack is authored against the newer node API.

Troubleshooting

If it throws, you wired the wrong thing into specs - it wants a Task's specs output, or an order. The rest is shape trivia: the lists of one mean you never index anything, and empty strings and zeros are how the node says the sheet didn't tell it, without taking down a render that didn't need that value.

CategorySymbiotica

Inputs (1)

NameTypeDefaultDescription
specsSYMBIOTICA_ORDERA Task's `specs` output — or any order. Fed a whole event rather than one asset, the first of it is what comes out.

Outputs (13)

NameTypeDescription
asset_nameSTRING—
categorySTRING—
client_promptSTRING—
save_pathSTRINGmonth/feature/category/asset — where this asset's renders are filed. A Save Image's filename_prefix takes it as is, and so does the Order Tracker.
orderSYMBIOTICA_ORDERThe incoming order narrowed to each focused asset — same event, same project, a one-asset assets list. One of these per focused asset, so downstream still runs once per asset.
event_orderSYMBIOTICA_ORDERThe WHOLE event, unnarrowed. The Order Tracker wants the event rather than the asset, and it must not change every time you focus a different one.
bucketSTRINGWhich sub-kind of its category this asset is — `Drinks` for a Food row whose Prep line is an empty cup, empty for everything else. It names `<category> - <bucket>` where the prompt book holds one.
ref_imageIMAGEThe client reference you clicked, one per focused asset, composited onto the sheet grey. An asset the client sent no art for gets a one-pixel plate and an empty `ref_name`.
ref_maskMASKThat reference's alpha, opaque where the art is.
ref_nameSTRINGIts filename — which reference was drawn. Empty when the asset has no references at all.
category_recipeSTRINGThe category plus its canvas in tiles: `Appliance 1x2`. What a recipe is named after.
widthINTThe asset's canvas width in pixels, 0 when the sheet names none.
heightINTThe asset's canvas height in pixels, 0 when the sheet names none.