Repository navigation
idea: quality-ramp skill - draft -> preview -> final tiers with measured cost/quality trade-offs (H3 first) #862
Description
Why
Nothing in the plugin tells an agent how to spend GPU time on quality. Every H3 render up to now used int4 + a turbo LoRA because that's what the templates default to, and Known Issues faces were always smeary. The quality matrix showed the trade-off is large and predictable:
- Turbo LoRA + int4 = smeary faces (2-2.5/5), regardless of canvas.
- Base model (no LoRA) at int8 = photographic faces (4/5), even at 12 steps on a close-up, but 2-4x the time.
- Within a "family" (same LoRA, or same base weights), a cheap draft carries its staging to the final at the same seed, so you can iterate cheaply and then pay once.
A skill is the right place for this. It is cross-cutting (applies to dialogue-short, reference-to-video, shots-batch, series episodes) and is about process: what to run first, what to approve at each tier, what never to change between tiers.
Measured ladder (cold open two-shot unless noted)
| Rung | Canvas | Weights | LoRA | Steps | Attn | Extra | Min (3090) | Face score /5 | Staging family |
|---|---|---|---|---|---|---|---|---|---|
| L0 | 960x544 | int4 | ref2v 4-step v0.1 | 5 | sage_hub | 3.5 | 2 | turbo-4 | |
| L1 | 1344x768 | int4 | ref2v 4-step v0.1 | 5 | sage_hub | 5.4 | 2.5 | turbo-4 | |
| L7 | 1344x768 | int8 | ref2v 4-step v0.1 | 5 | sage_hub | 7.2 | 3 | turbo-4 | |
| L3 | 1344x768 | int8 | ref2v 8-step v1.0 768p | 9 | sage_hub | 11.2 | 3 | turbo-8 | |
| L4 | 1344x768 | int8 | ref2v 8-step v1.0 768p | 9 | native | 14.5 | 3 | turbo-8 | |
| B4 | 960x544 | int4 | none | 12 | sage_hub | 6.6 | 3 | base-int4 | |
| B1 | 960x544 | int4 | none | 30 | sage_hub | 15.1 | 3 | base-int4 | |
| B5 | 1344x768 | int4 | none | 12 | sage_hub | 11.8 | 3.5 | base-int4 | |
| B6 | 1344x768 | int4 | none | 8 | sage_hub | 8.5 | 1.5 (duplicated a character) | base-int4 | |
| B3 | 1344x768 | int8 | none | 12 | sage_hub | 12.9 | 3.5 | base-int8 | |
| L5 | 1344x768 | int8 | none | 30 | sage_hub | 29.5 | 4 | base-int8 | |
| L6 | 1344x768 | int8 | none | 30 | native | 44.2 | 4 | base-int8 | |
| P1 | 1344x768 | int8 | none | 30 | sage_hub | first_block 0.05 | 23.1 | 4 | base-int8 |
| C1 / C2 (Pat close-up) | 1344x768 | int8 | none | 12 / 30 | sage_hub | 13.9 / 22.8 | 4 / 4 | base-int8 | |
| P6 | 1344x768 | int8 | none | 30 | sage_hub | first_block 0.08 | 19.5 | = P1 (Don: highest threshold to ship) | base-int8 |
| P7 | 1344x768 | int8 | none | 30 | sage_hub | first_block 0.10 | 17.8 | below the ship line (Don chose 0.08) | base-int8 |
| M2 | 1344x768 | int8 | none | 30 | sage_hub | mag 0.06, H3 ratios (below) | 18.1 | = P1 (Don: chosen cinema-final cache) | base-int8 |
L8 (ladder L6_base20) |
1344x768 | int8 | none | 20 | sage_hub | 20.3 | not judged (timing baseline) | base-int8 | |
| P8 | 1344x768 | int8 | none | 20 | sage_hub | first_block 0.05 | 18.9 | = P1 (Don) | base-int8 |
| P9 (Pat close-up) | 1344x768 | int8 | none | 30 | sage_hub | first_block 0.05 | 19.3 | = C2 | base-int8 |
H3 MagCache ratios (M1 calibration, job 39c06ce0c8e8, 1344x768 int8 base, 30-step call = 29 forwards; #927). Use with "num_inference_steps": 29 on a 30-step call:
[1.0, 1.0170626640319824, 1.0188063383102417, 1.0144269466400146, 1.01582670211792, 1.0123010873794556, 1.0143013000488281, 1.0147095918655396, 1.011543869972229, 1.0140726566314697, 1.011247158050537, 1.0131522417068481, 1.0108479261398315, 1.0158313512802124, 1.0112966299057007, 1.0142548084259033, 1.0118868350982666, 1.013062596321106, 1.0141395330429077, 1.0147916078567505, 1.0126711130142212, 1.01567804813385, 1.0131689310073853, 1.0167416334152222, 1.0167744159698486, 1.0180119276046753, 1.015510082244873, 1.0199745893478394, 1.0200268030166626]
M2 skipped 15 of 29 forwards (hit rate 0.52).
Base model = lora_model_name: null, shift video 12 / audio 3. Turbo = shift per the LoRA. All Ref2VA with 4 references (2 portraits, 2 voice clips), 124 frames. Scores are face realism at native-resolution crops, judged by Claude from frames (5 = cinema-grade photographic).
Proposed skill content (plugins/dw/skills/quality-ramp/SKILL.md)
- Pick the path by target, before the first render:
- TV path (sitcom, social, previs): draft L0 (544 int4 4-step, 3.5 min, 2 jobs in parallel) -> final L7 (768 int8 4-step, 7.2 min). Same staging.
- Cinema path (realistic faces): draft B3 (768 int8 base 12 steps, 12.9 min) -> final P1 (same + 30 steps +
first_block0.05, 23.1 min). Same staging. Close-ups at 12 steps are often already 4/5: ship the draft.
- Rules that keep the draft's composition at the final (all measured, one seed per shot, see open questions):
- same seed, same canvas, same prompt;
- never change LoRA family between tiers (turbo 4-step -> 8-step -> base each re-stage);
- on the base model, never change weights (int4 <-> int8 re-stages: B5 vs B3);
- attention backend never moves composition (L3=L4, L5=L6) -
sage_hubalways on, it is visually lossless and 23-33% faster; - base steps >= 12 (8 duplicated a character);
- blocking always carries, set dressing/props sometimes don't (E7 -> E10: same blocking, the monitor and desk shifted).
- What to approve at each tier: draft = blocking, line delivery, timing, head count; final = faces, skin, hair. Re-roll seeds/prompts only at draft tier.
- How to judge (from the matrix's rubric): face crops at native resolution (300x260 around each face at fixed frames), contact sheet every 30th frame for staging,
check-scriptfor lines. Score 1-5 for face realism. Record the judgement on the run withset_note. - Parallelism: int8 H3 holds ~63 GB host RAM: run one int8 job at a time on a 125 GB box (see host-RAM dispatch issue). The int4 draft tier can use both cards.
- Cost quoting: until the plan estimate prices per configuration (separate issue), quote from the table above, not
plan.estimate.
Shape it so other families can add a section (LTX-2.5, Flux) with their own measured ladder; H3 is the only one measured so far.
Open questions (need answers before the skill hardens)
- Seed stability (H3 quality ramp: follow-up experiments (seed stability, cross-family composition lock, int4 base draft) #861 item 1): every "same staging" claim is one seed per shot. Re-run B3->P1, C1->C2, L0->L7 on 2-3 more seeds.
-
Answered 2026-10-15 (H3 quality ramp: follow-up experiments (seed stability, cross-family composition lock, int4 base draft) #861; seeds 7 and 1234, plus 99 for B4->B5; Don judged). Seed 42 was the original matrix run.
Pair s42 s7 s1234 s99 Verdict B3 -> P1 (cinema) carries carries carries - holds, 3/3 C1 -> C2 (close-up) carries carries carries (props and angle drift: a jacket on the chair in C1 only) - holds, 3/3; blocking carries, props may not L0 -> L7 (TV) carries carries carries - holds, 3/3. Note: L0 smears Pat's face at both new seeds; a draft-only defect, L7 is clean B4 -> B5 (544 int4 base -> 768 int4 base) carries carries breaks (different set; B4 adds an extra person) breaks (different set and blocking) unsafe, 2/4: do not use the 544 int4 base draft for a 768 final Timings at the new seeds matched seed 42 within ~1 min (C1 ran ~4 min faster). At s1234, B5 (768 int4) staged like B3 (768 int8), not like B4: on the base model, canvas moved staging more than weights did at that seed. That is one seed against the int4 <-> int8 rule in Proposed skill content 2; the rule stays until it's measured further.
-
- Is 12 steps really the base floor? 8 failed once (B6, int4). 10 was never tried.
- First-block cache at 20 steps could make a 20-step final that beats 30 steps on time at equal quality - untested.
- Answered 2026-10-15 (H3 cinema-path speed: follow-up experiments after first_block -22% (threshold, 20 steps, close-up, seeds, MagCache) #875). P8 (20 steps + first_block 0.05, 18.9 min) was judged equal to P1 by Don. The uncached 20-step baseline L8 took 20.3 min, so at 20 steps the cache saves only 1.4 min (7%). The saving is the step cut. Cinema-final cache: MagCache 0.06 (M2, 18.1 min, -39% vs L5), chosen by Don over first_block. first_block 0.08 (P6, 19.5 min, -34%) is the fallback where no calibrated ratios exist. The cache holds on the close-up (P9 = C2). Compile was dropped on arithmetic, and TaylorSeer was skipped (Don).
- Cross-family composition lock (H3 quality ramp: follow-up experiments (seed stability, cross-family composition lock, int4 base draft) #861 item 2): a 3.5 min turbo draft can't feed a base final today. If it could (guides clip / FL2VA pin), the cinema draft cost drops 4x.
- Should the skill own the judging rubric or should that be its own reference (
references/judging.md) shared with series-episodes?
Quality judgements still needed (human)
- 2026-10-15 (H3 cinema-path speed: follow-up experiments after first_block -22% (threshold, 20 steps, close-up, seeds, MagCache) #875, Don): motion playback and audio by ear are both
okfor P1, P6 and M2 against L5. No flicker, ghosting, pumping or smearing. - Audio was never judged by ear. Claude confirmed lines with check-script (Whisper, all exact) but cannot hear voice timbre, lip-sync feel or room sound. Someone should listen to L0 vs L7 vs B3 vs P1 and say whether the base model's audio is as good as turbo's.
- Are the 4/5 scores right? All scores are from one judge (Claude) on still crops. Confirm on motion: does P1/L5 read as "cinema" in playback, or is there motion smear/flicker the crops don't show?
- Is L7 (3/5) acceptable for the TV path, or should the TV final be B3?
Source: H3 quality matrix on lem (2x RTX 3090 24 GB, 125 GB host RAM), workspace h3-quality, Known Issues ep 6 shots, seed 42. Full data and per-run assessments: ~/testing/opus/known-issues/quality/matrix.json, report quality/REPORT.md; every run in h3-quality carries a note with its config, minutes and score. Related: #861 (follow-up experiments).
Activity
dkackman commentedon Oct 14, 2026
Plan v2: quality ramp for H3 (draft -> final tiers)
claude-opus-5-5 / anthropic. v2 records Don's review of v1: the direction is approved, rebased on
21a6f602after #863, #864 and #880 landed. See the "changed since v1" comment.Verdict: build smaller
Put the ramp in the existing
minimax-h3referenceplugins/dw/skills/minimax-h3/references/quality-and-speed.mdby expanding its "Draft then final" bullet into a Ramp section. No new skill and no new file. One docs-only stage, built after #861's seed runs.minimax-h3already loads on every H3 request. A measured ladder for a second family would bring the skill back. The family-agnostic half (tier invariants, approval per tier, judging) would then move up intoskills/quality-ramp/, and each family would keep its own ladder.21a6f602) already put these inquality-and-speed.md: all 14 rungs, the speed-lever table, the base-model prompting rules, the composition invariants (attention backend, quantization, LoRA family, base step count), the 12-step floor and "one int8 job at a time". This plan adds only what is missing, and docs: minimax-h3 skill + RECIPES_24GB/ACCELERATION - base-model (no LoRA, int8) quality path and measured speed levers #863 no longer blocks it.series-episodes/references/cinema-path.mdcovers the episode cinema path. docs: series-episodes cinema-path.md repeats its last bullet #880 already removed its duplicate bullet.plan.estimateper configuration) and bug: two int8 H3 jobs on two cards OOM-kill the host - dispatch is VRAM-aware only, and the earlier job was the one killed #869 (host-RAM dispatch) each edit one line of the section when they land. None of them blocks it.Problem and non-goals
Problem. Nothing tells a driving session how to spend GPU time on quality: which tier to draft at, what to approve there, and when to ship the draft. The invariants that keep staging from draft to final now exist, but the process around them does not.
Non-goals:
Design
Where it lives. Expand the "Draft then final" bullet (
quality-and-speed.md:42) into a## Rampsection. The section holds only what the file lacks. It refers to the existing invariants and ladder instead of restating them:Pick the path by target before the first render.
first_block0.05, ~23.1 min), reachable only through a saved copy of the template withcacheadded (save_workflow) until feature: H3 templates - expose attention_backend + cache everywhere, and a quality tier preset that sets the coupled knobs together #865 lands.sage_hubis an argument only onvideo-with-audio,video-with-audio-768p,image-to-videoandreference-to-video. On other templates it takes the same JSON edit.Carryover. One line pointing at the file's existing invariants, plus the two the file lacks: keep the seed, canvas and prompt the same; blocking carries but props sometimes don't. Each carryover claim states the seed count that H3 quality ramp: follow-up experiments (seed stability, cross-family composition lock, int4 base draft) #861 measured.
What to approve at each tier. At the draft: blocking, line delivery, timing and head count. At the final: faces, skin and hair. Re-roll seeds and prompts only at the draft.
How to judge.
get_output_frames);check-scriptfor lines;set_note.The section also says what Claude can't judge: audio by ear, and motion (smear or flicker) in playback.
Cost quoting. Quote
plan.estimateonce plan.estimate prices every H3 variant at the catalog figure - measured range is 3.5-44 min #866 lands. Until then, quote the ladder in this file.Wiring.
minimax-h3/SKILL.mdis at 12,282 of 12,288 bytes, so it gets no new pointer line. Instead, reword the existingSmeary faces: int8 base model, references/quality-and-speed.md.line (:100) to cover quality tiers (draft → final), keeping the file under the cap. If more room is needed, the :173 "block cache makes later steps uneven" line can be trimmed.script-to-video/SKILL.md(8,143 bytes) gets a one-line pointer for H3 shots in its test-render-then-set_notepassage.No pin test. The numbers and the advice live in the same file, so there is no second source for them to drift from.
Surfaces touched: plugin docs only, plus the plugin version bump. Nothing in the engine, MCP, REST, syntax or security.
Stages
Stage 1: H3 quality-ramp section
## Rampsection inquality-and-speed.md;minimax-h3/SKILL.md;script-to-video/SKILL.md.tests/test_plugin_skills.pystay green: quoted template names resolve, reference links match the files, and SKILL.md files stay under 12,288 bytes.templates/minimax/reference-to-videoordialogue-short). Check thatvalidate_workflowreturns clean for each.cachefor P1. The seed, prompt, canvas and LoRA family stay the same.attention_backend, check that passing it is refused or warned as unknown, which shows the "edit the JSON" line is needed. Then check that a saved copy withcacheadded validates clean.validate_workflowwarnslora_disabled(dw/adapter_compatibility.py), and the section's base rung names the values that clear the warning.pytest tests/test_plugin_skills.pypasses.Order: #861 → stage 1.
Risks
Decisions (Don's review of v1)
quality-and-speed.md, not a new file or skill.plan.estimateonce plan.estimate prices every H3 variant at the catalog figure - measured range is 3.5-44 min #866 lands, and the ladder until then.dkackman commentedon Oct 14, 2026
Review of plan v1: approve the direction (a reference under
minimax-h3, not a new skill), but rebase it as v2. Plan v1 was written against61838a9c. #863 and #864 then landed in21a6f602in a different shape than the plan assumes.What #863 actually landed
plugins/dw/skills/minimax-h3/references/quality-and-speed.md. RECIPES only had itsfirst_blockrow rewritten. The plan's "one owner for the numbers" and its pin test both point at RECIPES, where there is now nothing to pin.checkpoints-and-loras.md:9,RECIPES:119and the undocumented base-model facts are all fixed. Correction 2 (CUDA-only numbers) is stated in the new reference's header.quality-and-speed.mdalready has a "Draft then final" bullet, the composition invariants (attention backend, quantization, LoRA family, base step count), the 12-step floor and "one int8 job at a time".series-episodes/references/cinema-path.mdcovers the episode cinema path.What v2 should build
quality-and-speed.mdinto a Ramp section holding only what's missing:check-script, aset_notescore, and what Claude can't judge);minimax-h3/SKILL.mdis at 12,282 of 12,288 bytes. Don't add a pointer line. Reword the existing "Smeary faces: int8 base model,references/quality-and-speed.md" line to cover quality tiers, keeping the byte count the same. The :173 "block cache makes later steps uneven" trim is still available if more room is needed.script-to-videopointer (8,143 bytes, so it has room).cinema-path.md. It ends with the "choose the path once, at episode 1" bullet twice.An error in the design: the TV path changes the canvas
"Draft L0, final L7" goes from 960x544 to 1344x768, but section 2 says the canvas must stay the same. The measured carryover is only L1 = L7 (same canvas, quantization only). The reference also says to render two-character shots at 1344x768 from the start. So either:
The cinema path (B3 → L5/P1) is consistent.
Questions
quality-and-speed.md.cinema-path.mdcover sessions in the meantime. If it's wanted sooner, the path, approval and judging parts don't depend on seeds.plan.estimateonce plan.estimate prices every H3 variant at the catalog figure - measured range is 3.5-44 min #866 lands, and the ladder until then.The
lora_disabledacceptance case holds:validate_workflowreports that warning (dw/adapter_compatibility.py).claude-opus-5-5 / anthropic, for Don
dkackman commentedon Oct 14, 2026
Correction to the comment above: #880 (
c1b0d2da) already removed the duplicate bullet incinema-path.md, so take that item off v2. claude-opus-5-5 / anthropic, for Dondkackman commentedon Oct 14, 2026
Plan v2: changed since v1 — claude-opus-5-5 / anthropic
This records Don's review of v1 (and the #880 correction). No scope was added: the stage got smaller.
## Rampsection that expands the "Draft then final" bullet in the existingminimax-h3/references/quality-and-speed.md, where docs: minimax-h3 skill + RECIPES_24GB/ACCELERATION - base-model (no LoRA, int8) quality path and measured speed levers #863 already put the ladder and invariants. There is no newquality-ramp.md.minimax-h3/SKILL.md: no new pointer line. The existing "Smeary faces" line is reworded instead, because the file is at 12,282 of 12,288 bytes.plan.estimateonce plan.estimate prices every H3 variant at the catalog figure - measured range is 3.5-44 min #866 lands; Q4 L7 ships with the "not confirmed by ear or in playback" caveat.10 remaining items
dkackman commentedon Oct 14, 2026
Moved to lem's loop (Don's call): this feature's spec and verification run MiniMax H3, which can't load on mini-ai (64 GB unified memory, no SDNQ on mps). Claim swapped
target:mini-ai→target:lemandbackend:cudaadded so the Mac loop doesn't claim it back. Stages read the parent's claim and backend. The existing spec cases stand.dkackman commentedon Oct 15, 2026
Updated the body with the 2026-10-15 results from #861 and #875. All verdicts are Don's; the timings come from the lem batch.
num_inference_steps: 29on a 30-step call).Artifacts:
~/testing/opus/known-issues/quality/JUDGE-2026-10-15.md(Mac), with contact sheets and face grids underquality/seeds/sheets/. #882 can now state its carryover claims with seed counts. claude-opus-5-5 / anthropic, for Dondkackman commentedon Oct 15, 2026
Correction to plan v2 for #882's build (Don). Plan v2's TV-path sentence "An L0 render (960x544) is a throwaway sketch. Its staging does not carry to a 1344x768 final" is superseded by #861: L0→L7 staging holds on 3 of 3 seeds, but L0 smears faces. So L0 is still a throwaway sketch, for blocking only, and no face is approved on it. Don't write that its staging won't carry. The TV path stays L1→L7, and two-character shots are still rendered at 1344x768 from the start. Spec case C-F414 was amended to match (dkackman/harnest#127, harnest 3a211ed). claude-opus-5-5 / anthropic, for Don
Merge docs/862-quality-ramp-closeout (#862)
dkackman commentedon Oct 15, 2026
Close-out: built, handing to the tester for the feature's last check. claude-opus-5-5 / anthropic, lead
Closed: #882 (stage 1, the
## Rampsection inminimax-h3/references/quality-and-speed.md), verified on lem with 1 bounce (thedialogue-short124-frameshotsfix,6834d687).Design record:
docs/proposals/complete/h3-quality-ramp-complete.md, plus thetodo.mdShipped entry. Commit6deed463, merged todevelop@7b72a7de. Docs only, no deploy.Deferred and recorded there: making MagCache M2 (0.06, Don's choice from #875/#927) the cinema-final cache in the section, and clearing the file's stale closing "Open:" line. The section still names P1 (
first_block0.05). That's a follow-up edit with its own check, not part of this close-out.verify: run every case whose
source:names one of this feature's stages, and close the parent if they all pass.dkackman commentedon Oct 15, 2026
Verified on lem (develop @ 7b72a7d): the feature parent's last check. All six cases from stage #882 pass. claude-opus-5-5 / anthropic, tester
The section I read is
## Rampinminimax-h3/references/quality-and-speed.md, from the plugin tree atorigin/develop. I ran every validate call below in workspaceregression-complete.lightx2v/Minimax-h3-Turbo/minimax_h3_ref2v_turbo_4step_v0.1_bf16.safetensors, 5 steps, shift 12/3, int4→int8. L7 is marked "not confirmed by ear or in playback".lora_model_name: null, 12 steps. L5 is the same at 30. P1 is L5 plus the template'scacheargument{"type":"first_block","threshold":0.05}, with no saved copy.sage_hub: the section says it is an argument on every H3 template,dialogue-shortincluded. That matches the catalog: all 17templates/minimax/*inlist_workflows(shape="shot")listattention_backend, and so doesget_workflow("templates/minimax/dialogue-short", variables_only=true).get_output_framescrops, a contact sheet,check-script, aset_note1-5 score, and that audio and motion can't be judged. For cost, it says to quoteplan.estimate, or the ladder whenlow_confidencenamesweights_dtype,attention_backendorcache. Timings are given as "~N min".script-to-video/SKILL.md:81points at Ramp for H3 shots.reference-to-video(priya portrait and voice, seed 42), L1, L7 and L0 (960x544) each returnvalid: truewith no warnings. L1 and L7 differ only inweights_dtype. There's nolora_disabledwarning on either. On L7,plan.estimatehaslow_confidence: truewithdiffers: ["weights_dtype"], as the Cost subsection says.dialogue-short, B3 (12 steps) and L5 (30 steps) both returnvalid: true, with only the null-LoRA warning on each shot. I passed the section's 124-frameshots(tagat 124) to both, and the two sets differ only in steps.attention_backend: "sage_hub"pluscache: {"type":"first_block","threshold":0.05}returnsvalid: true, and both appear inchecked_arguments. No saved copy was needed. I sent both arguments in one call rather than two. Each was accepted and neither drew an error.lora_model_name: nulland shift 12/3, all of 9, 12 and 30 steps arevalid: true. Each carries the warning "this lora's model_name is null … raise them to the base model's schedule too". The section says "Both tiers warnlora_disabled. That is expected", so it doesn't claim the warning clears.reference-to-video(L1 set) and ondialogue-short, atarguments.width, with "must be 32 * n + 0". Ondialogue-shortI sent the base set at 9 steps rather than B3's 12. The width check doesn't depend on steps. No base rung in the section is under 12 steps.No case carried a
pending:line, so I made no suite edit.Not part of these cases:
host_memory.projected_mbis 125050 for the int8dialogue-shortsets, which is about the whole 125 GB box. That fits the section's one-int8-job-at-a-time advice.