File size: 5,212 Bytes
416bee1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13ba1e5
 
 
 
 
416bee1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# 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**
  entre `0.9.x` et `0.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 :

1. **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`).
2. **Parité importeurs corpus** — IIIF, Gallica, eScriptorium accessibles
   depuis l'UI web (en plus de HTR-United et HuggingFace déjà présents).
3. **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`](../archive/README.md) et dans la première
entrée du [`CHANGELOG.md`](../../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`](../operations/release-process.md)
pour la procédure complète.  Le résumé :

```bash
# 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.
```