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