[RFC] Provenienza nativa dei dati e mappatura dei fatti per Discourse

Ciao Community di Discourse,

Vorrei presentarmi: sono un system designer che sta esplorando l’ecosistema di Discourse. Ammetto di non essere ancora un esperto dell’architettura interna di Discourse, ma ho scelto questa piattaforma per il mio prossimo progetto grazie alla sua robusta gestione dei dati e alla forte struttura comunitaria.

Attualmente sto preparando una proposta da presentare al mio supervisore per l’approvazione dello sviluppo. Il mio obiettivo nel condividerla qui è raccogliere feedback, approfondimenti o critiche costruttive da parte di coloro che conoscono meglio la piattaforma. Il vostro contributo sarebbe prezioso per aiutarmi a perfezionare questo concetto, assicurarmi che sia allineato con le best practice di Discourse e, in definitiva, aumentare le probabilità di approvazione del progetto.

Nota: Il contenuto seguente è piuttosto dettagliato. Grazie in anticipo per qualsiasi consiglio possiate offrire.
Potrei non essere in grado di rispondere immediatamente, ma mi assicurerò di leggere e rispondere a ogni commento il prima possibile.


Specifiche Tecniche

Titolo del Progetto: Discourse OriginGraph & Facto-Mapper
Sottotitolo: Sistema Nativo per il Tracciamento della Provenienza dei Dati e l’Analisi di Affidabilità
Versione: 1.0.0 (Proposta)


1. Sommario Esecutivo

In un’era di rapida diffusione delle informazioni, piattaforme di discussione come Discourse eccellono nell’argomentazione strutturata ma mancano di strumenti nativi per l’Analisi della Provenienza dei Dati e la Visualizzazione dell’Evoluzione Strutturale.

Discourse OriginGraph & Facto-Mapper è un plugin progettato per trasformare Discourse da un forum di discussione standard a un Livello Sistematico di Verifica dei Fatti e di Intelligence. Sfrutta la teoria dei grafi per tracciare la filiera delle informazioni, visualizzare le relazioni e calcolare metriche di affidabilità senza interrompere l’esperienza utente principale.


2. Obiettivi Tecnici

  • Tracciabilità: Grafo Aciclico Diretto (DAG) per Sorgente → Espansione → Verifica
  • Visualizzazione: Mappe dei Fatti interattive nell’interfaccia utente di Discourse
  • Analisi Euristica: Punteggio basato sulla confidenza ponderata (nessun vero/falso binario)
  • Prestazioni: Elaborazione asincrona tramite Sidekiq
  • Integrazione: Rigorosa aderenza all’architettura dei plugin di Discourse

3. Ambito di Lavoro

3.1 Incluso nell’Ambito (In-Scope)

  • Rappresentazione grafica delle relazioni intra-argomento (risposta, citazione, menzione)
  • Estrazione di segnali dall’HTML “cotto” (cooked HTML)
  • Punteggio di Origine / Stabilità configurabile
  • Governance tramite Livelli di Fiducia (Trust Levels) di Discourse

3.2 Escluso dall’Ambito (Out-of-Scope)

  • Analisi semantica NLP / LLM (Fase 1)
  • Sostituzione della ricerca globale
  • Federazione tra istanze

4. Architettura del Sistema

4.1 Stack Tecnologico

  • Backend: Ruby on Rails (Core di Discourse), Sidekiq
  • Frontend: Ember.js, D3.js o Cytoscape.js
  • Database: PostgreSQL 13+, Redis
  • Interscambio Dati: API JSON interna

4.2 Diagramma Architetturale Concettuale

[Client: Ember.js]  <-- JSON -->  [Controller: Rails]
       |                                  |
(Grafo Interattivo)              (Validazione Richieste)
       |                                  |
       v                                  v
[Libreria di Visualizzazione]     [Pool di Lavoratori Sidekiq]
                                          |
                                 +--------+--------+
                                 |                 |
                          [Motore Grafi]     [Motore di Punteggio]
                                 |                 |
                                 +--------+--------+
                                          |
                                    [PostgreSQL]
                           (Archi / Snapshot / Log)

5. Modello Dati (Progettazione Schema)

5.1 Tabella: provenance_edges

Colonna Tipo Indice Descrizione
id BigInt PK ID Arco Univoco
topic_id Integer IDX Riferimento Argomento
source_post_id Integer IDX Nodo di Origine
target_post_id Integer IDX Nodo Destinazione
relation_type Enum reply, quote, ref, correction, contradiction
weight Float Forza dell’Arco
metadata JSONB Dati di Contesto

5.2 Tabella: facto_graph_snapshots

Colonna Tipo Indice Descrizione
id BigInt PK ID Snapshot
topic_id Integer UNIQUE Argomento Associato
version Integer Versione del Grafo
graph_payload JSONB Nodi e archi
computed_at Datetime Tempo di Generazione
is_public Boolean Flag di Visibilità

5.3 Chiavi Redis

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

6. Specifiche API Interna

POST /facto/analyze

  • Auth: TL1+
  • Parametri: topic_id, force_recalc
  • Risposta: 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. Algoritmi e Logica

7.1 Logica di Estrazione del Segnale

  • Iterare tutti i post nell’argomento
  • reply_to_post_number → Arco di Risposta (Reply edge)
  • Analizzare l’HTML cotto → Arco di Citazione (Quote edge)
  • Regex @usernameusername → Arco di Menzione (Mention edge)

7.2 Algoritmo di Punteggio

Centralità ponderata (stile PageRank):

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

Gli archi di contraddizione applicano moltiplicatori di penalità.


8. UX / UI

  • Punto di ingresso: Pulsante “Vista Grafo” nella mappa dell’argomento
  • Grafo modale a schermo intero
  • Passando il mouse sul nodo: snippet del post + autore
  • Clic sul nodo: scorrimento al post
  • Filtri: attivazione/disattivazione tipi di arco

9. Sicurezza e Governance

  • Limitazione della frequenza tramite Discourse RateLimiter
  • Sanitizzazione JSONB per prevenire XSS
  • Gli argomenti privati ereditano l’ACL di Discourse

10. Roadmap di Sviluppo

  • Fase 1: Estrazione MVP del grafo + rendering di base
  • Fase 2: Punteggio avanzato + governance degli snapshot
  • Fase 3: Annotazioni del moderatore + API esterna
1 Mi Piace