H3 Continuity • Publish Export
Your H3 continuation isn't ready until the file proves it
- ticket
- status
Most nodes in a ComfyUI graph either move pixels or hold a value. H3 Continuity • Publish Export is plumbing with opinions: a terminal node whose entire job is deciding whether the clip you just extended is fit to be the parent of the next one.
That matters more than it sounds. Chain H3 continuations and each new segment is generated against the tail of the previous one, so one bad link poisons everything downstream. If a checkpoint were marked usable the moment it decoded, you could weld sixteen seconds onto a latent whose export failed, or whose file came out at the wrong frame rate because someone enabled interpolation - a plausible-looking session that quietly falls apart at second nine.
How it works
Append & Stage leaves every new clip staged and hands you a ticket. Publish Export takes that ticket plus the filename the video exporter actually wrote, and does two checks before it promotes anything.
First, existence and location: the path has to sit inside ComfyUI's output or temp directory, exist, and be non-empty. If the exporter failed, wrote a zero-byte file, or wrote to a network share on another drive, it bails with "The video exporter did not produce a valid output file; continuity was not advanced."
Second, duration: it opens the file with PyAV, reads the video stream's duration, and compares it to the frame count recorded in the staged checkpoint. The tolerance is tight - about 0.125 s, or two frames at the stream's rate. Miss it, and you get "Export duration differs from the saved H3 timeline. Check FPS, interpolation and trimming; checkpoint remains staged." Duration-preserving interpolation passes fine; duration-changing anything does not.
Only when both pass does it flip clip.json to ready, record the output path and completion timestamp, update the session's latest.json, and fire a websocket event so the Director's session list refreshes. The returned string is the receipt: Saved 243 frames (10.125s), clip 3f9a2c11.
Inputs and outputs
Two inputs, both required, no widgets worth arguing about:
filename(STRING) - comes from your video exporter's filename output. It's a socket, not a text field (forceInput), so you must wire it; typing a path is not possible. Feed it the exporter that produced this take, not a Set/Get holder and not an earlier export.ticket(DF_H3_CONTINUITY_TICKET) - straight from Append & Stage'sticketoutput. This is a pack-private type; nothing else mints it.
One output, status (STRING), carrying that same receipt text. The node is an output node, so ComfyUI will run it as a terminal whether or not you wire status anywhere - and the message is printed inside the node's UI either way, which is how you read it in practice.
Append & Stage ──ticket──► Publish Export ──status (STRING, optional to wire)
Enhanced Video Combine ──filename──┘
Install
Same pack, same install: ComfyUI Manager → DaSiWa-Nodes, or:
cd ComfyUI/custom_nodes
git clone https://github.com/darksidewalker/ComfyUI-DaSiWa-Nodes
pip install -r requirements.txt
# restart ComfyUI
This node is the one that genuinely needs PyAV (av>=18.0, in the pack's requirements), and only to read a container's duration - no ffprobe binary required. The rest of that requirements file (nvidia-vfx, llama-cpp-python) belongs to other nodes in the collection, but the pack imports everything at startup, so install the file rather than picking pieces. And if you're in the US, EU, UK or South Korea, note that H3's weights aren't licensed for you to run - that's a MiniMax licence term, not something this pack can fix.
When it refuses
The two errors above are 90% of what you'll ever see here, and both are the node working correctly.
The duration failure usually means you exported a ping-pong or time-trimmed version of the take. A ping-pong export is roughly twice the timeline length, so it can never validate. Keep a clean, untrimmed export on the continuity branch and do your loop or trim on a separate branch that doesn't touch Publish. The other repeat offender is changing the exporter's frame rate; leave it at the native 24 fps.
The "did not produce a valid output file" one is almost always the path. Exports aimed at an external drive, an SMB share, or a scratch folder outside ComfyUI's output/temp will fail the location check even though the file exists and plays fine. Point the exporter at the output directory and it passes.
Two behaviours that look like bugs but aren't. If the ticket says continuity was disabled, you get the string Continuity capture is off. and nothing is published - that's the Director telling you no continuation is active, not a failure. And when Publish refuses a clip, the previous source stays pinned, so your chain is intact: rerun the export, queue again, and the same staged checkpoint gets validated. A refused clip is simply never offered as a source, which is the entire point of having a bouncer.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| filename | STRING | — | |
| ticket | DF_H3_CONTINUITY_TICKET | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| status | STRING | — |