arkennemasis Variation Intake (normalise + validate)
Fail here and it costs nothing. Fail at cell 380 and it costs 380 images.
- intake_json
- report
- problems
- ok
- cell_count
The variation pipeline's whole bet is that a spreadsheet becomes a product image library correctly - every delivered image shows the same physical object, differing only in the specified attribute. Variation Intake is where that correctness gets its first and cheapest guarantee. It normalises the client's sheet into the pipeline's canonical VARIANTS / SPECS / PRODUCT tables and runs every pre-generation validation before a single image is generated. The node description says it best: a failure here costs nothing; the same failure at cell 380 costs 380 images.
How it works
Two required inputs:
raw_json- the rows from Sheet Probe.mapping_json- which client column means what. Keys:columns{filename, axis:<name>, ref_url:<axis>, hex:<axis>, status},fill_down[],product,product_display,naming_pattern,plates[]. Use Sheet Probe's suggestion, an LLM's proposal, or a saved per-client mapping.
From those it produces the canonical tables, which is the point: nothing downstream ever sees the client's layout. Optional inputs extend it - specs_path merges a separate SPECS file (one row per axis value with axis, value, hex, ref_url, display, filename_token, description), product_id overrides the canonical product id, and naming_pattern is a filename template like {axis-a.filename_token}-in-{axis-b.filename_token}.png (blank means "take the client's filenames exactly as given," which the tooltip calls the safer default).
Five outputs: intake_json (the normalised schema, feeding every node downstream), report, problems, ok (a BOOLEAN - wire it into a gate if you want the run to stop on failure), and cell_count (the number of images the run will produce, before you spend a cent). write_to optionally writes intake.json to disk so the orchestrator and later runs can re-read it without re-parsing the client's file.
The strict switch is the whole safety story
strict defaults to true: any validation problem blocks the run. That's deliberate - the pipeline would rather fail loudly than guess, because "a guessed material makes a plausible image that is wrong." Flip it off only to inspect a messy sheet, never for a real production run. The same fail-loudly philosophy shows up in the colour handling: a bare colour word with no hex and no reference image is rejected, because a word is a request for an opinion and the model gives a different opinion every time it's asked.
Install
ArkVariationIntake is one of the 61 nodes in the comfyui-arkennemasis pack, in arkennemasis/Variation:
cd ComfyUI/custom_nodes
git clone https://github.com/Hishamahmer/comfyui-arkennemasis
pip install -r comfyui-arkennemasis/requirements.txt # then restart ComfyUI
Or ComfyUI Manager → Install via Git URL with the repo URL. It runs no models itself - generation happens later in the pipeline - so no API key is needed at this stage.
The takeaway for anyone building a large automated image pipeline: validation belongs as early and as cheaply as possible, and this node is a good model for it. Intake is where a client's spreadsheet stops being a client's spreadsheet and becomes your schema - every later node just reads the canonical form and never needs to know which weird export format started it all.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| raw_json | STRING | [] | Rows from Sheet Probe. |
| mapping_json | STRING | {} | Which client column means what. Use Sheet Probe's suggestion, an LLM's proposal, or a saved per-client mapping. Keys: columns{filename, axis:<name>, ref_url:<axis>, hex:<axis>, status}, fill_down[], product, product_display, naming_pattern, plates[]. |
| specs_pathopt | STRING | Optional separate SPECS file (CSV/JSON): one row per axis value with axis, value, hex, ref_url, display, filename_token, description. Merged over anything lifted out of the variant sheet. | |
| product_idopt | STRING | Canonical product id. Overrides the mapping's value. Blank falls back to the mapping, then the sheet. | |
| naming_patternopt | STRING | Filename template, e.g. '{axis-a.filename_token}-in-{axis-b.filename_token}.png'. Blank = take the client's filenames exactly as given, which is the safer default. | |
| strictopt | BOOLEAN | true | On: any validation problem blocks the run. Off: problems are reported and the run continues — for inspecting a messy sheet, never for a real production run. |
| write_toopt | STRING | Optional folder to write intake.json into, so the orchestrator and later runs can read it without re-parsing the client's file. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| intake_json | STRING | — |
| report | STRING | — |
| problems | STRING | — |
| ok | BOOLEAN | — |
| cell_count | INT | — |