MiniMax H3 Skin Finish Texture Guard / 肤质纹理保护 (Advanced EXP)
A mechanical guard so your skin finish can't flatten shadows or clip highlights
- source_frames
- candidate_frames
- used_skin_mask
- audio
- guarded_candidate
- source
- selected
- audio
- effective_mask
- rejected_mask
- difference
- report_json
Skin finishing is a smoothing operation, and smoothing has a failure mode: it eats texture. A candidate that looks great in the mid-tones can flatten deep shadows, crush highlights into clipping, and turn fine pores into plastic. MiniMaxH3SkinFinishTextureGuardT8Advanced is the pack's answer - a fail-closed mechanical guard that sits after a skin-finish candidate and catches exactly those regressions, frame by frame, before anything gets accepted.
The author is blunt about what it isn't: not a beauty score, not a semantic parser, not a deblur, not a pore generator. It's a hard retention guard, and that's precisely its value. You append it to the pipeline and let the thresholds do the policing.
How it works
Give it source_frames, candidate_frames and the used_skin_mask, and it checks every masked pixel region against the source:
- Shadow and highlight protection.
shadow_protection(0.10) preserves source luma at or below that value;highlight_protection(0.94) preserves luma at or above it. The finish physically cannot touch your near-black shadow detail or near-clipped highlights. - Clipping gate.
maximum_new_clipped_fraction(0.0005) caps how many masked pixels the candidate may newly clip before the frame falls back to source. - Texture floor.
minimum_texture_ratio(0.78) compares each frame's high-pass RMS against the source. Drop below that relative floor and the frame reverts to source.texture_radius(1) andminimum_reference_texture(0.003) tune how the high-frequency floor is measured.
Any failing frame returns to source. The outputs tell you exactly what happened: guarded_candidate, source, selected, effective_mask, rejected_mask, difference, and report_json. And true to the pack's philosophy, accept_candidate defaults to false - source stays selected until you've reviewed the guarded result.
The author's safe starting points: shadow_protection=0.10, highlight_protection=0.94, minimum_texture_ratio=0.78, maximum_new_clipped_fraction=0.0005. One honest caveat: the high-pass RMS treats noise as texture too, so this guard is best used as a hard floor against over-smoothing, not as a quality meter.
Where it fits
The canonical chain (in examples/workflows/17-skin-finish/2026-08-24_H3_Skin_Finish_Texture_Guard_Advanced_EXP.json) is: Semantic Mask → Skin Finish → Texture Guard → Preview/Audit. Wire the finish node's candidate, source and used_skin_mask in, keep both acceptance switches off, review, then accept.
Install
Standard pack install - ComfyUI Manager, search "MiniMax H3 Audio T8", or:
cd ComfyUI/custom_nodes
git clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8
then restart ComfyUI. No extra pip dependencies, no model files for this one - it's pure CPU signal analysis on frames you already have.
The trap to avoid
Don't use this node as a replacement for actually looking at the output. It's a mechanical interlock, not a quality verdict - a candidate that passes every gate can still be wrong in a way no pixel statistic catches. The pack's own validation is honest: a 0.592 MP × 124-frame run passed the default gates and kept PCM-identical audio, which proves the machinery works, not that your clip is done. Review first, then accept, then finalize.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| source_frames | IMAGE | — | |
| candidate_frames | IMAGE | — | |
| used_skin_mask | MASK | — | |
| shadow_protection | FLOAT | 0.100–0.45 | Source luma at or below this value is preserved. |
| highlight_protection | FLOAT | 0.940.55–1 | Source luma at or above this value is preserved. |
| transition_width | FLOAT | 0.0600.001–0.25 | — |
| minimum_texture_ratio | FLOAT | 0.780–1 | Per-frame high-pass RMS floor relative to source. This is a hard retention guard, not a perceptual quality score. |
| minimum_reference_texture | FLOAT | 0.0030–0.25 | — |
| maximum_new_clipped_fraction | FLOAT | 0.00050–0.25 | Maximum newly clipped masked-pixel fraction before frame fallback. |
| clipping_epsilon | FLOAT | 0.00390.0001–0.05 | — |
| texture_radius | INT | 11–8 | — |
| chunk_frames | INT | 41–32 | — |
| accept_candidate | BOOLEAN | false | Source remains selected until the guarded candidate is reviewed. |
| audioopt | AUDIO | — |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| guarded_candidate | IMAGE | — |
| source | IMAGE | — |
| selected | IMAGE | — |
| audio | AUDIO | — |
| effective_mask | MASK | — |
| rejected_mask | MASK | — |
| difference | IMAGE | — |
| report_json | STRING | — |