DOGMA AuditText v56.7
The node that stops your VLM auditing nothing
- candidates
- STRING
This is a twenty-line node that saves you a GPU pass per dead category, and if you're reading a DOGMA workflow wondering why there's a mystery node between the SAM search and the VLM, this is it.
What it's doing there
In the v56.7 phase-3 pipeline, every candidate mask gets a separate vision-language verdict: you feed a 2×2 evidence sheet to a VLM (the DOGMA workflows use Qwen3-VL through comfyui_vlm_nodes) and it answers PASS or FAIL. Those answers have to line up one per candidate, in order, because the review node matches them by position.
Two things break without a gate in the middle. First, when a category is inactive - an empty pipeline slot - there are zero candidates, and you really don't want to spin up a 9B vision model to audit an empty list. Second, a caption node fed an empty list can return a single empty string instead of an empty list, and then the review node sees 0 masks but 1 audit answer and stops the run.
AuditText solves both by being a switch with an opinion about what "nothing" means.
How it works
It runs as a list node (INPUT_IS_LIST), so candidates arrives as a one-element list holding the bundle that DOGMASAMSearchV567 produced. Its audit_text input is marked lazy, and the node implements check_lazy_status: it asks ComfyUI to evaluate audit_text only if the candidate bundle actually has items and the text is still missing. No items, no request, and the upstream VLM node never executes at all.
The pass-through is then almost trivial: return the audit answers if there are candidates, and return an empty list if there aren't.
def choose(self, candidates, audit_text=None):
return (audit_text if candidates[0]['items'] else [],)
That lazy trick is the same mechanism ComfyUI exposes for any input you want to defer - it's the engine feature behind half the "skip this expensive branch" nodes in circulation, and it's why an inactive DOGMA slot costs you nothing rather than costing you a Qwen pass.
Inputs and outputs
- candidates -
DOGMA_CANDIDATES, fromDOGMASAMSearchV567. Not a mask list: a bundle carrying the category, the image shape, the cleaned item masks and the accumulative notes. - audit_text - the STRING from your VLM node, one answer per candidate. Lazy, so it only runs when it's needed.
Output is a single STRING list. Wire it into DOGMAInstanceReviewV567's audit_text. That's the whole contract - and if you skip this node and wire the VLM straight to the review node, you're the one who gets to handle the empty case.
One quirk to expect: when there are no candidates, the audit nodes upstream still emit a sentinel sheet and a "return FAIL" instruction so list lengths survive. AuditText doesn't care about that; it just hands the review node an empty list and lets it find zero items and no answers, which is consistent.
Install
Nothing special for this node - it's pure Python inside the pack.
comfy node install comfyui-dogma-nodes
# or
cd ComfyUI/custom_nodes
git clone https://github.com/axior/ComfyUI-DOGMA-Nodes
pip install -r ComfyUI-DOGMA-Nodes/requirements.txt
The README says the pack needs no extra Python dependencies. requirements.txt says scipy>=1.10, and the v56.6/v56.7 modules do from scipy import ndimage. So install through Manager (or run the pip line above); if you copied the folder in by hand and skipped it, you'll get ModuleNotFoundError: No module named 'scipy' before anything renders.
Models are your problem, not the pack's: you need a VLM node for the audit text, the SAM 3 nodes that ship in ComfyUI core for the search, and whatever Klein checkpoint the diffusion side runs.
Gotchas
The error you'll actually hit is downstream, in the review node: DOGMA: 6 masks but 5 audit answers. No guessing by position. That's this node's design working - the author would rather stop than pair verdict #4 with mask #5. Check that your VLM node's output is genuinely a list with one entry per candidate, not one concatenated paragraph.
And if you're debugging an inactive slot that keeps running the VLM anyway, check whether something else is pulling on the audit text - a lazy input is only skipped if nothing else forces the branch.
Where it fits
Effort here is low, payoff is real: it's a small piece of list plumbing whose whole job is keeping a strict review node fed correctly. Skip it and you'll spend an evening on "why did my PASS verdict land on the wrong mask".
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| candidates | DOGMA_CANDIDATES | — | |
| audit_text | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |