EPA - Backlog de Tareas¶
Convención: Cada tarea es atómica, versionable y tiene ID único EPPA-###.
Estados: TODO | IN_PROGRESS | BLOCKED | DONE
Prioridad: P0 (crítico) | P1 (alto) | P2 (medio) | P3 (bajo)
Módulo 1: Pantalla Principal y Navegación¶
EPPA-001: Implementar pantalla principal (UI_MENU)¶
Estado: TODO Prioridad: P0 Estimación: 2 Pomodoros
Descripción:
Crear página / que replique la pantalla principal de MATLAB con navegación a todos los módulos.
Por qué: Punto de entrada de la aplicación. Sin esto, no hay navegación entre módulos.
Criterios de Aceptación: - [ ] Layout con imagen ilustrativa a la izquierda (silueta de referencia) - [ ] 5 botones verticales a la derecha: "Captura de marcadores", "Vista Anterior", "Vista Posterior", "Vista Perfil Derecho", "Vista Perfil Izquierdo" - [ ] Botón "SALIR" funcional - [ ] Logos LaBIS y UCA en esquina superior derecha - [ ] Color scheme: fondo azul navy (#1a237e o similar), botones blancos - [ ] Navegación funcional a cada ruta correspondiente - [ ] Responsive para pantallas 1024px+ (desktop)
Archivos Afectados:
- src/app/page.tsx (modificar existente)
- src/components/orthoposture/main-menu.tsx (nuevo)
- src/app/globals.css o theme config (colores institucionales)
Dependencias: Ninguna
Referencia: img6.jpg (pantalla superior), crislabis.txt líneas 30-40
Riesgos: - Assets de logos no disponibles → Mitigación: usar placeholders temporales, crear Q021 en doubts.md
Tests: - Unit: Renderizado de 6 botones, navegación onClick - Integration: Navegación completa desde menu a cada vista y retorno
EPPA-002: Crear layout común para vistas de análisis¶
Estado: TODO Prioridad: P0 Estimación: 3 Pomodoros
Descripción: Refactorizar componentes de vista anterior en un layout genérico reutilizable para las 4 vistas de análisis.
Por qué: Maximizar reutilización de código. Las 4 vistas (anterior, posterior, perfil derecho, perfil izquierdo) comparten estructura idéntica, solo cambian datos.
Criterios de Aceptación:
- [ ] Componente <AnalysisLayout view="anterior|posterior|perfil_derecho|perfil_izquierdo" />
- [ ] Panel izquierdo: botones de acciones (Abrir imagen, Importar marcadores, Calibrar grilla, Rectas de referencia, Limpiar imagen, etc.)
- [ ] Panel central: área de gráfico/visualización (parametrizable)
- [ ] Panel derecho: tabla de resultados con columnas Región|Variable|Medición|Diagnóstico
- [ ] Botones inferiores: "Exportar Imagen", "Exportar Vales", "PANTALLA PRINCIPAL", "Siguiente Vista", "Salir"
- [ ] Estado de botones (habilitado/deshabilitado) según flujo de trabajo
- [ ] Props para customizar contenido específico por vista
Archivos Afectados:
- src/components/orthoposture/analysis-layout.tsx (nuevo)
- src/components/orthoposture/anterior/anterior-controls-panel.tsx (refactorizar → generic-controls-panel.tsx)
- src/components/orthoposture/anterior/anterior-results-panel.tsx (refactorizar → generic-results-panel.tsx)
- src/app/analysis/anterior/page.tsx (adaptar para usar nuevo layout)
Dependencias: Ninguna
Referencia: img6.jpg, img8.jpg (todas las vistas de análisis)
Riesgos: - Breaking changes en vista anterior ya implementada → Mitigación: tests de regresión exhaustivos
Tests: - Unit: Renderizado con cada prop de vista, estados de botones - Integration: Flujo completo en vista anterior con nuevo layout
Módulo 2: Captura de Marcadores¶
EPPA-003: Implementar selector de marcadores por vista¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción: Crear componente de selector (dropdown) de marcadores anatómicos con lista dinámica según vista activa.
Por qué: Cada vista (anterior, posterior, perfiles) tiene marcadores específicos. El selector debe mostrar solo los relevantes.
Criterios de Aceptación:
- [ ] Dropdown que filtra marcadores según vista: "anterior"|"posterior"|"perfil_derecho"|"perfil_izquierdo"
- [ ] Carga de definiciones desde src/app/data/marker-definitions.ts
- [ ] Orden de marcadores: secuencia craneocaudal (cabeza→pies)
- [ ] Placeholder: "Elegir Marcador"
- [ ] Accesibilidad: navegación por teclado (Arrow keys, Enter)
- [ ] Indicador visual de marcadores ya capturados (checkmark o diferente color)
Archivos Afectados:
- src/components/orthoposture/marker-selector.tsx (nuevo)
- src/app/data/marker-definitions.ts (expandir con marcadores por vista)
- src/app/types.ts (tipos: MarkerDefinition, ViewType, etc.)
Dependencias: EPPA-004 (necesita estructura de datos de marcadores)
Referencia: img10.jpg (selector con "Tragus Izq", etc.), crislabis.txt líneas 50-60
Riesgos: - Lista de marcadores incompleta → Mitigación: Q005 en doubts.md, usar datos de MATLAB como referencia
Tests: - Unit: Filtrado correcto por vista, orden craneocaudal, accesibilidad - Integration: Selección de marcador actualiza estado global
EPPA-004: Expandir definiciones de marcadores para 4 vistas¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción:
Completar marker-definitions.ts con todos los marcadores anatómicos por vista (anterior, posterior, perfil derecho, perfil izquierdo).
Por qué: Sin definiciones completas, no se puede implementar captura ni validaciones.
Criterios de Aceptación:
- [ ] Estructura: { vista: string, marcadores: [{id, nombre, tipo: "fisico"|"superficie", obligatorio: boolean, descripcion}] }
- [ ] Vista Anterior: min 10 marcadores (basados en crislabis.txt y análisis de imágenes)
- [ ] Vista Posterior: min 10 marcadores
- [ ] Perfil Derecho: min 8 marcadores
- [ ] Perfil Izquierdo: min 8 marcadores
- [ ] Indicar cuáles son obligatorios (maleolos, puntos de referencia)
- [ ] Indicar cuáles son de superficie corporal (requieren cursor manual)
- [ ] Documentación inline de cada marcador (para tooltips)
Archivos Afectados:
- src/app/data/marker-definitions.ts
- src/app/types.ts (tipos: MarkerType, MarkerDefinition)
Dependencias: Ninguna
Referencia: crislabis.txt líneas 50-175 (descripción de marcadores), img10.jpg (ejemplos visuales)
Riesgos: - Nombres anatómicos ambiguos → Mitigación: Q005, glosario en memory.md
Tests: - Unit: Validar estructura de cada vista, marcadores obligatorios presentes - Integration: N/A (datos estáticos)
EPPA-005: Implementar persistencia de coordenadas de marcadores¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción: Crear sistema de guardado/carga de coordenadas X,Y de marcadores en archivos JSON (uno por vista).
Por qué: Fase 1 (captura) genera archivos que fase 2 (análisis) debe importar.
Criterios de Aceptación:
- [ ] Formato JSON: { pacienteId, vista, timestamp, marcadores: [{nombre, x, y, vista}] }
- [ ] Función saveMarkers(pacienteId, vista, marcadores) → genera archivo {pacienteId}_{vista}_{timestamp}.json
- [ ] Función loadMarkers(pacienteId, vista) → carga archivo más reciente
- [ ] Validación: coordenadas dentro de bounds de imagen
- [ ] Manejo de errores: archivo no encontrado, JSON corrupto
- [ ] Storage: local filesystem o IndexedDB (para web)
Archivos Afectados:
- src/lib/marker-persistence.ts (nuevo)
- src/app/types.ts (tipo: MarkerData)
Dependencias: EPPA-004
Referencia: crislabis.txt líneas 205-232, Q016 (formato de archivos)
Riesgos: - Compatibilidad con archivos MATLAB → Mitigación: Q023, implementar conversor si necesario
Tests: - Unit: Save/load cycle, validaciones, manejo de errores - Integration: Guardar en captura, cargar en análisis
EPPA-006: Crear pantalla de captura de marcadores (componente base)¶
Estado: TODO Prioridad: P0 Estimación: 4 Pomodoros
Descripción: Implementar UI de captura de marcadores reutilizable para las 4 vistas (anterior, posterior, perfiles).
Por qué: Componente core de la fase 1 del workflow. Sin esto, no hay entrada de datos.
Criterios de Aceptación: - [ ] Layout: panel izquierdo (controles + tabla), panel derecho (imagen + marcadores) - [ ] Panel izquierdo: - [ ] Dropdown selector de vista (activa solo la correspondiente) - [ ] Dropdown selector de marcador (EPPA-003) - [ ] Botón "Seleccionar" (habilita cursor de marcación en imagen) - [ ] Link "Marcador Detectado" (muestra último marcador capturado) - [ ] Tabla con columnas: # | Marcador | Vista | X | Y - [ ] Botones: "Borrar Fila" | "Guardar" - [ ] Panel derecho: - [ ] Display de imagen del paciente con grilla - [ ] Marcadores verdes circulares (overlay) en coordenadas capturadas - [ ] Cursor crosshair al activar modo selección - [ ] Click en imagen registra coordenada X,Y - [ ] Título dinámico: "{pacienteId} {fecha} - {archivo}.jpg" | "Vista {vista}" - [ ] Botones: "PANTALLA PRINCIPAL" | "SALIR" - [ ] Zoom/pan sobre imagen (ver EPPA-013) - [ ] Validación: no permitir marcador duplicado - [ ] Confirmación visual: marcador aparece en tabla + círculo verde en imagen - [ ] Auto-scroll de tabla al agregar marcador
Archivos Afectados:
- src/app/marker-capture/page.tsx (adaptar existente)
- src/components/orthoposture/marker-capture-panel.tsx (nuevo)
- src/components/orthoposture/marker-table.tsx (nuevo o adaptar points-table.tsx)
- src/components/orthoposture/image-marker-overlay.tsx (nuevo)
Dependencias: EPPA-003, EPPA-004, EPPA-005
Referencia: img8.jpg (captura facial), img10.jpg (captura anterior y posterior)
Riesgos: - Performance con muchos marcadores → Mitigación: virtualización de tabla, canvas optimizado
Tests: - Unit: Renderizado de componentes, validaciones de duplicados - Integration: Flujo completo: seleccionar marcador → click en imagen → actualizar tabla → guardar
EPPA-007: Implementar funcionalidad "Borrar Fila" en tabla de marcadores¶
Estado: TODO Prioridad: P2 Estimación: 1 Pomodoro
Descripción: Permitir eliminar marcadores individuales de la tabla de captura con confirmación.
Por qué: Corrección de errores de marcación sin tener que reiniciar todo (crítico para UX).
Criterios de Aceptación: - [ ] Botón "Borrar Fila" en cada entrada de tabla (o selección + botón global) - [ ] Confirmación modal: "¿Eliminar marcador {nombre}?" - [ ] Al borrar: remover de tabla + remover círculo verde de imagen - [ ] Actualizar índices de numeración de tabla - [ ] No permitir borrar si es el último marcador obligatorio de su tipo
Archivos Afectados:
- src/components/orthoposture/marker-table.tsx
- src/components/orthoposture/marker-capture-panel.tsx (estado)
Dependencias: EPPA-006
Referencia: crislabis.txt líneas 58-60, 98, img10.jpg (botón "Borrar Fila")
Riesgos: - Borrado accidental → Mitigación: confirmación obligatoria
Tests: - Unit: Borrado individual, validaciones - Integration: Borrar → verificar tabla y overlay actualizados
EPPA-008: Agregar botón "Guardar" con validación de marcadores obligatorios¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción: Implementar guardado de marcadores con validación de mínimos requeridos por vista.
Por qué: Prevenir avanzar a análisis con datos incompletos o inválidos.
Criterios de Aceptación:
- [ ] Botón "Guardar" al pie de la tabla
- [ ] Validación pre-guardado:
- [ ] Al menos todos los marcadores obligatorios presentes (ver EPPA-004)
- [ ] Coordenadas dentro de bounds de imagen
- [ ] No hay duplicados
- [ ] Mensaje de éxito: "Guardado" (label en celeste como en MATLAB)
- [ ] Mensaje de error si validaciones fallan: "Falta marcador obligatorio: {nombre}"
- [ ] Deshabilitar botón si no hay cambios sin guardar
- [ ] Llamar a saveMarkers() de EPPA-005
Archivos Afectados:
- src/components/orthoposture/marker-capture-panel.tsx
- src/lib/marker-persistence.ts
Dependencias: EPPA-004, EPPA-005, EPPA-006
Referencia: crislabis.txt líneas 106-108, 172-173, img10.jpg (botón "Guardar")
Riesgos: - Lista de obligatorios incompleta → Mitigación: Q005
Tests: - Unit: Validaciones (falta obligatorio, duplicados, bounds) - Integration: Guardar → verificar archivo generado → cargar en nueva sesión
Módulo 3: Vistas de Análisis¶
EPPA-009: Implementar funcionalidad "Limpiar Imagen"¶
Estado: TODO Prioridad: P2 Estimación: 1 Pomodoro
Descripción: Agregar botón "Limpiar Imagen" que resetea zoom/pan pero NO borra marcadores.
Por qué: La evaluadora clínica menciona que en MATLAB es tosco. Aquí mejoramos: limpiar != borrar todo.
Criterios de Aceptación: - [ ] Botón "Limpiar Imagen" en panel izquierdo de vistas de análisis - [ ] Al hacer click: resetear zoom a 100%, pan a (0,0) - [ ] NO borrar marcadores importados - [ ] NO borrar líneas/mediciones trazadas - [ ] Cambio visual: botón celeste (destacado) como en MATLAB - [ ] Tooltip: "Restaurar vista original (no borra datos)"
Archivos Afectados:
- src/components/orthoposture/analysis-layout.tsx
- src/components/orthoposture/image-display-area.tsx
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 184-191, img6.jpg (botón celeste), Q006
Riesgos: - Confusión con "borrar marcadores" → Mitigación: tooltip claro, confirmación si se desea agregar
Tests: - Unit: Reset de zoom/pan, NO reset de datos - Integration: Limpiar → verificar vista restaurada, datos intactos
EPPA-010: Implementar "Importar Marcadores" en vistas de análisis¶
Estado: TODO Prioridad: P0 Estimación: 2 Pomodoros
Descripción: Cargar coordenadas X,Y de marcadores guardados en fase de captura y renderizarlos en imagen de análisis.
Por qué: Conexión esencial entre fase 1 (captura) y fase 2 (análisis).
Criterios de Aceptación:
- [ ] Botón "Importar Marcadores" en panel izquierdo
- [ ] Al click: abrir selector de archivo o cargar automático por pacienteId + vista
- [ ] Cargar JSON con loadMarkers() de EPPA-005
- [ ] Renderizar marcadores como puntos (sin círculos verdes, solo referencias)
- [ ] Validación: archivo corresponde a la vista correcta
- [ ] Error si archivo no encontrado o formato inválido
- [ ] Confirmación: "Marcadores importados: {N} puntos"
Archivos Afectados:
- src/components/orthoposture/analysis-layout.tsx
- src/lib/marker-persistence.ts
- src/components/orthoposture/image-display-area.tsx
Dependencias: EPPA-002, EPPA-005
Referencia: crislabis.txt líneas 205-241, img6.jpg (botón "Importar Marcadores")
Riesgos: - Mismatch de coordenadas (imagen diferente) → Mitigación: validar dimensiones de imagen, warning si discrepancia
Tests: - Unit: Carga de JSON válido, manejo de errores - Integration: Capturar marcadores → guardar → abrir vista análisis → importar → verificar posiciones
EPPA-011: Implementar calibración de grilla (píxel → cm)¶
Estado: TODO Prioridad: P0 Estimación: 3 Pomodoros
Descripción: Permitir al usuario marcar la grilla de calibración para convertir coordenadas de píxeles a centímetros.
Por qué: Mediciones biomecánicas requieren unidades métricas reales, no píxeles.
Criterios de Aceptación:
- [ ] Botón "Calibración Grilla" en panel izquierdo
- [ ] Al activar: instrucción visual "Haga click en el cruce exacto de la grilla (cerca del ombligo)"
- [ ] Usuario hace click en un punto de la grilla
- [ ] Calcular factor de conversión: asumiendo grilla de 10cm × 10cm (confirmar con Q011)
- [ ] Fórmula: factorCm = 10 / distancia_en_pixeles
- [ ] Aplicar factor a todas las mediciones subsiguientes
- [ ] Almacenar factor en estado de la vista
- [ ] Indicador visual: "Calibrado: 1px = {X}cm"
Archivos Afectados:
- src/components/orthoposture/analysis-layout.tsx
- src/lib/calibration.ts (nuevo)
- src/app/types.ts (tipo: CalibrationData)
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 208-209, 260-263, 326-327, Q011
Riesgos: - Usuario hace click fuera de la grilla → Mitigación: validación visual (highlight de grilla), permitir recalibrar
Tests: - Unit: Cálculo de factor con distancias conocidas - Integration: Calibrar → verificar mediciones en cm correctas
EPPA-012: Implementar trazado de rectas de referencia¶
Estado: TODO Prioridad: P0 Estimación: 2 Pomodoros
Descripción: Trazar líneas verticales de referencia desde los maleolos para análisis de alineación.
Por qué: Rectas de referencia son base para medir desviaciones/inclinaciones del cuerpo.
Criterios de Aceptación: - [ ] Botón "Rectas de Referencia" en panel izquierdo - [ ] Al activar: instrucción "Marque maleolo izquierdo" - [ ] Usuario hace click en maleolo izquierdo → registrar coordenada - [ ] Instrucción: "Marque maleolo derecho" - [ ] Usuario hace click en maleolo derecho → registrar coordenada - [ ] Trazar línea vertical desde cada maleolo (o línea perpendicular al suelo) - [ ] Líneas visibles como overlay en imagen (color: amarillo o rojo, grosor 2px) - [ ] Validación: maleolos dentro de bounds de imagen - [ ] Permitir "rehacer" si click fue incorrecto
Archivos Afectados:
- src/components/orthoposture/analysis-layout.tsx
- src/components/orthoposture/reference-lines-overlay.tsx (nuevo)
- src/lib/geometry.ts (nuevo, funciones de trazado)
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 264-267, 302-304
Riesgos: - Orientación incorrecta de líneas → Mitigación: validar con usuario, mostrar preview antes de confirmar
Tests: - Unit: Trazado de líneas verticales dadas coordenadas - Integration: Marcar maleolos → verificar líneas visibles en imagen
EPPA-013: Integrar zoom y pan avanzados en imagen de análisis¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción: Implementar navegación fluida sobre imagen (zoom in/out, pan con mouse/touch) para precisión en marcación.
Por qué: La evaluadora clínica menciona que MATLAB es "tosco". UX mejorado = mayor precisión en mediciones.
Criterios de Aceptación: - [ ] Zoom: rueda del mouse o pinch (touch) - [ ] Pan: arrastrar con mouse o 2 dedos (touch) - [ ] Niveles de zoom: 100% (default), 200%, 400%, 800% - [ ] Controles UI: botones +/− , slider, "Fit to screen" - [ ] Cursor cambia a "mano" cuando está en modo pan - [ ] Smooth animation (CSS transitions o librería) - [ ] Zoom centrado en posición del cursor - [ ] No permitir pan fuera de bounds de imagen
Archivos Afectados:
- src/components/orthoposture/image-display-area.tsx
- src/hooks/use-image-zoom-pan.ts (nuevo) o usar librería como react-zoom-pan-pinch
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 79-96, 179-185, 326-357, Q015
Riesgos: - Performance con imágenes grandes → Mitigación: canvas optimizado, lazy loading, límite de zoom
Tests: - Unit: Cálculo de transformaciones zoom/pan - Integration: Zoom → marcar punto → verificar coordenadas correctas (no afectadas por zoom)
EPPA-014: Agregar Undo/Redo para marcaciones en análisis¶
Estado: TODO Prioridad: P2 Estimación: 2 Pomodoros
Descripción: Implementar historial de acciones (marcar punto, trazar línea, calibrar) con Undo/Redo.
Por qué: Mejora sobre MATLAB. La evaluadora clínica menciona que es difícil corregir errores a mitad de proceso.
Criterios de Aceptación: - [ ] Stack de acciones: cada marcación/trazado se registra - [ ] Botones "Deshacer" (Ctrl+Z) y "Rehacer" (Ctrl+Shift+Z) - [ ] Acciones deshacibles: calibración, rectas de referencia, mediciones de superficie corporal - [ ] Máximo 20 acciones en historial (configurable) - [ ] Indicador visual: botones deshabilitados si no hay acciones que deshacer/rehacer - [ ] Toast notification: "Acción deshecha: {nombre_accion}"
Archivos Afectados:
- src/hooks/use-undo-redo.ts (nuevo)
- src/components/orthoposture/analysis-layout.tsx
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 184-202, Q006
Riesgos: - Estado complejo difícil de restaurar → Mitigación: usar immutability (immer.js), tests exhaustivos
Tests: - Unit: Push/pop de acciones, límite de stack - Integration: Marcar 3 puntos → undo 2 → redo 1 → verificar estado correcto
EPPA-015: Implementar manejo de puntos no visibles (medición = 0)¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción: Permitir marcar puntos como "no visibles" y retornar mediciones = 0 sin errores.
Por qué: Requisito funcional crítico: no todos los marcadores son visibles en todos los pacientes (pelo, ropa, anatomía).
Criterios de Aceptación: - [ ] En cálculos: verificar si punto existe antes de usarlo - [ ] Si punto no existe o marcado "no visible": retornar medición = 0 con nota "Punto no visible" - [ ] UI: checkbox "Marcar como no visible" en selector de marcador - [ ] Puntos no visibles aparecen en tabla de resultados con valor "0.00" y diagnóstico "No evaluable" - [ ] No bloquear exportación ni cálculo de otras variables - [ ] Log de advertencia en consola (dev mode): "Punto {nombre} no visible en vista {vista}"
Archivos Afectados:
- src/lib/analysis-calculations.ts
- python/calculations.py (validaciones)
- src/components/orthoposture/marker-selector.tsx
Dependencias: EPPA-003, EPPA-010
Referencia: crislabis.txt líneas 111-117, 361-363
Riesgos: - Mediciones inválidas si punto es obligatorio → Mitigación: diferenciar obligatorios vs opcionales (EPPA-004)
Tests: - Unit: Cálculo con punto faltante retorna 0 - Integration: Marcar punto como no visible → exportar tabla → verificar valor 0
Módulo 4: Cálculos Biomecánicos¶
EPPA-016: Validar y documentar cálculos existentes en calculations.py¶
Estado: TODO Prioridad: P0 Estimación: 3 Pomodoros
Descripción:
Revisar lógica en python/calculations.py, agregar docstrings, validar contra casos de MATLAB.
Por qué: Asegurar que cálculos migrados sean correctos antes de construir sobre ellos.
Criterios de Aceptación:
- [ ] Cada función tiene docstring con: descripción, parámetros, retorno, ejemplo, referencias anatómicas
- [ ] Tests unitarios existentes (test_calculations.py) pasan al 100%
- [ ] Agregar min 5 casos de test adicionales con valores conocidos de MATLAB
- [ ] Validar convención de signos (Q013): derecha=+, izquierda=−
- [ ] Manejo de puntos faltantes (EPPA-015 backend)
- [ ] Formateo de salida: 2 decimales
Archivos Afectados:
- python/calculations.py
- python/test_calculations.py
- docs/calculations-reference.md (nuevo, documentación técnica)
Dependencias: Ninguna
Referencia: crislabis.txt líneas 111-117, 272-276, 281-282, Q013
Riesgos: - Fórmulas incorrectas heredadas de MATLAB → Mitigación: validación cruzada con papers de biomecánica, consulta con el equipo de investigación clínica
Tests: - Unit: Cada función con min 3 casos (nominal, edge, faltante) - Integration: Casos completos end-to-end (4 vistas)
EPPA-017: Implementar cálculo de variables para Vista Posterior¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción: Agregar funciones específicas de vista posterior (ángulos calcáneos, alineación escapular, genu valgo/varo).
Por qué: Vista posterior tiene variables únicas no presentes en vista anterior.
Criterios de Aceptación:
- [ ] Función calcular_angulo_calcaneo_izquierdo(marcadores) → grados
- [ ] Función calcular_angulo_calcaneo_derecho(marcadores) → grados
- [ ] Función calcular_alineacion_escapular(marcadores) → cm o grados
- [ ] Función calcular_distancia_gemelos(marcadores) → cm (genu valgo/varo)
- [ ] Todas con manejo de puntos no visibles
- [ ] Validar contra outputs de MATLAB si disponibles
- [ ] Integrar en analysis-calculations.ts (wrapper)
Archivos Afectados:
- python/calculations.py
- src/lib/analysis-calculations.ts
- python/test_calculations.py
Dependencias: EPPA-016
Referencia: crislabis.txt líneas 304-320, img8.jpg (vista posterior)
Riesgos: - Definiciones anatómicas ambiguas → Mitigación: glosario en memory.md, consulta con el equipo de investigación clínica
Tests: - Unit: Cada función con min 3 casos - Integration: Vista posterior completa end-to-end
EPPA-018: Implementar cálculo de variables para Vistas de Perfil¶
Estado: TODO Prioridad: P1 Estimación: 4 Pomodoros
Descripción: Agregar funciones de perfiles (tangentes dorsal/sacro, ápex cervical/lumbar, alineación sagital).
Por qué: Vistas de perfil miden curvaturas y alineación en plano sagital, críticas para evaluación postural.
Criterios de Aceptación:
- [ ] Función calcular_tangente_dorsal(marcadores) → punto posterior + ángulo
- [ ] Función calcular_tangente_sacro(marcadores) → punto posterior + ángulo
- [ ] Función calcular_apex_cervical(marcadores) → coordenada Y
- [ ] Función calcular_apex_lumbar(marcadores) → coordenada Y
- [ ] Función calcular_alineacion_sagital(marcadores) → grados
- [ ] Todas funciones simétricas: perfil derecho ≈ perfil izquierdo (con inversión de signo si aplica)
- [ ] Manejo de puntos de superficie corporal (cursor manual en UI)
Archivos Afectados:
- python/calculations.py
- src/lib/analysis-calculations.ts
- python/test_calculations.py
Dependencias: EPPA-016
Referencia: crislabis.txt líneas 323-363, img6.jpg (vista perfil izquierdo)
Riesgos: - Diferencias anatómicas entre perfil derecho e izquierdo → Mitigación: Q014, validación con casos reales
Tests: - Unit: Cada función con min 3 casos por perfil - Integration: Ambos perfiles end-to-end, comparación simétrica
Módulo 5: Exportación y Reportes¶
EPPA-019: Implementar exportación a Excel (4 hojas)¶
Estado: TODO Prioridad: P1 Estimación: 4 Pomodoros
Descripción: Generar archivo Excel con 4 hojas (una por vista) con formato compatible con el workflow clínico actual.
Por qué: Output principal del sistema, usado para informes clínicos.
Criterios de Aceptación:
- [ ] Librería: xlsx (SheetJS) o similar
- [ ] Estructura: 1 archivo Excel por paciente por sesión
- [ ] 4 hojas nombradas: "Vista Anterior", "Vista Posterior", "Perfil Derecho", "Perfil Izquierdo"
- [ ] Cada hoja con columnas: Región | Variable | Tipo | Unidad | Medición | Diagnóstico
- [ ] Valores numéricos formateados a 2 decimales
- [ ] Header con metadatos: Paciente ID, Fecha, Evaluador (si disponible)
- [ ] Botón "Exportar Tabla" en cada vista de análisis
- [ ] Descarga automática o guardado en carpeta del paciente
- [ ] Validación: no exportar si faltan cálculos obligatorios
Archivos Afectados:
- src/lib/excel-export.ts (nuevo)
- src/components/orthoposture/analysis-layout.tsx
- package.json (dependencia: xlsx)
Dependencias: EPPA-016, EPPA-017, EPPA-018
Referencia: crislabis.txt líneas 372-391, Q004
Riesgos: - Formato no coincide con expectativa de la evaluadora → Mitigación: Q004, generar sample y validar
Tests: - Unit: Generación de Excel con datos mock, validar estructura - Integration: Flujo completo → exportar → abrir Excel → verificar datos
EPPA-020: Implementar exportación de imágenes (captura de pantalla)¶
Estado: TODO Prioridad: P2 Estimación: 2 Pomodoros
Descripción: Captura automática de pantalla de cada vista de análisis (imagen + overlays) en formato JPG/PNG.
Por qué: Actualmente manual en MATLAB. Automatizar mejora flujo de trabajo.
Criterios de Aceptación:
- [ ] Botón "Exportar Imagen" en cada vista de análisis
- [ ] Captura: imagen del paciente + marcadores + líneas de referencia + mediciones visibles
- [ ] Formato: PNG (sin pérdida) o JPG (compresión 90%)
- [ ] Nombre de archivo: {pacienteId}_{vista}_{timestamp}.png
- [ ] Descarga automática o guardado en carpeta del paciente
- [ ] Recorte: solo panel de imagen (no incluir controles UI)
- [ ] Resolución: mantener original de imagen subida
Archivos Afectados:
- src/lib/image-export.ts (nuevo, usar html2canvas o Canvas API nativa)
- src/components/orthoposture/analysis-layout.tsx
- package.json (dependencia: html2canvas si se usa)
Dependencias: EPPA-002
Referencia: crislabis.txt líneas 291-296, 320-323, Q003
Riesgos: - Calidad de captura inferior a original → Mitigación: usar Canvas nativo en lugar de html2canvas
Tests: - Unit: Generación de imagen con datos mock - Integration: Exportar → verificar archivo generado → abrir imagen → validar contenido
EPPA-021: Crear página de Vista Posterior¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción:
Implementar /analysis/posterior usando el layout genérico de EPPA-002 con configuración específica de vista posterior.
Por qué: Una de las 4 vistas core del sistema.
Criterios de Aceptación:
- [ ] Ruta: /analysis/posterior
- [ ] Usar <AnalysisLayout view="posterior" /> de EPPA-002
- [ ] Cargar marcadores de vista posterior (EPPA-010)
- [ ] Ejecutar cálculos de EPPA-017
- [ ] Tabla de resultados con regiones: Cérvico-Cefálica, Tronco-Columna, C. Escapular, C. Pélvica
- [ ] Botones específicos: "Ángulo Calcáneo Izquierdo", "Ángulo Calcáneo Derecho"
- [ ] Navegación: "PANTALLA PRINCIPAL", "Siguiente Vista" → Perfil Derecho
- [ ] Exportación funcional (Excel + imagen)
Archivos Afectados:
- src/app/analysis/posterior/page.tsx (nuevo)
- Componentes genéricos de EPPA-002 (reutilización)
Dependencias: EPPA-002, EPPA-010, EPPA-017
Referencia: img8.jpg (vista posterior), crislabis.txt líneas 298-323
Riesgos: - Ninguno crítico (reutilización de componentes probados)
Tests: - Integration: Flujo completo de vista posterior end-to-end
EPPA-022: Crear páginas de Vista Perfil Derecho e Izquierdo¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción:
Implementar /analysis/perfil-derecho y /analysis/perfil-izquierdo con layout genérico.
Por qué: Completar las 4 vistas de análisis del sistema.
Criterios de Aceptación:
- [ ] Rutas: /analysis/perfil-derecho y /analysis/perfil-izquierdo
- [ ] Ambas usan <AnalysisLayout view="perfil_derecho|perfil_izquierdo" />
- [ ] Cargar marcadores de perfil correspondiente
- [ ] Ejecutar cálculos de EPPA-018
- [ ] UI específica: botones de tangentes (dorsal, sacro), ápex (cervical, lumbar)
- [ ] Tabla de resultados con alineación sagital
- [ ] Navegación: Perfil Derecho → Perfil Izquierdo → PANTALLA PRINCIPAL
- [ ] Exportación funcional
Archivos Afectados:
- src/app/analysis/perfil-derecho/page.tsx (nuevo)
- src/app/analysis/perfil-izquierdo/page.tsx (nuevo)
- Componentes genéricos (reutilización)
Dependencias: EPPA-002, EPPA-010, EPPA-018
Referencia: img6.jpg (perfil izquierdo), crislabis.txt líneas 323-363
Riesgos: - Simetría entre perfiles puede requerir lógica especial → Mitigación: tests comparativos
Tests: - Integration: Flujo completo de ambos perfiles end-to-end - Regression: Comparación simétrica de resultados
EPPA-023: Implementar cálculo de Índice de Alineación Postural¶
Estado: TODO Prioridad: P2 Estimación: 3 Pomodoros
Descripción: Calcular porcentaje de alineación postural basado en 4 regiones × 3 planos (max 12 puntos).
Por qué: Métrica clave para diagnóstico y seguimiento de tratamiento.
Criterios de Aceptación:
- [ ] Función calcularIndiceAlineacion(resultados_4_vistas) → porcentaje
- [ ] Lógica:
- [ ] 4 regiones: Cérvico-Cefálica, Tronco, C. Pélvica, C. Escapular
- [ ] 3 planos por región: Sagital, Coronal, Transversal
- [ ] Por cada región/plano: 1 punto si alineado (medición dentro de rango normal), 0 si desalineado
- [ ] Suma total / 12 × 100 = porcentaje
- [ ] Rangos de normalidad definidos (consultar con el equipo de investigación clínica o papers, ver Q012)
- [ ] Clasificación: 0-30% Bajo, 31-60% Medio, 61-100% Alto
- [ ] Visualización: badge con color (rojo/amarillo/verde)
Archivos Afectados:
- src/lib/alignment-index.ts (nuevo)
- src/app/types.ts (tipo: AlignmentIndex)
Dependencias: EPPA-016, EPPA-017, EPPA-018
Referencia: crislabis.txt líneas 429-456, Q012
Riesgos: - Rangos de normalidad no documentados → Mitigación: Q012, usar valores de literatura biomecánica
Tests: - Unit: Cálculo con casos conocidos (ejemplo clínico: 2/12 = 17%) - Integration: Calcular índice tras análisis de 4 vistas
EPPA-024: Crear pantalla de Informe Comparativo (Pre/Post Tratamiento)¶
Estado: TODO Prioridad: P2 Estimación: 4 Pomodoros
Descripción: Vista que compara dos evaluaciones (pre y post tratamiento) lado a lado con índice de alineación.
Por qué: Funcionalidad descrita por la evaluadora clínica para seguimiento de pacientes.
Criterios de Aceptación:
- [ ] Ruta: /informe-comparativo
- [ ] Selector de paciente + 2 sesiones (pre y post)
- [ ] Layout: 2 columnas (pre | post)
- [ ] Por cada columna:
- [ ] 4 imágenes (vistas anterior, posterior, perfiles)
- [ ] Tabla resumen con cambios destacados (neutro → desalineado o viceversa)
- [ ] Índice de alineación con badge y %
- [ ] Tabla comparativa central: variable | pre | post | Δ
- [ ] Highlight de mejoras (verde) y empeoramientos (rojo)
- [ ] Exportar informe como PDF (opcional, P3)
Archivos Afectados:
- src/app/informe-comparativo/page.tsx (nuevo)
- src/components/orthoposture/comparison-view.tsx (nuevo)
- src/lib/comparison-utils.ts (nuevo)
Dependencias: EPPA-019, EPPA-023
Referencia: crislabis.txt líneas 400-480, Q018
Riesgos: - Complejidad de UI → Mitigación: diseño iterativo, mockups previos
Tests: - Integration: Cargar 2 sesiones → verificar comparación → exportar
Módulo 6: Testing y QA¶
EPPA-025: Configurar estructura de tests pytest¶
Estado: TODO Prioridad: P0 Estimación: 1 Pomodoro
Descripción:
Organizar carpeta tests/ con subdirectorios unit/ y integration/, configurar pytest.
Por qué: Fundamento para todos los tests del proyecto.
Criterios de Aceptación: - [ ] Estructura:
tests/
__init__.py
conftest.py (fixtures globales)
unit/
test_calculations.py (ya existe, mover aquí)
test_marker_persistence.py
test_calibration.py
test_alignment_index.py
integration/
test_marker_capture_flow.py
test_analysis_flow.py
test_export_flow.py
pytest.ini con markers: @pytest.mark.eppa("EPPA-###")
- [ ] Configurar coverage report (min 80% para nuevas funciones)
- [ ] Script npm run test:python o pytest con output colorizado
Archivos Afectados:
- tests/ (reorganizar)
- pytest.ini (nuevo)
- package.json (scripts)
Dependencias: Ninguna
Referencia: Especificación de sesión, decisión D6
Riesgos: - Ninguno
Tests: - Meta: ejecutar pytest y verificar estructura detectada
EPPA-026: Crear runner de tests con guardado de resultados JSON¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción:
Script que ejecuta tests y guarda resultados en results/{EPPA-###}/{timestamp}-{commit}.json.
Por qué: Trazabilidad de tests por ticket y commit (decisión D7).
Criterios de Aceptación:
- [ ] Script Python: scripts/run_tests_with_results.py
- [ ] Parsear output de pytest (JSON plugin o pytest-json-report)
- [ ] Detectar commit hash actual: git rev-parse --short HEAD
- [ ] Generar JSON con esquema:
{
"ticket": "EPPA-###",
"commit": "abc1234",
"timestamp": "2025-10-06T14:30:00Z",
"status": "passed|failed",
"tests_total": 15,
"tests_passed": 14,
"tests_failed": 1,
"duration_s": 3.45,
"notes": "1 test failed: test_calibration.py::test_invalid_grid"
}
results/{EPPA-###}/{timestamp}-{commit}.json
- [ ] Crear directorio si no existe
- [ ] Integrar en CI/CD (opcional, P2)
Archivos Afectados:
- scripts/run_tests_with_results.py (nuevo)
- results/ (directorio)
- package.json (script: npm run test:save)
Dependencias: EPPA-025
Referencia: Especificación de sesión, decisión D7
Riesgos: - Git no disponible (commit hash falla) → Mitigación: fallback a "unknown"
Tests: - Integration: Ejecutar script → verificar JSON generado → validar esquema
EPPA-027: Crear tests de integración para flujo de captura completo¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción: Test end-to-end: capturar marcadores en 4 vistas → guardar → verificar archivos.
Por qué: Validar flujo crítico de fase 1 del workflow.
Criterios de Aceptación: - [ ] Test simula: 1. Seleccionar paciente "TEST_001" 2. Vista Anterior: marcar 10 puntos → guardar 3. Vista Posterior: marcar 10 puntos → guardar 4. Perfil Derecho: marcar 8 puntos → guardar 5. Perfil Izquierdo: marcar 8 puntos → guardar - [ ] Verificar: 4 archivos JSON generados - [ ] Verificar: cada archivo tiene estructura correcta - [ ] Verificar: coordenadas dentro de bounds esperados - [ ] Cleanup: borrar archivos de test al finalizar
Archivos Afectados:
- tests/integration/test_marker_capture_flow.py (nuevo)
Dependencias: EPPA-006, EPPA-008, EPPA-025
Referencia: Especificación de sesión
Riesgos: - Ninguno crítico
Tests: - Meta-test: ejecutar y verificar pasa
EPPA-028: Crear tests de integración para flujo de análisis completo¶
Estado: TODO Prioridad: P1 Estimación: 3 Pomodoros
Descripción: Test end-to-end: importar marcadores → calibrar → calcular → exportar Excel/imágenes.
Por qué: Validar flujo crítico de fase 2 del workflow.
Criterios de Aceptación: - [ ] Test simula: 1. Cargar marcadores guardados de EPPA-027 2. Vista Anterior: importar → calibrar → calcular → exportar tabla 3. Repetir para vistas Posterior, Perfil Derecho, Perfil Izquierdo 4. Verificar Excel generado con 4 hojas 5. Verificar 4 imágenes PNG generadas - [ ] Validar: valores en Excel coinciden con cálculos esperados (casos conocidos) - [ ] Cleanup: borrar archivos de test
Archivos Afectados:
- tests/integration/test_analysis_flow.py (nuevo)
Dependencias: EPPA-010, EPPA-011, EPPA-016, EPPA-019, EPPA-020, EPPA-025
Referencia: Especificación de sesión
Riesgos: - Ninguno crítico
Tests: - Meta-test: ejecutar y verificar pasa
Módulo 7: Infraestructura y Configuración¶
EPPA-029: Crear convención de commits (.commit-convencion.md)¶
Estado: TODO Prioridad: P0 Estimación: 1 Pomodoro
Descripción: Documentar estándar de mensajes de commit con formato, ejemplos y validación.
Por qué: Consistencia en historial de Git, trazabilidad de cambios.
Criterios de Aceptación:
- [ ] Archivo .commit-convencion.md en raíz del proyecto
- [ ] Formato especificado:
<tipo>(EPPA-###): <descripción corta max 72 chars>
<cuerpo opcional: qué cambió, por qué>
Refs: EPPA-###
Commit: <hash>
Test: unit: N passed / integration: M passed
Results: results/EPPA-###/<archivo>.json
feat, fix, refactor, test, docs, chore
- [ ] Ejemplos concretos (min 5)
- [ ] Opcional: hook pre-commit para validar formato (P3)
Archivos Afectados:
- .commit-convencion.md (nuevo)
Dependencias: Ninguna
Referencia: Especificación de sesión, decisión D8
Riesgos: - Ninguno
Tests: - Manual: revisar que documento sea claro
EPPA-030: Configurar runner de tests frontend (Jest/Vitest)¶
Estado: TODO Prioridad: P1 Estimación: 2 Pomodoros
Descripción: Configurar framework de testing para componentes React/TypeScript.
Por qué: Necesario para tests unitarios de UI (componentes, hooks).
Criterios de Aceptación:
- [ ] Instalar Vitest (más rápido que Jest para Vite/Next.js)
- [ ] Configurar vitest.config.ts
- [ ] Configurar React Testing Library
- [ ] Setup: mock de Next.js router, fetch, etc.
- [ ] Ejemplo de test: renderizar <MainMenu /> (EPPA-001)
- [ ] Script: npm run test ejecuta tests frontend
- [ ] Coverage report configurado
Archivos Afectados:
- vitest.config.ts (nuevo)
- package.json (dependencias + scripts)
- tests/unit/components/main-menu.test.tsx (ejemplo)
Dependencias: Ninguna
Referencia: Estándar de testing moderno para Next.js
Riesgos: - Conflictos con configuración Next.js → Mitigación: seguir docs oficiales de Vitest + Next.js
Tests: - Meta: ejecutar npm run test y verificar pasa
EPPA-031: Crear README con instrucciones de setup y desarrollo¶
Estado: TODO Prioridad: P2 Estimación: 1 Pomodoro
Descripción: Documentar cómo instalar, ejecutar y desarrollar en el proyecto.
Por qué: Onboarding de nuevos desarrolladores, referencia rápida.
Criterios de Aceptación:
- [ ] Secciones:
- [ ] Descripción del proyecto
- [ ] Requisitos: Node.js, Python, dependencias
- [ ] Instalación: npm install, pip install -r requirements.txt
- [ ] Ejecución: dev server, tests, build
- [ ] Estructura de carpetas
- [ ] Convención de commits (link a .commit-convencion.md)
- [ ] Workflow de desarrollo (crear rama, tests, PR)
- [ ] Links a docs: tasks.md, doubts.md, memory.md
- [ ] Formato Markdown, bien estructurado
- [ ] Screenshots opcionales (P3)
Archivos Afectados:
- README.md (actualizar existente)
Dependencias: EPPA-029
Referencia: Estándar de proyectos open source
Riesgos: - Ninguno
Tests: - Manual: seguir instrucciones en máquina limpia
Módulo 8: Mejoras y Optimizaciones (Prioridad Baja)¶
EPPA-032: Implementar sistema de gestión de pacientes (CRUD)¶
Estado: TODO Prioridad: P3 Estimación: 5 Pomodoros
Descripción: Base de datos simple (SQLite o IndexedDB) para CRUD de pacientes con historial de sesiones.
Por qué: Actualmente organización es manual (carpetas). Mejora UX para gestión multi-paciente.
Criterios de Aceptación:
- [ ] Modelo: Paciente (id, nombre, fecha_nacimiento, evaluador)
- [ ] Modelo: Sesión (id, paciente_id, fecha, tipo: "inicial"|"seguimiento"|"final")
- [ ] Rutas: /pacientes, /pacientes/nuevo, /pacientes/:id
- [ ] CRUD completo con validaciones
- [ ] Al capturar marcadores: asociar a paciente + sesión
- [ ] Buscador de pacientes (por nombre, fecha)
Archivos Afectados:
- src/lib/db.ts (nuevo, ORM simple o Prisma)
- src/app/pacientes/ (nuevas rutas)
- src/components/pacientes/ (componentes CRUD)
Dependencias: Ninguna (opcional)
Referencia: Q002, Q020
Riesgos: - Overhead de complejidad → Mitigación: implementar solo si el equipo de investigación clínica lo requiere
Tests: - Unit: Validaciones de modelos - Integration: CRUD completo end-to-end
EPPA-033: Agregar i18n (español/inglés)¶
Estado: TODO Prioridad: P3 Estimación: 3 Pomodoros
Descripción: Internacionalización para soportar inglés además de español.
Por qué: Expansión potencial a usuarios internacionales.
Criterios de Aceptación:
- [ ] Librería: next-i18next o similar
- [ ] Archivos de traducciones: locales/es.json, locales/en.json
- [ ] Traducir: UI labels, botones, mensajes de error, tooltips
- [ ] Selector de idioma en header (ES | EN)
- [ ] Persistir preferencia en localStorage
- [ ] Términos anatómicos: mantener en latín (universal)
Archivos Afectados:
- src/i18n/ (nuevo)
- locales/ (nuevo)
- Todos los componentes UI (wrapping de strings)
Dependencias: Ninguna
Referencia: Q022
Riesgos: - Esfuerzo de traducción alto → Mitigación: implementar solo si hay demanda confirmada
Tests: - Integration: Cambiar idioma → verificar UI actualizada
EPPA-034: Optimizar performance de imágenes grandes¶
Estado: TODO Prioridad: P3 Estimación: 3 Pomodoros
Descripción: Lazy loading, compresión, canvas offscreen para imágenes de alta resolución.
Por qué: Mejorar experiencia con fotos de pacientes (potencialmente 4K+).
Criterios de Aceptación: - [ ] Lazy loading de imágenes (solo cargar vista activa) - [ ] Compresión automática si imagen > 5MB (sin pérdida visual) - [ ] Rendering en canvas offscreen para zoom/pan - [ ] Indicador de carga (spinner) mientras imagen carga - [ ] Fallback: imagen placeholder si falla carga
Archivos Afectados:
- src/components/orthoposture/image-display-area.tsx
- src/lib/image-optimization.ts (nuevo)
Dependencias: EPPA-013
Referencia: Q017
Riesgos: - Over-engineering → Mitigación: implementar solo si hay evidencia de problemas de performance
Tests: - Performance: medir tiempo de carga con imágenes de 10MB+
Resumen de Prioridades¶
P0 (Crítico - Bloquea desarrollo): - EPPA-001, EPPA-002, EPPA-006, EPPA-010, EPPA-011, EPPA-012, EPPA-016, EPPA-025, EPPA-029
P1 (Alto - Features core): - EPPA-003, EPPA-004, EPPA-005, EPPA-008, EPPA-013, EPPA-015, EPPA-017, EPPA-018, EPPA-019, EPPA-021, EPPA-022, EPPA-026, EPPA-027, EPPA-028, EPPA-030
P2 (Medio - Mejoras importantes): - EPPA-007, EPPA-009, EPPA-014, EPPA-020, EPPA-023, EPPA-024, EPPA-031
P3 (Bajo - Nice to have): - EPPA-032, EPPA-033, EPPA-034
Notas¶
- Total de tareas: 34
- Estimación total: ~85 Pomodoros (~42.5 horas de desarrollo)
- Orden recomendado de ejecución: P0 → P1 → P2 → P3
- Dependencias críticas: Completar EPPA-001, EPPA-002, EPPA-004 antes de empezar módulos de captura/análisis
- Revisión: Este backlog debe actualizarse tras resolver dudas en
doubts.md
Última actualización: 2025-10-06