[RFC] Procedencia de datos nativa y mapeo de hechos para Discourse

Hola Comunidad de Discourse,

Me gustaría presentarme: soy un diseñador de sistemas que actualmente está explorando el ecosistema de Discourse. Si bien admito que aún no soy un experto en la arquitectura interna de Discourse, he elegido esta plataforma para mi próximo proyecto debido a su sólida gestión de datos y su fuerte estructura comunitaria.

Actualmente estoy preparando una propuesta para presentarla a mi supervisor para su aprobación de desarrollo. Mi objetivo al compartir esto aquí es recopilar comentarios, ideas o críticas constructivas de aquellos de ustedes que conocen mejor la plataforma. Su aporte sería invaluable para ayudarme a refinar este concepto, asegurar que se alinee con las mejores prácticas de Discourse y, en última instancia, aumentar las posibilidades de aprobación del proyecto.

Nota: El contenido a continuación es bastante detallado. Gracias de antemano por cualquier consejo que puedan ofrecer.
Es posible que no pueda responder de inmediato, pero me aseguraré de leer y responder a cada comentario lo antes posible.


Especificación Técnica

Título del Proyecto: Discourse OriginGraph & Facto-Mapper
Subtítulo: Sistema Nativo de Seguimiento de Procedencia de Datos y Análisis de Fiabilidad
Versión: 1.0.0 (Propuesta)


1. Resumen Ejecutivo

En una era de rápida diseminación de información, las plataformas de discusión como Discourse sobresalen en la argumentación estructurada, pero carecen de herramientas nativas para el Análisis de Procedencia de Datos y la Visualización de Evolución Estructural.

Discourse OriginGraph & Facto-Mapper es un plugin diseñado para transformar Discourse de un foro de discusión estándar a una Capa Sistemática de Verificación de Hechos e Inteligencia. Aprovecha la teoría de grafos para rastrear el linaje de la información, visualizar relaciones y calcular métricas de fiabilidad sin alterar la experiencia central del usuario.


2. Objetivos Técnicos

  • Trazabilidad: Grafo Acíclico Dirigido (DAG) para Fuente → Expansión → Verificación
  • Visualización: Mapas de Hechos Interactivos en la Interfaz de Usuario de Discourse
  • Análisis Heurístico: Puntuación basada en confianza ponderada (sin verdadero/falso binario)
  • Rendimiento: Procesamiento asíncrono a través de Sidekiq
  • Integración: Adhesión estricta a la arquitectura de plugins de Discourse

3. Alcance del Trabajo

3.1 Dentro del Alcance

  • Graficación de relaciones intra-tema (respuesta, cita, mención)
  • Extracción de señales del HTML cocido (cooked HTML)
  • Puntuación configurable de Origen / Estabilidad
  • Gobernanza a través de los Niveles de Confianza de Discourse

3.2 Fuera del Alcance

  • Análisis semántico NLP / LLM (Fase 1)
  • Reemplazo de la búsqueda global
  • Federaciones entre instancias

4. Arquitectura del Sistema

4.1 Pila Tecnológica

  • Backend: Ruby on Rails (Núcleo de Discourse), Sidekiq
  • Frontend: Ember.js, D3.js o Cytoscape.js
  • Base de Datos: PostgreSQL 13+, Redis
  • Intercambio de Datos: API JSON Interna

4.2 Diagrama de Arquitectura Conceptual

[Cliente: Ember.js]  <-- JSON -->  [Controlador: Rails]
       |                                  |
(Gráfico Interactivo)              (Validación de Solicitud)
       |                                  |
       v                                  v
[Librería de Visualización]     [Pool de Trabajadores de Sidekiq]
                                          |
                                 +--------+--------+
                                 |                 |
                          [Motor de Grafos]  [Motor de Puntuación]
                                 |                 |
                                 +--------+--------+
                                          |
                                    [PostgreSQL]
                           (Aristas / Instantáneas / Registros)

5. Modelo de Datos (Diseño de Esquema)

5.1 Tabla: provenance_edges

Columna Tipo Índice Descripción
id BigInt PK ID de Arista Única
topic_id Integer IDX Referencia del Tema
source_post_id Integer IDX Nodo de Origen
target_post_id Integer IDX Nodo de Destino
relation_type Enum respuesta, cita, ref, corrección, contradicción
weight Float Fuerza de la Arista
metadata JSONB Datos de Contexto

5.2 Tabla: facto_graph_snapshots

Columna Tipo Índice Descripción
id BigInt PK ID de Instantánea
topic_id Integer ÚNICO Tema Asociado
version Integer Versión del Grafo
graph_payload JSONB Nodos y aristas
computed_at Datetime Tiempo de Generación
is_public Boolean Indicador de Visibilidad

5.3 Claves de Redis

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

6. Especificación de API Interna

POST /facto/analyze

  • Auth: TL1+
  • Parámetros: topic_id, force_recalc
  • Respuesta: job_id, status = en cola

GET /facto/graph/:topic_id

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

7. Algoritmos y Lógica

7.1 Lógica de Extracción de Señales

  • Iterar todas las publicaciones en el tema
  • reply_to_post_number → Arista de Respuesta
  • Analizar HTML cocido → Arista de Cita
  • Regex @nombredeusuario → Arista de Mención

7.2 Algoritmo de Puntuación

Centralidad ponderada (estilo PageRank):

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

Las aristas de contradicción aplican multiplicadores de penalización.


8. UX / UI

  • Punto de entrada: Botón Vista de Grafo en el mapa del tema
  • Gráfico modal a pantalla completa
  • Pasar el ratón sobre el nodo: fragmento de publicación + autor
  • Clic en el nodo: desplazamiento hasta la publicación
  • Filtros: alternar tipos de aristas

9. Seguridad y Gobernanza

  • Limitación de velocidad (Rate limiting) a través de Discourse RateLimiter
  • Sanitización de JSONB para prevenir XSS
  • Los temas privados heredan el ACL de Discourse

10. Hoja de Ruta de Desarrollo

  • Fase 1: Extracción de grafo MVP + renderizado básico
  • Fase 2: Puntuación avanzada + gobernanza de instantáneas
  • Fase 3: Anotaciones de moderador + API externa
1 me gusta