Use running Y offset with per-type spacing: 150px for LoraLoader
nodes, 300px for LoRAStackDynamic nodes. Prevents solo loader
nodes from overlapping each other.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove custom DOM widget for report text — rely on ComfyUI's
built-in ui.text and ui.images rendering instead. JS extension
now only handles node creation/cleanup logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Solo LoRAs now create LoraLoader/LoraLoaderModelOnly nodes (based on CLIP)
- Merge groups continue creating LoRAStackDynamic nodes
- Use original strengths instead of auto-strengths for created nodes
- Add create_nodes toggle to disable automatic node creation
- Move smooth_slerp_gate from AutoTunerSettings to shared MergeSettings
- Add smooth_slerp_gate to main LoRAOptimizer and _SIMPLE_DEFAULTS
- Add decision_smoothing (0.25) to _SIMPLE_DEFAULTS
- Remove output_mode from AutoTunerSettings (hardcode "merge")
- Rewrite all settings node tooltips for clarity
- Update tests for new settings structure
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Three compounding bugs caused saved LoRAs to be 2.3GB (instead of ~350MB) and
produce absurd images:
1. QKV refusion expanded all SVD-compressed LoRAAdapters to full-rank float32
diffs, destroying all compression. SaveMergedLoRA saw 0 low-rank patches.
2. With no surviving LoRAAdapters, auto-rank fell back to 128 — too low for
a merge of two rank-128 LoRAs (needs sum_rank=256), losing ~50% of signal.
3. _compress_to_lowrank returned float32 tensors (SVD needs float32 internally
but never cast back), doubling file size vs expected fp16.
Fixes:
- _compress_to_lowrank now preserves input dtype (also halves merge-time RAM)
- QKV refusion downcasts fused diffs back to original dtype
- Optimizer passes sum_rank in lora_data so SaveMergedLoRA uses correct rank
- SaveMergedLoRA detects native dtype and enforces it on all saved tensors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>