Closes the >= 2-LoRA e2e gap left after Task 5 (single-active-LoRA was
already covered by TestSingleLoraVirtualPath): two rank-4 adapters on the
same 16x16 layer key at loader strengths 1.0 / 0.7, captured off a fake
ModelPatcher chain and driven through execute_inline into the REAL
optimize_merge (Pass 1 conflict analysis + Pass 2 group merge on virtual
items).
- Numeric golden: with a weighted_sum override via an advanced Settings
dict (the node's supported surface for engine kwargs — execute_inline
deliberately forwards no loose kwargs), the applied patch is verified
exactly equal to 1.0*(upA@downA) + 0.7*(upB@downB); also asserts the
fingerprint report, add_patches on a clone (returned model IS that
clone), and the untouched original chain entries on the input model.
- Conflict e2e: deliberately near-antiparallel up/down matrices exercise
the per_prefix conflict-analysis path; asserts completion, finite
nonzero merged patch, fingerprints.
- Test-only refactor: extracted TestSingleLoraVirtualPath's fake-model
threading into a shared _pipeline_model helper and fixed its clone
fidelity (clones now copy the CURRENT patch lists, like the real
ModelPatcher.clone, so a clone of the stripped clone stays stripped).
- _adapter now accepts explicit up/down matrices for deterministic diffs.
No engine changes were needed — the virtual-item pipeline handled the
multi-LoRA path as-is. Determinism knobs (cache_patches/patch_compression
disabled, CPU SVD) ride through the existing settings delegation.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>