card_generator_adapter.py had two mismatches with the training notebook:
1. LoRA loading: used pipe.load_lora_weights() (diffusers format) but the
adapter was saved with PEFT's save_pretrained() — keys didn't match,
so no LoRA weights were actually applied. Now uses
PeftModel.from_pretrained() + merge_and_unload().
2. Conditioning: built a natural language prompt, but the LoRA was trained
on json.dumps(meta) serialization. Now uses JSON serialization to match.