# Checklist de Desarrollo

## Instrucción de uso

Este archivo debe actualizarse en cada avance importante. No se usa como plan narrativo, sino como control operativo del estado real del proyecto.

Leyenda sugerida:

- `[ ]` No iniciado
- `[-]` En progreso
- `[x]` Hecho
- `[!]` Bloqueado

## 1. Descubrimiento y definición

- [x] Definir objetivo general del producto
- [x] Definir base transcript-first para fase inicial
- [x] Separar concepto de clip vs estado editorial del texto
- [x] Definir idea de preview sincronizado transcript + video
- [x] Definir necesidad de timeline y waveform para ajuste fino
- [x] Definir dirección visual tipo OBS
- [x] Definir que la secuencia editada puede diferir del orden original
- [x] Identificar librerías base necesarias
- [x] Definir que el trim principal debe resolverse dentro de la app
- [x] Definir que el XML funciona como exportación final e interoperabilidad con Premiere
- [x] Definir que fps y resolución deben leerse automáticamente del video
- [x] Definir xmeml como estrategia inicial a validar para exportación a Premiere
- [x] Definir que la app debe exportar una versión recortada del video
- [-] Cerrar alcance exacto del MVP
- [ ] Definir formato XML objetivo exacto para Premiere

## 2. Base del repositorio

- [x] Crear estructura base de carpetas
- [x] Inicializar proyecto Django
- [x] Inicializar frontend
- [x] Configurar entorno local
- [x] Configurar variables de entorno
- [x] Configurar almacenamiento de archivos
- [x] Configurar API base
- [x] Añadir verificación automática de símbolos no definidos en frontend
- [x] Configurar layout base del editor
- [x] Implementar panel inicial de administración de proyectos

## 3. Modelado del dominio

- [x] Definir modelo Proyecto
- [x] Definir modelo MediaAsset o VideoSource
- [x] Definir modelo Transcript
- [x] Definir modelo TranscriptSegment
- [x] Definir modelo AISuggestion
- [x] Definir modelo Clip
- [x] Definir modelo Sequence
- [ ] Definir modelo TrimAdjustment
- [x] Definir modelo ExportJob
- [x] Definir estados editoriales del texto
- [x] Definir reglas de persistencia del orden narrativo

## 4. Ingesta de archivos

- [x] Implementar subida de video
- [x] Implementar subida de SRT
- [x] Permitir creación de proyecto solo con MP4
- [x] Validar extensiones y MIME types
- [x] Obtener duración y metadatos del video
- [x] Guardar fps del video con precisión suficiente para exportación
- [x] Guardar resolución del video fuente
- [x] Guardar sample rate y canales de audio
- [x] Parsear contenido del SRT
- [x] Guardar transcript fuente
- [x] Guardar segmentos del transcript
- [x] Mostrar transcript básico en UI

## 4.1 Fuente multipartes y append

- [x] Persistir videos anexados como partes independientes del proyecto
- [x] Persistir transcripts `part` por cada video añadido
- [x] Recomponer el transcript activo del proyecto desde partes sin depender de un MP4 compuesto
- [x] Exponer offsets globales y duración acumulada del proyecto multipartes
- [x] Permitir preview y scrub multipartes en el editor clásico usando tiempo global
- [x] Generar waveform y thumbnails virtuales para timeline multipartes
- [x] Detectar reuploads del mismo video por fingerprint y reutilizar procesamiento previo
- [x] Permitir sobrescritura explícita (`overwrite_existing`) en creación y append
- [x] Evitar polling/transcripción redundantes cuando el backend ya devolvió una reutilización lista

## 5. Normalización del transcript

- [ ] Unir líneas partidas del SRT
- [ ] Limpiar ruido obvio
- [ ] Normalizar espacios y saltos
- [ ] Reconstruir unidades editables
- [ ] Conservar referencia al tiempo original
- [ ] Preparar payload utilizable para IA

## 5.1 Transcripción local y alineación

- [x] Extraer pista de audio a WAV mono 16 kHz
- [x] Integrar backend local de transcripción con word timestamps
- [x] Integrar backend avanzado `stable-ts`
- [x] Promover `stable-ts` como backend por defecto en settings
- [x] Persistir transcript `asr-local`
- [x] Persistir palabras con `start_ms` y `end_ms`
- [x] Exponer endpoint para lanzar transcripción por proyecto
- [x] Exponer endpoint de estado para polling de transcripción
- [x] Exponer endpoint para consultar palabras alineadas
- [x] Priorizar transcript ASR local en bootstrap cuando exista
- [x] Manejar como 400 el caso sin segmentos detectados
- [x] Disparar procesamiento de audio cuando no se sube SRT
- [x] Validar smoke test end-to-end del backend avanzado con persistencia real
- [x] Validar retranscripción asíncrona con progreso visible y recarga final de bootstrap
- [-] Unificar edición y sugerencias existentes con transcript ASR local

## 6. Integración con IA

- [x] Definir prompt editorial inicial
- [x] Definir respuesta JSON esperada
- [-] Implementar llamada a la API
- [x] Validar estructura de salida
- [x] Manejar errores de respuesta
- [x] Guardar sugerencia de IA

## 6.1 Bucle de aprendizaje para depuración

- [x] Definir dataset fuente para análisis profundo por proyecto
- [x] Excluir secuencias transitorias de review del análisis comparativo
- [x] Consolidar por secuencia: entrada enviada a IA vs salida depurada vs edición final
- [x] Calcular métricas base: palabras originales, post-depuración, post-edición manual
- [x] Diseñar endpoint de análisis profundo por proyecto
- [x] Diseñar slide 5 del shell para análisis profundo
- [x] Mostrar historial/versiones del prompt de depuración en slide 5
- [x] Permitir activar una versión concreta del prompt de depuración
- [x] Permitir generar una propuesta de nueva versión del prompt desde el análisis comparativo
- [ ] Registrar aprobación/rechazo del usuario sobre la propuesta de ajuste del prompt
- [x] Relacionar sugerencia con segmentos reales
- [x] Persistir trazas editoriales con request/response, tokens y costo por corrida
- [x] Mostrar sugerencias en UI
- [x] Inyectar objetivos editoriales del workspace en discovery y judge
- [x] Persistir procedencia técnica del pipeline y fallbacks por candidato
- [x] Separar pase conversacional previo para distinguir conversación útil vs relleno
- [x] Eliminar el cuello artificial de 6 macrosegmentos en candidate-pass
- [x] Persistir auditoría de cobertura editorial por scan
- [x] Mostrar auditoría de cobertura en Status y Agente editorial
- [x] Bloquear rangos con pruning interno excesivo en discovery, judge y depurar salvo instrucción explícita de recorte
- [x] Mostrar contador diario de costo y tokens OpenAI en el header del editor
- [x] Mostrar dos conjuntos en header: total del proyecto y total del mes
- [x] Consultar y mostrar costos oficiales OpenAI vía Admin API cuando haya `OPENAI_ADMIN_API_KEY`
- [x] Mostrar explícitamente si la telemetría de costo está `full`, `partial` o `blind`
- [-] Validar con proyectos reales el ajuste de conversation-map y juicio global
- [x] Reorientar prompts y límites del pipeline para priorizar cobertura de conversaciones y subtemas por encima de la compresión por `target_count`
- [x] Añadir una capa local de subdivisión temática para bloques largos antes del `candidate-pass`

## 7. Editor de transcript

- [x] Renderizar transcript como superficie interactiva
- [x] Renderizar transcript como texto corrido sin timestamps dominantes
- [x] Mostrar texto sugerido
- [x] Mostrar texto removido en gris
- [x] Mostrar texto agregado manualmente
- [x] Mostrar texto movido con marca visible
- [x] Mostrar leyenda de cambios
- [x] Soportar click para navegar al video
- [x] Soportar selección manual
- [x] Soportar creación manual de clip
- [x] Soportar edición de clip existente
- [x] Soportar anulación palabra por palabra derivando nuevos clips locales
- [x] Soportar corte editorial manual dentro del transcript
- [x] Convertir rangos del transcript fuente en selecciones primarias y secuencia manual sin pasos redundantes

## 8. Interacciones avanzadas de clip

- [ ] Implementar Alt + click para iniciar clip
- [ ] Implementar Alt + click para cerrar clip
- [ ] Mostrar preview temporal del rango mientras se crea
- [ ] Mostrar clip como fondo o capa detrás del texto
- [ ] Soportar clips solapados
- [ ] Diferenciar solapamientos con tonos/capas
- [ ] Seleccionar clip desde transcript
- [x] Seleccionar clip desde listado lateral
- [x] Editar bordes de clip
- [x] Eliminar clip

## 9. Reordenamiento narrativo

- [x] Mostrar lista de clips sugeridos
- [x] Permitir reordenar clips
- [x] Sincronizar nuevo orden con transcript editado
- [x] Marcar en transcript fuente qué texto fue movido
- [x] Mostrar leyenda de destino del texto movido
- [x] Persistir orden editado

## 10. Preview sincronizado

- [x] Hacer click en clip y saltar al video
- [x] Hacer click en transcript y saltar al video
- [x] Reproducir un clip aislado
- [x] Reproducir secuencia editada completa
- [x] Resaltar clip activo
- [ ] Resaltar rango activo en transcript
- [x] Sincronizar listado lateral con reproducción
- [x] Configurar titulo principal por secuencia con menu, duracion y texto override

## 11. Timeline y audio

- [x] Dibujar timeline en la página
- [x] Dibujar waveform de audio
- [x] Mostrar playhead
- [x] Mostrar clips en timeline
- [x] Derivar clips de timeline desde palabras activas del transcript
- [x] Activar clip desde timeline
- [x] Mostrar lane grafica `G` para el titulo principal y reabrir su menu desde el clip
- [x] Ajustar in manual con precisión suficiente para exportación final
- [x] Ajustar out manual con precisión suficiente para exportación final
- [x] Implementar nudge fino por teclado
- [x] Guardar trims corregidos
- [x] Soportar corte exacto con `Ctrl/Cmd + C`
- [x] Soportar trim exacto desde scrub en timeline
- [x] Cargar waveform y thumbnails según ventana visible

## 12. Persistencia

- [ ] Guardar proyecto manualmente
- [x] Guardar autosave básico
- [x] Recuperar proyecto existente
- [x] Restaurar transcript anotado
- [x] Restaurar clips
- [x] Restaurar orden narrativo
- [x] Restaurar trims
- [x] Persistir la secuencia manual creada desde selecciones primarias
- [x] Persistir historial de undo/redo dentro del draft editorial
- [x] Recuperar draft desde clips persistidos cuando falta el draft local

## 12.1 Persistencia de layout y preview

- [x] Guardar layout del workspace por proyecto
- [x] Restaurar alturas de tracks y split del editor
- [x] Guardar formato de canvas del preview
- [x] Restaurar selector de canvas al reabrir el proyecto
- [x] Persistir estado del titulo principal por secuencia dentro del draft editorial

## 12.2 Herramientas operativas

- [x] Añadir scripts de arranque rápido para Windows
- [x] Añadir launcher maestro para backend + frontend

## 13. Exportación

- [-] Elegir tipo de XML exacto
- [x] Crear spike de exportación lineal estilo xmeml
- [x] Traducir secuencia a modelo de exportación
- [x] Generar XML
- [x] Validar estructura XML
- [ ] Probar importación en Premiere
- [ ] Corregir incompatibilidades reales
- [x] Verificar que el XML respeta trims y orden final definidos en la app
- [x] Definir estrategia de exportación directa de video
- [ ] Detectar casos de stream copy vs re-encode
- [x] Definir política de exportación rápida vs exportación final
- [x] Exportar video con resolución fuente
- [x] Exportar video con fps fuente
- [ ] Intentar preservar codec o bitrate fuente cuando sea viable
- [x] Mantener sincronía de audio en exportación final
- [x] Respetar duración y texto override del titulo principal en el overlay exportado
- [x] Exportar secuencia final reordenada y trimada
- [x] Validar calidad de salida frente al archivo fuente
- [x] Permitir export batch por proyecto desde la slide 4 con selector, checkboxes de secuencia y aspect ratio
- [x] Generar TXT sidecar por secuencia exportada con transcript base, hashtags y contexto editorial persistido
- [x] Mostrar historial por proyecto y nombre del TXT sidecar dentro de la propia slide 4
- [x] Guardar exports batch en `exports/batch/project_<id>/` con nombre base por secuencia
- [x] Mostrar thumbnails hover tipo slide 3 y preview inline por secuencia dentro de la slide 4

## 14. Calidad y robustez

- [ ] Validar errores de subida
- [x] Validar errores de transcripción local sin voz
- [ ] Validar errores de IA
- [ ] Validar casos con SRT defectuoso
- [ ] Añadir logs operativos
- [ ] Añadir tests de parseo SRT
- [ ] Añadir tests de transcripción local y persistencia de palabras
- [ ] Añadir tests de transformación editorial
- [ ] Añadir tests de exportación XML
- [ ] Revisar performance de transcript grande
- [x] Liberar recursos de preview de secuencia al cerrar secuencia o proyecto
- [x] Limitar caches en memoria de waveform y miniaturas para sesiones largas
- [ ] Añadir telemetría visible de uso RAM/CPU/GPU en runtime para diagnóstico operativo

## 15. Estado actual

- [x] Documentación base inicial creada
- [-] Planificación del proyecto en curso
- [x] Prioridad del trim interno y rol del XML aclarados
- [x] Exportación directa de video incluida en alcance
- [-] Implementación base iniciada
- [x] Scaffold inicial validado sin errores de editor
- [x] Ingesta básica de video y SRT funcionando
- [x] Sugerencias editoriales base funcionando con fallback local
- [x] Edición manual básica de clips funcionando
- [x] Exportaciones XML y video funcionando
- [x] Transcripción local con timings palabra por palabra funcionando
- [x] UI conectada a word timings y timeline derivados del transcript
- [x] Preview con selector de formato horizontal, vertical y cuadrado
- [x] Historial persistido con profundidad ampliada

## 16. Próxima acción inmediata

- [ ] Validar XML real en Premiere y ajustar incompatibilidades si aparecen
- [x] Conectar el formato de canvas del preview con exportación final
- [ ] Añadir tests automatizados a timeline, undo/redo y cortes exactos

## 17. Migración a SaaS / Companion App

> Plan completo: ver [SAAS_ARCHITECTURE.md](SAAS_ARCHITECTURE.md) y [SAAS_WORKPLAN.md](SAAS_WORKPLAN.md).
> Filosofía: UI servida desde `altoque.tv/maxeditor`, FFmpeg corre en la PC del usuario, server nunca recibe videos.

### Fase 0 — Preparación y refactor base
- [ ] Instalar `djangorestframework-simplejwt` y crear app `accounts`
- [ ] Modelo `User(AbstractUser)` con email como USERNAME_FIELD
- [ ] Modelo `Subscription` (sin Stripe, solo status/plan)
- [ ] Endpoints `/api/auth/{register,login,refresh,logout,me}`
- [ ] Comando management `create_admin_user`
- [ ] Agregar `Project.owner` (FK a User) con migración de datos
- [ ] Extraer `media_engine/` como paquete pip-installable
- [ ] Refactor `services.py` como fachada de `media_engine`
- [ ] Frontend: crear `src/api/client.js` centralizado con interceptor JWT
- [ ] Frontend: migrar página piloto al nuevo cliente
- [ ] `settings_prod.py` separado + `requirements-prod.txt`
- [ ] Documentar deploy en `docs/DEPLOY_HAWKHOST.md`

### Fase 1 — Companion App MVP
- [ ] Crear directorio `companion/` con estructura FastAPI
- [ ] Endpoint `/health` con session token
- [ ] Generación + instalación de cert local autofirmado
- [ ] Wrappers DPAPI para cifrado local de credenciales
- [ ] Endpoints `/auth/token` (GET/POST/DELETE)
- [ ] Tray icon con `pystray`
- [ ] Hook `useCompanionMode()` en frontend
- [ ] Página `LoginPage.jsx`
- [ ] Página `CompanionRequiredPage.jsx`
- [ ] Build PyInstaller `--onefile --windowed`
- [ ] Validar `.exe` en Windows limpia

### Fase 2 — Migración FFmpeg al companion
- [ ] Instalador automático de FFmpeg en companion
- [ ] Endpoint `/ffmpeg/probe`
- [ ] Endpoints `/file/pick` y `/file/save-dialog`
- [ ] Endpoint `/ffmpeg/extract-part`
- [ ] Endpoint `/ffmpeg/append-video`
- [ ] Endpoint `/ffmpeg/auto-frame`
- [ ] Endpoint `/ffmpeg/clip-stabilization`
- [ ] Endpoint `/ffmpeg/sequence-clip-preparation`
- [ ] Endpoint `/ffmpeg/sequence-media-preparation`
- [ ] Endpoint `/ffmpeg/sequence-stabilization`
- [ ] Endpoint `/ffmpeg/sequence-audio-enhancement`
- [ ] Endpoint `/ffmpeg/export` (mantener feature parity total)
- [ ] Endpoint `/ffmpeg/export-batch`
- [ ] Endpoint `/ffmpeg/cancel`
- [ ] Endpoint `/transcribe/audio` con whisper local
- [ ] Endpoint `/preview/stream/{path}` Range-aware
- [ ] Adapter en frontend redirige cada endpoint al companion
- [ ] Modelo `VideoAsset`: reemplazar `FileField` por `local_path` + hash
- [ ] ML deps (torch) instalación on-demand desde companion

### Fase 3 — Empaquetado + Deploy oficina
- [ ] Script Inno Setup → `MaxEditor_Setup_v0.1.0.exe`
- [ ] Endpoint `/api/companion/version-check`
- [ ] Notificación de nueva versión en tray
- [ ] Setup PostgreSQL en HawkHost
- [ ] Migración de datos SQLite → PostgreSQL
- [ ] Configurar Apache/nginx + uWSGI en cPanel
- [ ] Servir frontend estático en `altoque.tv/maxeditor/`
- [ ] HTTPS con Let's Encrypt
- [ ] Página `altoque.tv/maxeditor/download`
- [ ] Test en 3 máquinas físicas distintas
- [ ] Crear cuentas para empleados (`create_user`)
- [ ] Documentar onboarding en `docs/OFFICE_ONBOARDING.md`

### Fase 4 — Stripe + Suscripciones (público)
- [ ] Cuenta Stripe + productos (Pro Monthly, Pro Annual, Lifetime)
- [ ] Endpoints `/api/billing/{checkout,portal,webhook}`
- [ ] Lógica de webhook idempotente
- [ ] Trial de 7 días sin tarjeta
- [ ] Página `BillingPage.jsx`
- [ ] Decorator `@require_active_subscription`

### Fase 5 — Marketing site + Onboarding público
- [ ] Landing en `altoque.tv/maxeditor/` (sin login)
- [ ] Onboarding flow post-signup (descarga + tutorial)
- [ ] Email transaccional (welcome, trial-ending, etc.)
- [ ] Form de contacto + FAQ

### Fase 6 — Hardening + Auto-update
- [ ] Auto-update silencioso (Squirrel/PyUpdater)
- [ ] EV Code Signing certificate + firma de instalador
- [ ] Sentry en server + companion
- [ ] Backup diario PostgreSQL + test de restore mensual
- [ ] Rate limiting en auth + captcha en signup
