Claude
docs(sprint-H.8): cleanup obsolete legacy/shim language in production docstrings
e407ec0 unverified
Raw
History Blame
4.83 kB
"""Détecteurs narratifs — package thématique (chantier 5 post-Sprint 97).
Avant le chantier 5, ce module était un fichier monolithe de 1229 lignes
(``narrative/detectors.py``) contenant 18 détecteurs. Pour aligner la
structure de code avec celle du registre déclaratif (Sprint 29), les
détecteurs ont été regroupés par **famille thématique** :
- :mod:`ranking` — global leader, statistical tie, significant gap,
speed winner, median/mean gap warning (5 détecteurs)
- :mod:`pareto` — Pareto alternative, cost outlier (2 détecteurs)
- :mod:`stratum` — stratum winner / collapse, stratification
recommended (3 détecteurs)
- :mod:`quality` — error profile outlier, LLM hallucination flag,
robustness fragile, confidence warning (4 détecteurs)
- :mod:`history` — engine off baseline, engine unstable, regression
in history (3 détecteurs)
- :mod:`ensemble` — ensemble opportunity (1 détecteur)
Total : 18 détecteurs (≠ "12" mentionné dans CLAUDE.md historique —
le chantier 5 corrige ce comptage).
Rétrocompatibilité absolue
--------------------------
Tous les noms exportés par l'ancien fichier ``detectors.py``
(``detect_*``, ``DETECTORS_BY_TYPE``, ``register_default_detectors``)
restent accessibles via ``from picarones.reports.narrative.detectors
import ...``. Les tests Sprints 20, 23, 29, 36, 44, 46, 73 importent
directement ces noms et continuent à fonctionner sans modification.
L'enregistrement automatique des détecteurs via ``@register_detector``
se fait à l'import de ce package — chaque sous-module est importé ici
en cascade.
"""
from __future__ import annotations
# Imports en cascade des 6 sous-modules : déclenche l'enregistrement
# automatique via les décorateurs ``@register_detector`` au chargement.
from picarones.reports.narrative.detectors.ranking import (
detect_global_leader_cer,
detect_median_mean_gap_warning,
detect_significant_gap,
detect_speed_winner,
detect_statistical_tie,
)
from picarones.reports.narrative.detectors.pareto import (
detect_cost_outlier,
detect_pareto_alternative,
detect_pricing_staleness,
)
from picarones.reports.narrative.detectors.stratum import (
detect_stratification_recommended,
detect_stratum_collapse,
detect_stratum_winner,
)
from picarones.reports.narrative.detectors.quality import (
detect_confidence_warning,
detect_error_profile_outlier,
detect_llm_hallucination_flag,
detect_robustness_fragile,
)
from picarones.reports.narrative.detectors.history import (
detect_engine_off_baseline,
detect_engine_unstable,
detect_importer_fallback,
detect_regression_in_history,
)
from picarones.reports.narrative.detectors.ensemble import (
detect_ensemble_opportunity,
)
# Snapshot du registre + helper d'enregistrement legacy — déplacés
# verbatim depuis l'ancien ``detectors.py`` (lignes 1193-1229).
from picarones.domain.facts import DetectorFn, FactType
from picarones.reports.narrative.registry import (
iter_detectors as _iter_detectors,
populate_detector_registry as _populate_detector_registry,
)
def _build_detectors_by_type() -> dict[FactType, DetectorFn]:
"""Snapshot du registre déclaratif vers un dict ``{type: fn}``."""
return {entry.fact_type: entry.fn for entry in _iter_detectors()}
# Vue figée à l'import — utile pour les tests qui parcourent les types
# enregistrés sans instancier un ``DetectorRegistry``.
DETECTORS_BY_TYPE = _build_detectors_by_type()
def register_default_detectors(registry) -> None:
"""Enregistre les détecteurs du registre déclaratif dans un
``DetectorRegistry`` historique.
Sprint 29 : la source de vérité est maintenant le décorateur
``@register_detector`` ; cette fonction se contente de pousser
le contenu du registre vers l'objet ``DetectorRegistry`` que les
consommateurs externes (``DetectorRegistry.run``) instancient.
"""
_populate_detector_registry(registry)
__all__ = [
# ranking
"detect_global_leader_cer",
"detect_median_mean_gap_warning",
"detect_significant_gap",
"detect_speed_winner",
"detect_statistical_tie",
# pareto
"detect_cost_outlier",
"detect_pareto_alternative",
"detect_pricing_staleness",
# stratum
"detect_stratification_recommended",
"detect_stratum_collapse",
"detect_stratum_winner",
# quality
"detect_confidence_warning",
"detect_error_profile_outlier",
"detect_llm_hallucination_flag",
"detect_robustness_fragile",
# history
"detect_engine_off_baseline",
"detect_engine_unstable",
"detect_importer_fallback",
"detect_regression_in_history",
# ensemble
"detect_ensemble_opportunity",
# legacy
"DETECTORS_BY_TYPE",
"register_default_detectors",
]