File size: 7,828 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
# Alpha test checklist (2026-08-09 nodes)

Covers H3 Manual Hold Map, H3 Motion Editor (and its widget), H3 Segment
Crop, H3 Segment Splice, and the manual mask paths on H3 Motion
Composite / H3 V2V Init. The Python compile paths have been exercised via
the API; the interactive widget and the drag-in workflows need human
passes. Findings welcome as issues; symptom/dial pairs belong in
TUNING.md.

Setup: any ComfyUI with the H3 models working (0.30 and 0.31 front ends
both need coverage). Keep the browser dev console open; any red line
during widget use is a finding. All three graphs wire clip length from
one source node; drop to a short legal duration (56 or 73 frames at
24fps) while iterating. Reminder when reviewing saved clips elsewhere:
H3 audio is 32 kHz and some players decode that as silence; resample to
48 kHz AAC if you share files.

## 1. Targeted graph (motion_pipeline_targeted.json)

- [ ] First queue with the shipped range saves baseline / oraclemap /
      dilated / final, no errors, final plays clean
- [ ] The Manual Hold Map report (the price tag) is actually visible
      somewhere; if you had to wire your own text display, note it
- [ ] Two-pass rhythm: watch oraclemap, retype ranges to the real burst,
      requeue; baseline sampler must NOT re-run; dilated length and
      report shrink
- [ ] Syntax: multi-range, seconds ("0.5s-1.1s"), per-range ":hold",
      mixed; segments output echoes token-snapped (wider) spans
- [ ] Error UX: reversed range and out-of-bounds range produce readable
      messages, not a stack wall
- [ ] Gate mode semantics: with the oracle wired, your ranges choose
      WHERE and the oracle chooses hold strength (typed :hold values are
      ignored); unwire the oracle and your holds apply directly
- [ ] s_per_step set to a measured value gives a plausible minutes
      estimate
- [ ] Spatial branch: unmute, paint a background lasso mask, queue;
      with invert_mask on, the painted region returns to baseline
      timing; the seam (feather 64 smoothstep on a real edge) is
      invisible in playback
- [ ] Latent freeze hard-cell ratification: hard 0/1 cells are now the
      DEFAULT (mask_feather 0 snaps boundary cells instead of leaving
      them fractional). Route the same mask through H3 V2V Init's
      freeze path and run same-seed mask_feather 0 vs 32 vs 64. The
      bet: hard cells tie or win, because half-frozen blend cells were
      the seam mush and the decode smooths a hard edge anyway. If 32/64
      clearly wins in playback, revert the default and say so in
      TUNING

## 2. Editor graph (motion_pipeline_editor.json)

Cold load
- [ ] Node renders with toolbar, timeline, paint hint, price line; the
      raw editor_state textarea is hidden; console clean
- [ ] Save and reload the workflow before any queue; node intact

First queue (no blocks)
- [ ] Behaves like the classic adaptive pipeline (oracle passes through,
      mask is all ones)
- [ ] Widget populates: filmstrip, green jerk profile, "last run" report

Timeline
- [ ] Scrub on filmstrip/ruler; playhead and frame label track
- [ ] Drag on the block lane creates a block snapped to the token grid;
      "+ block" works at the playhead; snap toggle off allows free edges
- [ ] Move and resize via bracket handles (are the 4 px hit zones big
      enough?); multiple blocks get distinct colors; labels show
      "oracle"/"hN" and a star once painted
- [ ] Delete button and Delete key; drags under 2 frames create nothing
- [ ] Undo button and ctrl+z; ctrl+z inside the editor must NOT undo the
      ComfyUI graph, and editor keys must not trigger canvas hotkeys;
      clicking outside restores normal hotkeys

Painting
- [ ] Unpainted selected block shows the red tint and the "paint to
      narrow it" notice
- [ ] Brush paints with the circle cursor; erase removes; size slider
      works at both extremes; "clear frame" wipes only the current frame
- [ ] Playhead outside the selected block: painting no-ops with notice
- [ ] "paint: whole block" strokes persist across the block's frames
- [ ] Onion skin ghosts previous (blue) and next (green) frame strokes;
      toggle kills them
- [ ] Mouse wheel over the paint area steps frames without zooming the
      graph canvas; arrow keys step too

Dials and automation
- [ ] All per-block dials respond; hold changes move the price line
- [ ] "A" buttons open lanes for hold/feather/strength; click adds
      points, drag shapes, double-click deletes; values clamp to range
      and block span; the button lights when an envelope exists
- [ ] Known cosmetic: pre-queue price estimates oracle blocks at hold 4,
      so it can overshoot the post-run report

Edit and requeue (the core promise)
- [ ] After an edit, only the regeneration side re-runs; if the baseline
      sampler re-runs, that is the P1 finding
- [ ] Painted region regenerates, unpainted stays baseline; block edges
      ease via the fade dial with no hard pop
- [ ] Trap to confirm and document: adding ANY block gates the oracle,
      so bursts outside your blocks are not de-roped
- [ ] invert_mask and outside_blocks=regenerated behave as labeled

Persistence
- [ ] Save + browser refresh mid-edit: blocks/strokes/envelopes survive;
      the filmstrip may be blank until the next queue (temp thumbnails);
      confirm it degrades to the hint, not broken images
- [ ] After a ComfyUI restart, the first queue repopulates everything

## 3. Segment graph (motion_pipeline_editor_segment.json)

- [ ] First queue with an empty editor crops to the oracle's window plus
      handles; the crop report states the speedup ratio
- [ ] A tight block around the burst improves the ratio and the wall
      time vs the plain editor graph
- [ ] Video seam: step frames at both window boundaries; look for tone
      or brightness drift across the crossfade; compare feather_frames
      0 vs 6
- [ ] Audio seam: headphones at both splice points; no clicks; total
      duration matches baseline; sync holds after the splice
- [ ] Edge cases: block touching frame 0 or the last frame; two separate
      bursts produce ONE window spanning both (current behavior); the
      report should make that obvious

## Triage

- P1: baseline re-runs on edit; state loss on save/reload; crashes;
  unreadable errors on common mistakes
- P2: interaction jank, price/report confusion, seams below the playback
  bar
- P3: cosmetics (canvas text is not hidpi-scaled yet, known)

## 5. Oracle alpha knobs (added 2026-08-10)

- [ ] `profile_mode` default (`value |d3|`) must reproduce your previous
      results exactly: same clip, same seed, same hold map and same segments
      string as before this change. Verified bit-identical offline; confirm
      once in the graph.
- [ ] `profile_mode` = `value |d1| (energy baseline)`: the honest cheap
      baseline. On real clips it correlates 0.96-0.98 with |d3|, so if it
      produces a materially similar hold map, that IS the finding and the
      default detector is not earning its name.
- [ ] `profile_mode` = `trajectory centroid |d3|`: expect a different hold
      map. Judge in playback whether it targets the burst better or worse.
      Do not judge from the profile string alone.
- [ ] `abstain_below` (absolute gate, 0 = off): run it on a clip you KNOW is
      calm. Raise until the oracle returns a flat hold map and empty
      segments, then check it still dilates a genuinely fast clip at that
      setting. Measured contrast ran ~1.9x higher on a lurching toy than a
      constant-velocity one, so the useful range is likely 1.5-2.5. If a
      single threshold cannot separate your calm and fast clips, say so:
      that is evidence the contrast statistic is the wrong absolute unit and
      the demand-over-capacity route in ROADMAP.md section 1 is needed
      instead.