Zum Inhalt

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
- [ ] Configurar 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"
}
- [ ] Guardar en 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
- [ ] Tipos permitidos: 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