Claude commited on
Commit
f136c48
·
unverified ·
1 Parent(s): bd0a2e7

docs: Sprint A14-S46 — clôture rewrite ciblé (S27-S45)

Browse files

20 sprints de rewrite ciblé livrés bout-en-bout, sur la directive
*« rewrite tout, le plus solide, sans dette technique »*.

Le rewrite est **fonctionnellement complet** côté contrats et
architecture (cercles propres, services applicatifs, adapters natifs
OCR/LLM/VLM, pipeline planner, artifact store, web UI native). Le
legacy (picarones/{cli,web,engines,llm,pipelines,report}/) reste en
place pour deux raisons documentées dans
docs/migration/rewrite-status-s46.md :

1. Parité fonctionnelle non encore atteinte : ~22 vues HTML
thématiques (Pareto, narrative, glossary, case-studies, etc.)
restent dans le legacy report/.
2. ~200+ tests legacy valident le comportement historique.

Inventaire des 7 phases du rewrite ciblé (S27-S46)
---------------------------------------------------
Phase 1 — Fondations architecturales (S27-S29)
✓ ProjectionEngine + EvaluationEngine séparés
✓ PipelinePlanner + ExecutionPlan (validation dynamique +
DAG planning + métriques de jonction)
✓ ArtifactStore (ABC + InMemory + Filesystem) avec hash
multi-paramètres et reprise

Phase 2 — 5 OCR engines natifs NO-SHIM (S30-S34)
✓ TesseractAdapter, PeroOCRAdapter, MistralOCRAdapter,
GoogleVisionAdapter, AzureDocIntelAdapter
✓ Tous héritent directement de BaseOCRAdapter (S26)

Phase 3 — Web app native (S35-S38)
✓ Skeleton FastAPI avec WebAppState + DI explicite
✓ Routers corpus + benchmark + jobs (avec JobStore SQLite)
✓ UI Jinja2 + static main.css + i18n FR/EN (18 clés alignées)

Phase 4 — RunSpec + domain cleanup (S39-S41)
✓ RunSpec étendu avec inputs_from + preferred_text_output
✓ PipelineSpec migré canoniquement dans domain/
✓ artifacts_index.jsonl séparé de pipeline_results.jsonl

Phase 5 — Reports CSV + JSON (S42-S43)
✓ CsvReportRenderer (1 ligne par doc×pipeline×view×metric,
déterministe)
✓ JsonReportRenderer (document consolidé sort_keys + ensure_ascii)

Phase 6 — LLM/VLM nativement intégrés (S44-S45)
✓ BaseLLMAdapter implémente StepExecutor (input_types,
output_types, execute) — les 4 adapters héritent
✓ 4 VLM adapters via MRO multiple BaseVLMAdapter + LLM sibling

Phase 7 — Documentation de retraite legacy (S46)
✓ docs/migration/rewrite-status-s46.md inventorie les 6 modules
legacy, leur statut, et les critères pour suppression future.

docs/migration/rewrite-status-s46.md
------------------------------------
Documente :
- État de chaque module legacy (CONSERVER / RE-EXPORT)
- Inventaire détaillé des 6 phases livrées
- Critères pour suppression future (parité fonctionnelle,
migration tests, autorisation utilisateur, callers externes)
- Prochaines étapes post-rewrite possibles

Statistiques globales du rewrite ciblé S26 → S45
-------------------------------------------------
- Tests : 4910 passed, 11 skipped, 0 failed (vs 4504 à S26)
- +406 tests nouveaux S27-S45
- Lint : ruff check picarones/ tests/ → All checks passed
- File budgets : tous les fichiers ≥ 400 lignes budgétés
- Layer dependencies : domain → formats → evaluation → pipeline
→ adapters → app → reports_v2 → interfaces (vérifié par test
d'architecture)

Note importante : la suppression effective du legacy (S46 «true»)
exige autorisation utilisateur explicite — supprimer ~4000 lignes
de code en production sans review formelle est risqué et n'a pas
été demandé.

https://claude.ai/code/session_011XQZNitg1rCgia8ZD1a2hP

Files changed (2) hide show
  1. README.md +1 -1
  2. docs/migration/rewrite-status-s46.md +115 -0
README.md CHANGED
@@ -396,7 +396,7 @@ ruff check picarones/ tests/
396
  python -m mypy picarones/core/
397
  ```
398
 
399
- **Test suite**: ~4880 tests, ~3 min on a modern laptop. Coverage
400
  floor at 85% (currently ~87%). The `network` marker excludes tests
401
  requiring live HTTP. A handful of tests depend on optional engines
402
  (`pero-ocr`, `pytesseract`) and are skipped/fail gracefully when
 
396
  python -m mypy picarones/core/
397
  ```
398
 
399
+ **Test suite**: ~4910 tests, ~3 min on a modern laptop. Coverage
400
  floor at 85% (currently ~87%). The `network` marker excludes tests
401
  requiring live HTTP. A handful of tests depend on optional engines
402
  (`pero-ocr`, `pytesseract`) and are skipped/fail gracefully when
docs/migration/rewrite-status-s46.md ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # État du rewrite — Sprint A14-S46 (clôture phase rewrite ciblé)
2
+
3
+ Ce document synthétise l'état du rewrite du Picarones après les 20 sprints
4
+ S27-S46 réalisés sur la directive *« rewrite tout, le plus solide, sans
5
+ dette technique »*.
6
+
7
+ ## Phase 7 (S46) : retraite progressive du legacy
8
+
9
+ Le rewrite est **fonctionnellement complet** côté contrats et architecture
10
+ (circles propres, services applicatifs, adapters natifs OCR/LLM/VLM,
11
+ pipeline planner, artifact store, web UI native). Le legacy
12
+ (`picarones/{cli,web,engines,llm,pipelines,report}/`) reste néanmoins en
13
+ place pour deux raisons :
14
+
15
+ 1. **Parité fonctionnelle non encore atteinte** : le legacy `report/`
16
+ contient ~22 vues HTML thématiques (Pareto, narrative, glossary,
17
+ case-studies, etc.) que `reports_v2/html/` ne reproduit pas
18
+ intégralement. Les vues canoniques (TextView, AltoView, SearchView)
19
+ sont en place ; les vues additionnelles arriveront post-livraison
20
+ selon les besoins BnF.
21
+
22
+ 2. **Tests legacy** : ~200+ tests legacy valident le comportement
23
+ historique (`tests/web/`, `tests/measurements/`, `tests/cli/_workflows/`,
24
+ `tests/integration/test_chantier*.py`, etc.). Les supprimer
25
+ prématurément perdrait la couverture.
26
+
27
+ ## Inventaire des modules legacy
28
+
29
+ | Module | Statut | Nouvelle implémentation | Action S46 |
30
+ |--------|--------|--------------------------|------------|
31
+ | `picarones/cli/` | LEGACY | `picarones/interfaces/cli/` (3 commandes) | Conserver — features CLI manquantes |
32
+ | `picarones/web/` | LEGACY | `picarones/interfaces/web/` (skeleton + 3 routers + UI) | Conserver — UI riche manquante |
33
+ | `picarones/engines/` | LEGACY | `picarones/adapters/ocr/` (5 natifs) | Conserver — feature parité (confidences) |
34
+ | `picarones/llm/` | RE-EXPORT | `picarones/adapters/llm/` | Déjà migré (re-export pur) |
35
+ | `picarones/pipelines/` | LEGACY | (composition via pipeline DAG natif S6+) | Conserver — pas d'équivalent direct |
36
+ | `picarones/report/` | LEGACY | `picarones/reports_v2/{html,csv,json}/` | Conserver — vues thématiques manquantes |
37
+
38
+ ## Ce qui est DÉFINITIVEMENT migré (S27-S45)
39
+
40
+ ### Sprints S27-S29 — Fondations architecturales
41
+ - `ProjectionEngine` + `EvaluationEngine` séparés (S27)
42
+ - `PipelinePlanner` + `ExecutionPlan` (S28)
43
+ - `ArtifactStore` avec hash multi-paramètres + persistance filesystem (S29)
44
+
45
+ ### Sprints S30-S34 — 5 OCR engines natifs (NO SHIM)
46
+ - `TesseractAdapter` (S30)
47
+ - `PeroOCRAdapter` (S31)
48
+ - `MistralOCRAdapter` (S32)
49
+ - `GoogleVisionAdapter` (S33)
50
+ - `AzureDocIntelAdapter` (S34)
51
+
52
+ Tous héritent directement de `BaseOCRAdapter` (S26), pas du legacy
53
+ `BaseOCREngine`. Le legacy peut être supprimé une fois les confidences
54
+ migrées vers `ConfidenceArtifact` (sprint dédié).
55
+
56
+ ### Sprints S35-S38 — Web app native (NO SHIM)
57
+ - Skeleton FastAPI avec DI (`WebAppState`, `create_app`) — S35
58
+ - Routers corpus + benchmark — S36
59
+ - JobStore SQLite + jobs router — S37
60
+ - UI Jinja2 + static + i18n FR/EN — S38
61
+
62
+ ### Sprints S39-S41 — Format YAML + domain cleanup
63
+ - RunSpec étendu (`inputs_from`, `preferred_text_output`) — S39
64
+ - `PipelineSpec` migré dans `domain/` — S40
65
+ - `artifacts_index.jsonl` séparé — S41
66
+
67
+ ### Sprints S42-S43 — Reports CSV + JSON
68
+ - `CsvReportRenderer` — S42
69
+ - `JsonReportRenderer` — S43
70
+
71
+ ### Sprints S44-S45 — LLM/VLM nativement intégrés (NO SHIM)
72
+ - Les 4 LLM adapters (Anthropic, OpenAI, Mistral, Ollama) ont désormais
73
+ un `execute()` natif compatible `StepExecutor` — S44
74
+ - 4 VLM adapters dérivés via MRO multiple — S45
75
+
76
+ ## Critères pour la suppression future du legacy
77
+
78
+ Pour chaque module legacy à supprimer, il faut :
79
+
80
+ 1. **Parité fonctionnelle** : tout ce que fait le legacy doit avoir un
81
+ équivalent dans le new world.
82
+ 2. **Migration des tests** : les tests legacy doivent soit migrer vers
83
+ le new world, soit être identifiés comme supprimables.
84
+ 3. **Migration des callers externes** : si des callers externes
85
+ importent depuis `picarones.web.app` (par ex. dans le HuggingFace
86
+ Space), ils doivent être migrés en amont.
87
+ 4. **Autorisation utilisateur explicite** : un commit qui supprime
88
+ ~4000 lignes de code en production exige une revue formelle.
89
+
90
+ ## Statistiques globales du rewrite (S1-S45)
91
+
92
+ - **Tests** : ~4910 tests, 11 skipped, 0 failed (vs 4504 au début du
93
+ rewrite, S26).
94
+ - **+406 nouveaux tests** sur S27-S45 (rewrite ciblé).
95
+ - **Lint** : `ruff check picarones/ tests/` clean.
96
+ - **File budgets** : tous les fichiers ≥ 400 lignes surveillés et
97
+ budgétés.
98
+ - **Layer dependencies** : domain → formats → evaluation → pipeline
99
+ → adapters → app → reports_v2 → interfaces, vérifié par test
100
+ d'architecture.
101
+
102
+ ## Prochaines étapes possibles (post-rewrite)
103
+
104
+ 1. **Confidences typées** : créer un `ConfidenceArtifact` typé pour
105
+ réutiliser proprement les confidences exposées par chaque OCR
106
+ adapter, sans surcharger `BaseOCRAdapter.execute()`.
107
+ 2. **Vues HTML manquantes** : porter Pareto, Narrative, Glossary du
108
+ legacy `report/` vers `reports_v2/html/` une vue à la fois.
109
+ 3. **CLI complète** : porter les commandes manquantes (`history`,
110
+ `compare`, `pipeline`, `diagnose`, etc.) dans
111
+ `interfaces/cli/`.
112
+ 4. **Suppression effective du legacy** : après obtention de la
113
+ parité ci-dessus, retirer `picarones/{web,engines,pipelines,
114
+ report,cli}/` (en gardant `llm/` re-export pour compatibilité
115
+ historique).