# Documentation développeur Picarones Guides courts pour étendre Picarones sans casser les invariants fondamentaux du projet. ## Architecture Voir [CLAUDE.md](../../CLAUDE.md) pour la cartographie complète des modules. En résumé : ``` picarones/ ├── core/ # cœur analytique pur Python │ ├── runner.py # orchestration ThreadPool/ProcessPool │ ├── metrics.py # CER/WER/MER/WIL via jiwer │ ├── statistics.py # Wilcoxon, Friedman, Nemenyi, Pareto │ ├── narrative/ # moteur de synthèse factuelle │ ├── pricing.py # modèle de coût pour la vue Pareto │ └── … ├── engines/ # adaptateurs OCR (Tesseract, Pero, Mistral OCR…) ├── llm/ # adaptateurs LLM (OpenAI, Anthropic, Mistral, Ollama) ├── pipelines/ # OCRLLMPipeline (3 modes) ├── report/ # générateur HTML + templates Jinja2 + i18n + glossaire └── web/ # FastAPI + SPA vanilla JS ``` ## Guides d'extension - [Étendre le moteur narratif](narrative-engine.md) — ajouter un type de fait, ses templates, l'enregistrer dans le registre. - [Étendre le glossaire](extending-glossary.md) — documenter une nouvelle métrique, l'attacher à une colonne. - [Étendre l'i18n](extending-i18n.md) — ajouter une nouvelle langue ou une clé d'interface. ## Invariants à respecter 1. **Pas de LLM dans le chemin critique** du rapport. La synthèse factuelle est rendue par des templates `str.format_map`. Tout LLM au moment de la génération est à proscrire (reproductibilité, coût, dépendance externe). 2. **Pas de prescription dans l'interface**. Le glossaire est factuel (« utilisé historiquement pour X »), pas prescriptif (« à choisir si vous êtes Y »). Le panneau de personnalisation a un warning explicite sur l'absence de pondération universelle. 3. **Toute valeur numérique remontée dans la synthèse doit être traçable au JSON d'entrée**. Le test `test_every_number_in_synthesis_is_traceable` vérifie ce contrat. 4. **Symétrie FR/EN** garantie par les tests. Toute nouvelle clé d'interface ou entrée de glossaire doit exister dans les deux langues. 5. **Déterminisme du rapport** : deux générations sur les mêmes données produisent le même HTML (octet à octet pour la synthèse). Aucun timestamp, ID aléatoire ou ordre non-trié dans le HTML généré. ## Lancer la suite de tests ```bash pip install -e ".[dev,web]" pytest tests/ -q --tb=short ``` À la date du Sprint 21 : **1244 tests passent, 2 sont skip** (dépendance scipy optionnelle). Toute contribution doit conserver le statut "0 failed". ## Démo rapide ```bash picarones demo --output /tmp/demo.html --docs 8 ``` Génère un rapport sur des données fictives. Utile pour vérifier visuellement qu'un nouveau composant s'intègre proprement.