diff --git a/docs/diagrammes/entites/modele-moderation.md b/docs/diagrammes/entites/modele-moderation.md new file mode 100644 index 0000000..3655233 --- /dev/null +++ b/docs/diagrammes/entites/modele-moderation.md @@ -0,0 +1,107 @@ +# Modèle de données - Modération + +📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) + +## Diagramme + +```mermaid +erDiagram + USERS ||--o{ REPORTS : "signale" + USERS ||--o{ CONTENTS : "crée" + USERS ||--o{ MODERATION_BADGES : "possède" + USERS ||--o{ APPEALS : "soumet" + + CONTENTS ||--o{ REPORTS : "concerne" + CONTENTS ||--o{ SANCTIONS : "sanctionné par" + + REPORTS ||--o| SANCTIONS : "génère" + REPORTS ||--o| APPEALS : "fait l'objet de" + REPORTS }o--|| MODERATORS : "traité par" + + APPEALS }o--|| MODERATORS : "examiné par" + + SANCTIONS ||--o{ STRIKES : "crée" + + USERS { + uuid id PK + string email UK + string pseudo UK + int trust_score + string role + } + + CONTENTS { + uuid id PK + uuid creator_id FK + string title + string status + point geo_location + boolean is_moderated + } + + REPORTS { + uuid id PK + uuid content_id FK + uuid reporter_id FK + uuid moderator_id FK + string category + string status + int ai_score + int priority + string decision + } + + SANCTIONS { + uuid id PK + uuid report_id FK + uuid content_id FK + uuid creator_id FK + string sanction_type + int duration_days + boolean is_active + } + + STRIKES { + uuid id PK + uuid creator_id FK + uuid sanction_id FK + int strike_number + boolean is_active + } + + APPEALS { + uuid id PK + uuid report_id FK + uuid creator_id FK + uuid moderator_id FK + string ticket_number UK + string status + string decision + } + + MODERATORS { + uuid id PK + string name + string role + } + + MODERATION_BADGES { + uuid id PK + uuid user_id FK + string badge_type + int reports_validated + decimal accuracy_rate + boolean is_active + } +``` + +## Légende + +**Entités** : +- **REPORTS** : Signalements - 7 catégories (haine, sexuel, illégal, copyright, spam, désinformation, autre), scoring IA 0-100%, priorité CRITIQUE/HAUTE/MOYENNE/BASSE +- **SANCTIONS** : Strike (avertissement), Suspension (7j/30j), Ban permanent +- **APPEALS** : Appels créateurs - ticket #MOD-YYYY-XXXXX, délai 7j, examen 72h +- **STRIKES** : Compteur créateur 1/4 à 4/4 (Strike 4 = ban permanent, expiration 6 mois) +- **MODERATION_BADGES** : Bronze (5 validés, 70%), Argent (20 validés, 80%), Or (50 validés, 90%) + +**Statuts REPORTS** : `received` → `transcribing` → `analyzing` → `pending_review` → `in_review` → `validated`/`rejected` → `closed` diff --git a/docs/diagrammes/etats/signalement-lifecycle.md b/docs/diagrammes/etats/signalement-lifecycle.md new file mode 100644 index 0000000..c74c943 --- /dev/null +++ b/docs/diagrammes/etats/signalement-lifecycle.md @@ -0,0 +1,75 @@ +# Cycle de vie d'un signalement + +📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) + +## Diagramme + +```mermaid +stateDiagram-v2 + [*] --> Reçu: Utilisateur envoie signalement + + Reçu --> EnTranscription: Ajout à la file + + EnTranscription --> EnAnalyseIA: Transcription terminée + + EnAnalyseIA --> EnAttenteModo: Score IA calculé
Priorisé dans la file + EnAnalyseIA --> ActionAuto: Score IA >95%
+ Catégorie évidente + + EnAttenteModo --> EnExamen: Modérateur prend en charge + + EnExamen --> Validé: Violation confirmée + EnExamen --> Rejeté: Pas de violation + + ActionAuto --> Validé: Sanction automatique + + Validé --> SanctionAppliquée: Notification créateur + + SanctionAppliquée --> EnAppel: Créateur conteste
sous 7 jours + SanctionAppliquée --> Clôturé: Pas de contestation
ou délai expiré + + EnAppel --> ExamenAppel: Modérateur senior
examine sous 72h + + ExamenAppel --> AppelAccepté: Sanction annulée + ExamenAppel --> AppelRejeté: Sanction maintenue + + AppelAccepté --> Clôturé: Strike retiré
Contenu rétabli + AppelRejeté --> Clôturé: Sanction définitive + + Rejeté --> Clôturé: Notification signaleur + + Clôturé --> [*] + + note right of EnAttenteModo + File intelligente + Tri par priorité: + - CRITIQUE (score ≥90) + - HAUTE (70-89) + - MOYENNE (40-69) + - BASSE (<40) + end note + + note right of ActionAuto + Action immédiate si: + - Score IA >95% + - Pattern évident + - Spam détecté + end note + + note right of EnAppel + Délai: 7 jours max + Ticket unique généré + end note +``` + +## Légende + +**États principaux** : +- **Reçu** : Signalement initial (<1s) +- **EnTranscription** : Whisper large-v3 (1-20 min) +- **EnAnalyseIA** : Score confiance 0-100% (<1 min) +- **ActionAuto** : Sanction automatique si score >95% +- **EnAttenteModo** : File prioritaire (2h à 72h selon priorité) +- **EnExamen** : Modérateur examine (5-20 min) +- **SanctionAppliquée** : Notification multi-canal +- **EnAppel** : Examen senior (72h max) +- **Clôturé** : Archivage 3 ans (RGPD) diff --git a/docs/diagrammes/flux/moderation-signalement.md b/docs/diagrammes/flux/moderation-signalement.md new file mode 100644 index 0000000..32f04bc --- /dev/null +++ b/docs/diagrammes/flux/moderation-signalement.md @@ -0,0 +1,75 @@ +# Flux de modération - Processus de signalement + +📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) + +## Diagramme + +```mermaid +flowchart TD + Start([Utilisateur signale un contenu]) --> Form[Formulaire signalement
7 catégories + commentaire optionnel] + Form --> Submit[Envoi signalement] + Submit --> Toast[Toast confirmation
Traitement sous 24-48h] + + Submit --> Queue[Ajout file d'attente] + Queue --> Transcription[Transcription automatique
Whisper large-v3] + Transcription --> AI[Analyse IA
Score confiance 0-100%] + + AI --> Priority{Calcul priorité} + Priority -->|Score ≥90| Critical[🔴 CRITIQUE
Traitement <2h] + Priority -->|Score 70-89| High[🟠 HAUTE
Traitement <24h] + Priority -->|Score 40-69| Medium[🟡 MOYENNE
Traitement <24h] + Priority -->|Score <40| Low[⚪ BASSE
Traitement <72h] + + Critical --> AutoAction{Score IA >95%
+ catégorie évidente?} + AutoAction -->|Oui| AutoSanction[Action automatique] + AutoAction -->|Non| ModReview + + High --> ModReview[Examen modérateur] + Medium --> ModReview + Low --> ModReview + + ModReview --> Decision{Décision} + + Decision -->|Validé| Sanction[Application sanction
Strike/Suspension/Ban] + Decision -->|Rejeté| Reject[Signalement rejeté] + + AutoSanction --> Notify + Sanction --> Notify[Notification créateur
Email + Push + In-app] + + Notify --> Creator{Créateur réagit?} + Creator -->|Conteste
sous 7 jours| Appeal[Formulaire d'appel
Ticket généré] + Creator -->|Accepte ou
pas de réaction| Final1[Sanction définitive] + + Appeal --> SeniorMod[Modérateur senior
Examen sous 72h] + SeniorMod --> AppealDecision{Décision appel} + + AppealDecision -->|Accepté| Overturn[Annulation sanction
Strike retiré] + AppealDecision -->|Rejeté| Maintain[Maintien sanction] + + Overturn --> Final2[Décision définitive] + Maintain --> Final2 + + Reject --> NotifyReporter[Notification signaleur
Mise à jour historique] + + Final1 --> End([Fin du processus]) + Final2 --> End + NotifyReporter --> End + + style Critical fill:#ff6b6b,stroke:#c92a2a,color:#fff + style High fill:#ff922b,stroke:#d9480f,color:#fff + style Medium fill:#ffd43b,stroke:#f59f00,color:#000 + style Low fill:#e9ecef,stroke:#adb5bd,color:#000 + style Sanction fill:#fa5252,stroke:#c92a2a,color:#fff + style Overturn fill:#51cf66,stroke:#2b8a3e,color:#fff + style AutoSanction fill:#ff6b6b,stroke:#c92a2a,color:#fff +``` + +## Légende + +**Priorités de traitement** : +- 🔴 **CRITIQUE** (score ≥90) : <2h - Violence, suicide, danger immédiat +- 🟠 **HAUTE** (70-89) : <24h - Haine, harcèlement +- 🟡 **MOYENNE** (40-69) : <24h - Spam, contenu inapproprié +- ⚪ **BASSE** (<40) : <72h - Qualité audio, tags incorrects + +**Calcul priorité** : `(Score_IA × 0.7) + (Signalements_cumulés × 0.2) + (Fiabilité_signaleur × 0.1)` diff --git a/docs/diagrammes/sequence/processus-appel-moderation.md b/docs/diagrammes/sequence/processus-appel-moderation.md new file mode 100644 index 0000000..23fc4ef --- /dev/null +++ b/docs/diagrammes/sequence/processus-appel-moderation.md @@ -0,0 +1,59 @@ +# Processus d'appel de modération + +📖 Voir [Règles métier - Section 14 : Modération Flows](../../regles-metier/14-moderation-flows.md) + +## Diagramme + +```mermaid +sequenceDiagram + actor Créateur + participant App as Application Mobile + participant API as Backend API + participant Email as Service Email + actor ModSenior as Modérateur Senior + + Note over Créateur,ModSenior: Notification sanction initiale + + API->>Créateur: Email + Push + In-app
(catégorie + raison + extrait) + + Note over Créateur,ModSenior: Soumission appel (J+0 à J+7) + + Créateur->>App: Clique "Contester cette décision" + App->>Créateur: Affiche formulaire d'appel + + Créateur->>App: Remplit formulaire + preuves + App->>API: POST /appeals + + API->>API: Génère ticket #MOD-2026-XXXXX + + API->>Email: Email confirmation + Email->>Créateur: "Appel traité sous 72h" + + Note over Créateur,ModSenior: Examen modérateur senior (J+0 à J+3) + + ModSenior->>API: Consulte appel + API-->>ModSenior: Données complètes
(signalement + arguments + historique) + + alt Appel accepté + ModSenior->>API: Accepter appel + API->>Email: Email créateur + Email->>Créateur: "✅ Appel accepté
Strike retiré" + else Appel rejeté + ModSenior->>API: Rejeter appel + API->>Email: Email créateur + Email->>Créateur: "❌ Appel rejeté
Décision définitive" + end + + opt Cas complexe (J+3) + API->>Email: Email intermédiaire + Email->>Créateur: "Examen approfondi
Réponse sous 2 jours" + end +``` + +## Légende + +**Phases** : +1. **Notification sanction** : Multi-canal (Email + Push + In-app) +2. **Soumission appel** : Délai 7 jours max après sanction, formulaire obligatoire (raison + arguments), preuves optionnelles (max 5 fichiers, 10 MB) +3. **Examen senior** : 72h standard, 5 jours si complexe avec notification intermédiaire J+3 +4. **Décision** : Accepté (strike retiré, contenu rétabli) ou Rejeté (définitif, pas de second appel) diff --git a/mkdocs.yml b/mkdocs.yml index fec7c46..cbb2989 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -36,11 +36,16 @@ theme: plugins: - search: lang: fr + - glightbox: # Lightbox pour agrandir les images markdown_extensions: - admonition - pymdownx.details - - pymdownx.superfences + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format - pymdownx.tabbed: alternate_style: true - pymdownx.emoji: @@ -50,6 +55,7 @@ markdown_extensions: - toc: permalink: true - attr_list + - md_in_html # Permet d'utiliser du markdown dans du HTML - def_list nav: @@ -109,6 +115,15 @@ nav: - Transverse: - '19: Autres Comportements': regles-metier/19-autres-comportements.md - 'Annexe: Post-MVP': regles-metier/ANNEXE-POST-MVP.md + - Diagrammes: + - Flux: + - 'Processus de signalement': diagrammes/flux/moderation-signalement.md + - États: + - 'Cycle de vie signalement': diagrammes/etats/signalement-lifecycle.md + - Séquences: + - "Processus d'appel modération": diagrammes/sequence/processus-appel-moderation.md + - Entités: + - 'Modèle modération': diagrammes/entites/modele-moderation.md - Documentation Légale: - Introduction: legal/README.md - "Conditions Générales d'Utilisation": legal/cgu.md @@ -117,6 +132,10 @@ nav: - 'Charte Créateur': legal/charte-createur.md - 'Mentions Légales': legal/mentions-legales.md - 'Politique de Confidentialité': legal/politique-confidentialite.md + - Interfaces: + - Vue d'ensemble: interfaces/README.md + - Mobile: + - Navigation & Architecture: interfaces/mobile/navigation.md - Mobile: - 'Stratégie Permissions': mobile/permissions-strategy.md - 'Validation TestFlight': mobile/testflight-validation-plan.md