Spaces:
Sleeping
docs: Sprint A14-S46 — clôture rewrite ciblé (S27-S45)
Browse files20 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
- README.md +1 -1
- docs/migration/rewrite-status-s46.md +115 -0
|
@@ -396,7 +396,7 @@ ruff check picarones/ tests/
|
|
| 396 |
python -m mypy picarones/core/
|
| 397 |
```
|
| 398 |
|
| 399 |
-
**Test suite**: ~
|
| 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
|
|
@@ -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).
|