Files
Alpha/docs/arquitectura_transcripciones.md
T
ricardo 066047f3d1 dual storage: sesiones en BD + markdown como output
- db.ts: v3 con tablas sessions, session_summaries, project_state
- transcriptions-db.ts: CRUD para sesiones, summaries, project state
- project-doc.ts: generateMasterDoc() desde BD (no desde datos en memoria)
- session-analyzer.ts: +sessionDate en prompt y extraction
- TranscriptionsView: flujo parse -> guardar BD -> IA -> project_state -> MD
- docs/arquitectura_transcripciones.md: documentacion oficial del patron
2026-05-28 13:38:19 -05:00

9.8 KiB

Sistema de Transcripciones — Arquitectura

Documentación oficial del pipeline transcripciones en Alpha. Este patrón se hereda a RUMBO.


Filosofía

BD (Dexie/SQLite) = Fuente de verdad
Markdown           = Output generado (nunca se edita manualmente)

El markdown es un artefacto derivado. Siempre se regenera desde la BD. Si necesitás modificar algo, se actualiza la BD y se regenera el .md.


Estructura de Datos

┌─────────────────────────────────────────────────────────────┐
│                      DATABASE (Dexie/IndexedDB)              │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  sessions                                                    │
│  ├── id: number                 ← PK autoincrement          │
│  ├── projectId: number          ← FK a proyectos            │
│  ├── date: string               ← Fecha de la sesión        │
│  ├── title: string              ← Título (ej: "Kickoff")    │
│  ├── fileName: string           ← Archivo original subido   │
│  ├── fileType: string           ← docx|vtt|txt|md           │
│  ├── fileSize: number           ← bytes                     │
│  ├── rawText: string            ← Texto completo parseado   │
│  └── processedAt: string        ← ISO timestamp             │
│                                                             │
│  session_summaries                                           │
│  ├── sessionId: number          ← PK = FK → sessions.id     │
│  ├── summary: string            ← Resumen ejecutivo         │
│  ├── objectives: string         ← JSON array                │
│  ├── tasks: string              ← JSON array                │
│  ├── commitments: string        ← JSON array                │
│  ├── decisions: string          ← JSON array                │
│  ├── keyPoints: string          ← JSON array                │
│  └── modelUsed: string          ← Modelo IA usado           │
│                                                             │
│  project_state                                               │
│  ├── projectId: number          ← PK                        │
│  ├── summary: string            ← Resumen consolidado       │
│  ├── objectives: string         ← JSON array (unificado)    │
│  ├── tasks: string              ← JSON array (consolidado)  │
│  ├── commitments: string        ← JSON array (consolidado)  │
│  └── updatedAt: string          ← ISO timestamp             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│                      OUTPUT (Markdown)                       │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  📄 master-[proyecto].md                                    │
│                                                             │
│  ├── BLOQUE 1 — Consolidado Global                          │
│  │   ├── Resumen ejecutivo (desde project_state)            │
│  │   ├── Objetivos                                          │
│  │   ├── Tareas pendientes (con checkbox)                   │
│  │   └── Compromisos (con estados)                          │
│  │                                                          │
│  └── BLOQUE 2 — Detalle por Sesión                          │
│      ├── 📍 Sesión YYYY-MM-DD — Título                      │
│      │   ├── Resumen                                        │
│      │   ├── Objetivos                                      │
│      │   ├── Tareas                                         │
│      │   ├── Compromisos                                    │
│      │   └── Transcripción completa                          │
│      └── ...                                                │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Flujo Completo

┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐
│  SUBIR   │ →  │  PARSEAR │ →  │ GUARDAR  │ →  │ EXTRAER  │
│  .docx   │    │  .vtt    │    │  EN BD   │    │  CON IA  │
│  .vtt    │    │  .txt    │    │ sessions │    │          │
│  .txt    │    │  .md     │    │          │    │          │
│  .md     │    │          │    │          │    │          │
└──────────┘    └──────────┘    └──────────┘    └──────────┘
                                                      │
                                                      ▼
                                              ┌──────────┐
                                              │ GUARDAR  │
                                              │  RESULT  │
                                              │   EN BD  │
                                              │summaries │
                                              └──────────┘
                                                      │
                                                      ▼
                                              ┌──────────┐
                                              │ ACTUALIZ │
                                              │  project │
                                              │  _state  │
                                              └──────────┘
                                                      │
                                                      ▼
                                              ┌──────────┐
                                              │ GENERAR  │
                                              │  .md     │
                                              └──────────┘

Paso a paso

Paso Acción Tabla afectada
1 Usuario sube archivo(s)
2 Parsear a texto plano (mammoth para .docx, regex para .vtt)
3 Guardar transcripción cruda en BD sessions (INSERT)
4 Enviar a IA para extracción estructurada
5 Guardar resultado de IA en BD session_summaries (INSERT)
6 Recalcular estado consolidado del proyecto project_state (UPSERT)
7 Regenerar documento markdown — (derivado de BD)

Por qué dual storage (BD + Markdown)

Problema Solución con BD
Buscar dentro de transcripciones viejas SELECT * FROM sessions WHERE rawText LIKE '%keyword%'
Marcar tarea como completada UPDATE project_state SET tasks = ... sin re-procesar nada
Regenerar Bloque 1 al agregar sesión nueva Read de BD, no re-procesar sesiones anteriores
Versiones históricas Cada sesión es un registro independiente
Compartir con alguien que no tiene la app Exportar .md — es legible en cualquier editor
Backup La BD se puede respaldar; el .md es un snapshot legible

Por qué el markdown NO es fuente de verdad

  • No se edita manualmente. Si alguien modifica el .md, esos cambios se pierden al regenerar.
  • Es un snapshot. Siempre se puede regenerar desde la BD.
  • Es portable. Se puede compartir, subir a GitHub, etc.

Comparación con la implementación anterior

Aspecto Antes (v1) Ahora (v2)
Storage Solo markdown en project_docs BD estructurada + markdown generado
Transcripciones Solo en memoria Persistidas en sessions
Búsqueda Imposible Query SQL por texto
Estado consolidado Recalculado cada vez desde las sesiones Cacheado en project_state
Editar tarea Había que re-procesar la sesión UPDATE directo a project_state
Sesiones individuales Incrustadas en markdown Registros independientes

Consideraciones para RUMBO

En RUMBO (Tauri + Turso/libSQL), el schema es idéntico pero cambia el engine:

Alpha (browser):   Dexie + IndexedDB   →   Markdown descargable
RUMBO (desktop):   Turso + libSQL      →   Markdown exportable + auto-sync

Las tablas, tipos y flujo son los mismos. Solo cambia:

  • db.sessions.put()INSERT OR REPLACE INTO sessions
  • El markdown se escribe a archivo en ~/RUMBO/projects/[id]/master.md

Documentado: 2026-05-28 Validado en: Alpha Destino: RUMBO