Claude commited on
Commit
2a19401
·
unverified ·
1 Parent(s): 307d18e

docs(audit): ajout §9 — état de SPECS.md et README.md

Browse files

Ré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.

docs/audits/institutional-readiness-2026-05.md CHANGED
@@ -30,9 +30,9 @@
30
 
31
  | Sévérité | Compte | Domaines |
32
  |---|---|---|
33
- | **BLOCKER** | 11 | Architecture (2), violation règle propre (3), publication scientifique (3), accessibilité (2), sécurité web (1) |
34
- | **MAJOR** | 18 | CI/CD (6), documentation (5), tests (3), reproductibilité (2), web/UX (2) |
35
- | **MINOR** | 17 | Polissage (DX, packaging, i18n résiduel, cache Docker, formats locales…) |
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