Nodes/Continuity Director/CD · Continuity Report
ComfyUI Node

CD · Continuity Report

Diff two production states and get a list of exactly what changed

By xinjian0101·Created 3 months ago·Updated 2 months ago· 0
CD · Continuity Report
    • passed
    • report_json
    • issue_count
    expected_json{}
    actual_json{}
    ignore_paths$.timestamp,$.hash

    "Did anything change between the version I approved and the version that actually got generated?" If you've ever answered that with a shrug, you know the pain this node exists for. CDContinuityReport takes two JSON states - the expected one and the actual one - and diffs them field by field, returning a pass/fail and a list of every path that differs. It's the continuity check that turns "it looks fine" into "here are the three fields that drifted."

    It's from Continuity Director, a 20-node pack for repeatable AI video production, and it's the third quality node - the one that catches drift after the fact, when QualityGate and TakeRanker were supposed to catch it up front.

    What you feed it

    • expected_json - the state you wanted. The natural input is one of the pack's own JSON outputs: a lock, a manifest, a shot chain.
    • actual_json - the state you got. Feed it the output of whatever actually ran.
    • ignore_paths - the escape hatch. The default is $.timestamp,$.hash, and that default earns its keep: timestamps and hashes should differ between a plan and its execution, so ignoring them keeps the report honest. The syntax is JSONPath-style ($.path), and appending .* ignores a whole subtree.

    How it works

    The node flattens both JSON documents into leaf paths ($.character.wardrobe, $.shots[0].seed, ...) and compares them. Every path that's only in one side or has a different value becomes an issue with a type: changed, missing, or unexpected. Outputs are passed (a boolean - true only when there are zero issues), report_json (the full issue list with expected vs actual values for each path), and issue_count (an integer).

    The three-way typing is the part that makes it useful rather than annoying: "missing" and "unexpected" tell you about structure, not just value changes. A generated shot chain that dropped a take shows up as a missing path, not a silent shift.

    Installing it

    Continuity Director has no heavy lifting to do at install: no models, no keys, zero Python dependencies (requirements.txt literally just declares that). Search "Continuity Director" in ComfyUI Manager and restart, or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/xinjian0101/continuity-director.git ComfyUI-ContinuityDirector
    

    Restart ComfyUI, find nodes under CD · ..., and use the Continuity Director sidebar's "Add starter chain" to scaffold the full pipeline. Update with git pull.

    Where people get burned

    The ignore list is the whole game, and the default is a good starting point but not universal. If you're diffing two manifests where one legitimately has a different created_at nested under a different path, the default ignores won't cover it and you'll get a confusing "changed" on a field you don't care about. Keep the ignore paths honest: add whatever varies by design in your setup, and strip them out when you actually want strict comparison. Also - and this is the one people learn the hard way - this node compares text structure exactly, including key order after normalization. It's a diff tool, not a semantic judge: it will tell you that two JSON states differ, and it's your job to decide whether the difference matters.

    CategoryContinuity Director/03 Quality

    Inputs (3)

    NameTypeDefaultDescription
    expected_jsonSTRING{}
    actual_jsonSTRING{}
    ignore_pathsSTRING$.timestamp,$.hash

    Outputs (3)

    NameTypeDescription
    passedBOOLEAN
    report_jsonSTRING
    issue_countINT