| Entorno | Node 20 · Express 4 · PG 15 |
| Ruta afectada | GET /api/v2/patients/history |
| Clinics afectadas | clinic_id: 42 (unica confirmada) |
| Ultimo deploy | 2026-06-14 22:05 UTC (anoche) |
| Tickets soporte | 7 tickets abiertos |
c7d84b1 anadio un LEFT JOIN a session_notes sin DISTINCT, generando filas duplicadas. Ademas, el JOIN no protege contra NULL en session_notes.patient_id, haciendo que el formateador reciba un objeto patient undefined.
[...new Set(patients)] en el frontend o un .filter(Boolean) en el controlador. Eso ocultaria el bug sin corregirlo. Se corrige la query.
DISTINCT ON (p.id) mas subconsulta de la ultima nota garantiza exactamente una fila por paciente. El optional chaining en el formateador es defensa en profundidad (fallback seguro), no el fix principal.
| Verificacion | Comando | Resultado | Duracion |
|---|---|---|---|
| Test de regresion especifico | npm test -- --grep "INC-2026-0615" | ✓ 2/2 passed | 1.2 s |
| Suite completa | npm test | ✓ 847/847 passed | 43 s |
| Build TypeScript | npm run build | ✓ 0 errores | 8 s |
| Check manual staging | curl staging/history?clinic_id=42 | ✓ 200 OK · sin duplicados | manual |
| Check clinic_id=1 (control) | curl staging/history?clinic_id=1 | ✓ 200 OK · sin duplicados | manual |
| Deploy a produccion | git push origin fix/inc-0615-history-join | ✓ Desplegado 10:14 UTC | deploy |
c7d84b1 activa el bug al primer acceso matutino de la clinica 42.git bisect identifica commit c7d84b1. Query SQL confirmada como causa raiz.DISTINCT ON. Formateador reforzado con optional chaining. 2 tests de regresion anadidos y validados.history.sql, commit c7d84b1| Racionalizacion encontrada | Realidad aplicada | Accion de mejora |
|---|---|---|
| "Los duplicados son del frontend, filtro ahi" | La query devuelvia datos incorrectos. El frontend no debe compensar bugs de backend. | Regla en code review: toda query con JOIN debe tener test de cardinalidad. |
| "El test de history no cubria este caso" | No habia test para un paciente con multiples notas. El gap era de cobertura. | Anadir test fixture de "1 paciente con N notas" al setup de integracion. |
| "Funciono en staging antes del merge" | Staging no tenia datos con multiples session_notes por paciente. | Generar seed realista con datos polifonicos en staging (mı́nimo 3 notas/paciente). |
| "Es un bug menor, lo arreglo rapido sin bisect" | Sin bisect se habria tardado 3x mas en localizar el commit culpable. | Incluir git bisect en el runbook de incidentes P1/P2. |