Files
Alpha/docs/arquitectura_transcripciones.md
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

181 lines
9.8 KiB
Markdown

# 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*