Check LoRA-guarded unfusing and split-projection restoration per model
Two gaps the previous commit left at the model level.
Unfusing rewrites the fused weights the same way fusing does, so it refuses an
unmerged adapter for the same reason -- but only the fuse side was covered,
because moving the guard tests into the mixin dropped the unfuse case that
test_attention_mixins.py used to check. It is back, against every model rather
than the two it was hand-written for.
The round trip also never checked what in-place fusion is for: that to_q, to_k
and to_v are actually removed, and that unfusing brings them back. It now maps
each fused projection to the split ones it replaces and asserts, per module,
that in-place fusion removes them, a non-in-place fusion keeps them, and
unfusing restores every one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>