Spaces:
Sleeping
docs(audit): ajout §9 — état de SPECS.md et README.md
Browse filesRéponse à la relecture utilisateur : « SPECS respecté ? README largué ? ».
Cross-check ligne à ligne. Findings principaux :
SPECS.md (mars 2025, addendum jusqu'à Sprint 30) — 9 promesses non
tenues sans deprecation : adapters Kraken/AWS Textract/Calamari/OCRopus4,
moteur custom YAML, export PDF/ALTO/PAGE/images annotées, commande
`picarones estimate`, recommandation auto (contredit la règle propre
de neutralité éditoriale du projet), score consensus / k-means
clustering, prompt latin, badge SVG, dataset de référence embarqué.
À l'inverse, ~25 modules majeurs ajoutés depuis (NER, Pareto, narrative,
Friedman+Nemenyi, philologique, pipelines composables…) ne figurent
nulle part dans SPECS. → BLOCKER B-12 « refondre intégralement ».
README.md — arrêté éditorialement à Sprint 22, désynchronisé d'~75
sprints : (1) markdown des taglines littéralement cassé lignes 12-14
(BLOCKER B-13), (2) compteur de tests faux à 3 endroits (1242 → 3356),
(3) Roadmap arrêtée à Sprint 22 sur 97, (4) Known Issues décrit un
état antérieur où plusieurs items ont été résolus depuis, (5) Project
Structure pré-refactor Sprint 32-34 (annonce 17 modules dans core/
alors qu'il n'en reste que 7), (6) Kraken/customYAML annoncés comme
implémentés alors qu'aucun adapter n'existe, (7) variables AWS_*
documentées sans adapter Textract, (8) CLI sous-documentée 6/15,
(9) API web 10/27, (10) métriques sous-vendues 8/28, (11) sections
rapport sous-vendues 15/25.
Effort total SPECS+README : ~9,8 PJ (~2 sem.). Recommandation
procédurale : ajouter test CI `tests/docs/test_readme_consistency.py`
qui parse le README et échoue si un moteur listé n'a pas d'adapter.
Compteurs §1 mis à jour : BLOCKER 11→13, MAJOR 18→28.
|
@@ -30,9 +30,9 @@
|
|
| 30 |
|
| 31 |
| Sévérité | Compte | Domaines |
|
| 32 |
|---|---|---|
|
| 33 |
-
| **BLOCKER** |
|
| 34 |
-
| **MAJOR** |
|
| 35 |
-
| **MINOR** |
|
| 36 |
| **Faux positifs** | 1 | « SQL injection » dans `jobs.py:235` — détaillé en §6 |
|
| 37 |
|
| 38 |
Tous les findings sont accompagnés de la citation `fichier:ligne` exacte
|
|
@@ -808,6 +808,374 @@ par les pairs). Recommandation : démarrer dès la semaine 1.
|
|
| 808 |
|
| 809 |
---
|
| 810 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 811 |
## 8. Synthèse pour la direction
|
| 812 |
|
| 813 |
Picarones est un projet de recherche **techniquement solide, méthodologiquement
|
|
|
|
| 30 |
|
| 31 |
| Sévérité | Compte | Domaines |
|
| 32 |
|---|---|---|
|
| 33 |
+
| **BLOCKER** | 13 | Architecture (2), violation règle propre (3), publication scientifique (3), accessibilité (2), sécurité web (1), **documentation produit (2 — SPECS+README, voir §9)** |
|
| 34 |
+
| **MAJOR** | 28 | CI/CD (6), documentation (5), tests (3), reproductibilité (2), web/UX (2), **README désynchronisé (10 items, voir §9)** |
|
| 35 |
+
| **MINOR** | 18 | Polissage (DX, packaging, i18n résiduel, cache Docker, formats locales…) + petits items README |
|
| 36 |
| **Faux positifs** | 1 | « SQL injection » dans `jobs.py:235` — détaillé en §6 |
|
| 37 |
|
| 38 |
Tous les findings sont accompagnés de la citation `fichier:ligne` exacte
|
|
|
|
| 808 |
|
| 809 |
---
|
| 810 |
|
| 811 |
+
## 9. État de SPECS.md et README.md
|
| 812 |
+
|
| 813 |
+
> Section ajoutée après relecture ciblée des deux documents.
|
| 814 |
+
> **À elle seule, cette section identifie un BLOCKER supplémentaire
|
| 815 |
+
> (B-12) et plusieurs MAJORS / MINORS spécifiques à la documentation
|
| 816 |
+
> de premier contact.**
|
| 817 |
+
|
| 818 |
+
### 9.1 SPECS.md — promesses non tenues, sans deprecation
|
| 819 |
+
|
| 820 |
+
`SPECS.md` est daté « Version 1.0 — Mars 2025 » et n'a reçu qu'un
|
| 821 |
+
*addendum Sprints 16-30* (lignes 654-757). Les promesses initiales
|
| 822 |
+
suivantes **ne sont pas implémentées** et ne sont mentionnées nulle
|
| 823 |
+
part comme abandonnées ni reportées :
|
| 824 |
+
|
| 825 |
+
| Promesse SPECS | Section | Statut réel | Cohérence |
|
| 826 |
+
|---|---|---|---|
|
| 827 |
+
| Adapter Kraken (priorité v1.0) | §4.2 | Aucun fichier `picarones/engines/kraken.py`. L'extra `[kraken]` existe dans `pyproject.toml` mais ne pointe vers aucun adapter. | Promesse rompue, alors mentionnée v1.0 |
|
| 828 |
+
| Adapter AWS Textract (priorité v1.1) | §4.2 | Aucun fichier `picarones/engines/aws_textract.py`. `boto3` listé dans l'extra `[ocr-cloud]` et variables `AWS_*` documentées dans le README → **fausse piste pour l'utilisateur**. | Promesse rompue + README induit en erreur |
|
| 829 |
+
| Adapter Calamari (priorité v1.1) | §4.2 | Pas d'adapter, pas d'extra. | Promesse rompue |
|
| 830 |
+
| Adapter OCRopus4 (priorité v1.2) | §4.2 | Pas d'adapter, pas d'extra. | Promesse rompue |
|
| 831 |
+
| Moteur custom déclaré en YAML (`type: cli` / `type: api`) | §4.3 | Aucun loader `engine.yaml` dans `picarones/engines/`. Le YAML *pipeline* (Sprint 70) existe mais ne couvre pas la déclaration *d'engine* — c'est un autre périmètre. | Promesse rompue |
|
| 832 |
+
| Export PDF du rapport | §7.3 | Le rapport HTML n'a qu'un export CSV (cf. `_app.js:exportCSV`). Pas de génération PDF. | Promesse rompue |
|
| 833 |
+
| Export ALTO XML / PAGE XML / images annotées | §7.3 | Idem — non implémenté côté rapport HTML. | Promesse rompue (×3) |
|
| 834 |
+
| Commande `picarones estimate` (preview coût avant lancement) | §8.2 | N'existe pas. Le coût est calculé *post hoc* via la vue Pareto (Sprint 20). | Promesse rompue |
|
| 835 |
+
| Recommandation automatique « quel concurrent pour quel usage » | §7.1 | **Pivot philosophique opposé** : `CLAUDE.md` érige en règle « Picarones mesure et classe — il ne tranche pas ». Le moteur narratif (Sprint 19) interdit explicitement toute prescription. | **Contradiction directe** entre SPECS et règle propre du projet |
|
| 836 |
+
| Score de consensus / vote majoritaire / ensemble | §6.4 | Sprint 35 calcule `oracle_token_recall` et `complementarity_gap` — ce sont des bornes supérieures, pas un mécanisme de vote actif. Pas d'`EnsembleEngine`. | Promesse partielle, livrée comme observation factuelle |
|
| 837 |
+
| Clustering automatique des erreurs (k-means) | §6.4 | Pas de k-means dans le code. Sprint 75 (taxonomy_cooccurrence) couvre une partie via Jaccard. | Promesse partielle |
|
| 838 |
+
| Annotations inline du paléographe exportées en JSON | §7.2 | Pas trouvé. | Promesse rompue |
|
| 839 |
+
| Bibliothèque de prompts intégrée pour latin et documents mixtes | §5.4 | Le repo a 8 prompts FR + EN (médiéval, imprimé ancien) mais **pas de prompt latin** ni « documents mixtes ». | Promesse partielle |
|
| 840 |
+
| Badge SVG de qualité OCR pour CI | §8.3 | Pas trouvé. | Promesse rompue |
|
| 841 |
+
| Dataset de référence fourni avec Picarones (100 documents) | §3.3 | `picarones/fixtures.py` génère du synthétique ; pas de corpus réel embarqué. README admet : *« Picarones does not yet ship a curated library of standard datasets »*. | Promesse rompue (admise dans README) |
|
| 842 |
+
|
| 843 |
+
**À l'inverse**, ce qui a été *ajouté* depuis SPECS et n'y figure pas
|
| 844 |
+
(et donc n'est pas vendu à un primo-lecteur de SPECS) :
|
| 845 |
+
NER (Sprint 38-41), reading order F1 (Sprint 53), layout F1 (Sprint 54),
|
| 846 |
+
9 modules philologiques transversaux (Sprints 55-60), recherchabilité
|
| 847 |
+
fuzzy (Sprint 84), séquences numériques par catégorie (Sprint 85),
|
| 848 |
+
moteur narratif factuel anti-hallucination (Sprint 19), Friedman+Nemenyi+CDD
|
| 849 |
+
(Sprint 18), Pareto coût/vitesse/CO₂ (Sprint 20), glossaire contextuel
|
| 850 |
+
(Sprint 21), métriques inter-moteurs (Sprint 35-37, 89), absorption
|
| 851 |
+
d'erreur par jonction (Sprint 94), pipelines composables avec DAG
|
| 852 |
+
branchant (Sprints 63-66), CLI YAML pipeline (Sprint 70), interface
|
| 853 |
+
`BaseModule` générique (Sprint 33), registre typé de métriques
|
| 854 |
+
(Sprint 34), GT multi-niveaux (Sprint 32), audit de modules (Sprint 97),
|
| 855 |
+
comparaison de runs (Sprint 28), stratification (Sprint 45-46),
|
| 856 |
+
calibration ECE/MCE (Sprint 39-43), longitudinal régression+change-point
|
| 857 |
+
(Sprint 92), throughput effectif (Sprint 91), workflows pré-câblés
|
| 858 |
+
`diagnose` / `economics` / `edition` — pour ne citer que les plus
|
| 859 |
+
importants.
|
| 860 |
+
|
| 861 |
+
**SPECS ne reflète donc plus ni ce que le projet fait *moins* (les
|
| 862 |
+
9 promesses rompues), ni ce qu'il fait *bien plus*** (au moins 25
|
| 863 |
+
modules majeurs ajoutés sans entrer dans SPECS).
|
| 864 |
+
|
| 865 |
+
#### B-12 (BLOCKER) — SPECS.md à refondre intégralement
|
| 866 |
+
|
| 867 |
+
Pour une publication institutionnelle, SPECS.md est typiquement le
|
| 868 |
+
document que la direction d'une bibliothèque lit en premier. Le décalage
|
| 869 |
+
décrit ci-dessus disqualifie le document : il ment soit par excès
|
| 870 |
+
(promesses non tenues), soit par défaut (le quart de la valeur du projet
|
| 871 |
+
est invisible). **Effort** : 3 PJ. Réécrire SPECS.md comme un document
|
| 872 |
+
miroir du code réel, marquer explicitement « Reporté » ou « Abandonné
|
| 873 |
+
au profit de … » pour chaque item rompu.
|
| 874 |
+
|
| 875 |
+
---
|
| 876 |
+
|
| 877 |
+
### 9.2 README.md — désynchronisé d'environ 75 sprints
|
| 878 |
+
|
| 879 |
+
Le README est arrêté éditorialement à **Sprint 22** (vu le tableau
|
| 880 |
+
Roadmap qui s'arrête à Sprint 22 « Done » et le bloc « Known Issues &
|
| 881 |
+
Improvement Opportunities » daté « Sprint 22 audit »). Or `CLAUDE.md`
|
| 882 |
+
documente le travail jusqu'au **Sprint 97**. Concrètement :
|
| 883 |
+
|
| 884 |
+
#### B-13 (BLOCKER) — Markdown des taglines cassé (lignes 12-14)
|
| 885 |
+
|
| 886 |
+
```markdown
|
| 887 |
+
> **Heritage OCR / HTR / VLM and post-correction benchmarking
|
| 888 |
+
|
| 889 |
+
> **Banc d'essai d'OCR / HTR / VLM et de post-correction pour documents patrimoniaux
|
| 890 |
+
```
|
| 891 |
+
|
| 892 |
+
Les deux blockquotes ouvrent un `**` (gras) **jamais fermé**, et la
|
| 893 |
+
phrase est tronquée à mi-ligne (espace traînant, pas de point). Sur
|
| 894 |
+
GitHub, HuggingFace Space et tout viewer Markdown standard, la première
|
| 895 |
+
chose qu'un lecteur voit est *« un titre cassé »*. Pour la page de
|
| 896 |
+
visite-de-marque d'un projet visant la BnF, c'est rédhibitoire.
|
| 897 |
+
|
| 898 |
+
**Effort** : 0,1 PJ. Restaurer la phrase complète et fermer le `**`.
|
| 899 |
+
|
| 900 |
+
#### M-19 (MAJEUR) — Compteur de tests faux à 3 endroits
|
| 901 |
+
|
| 902 |
+
| Ligne | Affirmation | Réalité 2 mai 2026 |
|
| 903 |
+
|---|---|---|
|
| 904 |
+
| 583 | « 1242 tests (1 skipped: scipy optional) » | 3 359 collectés, 3 356 passed, 3 skipped |
|
| 905 |
+
| 623 | « 1242 passing, 1 skipped » | id. |
|
| 906 |
+
| 660 | « pytest tests/ -> 1242 passed, 1 skipped » | id. |
|
| 907 |
+
|
| 908 |
+
Un primo-lecteur conclut soit que le projet est plus petit qu'il ne
|
| 909 |
+
l'est, soit que le README ment. Les deux abîment la confiance.
|
| 910 |
+
|
| 911 |
+
#### M-20 (MAJEUR) — Roadmap arrêtée 75 sprints en arrière
|
| 912 |
+
|
| 913 |
+
Le tableau lignes 676-700 s'arrête à **Sprint 22 (« Case studies,
|
| 914 |
+
user/dev guides »)**. Tous les sprints suivants — moteur Friedman+Nemenyi
|
| 915 |
+
(18), Pareto (20), narrative (19), persistance jobs (26), snapshots
|
| 916 |
+
reproductibilité (27), neutralité éditoriale renforcée (29), refonte
|
| 917 |
+
Cercle 1/2/3 (32-34), métriques inter-moteurs (35-37), NER (38-41),
|
| 918 |
+
calibration (39-43), stratification (44-46), équivalences (47), coût
|
| 919 |
+
projeté (48), modernisation lexicale (49), robustesse projetée (50),
|
| 920 |
+
leviers (51), réadabilité (52), reading order F1 (53), layout F1 (54),
|
| 921 |
+
9 sprints philologiques (55-62), pipelines composables (63-66),
|
| 922 |
+
documentation user/dev sur l'axe B (67-69), CLI YAML pipeline (70),
|
| 923 |
+
rare-token (71), worst lines (72), historique baseline (73-74),
|
| 924 |
+
3 chantiers taxonomie (75-77), équivalences fines (78), projection coût
|
| 925 |
+
(79), modernisation lexicale (80), projection robustesse (81), leviers
|
| 926 |
+
(82), reliability+stabilité (83-84-85-86-87-88-89-90-91-92-93-94-95-96),
|
| 927 |
+
politique modules (97), et les chantiers post-Sprint 97 documentés dans
|
| 928 |
+
CHANGELOG — sont absents.
|
| 929 |
+
|
| 930 |
+
Un investisseur, un comité éditorial, un lecteur d'arXiv, ou même un
|
| 931 |
+
contributeur potentiel ne peut pas évaluer la valeur réelle du projet
|
| 932 |
+
depuis le README.
|
| 933 |
+
|
| 934 |
+
**Effort** : 1 PJ pour résumer en un tableau condensé. Idéalement, ne
|
| 935 |
+
pas dupliquer CHANGELOG : pointer vers lui pour le détail.
|
| 936 |
+
|
| 937 |
+
#### M-21 (MAJEUR) — Bloc « Known Issues » obsolète, plusieurs items déjà résolus
|
| 938 |
+
|
| 939 |
+
Lignes 703-772 décrivent l'audit Sprint 22 ; entre-temps :
|
| 940 |
+
|
| 941 |
+
| Issue listée | État réel |
|
| 942 |
+
|---|---|
|
| 943 |
+
| « `web/app.py` is 3072 lines » | **131 lignes** (refactoré Sprint 25 en 11 routers + utilities) |
|
| 944 |
+
| « `cli.py` is 971 lines » | **N'existe plus** : remplacé par le package `picarones/cli/` (374 lignes pour `__init__.py` + 6 sous-modules) |
|
| 945 |
+
| « `core/runner.py` is 847 lines » | **Le fichier n'existe plus à ce chemin** : déplacé en `picarones/measurements/runner.py` (1 019 lignes maintenant) |
|
| 946 |
+
| « `core/narrative/detectors.py` 680 lignes » | **Refactoré Sprint 19 en 6 fichiers de famille** (`measurements/narrative/detectors/{ranking,pareto,stratum,quality,history,ensemble}.py`) |
|
| 947 |
+
| « `picarones/i18n.py` shim 66 lignes » | À vérifier — pourrait être nettoyé |
|
| 948 |
+
| « `CHANGELOG.md` stops at Sprint 9 » | **Faux** : CHANGELOG va jusqu'à Sprint 97 + post-Sprint 97 (195 KB). |
|
| 949 |
+
| « pas de tests pour char_scores.py » | À vérifier — couverture probable |
|
| 950 |
+
| « pas de tests pour mistral_ocr.py / google_vision.py / azure_doc_intel.py » | **Faux** : Sprints 49, 50, 51 ajoutent des tests dédiés (`test_sprint49_mistral_confidences.py` etc.) |
|
| 951 |
+
|
| 952 |
+
Un audit interne qui pointe vers un état antérieur de 2 mois mine la
|
| 953 |
+
crédibilité. **Effort** : 0,5 PJ. Soit tout supprimer (le présent audit
|
| 954 |
+
le remplace), soit tout réécrire.
|
| 955 |
+
|
| 956 |
+
#### M-22 (MAJEUR) — Project Structure obsolète et trompeuse
|
| 957 |
+
|
| 958 |
+
Section « Project Structure » (lignes 471-588) décrit un repo
|
| 959 |
+
**d'avant Sprint 32-34** (la grande refonte Cercles 1/2/3) :
|
| 960 |
+
|
| 961 |
+
- Annonce 17 modules dans `picarones/core/` (corpus, metrics,
|
| 962 |
+
normalization, statistics, runner, results, confusion, char_scores,
|
| 963 |
+
taxonomy, structure, image_quality, difficulty, hallucination,
|
| 964 |
+
line_metrics, history, robustness, pricing, narrative/) — **réalité**
|
| 965 |
+
selon `CLAUDE.md` : `core/` ne contient plus que **7 fichiers**
|
| 966 |
+
(modules.py, corpus.py, results.py, metric_registry.py,
|
| 967 |
+
metric_hooks.py, pipeline.py, facts.py). Tout le reste a migré dans
|
| 968 |
+
`measurements/` après le refactor.
|
| 969 |
+
- Annonce `picarones/importers/` — **réalité** : `picarones/extras/importers/`
|
| 970 |
+
- Annonce `picarones/web/app.py` (sans mention des 11 routers) — réalité :
|
| 971 |
+
`picarones/web/routers/` (11 fichiers) + 6 utilities (security, jobs,
|
| 972 |
+
state, models, etc.)
|
| 973 |
+
- Annonce `picarones/cli.py` — réalité : `picarones/cli/` (package).
|
| 974 |
+
- N'évoque ni `picarones/modules/` (BaseModule officiels — Sprint 33),
|
| 975 |
+
ni `picarones/core/narrative/` qui a migré en `measurements/narrative/`.
|
| 976 |
+
|
| 977 |
+
Un développeur qui suit la structure README pour ajouter un module
|
| 978 |
+
ne trouvera **aucun** des fichiers qu'on lui annonce — ou pire,
|
| 979 |
+
créera son code au mauvais endroit.
|
| 980 |
+
|
| 981 |
+
**Effort** : 1 PJ. Régénérer la structure depuis le repo réel.
|
| 982 |
+
|
| 983 |
+
#### M-23 (MAJEUR) — Liste des moteurs OCR mensongère
|
| 984 |
+
|
| 985 |
+
| Moteur listé README | Statut réel |
|
| 986 |
+
|---|---|
|
| 987 |
+
| Tesseract 5 | ✓ implémenté |
|
| 988 |
+
| Pero OCR | ✓ implémenté |
|
| 989 |
+
| **Kraken** | ❌ **non implémenté** (pas d'adapter) |
|
| 990 |
+
| Mistral OCR | ✓ |
|
| 991 |
+
| Google Vision | ✓ |
|
| 992 |
+
| Azure Doc Intelligence | ✓ |
|
| 993 |
+
| **GPT-4o (VLM)** listed as "engine" | ✗ **n'est pas un OCR engine — c'est un LLM/VLM** utilisé via les pipelines |
|
| 994 |
+
| **Claude Sonnet (VLM)** listed as "engine" | id. |
|
| 995 |
+
| **Mistral Large (LLM)** listed as "engine" | id. |
|
| 996 |
+
| **Ollama** listed as "engine" | id. |
|
| 997 |
+
| Custom engine "YAML declaration, no code required" | ❌ **non implémenté** — le YAML pipeline existe mais ne couvre pas la déclaration *d'engine* CLI/REST |
|
| 998 |
+
|
| 999 |
+
Conséquence : un primo-utilisateur croit pouvoir installer Kraken
|
| 1000 |
+
(`pip install -e ".[kraken]"` succède puisque l'extra existe…) puis
|
| 1001 |
+
passer `--engines kraken` en ligne de commande — **et ça échoue**. La
|
| 1002 |
+
documentation cause le bug.
|
| 1003 |
+
|
| 1004 |
+
**Effort** : 0,5 PJ. Soit implémenter Kraken (effort plus important),
|
| 1005 |
+
soit retirer la ligne et documenter le statut « v1.x » dans la roadmap.
|
| 1006 |
+
|
| 1007 |
+
#### M-24 (MAJEUR) — Variables `AWS_*` documentées sans adapter
|
| 1008 |
+
|
| 1009 |
+
Lignes 604-606 du README :
|
| 1010 |
+
|
| 1011 |
+
```bash
|
| 1012 |
+
export AWS_ACCESS_KEY_ID="..."
|
| 1013 |
+
export AWS_SECRET_ACCESS_KEY="..."
|
| 1014 |
+
export AWS_DEFAULT_REGION="eu-west-1"
|
| 1015 |
+
```
|
| 1016 |
+
|
| 1017 |
+
Aucun adapter AWS Textract n'existe. Si un usager les configure, il
|
| 1018 |
+
ne se passe rien — mais il croit avoir armé une fonctionnalité.
|
| 1019 |
+
|
| 1020 |
+
**Effort** : 0,1 PJ. Supprimer ces 3 lignes (et l'`aws` dans l'extra
|
| 1021 |
+
`ocr-cloud` ou y ajouter une note `# slot reserved for future Textract
|
| 1022 |
+
adapter`).
|
| 1023 |
+
|
| 1024 |
+
#### M-25 (MAJEUR) — CLI sous-documentée
|
| 1025 |
+
|
| 1026 |
+
README lignes 327-339 liste **9 commandes** + `import iiif`. Réalité
|
| 1027 |
+
(vérifié par `picarones --help`) : **15 commandes** :
|
| 1028 |
+
|
| 1029 |
+
| Manquantes du README | Apport |
|
| 1030 |
+
|---|---|
|
| 1031 |
+
| `picarones compare` | Compare deux runs JSON et signale les régressions (Sprint 28). Critique pour la CI/CD institutionnelle. |
|
| 1032 |
+
| `picarones diagnose` | Workflow diagnostic complet (bench + leviers + recommandations factuelles) — Sprint post-97 |
|
| 1033 |
+
| `picarones economics` | Workflow économique (bench + throughput effectif + cost projection) — Sprint 91/79 |
|
| 1034 |
+
| `picarones edition` | Workflow édition critique (bench + métriques philologiques) — Sprint 55-60 |
|
| 1035 |
+
| `picarones pipeline run` / `pipeline compare` | Banc d'essai de pipelines composées YAML (Sprint 70) |
|
| 1036 |
+
|
| 1037 |
+
Les trois workflows pré-câblés (`diagnose`, `economics`, `edition`)
|
| 1038 |
+
sont précisément ce qu'un archiviste BnF non-Pythoniste cherche en
|
| 1039 |
+
priorité — *« j'ai un objectif éditorial donné, donne-moi le workflow
|
| 1040 |
+
correspondant »*. Les cacher dans une CLI non documentée est un gaspillage
|
| 1041 |
+
de la pédagogie déjà en place dans le code.
|
| 1042 |
+
|
| 1043 |
+
**Effort** : 0,5 PJ.
|
| 1044 |
+
|
| 1045 |
+
#### M-26 (MAJEUR) — Endpoints API web sous-documentés
|
| 1046 |
+
|
| 1047 |
+
Lignes 374-386 listent **10 endpoints**. Réalité (audit web §A) :
|
| 1048 |
+
**27+ endpoints**, dont au moins 13 absents du README :
|
| 1049 |
+
`/api/benchmark/run` (le nouveau, pour pipelines composées),
|
| 1050 |
+
`/api/benchmark/{job_id}/synthesis_preview`, `/api/config/{save,load}`,
|
| 1051 |
+
`/api/history/regressions`, `/api/lang/{code}` (sélecteur langue),
|
| 1052 |
+
`/api/corpus/{upload,uploads,image,uploads/{id}}`, `/api/htr-united/import`,
|
| 1053 |
+
`/api/huggingface/import`, `/api/normalization/profiles`, `/api/reports`,
|
| 1054 |
+
`/api/models/{provider}`.
|
| 1055 |
+
|
| 1056 |
+
Pour un intégrateur tiers, c'est inexploitable. La solution simple :
|
| 1057 |
+
auto-générer la liste via FastAPI OpenAPI et l'embarquer en annexe
|
| 1058 |
+
README ou la pointer (`/docs` Swagger UI).
|
| 1059 |
+
|
| 1060 |
+
**Effort** : 0,5 PJ.
|
| 1061 |
+
|
| 1062 |
+
#### M-27 (MAJEUR) — Métriques manquantes du README (vente sous-évaluée)
|
| 1063 |
+
|
| 1064 |
+
La section *Heritage-Specific Metrics* (lignes 158-175) liste **8
|
| 1065 |
+
familles**. Le code en livre **au moins 28** depuis Sprint 22 :
|
| 1066 |
+
|
| 1067 |
+
NER (Sprint 38-41), reading order F1 (Sprint 53), layout F1 (Sprint 54),
|
| 1068 |
+
delta Flesch (Sprint 52), recherchabilité fuzzy (Sprint 84),
|
| 1069 |
+
séquences numériques par catégorie (Sprint 85), précision par bloc
|
| 1070 |
+
Unicode (Sprint 55), abréviations médiévales (Sprint 56), couverture
|
| 1071 |
+
MUFI (Sprint 57), typographie de l'imprimé ancien (Sprint 58),
|
| 1072 |
+
marqueurs des archives modernes (Sprint 59), numéraux romains (Sprint 60),
|
| 1073 |
+
stabilité multi-runs (Sprint 83), accord inter-annotateurs Cohen κ /
|
| 1074 |
+
Krippendorff α (Sprint 83), divergence inter-moteurs (Sprint 35),
|
| 1075 |
+
matrice de spécialisation (Sprint 89), absorption d'erreur (Sprint 94),
|
| 1076 |
+
projection robustesse sur corpus réel (Sprint 81), prédictivité image
|
| 1077 |
+
(Sprint 93), tendances longitudinales (Sprint 92), throughput effectif
|
| 1078 |
+
(Sprint 91), coût marginal (Sprint 91), comparaison taxonomique
|
| 1079 |
+
côte-à-côte (Sprint 77), co-occurrence taxonomique (Sprint 75),
|
| 1080 |
+
heatmap intra-doc taxonomie (Sprint 76), modernisation lexicale (Sprint 80),
|
| 1081 |
+
projection coût en volume cible (Sprint 79), équivalences diplomatiques
|
| 1082 |
+
fines (Sprint 78).
|
| 1083 |
+
|
| 1084 |
+
Le projet vaut **3 à 4 fois ce que le README affiche**. C'est un
|
| 1085 |
+
problème de communication, pas de code.
|
| 1086 |
+
|
| 1087 |
+
**Effort** : 1 PJ pour réorganiser la section en 3 sous-sections
|
| 1088 |
+
(« Métriques classiques OCR/HTR », « Métriques philologiques », « Métriques
|
| 1089 |
+
de comparaison et décision ») et renvoyer vers `docs/views.md` pour le
|
| 1090 |
+
détail.
|
| 1091 |
+
|
| 1092 |
+
#### M-28 (MAJEUR) — Section « Interactive HTML Report » sous-vend de moitié
|
| 1093 |
+
|
| 1094 |
+
Lignes 198-219 listent ~15 features. Le code en livre **au moins
|
| 1095 |
+
25 sections** dans le rapport HTML :
|
| 1096 |
+
|
| 1097 |
+
Tableau classement, narrative synthesis, CDD, Pareto, glossaire,
|
| 1098 |
+
panneau avancé, galerie, vue document, vue caractères — déjà listés.
|
| 1099 |
+
**Manquants** : tableau NER (Sprint 41), reliability diagrams calibration
|
| 1100 |
+
(Sprint 43), section stratifiée par strate (Sprint 46), matrice
|
| 1101 |
+
divergence inter-moteurs (Sprint 37), encart oracle complementarity
|
| 1102 |
+
(Sprint 37), section leviers d'amélioration (Sprint 51-82), tableau
|
| 1103 |
+
spécialisation (Sprint 89), tableau throughput (Sprint 91), tableau
|
| 1104 |
+
longitudinal (Sprint 92), heatmap taxonomie intra-doc (Sprint 76),
|
| 1105 |
+
tableau worst lines (Sprint 72), tableau modernisation lexicale (Sprint 80),
|
| 1106 |
+
tableau séquences numériques (Sprint 86), tableau recherchabilité
|
| 1107 |
+
(Sprint 86), tableau profil philologique (Sprint 62), boxplot
|
| 1108 |
+
difficulté corpus (Sprint 74), DAG pipeline SVG (Sprint 95), tableau
|
| 1109 |
+
absorption erreur (Sprint 94), comparaison incrémentale ANOVA-like
|
| 1110 |
+
(Sprint 96), tableau audit modules (Sprint 97).
|
| 1111 |
+
|
| 1112 |
+
**Effort** : 1 PJ.
|
| 1113 |
+
|
| 1114 |
+
#### m-18 (MINEUR) — Liens et références menus
|
| 1115 |
+
|
| 1116 |
+
- Ligne 753 : « SPECS.md predates the narrative engine, Pareto view
|
| 1117 |
+
and glossary — worth a pass » — vrai mais auto-référentiel et
|
| 1118 |
+
insuffisant : SPECS prédate **75 sprints**, pas seulement 3.
|
| 1119 |
+
- Ligne 786 : copyright « 2024 Picarones contributors » — le projet
|
| 1120 |
+
s'étend jusqu'en 2026 ; mettre `2024-2026`.
|
| 1121 |
+
- Ligne 535 : prompts listés (8) — vérifier qu'aucun n'a été ajouté
|
| 1122 |
+
depuis ; en particulier, pas de prompt latin alors que SPECS le
|
| 1123 |
+
promettait (§5.4).
|
| 1124 |
+
|
| 1125 |
+
---
|
| 1126 |
+
|
| 1127 |
+
### 9.3 Cohérence transverse — quels chiffres faire foi
|
| 1128 |
+
|
| 1129 |
+
Trois documents donnent **trois chiffres différents** pour la suite de
|
| 1130 |
+
tests :
|
| 1131 |
+
|
| 1132 |
+
| Document | Affirmation | Date implicite |
|
| 1133 |
+
|---|---|---|
|
| 1134 |
+
| README L583, L623, L660 | « 1 242 passed, 1 skipped » | Sprint 22 (~mars 2025) |
|
| 1135 |
+
| CLAUDE.md « État actuel (Sprint 16) » | « 1 072 passed, 2 skipped » | Sprint 16 |
|
| 1136 |
+
| CLAUDE.md « Contexte développement » | « ~3 354 passed, 2 skipped » | Sprint 97 |
|
| 1137 |
+
| **Mesure réelle 2 mai 2026** | **3 356 passed, 3 skipped** | (vérifié) |
|
| 1138 |
+
|
| 1139 |
+
**Effort** : 0,1 PJ pour aligner les trois sources sur le chiffre vérifié
|
| 1140 |
+
et automatiser la mise à jour (un test qui lit le baseline et le
|
| 1141 |
+
compare à la doc).
|
| 1142 |
+
|
| 1143 |
+
---
|
| 1144 |
+
|
| 1145 |
+
### 9.4 Synthèse SPECS+README
|
| 1146 |
+
|
| 1147 |
+
| Item | Sévérité | Effort |
|
| 1148 |
+
|---|---|---|
|
| 1149 |
+
| B-12 SPECS à refondre intégralement | BLOCKER | 3 PJ |
|
| 1150 |
+
| B-13 Markdown taglines README cassé | BLOCKER | 0,1 PJ |
|
| 1151 |
+
| M-19 Compteur tests faux × 3 | MAJEUR | 0,1 PJ |
|
| 1152 |
+
| M-20 Roadmap arrêtée Sprint 22 | MAJEUR | 1 PJ |
|
| 1153 |
+
| M-21 Known Issues obsolète | MAJEUR | 0,5 PJ |
|
| 1154 |
+
| M-22 Project Structure trompeuse | MAJEUR | 1 PJ |
|
| 1155 |
+
| M-23 Kraken/customYAML annoncés sans implémentation | MAJEUR | 0,5 PJ |
|
| 1156 |
+
| M-24 AWS env vars sans adapter | MAJEUR | 0,1 PJ |
|
| 1157 |
+
| M-25 CLI sous-documentée (6/15) | MAJEUR | 0,5 PJ |
|
| 1158 |
+
| M-26 API web sous-documentée (10/27) | MAJEUR | 0,5 PJ |
|
| 1159 |
+
| M-27 Métriques sous-vendues (8/28) | MAJEUR | 1 PJ |
|
| 1160 |
+
| M-28 Sections rapport sous-vendues (15/25) | MAJEUR | 1 PJ |
|
| 1161 |
+
| m-18 Petits items (copyright, lien…) | MINEUR | 0,3 PJ |
|
| 1162 |
+
| 9.3 Aligner les compteurs de tests entre 3 docs | MINEUR | 0,1 PJ |
|
| 1163 |
+
|
| 1164 |
+
**Total : ~9,8 PJ pour SPECS+README seuls**, soit ~2 semaines. À
|
| 1165 |
+
prioriser **avant le travail de fond** sur les autres axes : le README
|
| 1166 |
+
est la première impression, et la divergence actuelle disqualifie
|
| 1167 |
+
toute communication scientifique ou institutionnelle qui s'appuierait
|
| 1168 |
+
dessus.
|
| 1169 |
+
|
| 1170 |
+
**Recommandation procédurale** : ajouter dans la CI un job qui
|
| 1171 |
+
*vérifie* qu'aucune assertion vérifiable du README ne diverge du repo
|
| 1172 |
+
(compteur de tests, liste des moteurs présents dans `picarones/engines/`,
|
| 1173 |
+
liste des commandes CLI exposées). Concrètement,
|
| 1174 |
+
`tests/docs/test_readme_consistency.py` qui parse les tableaux et
|
| 1175 |
+
échoue si un moteur listé n'a pas d'adapter.
|
| 1176 |
+
|
| 1177 |
+
---
|
| 1178 |
+
|
| 1179 |
## 8. Synthèse pour la direction
|
| 1180 |
|
| 1181 |
Picarones est un projet de recherche **techniquement solide, méthodologiquement
|