Jakkanna SCAIL-2 Save Manifest
Reproducibility you can actually point at
- output_images
- pose_video_mask
- reference_image_mask
- sigmas
- source_images
- reference_image
- manifest_path
JakkannaSCAIL2ProductionManifest is the receipt for an entire SCAIL-2 run, and it's the node that separates "it worked yesterday" from "here's exactly what made it work." It gathers every report from the run - input, reference, initial mask, reference mask, track, noise - plus your prompts, seed, the exact model files, sampler settings, and the attention backend actually in use, and writes the whole thing to one JSON manifest file.
Why this exists: SCAIL-2 has a genuine artifact problem, and the community's answer to identity drift is mostly "change the LoRAs, raise steps, raise CFG, and accept the rest" (see the KB's SCAIL-2 panel). With an 81-frame run costing minutes per clip, "what settings did that good run use?" is not a question you want to answer from memory. The manifest pins the answer in a file you can diff, archive, or ship alongside the output video.
The mechanism is where it gets interesting, because it doesn't trust you. The node re-reads your actual prompt graph and reconciles what you declared against what the graph really does - the sampler, scheduler, steps, CFG, mode, DPO LoRA strength, and CLIP-Vision crop all get resolved from the executed graph, not from whatever widgets you think you set. It validates that the seed matches the noise report's seed. It cross-checks raw source and reference tensor hashes if you connected them. And it refuses to write if any listed model artifact isn't actually loaded in the graph - a hard error beats a manifest that claims a LoRA you removed.
Inputs that matter:
- The model pickers -
diffusion_model,dpo_lora,sam_checkpoint,text_encoder,clip_vision,vae- plusattention_backend(PyTorch SDPA, FlashAttention, SageAttention, xFormers, or split/sub-quadratic) hash_model_files(default true) - hashes every model file into the manifest; the hashes are cached, so the cost is one-time per filemode-replacement(default) oranimationfilename_prefix- defaultscail2_production/manifests/SCAIL2_replacement_production- Optional sampler details:
steps(40),cfg(5),flow_shift(3),sampler_name/scheduler_name(Flow-UniPC and "upstream Flow-UniPC"),acceleration_lora, andsigmas- wire the actual sampled sigma schedule in and it's recorded verbatim
Output: manifest_path, the STRING path to the JSON you just wrote.
The tooltip on effective_flow_shift is the node's personality in one sentence: the shift actually realized in the sigma schedule, where 0 means "same as flow_shift" - and if you wire sigmas in, the run fails unless the schedule is the Euler/simple flow schedule at that shift. It would rather error than bless a manifest that doesn't match reality.
Install: part of the Jakkanna pack - Manager, search "Jakkanna", or:
cd ComfyUI/custom_nodes
git clone https://github.com/teenu/ComfyUI-VNCCS-Utils-Maintained
cd ComfyUI-VNCCS-Utils-Maintained
pip install -r requirements.txt
Restart. Don't run it in the same instance as upstream vnccs-utils. The pack doesn't fetch SCAIL-2 or SAM 3.1 weights; the loaders name files that should already be in your models folders.
The trap: this is an output node, so it always runs, and it will throw if the noise seed doesn't match or a loader changed after you wired it. Beginners read those as crashes. They're the feature - the manifest is only worth writing if it's true. Swap a model, update the manifest inputs, run again.
Inputs (34)
| Name | Type | Default | Description |
|---|---|---|---|
| output_images | IMAGE | — | |
| pose_video_mask | IMAGE | — | |
| reference_image_mask | IMAGE | — | |
| input_report | STRING | — | |
| reference_report | STRING | — | |
| source_initial_mask_report | STRING | — | |
| reference_mask_report | STRING | — | |
| track_report | STRING | — | |
| noise_report | STRING | — | |
| positive_prompt | STRING | — | |
| negative_prompt | STRING | — | |
| seed | INT | — | |
| diffusion_model | COMBO | 0 options: | |
| dpo_lora | COMBO | 0 options: | |
| sam_checkpoint | COMBO | 0 options: | |
| text_encoder | COMBO | 0 options: | |
| clip_vision | COMBO | 0 options: | |
| vae | COMBO | 0 options: | |
| attention_backend | COMBO | 5 options: PyTorch SDPA, FlashAttention, SageAttention, xFormers, ComfyUI split/sub-quadratic | |
| hash_model_files | BOOLEAN | true | — |
| filename_prefix | STRING | scail2_production/manifests/SCAIL2_replacement_production | — |
| acceleration_loraopt | COMBO | 1 options: None | |
| acceleration_lora_strengthopt | FLOAT | 0.000–10 | — |
| sampler_nameopt | STRING | Flow-UniPC | — |
| scheduler_nameopt | STRING | upstream Flow-UniPC | — |
| stepsopt | INT | 401–100 | — |
| flow_shiftopt | FLOAT | 3.000–100 | — |
| cfgopt | FLOAT | 5.000–100 | — |
| effective_flow_shiftopt | FLOAT | 0.000–100 | Shift actually realized in the sigma schedule; 0 = same as flow_shift. When sigmas is connected, the run fails unless the wired schedule is the Euler/simple flow schedule at this shift. |
| modeopt | COMBO | replacement | 2 options: replacement, animation |
| sigmasopt | SIGMAS | Wire the sampled sigma schedule to record it verbatim and validate effective_flow_shift against it. | |
| source_imagesopt | IMAGE | Raw source tensor batch used by SAM and SCAIL. Connect for authoritative capture provenance. | |
| reference_imageopt | IMAGE | Raw reference tensor used by SCAIL. Connect for authoritative reference provenance. | |
| preprocess_reportopt | STRING | Optional prepared image/FBX input manifest. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| manifest_path | STRING | — |