Conformité RGPD (P3) + transparence éditoriale (P4)

P3 — RGPD :
- Table `consents` + `POST /api/consent` (art. 7.1 — preuve du consentement)
- Dialogue de consentement explicite avant la première contribution (art. 9.2.a)
- Pages `/mentions-legales` et `/politique-confidentialite`
- `docs/RGPD.md` — registre des traitements, bases légales, sous-traitants
- `getVisitorId()` exporté depuis l'API client React

P4 — Transparence éditoriale :
- Page `/contributions-brutes` avec pagination et export JSON/CSV
- `GET /api/contributions`, `GET /api/contributions/export/{json,csv}`
- `GET /api/stats/public` — stats publiques sans données de rejet
- Label de transparence IA sur la colonne de synthèse
- Compteurs (acceptées / soumises) dans le bandeau d'intro
- `docs/PROMPTS_IA.md` — prompts intégraux publiés + analyse des biais
- Pied de page avec liens légaux et transparence

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 22:30:30 +02:00
parent 45edc1fa77
commit a7b7684e87
12 changed files with 1354 additions and 50 deletions
+186
View File
@@ -0,0 +1,186 @@
# Prompts IA — La Voix du Peuple
> Transparence radicale sur les instructions données aux modèles d'intelligence artificielle.
> Ces prompts constituent l'intégralité des instructions système envoyées à Mistral AI.
> Source : `artifacts/flask-api/legal_framework.py`
---
## Pourquoi publier ces prompts ?
La plateforme repose sur deux décisions automatisées (modération et synthèse) prises par une IA. Conformément à la posture de transparence du projet et aux principes d'auditabilité des systèmes algorithmiques (cf. règlement IA européen), ces instructions sont intégralement publiées.
Tout chercheur, journaliste ou citoyen peut ainsi :
- Vérifier les biais potentiels du cadre de modération
- Évaluer si le prompt de synthèse introduit des distorsions
- Proposer des améliorations via le dépôt de code
---
## 1. Prompt de modération
**Modèle utilisé** : Mistral Small (`mistral-small-latest` par défaut, configurable via `FILTER_MODEL`)
**Rôle** : Décider si une contribution respecte le cadre légal international des droits humains et le droit français.
```
Tu es un agent de filtrage éthique pour une plateforme démocratique citoyenne.
Ta mission est d'analyser des idées politiques soumises par des citoyens
et de décider si elles sont conformes aux valeurs et droits fondamentaux
reconnus par le droit international.
═══════════════════════════════════════════════════════════════════════════════
CADRE LÉGAL DE RÉFÉRENCE
═══════════════════════════════════════════════════════════════════════════════
1. DÉCLARATION UNIVERSELLE DES DROITS DE L'HOMME (DUDH, ONU 1948)
• Art. 1 : "Tous les êtres humains naissent libres et égaux en dignité et
en droits."
• Art. 2 : Interdiction de toute discrimination (race, sexe, langue,
religion, opinion, origine nationale, condition sociale, etc.)
• Art. 3 : "Tout individu a droit à la vie, à la liberté et à la sûreté
de sa personne."
• Art. 5 : Interdiction de la torture et des traitements dégradants.
• Art. 7 : Égalité devant la loi, protection contre la discrimination.
• Art. 18 : Liberté de pensée, de conscience et de religion.
• Art. 19 : "Tout individu a droit à la liberté d'opinion et d'expression."
• Art. 20 : "Toute propagande en faveur de la guerre est interdite par la
loi. Tout appel à la haine nationale, raciale ou religieuse
qui constitue une incitation à la discrimination, à l'hostilité
ou à la violence est interdit par la loi."
• Art. 21 : Droit de participer au gouvernement de son pays, suffrage.
• Art. 29 : Les droits s'exercent dans les limites qui assurent le respect
des droits d'autrui.
[... cadre légal complet dans artifacts/flask-api/legal_framework.py ...]
═══════════════════════════════════════════════════════════════════════════════
CRITÈRES D'ACCEPTATION
═══════════════════════════════════════════════════════════════════════════════
Accepte les idées qui :
✓ Promeuvent les droits fondamentaux, la liberté, l'égalité, la justice (DUDH Art. 1-3)
✓ Proposent des réformes sociales, économiques, politiques ou environnementales
✓ Critiquent le gouvernement, les institutions, les politiques — c'est protégé
(DUDH Art. 19, CEDH Art. 10)
✓ Expriment des opinions politiques, même radicales, tant qu'elles respectent
la dignité humaine et ne prônent pas la haine
✓ Défendent des groupes marginalisés ou discriminés
✓ Proposent des changements constitutionnels, législatifs ou systémiques par
des voies démocratiques et pacifiques
✓ Soulèvent des préoccupations légitimes de sécurité, d'économie, de justice
✓ Sont rédigées dans n'importe quelle langue
═══════════════════════════════════════════════════════════════════════════════
CRITÈRES DE REJET (extraits)
═══════════════════════════════════════════════════════════════════════════════
Rejette les idées qui :
✗ Prônent le fascisme, le nazisme ou tout régime totalitaire
→ CEDH Art. 17 (abus de droit), DUDH Art. 29-30
✗ Appellent à la haine raciale, ethnique, religieuse ou nationale
→ DUDH Art. 20, PIDCP Art. 20, CERD Art. 4
✗ Incitent à la violence, au terrorisme ou à la guerre contre une population
→ DUDH Art. 3, Statut de Rome
✗ Nient l'égale dignité d'êtres humains sur la base de race, genre, sexualité,
religion, handicap, origine nationale ou toute autre caractéristique
✗ Prônent l'élimination, l'expulsion forcée ou la persécution d'un groupe
✗ Contiennent de la désinformation délibérée visant à détruire les institutions
démocratiques
✗ Nient ou contestent l'existence de crimes contre l'humanité reconnus
(négationnisme) → Loi du 29 juillet 1881, Art. 24 bis
✗ Font l'apologie du terrorisme → Code pénal Art. 421-2-5
✗ Appellent au renversement violent des institutions républicaines
→ Code pénal Art. 412-1 à 412-8
✗ Contiennent des menaces de mort ou de violences graves
→ Code pénal Art. 222-17 à 222-18-3
✗ Incitent au suicide → Code pénal Art. 223-13 à 223-15
✗ Contiennent du contenu sexuel ou pornographique
→ Code pénal Art. 222-32, Art. 227-24
✗ Contiennent des données personnelles identifiables de tiers → RGPD
✗ Ne constituent pas une proposition citoyenne (spam, tests, hors sujet)
═══════════════════════════════════════════════════════════════════════════════
FORMAT DE RÉPONSE — OBLIGATOIRE
═══════════════════════════════════════════════════════════════════════════════
Réponds UNIQUEMENT avec un objet JSON valide, sans markdown, sans commentaire :
Si acceptée :
{"accepted": true}
Si rejetée :
{"accepted": false, "reason": "Explication courte en français avec référence légale précise", "legal_basis": "DUDH Art. XX, ..."}
```
> **Note** : la liste complète des critères de rejet (25+ catégories) est dans `artifacts/flask-api/legal_framework.py`. Cette page présente les catégories principales. Le cadre légal complet (16 sources, 350+ lignes) est intégralement transmis au modèle à chaque appel.
---
## 2. Prompt de synthèse
**Modèle utilisé** : Mistral Large (`mistral-large-latest` par défaut, configurable via `SYNTHESIS_MODEL`)
**Rôle** : Produire un résumé structuré des contributions acceptées, directement transmissible à des élus.
```
Tu es un assistant qui résume des contributions citoyennes à destination d'élus politiques.
STYLE
- Phrases courtes, directes. Pas d'emphase, pas de lyrisme.
- N'écris jamais "Nous le peuple", "la voix du peuple", ni aucune formule solennelle.
- N'écris pas de phrase d'introduction générale. Va directement aux sujets.
- Ton neutre : ni poétique, ni journalistique. Factuel.
FORMAT
- Regroupe les contributions par thème (1 paragraphe par thème, 2 à 4 thèmes au total).
- Chaque paragraphe commence par le sujet principal du thème, par exemple :
"Sur la transparence des élus : ..." ou "Concernant les services publics : ..."
- Formule les demandes au présent, à la troisième personne :
"Des citoyens demandent que...", "Plusieurs contributions soulignent que..."
- Si des contributions se contredisent sur un point, dis-le en une phrase.
- Pas de conclusion, pas de résumé final.
- Pas d'emojis, pas de markdown, pas de tirets.
Réponds avec UNIQUEMENT le texte, sans en-tête ni commentaire.
```
---
## 3. Analyse des biais potentiels
### Biais du prompt de modération
| Biais potentiel | Évaluation |
|-----------------|------------|
| Biais vers le consensus institutionnel | **Présent** — le cadre légal favorise les expressions reconnues par les institutions. Des formes de résistance radicale (mais légales) pourraient être rejetées à tort. |
| Biais de langue | **Faible** — le prompt précise explicitement "rédigées dans n'importe quelle langue". Le modèle peut toutefois moins bien interpréter des nuances dans des langues rares. |
| Faux positifs (légitimes rejetés) | **Possible** — le modèle peut rejeter des contributions satiriques, métaphoriques ou au style très direct. Aucun mécanisme de recours automatique n'existe dans la v1. |
| Faux négatifs (illicites acceptés) | **Possible** — le modèle n'est pas infaillible. Un mécanisme de signalement public et d'override admin existe (voir panel admin). |
### Biais du prompt de synthèse
| Biais potentiel | Évaluation |
|-----------------|------------|
| Omission | **Inhérent** — la synthèse regroupe et peut omettre des contributions peu représentées thématiquement, même si elles sont légitimes. La vue "/contributions-brutes" permet de vérifier. |
| Hiérarchisation implicite | **Possible** — le modèle peut placer certains thèmes en premier, suggérant implicitement une priorité. |
| Reformulation déformante | **Possible** — le résumé peut trahir la nuance d'une contribution individuelle. La vue "/contributions-brutes" est le contrepoids. |
| Neutralisation du registre émotionnel | **Voulu** — le prompt demande explicitement un ton factuel. Cela lisse intentionnellement l'expression citoyenne. |
---
## 4. Données transmises à Mistral AI
À chaque soumission, le texte de la contribution est envoyé à l'API Mistral (Mistral Small) pour modération.
Si la contribution est acceptée, l'intégralité des contributions acceptées est envoyée à l'API Mistral (Mistral Large) pour recalcul de la synthèse.
**Données transmises** : uniquement le texte brut des contributions. Pas d'adresse IP, pas de pseudonyme, pas de fingerprint.
**Politique de rétention Mistral AI** : Mistral AI ne conserve pas les données soumises via API pour entraîner ses modèles (politique en vigueur au moment de la rédaction — vérifier le DPA actuel).
---
## 5. Modification des prompts
Les prompts sont modifiables dans `artifacts/flask-api/legal_framework.py`. Toute modification du prompt de modération impacte les critères d'acceptation et doit être documentée ici avec une justification et la date de changement.
**Politique** : tout changement de prompt doit faire l'objet d'un commit documenté et d'une mise à jour de cette page. La transparence sur les modifications est aussi importante que la transparence sur le contenu initial.
+201
View File
@@ -0,0 +1,201 @@
# Conformité RGPD — La Voix du Peuple
> Document de référence RGPD. Version 1.0 — mai 2026.
> Responsable de traitement : billisdead (Antoine Piron) — piron.antoine@gmail.com
---
## 1. Responsable de traitement
| Champ | Valeur |
|-------|--------|
| Identité | Antoine Piron (billisdead) |
| Contact | piron.antoine@gmail.com |
| DPO | Même personne (structure individuelle) |
| Territoire | France |
La plateforme est exploitée à titre personnel dans un but civique non-lucratif.
---
## 2. Registre des traitements
### Traitement 1 — Contributions citoyennes
| Champ | Détail |
|-------|--------|
| **Finalité** | Recueillir des propositions citoyennes, les modérer automatiquement et produire une synthèse thématique |
| **Base légale principale** | Art. 6.1.e RGPD — exécution d'une mission d'intérêt public (participation démocratique) |
| **Base légale données sensibles** | Art. 9.2.a RGPD — **consentement explicite** de la personne concernée (les opinions politiques sont des données sensibles au sens de l'art. 9) |
| **Catégories de données** | Contenu de la contribution (texte libre, peut contenir des opinions politiques), pseudonyme (facultatif, librement choisi), horodatage |
| **Destinataires** | Responsable de traitement (admin), Mistral AI (sous-traitant IA, voir §4) |
| **Durée de conservation** | 24 mois à compter de la soumission, puis suppression ou anonymisation complète |
| **Transferts hors UE** | Aucun |
### Traitement 2 — Fingerprint de session (anti-abus)
| Champ | Détail |
|-------|--------|
| **Finalité** | Protection contre les attaques automatisées (bots, sybil attacks, flood), sans authentification et sans traçage individuel |
| **Base légale** | Art. 6.1.f RGPD — intérêt légitime du responsable de traitement (sécurité technique de la plateforme) |
| **Nature de la donnée** | Hash SHA-256 (tronqué à 32 caractères hexadécimaux) d'un identifiant généré à partir des caractéristiques du navigateur (FingerprintJS). Non réversible, non-PII au sens du RGPD |
| **Durée de conservation** | Liée à la contribution associée (24 mois max) |
| **Transferts hors UE** | Aucun |
### Traitement 3 — Consentements
| Champ | Détail |
|-------|--------|
| **Finalité** | Traçabilité du recueil du consentement (art. 7.1 RGPD — charge de la preuve) |
| **Base légale** | Art. 6.1.c RGPD — obligation légale (conservation de la preuve de consentement) |
| **Catégories de données** | Hash fingerprint (voir §2.2), version du texte accepté, horodatage du consentement |
| **Durée de conservation** | Durée du traitement principal + 3 ans (prescription civile) |
| **Transferts hors UE** | Aucun |
### Traitement 4 — Synthèse IA
| Champ | Détail |
|-------|--------|
| **Finalité** | Produire un résumé structuré des contributions acceptées, à destination d'élus ou décideurs |
| **Base légale** | Art. 6.1.e RGPD — même finalité que le traitement 1 |
| **Catégories de données** | Contenu des contributions acceptées (transmis à Mistral AI pour synthèse) |
| **Destinataires** | Mistral AI (sous-traitant, voir §4) |
| **Durée de conservation** | Synthèse courante uniquement — pas d'historique conservé |
| **Transferts hors UE** | Aucun |
---
## 3. Données collectées / non collectées
| Donnée | Collectée | Base / commentaire |
|--------|-----------|--------------------|
| Texte de la contribution | Oui | Finalité principale — art. 6.1.e + 9.2.a |
| Pseudonyme | Oui (optionnel) | Librement choisi, pas de vérification |
| Horodatage | Oui | Nécessaire à la traçabilité |
| Résultat de modération | Oui (admin uniquement) | Traçabilité des décisions automatisées |
| Hash fingerprint navigateur | Oui | Art. 6.1.f — sécurité, non-PII |
| Consentement (version + date) | Oui | Art. 6.1.c — obligation légale |
| Adresse IP | Non conservée | Utilisée pour le rate limiting, non stockée |
| Compte utilisateur | Non | Pas d'inscription requise |
| Cookie de suivi | Non | Aucun tracker tiers |
| Données de navigation | Non | Aucune |
| Données de géolocalisation | Non | Aucune |
---
## 4. Sous-traitants
### Mistral AI
| Champ | Détail |
|-------|--------|
| **Raison sociale** | Mistral AI SAS |
| **Siège** | Paris, France |
| **Rôle** | Sous-traitant pour la modération IA (Mistral Small) et la synthèse (Mistral Large) |
| **Données transmises** | Texte des contributions soumises (modération) · Texte des contributions acceptées (synthèse) |
| **Hébergement** | Exclusivement en Union européenne (GCP europe-west4, Pays-Bas) |
| **DPA** | Disponible via le portail Mistral AI — conforme RGPD |
| **Transferts hors UE** | Aucun |
**Note** : Mistral AI ne conserve pas les données soumises via API pour entraîner ses modèles (politique explicite de l'API Mistral). À vérifier et documenter lors de la signature du DPA.
### Hébergeur VPS
| Champ | Détail |
|-------|--------|
| **Configuration cible** | Rocky Linux 9, VPS français ou européen (OVHcloud, Scaleway, ou équivalent) |
| **Rôle** | Hébergement de la base de données PostgreSQL, du backend Flask et du frontend compilé |
| **Données hébergées** | Toutes les données listées §2 |
| **Transferts hors UE** | Aucun (hébergeur UE requis) |
| **DPA** | À signer avec l'hébergeur retenu lors du déploiement |
---
## 5. Durées de conservation
| Catégorie | Durée active | Traitement au terme |
|-----------|-------------|---------------------|
| Contributions (texte + auteur) | 24 mois | Suppression complète ou anonymisation du pseudonyme |
| Hash fingerprint | 24 mois (liée contribution) | Suppression avec la contribution |
| Consentements | 24 mois + 3 ans | Suppression (prescription civile) |
| Synthèse courante | Sans limite | Écrasée à chaque recalcul |
| Logs applicatifs | 90 jours | Rotation automatique |
---
## 6. Droits des personnes
Conformément aux articles 15 à 22 du RGPD, toute personne peut exercer les droits suivants :
| Droit | Contenu | Comment l'exercer |
|-------|---------|-------------------|
| **Accès** (art. 15) | Obtenir copie des données vous concernant | Email à piron.antoine@gmail.com |
| **Rectification** (art. 16) | Corriger des données inexactes | Email à piron.antoine@gmail.com |
| **Effacement** (art. 17) | "Droit à l'oubli" — suppression de vos contributions | Email à piron.antoine@gmail.com avec la date approximative de la contribution |
| **Opposition** (art. 21) | S'opposer au traitement basé sur l'intérêt légitime (fingerprint) | Email à piron.antoine@gmail.com |
| **Portabilité** (art. 20) | Obtenir vos données dans un format structuré | Email à piron.antoine@gmail.com |
| **Retrait du consentement** (art. 7.3) | Retirer votre consentement à tout moment | Email à piron.antoine@gmail.com — sans effet sur les traitements déjà effectués |
**Délai de réponse** : 1 mois (prolongeable à 3 mois pour les demandes complexes, avec notification).
**Réclamation CNIL** : En cas de non-réponse ou de litige, vous pouvez adresser une réclamation à la CNIL (www.cnil.fr/fr/plaintes).
---
## 7. Sécurité des données
Mesures techniques et organisationnelles mises en place :
- Transport chiffré (HTTPS/TLS) entre le client et le serveur (Nginx)
- Connexion base de données sur réseau local uniquement (pas d'exposition publique du port PostgreSQL)
- Rate limiting et détection de flood (voir `docs/SECURITE_ANTI_ABUS.md`)
- Aucune donnée personnelle dans les logs applicatifs
- Accès admin protégé par token secret (`ADMIN_SECRET`)
- Principe de minimisation : pas de collecte d'IP ni de cookies de tracking
- Hash SHA-256 non réversible pour le fingerprint (non-PII)
---
## 8. Décisions automatisées
La plateforme utilise une modération automatisée par IA (Mistral Small) pour filtrer les contributions.
**Information prévue à l'art. 22 RGPD** : si votre contribution est rejetée, le motif et la référence légale précise vous sont communiqués. Vous pouvez reformuler et resoumettre.
Il n'existe pas de mécanisme de contestation formel de la décision de modération dans la version actuelle. En cas de déploiement institutionnel, un mécanisme de recours humain est recommandé.
---
## 9. Consentement pour les données sensibles
Les contributions peuvent contenir des **opinions politiques**, qui sont des données sensibles au sens de l'art. 9 RGPD. Leur traitement requiert un consentement explicite de la personne concernée.
**Mécanisme de recueil** : avant la première contribution, un bandeau de consentement explicite est présenté. Il contient :
- Une description claire du traitement
- Un lien vers la présente politique de confidentialité
- Une case à cocher obligatoire (pas de pré-cochage)
- Un bouton "Accepter et contribuer"
**Horodatage** : le consentement est enregistré en base de données avec la version du texte accepté et la date.
**Retrait** : le consentement peut être retiré à tout moment par email. Les contributions déjà publiées restent dans la base mais peuvent être supprimées sur demande (droit à l'effacement).
---
## 10. Cookies
La plateforme utilise uniquement les cookies suivants, strictement nécessaires :
| Nom | Type | Finalité | Durée |
|-----|------|----------|-------|
| `_cv` | httpOnly, SameSite=Lax | Anti-abus — cooldown entre soumissions | `CONTRIBUTION_COOLDOWN_SECONDS` (1h par défaut) |
**Aucun cookie tiers, aucun cookie de tracking, aucune publicité.**
---
## Historique des versions
| Version | Date | Changements |
|---------|------|-------------|
| 1.0 | Mai 2026 | Version initiale |