Spaces:
Running
Politique de versionning
Comment Picarones numérote ses versions, et pourquoi.
Résumé
Picarones suit Semantic Versioning 2.0.0 strict :
MAJOR.MINOR.PATCH avec suffixes pré-release PEP 440 (-rc1,
-beta1, -alpha1).
État courant : 0.9.0 — phase pré-1.0. Architecture stable,
surface fonctionnelle en construction.
Cible : 1.0.0 — release publique avec UI, rapport refondu et
parité des importeurs livrés.
SemVer pré-1.0 : qu'est-ce que ça change ?
En 0.x, SemVer autorise les ruptures sans préavis. Picarones
les annonce explicitement dans le CHANGELOG.md mais ne garantit
pas de période de dépréciation. C'est précisément l'intérêt du
pré-1.0 : pouvoir corriger l'API publique sans empêcher la
progression.
Concrètement :
- les schémas JSON (
BenchmarkResult,run_manifest.json,pipeline_results.jsonl,view_results.jsonl) peuvent évoluer entre0.9.xet0.10.x; - les noms de paramètres CLI peuvent changer ;
- les endpoints HTTP peuvent être renommés ou retirés ;
- les contrats internes (Pydantic models de
picarones.domain) peuvent être modifiés.
Chaque rupture est documentée dans le CHANGELOG.md sous la section
### BREAKING.
À partir de 1.0.0, la politique se durcit : période de
dépréciation minimum d'une mineure, retrait à la majeure suivante.
Mapping version ↔ tag git
Le numéro de version est dérivé du tag git par
setuptools_scm. Pas de version codée en dur dans pyproject.toml.
| Contexte | Version produite |
|---|---|
Tag v0.9.0 posé sur un commit |
0.9.0 |
5 commits après v0.9.0 (sans nouveau tag) |
0.9.1.dev5+g<sha> |
Tag v0.10.0-rc1 |
0.10.0rc1 (PEP 440) |
| Sans aucun tag (tarball, repo neuf) | 0.9.0 (fallback) |
Le scheme setuptools_scm est guess-next-dev : les builds
intermédiaires suggèrent un patch à venir (0.9.1.devN). Un bump
de mineure (0.10.0) ou majeure (1.0.0) est toujours explicite
via un nouveau tag git.
Le fallback_version de pyproject.toml est synchronisé avec
picarones/domain/_version_fallback.py:FALLBACK_VERSION. Un test
d'architecture (tests/architecture/test_single_version_source.py)
vérifie cette cohérence.
Roadmap vers 1.0.0
La sortie de 1.0.0 est conditionnée à la livraison de :
- Surface UI complète — exposition de tous les champs du modèle
BenchmarkRunRequest, refonte du rapport HTML, parité fonctionnelle avec la CLI (compare,robustness,history). - Parité importeurs corpus — IIIF, Gallica, eScriptorium accessibles depuis l'UI web (en plus de HTR-United et HuggingFace déjà présents).
- Refonte rapport HTML — passage à l'IA 4 onglets (Overview / Engines / Documents / Crosses) en gardant la stack Jinja2.
Les versions intermédiaires 0.10.0, 0.11.0, etc. peuvent être
publiées au fil du chantier ; elles sont des jalons techniques, pas
des releases publiques.
Pourquoi 0.9.0 plutôt que 2.0.x ou 3.0.0 ?
L'historique interne du projet utilisait une dénomination « v2.0 » pour désigner l'aboutissement du rewrite architectural en 8 couches (mai 2026). Cette dénomination reflétait un cycle de refactor interne, pas une maturité fonctionnelle publique : à ce moment, le projet n'avait ni interface utilisateur finalisée, ni parité importeurs, ni rapport refondu.
Le repositionnement en 0.9.0 (mai 2026) aligne le numéro de
version sur la maturité réelle : architecture solide, surface
fonctionnelle en construction. La sortie de 1.0.0 deviendra un
événement public marquant (UI complète, rapport refondu, parité
importeurs), ce qui correspond à l'usage habituel d'un saut
0.x → 1.0.
Ce choix est documenté dans la note de repositionnement de
docs/archive/README.md et dans la première
entrée du CHANGELOG.md post-repositionnement.
Source unique de vérité (anti-dérive)
La version courante est définie à un seul endroit : le tag git le
plus récent, lu par setuptools_scm.
Le fallback (utilisé en l'absence de tag) est défini à un seul
endroit : picarones/domain/_version_fallback.py:FALLBACK_VERSION. La
constante équivalente fallback_version dans pyproject.toml doit
rester synchronisée — un test d'architecture le vérifie.
Règle de codage : interdiction de coder un numéro de version en
dur ailleurs que dans ces deux fichiers. Tout consommateur doit
lire picarones.__version__ (ou ses équivalents internes
_resolve_picarones_version() pour les couches qui ne peuvent pas
importer le package racine).
Procédure de release
Voir docs/operations/release-process.md
pour la procédure complète. Le résumé :
# 1. Mettre à jour CHANGELOG.md (section ## [X.Y.Z] — YYYY-MM-DD)
git commit -am "docs(changelog): release 0.10.0"
# 2. Tag annoté
git tag -a v0.10.0 -m "Picarones 0.10.0"
git push origin main v0.10.0
# 3. Le workflow .github/workflows/release.yml déclenche
# automatiquement build + TestPyPI + PyPI + Docker + GitHub Release.