Fase 80.0
sl-cai-critique-cli
Cerrar el gap aguas arriba: reescribir violaciones antes del SFT
Pipeline ya existía en jw_finetune.synth.critique pero sin CLI, sin tests y sin docs. F80.0 cierra el ciclo: el comando build-critique-dataset toma un dataset SFT (ShareGPT), filtra principios por agent_name, ejecuta el tier regex barato, llama al LLM solo cuando hay hard violation, y produce un dataset paralelo con las respuestas revisadas. La respuesta original queda preservada en metadata.original_answer para auditoría. Reduce hard violations en el dataset de entrenamiento del próximo round SFT.
Qué se entregó
- Comando nuevo jw-finetune build-critique-dataset con flags input/output/provider/model/agent/principles/preserve-original.
- Regex tier short-circuit: si no hay match, ningún LLM call (coste cero en corpus limpio).
- Filtrado por applies_to del principio respecto al agent_name.
- Pipeline programático batch_critique(pairs, principles, llm, agent) → (revised_pairs, num_changed).
- self_critique(pair, principles, llm_provider, agent, preserve_original) devuelve CritiqueResult con changed + violated_principle_ids + original_answer.
- 10 tests TDD del módulo + 4 tests CLI dispatch (input missing, output paths, no-principles flag).
- Fallbacks graciosos: LLM error → original intacto, respuesta vacía → original intacto, mismo texto → changed=False.
- Guía docs/guias/sl-cai.md con quickstart y cómo se relaciona con F77 + F78 + F79.