app.py: check the known save path directly instead of parsing stdout
(broken after PR #21 removed the print statement).
card_generator_adapter.py: 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.
Now uses PeftModel.from_pretrained() + merge_and_unload().
2. Conditioning built a natural language prompt, but the LoRA was trained
on json.dumps(meta). Now uses JSON serialization to match.