[RFC] Provenance des données native et mappage des faits pour Discourse

Bonjour à la communauté Discourse,

Je voudrais me présenter : je suis un concepteur de systèmes explorant actuellement l’écosystème Discourse. Bien que je doive admettre ne pas être encore un expert de l’architecture interne de Discourse, j’ai choisi cette plateforme pour mon projet à venir en raison de sa gestion de données robuste et de sa solide structure communautaire.

Je prépare actuellement une proposition à présenter à mon superviseur pour approbation du développement. Mon objectif en partageant ceci ici est de recueillir des commentaires, des aperçus ou des critiques constructives de la part de ceux d’entre vous qui connaissent le mieux la plateforme. Votre contribution serait inestimable pour m’aider à affiner ce concept, à garantir qu’il s’aligne sur les meilleures pratiques de Discourse et, finalement, à augmenter les chances d’approbation du projet.

Note : Le contenu ci-dessous est assez détaillé. Merci d’avance pour tous les conseils que vous pourrez offrir.
Il se peut que je ne puisse pas répondre immédiatement, mais je veillerai à lire et à répondre à chaque commentaire dès que possible.


Spécification Technique

Titre du Projet : Discourse OriginGraph & Facto-Mapper
Sous-titre : Système Natif de Suivi de Provenance des Données et d’Analyse de Fiabilité
Version : 1.0.0 (Proposition)


1. Résumé Exécutif

À une époque de diffusion rapide de l’information, les plateformes de discussion comme Discourse excellent dans l’argumentation structurée mais manquent d’outils natifs pour l’Analyse de Provenance des Données et la Visualisation de l’Évolution Structurelle.

Discourse OriginGraph & Facto-Mapper est un plugin conçu pour transformer Discourse d’un forum de discussion standard en une Couche Systématique de Vérification des Faits et de Renseignement. Il exploite la théorie des graphes pour tracer l’ascendance de l’information, visualiser les relations et calculer des métriques de fiabilité sans perturber l’expérience utilisateur de base.


2. Objectifs Techniques

  • Traçabilité : Graphe Acyclique Dirigé (DAG) pour Source → Expansion → Vérification
  • Visualisation : Cartes de Faits interactives dans l’interface utilisateur de Discourse
  • Analyse Heuristique : Notation basée sur la confiance pondérée (pas de vrai/faux binaire)
  • Performance : Traitement asynchrone via Sidekiq
  • Intégration : Adhésion stricte à l’architecture des plugins Discourse

3. Périmètre des Travaux

3.1 Dans le Périmètre (In-Scope)

  • Graphique des relations intra-sujets (réponse, citation, mention)
  • Extraction de signaux à partir du HTML cuit (cooked HTML)
  • Notation de l’Origine / Stabilité configurable
  • Gouvernance via les Niveaux de Confiance (Trust Levels) de Discourse

3.2 Hors Périmètre (Out-of-Scope)

  • Analyse sémantique NLP / LLM (Phase 1)
  • Remplacement de la recherche globale
  • Fédérations inter-instances

4. Architecture Système

4.1 Pile Technologique

  • Backend : Ruby on Rails (Noyau Discourse), Sidekiq
  • Frontend : Ember.js, D3.js ou Cytoscape.js
  • Base de données : PostgreSQL 13+, Redis
  • Échange de données : API JSON interne

4.2 Diagramme d’Architecture Conceptuel

[Client: Ember.js]  <-- JSON -->  [Contrôleur : Rails]
       |                                  |
(Graphique Interactif)             (Validation des Requêtes)
       |                                  |
       v                                  v
[Bibliothèque de Visualisation]    [Pool de Travailleurs Sidekiq]
                                          |
                                 +--------+--------+
                                 |                 |
                          [Moteur de Graphe]   [Moteur de Notation]
                                 |                 |
                                 +--------+--------+
                                          |
                                    [PostgreSQL]
                           (Arêtes / Instantanés / Journaux)

5. Modèle de Données (Conception du Schéma)

5.1 Table : provenance_edges

Colonne Type Index Description
id BigInt PK ID d’Arête Unique
topic_id Integer IDX Référence du Sujet
source_post_id Integer IDX Nœud Source
target_post_id Integer IDX Nœud Destination
relation_type Enum réponse, citation, référence, correction, contradiction
weight Float Force de l’Arête
metadata JSONB Données de Contexte

5.2 Table : facto_graph_snapshots

Colonne Type Index Description
id BigInt PK ID de l’Instantané
topic_id Integer UNIQUE Sujet Associé
version Integer Version du Graphe
graph_payload JSONB Nœuds et Arêtes
computed_at Datetime Heure de Génération
is_public Boolean Indicateur de Visibilité

5.3 Clés Redis

  • facto:quota:user:{id}:daily
  • facto:job:topic:{id}:status

6. Spécification de l’API Interne

POST /facto/analyze

  • Auth : TL1+
  • Params : topic_id, force_recalc
  • Réponse : job_id, status = queued

GET /facto/graph/:topic_id

version: 5
nodes:
  - id: 101
    group: source
    score: 0.8
edges:
  - source: 101
    target: 105
    type: verification

7. Algorithmes & Logique

7.1 Logique d’Extraction de Signal

  • Itérer sur tous les messages du sujet
  • reply_to_post_number → Arête de Réponse (Reply edge)
  • Analyser le HTML cuit → Arête de Citation (Quote edge)
  • Regex @nomutilisateur → Arête de Mention (Mention edge)

7.2 Algorithme de Notation

Centralité pondérée (style PageRank) :

Score(P) = (1 - d) + d × Σ((Score(Pi) × Weight(Ei,P)) / OutDegree(Pi))

Les arêtes de contradiction appliquent des multiplicateurs de pénalité.


8. UX / UI

  • Point d’entrée : Bouton Vue Graphique dans la carte du sujet
  • Graphique modal plein écran
  • Survol du nœud : extrait du message + auteur
  • Clic sur le nœud : défilement vers le message
  • Filtres : basculer les types d’arêtes

9. Sécurité & Gouvernance

  • Limitation de débit via Discourse RateLimiter
  • Assainissement JSONB pour prévenir le XSS
  • Les sujets privés héritent de l’ACL de Discourse

10. Feuille de Route de Développement

  • Phase 1 : Extraction du graphe MVP + rendu de base
  • Phase 2 : Notation avancée + gouvernance des instantanés
  • Phase 3 : Annotations de modérateur + API externe
1 « J'aime »