Files
ethanfel-ComfyUI-LoRA-Optim…/assets/timeline.svg
T
EthanfelandClaude Opus 4.6 4ae79d0c9e docs: add v2 workflow, rename Legacy, update wiki for Settings nodes
- Add example_workflows/LoRa Optimizer v2.json for the new node layout
- Rename LoRA Optimizer (Advanced) → (Legacy) across all wiki pages
- Document Settings nodes (Merge, Optimizer, AutoTuner) in Nodes.md
- Add Settings and Compatibility Analyzer workflows to Workflows.md
- Add decision_smoothing, smooth_slerp_gate, scoring_speed/formula,
  and Settings node architecture to Configuration-Guide.md
- Update How-It-Works.md node registry and variant descriptions
- Rename patch_compression non_ties → smart in all references
- Update Home.md feature table (8 architectures, settings nodes)
- Add zit_example_1.png asset
- Update SVG assets (timeline, pipeline, bridge, ties, merge-use-cases)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 22:56:19 +01:00

314 lines
25 KiB
XML

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 2280" width="720" height="2280">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#0f172a"/>
<stop offset="50%" style="stop-color:#1e1b4b"/>
<stop offset="100%" style="stop-color:#0f172a"/>
</linearGradient>
<linearGradient id="line-grad" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" style="stop-color:#e94560"/>
<stop offset="50%" style="stop-color:#a78bfa"/>
<stop offset="100%" style="stop-color:#22c55e"/>
</linearGradient>
<filter id="glow">
<feGaussianBlur stdDeviation="3" result="blur"/>
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
</filter>
<filter id="shadow">
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000" flood-opacity="0.4"/>
</filter>
</defs>
<rect width="720" height="2280" fill="url(#bg)" rx="16"/>
<!-- Title -->
<text x="360" y="44" font-family="Segoe UI, Arial, sans-serif" font-size="26" font-weight="700" fill="#ffffff" text-anchor="middle" letter-spacing="-0.5">LoRA Optimizer</text>
<text x="360" y="64" font-family="Segoe UI, Arial, sans-serif" font-size="11" fill="#94a3b8" text-anchor="middle" letter-spacing="2">DEVELOPMENT TIMELINE</text>
<!-- Central timeline line -->
<line x1="360" y1="84" x2="360" y2="2210" stroke="url(#line-grad)" stroke-width="3" opacity="0.5"/>
<!-- === 1: Initial Release === LEFT -->
<circle cx="360" cy="112" r="8" fill="#e94560" filter="url(#glow)"/>
<circle cx="360" cy="112" r="3" fill="#fff"/>
<rect x="50" y="94" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="112" x2="352" y2="112" stroke="#e94560" stroke-width="2"/>
<text x="64" y="110" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#e94560">Initial Release</text>
<text x="64" y="124" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Basic weighted-sum LoRA merging</text>
<rect x="248" y="98" width="74" height="16" rx="8" fill="#e94560" opacity="0.15"/>
<text x="285" y="110" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#e94560" text-anchor="middle" font-weight="600">v1.0.0</text>
<!-- === 2: LoRA Optimizer Node === RIGHT -->
<circle cx="360" cy="184" r="8" fill="#f59e0b" filter="url(#glow)"/>
<circle cx="360" cy="184" r="3" fill="#fff"/>
<rect x="388" y="164" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="184" x2="388" y2="184" stroke="#f59e0b" stroke-width="2"/>
<text x="402" y="182" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#f59e0b">LoRA Optimizer Node</text>
<text x="402" y="198" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">TIES merging + sign-conflict + auto-strength</text>
<!-- === 3: GPU Acceleration === LEFT -->
<circle cx="360" cy="256" r="8" fill="#c026d3" filter="url(#glow)"/>
<circle cx="360" cy="256" r="3" fill="#fff"/>
<rect x="50" y="238" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="256" x2="352" y2="256" stroke="#c026d3" stroke-width="2"/>
<text x="64" y="254" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#c026d3">GPU Acceleration</text>
<text x="64" y="268" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">CUDA merge + thread-pool parallelization</text>
<rect x="248" y="242" width="74" height="16" rx="8" fill="#c026d3" opacity="0.15"/>
<text x="285" y="254" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c026d3" text-anchor="middle" font-weight="600">PERF</text>
<!-- === 4: Two-Pass Streaming === RIGHT -->
<circle cx="360" cy="328" r="8" fill="#c026d3" filter="url(#glow)"/>
<circle cx="360" cy="328" r="3" fill="#fff"/>
<rect x="388" y="310" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="328" x2="388" y2="328" stroke="#c026d3" stroke-width="2"/>
<text x="402" y="326" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#c026d3">Two-Pass Streaming</text>
<text x="402" y="340" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">~50 GB → ~260 MB. Consumer hardware</text>
<rect x="596" y="314" width="64" height="16" rx="8" fill="#c026d3" opacity="0.15"/>
<text x="628" y="326" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c026d3" text-anchor="middle" font-weight="600">PERF</text>
<!-- === 5: Per-Prefix === LEFT -->
<circle cx="360" cy="400" r="8" fill="#a78bfa" filter="url(#glow)"/>
<circle cx="360" cy="400" r="3" fill="#fff"/>
<rect x="50" y="382" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="400" x2="352" y2="400" stroke="#a78bfa" stroke-width="2"/>
<text x="64" y="398" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#a78bfa">Per-Prefix Adaptive Merge</text>
<text x="64" y="412" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">TIES or weighted sum per layer automatically</text>
<!-- === 6: SVD === RIGHT -->
<circle cx="360" cy="472" r="8" fill="#22c55e" filter="url(#glow)"/>
<circle cx="360" cy="472" r="3" fill="#fff"/>
<rect x="388" y="454" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="472" x2="388" y2="472" stroke="#22c55e" stroke-width="2"/>
<text x="402" y="470" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#22c55e">SVD Patch Compression</text>
<text x="402" y="484" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Low-rank re-compression, up to 128x savings</text>
<!-- === 7: SLERP === LEFT -->
<circle cx="360" cy="544" r="8" fill="#a78bfa" filter="url(#glow)"/>
<circle cx="360" cy="544" r="3" fill="#fff"/>
<rect x="50" y="528" width="282" height="32" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="544" x2="352" y2="544" stroke="#a78bfa" stroke-width="2"/>
<text x="64" y="548" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#a78bfa">SLERP Merge</text>
<text x="185" y="548" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Spherical interpolation for 2 LoRAs</text>
<!-- === 8: Key Normalization === RIGHT -->
<circle cx="360" cy="616" r="8" fill="#64ffda" filter="url(#glow)"/>
<circle cx="360" cy="616" r="3" fill="#fff"/>
<rect x="388" y="596" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="616" x2="388" y2="616" stroke="#64ffda" stroke-width="2"/>
<text x="402" y="614" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#64ffda">Arch-Aware Normalization</text>
<text x="402" y="630" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Cross-trainer — 8 architectures supported</text>
<rect x="596" y="600" width="64" height="16" rx="8" fill="#64ffda" opacity="0.15"/>
<text x="628" y="612" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#64ffda" text-anchor="middle" font-weight="600">COMPAT</text>
<!-- === 9: DARE === LEFT -->
<circle cx="360" cy="688" r="8" fill="#f59e0b" filter="url(#glow)"/>
<circle cx="360" cy="688" r="3" fill="#fff"/>
<rect x="50" y="670" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="688" x2="352" y2="688" stroke="#f59e0b" stroke-width="2"/>
<text x="64" y="686" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#f59e0b">DARE / DELLA Sparsification</text>
<text x="64" y="700" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Weight dropout — conflict-aware variant</text>
<!-- === 10: Save === RIGHT -->
<circle cx="360" cy="760" r="8" fill="#22c55e" filter="url(#glow)"/>
<circle cx="360" cy="760" r="3" fill="#fff"/>
<rect x="388" y="744" width="282" height="32" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="760" x2="388" y2="760" stroke="#22c55e" stroke-width="2"/>
<text x="402" y="764" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#22c55e">Save Merged LoRA</text>
<text x="556" y="764" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Export .safetensors</text>
<!-- === 11: Dynamic Stacker === LEFT -->
<circle cx="360" cy="832" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="832" r="3" fill="#fff"/>
<rect x="50" y="814" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="832" x2="352" y2="832" stroke="#38bdf8" stroke-width="2"/>
<text x="64" y="830" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">Dynamic LoRA Stacker</text>
<text x="64" y="844" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">1-10 slots, simple or advanced CLIP strength</text>
<rect x="248" y="818" width="74" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="285" y="830" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 12: Auto-Strength === RIGHT -->
<circle cx="360" cy="904" r="8" fill="#e94560" filter="url(#glow)"/>
<circle cx="360" cy="904" r="3" fill="#fff"/>
<rect x="388" y="884" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="904" x2="388" y2="904" stroke="#e94560" stroke-width="2"/>
<text x="402" y="902" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#e94560">Interference Auto-Strength</text>
<text x="402" y="918" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Cosine similarity scales per reinforcement</text>
<rect x="596" y="888" width="64" height="16" rx="8" fill="#e94560" opacity="0.15"/>
<text x="628" y="900" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#e94560" text-anchor="middle" font-weight="600">ANALYSIS</text>
<!-- === 13: WanVideo === LEFT -->
<circle cx="360" cy="976" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="976" r="3" fill="#fff"/>
<rect x="50" y="958" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="976" x2="352" y2="976" stroke="#38bdf8" stroke-width="2"/>
<text x="64" y="974" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">WanVideo LoRA Optimizer</text>
<text x="64" y="988" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Full merge pipeline for WanVideo models</text>
<rect x="248" y="962" width="74" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="285" y="974" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 14: Hooks === RIGHT -->
<circle cx="360" cy="1048" r="8" fill="#22c55e" filter="url(#glow)"/>
<circle cx="360" cy="1048" r="3" fill="#fff"/>
<rect x="388" y="1028" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1048" x2="388" y2="1048" stroke="#22c55e" stroke-width="2"/>
<text x="402" y="1046" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#22c55e">Merged LoRA to Hook</text>
<text x="402" y="1062" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Per-conditioning LoRA via ComfyUI hooks</text>
<rect x="596" y="1032" width="64" height="16" rx="8" fill="#22c55e" opacity="0.15"/>
<text x="628" y="1044" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#22c55e" text-anchor="middle" font-weight="600">OUTPUT</text>
<!-- === 15: Text Input === LEFT -->
<circle cx="360" cy="1120" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="1120" r="3" fill="#fff"/>
<rect x="50" y="1102" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1120" x2="352" y2="1120" stroke="#38bdf8" stroke-width="2"/>
<text x="64" y="1118" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">Text Input + Name Resolution</text>
<text x="64" y="1132" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Type short names or connect text nodes</text>
<rect x="248" y="1106" width="74" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="285" y="1118" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 16: Enhanced Merge Quality === RIGHT -->
<circle cx="360" cy="1192" r="8" fill="#a78bfa" filter="url(#glow)"/>
<circle cx="360" cy="1192" r="3" fill="#fff"/>
<rect x="388" y="1172" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1192" x2="388" y2="1192" stroke="#a78bfa" stroke-width="2"/>
<text x="402" y="1190" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#a78bfa">Enhanced Merge Quality</text>
<text x="402" y="1206" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">KnOTS SVD + column-wise + TALL-masks</text>
<rect x="596" y="1176" width="64" height="16" rx="8" fill="#a78bfa" opacity="0.15"/>
<text x="628" y="1188" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#a78bfa" text-anchor="middle" font-weight="600">QUALITY</text>
<!-- === 17: Per-LoRA Key Filter === LEFT -->
<circle cx="360" cy="1264" r="8" fill="#64ffda" filter="url(#glow)"/>
<circle cx="360" cy="1264" r="3" fill="#fff"/>
<rect x="50" y="1246" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1264" x2="352" y2="1264" stroke="#64ffda" stroke-width="2"/>
<text x="64" y="1262" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#64ffda">Per-LoRA Key Filter</text>
<text x="64" y="1276" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Per-slot shared/unique key filtering</text>
<rect x="248" y="1250" width="74" height="16" rx="8" fill="#64ffda" opacity="0.15"/>
<text x="285" y="1262" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#64ffda" text-anchor="middle" font-weight="600">COMPAT</text>
<!-- === 18: LoRA Optimizer Simple === RIGHT -->
<circle cx="360" cy="1336" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="1336" r="3" fill="#fff"/>
<rect x="388" y="1318" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1336" x2="388" y2="1336" stroke="#38bdf8" stroke-width="2"/>
<text x="402" y="1334" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">LoRA Optimizer Simple</text>
<text x="402" y="1348" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Sensible defaults, minimal inputs</text>
<rect x="596" y="1322" width="64" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="628" y="1334" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 19: LoRA AutoTuner === LEFT -->
<circle cx="360" cy="1408" r="8" fill="#e94560" filter="url(#glow)"/>
<circle cx="360" cy="1408" r="3" fill="#fff"/>
<rect x="50" y="1390" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1408" x2="352" y2="1408" stroke="#e94560" stroke-width="2"/>
<text x="64" y="1406" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#e94560">LoRA AutoTuner</text>
<text x="64" y="1420" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Full parameter sweep, ranked candidates</text>
<rect x="248" y="1394" width="74" height="16" rx="8" fill="#e94560" opacity="0.15"/>
<text x="285" y="1406" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#e94560" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 20: Merge Selector + Save/Load === RIGHT -->
<circle cx="360" cy="1480" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="1480" r="3" fill="#fff"/>
<rect x="388" y="1460" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1480" x2="388" y2="1480" stroke="#38bdf8" stroke-width="2"/>
<text x="402" y="1478" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">Merge Selector + Save/Load</text>
<text x="402" y="1494" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Try alternatives, persist tuner results</text>
<rect x="596" y="1464" width="64" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="628" y="1476" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 21: Diff Cache === LEFT -->
<circle cx="360" cy="1552" r="8" fill="#c026d3" filter="url(#glow)"/>
<circle cx="360" cy="1552" r="3" fill="#fff"/>
<rect x="50" y="1534" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1552" x2="352" y2="1552" stroke="#c026d3" stroke-width="2"/>
<text x="64" y="1550" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#c026d3">Diff Cache</text>
<text x="64" y="1564" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Auto/RAM/disk caching for AutoTuner speed</text>
<rect x="248" y="1538" width="74" height="16" rx="8" fill="#c026d3" opacity="0.15"/>
<text x="285" y="1550" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c026d3" text-anchor="middle" font-weight="600">PERF</text>
<!-- === 22: VRAM Budget === RIGHT -->
<circle cx="360" cy="1624" r="8" fill="#22c55e" filter="url(#glow)"/>
<circle cx="360" cy="1624" r="3" fill="#fff"/>
<rect x="388" y="1608" width="282" height="32" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1624" x2="388" y2="1624" stroke="#22c55e" stroke-width="2"/>
<text x="402" y="1628" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#22c55e">VRAM Budget</text>
<text x="536" y="1628" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">GPU patch storage</text>
<rect x="596" y="1612" width="64" height="16" rx="8" fill="#22c55e" opacity="0.15"/>
<text x="628" y="1624" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#22c55e" text-anchor="middle" font-weight="600">OPTIMIZE</text>
<!-- === 23: Consensus Merge === LEFT -->
<circle cx="360" cy="1696" r="8" fill="#a78bfa" filter="url(#glow)"/>
<circle cx="360" cy="1696" r="3" fill="#fff"/>
<rect x="50" y="1678" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1696" x2="352" y2="1696" stroke="#a78bfa" stroke-width="2"/>
<text x="64" y="1694" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#a78bfa">Consensus Merge</text>
<text x="64" y="1708" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Fisher-weighted blend for high-agreement LoRAs</text>
<!-- === 24: Scoring Speed === RIGHT -->
<circle cx="360" cy="1768" r="8" fill="#c026d3" filter="url(#glow)"/>
<circle cx="360" cy="1768" r="3" fill="#fff"/>
<rect x="388" y="1750" width="282" height="36" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1768" x2="388" y2="1768" stroke="#c026d3" stroke-width="2"/>
<text x="402" y="1766" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#c026d3">Scoring Speed</text>
<text x="402" y="1780" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Prefix subsampling: turbo+/turbo/fast/full</text>
<rect x="596" y="1754" width="64" height="16" rx="8" fill="#c026d3" opacity="0.15"/>
<text x="628" y="1766" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#c026d3" text-anchor="middle" font-weight="600">PERF</text>
<!-- === 25: AutoTuner ↔ Optimizer Bridge === LEFT -->
<circle cx="360" cy="1840" r="8" fill="#e94560" filter="url(#glow)"/>
<circle cx="360" cy="1840" r="3" fill="#fff"/>
<rect x="50" y="1820" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1840" x2="352" y2="1840" stroke="#e94560" stroke-width="2"/>
<text x="64" y="1838" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#e94560">AutoTuner ↔ Optimizer Bridge</text>
<text x="64" y="1854" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Dual-switch passthrough, find → tweak</text>
<!-- === 26: Settings Nodes === RIGHT -->
<circle cx="360" cy="1912" r="8" fill="#38bdf8" filter="url(#glow)"/>
<circle cx="360" cy="1912" r="3" fill="#fff"/>
<rect x="388" y="1892" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="1912" x2="388" y2="1912" stroke="#38bdf8" stroke-width="2"/>
<text x="402" y="1910" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#38bdf8">Settings Nodes</text>
<text x="402" y="1926" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Modular config: Merge, Optimizer, AutoTuner</text>
<rect x="596" y="1896" width="64" height="16" rx="8" fill="#38bdf8" opacity="0.15"/>
<text x="628" y="1908" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#38bdf8" text-anchor="middle" font-weight="600">NODE</text>
<!-- === 27: Compatibility Analyzer Node Creation === LEFT -->
<circle cx="360" cy="1984" r="8" fill="#22c55e" filter="url(#glow)"/>
<circle cx="360" cy="1984" r="3" fill="#fff"/>
<rect x="50" y="1964" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="332" y1="1984" x2="352" y2="1984" stroke="#22c55e" stroke-width="2"/>
<text x="64" y="1982" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#22c55e">Analyzer Node Creation</text>
<text x="64" y="1998" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Auto-create LoraLoader &amp; Stack nodes</text>
<rect x="248" y="1968" width="74" height="16" rx="8" fill="#22c55e" opacity="0.15"/>
<text x="285" y="1980" font-family="Segoe UI, Arial, sans-serif" font-size="9" fill="#22c55e" text-anchor="middle" font-weight="600">OUTPUT</text>
<!-- === 28: Legacy Label === RIGHT -->
<circle cx="360" cy="2056" r="8" fill="#64ffda" filter="url(#glow)"/>
<circle cx="360" cy="2056" r="3" fill="#fff"/>
<rect x="388" y="2036" width="282" height="40" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1" filter="url(#shadow)"/>
<line x1="368" y1="2056" x2="388" y2="2056" stroke="#64ffda" stroke-width="2"/>
<text x="402" y="2054" font-family="Segoe UI, Arial, sans-serif" font-size="14" font-weight="700" fill="#64ffda">Advanced → Legacy</text>
<text x="402" y="2070" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Simple + Settings nodes supersede monolith</text>
<!-- End dot -->
<circle cx="360" cy="2132" r="5" fill="#a78bfa" opacity="0.6"/>
<circle cx="360" cy="2132" r="2" fill="#fff" opacity="0.8"/>
<!-- Legend -->
<rect x="80" y="2240" width="560" height="24" rx="12" fill="#0f172a" stroke="#334155" stroke-width="1"/>
<circle cx="115" cy="2252" r="5" fill="#e94560"/>
<text x="125" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Feature</text>
<circle cx="182" cy="2252" r="5" fill="#c026d3"/>
<text x="192" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Perf</text>
<circle cx="228" cy="2252" r="5" fill="#a78bfa"/>
<text x="238" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Strategy</text>
<circle cx="305" cy="2252" r="5" fill="#22c55e"/>
<text x="315" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Optimize</text>
<circle cx="385" cy="2252" r="5" fill="#64ffda"/>
<text x="395" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Compat</text>
<circle cx="455" cy="2252" r="5" fill="#f59e0b"/>
<text x="465" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Preprocess</text>
<circle cx="545" cy="2252" r="5" fill="#38bdf8"/>
<text x="555" y="2256" font-family="Segoe UI, Arial, sans-serif" font-size="10" fill="#94a3b8">Node</text>
</svg>