[RFC] Proveniência de Dados Nativa e Mapeamento de Fatos para Discourse

Olá Comunidade Discourse,

Gostaria de me apresentar: sou um designer de sistemas explorando atualmente o ecossistema Discourse. Embora admita que ainda não sou um especialista na arquitetura interna do Discourse, escolhi esta plataforma para o meu próximo projeto devido à sua robusta gestão de dados e forte estrutura comunitária.

Atualmente, estou preparando uma proposta para apresentar à minha supervisora para aprovação do desenvolvimento. Meu objetivo ao compartilhar isto aqui é coletar feedback, percepções ou críticas construtivas daqueles que conhecem melhor a plataforma. Sua contribuição seria inestimável para me ajudar a refinar este conceito, garantir que ele se alinhe com as melhores práticas do Discourse e, finalmente, aumentar as chances de aprovação do projeto.

Nota: O conteúdo abaixo é bastante detalhado. Agradeço antecipadamente por qualquer conselho que possam oferecer.
Pode ser que eu não consiga responder imediatamente, mas farei questão de ler e responder a todos os comentários o mais breve possível.


Especificação Técnica

Título do Projeto: Discourse OriginGraph & Facto-Mapper
Subtítulo: Sistema Nativo de Rastreamento de Proveniência de Dados e Análise de Confiabilidade
Versão: 1.0.0 (Proposta)


1. Resumo Executivo

Em uma era de rápida disseminação de informações, plataformas de discussão como o Discourse se destacam na argumentação estruturada, mas carecem de ferramentas nativas para Análise de Proveniência de Dados e Visualização da Evolução Estrutural.

Discourse OriginGraph & Facto-Mapper é um plugin projetado para transformar o Discourse de um fórum de discussão padrão em uma Camada Sistemática de Verificação de Fatos e Inteligência. Ele utiliza a teoria dos grafos para rastrear a linhagem da informação, visualizar relacionamentos e calcular métricas de confiabilidade sem interromper a experiência central do usuário.


2. Objetivos Técnicos

  • Rastreabilidade: Grafo Acíclico Direcionado (DAG) para Fonte → Expansão → Verificação
  • Visualização: Mapas de Fatos Interativos na Interface do Usuário do Discourse
  • Análise Heurística: Pontuação baseada em confiança ponderada (sem verdadeiro/falso binário)
  • Desempenho: Processamento assíncrono via Sidekiq
  • Integração: Adesão estrita à arquitetura de plugins do Discourse

3. Escopo do Trabalho

3.1 No Escopo

  • Criação de grafos de relacionamento intra-tópico (resposta, citação, menção)
  • Extração de sinais do HTML cozido (cooked HTML)
  • Pontuação configurável de Origem / Estabilidade
  • Governança via Níveis de Confiança (Trust Levels) do Discourse

3.2 Fora do Escopo

  • Análise semântica de PNL / LLM (Fase 1)
  • Substituição da busca global
  • Federação entre instâncias

4. Arquitetura do Sistema

4.1 Pilha de Tecnologia (Technology Stack)

  • Backend: Ruby on Rails (Núcleo do Discourse), Sidekiq
  • Frontend: Ember.js, D3.js ou Cytoscape.js
  • Banco de Dados: PostgreSQL 13+, Redis
  • Intercâmbio de Dados: API JSON Interna

4.2 Diagrama de Arquitetura Conceitual

[Cliente: Ember.js]  <-- JSON -->  [Controlador: Rails]
       |                                  |
(Gráfico Interativo)              (Validação de Requisição)
       |                                  |
       v                                  v
[Biblioteca de Visualização]     [Pool de Workers Sidekiq]
                                          |
                                 +--------+--------+
                                 |                 |
                          [Motor de Grafo]     [Motor de Pontuação]
                                 |                 |
                                 +--------+--------+
                                          |
                                    [PostgreSQL]
                           (Arestas / Snapshots / Logs)

5. Modelo de Dados (Design de Esquema)

5.1 Tabela: provenance_edges

Coluna Tipo Índice Descrição
id BigInt PK ID da Aresta Única
topic_id Integer IDX Referência do Tópico
source_post_id Integer IDX Nó de Origem
target_post_id Integer IDX Nó de Destino
relation_type Enum resposta, citação, referência, correção, contradição
weight Float Força da Aresta
metadata JSONB Dados de Contexto

5.2 Tabela: facto_graph_snapshots

Coluna Tipo Índice Descrição
id BigInt PK ID do Snapshot
topic_id Integer UNIQUE Tópico Associado
version Integer Versão do Grafo
graph_payload JSONB Nós e Arestas
computed_at Datetime Tempo de Geração
is_public Boolean Sinalizador de Visibilidade

5.3 Chaves Redis

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

6. Especificação da API Interna

POST /facto/analyze

  • Auth: TL1+
  • Parâmetros: topic_id, force_recalc
  • Resposta: 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. Algoritmos & Lógica

7.1 Lógica de Extração de Sinal

  • Iterar todas as postagens no tópico
  • reply_to_post_number → Aresta de Resposta (Reply edge)
  • Analisar HTML cozido → Aresta de Citação (Quote edge)
  • Regex @usernameusername → Aresta de Menção (Mention edge)

7.2 Algoritmo de Pontuação

Centralidade ponderada (estilo PageRank):

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

Arestas de contradição aplicam multiplicadores de penalidade.


8. UX / UI

  • Ponto de entrada: Botão de Visualização de Grafo no mapa do tópico
  • Gráfico em modal de tela cheia
  • Passar o mouse sobre o nó: trecho da postagem + autor
  • Clicar no nó: rolar até a postagem
  • Filtros: alternar tipos de arestas

9. Segurança & Governança

  • Limitação de taxa (Rate limiting) via Discourse RateLimiter
  • Sanitização de JSONB para prevenir XSS
  • Tópicos privados herdam o ACL do Discourse

10. Roteiro de Desenvolvimento

  • Fase 1: Extração de grafo MVP + renderização básica
  • Fase 2: Pontuação avançada + governança de snapshots
  • Fase 3: Anotações de moderador + API externa
1 curtida