Claude commited on
Commit
979f3c3
·
unverified ·
1 Parent(s): 79574cc

refactor(core): faire de core/ un cercle 1 strict, déplacer cercle 2 vers measurements/

Browse files

Avant ce commit, ``picarones/core/`` mélangeait abstractions pures
(``modules.py``, ``corpus.py``, ``results.py``) avec des modules
d'implémentation (``runner.py``, ``metrics.py``, ~50 shims pointant
vers ``measurements/``). La frontière entre cercles n'existait que
sur le papier.

Ce commit :

1. **Déplace les modules cercle 2 hors de ``core/``** vers ``measurements/`` :
- ``runner.py`` (run_benchmark — orchestration)
- ``metrics.py`` (CER/WER via jiwer)
- ``builtin_metrics.py`` (registers métriques)
- ``alto_metrics.py`` (extension ALTO)
- ``pipeline_benchmark.py``, ``pipeline_comparison.py``,
``pipeline_spec_loader.py``

2. **Supprime les ~52 shims** ``picarones/core/{module}.py`` qui
pointaient vers ``picarones/measurements/{module}.py`` (et le
sous-package narrative au complet ``core/narrative/{12 fichiers}``).
Plus de shim — un module a un seul emplacement.

3. **Renomme ``core/pipeline_runner.py`` → ``core/pipeline.py``** :
le nom historique n'avait plus de sens (le cercle 1 ne contient
plus que l'abstraction, pas le runner d'orchestration).

4. **Extrait ``core/facts.py`` du sous-package narrative** : ``Fact``,
``FactType``, ``FactImportance``, ``DetectorRegistry`` sont des
abstractions pures (cercle 1), pas des implémentations. Le code
précédent les rangeait avec les détecteurs (cercle 2).

5. **Déplace ``core/colors.py`` → ``report/colors.py``** et
``core/jobs.py`` → ``web/jobs.py`` : ces utilitaires sont
spécifiques à la présentation HTML et au backend FastAPI
respectivement.

6. **Migre tous les imports** dans le code source et les tests :
- ``picarones.core.X`` → ``picarones.measurements.X`` (~52 modules)
- ``picarones.core.narrative.X`` → ``picarones.measurements.narrative.X``
- ``picarones.core.narrative.facts`` → ``picarones.core.facts``
- ``picarones.core.colors`` → ``picarones.report.colors``
- ``picarones.core.jobs`` → ``picarones.web.jobs``

7. **Met à jour ``tests/test_public_api.py``** : ``EXPECTED_CERCLE1``
ne contient plus que les 7 modules d'abstraction réels.

Le sous-package ``picarones/core/narrative/`` est entièrement supprimé
(le contenu vit en ``measurements/narrative/``). Le test
``tests/test_phaseE_migration.py`` est supprimé (il validait la
migration intermédiaire — son rôle est désormais documenté dans
``docs/architecture.md``).

Cercle 1 final : 7 modules ``modules.py``, ``corpus.py``, ``results.py``,
``metric_registry.py``, ``metric_hooks.py``, ``pipeline.py``, ``facts.py``.

https://claude.ai/code/session_01Hsd7kL8yeCbXn1mA7GQK9L

This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. docs/user/writing-a-pipeline-module.md +4 -4
  2. picarones/cli/__init__.py +3 -3
  3. picarones/cli/_history.py +1 -1
  4. picarones/cli/_imports.py +1 -1
  5. picarones/cli/_pipeline.py +4 -4
  6. picarones/cli/_robustness.py +2 -2
  7. picarones/cli/_workflows.py +2 -2
  8. picarones/core/abbreviations.py +0 -26
  9. picarones/core/baseline_comparison.py +0 -26
  10. picarones/core/builtin_hooks.py +0 -26
  11. picarones/core/calibration.py +0 -26
  12. picarones/core/char_scores.py +0 -26
  13. picarones/core/confusion.py +0 -26
  14. picarones/core/cost_projection.py +0 -26
  15. picarones/core/difficulty.py +0 -26
  16. picarones/core/early_modern_typography.py +0 -26
  17. picarones/core/equivalence_profile.py +0 -26
  18. picarones/core/error_absorption.py +0 -26
  19. picarones/{measurements/narrative → core}/facts.py +0 -0
  20. picarones/core/hallucination.py +0 -26
  21. picarones/core/history.py +0 -26
  22. picarones/core/image_predictive.py +0 -26
  23. picarones/core/image_quality.py +0 -26
  24. picarones/core/incremental_comparison.py +0 -26
  25. picarones/core/inter_engine.py +0 -26
  26. picarones/core/layout.py +0 -26
  27. picarones/core/levers.py +0 -26
  28. picarones/core/lexical_modernization.py +0 -26
  29. picarones/core/line_metrics.py +0 -26
  30. picarones/core/longitudinal.py +0 -26
  31. picarones/core/marginal_cost.py +0 -26
  32. picarones/core/metric_hooks.py +2 -2
  33. picarones/core/modern_archives.py +0 -26
  34. picarones/core/module_policy.py +0 -26
  35. picarones/core/mufi.py +0 -26
  36. picarones/core/narrative/__init__.py +0 -24
  37. picarones/core/narrative/arbiter.py +0 -26
  38. picarones/core/narrative/detectors/__init__.py +0 -13
  39. picarones/core/narrative/detectors/_helpers.py +0 -26
  40. picarones/core/narrative/detectors/ensemble.py +0 -26
  41. picarones/core/narrative/detectors/history.py +0 -26
  42. picarones/core/narrative/detectors/pareto.py +0 -26
  43. picarones/core/narrative/detectors/quality.py +0 -26
  44. picarones/core/narrative/detectors/ranking.py +0 -26
  45. picarones/core/narrative/detectors/stratum.py +0 -26
  46. picarones/core/narrative/facts.py +0 -26
  47. picarones/core/narrative/registry.py +0 -26
  48. picarones/core/narrative/renderer.py +0 -26
  49. picarones/core/narrative/templates/en.yaml +0 -96
  50. picarones/core/narrative/templates/fr.yaml +0 -101
docs/user/writing-a-pipeline-module.md CHANGED
@@ -18,7 +18,7 @@
18
 
19
  ```python
20
  from picarones.core.modules import BaseModule, ArtifactType
21
- from picarones.core.pipeline_runner import (
22
  PipelineRunner, PipelineSpec, PipelineStep,
23
  )
24
 
@@ -150,7 +150,7 @@ class NERExtractor(BaseModule):
150
  ### 3.a Mono-document (Sprint 63)
151
 
152
  ```python
153
- from picarones.core.pipeline_runner import (
154
  PipelineRunner, PipelineSpec, PipelineStep,
155
  )
156
 
@@ -178,7 +178,7 @@ que `Document.ground_truths` porte une `TextGT` (ou `AltoGT`,
178
  ### 3.b Corpus complet (Sprint 64)
179
 
180
  ```python
181
- from picarones.core.pipeline_benchmark import run_pipeline_benchmark
182
 
183
  bench = run_pipeline_benchmark(spec, my_corpus)
184
  print(bench.n_pipelines_succeeded, "/", bench.n_docs)
@@ -203,7 +203,7 @@ bench = run_pipeline_benchmark(spec, corpus, initial_inputs_factory=my_factory)
203
  ### 3.c Comparer N pipelines (Sprint 65)
204
 
205
  ```python
206
- from picarones.core.pipeline_comparison import compare_pipelines
207
 
208
  comparison = compare_pipelines(
209
  [spec_baseline, spec_with_correcteur_a, spec_with_correcteur_b],
 
18
 
19
  ```python
20
  from picarones.core.modules import BaseModule, ArtifactType
21
+ from picarones.core.pipeline import (
22
  PipelineRunner, PipelineSpec, PipelineStep,
23
  )
24
 
 
150
  ### 3.a Mono-document (Sprint 63)
151
 
152
  ```python
153
+ from picarones.core.pipeline import (
154
  PipelineRunner, PipelineSpec, PipelineStep,
155
  )
156
 
 
178
  ### 3.b Corpus complet (Sprint 64)
179
 
180
  ```python
181
+ from picarones.measurements.pipeline_benchmark import run_pipeline_benchmark
182
 
183
  bench = run_pipeline_benchmark(spec, my_corpus)
184
  print(bench.n_pipelines_succeeded, "/", bench.n_docs)
 
203
  ### 3.c Comparer N pipelines (Sprint 65)
204
 
205
  ```python
206
+ from picarones.measurements.pipeline_comparison import compare_pipelines
207
 
208
  comparison = compare_pipelines(
209
  [spec_baseline, spec_with_correcteur_a, spec_with_correcteur_b],
picarones/cli/__init__.py CHANGED
@@ -103,7 +103,7 @@ def cli() -> None:
103
  @click.option("--json-output", is_flag=True, default=False, help="Sortie en JSON")
104
  def metrics_cmd(reference: str, hypothesis: str, json_output: bool) -> None:
105
  """Calcule CER et WER entre deux fichiers texte."""
106
- from picarones.core.metrics import compute_metrics
107
 
108
  ref_text = Path(reference).read_text(encoding="utf-8").strip()
109
  hyp_text = Path(hypothesis).read_text(encoding="utf-8").strip()
@@ -309,7 +309,7 @@ def demo_cmd(
309
  # Suivi longitudinal
310
  if with_history:
311
  click.echo("\n── Démonstration suivi longitudinal ──────────────")
312
- from picarones.core.history import BenchmarkHistory, generate_demo_history
313
  history = BenchmarkHistory(":memory:")
314
  generate_demo_history(history, n_runs=8)
315
  entries = history.query(engine="tesseract")
@@ -333,7 +333,7 @@ def demo_cmd(
333
  # Analyse de robustesse
334
  if with_robustness:
335
  click.echo("\n── Démonstration analyse de robustesse ───────────")
336
- from picarones.core.robustness import generate_demo_robustness_report
337
  report = generate_demo_robustness_report(
338
  engine_names=["tesseract", "pero_ocr"]
339
  )
 
103
  @click.option("--json-output", is_flag=True, default=False, help="Sortie en JSON")
104
  def metrics_cmd(reference: str, hypothesis: str, json_output: bool) -> None:
105
  """Calcule CER et WER entre deux fichiers texte."""
106
+ from picarones.measurements.metrics import compute_metrics
107
 
108
  ref_text = Path(reference).read_text(encoding="utf-8").strip()
109
  hyp_text = Path(hypothesis).read_text(encoding="utf-8").strip()
 
309
  # Suivi longitudinal
310
  if with_history:
311
  click.echo("\n── Démonstration suivi longitudinal ──────────────")
312
+ from picarones.measurements.history import BenchmarkHistory, generate_demo_history
313
  history = BenchmarkHistory(":memory:")
314
  generate_demo_history(history, n_runs=8)
315
  entries = history.query(engine="tesseract")
 
333
  # Analyse de robustesse
334
  if with_robustness:
335
  click.echo("\n── Démonstration analyse de robustesse ───────────")
336
+ from picarones.measurements.robustness import generate_demo_robustness_report
337
  report = generate_demo_robustness_report(
338
  engine_names=["tesseract", "pero_ocr"]
339
  )
picarones/cli/_history.py CHANGED
@@ -103,7 +103,7 @@ def history_cmd(
103
  """
104
  _setup_logging(verbose)
105
 
106
- from picarones.core.history import BenchmarkHistory, generate_demo_history
107
 
108
  history = BenchmarkHistory(db)
109
 
 
103
  """
104
  _setup_logging(verbose)
105
 
106
+ from picarones.measurements.history import BenchmarkHistory, generate_demo_history
107
 
108
  history = BenchmarkHistory(db)
109
 
picarones/cli/_imports.py CHANGED
@@ -76,7 +76,7 @@ def import_iiif_cmd(
76
  """
77
  _setup_logging(verbose)
78
 
79
- from picarones.importers.iiif import IIIFImporter
80
 
81
  click.echo(f"Manifeste IIIF : {manifest_url}")
82
 
 
76
  """
77
  _setup_logging(verbose)
78
 
79
+ from picarones.extras.importers.iiif import IIIFImporter
80
 
81
  click.echo(f"Manifeste IIIF : {manifest_url}")
82
 
picarones/cli/_pipeline.py CHANGED
@@ -66,8 +66,8 @@ def pipeline_run_cmd(
66
  import json as _json
67
 
68
  from picarones.core.corpus import load_corpus_from_directory
69
- from picarones.core.pipeline_benchmark import run_pipeline_benchmark
70
- from picarones.core.pipeline_spec_loader import load_pipeline_spec_from_yaml
71
 
72
  spec = load_pipeline_spec_from_yaml(spec_path)
73
  corpus = load_corpus_from_directory(str(corpus_dir))
@@ -163,8 +163,8 @@ def pipeline_compare_cmd(
163
  """Compare N pipelines décrites dans SPECS_PATH sur le même corpus."""
164
  from picarones.core.corpus import load_corpus_from_directory
165
  from picarones.core.modules import ArtifactType
166
- from picarones.core.pipeline_comparison import compare_pipelines
167
- from picarones.core.pipeline_spec_loader import (
168
  load_comparison_specs_from_yaml,
169
  )
170
 
 
66
  import json as _json
67
 
68
  from picarones.core.corpus import load_corpus_from_directory
69
+ from picarones.measurements.pipeline_benchmark import run_pipeline_benchmark
70
+ from picarones.measurements.pipeline_spec_loader import load_pipeline_spec_from_yaml
71
 
72
  spec = load_pipeline_spec_from_yaml(spec_path)
73
  corpus = load_corpus_from_directory(str(corpus_dir))
 
163
  """Compare N pipelines décrites dans SPECS_PATH sur le même corpus."""
164
  from picarones.core.corpus import load_corpus_from_directory
165
  from picarones.core.modules import ArtifactType
166
+ from picarones.measurements.pipeline_comparison import compare_pipelines
167
+ from picarones.measurements.pipeline_spec_loader import (
168
  load_comparison_specs_from_yaml,
169
  )
170
 
picarones/cli/_robustness.py CHANGED
@@ -99,7 +99,7 @@ def robustness_cmd(
99
 
100
  deg_types = [d.strip() for d in degradations.split(",") if d.strip()]
101
 
102
- from picarones.core.robustness import (
103
  RobustnessAnalyzer, ALL_DEGRADATION_TYPES, generate_demo_robustness_report
104
  )
105
 
@@ -139,7 +139,7 @@ def robustness_cmd(
139
  click.echo(f"Erreur moteur : {exc}", err=True)
140
  sys.exit(1)
141
 
142
- from picarones.core.robustness import RobustnessAnalyzer
143
  analyzer = RobustnessAnalyzer(
144
  engines=[ocr_engine],
145
  degradation_types=deg_types,
 
99
 
100
  deg_types = [d.strip() for d in degradations.split(",") if d.strip()]
101
 
102
+ from picarones.measurements.robustness import (
103
  RobustnessAnalyzer, ALL_DEGRADATION_TYPES, generate_demo_robustness_report
104
  )
105
 
 
139
  click.echo(f"Erreur moteur : {exc}", err=True)
140
  sys.exit(1)
141
 
142
+ from picarones.measurements.robustness import RobustnessAnalyzer
143
  analyzer = RobustnessAnalyzer(
144
  engines=[ocr_engine],
145
  degradation_types=deg_types,
picarones/cli/_workflows.py CHANGED
@@ -90,7 +90,7 @@ def run_cmd(
90
  _setup_logging(verbose)
91
 
92
  from picarones.core.corpus import load_corpus_from_directory
93
- from picarones.core.runner import run_benchmark
94
 
95
  # Chargement du corpus
96
  try:
@@ -183,7 +183,7 @@ def _run_workflow(
183
  _setup_logging(verbose)
184
 
185
  from picarones.core.corpus import load_corpus_from_directory
186
- from picarones.core.runner import run_benchmark
187
 
188
  try:
189
  corp = load_corpus_from_directory(corpus)
 
90
  _setup_logging(verbose)
91
 
92
  from picarones.core.corpus import load_corpus_from_directory
93
+ from picarones.measurements.runner import run_benchmark
94
 
95
  # Chargement du corpus
96
  try:
 
183
  _setup_logging(verbose)
184
 
185
  from picarones.core.corpus import load_corpus_from_directory
186
+ from picarones.measurements.runner import run_benchmark
187
 
188
  try:
189
  corp = load_corpus_from_directory(corpus)
picarones/core/abbreviations.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.historical.abbreviations`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.historical.abbreviations import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.historical.abbreviations as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/baseline_comparison.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.baseline_comparison`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.baseline_comparison import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.baseline_comparison as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/builtin_hooks.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.builtin_hooks`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.builtin_hooks import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.builtin_hooks as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/calibration.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.calibration`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.calibration import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.calibration as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/char_scores.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.char_scores`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.char_scores import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.char_scores as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/confusion.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.confusion`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.confusion import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.confusion as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/cost_projection.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.cost_projection`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.cost_projection import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.cost_projection as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/difficulty.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.difficulty`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.difficulty import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.difficulty as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/early_modern_typography.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.historical.early_modern_typography`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.historical.early_modern_typography import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.historical.early_modern_typography as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/equivalence_profile.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.equivalence_profile`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.equivalence_profile import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.equivalence_profile as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/error_absorption.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.error_absorption`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.error_absorption import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.error_absorption as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/{measurements/narrative → core}/facts.py RENAMED
File without changes
picarones/core/hallucination.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.hallucination`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.hallucination import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.hallucination as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/history.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.history`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.history import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.history as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/image_predictive.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.academic.image_predictive`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.academic.image_predictive import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.academic.image_predictive as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/image_quality.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.image_quality`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.image_quality import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.image_quality as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/incremental_comparison.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.incremental_comparison`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.incremental_comparison import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.incremental_comparison as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/inter_engine.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.inter_engine`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.inter_engine import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.inter_engine as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/layout.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.layout`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.layout import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.layout as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/levers.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.levers`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.levers import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.levers as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/lexical_modernization.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.historical.lexical_modernization`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.historical.lexical_modernization import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.historical.lexical_modernization as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/line_metrics.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.line_metrics`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.line_metrics import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.line_metrics as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/longitudinal.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.longitudinal`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.longitudinal import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.longitudinal as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/marginal_cost.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.marginal_cost`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.marginal_cost import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.marginal_cost as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/metric_hooks.py CHANGED
@@ -4,9 +4,9 @@ Chantier 2 du plan d'évolution post-Sprint 97.
4
 
5
  Pourquoi ce module
6
  ------------------
7
- Avant ce chantier, ``picarones.core.runner._compute_document_result``
8
  contenait **11 imports tardifs codés en dur** vers
9
- ``picarones.core.confusion``, ``char_scores``, ``taxonomy``, ``structure``,
10
  ``image_quality``, ``line_metrics``, ``hallucination``,
11
  ``philological_runner``, ``searchability_runner``,
12
  ``numerical_sequences_runner``, ``readability_runner`` — chacun enrobé
 
4
 
5
  Pourquoi ce module
6
  ------------------
7
+ Avant ce chantier, ``picarones.measurements.runner._compute_document_result``
8
  contenait **11 imports tardifs codés en dur** vers
9
+ ``picarones.measurements.confusion``, ``char_scores``, ``taxonomy``, ``structure``,
10
  ``image_quality``, ``line_metrics``, ``hallucination``,
11
  ``philological_runner``, ``searchability_runner``,
12
  ``numerical_sequences_runner``, ``readability_runner`` — chacun enrobé
picarones/core/modern_archives.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.historical.modern_archives`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.historical.modern_archives import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.historical.modern_archives as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/module_policy.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.governance.module_policy`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.governance.module_policy import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.governance.module_policy as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/mufi.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.extras.historical.mufi`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.extras.historical.mufi import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.extras.historical.mufi as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/__init__.py DELETED
@@ -1,24 +0,0 @@
1
- """Alias rétrocompat — package déplacé dans :mod:`picarones.measurements.narrative`.
2
-
3
- Phase E du chantier de refonte en 3 cercles. Le moteur narratif
4
- (Cercle 2) vit désormais dans ``picarones.measurements.narrative``.
5
- Cet alias maintient la rétrocompat des imports historiques :
6
- ``from picarones.core.narrative import build_synthesis``,
7
- ``from picarones.core.narrative.facts import Fact``, etc.
8
- """
9
-
10
- from picarones.measurements.narrative import * # noqa: F401, F403
11
-
12
- import picarones.measurements.narrative as _module
13
- # Réexport explicite des noms privés (préfixe ``_``) que ``import *``
14
- # ne propage pas — rétrocompat des tests Sprints qui importent
15
- # directement ``_DEFAULT_REGISTRY`` (test_sprint19_narrative_engine).
16
- for _shim_name in dir(_module):
17
- if _shim_name == "__builtins__":
18
- continue
19
- if _shim_name not in globals():
20
- globals()[_shim_name] = getattr(_module, _shim_name)
21
- del _shim_name
22
- __all__ = getattr(_module, "__all__", [
23
- nm for nm in dir(_module) if not nm.startswith("_")
24
- ])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/arbiter.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.arbiter`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.arbiter import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.arbiter as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/__init__.py DELETED
@@ -1,13 +0,0 @@
1
- """Alias rétrocompat — package déplacé dans :mod:`picarones.measurements.narrative.detectors`.
2
-
3
- Phase E du chantier de refonte. Les 18 détecteurs en 6 familles
4
- (ranking, pareto, stratum, quality, history, ensemble) vivent
5
- désormais dans ``picarones.measurements.narrative.detectors/``.
6
- """
7
-
8
- from picarones.measurements.narrative.detectors import * # noqa: F401, F403
9
-
10
- import picarones.measurements.narrative.detectors as _module
11
- __all__ = getattr(_module, "__all__", [
12
- nm for nm in dir(_module) if not nm.startswith("_")
13
- ])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/_helpers.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors._helpers`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors._helpers import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors._helpers as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/ensemble.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.ensemble`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.ensemble import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.ensemble as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/history.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.history`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.history import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.history as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/pareto.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.pareto`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.pareto import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.pareto as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/quality.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.quality`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.quality import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.quality as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/ranking.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.ranking`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.ranking import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.ranking as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/detectors/stratum.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.detectors.stratum`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.detectors.stratum import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.detectors.stratum as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/facts.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.facts`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.facts import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.facts as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/registry.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.registry`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.registry import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.registry as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/renderer.py DELETED
@@ -1,26 +0,0 @@
1
- """Alias rétrocompat — module déplacé dans :mod:`picarones.measurements.narrative.renderer`.
2
-
3
- Le contenu vit désormais dans son cercle d'origine. Cet alias permet
4
- aux imports historiques (y compris les noms privés ``_*``) de
5
- continuer à fonctionner sans modification.
6
-
7
- Voir :doc:`docs/architecture-cercles.md` pour la cartographie.
8
- """
9
-
10
- from picarones.measurements.narrative.renderer import * # noqa: F401, F403
11
-
12
- # Réexport explicite de TOUS les noms (privés inclus) pour la
13
- # rétrocompatibilité des tests Sprints qui importent ``_helper``,
14
- # ``_compute_X``, ``_SCIPY_AVAILABLE``, etc. Sans cette boucle, ``import *``
15
- # ne propage que les noms publics et casse les imports historiques.
16
- import picarones.measurements.narrative.renderer as _shim_module
17
- for _shim_name in dir(_shim_module):
18
- if _shim_name == "__builtins__":
19
- continue
20
- if _shim_name not in globals():
21
- globals()[_shim_name] = getattr(_shim_module, _shim_name)
22
- del _shim_module, _shim_name
23
-
24
- __all__ = [
25
- _n for _n in dir() if not _n.startswith("__")
26
- ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/templates/en.yaml DELETED
@@ -1,96 +0,0 @@
1
- # Narrative rendering templates — English.
2
- # Anti-hallucination rule: never introduce a number or entity name that is not
3
- # already in the Fact ``payload``. Tests verify traceability of every number
4
- # appearing in the rendered synthesis.
5
-
6
- global_leader_cer: >-
7
- On this corpus of {n_docs} documents, {engine} achieves the lowest mean CER
8
- ({cer_pct} %).
9
-
10
- statistical_tie: >-
11
- Engines {engines_list} are not statistically distinguishable
12
- (Friedman-Nemenyi, α = {alpha}, n = {n_blocks} documents, CD = {critical_distance}).
13
-
14
- significant_gap: >-
15
- The gap between {leader} and {runner_up} is statistically significant
16
- (Wilcoxon, p = {p_value:.4f}, Δ CER = {delta_cer_pct} points over {n_pairs} pairs).
17
-
18
- stratum_winner: >-
19
- On stratum "{stratum}" ({n_docs_stratum} documents), {engine} achieves
20
- the lowest CER ({cer_pct} % vs. {second_cer_pct} % for {second_engine}).
21
-
22
- stratum_collapse: >-
23
- {engine} is globally competitive ({global_cer_pct} %) but collapses on
24
- stratum "{stratum}" ({local_cer_pct} % over {n_docs_stratum} documents,
25
- i.e. {delta_cer_pct} points above its own average).
26
-
27
- error_profile_outlier: >-
28
- {engine} has an atypical error profile: {proportion_pct} % of errors fall
29
- into class "{error_class}", vs. a median of {median_proportion_pct} % across
30
- other engines (×{ratio_to_median} the median).
31
-
32
- llm_hallucination_flag: >-
33
- Hallucination signal on {engine} ({reasons_list}) —
34
- {hallucinating_rate_pct} % of documents above alert thresholds.
35
-
36
- robustness_fragile: >-
37
- {engine} is fragile under "{degradation}" degradation: its CER rises from
38
- {cer_baseline_pct} % to {cer_degraded_pct} % at maximum level (×{ratio}).
39
-
40
- speed_winner: >-
41
- {engine} is the fastest ({mean_duration} s/doc, ×{speedup} faster than the
42
- median) for comparable quality (CER {cer_pct} %).
43
-
44
- confidence_warning: >-
45
- High statistical uncertainty: the {confidence_level} % confidence interval of
46
- {engine} spans {ci_width_pct} CER points, compared with a gap of
47
- {gap_to_runner_up_pct} points to the runner-up.
48
-
49
- pareto_alternative: >-
50
- At much lower cost, {engine} offers an interesting trade-off ({cer_pct} %
51
- CER for {cost} €/{cost_unit_pages} pages, vs {leader_cer_pct} % / {leader_cost} € for
52
- {leader}, i.e. ×{cost_saving_ratio} cheaper).
53
-
54
- cost_outlier: >-
55
- Disproportionate cost for {engine} ({cost} €/{cost_unit_pages} pages, ×{ratio_to_median}
56
- the median) without a compensating quality advantage (CER {cer_pct} %).
57
-
58
- ensemble_opportunity: >-
59
- Engines {pair_a} and {pair_b} have divergent error profiles
60
- ({divergence_metric}={divergence}). On this corpus of {doc_count} documents,
61
- {best_engine} preserves {best_recall_pct} % of tokens; a majority vote
62
- among the engines would preserve {oracle_recall_pct} % — i.e.
63
- {absolute_gap_pct} points recoverable ({relative_gap_pct} % of the best
64
- engine's errors).
65
-
66
- median_mean_gap_warning: >-
67
- Asymmetric distribution for {engine}: median CER {median_cer_pct} %
68
- vs mean {mean_cer_pct} % across {n_docs} documents (relative gap
69
- {relative_gap_pct} %). The mean is pulled by a few catastrophic
70
- documents — the median (now used for default ranking) is more
71
- representative.
72
-
73
- stratification_recommended: >-
74
- Heterogeneous corpus ({n_strata} strata): {leader} performs very
75
- differently depending on document type — median CER
76
- {min_stratum_cer_pct} % on "{min_stratum}" vs
77
- {max_stratum_cer_pct} % on "{max_stratum}", a gap of {gap_pct}
78
- points. The global ranking hides this disparity; consult the
79
- stratified view.
80
-
81
- engine_off_baseline: >-
82
- {engine} achieved {cer_current_pct} % CER here, vs {cer_historical_mean_pct} %
83
- on average over the last {n_runs} runs of your institution on this
84
- same corpus (relative delta {relative_delta_pct} %). This corpus is
85
- harder for it than usual.
86
-
87
- engine_unstable: >-
88
- Over {n_runs} successive runs, {engine} produces variable outputs
89
- (CER CV {cer_cv_pct} %, identical-run pair rate {identical_run_rate_pct} %).
90
- Reproducibility is limited — interpret the average CER with caution.
91
-
92
- regression_in_history: >-
93
- Over the {n_runs} historical runs for {engine}, the average CER
94
- moved from {first_cer_pct} % to {last_cer_pct} %
95
- (cumulative change {absolute_delta_pct} points). Investigate what
96
- changed in the pipeline or the models.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
picarones/core/narrative/templates/fr.yaml DELETED
@@ -1,101 +0,0 @@
1
- # Templates de rendu narratif — français.
2
- #
3
- # Chaque clé correspond à une valeur de ``FactType``. La valeur est un template
4
- # Python ``.format()`` qui consomme les champs du ``Fact.payload``.
5
- #
6
- # Règle anti-hallucination : n'introduire aucune valeur numérique ou nom
7
- # d'entité qui ne soit pas dans le ``payload``. Les tests parsent la synthèse
8
- # rendue et vérifient la traçabilité.
9
-
10
- global_leader_cer: >-
11
- Sur ce corpus de {n_docs} documents, {engine} obtient le CER moyen le plus
12
- bas ({cer_pct} %).
13
-
14
- statistical_tie: >-
15
- Les moteurs {engines_list} ne sont pas statistiquement distinguables
16
- (Friedman-Nemenyi, α = {alpha}, n = {n_blocks} documents, CD = {critical_distance}).
17
-
18
- significant_gap: >-
19
- L'écart entre {leader} et {runner_up} est statistiquement significatif
20
- (Wilcoxon, p = {p_value:.4f}, Δ CER = {delta_cer_pct} points sur {n_pairs} paires).
21
-
22
- stratum_winner: >-
23
- Sur la strate « {stratum} » ({n_docs_stratum} documents), {engine}
24
- obtient le CER le plus bas ({cer_pct} % contre {second_cer_pct} %
25
- pour {second_engine}).
26
-
27
- stratum_collapse: >-
28
- {engine} est globalement compétitif ({global_cer_pct} %) mais s'effondre sur
29
- la strate « {stratum} » ({local_cer_pct} % sur {n_docs_stratum} documents,
30
- soit {delta_cer_pct} points au-dessus de sa moyenne).
31
-
32
- error_profile_outlier: >-
33
- Le profil d'erreurs de {engine} est atypique : {proportion_pct} % de la
34
- classe « {error_class} », contre une médiane de {median_proportion_pct} %
35
- sur les autres moteurs (ratio ×{ratio_to_median}).
36
-
37
- llm_hallucination_flag: >-
38
- Signal d'hallucination sur {engine} ({reasons_list}) —
39
- {hallucinating_rate_pct} % de documents au-dessus des seuils d'alerte.
40
-
41
- robustness_fragile: >-
42
- {engine} est fragile à la dégradation « {degradation} » : son CER passe de
43
- {cer_baseline_pct} % à {cer_degraded_pct} % au niveau maximal (ratio ×{ratio}).
44
-
45
- speed_winner: >-
46
- {engine} est le plus rapide ({mean_duration} s / doc, ×{speedup} plus vite
47
- que la médiane) pour un CER comparable ({cer_pct} %).
48
-
49
- confidence_warning: >-
50
- Incertitude statistique élevée : l'intervalle de confiance à {confidence_level} %
51
- de {engine} s'étend sur {ci_width_pct} points de CER, à comparer à l'écart de
52
- {gap_to_runner_up_pct} points avec le second.
53
-
54
- pareto_alternative: >-
55
- À coût sensiblement inférieur, {engine} offre un compromis intéressant
56
- ({cer_pct} % de CER pour {cost} €/{cost_unit_pages} pages, contre {leader_cer_pct} % /
57
- {leader_cost} € pour {leader}, soit ×{cost_saving_ratio} moins cher).
58
-
59
- cost_outlier: >-
60
- Coût disproportionné pour {engine} ({cost} €/{cost_unit_pages} pages, ×{ratio_to_median}
61
- la médiane) sans avantage de qualité compensatoire (CER {cer_pct} %).
62
-
63
- ensemble_opportunity: >-
64
- Les moteurs {pair_a} et {pair_b} ont des profils d'erreurs divergents
65
- ({divergence_metric}={divergence}). Sur ce corpus de {doc_count} documents,
66
- {best_engine} préserve {best_recall_pct} % des tokens ; un voting majoritaire
67
- entre les moteurs en préserverait {oracle_recall_pct} %, soit
68
- {absolute_gap_pct} points récupérables ({relative_gap_pct} % des erreurs
69
- du meilleur moteur).
70
-
71
- median_mean_gap_warning: >-
72
- Distribution asymétrique pour {engine} : médiane CER {median_cer_pct} %
73
- vs moyenne {mean_cer_pct} % sur {n_docs} documents (écart relatif
74
- {relative_gap_pct} %). La moyenne est tirée par quelques documents
75
- catastrophiques — la médiane (utilisée pour le tri par défaut) est
76
- plus représentative.
77
-
78
- stratification_recommended: >-
79
- Corpus hétérogène ({n_strata} strates) : {leader} performe très
80
- différemment selon le type de document — médiane CER
81
- {min_stratum_cer_pct} % sur « {min_stratum} » contre
82
- {max_stratum_cer_pct} % sur « {max_stratum} », soit {gap_pct} points
83
- d'écart. Le classement global masque cette disparité ; consulter la
84
- vue stratifiée.
85
-
86
- engine_off_baseline: >-
87
- {engine} a obtenu {cer_current_pct} % CER ici, vs {cer_historical_mean_pct} %
88
- en moyenne sur les {n_runs} runs précédents de votre institution sur
89
- ce même corpus (écart relatif {relative_delta_pct} %). Ce corpus lui
90
- est plus difficile que d'habitude.
91
-
92
- engine_unstable: >-
93
- Sur {n_runs} runs successifs, {engine} produit des sorties variables
94
- (CV CER {cer_cv_pct} %, paires de runs identiques {identical_run_rate_pct} %).
95
- La reproductibilité est limitée — interpréter le CER moyen avec prudence.
96
-
97
- regression_in_history: >-
98
- Sur les {n_runs} runs historiques pour {engine}, le CER moyen
99
- est passé de {first_cer_pct} % à {last_cer_pct} %
100
- (variation cumulée {absolute_delta_pct} points). Vérifier ce qui
101
- a changé dans le pipeline ou les modèles.