File size: 52,621 Bytes
e488ce7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
# MiniMax H3 Loop Plan Formatting Guide

This guide belongs to `ComfyUI-MiniMaxH3-Contex-Loop` and describes the JSON
accepted by both `MiniMax H3 Context Loop Plan` (`MiniMaxH3ChainPlan`) and
`MiniMax H3 Plan (Modern)` (`MiniMaxH3ChainPlanModern`), including
scene lengths, prompts, seeds, steps, audio timing, and resume-safe settings.

## Visual editor or raw JSON

`H3 Chain Plan` includes a scene-card editor. Write shared continuity text and
scene prompts as normal multiline text; the editor stores them as readable
JSON line arrays automatically. Drag scenes to reorder them, duplicate or
delete cards, and choose inherited duration, seconds, or exact H3 frames. The
timing label on every card shows raw and delivered frames, while the header
shows total delivered runtime. Scene cards receive distinct colors
automatically; use the small header swatch to customize one, or double-click
the swatch to restore its automatic color. Colors are UI-only and do not alter
the plan or checkpoint compatibility.

The compact **Output** button with its outline folder-open icon in the Plan
header creates and opens the current `output/h3_chains/<run_name>` directory on
the ComfyUI host. When the host is headless or its systemd service cannot
access a desktop session, the button copies the absolute host path instead.

The optional **MiniMax H3 Scene Prompt Editor** companion connects to the Plan
and provides a larger, adjustable-font view of one scene prompt at a time. Its
textarea is bidirectionally synchronized with the active
`plan_json.shots[n].prompt`; only the active scene and font-size preferences are
stored on the companion itself. Arrow buttons and `Alt+Left/Right` navigate
scenes, while `@` opens reference tags and `#` inserts dialogue markup.

Its optional **Prompt Assistant** connects to a running `comfyui-mcp
--panel-orchestrator` and can ask Codex or Hermes to discuss, rewrite, shorten,
critique, or improve continuity for the active scene. Shared and adjacent scene
context are controlled by checkboxes; selected text is included automatically.
The agent's proposed replacement is staged below the chat and remains editable.
Only **Apply to scene** changes `shots[n].prompt`. A source-revision fence warns
and asks for confirmation when manual edits landed after the request began.

Inside a prompt, type `@` or click **@ Reference** to insert one of the
references actually connected and active for that scene. Core conditioning
inserts native `<Picture N>`, `<Video N>`, or `<Audio N>` labels; Scheduled
Ref2VA offers optional stable `@aliases` which compile to those labels. Select
dialogue text and type
`#`, or click **# Dialogue**, to wrap it in `<d>...</d>`. These interactions
are authoring shortcuts only; they produce ordinary MiniMax prompt text.
When the editor can trace the Plan downstream to Scheduled Ref2VA, core
Ref2VA, or core Image-to-Video, the tray shows the references actually wired
for that scene. Hover to preview loaded media. Core FL2VA exposes its connected
first and last frames as `<Picture 1>` and `<Picture 2>`; L2VA with only a last
frame correctly exposes that frame as `<Picture 1>`. When a core I2V first
frame passes through **MiniMax H3 First-Scene Image Gate**, Picture 1 is active
only in scene 1 and is omitted from the menu on continuation scenes.

The experimental **Rich Scene Prompt Editor** adds color-coded tokens, larger
media previews, prompt guides, revision history, and one-click **Optimize**.
Its optimizer connection is global rather than stored on the node or in the
workflow. Open **ComfyUI Settings β†’ MiniMax H3 Context Loop β†’ Prompt
optimizer** and choose:

- **Direct API** (default) for an OpenAI-compatible Chat Completions endpoint,
  the OpenAI Responses format, or Gemini Native. Enter the server URL and model;
  an API key is optional for local OpenAI-compatible servers and required for
  Gemini Native.
- **MCP agent** to use a provider advertised by the compatible separately
  installed `comfyui-mcp` prompt bridge.
- **Disabled** to turn off optimizer execution while keeping manual Studio
  editing available.

Reference-media reading is a separate opt-in setting and is off by default.
When enabled, only reference files resolvable inside ComfyUI's input, output,
or temp roots are considered. OpenAI-compatible and Responses requests attach
images; Gemini Native can also receive video and audio. Provider credentials
are saved in ComfyUI user settings and are never serialized into workflow JSON.

Use the editor's **JSON** button when you need to inspect, paste, import, or
export the underlying plan. The JSON format below remains the runtime contract
and existing plans are backward compatible.

The Plan also exposes an optional forced STRING socket named
`plan_json_input`. Connect an LLM node, local story director, reusable STRING,
or any other provider-independent JSON source. A non-empty upstream string is
the execution source and receives the same normalization and validation as the
internal JSON; an empty string or disconnected socket uses the visual editor's
stored `plan_json`. While connected, the visual editor clearly labels its cards
as the editable fallback. This socket replaces only the scene-plan JSONβ€”Plan
settings such as `run_name`, dimensions, context, and audio mode remain their
own inputs.

## Copy/paste workflow note

The following block is intentionally compact enough to paste into a ComfyUI
Note node:

```text
H3 LOOP PLAN β€” QUICK FORMAT

Use the built-in H3 Chain Plan scene editor, or open its JSON panel and paste
valid JSON. Use double quotes, no comments, and no trailing commas.

{
  "prompt_prefix": "Global subject, wardrobe, style and continuity rules.",
  "defaults": {
    "duration_seconds": 15,
    "steps": 20
  },
  "shots": [
    {
      "id": "intro",
      "prompt": [
        "Use <Picture 1> for the subject's identity and physical features.",
        "Her wardrobe remains unchanged throughout the sequence.",
        "",
        "Begin with an opening tracking shot backstage.",
        "End while she is opening the corridor door."
      ],
      "seed": 123
    },
    {
      "id": "street",
      "prompt": [
        "Continue through the already-opening door without resetting her stride.",
        "Keep the incoming camera direction, lighting and subject pose.",
        "",
        "Move from the corridor into the street.",
        "End with the camera beginning a left orbit."
      ],
      "duration_seconds": 10,
      "steps": 24,
      "seed": 456
    },
    {
      "id": "outro",
      "prompt": [
        "Continue the unfinished left orbit from the previous scene.",
        "Resolve the performance and finish on a calm wide composition."
      ],
      "length": 124
    }
  ]
}

SCENE OVERRIDES
- prompt can be one string OR an array of readable lines. The node joins array
  entries with real line breaks. Use an empty string entry for a blank line.
- duration_seconds: requested generated duration; rounded UP to H3's 17k+5 grid.
- length or frames: exact raw frame count; must be 5, 22, 39, 56...3592.
- steps: sampler steps for this scene, 1–10000.
- seed: fixed uint64 seed. Omit it for a deterministic seed from base_seed.
- id: unique scene name used by checkpoints. Changing it can change an auto seed.
- prompt: scene-specific text. It may be blank or omitted when prompt_prefix
  (or global_prompt) is non-empty; otherwise a prompt is required.

LENGTH AT 24 FPS, context=22, anchor=head
- 5 seconds  -> raw 124 frames; clip 1 delivers 124, later clips deliver 102.
- 10 seconds -> raw 243 frames; clip 1 delivers 243, later clips deliver 221.
- 15 seconds -> raw 362 frames; clip 1 delivers 362, later clips deliver 340.
Later clips lose the 22 repeated context frames after Trim. Use length for
frame-exact control. Every non-final shot must deliver at least the effective
incoming context requested by the following scene.

PRECEDENCE
shot value > JSON defaults > H3 Chain Plan node defaults.

RECOMMENDED PLAN SETTINGS
- width/height: multiples of 32; 960x544 is a good starting point.
- Transition Policy: Guide (22 frames); Latent Guide keeps Guide behavior but
  directly reuses a generated predecessor's saved latent. Use experimental
  Detail AV, Drift-Control AV, Hard AV, or Soft AV (39 frames) only for
  same-shot target-latent continuation. Drift-Control AV additionally routes
  MODEL through Chain Context and is initially validated at 20 steps.
- encode_mode: video
- anchor_mode: head
- crop: disabled
- Audio Policy for an exact music track: Source / source reference on /
  generated continuity off.
- Legacy fallback: context_length 22, continuation_mode guide, audio_mode
  source_track.
- segment_crf: 18–20

RUN / RESUME
- New run: unique run_name and Loop Start start_clip=1.
- Resume at scene N: keep the same settings and run_name; set start_clip=N.
- Optional bounded run: set scene_range to `N` or inclusive `N:M`. A
  non-empty range overrides start_clip and must remain contiguous.
- The Review Gate can discover saved checkpoints and set start_clip for you:
  Refresh, select Resume scene N, then press Load checkpoint.
- Approve & stop can join all accepted scenes into a partial MP4. Checkpointed
  audio is the default; wire the full song to source_audio to use source audio.
- Optional model unloading releases VRAM while the gate waits. Continuing must
  reload models; stopping ends the execution without a reload.
- Changing a completed scene's prompt, seed, length, model settings, references,
  or source audio invalidates its checkpoint history.
- Change generation_fingerprint whenever model, VAE, LoRA, references, CFG,
  scheduler, or another generation dependency changes.

SOURCE-TIMELINE WIRING
Register video/audio once with Source Timeline. Connect the descriptor to
Preflight (or Plan Studio) and Loop Start. Current Shot obtains scene slices
from state and Assemble recovers the descriptor from the manifest. The source
song must cover the complete delivered video duration.
```

## Complete JSON shape

`plan_json` accepts either a plan object or a bare list of shots:

```text
Plan = {
  "prompt_prefix"?: string | string[],
  "global_prompt"?: string | string[], // alias of prompt_prefix
  "defaults"?: {
    "duration_seconds"?: number,
    "steps"?: integer
  },
  "shots": Shot[]
}

Shot = string | {
  "id"?: string,
  "prompt"?: string | string[],
  "duration_seconds"?: number,
  "length"?: integer,
  "frames"?: integer,             // alias of length
  "steps"?: integer,
  "seed"?: integer | digit string,
  "lora_route"?: "base" | "a" | "b" | "c" | "d",
  "context_length"?: 0 | 1 | 5 | 22 | 39 | ... | 243,
  "audio_context_length"?: integer, // 0..240
  "continuation_mode"?: "guide" | "tone_carry_guide" | "latent_guide" | "tapered_guide" | "masked_av" | "tapered_av" | "feathered_av" | "audio_feathered_av" | "drift_control_av"
}
```

The notation above explains the structure; it is not JSON because it contains
comments and `?` markers. Actual `plan_json` must be strict JSON:

- use double quotes around keys and strings;
- do not include comments;
- do not leave a trailing comma;
- encode line breaks inside prompts as `\n`;
- include between 1 and 128 shots.

## Top-level plan fields

| Field | Required | Meaning |
|---|---:|---|
| `shots` | Yes | Ordered list of scenes. Each entry can be an object or a prompt string. |
| `prompt_prefix` | No | String or array of lines prepended to every scene prompt, separated by one blank line. Use it for identity, wardrobe, style, camera, and continuity rules shared by all scenes. |
| `global_prompt` | No | Alias for `prompt_prefix`. `prompt_prefix` wins when both are present. |
| `defaults.duration_seconds` | No | JSON-level default scene duration. Overrides the node's `default_duration_seconds`. |
| `defaults.steps` | No | JSON-level default sampler steps. Overrides the node's `default_steps`. |

For convenient pasting, top-level `duration_seconds` and `steps` are also
accepted as aliases and moved into `defaults` when **Apply JSON** is clicked.
The canonical JSON shown afterward always uses the `defaults` object.

Precedence is always:

```text
per-shot value > JSON defaults > H3 Chain Plan node value
```

## Per-scene fields

| Field | Required | Rules and behavior |
|---|---:|---|
| `prompt` | Conditional | Scene-specific string or array of strings. It may be blank or omitted when `prompt_prefix`/`global_prompt` is non-empty. Array entries are joined with real newlines; use `""` for a blank line. The shared prefix is prepended automatically. |
| `id` | No | Unique checkpoint identifier. Defaults to `clip_0001`, `clip_0002`, etc. Unsupported filename characters become `_`; the result is limited to 96 characters. |
| `duration_seconds` | No | Positive requested raw generation duration. It is rounded up to a valid H3 frame count. Ignored when `length` or `frames` is present. |
| `length` | No | Exact raw frame count. Must be between 5 and 3592 and satisfy `length % 17 == 5`. |
| `frames` | No | Alias for `length`. `length` wins when both are present. |
| `steps` | No | Sampler steps for this scene, from 1 to 10000. |
| `seed` | No | Fixed unsigned 64-bit seed, from 0 to 18446744073709551615. A decimal digit string is also accepted and lets browsers preserve values above JavaScript's exact integer range. When omitted, the seed is derived deterministically from `base_seed`, scene index, and scene `id`. |

A shot can also be only a prompt string:

```json
{
  "shots": [
    "Opening scene.",
    "Continue through the doorway.",
    "Finish on a wide sunrise shot."
  ]
}
```

String shots use automatic IDs, the default duration and steps, and derived
seeds.

## Setting scene length

MiniMax H3 runs at 24 fps and accepts only raw lengths on this grid:

```text
5, 22, 39, 56, 73, ... 3592 frames
```

Equivalently:

```text
length % 17 == 5
```

### Use seconds for convenience

```json
{
  "id": "closeup",
  "prompt": "Continue into a close tracking shot.",
  "duration_seconds": 5
}
```

The node converts seconds using:

```text
requested_frames = ceil(duration_seconds Γ— 24)
raw_frames = the next frame count where raw_frames % 17 == 5
```

It always rounds up. The generated duration can therefore be longer than the
number entered.

| Requested | Raw frames | Raw duration | Delivered by clip 1 | Delivered by later clip with 22-frame head context |
|---:|---:|---:|---:|---:|
| 0.2 s | 5 | 0.208 s | 5 frames / 0.208 s | Invalid: not longer than the overlap |
| 1 s | 39 | 1.625 s | 39 frames / 1.625 s | 17 frames / 0.708 s |
| 5 s | 124 | 5.167 s | 124 frames / 5.167 s | 102 frames / 4.250 s |
| 10 s | 243 | 10.125 s | 243 frames / 10.125 s | 221 frames / 9.208 s |
| 15 s | 362 | 15.083 s | 362 frames / 15.083 s | 340 frames / 14.167 s |
| 30 s | 736 | 30.667 s | 736 frames / 30.667 s | 714 frames / 29.750 s |

### Use frames for exact control

```json
{
  "id": "outro",
  "prompt": "Resolve the movement and end the performance.",
  "length": 124
}
```

Use `length` when exact H3 timing matters. Invalid examples include `120`,
`240`, and `360`; the nearby valid values are `124`, `243`, and `362`.

### Raw length versus delivered length

With the recommended `anchor_mode: head`, the beginning of every continuation
contains the previous scene's repeated context. `MiniMax H3 Context Loop Trim`
removes that overlap:

```text
clip 1 delivered frames = raw_frames
later delivered frames  = raw_frames - that scene's effective context_length
```

The Trim node's optional `images_with_overlap` output can retain the requested
number of repeated visual frames for an external stitcher. Its standard
`images` output remains fully trimmed, and audio always removes the complete
overlap from its public waveform. With `match_tail` enabled, that same AUDIO
value privately carries the full decoded overlap directly to Segment Save.
Generated-audio assembly lets a later masked-AV scene own that interval, so a
Soft AV audio release is not discarded. No additional audio socket or wire is
needed. Visual assembly remains independent and uses its configured overlap.

Generated-audio assembly derives each scene's sample budget from cumulative
delivered frame boundaries. This distributes fractional samples across the run
instead of independently rounding every scene, preventing boundary rounding
from accumulating into long-run A/V drift. New masked-AV checkpoints also save
the current scene's decoded overlap; old checkpoints without it retain the
legacy delivered-only hard-cut fallback.

For `context_length: 22`, a later scene with `length: 362` contributes 340 new
frames, or 14.167 seconds, to the final video. The source-audio window still
covers all 362 raw frames and begins 22 frames before the prior delivered end,
so its overlap matches the repeated picture context.

For the dedicated single-image I2VA example, each requested 10-second scene
rounds up to 243 raw frames and `context_length: 5`. Two scenes therefore
deliver `243 + (243 - 5) = 481` frames, or 20.04 seconds at 24 fps. The
First-Scene Image Gate supplies the opening image only to scene 1; scene 2 has
no Picture label and relies on incoming motion context.

With `anchor_mode: before`, no repeated head is delivered, so every scene
delivers its complete raw length. This mode is retained for experimentation;
`head` is the tested and recommended mode.

Every non-final scene must deliver at least the next scene's effective
`context_length` so that scene has enough context. The plan rejects shorter
predecessors before render; a next-scene override of `0` needs none.

## Prompt formatting

For human editing, use an array of lines instead of writing escaped `\n`
characters. The node joins entries with real newlines. Use an empty string
entry when you want a blank line:

```json
{
  "shots": [
    {
      "id": "arrival",
      "prompt": [
        "Use <Picture 1> for her facial identity, hairstyle, skin tone, age, body proportions, and distinctive physical features.",
        "Her wardrobe is the outfit defined here.",
        "",
        "Throughout every scene S1 wears the same fitted thigh-length dove-grey designer cocktail dress in opaque structured fabric with a deliberate low cleavage cutout, carries a small black designer handbag, and wears black high-heeled pumps.",
        "",
        "<Subject 2> (S2) enters from camera right."
      ]
    }
  ]
}
```

This reaches MiniMax as:

```text
Use <Picture 1> for her facial identity, hairstyle, skin tone, age, body proportions, and distinctive physical features.
Her wardrobe is the outfit defined here.

Throughout every scene S1 wears the same fitted thigh-length dove-grey designer cocktail dress in opaque structured fabric with a deliberate low cleavage cutout, carries a small black designer handbag, and wears black high-heeled pumps.

<Subject 2> (S2) enters from camera right.
```

Put stable information in `prompt_prefix` and only scene-specific changes in
each `prompt`; both fields accept the same readable array format:

```json
{
  "prompt_prefix": "<Subject 1> keeps the same face, yellow-and-pink hair, black cropped T-shirt, ripped jeans and silver chain. Photorealistic continuous music-video take with no cuts.",
  "defaults": {
    "duration_seconds": 15,
    "steps": 20
  },
  "shots": [
    {
      "id": "backstage",
      "prompt": "Track backward as <Subject 1> walks through the backstage room. End with her opening the corridor door."
    },
    {
      "id": "corridor",
      "prompt": "Continue the same stride and camera movement through the already-opening door. End with the camera beginning a left orbit."
    }
  ]
}
```

When the same complete prompt should drive every scene, scene prompts can be
empty or omitted:

```json
{
  "prompt_prefix": "The complete shared MiniMax prompt used for every scene.",
  "shots": [
    {"id": "scene_01", "length": 362},
    {"id": "scene_02", "length": 362}
  ]
}
```

For seamless results, each continuation prompt should explicitly preserve the
incoming action, camera direction, subject pose, lighting, and unfinished
movement. End each scene with an action still in progress, then begin the next
prompt by continuing that exact action.

## Seeds and steps

Use fixed seeds when a plan must be exactly reproducible:

```json
{
  "shots": [
    {
      "id": "scene_01",
      "prompt": "Opening scene.",
      "seed": 983590410766495,
      "steps": 20
    }
  ]
}
```

When `seed` is absent, a deterministic seed is derived from:

```text
base_seed + scene index + scene id
```

The same plan and `base_seed` produce the same derived seeds. Changing a scene
ID or moving it to another position changes its derived seed.

`lora_route` selects a pre-patched MODEL input on **MiniMax H3 Scene LoRA
Scheduler**. Omit it or use `base` for the unpatched route; `a` through `d`
select LoRA A-D. The scheduler is not a loader: create each branch with the
ordinary ComfyUI LoRA loader already used by the workflow, and stack loaders
when one scene needs several LoRAs. Because its MODEL inputs are lazy, only the
active scene's selected branch is evaluated. Route selection is stored in the
Plan and checkpoint revision as provenance, but is deliberately excluded from
checkpoint/resume verification. LoRA filenames and strengths remain external;
include them in `generation_fingerprint` only when strict invalidation is
desired.

`continuation_mode` describes the transition from the preceding clip into this
scene. Omit it to inherit the Plan node setting. Use `guide` when this is a new
shot that should retain motion/appearance context while allowing a different
camera, action, or environment. Use `latent_guide` for the same behavior while
reusing a compatible generated predecessor's sampled video latent directly;
imported context falls back to RGB/VAE Guide. Use `masked_av` when it directly
continues the same shot and should preserve the preceding AV prefix exactly.
Use experimental `tapered_av` for the same 39-frame hard-mask geometry while
conditioning on a deterministic, disposable video-only latent-noise copy; it
does not alter carried audio or the accepted predecessor checkpoint.
Use experimental `drift_control_av` to keep that predecessor latent clean while
the sampler moves its disposable prefix to the next scheduler sigma on every
evaluation. It is fixed to 39 context frames, uses an 8+4 clean-seam taper,
and requires the H3 MODEL to pass through Chain Context's MODEL sockets.
Scene 1 uses the field only when Existing Video Context supplies a predecessor.

`context_length` overrides incoming video context for one scene. Omit it (or
leave the visual selector blank) to inherit the Plan node setting. Set it to
`0` for a completely new visual scene. Positive values use the same native H3
choices as the Plan setting. Scene 1's override applies when Existing Video
Context is connected.

`audio_context_length` independently controls prior generated sound in guide
mode. Blank inherits the Plan audio setting; when that Plan setting is `0`, it
follows the scene's effective video context. An explicit per-scene `0` means no
audio carry, while a positive value can continue sound with video context `0`.
It applies to `generated_audio` and `source_plus_timeline`; `source_track` uses
its exact timeline slice. Masked AV ignores the independent value and preserves
audio for the same physical interval as its video prefix.

The compact Plan editor places these controls beside Steps under **Show
advanced**; Plan Studio keeps them in the existing scene-properties row.

## H3 Chain Plan node settings

| Setting | Accepted values | Recommended use |
|---|---|---|
| `run_name` | Filename-safe text; normalized to at most 96 characters | Give each independent render a unique name. Keep it unchanged only when resuming. |
| `generation_fingerprint` | Any stable version string | Include model, VAE, LoRA, global-reference, CFG, sampler, and scheduler versions. Change it when any external generation dependency changes. |
| `width`, `height` | Positive multiples of 32, UI range 32–4096 | `960 Γ— 544` is the supplied long-form workflow setting. |
| `transition_policy` | Cut, Guide, Tone Guide, Latent Guide, Detail Guide, Detail AV, Drift-Control AV, Hard AV, Soft AV policy wire | Preferred 0.5 incoming-boundary control. |
| `audio_policy` | Independent final/reference/continuity policy wire | Preferred 0.5 audio-intent control. |
| `continuation_mode` | `guide`, `tone_carry_guide`, `latent_guide`, `tapered_guide`, `masked_av`, `tapered_av`, `feathered_av`, `audio_feathered_av`, or `drift_control_av` | Legacy/advanced implementation override for scenes without `shots[n].continuation_mode`. `latent_guide` needs video encode mode and at least 5 positive context frames; `tapered_guide` accepts normal Guide context lengths and 22 is its published baseline; experimental `tapered_av` and `drift_control_av` are fixed to 39 frames. Drift-Control AV also needs Chain Context's MODEL route. |
| `context_length` | `0`, `1`, then native runs `5`, `22`, `39`, ... `243` | Legacy/advanced exact context. Guide accepts the native runs; AV requires the shared-clock subset `39`, `90`, `141`, `192`, or `243`. |
| `encode_mode` | `video` or `frames` | Use `video`. It preserves motion inside the VAE latent and is more efficient. |
| `anchor_mode` | `head` or `before` | Use `head`; wire `trim_frames` into MiniMax H3 Context Loop Trim. |
| `crop` | `disabled` or `center` | Use `disabled` when references and output already share the intended framing. |
| `audio_mode` | `source_track`, `generated_audio`, or `source_plus_timeline` | Legacy 0.4 fallback when Audio Policy is unconnected. |
| `audio_context_length` | `0`–`240` frames | In generated-audio modes, `0` follows the video context length; `22` is the tested explicit value. It is unused for video-only context in `source_track`. |
| `default_duration_seconds` | Positive seconds, up to 149.667 s | Used only when JSON defaults and the scene both omit a length. |
| `default_steps` | `1`–`10000` | Used only when JSON defaults and the scene both omit steps. |
| `base_seed` | Unsigned 64-bit integer | Source for deterministic seeds when a scene omits `seed`. |
| `segment_crf` | `0`–`51` | H.264 checkpoint-segment quality. Lower is higher quality and larger. Start around `18`–`20`. |

### Which audio mode should I use for a voice?

The Plan's `audio_mode` controls the chain timeline and final soundtrack. It
does not turn scheduled `@voice` / native `<Audio N>` references on or off.

- Use `source_track` when you have the finished spoken performance, dialogue,
  vocal, or song and want that exact recording in the final video. Connect the
  complete track to Loop Start and Assemble, then route Current Shot's
  frame-exact slice into Ref2VA or Scheduled Audio.
- Use `generated_audio` when you have only a short voice identity, accent, or
  timbre reference and want H3 to generate new speech/sound described by the
  prompt. Schedule that clip as `@voice`, connect the audio VAE to Loop Context,
  and save the trimmed decoded audio for continuity and assembly.
- Use `source_plus_timeline` only when you intentionally want both the exact
  source slice and the preceding generated-audio latent. It is experimental.

## Scene-scheduled Ref2VA references

Use the scheduled reference nodes when a picture, video, or audio reference
should apply to selected scenes instead of every recursive iteration.

```text
Scheduled Picture Ref ─→ Scheduled Video Ref ─→ Scheduled Audio Ref
                                                    ↓
Current Shot ─ state, prompt, clip_index, clip_count ─→ Scheduled Ref2VA
Current Shot ─ width, height, length ───────────→ Scheduled Ref2VA
CLIP + video VAE + audio VAE ──────────────────→ Scheduled Ref2VA
```

### Convert an existing core Ref2VA node

For an existing workflow, right-click **MiniMax H3 Reference to Video** and
select **Convert to MiniMax H3 Scheduled Ref2VA**. The conversion is a graph
edit, not a runtime monkeypatch. It:

- replaces the visible core node with Scheduled Ref2VA at the same position;
- preserves CLIP, both VAEs, prompt, width, height, length, image-size mode,
  and both downstream core outputs;
- creates one schedule entry for every connected picture, video, paired video
  soundtrack, and standalone audio socket;
- keeps same-index video/audio inputs together in one Video Schedule node;
- connects Current Shot `state`, `clip_index`, and `clip_count` when the loop node is
  already connected to the core prompt/dimensions, or is the only Current Shot;
- connects a static schedule fingerprint to the only Plan when safe and leaves
  it disconnected when a reference depends on Current Shot, avoiding a cycle;
- preserves an existing non-empty Plan `generation_fingerprint` instead of
  overwriting it; combine the displayed schedule hash explicitly in that case.

Converted entries initially use all scenes and readable aliases such as
`@picture_1`, `@video_1`, `@video_1_audio`, and `@audio_1`. Edit their selectors,
and tags after conversion. A paired-audio socket without its same-index video
is ignored because core Ref2VA would ignore it as well.

Each entry has a stable human alias. Using it is optional: a Plan prompt can say `@hero_face`,
`@performance`, or `@voice` without knowing which native H3 ordinal that
reference will receive in a particular scene. Core workflows can continue using
native labels directly. In a scheduled prompt, do not mix native and alias names
for the same source; either manage native numbering yourself or let the alias
compiler own it.

The `scenes` field uses one-based scene numbers:

| Value | Active scenes |
|---|---|
| blank, `all`, or `*` | every scene |
| `3` | scene 3 |
| `1:5` | scenes 1 through 5 |
| `1,3,5:8` | scenes 1, 3, and 5 through 8 |

Overlapping or adjacent ranges are normalized. Zero, reversed ranges, malformed
tokens, and selections beyond `clip_count` stop before model execution with a
specific error. Unlike Loop Start's render range, disjoint reference selections
are safe because they do not skip the chain's motion dependency.

### Video-reference timeline modes

`sequential` remains experimental in 0.5. `restart_each_scene` remains the safe,
backward-compatible default and preserves existing schedule fingerprints.

Each Scheduled Video Ref chooses one of two source-timeline behaviors:

| Mode | Behavior |
|---|---|
| `restart_each_scene` | Every active scene receives the reference beginning at source frame 0. This is the compatibility default for existing workflows and short reusable motion examples. |
| `sequential` | The source advances on the Plan timeline. Each scene receives an exact source slice beginning at that scene's `generation_start_frame`, relative to the first scene where this reference is active. |

Sequential mode requires Current Shot `state` connected to Scheduled Ref2VA.
It uses the same overlap already represented in the Plan. With 243 raw frames
and 22 head-context frames, scene 1 uses reference frames `0:243`; scene 2
starts at generation frame 221 and therefore uses `221:464`. This overlap is
intentional: the reference motion shown beneath the pinned continuation frames
is the same motion, rather than frame 0 replaying against a later scene.

If the selector begins at scene 4, reference source frame 0 aligns with scene
4. Later active scenes follow the Plan's elapsed generation time, including
inactive gaps. The video must already be 24 fps and contain every requested
frame. Paired video audio is sliced to the same time interval with sample-exact
rounding. A short source, missing state, changed Plan timing, or mismatched
scene state stops with an explicit error; the scheduler never wraps or pads a
motion reference silently.

Motion Context is not `<Video 0>` and does not consume one of stock Ref2VA's
three external video slots. It travels as an H3 guide/keyframe and has no
prompt-visible label; scheduled references remain `<Video 1>` through
`<Video 3>`. Internally all visual conditioning blocks are presented to the
model, so additional references may still cost VRAM and introduce competing
motion instructions.

See
[`Ref2V Sequential Motion - EXPERIMENTAL - MiniMax H3.json`](<example_workflows/Ref2V Sequential Motion - EXPERIMENTAL - MiniMax H3.json>)
for the minimal two-scene wiring. Its Reference Video Prep selects 464 frames,
so the user-supplied native video and embedded audio must cover at least
19.333 seconds after conversion to 24 fps.

### Prompt definitions and native labels

Write reference definitions directly in the Plan prompt. Optional stable aliases
are useful when scheduled references renumber between scenes:

```text
subject_definitions:
<Subject 1> is the woman whose facial identity comes from @hero_face and whose
walking motion comes from @performance; preserve her hairstyle, skin tone,
apparent age, and distinctive physical features.
```

For one active picture and one active video, the compiled prompt receives:

```text
subject_definitions:
<Subject 1> is the woman whose facial identity comes from <Picture 1> and whose
walking motion comes from <Video 1>; preserve her hairstyle, skin tone,
apparent age, and distinctive physical features.
```

The wrapper only replaces active `@tags`; it never inserts definitions. This
keeps the complete six-section H3 prompt visible in the Plan and Prompt Editor.
Unknown tags and tags scheduled for another scene are rejected rather than
leaking unresolved aliases into H3.

ComfyUI's stock Ref2VA presents media in a fixed order, and the compiler mirrors
it exactly:

1. active pictures, numbered `<Picture 1>`, `<Picture 2>`, and so on;
2. active videos, with each paired soundtrack's `<Audio N>` presented directly
   before that video's `<Video N>`;
3. active standalone audio, continuing the independent `<Audio N>` numbering.

Picture, video, and audio ordinals are independent. A video soundtrack therefore
receives its own audio tag; if `audio_tag` is blank, `@performance` derives
`@performance_audio`. The stock limits are validated per scene: 9 pictures,
3 videos, and 3 standalone audios. Scenes with no active references remain
valid and expand to stock Ref2VA without dynamic reference sockets.

### Optional legacy patch ownership control

Updated ComfyUI builds containing merged PR #15439 keep H3 guide placement and
Ref2VA merging entirely core-owned; Patch Priority is then an unchanged
pass-through reporting that no compatibility patch is required. On an older
ComfyUI build, the first compatible H3 Motion Context copy loaded owns the
legacy process-level wrappers. If an older installed copy wins load order, wire
**MiniMax H3 Patch Priority** between the conditioning node and **MiniMax H3
Context Loop Context**:

```text
Ref2VA / I2V conditioning β†’ Patch Priority β†’ Context Loop Context
```

The node passes conditioning through bit-for-bit and executes an ownership
check first. It can replace only a recognised older copy of the same shared
patch family. It preserves the known-compatible H3-Multishot payload merge and
SolAttn layout observer. Any unknown wrapper is rejected with its ownership
reason instead of being overwritten. The selection is process-global after the
node executes; one wired node is enough for the workflow, while a disconnected
control node will not execute.

### Checkpoint compatibility

Every schedule entry fingerprints its normalized selector, tags, and actual
media bytes. For a schedule made entirely from static loaders, connect
its `schedule_fingerprint` output to Plan `generation_fingerprint`. Changing a
reference file, its selector, or its tag will then invalidate incompatible
saved predecessors.

An entry may instead consume a per-iteration outputβ€”for example Current Shot's
frame-exact `source_audio_slice`. Keep that entry inside the recursive body and
do not connect its changing fingerprint backward to Plan. Source-track mode
already fingerprints the complete source waveform at Loop Start, so its scene
slices remain resume-safe without creating a graph cycle.

## Extending an existing video

Use **MiniMax H3 Existing Video Context** when scene 1 must continue a decoded
video rather than begin from an empty timeline.

Open
[`Extend Existing Video Model Workflow - MiniMax H3.json`](<example_workflows/Extend Existing Video Model Workflow - MiniMax H3.json>)
for a complete two-scene model with generated-audio continuity, original-video
prepend, review/retry controls, and a muted recovery branch. This workflow is
**experimental** while the imported AV continuation path receives broader
real-world validation. It is a separate example; the existing looping and
historical workflows are not modified.

```text
Chain Plan ───────────────────────────┐
Core Load Video (VIDEO) ───────────────┼→ Existing Video Context β†’ Loop Start
Other loader IMAGE + AUDIO + FPS β”€β”€β”€β”€β”€β”˜
H3 audio VAE (when carrying audio) ─────────────────────────────→ Loop Context
```

Use exactly one video route:

- `source_video` accepts a native ComfyUI `VIDEO`. The adapter decodes its
  frames and embedded audio and reads its exact FPS; the `source_fps` widget is
  ignored. A separately connected `source_audio` overrides embedded audio.
- `source_frames` accepts an `IMAGE` batch from VHS or another loader. Wire its
  `AUDIO` output when available and set or connect `source_fps` to the actual
  frame rate represented by that batch.

Connecting both `source_video` and `source_frames` is rejected instead of
silently choosing one.

The adapter performs four explicit operations:

1. decodes native `VIDEO`, or accepts already decoded `source_frames`, then
   resamples from the effective source FPS to H3's 24 fps;
2. fits them to the Plan width/height using the Plan crop setting;
3. keeps the last effective scene-1 `context_length` frames and optional
   matching audio tail as scene 1's predecessor (or none when it is `0`);
4. when `prepend_original` is enabled, persists the complete normalized source
   for automatic partial/final assembly.

No original H3 latent is required or recoverable from an ordinary MP4. The
decoded tail is re-encoded with the same H3 video/audio VAE path used between
generated scenes.

With recommended `anchor_mode: head`, imported context changes scene 1 timing
to the same rule used by later continuations:

```text
scene 1 delivered frames = raw_frames - scene 1's effective context_length
```

Therefore a 362-frame first scene with 22 imported context frames contributes
340 new frames. Keep Loop Trim connected with `match_tail=true`.

Legacy `source_audio` has two distinct meanings in this setup:

- Existing Video Context `source_audio` is the soundtrack of the video being
  extended. Its tail seeds the first join and its full normalized duration is
  preserved when prepend is enabled.
- Loop Start / Current Shot / Assemble `source_audio` is the compatibility
  soundtrack for the generated extension. In 0.5, register that media once with
  Source Timeline instead. For scene 1 the loop constructs one raw conditioning
  window from the imported audio tail followed by this track from time zero.

For `generated_audio` or `source_plus_timeline`, connect the H3 audio VAE to
Loop Context so the imported decoded tail can become a timeline audio guide.
With no imported audio, visual continuation still works and generated sound
starts fresh. In `source_track`, the first source-reference window already
contains the imported tail, so Loop Context does not need the audio VAE.

When `prepend_original=true`, Assemble detects the prelude in the manifest and
places it before all generated segments. Original audio is prepended to either
the source-track or checkpointed generated extension audio; `audio_source:none`
creates a silent final MP4. The source must be normalized and re-encoded because
arbitrary input videos cannot safely share H.264 parameters, dimensions, and
timestamps with generated segments. The Plan's `segment_crf` controls that
single normalization pass.

Reconnect the same Plan, source video, and adapter when resuming or rebuilding a
manifest. The imported tail is fingerprinted as part of checkpoint continuity;
changing it correctly invalidates dependent generated scenes.

## Audio modes and formatting

### `source_track`

Recommended for a music video driven by one song.

- In 0.5, set Audio Policy to Source/On/Off and connect the full track once to
  Source Timeline. The old Loop Start/Current Shot/Assemble AUDIO fan-out
  remains accepted for saved 0.4 workflows.
- Current Shot slices a frame-exact raw audio window for each Ref2VA scene.
- Motion Context carries picture context only.
- Assemble muxes the original source track over the stitched video.
- Wire trimmed decoded audio into Segment Save. H3's generated audio is saved
  as per-scene WAVs and as one combined `.generated.wav` beside the final MP4,
  even though the MP4 itself uses the original source track.
- The song must be at least as long as the total delivered video.
- A genuinely silent placeholder may be shorter; Loop Start detects it and
  zero-pads scene slices and final assembly to the required duration.
- The waveform is hashed; changing or miswiring the song is rejected.

### `generated_audio`

- No source track is required.
- Chain Context carries the preceding H3 audio latent on the timeline.
- Wire trimmed decoded audio into Segment Save.
- Assemble uses cumulative frame boundaries and lets every later masked-AV
  scene own its saved decoded overlap, preserving hard or feathered AV sound.
- The same generated track is also preserved as WAV sidecars for later editing.
- MiniMax H3 Context Loop Trim must keep `match_tail` enabled for exact sample counts.

### `source_plus_timeline`

- Ref2VA receives the frame-exact source-song window.
- Chain Context also carries the preceding generated audio latent.
- This mode is experimental.
- Assemble selects the source track when `audio_source` is `plan`.
- H3's generated track remains available in the generated-audio WAV sidecars.

## Native MiniMax H3 guides

When ComfyUI exposes **MiniMax H3 Add Guide** (introduced by
[ComfyUI PR #15439](https://github.com/Comfy-Org/ComfyUI/pull/15439)), Loop
Context automatically emits core video/audio guide records instead of the
legacy keyframe/ref representation. Existing ComfyUI releases continue through
the guarded compatibility path with a one-time update warning, so workflows do
not need a version switch.

To add a scene-local still, clip, or audio anchor, place the official Add Guide
node **after Loop Context**. It appends its guide to the continuation anchors.
When Ref2VA references are present, merged core places the complete guide set
on the target scene timeline rather than the preceding reference cursor. This
pack does not wrap the native layout or payload path.

## Starting, resuming, and changing a plan

For a fresh render:

```text
run_name: choose a new name
start_clip: 1
scene_range: leave blank
```

To resume from scene N:

```text
run_name: keep the original name
start_clip: N
scene_range: leave blank
```

The Start node loads the checkpoint from scene `N - 1` and validates every
completed predecessor. You may edit scene N and later scenes. Changing any of
the following for an earlier completed scene invalidates resume:

- prompt, seed, steps, duration, or length;
- width, height, context, crop, anchor, encoding, or audio mode;
- source audio waveform;
- `generation_fingerprint`.

The checkpoint browser embedded in the Review Gate is a shortcut for this
setup. It lists saved predecessor slots under the current `run_name`, changes
Loop Start's `start_clip`, and leaves the same validation to the next queued
execution. Loading previews the joined partial through that checkpoint when
available, or the saved predecessor scene otherwise. **Approve & stop** also
writes a partial joined video through the accepted scene when
`assemble_partial_on_stop` is enabled.

During active sampling, the floating **Cancel & reroll scene N** action uses
the scene index emitted by Current Shot. It cancels that exact ComfyUI prompt
ID, waits for an `execution_interrupted` confirmation, stores a new explicit
seed in scene N, sets `start_clip` to N, and queues normally. Scene N > 1 is
only cancelled after checkpoint N - 1 is confirmed ready. For a bounded run,
the remaining range becomes `N:end`; otherwise `scene_range` is cleared so it
cannot override the adjusted `start_clip`. If the prompt finishes during the
request, no Plan value is changed and nothing is automatically requeued.

### Generate a bounded scene range

`scene_range` is inclusive and overrides `start_clip` when non-empty:

```text
scene_range: 3       # generate only scene 3
scene_range: 3:8     # generate scenes 3 through 8
```

Whitespace is allowed. A range starting above 1 loads and validates the
checkpoint for the preceding scene. A range ending before the final planned
scene emits a partial manifest containing every verified predecessor through
the selected end, so Assemble can create the chain through that point.

Disjoint syntax such as `1,3,5:8` is intentionally rejected. Scene 5 depends
on scene 4, and rerendering an earlier selected scene would invalidate a
skipped descendant checkpoint.

Model, VAE, LoRA, references, CFG, sampler, and scheduler sit outside the Plan
node, so the chain cannot inspect them directly. Record them in
`generation_fingerprint` and change that string whenever they change.

## Saved prompts and workflow recovery

Segment Save preserves the actual effective prompt and seed used for every
accepted render. A run under `output/h3_chains/<run_name>/` contains:

```text
source/existing_video_<hash>.mp4  normalized prelude when prepend is enabled
source/existing_video_<hash>.safetensors  preserved prelude audio
plan.json                         normalized effective plan for this run
workflow.json                     loadable frontend ComfyUI workflow
api_prompt.json                   queued API-format graph fallback
manifest.json                     completed segment manifest
segments/clip_0001.<id>.mp4       video with the full prompt in MP4 metadata
segments/clip_0001.<id>.prompt.txt
checkpoints/clip_0001.json        structured prompt, seed, paths and hashes
checkpoints/clip_0001.<id>.json   immutable metadata for each saved revision
checkpoints/clip_0001.<id>.safetensors
final/<filename>.mp4              workflow, API graph and manifest embedded
```

Saving the same scene again updates `checkpoints/clip_0001.json` to the active
revision but retains every earlier MP4, prompt sidecar, safetensors checkpoint,
and versioned metadata file. Each current record links to the previous one via
`supersedes`, so rerolling or regenerating a scene is non-destructive.

The segment record and manifest store `prompt_prefix`, `scene_prompt`, the
combined `prompt`, `prompt_hash`, `prompt_file_sha256`, `seed`, and paths to the
recovery archives. `prompt_hash` identifies normalized prompt text, while
`prompt_file_sha256` verifies the exact sidecar bytes. Older Windows sidecars
that used CRLF line endings remain resumable through normalized text checking.
The same prompt fields are also stored in the safetensors metadata. In 0.5,
edit the active prompt in Scene Prompt Editor or Rich Scene Prompt Editor;
Review Gate reads that Plan prompt on Retry/Reroll. Its legacy textarea is
available through the Interface setting. Review retries rewrite `plan.json`,
`workflow.json`, and `api_prompt.json` with the effective scene prompt and
exact uint64 seed before saving the replacement.
Both segment and assembled MP4 files use ComfyUI's standard `workflow` and
`prompt` tags, so metadata-aware ComfyUI loaders can recover the graph directly;
assembled files additionally embed the completed `h3_manifest`.

`workflow.json` is the file to drag back into ComfyUI. `plan.json` remains the
authoritative record of what the loop actually rendered if an external API
queued the job without frontend workflow metadata. As with ordinary ComfyUI
workflow metadata, connected node widget values are archived too; keep the run
folder private if a workflow contains credentials or other sensitive values.

### Re-decode checkpoints to PNG

Wire a completed or partial manifest and the same H3 video VAE into
**MiniMax H3 Context Loop Export PNG Sequence**. The node:

1. verifies every safetensors checkpoint hash without depending on the H.264
   segment file;
2. decodes one full scene latent at a time;
3. computes `trim_frames = raw_frames - delivered_frames` and removes the
   repeated continuation overlap;
4. writes a continuous frame-numbered 8-bit RGB PNG sequence;
5. writes `export.json` with scene frame ranges, prompts, seeds and checkpoints.

The export lives under
`output/h3_chains/<run_name>/frames/<export_name>/`. If that folder already
exists, a numbered sibling is created instead of overwriting it. PNG compression
is lossless: changing `png_compression` only changes encoding time and file size.
When `embed_workflow` is enabled, the first PNG stores the archived `workflow`,
API `prompt`, effective `h3_plan`, and `h3_manifest`; each scene's first frame
stores its effective scene metadata and full prompt.

The checkpoint contains the exact sampled video latent, but VAE decoding is a
separate computation. For the closest reconstruction, use the same H3 video
VAE, ComfyUI version, precision, and decode/tiling behavior as the original
render. The PNG files are lossless representations of this new decode after its
conversion to standard 8-bit RGB; they are not guaranteed to be bit-identical
to frames decoded previously under different settings.

## Complete music-video template

```json
{
  "prompt_prefix": "<Subject 1> is the same performer in every scene. Preserve facial identity, hair, wardrobe, proportions and accessories. Photorealistic high-energy music video shown as one uninterrupted moving-camera take. No cuts. Continue subject motion, camera momentum, lighting and geometry across every boundary.",
  "defaults": {
    "duration_seconds": 15,
    "steps": 20
  },
  "shots": [
    {
      "id": "clip_01",
      "prompt": "Begin in a backstage room. Track backward as <Subject 1> approaches a lit doorway. End while the door is opening.",
      "seed": 1001
    },
    {
      "id": "clip_02",
      "prompt": "Continue through the already-opening doorway without resetting her stride or the camera. Follow into a concrete corridor. End as the corridor begins transforming.",
      "seed": 1002
    },
    {
      "id": "clip_03",
      "prompt": "Continue the corridor transformation and the same forward motion. Move into a wide exterior. End with the camera starting to rise.",
      "duration_seconds": 10,
      "steps": 24,
      "seed": 1003
    },
    {
      "id": "clip_04",
      "prompt": "Complete the rising camera move, resolve the performance, and finish on a calm wide composition.",
      "length": 124,
      "seed": 1004
    }
  ]
}
```

## Common formatting errors

| Error | Fix |
|---|---|
| Invalid JSON | Use double quotes, remove comments, and remove trailing commas. |
| Empty prompt | Provide a non-empty scene `prompt`, or provide a non-empty `prompt_prefix`/`global_prompt` that the scene can use alone. |
| Duplicate ID | Give every scene a unique `id`. |
| Invalid exact length | Use a value from the `17k+5` grid, such as `124`, `243`, or `362`. |
| Continuation is too short | Make its raw length greater than `context_length`; every non-final scene must also deliver enough frames for the next context. |
| Unexpected scene duration | Remember that seconds round up and later `head` clips lose the repeated context after trimming. Inspect Current Shot's `raw` and `delivered` status. |
| Resume rejected | Restore the prior completed-scene settings and source track, or start a new run from clip 1 with a new `run_name`. |
| Source audio too short | Use a longer song, shorten the plan, or choose a non-source audio mode. Truly silent placeholder audio is padded automatically; non-silent audio is never padded. |
| Final audio/video drift | Wire both decoded streams through MiniMax H3 Context Loop Trim and leave `match_tail` enabled. It truncates excess audio or zero-pads a fractional-step shortage. |