Claude commited on
Commit
1992441
·
unverified ·
1 Parent(s): b98dad4

docs(operations): remove sprint narrative (Phase 2 L2)

Browse files

Reformulation des mentions « Sprint XX » dans docs/operations/ :
- accessibility.md (9 mentions)
- deployment-institutional.md (7)
- data-retention-rgpd.md (6)
- release-process.md (5)
- rollback.md (1)

Patterns récurrents nettoyés :
- "Sprint AX du plan de remédiation institutionnelle" en header
→ mention du contexte historique sans tag sprint
- "## Section (Sprint XX)" → "## Section"
- "(Sprint XX)" parenthèse explicative → suppression
- "*Dernière mise à jour : DATE (Sprint XX).*" → date seule

Aucun contenu opérationnel touché : les tableaux de conformité
WCAG, les commandes de déploiement, les procédures de rollback
restent identiques.

Ratchet : ACTIVE_NARRATIVE_BASELINE 75 → 59 (-16).

docs/operations/accessibility.md CHANGED
@@ -1,12 +1,12 @@
1
  # Déclaration d'accessibilité — Picarones
2
 
3
- > Sprint A7 du plan de remédiation institutionnelle
4
- > ([`docs/archive/2026-audits/remediation-plan.md`](docs/archive/2026-audits/remediation-plan.md)).
 
5
  >
6
- > **Statut au 2 mai 2026** : audit interne Sprints A6 + A7 validé,
7
- > audit externe RGAA / WCAG **en cours** (planifié au Sprint A15).
8
- > Cette déclaration est **provisoire** jusqu'à validation par un
9
- > cabinet d'audit indépendant.
10
 
11
  ## Engagement
12
 
@@ -28,7 +28,7 @@ qu'elle génère accessibles conformément à :
28
 
29
  ## État de conformité
30
 
31
- ### Critères WCAG 2.1 niveau A — **conforme** (Sprint A6)
32
 
33
  | Critère | Statut | Mécanisme |
34
  |---|---|---|
@@ -39,7 +39,7 @@ qu'elle génère accessibles conformément à :
39
  | 3.1.1 Language of Page | ✓ | `<html lang="fr|en">` dynamique selon le rendu. |
40
  | 4.1.2 Name, Role, Value | ✓ | Contrôles natifs, labels ARIA appropriés. |
41
 
42
- ### Critères WCAG 2.1 niveau AA — **conforme** (Sprint A7)
43
 
44
  | Critère | Statut | Mécanisme |
45
  |---|---|---|
@@ -65,7 +65,7 @@ légale. Sont actuellement non conformes par décision éditoriale :
65
 
66
  ### Palette daltonien-friendly (par défaut)
67
 
68
- Depuis Sprint A7, la palette par défaut est **Okabe-Ito 2008**
69
  (palette qualitative recommandée pour la déficience de la vision
70
  des couleurs : deutéranopie, protanopie, tritanopie). L'ancienne
71
  palette rouge/vert/jaune reste accessible via :
@@ -97,9 +97,9 @@ captions de tableaux jumeaux) sont localisés dans les deux langues.
97
 
98
  | Item | Statut | Échéance |
99
  |---|---|---|
100
- | Matrice de confusion Unicode (vue Caractères) | Densité visuelle élevée — la table jumelle accessible reste l'alternative principale. | Refonte UX prévue Sprint post-A14. |
101
  | Génération PDF du rapport | Non livrée (cf. [`../reference/specification.md`](../reference/specification.md) « Promesses non tenues »). | Pas de plan d'ajout, le HTML couvre les usages observés. |
102
- | Audit RGAA externe | En cours, prestataire à contractualiser. | Sprint A15 (~sem. 11–12). |
103
 
104
  ## Tests automatisés
105
 
@@ -131,7 +131,7 @@ pouvez :
131
  1. ouvrir une issue GitHub étiquetée ``a11y`` :
132
  <https://github.com/maribakulj/Picarones/issues/new?labels=a11y>,
133
  2. contacter le mainteneur référent accessibilité (canal défini dans
134
- ``GOVERNANCE.md`` après Sprint A10).
135
 
136
  En cas de discrimination caractérisée, le défenseur des droits
137
  (France) peut être saisi : <https://www.defenseurdesdroits.fr/>.
@@ -140,8 +140,8 @@ En cas de discrimination caractérisée, le défenseur des droits
140
 
141
  - Audit interne automatisé : à chaque PR via la CI.
142
  - Audit interne manuel (NVDA / VoiceOver) : à chaque release majeure.
143
- - **Audit externe RGAA / WCAG complet** : annuel, premier audit prévu
144
- Sprint A15 (mai 2026).
145
 
146
  ## Remerciements
147
 
@@ -151,4 +151,4 @@ permission de diffusion ouverte.
151
 
152
  ---
153
 
154
- *Dernière mise à jour : 2 mai 2026 (Sprint A7).*
 
1
  # Déclaration d'accessibilité — Picarones
2
 
3
+ > Déclaration d'engagement Picarones vis-à-vis du standard WCAG 2.1
4
+ > AA et de la norme française RGAA 4.1. Contexte historique :
5
+ > [`docs/archive/2026-audits/remediation-plan.md`](../archive/2026-audits/remediation-plan.md).
6
  >
7
+ > **Statut au 2 mai 2026** : audit interne validé ; audit externe
8
+ > RGAA / WCAG **en cours**. Cette déclaration est **provisoire**
9
+ > jusqu'à validation par un cabinet d'audit indépendant.
 
10
 
11
  ## Engagement
12
 
 
28
 
29
  ## État de conformité
30
 
31
+ ### Critères WCAG 2.1 niveau A — **conforme**
32
 
33
  | Critère | Statut | Mécanisme |
34
  |---|---|---|
 
39
  | 3.1.1 Language of Page | ✓ | `<html lang="fr|en">` dynamique selon le rendu. |
40
  | 4.1.2 Name, Role, Value | ✓ | Contrôles natifs, labels ARIA appropriés. |
41
 
42
+ ### Critères WCAG 2.1 niveau AA — **conforme**
43
 
44
  | Critère | Statut | Mécanisme |
45
  |---|---|---|
 
65
 
66
  ### Palette daltonien-friendly (par défaut)
67
 
68
+ La palette par défaut est **Okabe-Ito 2008**
69
  (palette qualitative recommandée pour la déficience de la vision
70
  des couleurs : deutéranopie, protanopie, tritanopie). L'ancienne
71
  palette rouge/vert/jaune reste accessible via :
 
97
 
98
  | Item | Statut | Échéance |
99
  |---|---|---|
100
+ | Matrice de confusion Unicode (vue Caractères) | Densité visuelle élevée — la table jumelle accessible reste l'alternative principale. | Refonte UX planifiée (cf. backlog). |
101
  | Génération PDF du rapport | Non livrée (cf. [`../reference/specification.md`](../reference/specification.md) « Promesses non tenues »). | Pas de plan d'ajout, le HTML couvre les usages observés. |
102
+ | Audit RGAA externe | En cours, prestataire à contractualiser. | Prochain trimestre. |
103
 
104
  ## Tests automatisés
105
 
 
131
  1. ouvrir une issue GitHub étiquetée ``a11y`` :
132
  <https://github.com/maribakulj/Picarones/issues/new?labels=a11y>,
133
  2. contacter le mainteneur référent accessibilité (canal défini dans
134
+ ``GOVERNANCE.md``).
135
 
136
  En cas de discrimination caractérisée, le défenseur des droits
137
  (France) peut être saisi : <https://www.defenseurdesdroits.fr/>.
 
140
 
141
  - Audit interne automatisé : à chaque PR via la CI.
142
  - Audit interne manuel (NVDA / VoiceOver) : à chaque release majeure.
143
+ - **Audit externe RGAA / WCAG complet** : annuel, premier audit
144
+ prévu mi-2026.
145
 
146
  ## Remerciements
147
 
 
151
 
152
  ---
153
 
154
+ *Dernière mise à jour : 2 mai 2026.*
docs/operations/data-retention-rgpd.md CHANGED
@@ -1,7 +1,5 @@
1
  # Rétention des données et conformité RGPD
2
 
3
- > Sprint A11 du plan de remédiation institutionnelle (item M-8).
4
- >
5
  > Ce document décrit **quelles données Picarones collecte**, **où
6
  > elles sont stockées**, **combien de temps**, et **comment un
7
  > usager peut demander leur suppression**.
@@ -52,7 +50,7 @@ export PICARONES_REPORTS_RETENTION_DAYS=180
52
 
53
  ## Mécanismes de purge automatique
54
 
55
- ### Uploads anciens (Sprint A11)
56
 
57
  Le module `picarones.interfaces.web.maintenance` exécute une tâche
58
  asyncio en arrière-plan qui scanne `uploads/` toutes les 6 heures
@@ -71,7 +69,7 @@ upload <id> (last access: <date>)`.
71
 
72
  ### IP du rate-limiter
73
 
74
- Le `RateLimiter` (Sprint 24) garde les compteurs en mémoire, fenêtre
75
  glissante. Aucune persistance disque — les IP disparaissent au
76
  redémarrage et au-delà de la fenêtre de rate limit.
77
 
@@ -156,7 +154,7 @@ traitement.
156
  - Mettre à jour votre registre de traitements en mentionnant
157
  explicitement le sous-traitant.
158
 
159
- Le **mode public** (`PICARONES_PUBLIC_MODE=1`, Sprint 24) refuse
160
  automatiquement les engines cloud — utile pour un déploiement
161
  public où les uploads ne sont pas filtrés.
162
 
@@ -206,7 +204,7 @@ En cas de difficulté ou de désaccord :
206
 
207
  ## Tests automatisés
208
 
209
- Le test `tests/web/test_upload_retention.py` (Sprint A11) valide
210
  que :
211
 
212
  - la purge auto efface les uploads > N jours ;
@@ -215,4 +213,4 @@ que :
215
 
216
  ---
217
 
218
- *Dernière mise à jour : 2 mai 2026 (Sprint A11).*
 
1
  # Rétention des données et conformité RGPD
2
 
 
 
3
  > Ce document décrit **quelles données Picarones collecte**, **où
4
  > elles sont stockées**, **combien de temps**, et **comment un
5
  > usager peut demander leur suppression**.
 
50
 
51
  ## Mécanismes de purge automatique
52
 
53
+ ### Uploads anciens
54
 
55
  Le module `picarones.interfaces.web.maintenance` exécute une tâche
56
  asyncio en arrière-plan qui scanne `uploads/` toutes les 6 heures
 
69
 
70
  ### IP du rate-limiter
71
 
72
+ Le `RateLimiter` garde les compteurs en mémoire, fenêtre
73
  glissante. Aucune persistance disque — les IP disparaissent au
74
  redémarrage et au-delà de la fenêtre de rate limit.
75
 
 
154
  - Mettre à jour votre registre de traitements en mentionnant
155
  explicitement le sous-traitant.
156
 
157
+ Le **mode public** (`PICARONES_PUBLIC_MODE=1`) refuse
158
  automatiquement les engines cloud — utile pour un déploiement
159
  public où les uploads ne sont pas filtrés.
160
 
 
204
 
205
  ## Tests automatisés
206
 
207
+ Le test `tests/web/test_upload_retention.py` valide
208
  que :
209
 
210
  - la purge auto efface les uploads > N jours ;
 
213
 
214
  ---
215
 
216
+ *Dernière mise à jour : 2 mai 2026.*
docs/operations/deployment-institutional.md CHANGED
@@ -1,7 +1,5 @@
1
  # Déploiement institutionnel — Picarones
2
 
3
- > Sprint A11 du plan de remédiation institutionnelle (item M-7).
4
- >
5
  > Ce guide cible les **DSI de bibliothèques nationales et services
6
  > d'archives** qui souhaitent héberger Picarones sur leur propre
7
  > infrastructure (intranet, derrière SSO, avec stockage centralisé)
@@ -16,7 +14,7 @@
16
 
17
  - **Linux x86_64 ou ARM64** (Debian 12+, RHEL 9+, Ubuntu 22.04+
18
  LTS, Rocky 9+).
19
- - **Python 3.11 ou 3.12** (3.13 informationnel — Sprint A1).
20
  - **Tesseract OCR ≥ 5.3** (avec packs `fra`, `lat`, `eng` au
21
  minimum).
22
  - **3 GB RAM par worker** (le ProcessPool spawne un sous-processus
@@ -65,7 +63,7 @@ HuggingFace Space. Le reverse proxy ajoute l'authentification
65
  ```
66
 
67
  Notes :
68
- - **PostgreSQL** : `JobStore` (Sprint 25) utilise SQLite par défaut.
69
  Pour PostgreSQL, dériver une classe `PostgresJobStore` qui
70
  implémente la même API (`create_job`, `update_progress`,
71
  `get_job`, etc.). À défaut, partager la BD SQLite via NFS ne
@@ -96,7 +94,7 @@ PICARONES_RATE_LIMIT_PER_HOUR=0 # 0 = illimité (le SSO gère l'identité)
96
  # Persistance
97
  PICARONES_JOBS_DB=/var/lib/picarones/jobs.sqlite
98
 
99
- # RGPD (Sprint A11)
100
  PICARONES_UPLOAD_RETENTION_DAYS=7
101
  PICARONES_LOG_IP_RETENTION_HOURS=24
102
  ```
@@ -189,7 +187,7 @@ curl http://localhost:7860/api/status
189
  ```
190
 
191
  Les jobs `running` au moment du snapshot sont automatiquement
192
- marqués `interrupted` au redémarrage (Sprint 26). Le tableau de
193
  bord sera donc cohérent.
194
 
195
  ## Migration de schéma BD
@@ -239,11 +237,11 @@ qui expose :
239
  - `picarones_uploads_size_bytes_total`
240
  - `picarones_engine_invocations_total{engine="..."}`
241
 
242
- Voir `docs/operations/observability.md` (à venir Sprint A11+).
243
 
244
  ### Healthcheck
245
 
246
- Un endpoint `/health` minimal (Sprint A4 / M-3) répond en < 50 ms
247
  sans toucher à la BD ni aux engines. Configurer le LB pour le
248
  cibler avec un timeout court (5 s).
249
 
@@ -305,4 +303,4 @@ uniquement** (jamais sur le filesystem en clair). Voir [`SECURITY.md`](../../SEC
305
 
306
  ---
307
 
308
- *Dernière mise à jour : 2 mai 2026 (Sprint A11).*
 
1
  # Déploiement institutionnel — Picarones
2
 
 
 
3
  > Ce guide cible les **DSI de bibliothèques nationales et services
4
  > d'archives** qui souhaitent héberger Picarones sur leur propre
5
  > infrastructure (intranet, derrière SSO, avec stockage centralisé)
 
14
 
15
  - **Linux x86_64 ou ARM64** (Debian 12+, RHEL 9+, Ubuntu 22.04+
16
  LTS, Rocky 9+).
17
+ - **Python 3.11 ou 3.12** (3.13 informationnel).
18
  - **Tesseract OCR ≥ 5.3** (avec packs `fra`, `lat`, `eng` au
19
  minimum).
20
  - **3 GB RAM par worker** (le ProcessPool spawne un sous-processus
 
63
  ```
64
 
65
  Notes :
66
+ - **PostgreSQL** : `JobStore` utilise SQLite par défaut.
67
  Pour PostgreSQL, dériver une classe `PostgresJobStore` qui
68
  implémente la même API (`create_job`, `update_progress`,
69
  `get_job`, etc.). À défaut, partager la BD SQLite via NFS ne
 
94
  # Persistance
95
  PICARONES_JOBS_DB=/var/lib/picarones/jobs.sqlite
96
 
97
+ # RGPD
98
  PICARONES_UPLOAD_RETENTION_DAYS=7
99
  PICARONES_LOG_IP_RETENTION_HOURS=24
100
  ```
 
187
  ```
188
 
189
  Les jobs `running` au moment du snapshot sont automatiquement
190
+ marqués `interrupted` au redémarrage. Le tableau de
191
  bord sera donc cohérent.
192
 
193
  ## Migration de schéma BD
 
237
  - `picarones_uploads_size_bytes_total`
238
  - `picarones_engine_invocations_total{engine="..."}`
239
 
240
+ Voir `docs/operations/observability.md`.
241
 
242
  ### Healthcheck
243
 
244
+ Un endpoint `/health` minimal répond en < 50 ms
245
  sans toucher à la BD ni aux engines. Configurer le LB pour le
246
  cibler avec un timeout court (5 s).
247
 
 
303
 
304
  ---
305
 
306
+ *Dernière mise à jour : 2 mai 2026.*
docs/operations/release-process.md CHANGED
@@ -1,10 +1,10 @@
1
  # Procédure de release
2
 
3
- > Sprint A9 du plan de remédiation institutionnelle
4
- > ([`docs/archive/2026-audits/remediation-plan.md`](../archive/2026-audits/remediation-plan.md)).
5
- > Étendu au Sprint S6 (déploiement institutionnel BnF).
6
 
7
- ## Pré-requis avant tout tag (Sprint S6)
8
 
9
  | Vérif | Commande | Cible |
10
  |---|---|---|
@@ -20,7 +20,7 @@
20
 
21
  Pour un déploiement BnF (mode institutionnel), s'assurer que les
22
  variables d'environnement de production sont prêtes **avant** de
23
- tagger. L'app refuse de démarrer sans (Sprint S6.9).
24
 
25
  | Variable | Public (HF Space) | Institutionnel |
26
  |---|---|---|
@@ -163,7 +163,7 @@ Checklist 30 min après la fin du workflow :
163
  sans erreur et expose `/health`.
164
  - [ ] La GitHub Release affiche bien les release notes attendues.
165
  - [ ] `cffconvert --validate` confirme que `CITATION.cff` cite la
166
- bonne version (Sprint A12+).
167
 
168
  ## Annexe : rollback complet
169
 
 
1
  # Procédure de release
2
 
3
+ > Procédure pour publier une release Picarones (PyPI + Docker + GitHub
4
+ > Release). Contexte historique :
5
+ > [`docs/archive/2026-audits/remediation-plan.md`](../archive/2026-audits/remediation-plan.md).
6
 
7
+ ## Pré-requis avant tout tag
8
 
9
  | Vérif | Commande | Cible |
10
  |---|---|---|
 
20
 
21
  Pour un déploiement BnF (mode institutionnel), s'assurer que les
22
  variables d'environnement de production sont prêtes **avant** de
23
+ tagger. L'app refuse de démarrer sans.
24
 
25
  | Variable | Public (HF Space) | Institutionnel |
26
  |---|---|---|
 
163
  sans erreur et expose `/health`.
164
  - [ ] La GitHub Release affiche bien les release notes attendues.
165
  - [ ] `cffconvert --validate` confirme que `CITATION.cff` cite la
166
+ bonne version.
167
 
168
  ## Annexe : rollback complet
169
 
docs/operations/rollback.md CHANGED
@@ -1,7 +1,7 @@
1
  # Procédure de rollback
2
 
3
- > Sprint S6.11 — guide opérationnel pour rétrograder une version
4
- > Picarones en production institutionnelle.
5
 
6
  Audience : équipe ops BnF / autres institutions.
7
 
 
1
  # Procédure de rollback
2
 
3
+ > Guide opérationnel pour rétrograder une version Picarones en
4
+ > production institutionnelle.
5
 
6
  Audience : équipe ops BnF / autres institutions.
7
 
tests/architecture/test_doc_governance.py CHANGED
@@ -339,7 +339,7 @@ def test_mkdocs_nav_excludes_archive_subdirs() -> None:
339
  #: - quelques fichiers à la racine (README, GOVERNANCE, SECURITY).
340
  #:
341
  #: Cible : 0 (Phase 2 — convergence narrative, lot D9 à prévoir).
342
- ACTIVE_NARRATIVE_BASELINE = 75
343
 
344
 
345
  def test_no_active_doc_contains_sprint_narrative() -> None:
 
339
  #: - quelques fichiers à la racine (README, GOVERNANCE, SECURITY).
340
  #:
341
  #: Cible : 0 (Phase 2 — convergence narrative, lot D9 à prévoir).
342
+ ACTIVE_NARRATIVE_BASELINE = 59
343
 
344
 
345
  def test_no_active_doc_contains_sprint_narrative() -> None: