Nodes/MiniMax H3 Draft Continue/H3 Structured Layout Audit
ComfyUI Node

H3 Structured Layout Audit

Prove the boxes you approved are the boxes you're sampling

By ukr8b3g-cmyk·Created 27 days ago·Updated about 3 hours ago· 2
H3 Structured Layout Audit
  • positive
  • layout
  • positive
◄compiled_prompt—►

You set START and END boxes on the canvas, wrote A/B slot descriptions, hit Preview, liked what you saw, nudged the END box two units left, then hit GO. The clip you get is not the clip you approved - badly enough that you spent ten minutes blaming the sampler. H3 Structured Layout Audit exists so that can't happen quietly.

It's the optional third piece of the Draft/Continue pack, and it's the one people skip. Fair enough: it doesn't touch a single pixel. What it does is bind the layout you reviewed to the conditioning the sampler actually consumes, so the GO gate can refuse a run whose geometry or prompt changed since Preview.

Where it sits in the graph

The layout comes from the sibling H3-Structured-Canvas repo - the BBOX editor, timeline and structured prompter live there, not in this pack. That repo's structured prompter compiles your boxes and descriptions into the exact prompt string H3 sees. The audit node sits in the middle of that pipe:

Canvas.layout ────────────────→ Structured Prompter.layout
     │                                  │ exact prompt STRING
     │                                  ├────→ native H3 conditioner.prompt
     │                                  └────→ Layout Audit.compiled_prompt
     └──────────────────────────────────────→ Layout Audit.layout

native conditioner.positive ───────────────→ Layout Audit.positive
Layout Audit.positive → Guider → Draft → State → Continue

Inputs and outputs

Three inputs, one output, and two of them will teach you something:

  • positive - the CONDITIONING coming out of your native H3 conditioner. The audit doesn't build conditioning; it annotates yours.
  • layout - the H3_LAYOUT socket from the Canvas stack. Without that upstream pack installed you have nothing to plug in here, which is the practical reason most people never add this node.
  • compiled_prompt - the same exact string the text encoder is getting. Note that it's an input-only socket, so you can't type a prompt in here; you must wire it, and it must be the same wire the conditioner sees.
  • positive (output) - your conditioning back, now carrying a bounded JSON metadata blob describing the layout and prompt. Send it to the guider exactly where the raw conditioning used to go.

The node has no report output and isn't an output node, so it only runs when it's on the live path - which is correct, because its whole job is to be in the path.

What it will and won't do

The supported contracts: 1–3 START boxes in Canvas slots A/B/C, in normalized 0–1000 xyxy coordinates with no implicit conversion and no clamping; a START → END transition between the same slot set; and Multi-Key timelines with up to seven intermediate keys. Canvas width and height must match the AV latent - no implicit resize, it errors instead.

What it won't do is enforce anything. No text rewriting, no encoding, no BBOX interpolation, no latent modification, no second layout representation handed to the model. The author is blunt about this: it's an integrity check, not stronger BBOX enforcement, and it doesn't prove your conditioning was even encoded from the text you supplied. Boxes are guidance either way.

How the check actually fires

At Preview, the draft node reads the metadata back out of the guider's conditioning and records its scope (start, start_end or multi_key) plus hashes for the layout, the prompt, the start/end geometry, moved slots and key times. That fingerprint goes into the reviewed state. If anything moves afterwards - a box, a key time, the key count, the duration, the compiled string - the fingerprint no longer matches and GO is refused with a demand for a fresh Preview.

That's the whole value proposition: a stale approval can't sneak through. It fails closed on anything it doesn't recognise, including explicit MID data and unknown timeline versions, rather than discarding metadata it can't verify.

Install

Optional node, same install as the rest of the pack:

cd ComfyUI/custom_nodes
git clone https://github.com/ukr8b3g-cmyk/MiniMax-H3-T2VA-Draft-Continue
git clone https://github.com/ukr8b3g-cmyk/H3-Structured-Canvas
# restart ComfyUI

No pip dependencies, no model downloads, and this pack doesn't import or modify the Canvas repo - it only consumes the layout socket the Canvas emits.

Traps worth knowing

Wire the prompt, don't retype it. Because compiled_prompt is a forced input, the failure mode isn't a typo you'd catch - it's two identical-looking strings from two different sources, which is a hash mismatch and a confusing rejection. Fan the prompter's single string output to both destinations.

Adding the node invalidates drafts you already made. Any layout metadata change after Preview - including attaching the audit node for the first time - means a new Preview. Not a problem, just don't do it mid-review.

It only knows what it's told. If you leave the audit out, Draft/Continue still works fine; you just lose the layout half of the stale check. The prompt and reference fingerprints still apply.

CategoryMiniMax H3/Draft Continue

Inputs (3)

NameTypeDefaultDescription
positiveCONDITIONING—
layoutH3_LAYOUT—
compiled_promptSTRING—

Outputs (1)

NameTypeDescription
positiveCONDITIONING—