066047f3d1
- 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
9.8 KiB
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