- dpo_tokenize now uses tokenizer.apply_chat_template to match SFT format - Prompt rendered with add_generation_prompt=True - Chosen/rejected appended as assistant turn - Remove leftover dead code from _extract_text - Update tests to mock apply_chat_template