Spaces:
Sleeping
Sleeping
Claude commited on
docs(operations): remove sprint narrative (Phase 2 L2)
Browse filesReformulation 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 |
-
>
|
| 4 |
-
>
|
|
|
|
| 5 |
>
|
| 6 |
-
> **Statut au 2 mai 2026** : audit interne
|
| 7 |
-
>
|
| 8 |
-
>
|
| 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**
|
| 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**
|
| 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 |
-
|
| 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
|
| 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. |
|
| 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``
|
| 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
|
| 144 |
-
|
| 145 |
|
| 146 |
## Remerciements
|
| 147 |
|
|
@@ -151,4 +151,4 @@ permission de diffusion ouverte.
|
|
| 151 |
|
| 152 |
---
|
| 153 |
|
| 154 |
-
*Dernière mise à jour : 2 mai 2026
|
|
|
|
| 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
|
| 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`
|
| 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`
|
| 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`
|
| 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
|
|
|
|
| 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
|
| 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`
|
| 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
|
| 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
|
| 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`
|
| 243 |
|
| 244 |
### Healthcheck
|
| 245 |
|
| 246 |
-
Un endpoint `/health` minimal
|
| 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
|
|
|
|
| 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 |
-
>
|
| 4 |
-
>
|
| 5 |
-
>
|
| 6 |
|
| 7 |
-
## Pré-requis avant tout tag
|
| 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
|
| 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
|
| 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 |
-
>
|
| 4 |
-
>
|
| 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 =
|
| 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:
|