Investigar — Debugging con Root Cause
Debugging sistemático para encontrar y arreglar bugs. Cuatro fases secuenciales.
Nunca se saltea una fase. Nunca se arregla sin entender la causa raíz.
Lectura previa obligatoria
AGENTS.md — patrón de módulos, convenciones del proyecto
README.md — stack (React Query, zod, react-hook-form, MUI)
- Estructura de
src/modules/ — identificar el módulo dueño del área del bug
- Servicios relevantes en
src/modules/<dominio>/services/
- Hooks que consumen esos servicios en
src/modules/<dominio>/hooks/
src/modules/<dominio>/query/keys.ts — query keys del módulo
Cuándo usar esta skill
- "debuggeá este error"
- "por qué falla X"
- "investigá el bug"
- "encontrá la causa raíz"
- "arreglá este comportamiento"
- "antes funcionaba y ahora no"
- Errores 500, stack traces, comportamiento inesperado
- Siempre usar esta skill para bugs. NUNCA debuggear directo.
Cuándo NO usar esta skill
- Typo evidente o fix obvio de 1 línea → Fast-Path: corregir directamente y verificar con
nextjs-code-review sin ejecutar el ciclo forense de 4 fases.
- Error de diseño/visual (espaciado, color, tipografía) →
nextjs-design-audit
- Error de tipos o lint →
nextjs-code-health
- Revisar código sin bug concreto →
nextjs-code-review
- Planificar una feature nueva →
nextjs-architect
- Problema de infraestructura/deploy → no es debugging de código
Metodología
Fase 1 — INVESTIGAR
Recolectar toda la información antes de tocar código.
Pasos
- Reproducir el bug — pasos exactos para triggerearlo
- Capturar el error:
- Mensaje de error completo (sin truncar)
- Stack trace completo
- Request y response del servicio HTTP (network tab, payload, status code)
- Estado del componente al momento del error (props, state, contexto)
- Clasificar el bug:
- ¿Frontend o backend? (si el error viene del servidor, el fix puede estar en backend)
- ¿De datos o de UI? (datos incorrectos vs renderizado roto)
- ¿Consistente o intermitente? (siempre falla vs a veces)
- Contexto del bug:
- ¿Qué usuario/hora/condición lo triggeró?
- ¿Hay pasos previos necesarios?
- ¿Se puede reproducir en incógnito / con caché limpia?
Qué buscar según el stack
- React Query: ¿la query está stale? ¿se invalidó correctamente? ¿el
queryFn está tirando error?
- React Hook Form + Zod: ¿el schema de validación rechaza datos válidos? ¿el error es de zod o del servicio?
- Servicios HTTP: ¿el endpoint es correcto? ¿el payload matchea lo que espera el backend? ¿el status code es el esperado?
- Componentes: ¿condicional de renderizado incorrecto? ¿prop no definida? ¿key duplicada en lista?
Fase 2 — ANALIZAR
Trazar el flujo de datos para aislar dónde se rompe.
Trazado del flujo
- Componente → Hook: ¿el hook está recibiendo los parámetros correctos? ¿se está llamando?
- Hook → Servicio: ¿el hook está usando el servicio correcto? ¿los argumentos son los esperados?
- Servicio → HTTP: ¿la URL, método y payload son correctos? ¿los headers de auth están presentes?
- Respuesta → Hook: ¿la respuesta tiene la forma que espera el hook? ¿el status code se maneja correctamente?
- Hook → Query Key: ¿la query key es correcta? ¿staleTime/gcTime están causando datos viejos?
Puntos críticos a revisar
- Caché de React Query: ¿datos stale? ¿la invalidación (
queryClient.invalidateQueries) se está ejecutando?
- Tipos de TypeScript: ¿hay un
as o any escondiendo un mismatch?
- Zod schema: ¿el schema de validación coincide con lo que manda el backend?
- Estados no manejados: ¿el componente asume que los datos siempre vienen? ¿maneja
undefined, null, array vacío?
- Efectos secundarios: ¿un
useEffect está disparando en el momento incorrecto?
Trazabilidad e Inspección de Caché (React Query)
Cuando el bug involucre datos desactualizados, queries que no refrescan o mutaciones sin efecto:
- Identificar la query key exacta: localizar la definición en
src/modules/<dominio>/query/keys.ts.
- Volcado del estado de la query:
// Inspeccionar estado en runtime o en spec de reproducción
console.log(queryClient.getQueryState(featureKeys.detail(id)));
console.log(queryClient.getQueryData(featureKeys.detail(id)));
Verificar campos críticos: status, fetchStatus, isStale, dataUpdatedAt, y error.
- Verificar invalidación: Confirmar que las mutaciones ejecutan
await queryClient.invalidateQueries({ queryKey: ... }) y que los tags/keys coincidan en profundidad.
Fase 3 — HIPOTETIZAR
Formular la causa raíz ANTES de tocar código.
Cómo formular la hipótesis
- Escribir la causa raíz en una oración:
"El hook useProcedures devuelve undefined porque el servicio getProcedures no maneja el status 204 que el backend retorna cuando la lista está vacía."
- Validar: ¿esta causa explica TODOS los síntomas observados?
- Si no los explica todos, hay más de un bug o la hipótesis es incorrecta → volver a Fase 1.
Regla de hierro
No se avanza a Fase 4 sin hipótesis validada. Si no podés formular la causa en una oración, no entendiste el bug.
Fase 3.5 — TEST DE REGRESIÓN OBLIGATORIO (TDD)
Regla estricta: Antes de modificar cualquier línea de código productivo:
- Crear o actualizar un test unitario (
*.spec.ts) o script mínimo de reproducción en scratchpad que reproduzca el error.
- Ejecutar el test con el runner del proyecto:
pnpm test -- <path-al-spec>.spec.ts
- Confirmar que el test falla (en rojo) verificando la hipótesis de la Fase 3.
- Solo entonces avanzar a la Fase 4. El fix se considerará completo únicamente cuando este test pase a verde.
Fase 4 — IMPLEMENTAR Y REGISTRAR
Fix mínimo, verificado, sin efectos colaterales.
Pasos
- Fix mínimo — arreglar solo lo necesario, no refactorizar de paso
- Verificar el fix:
- Ejecutar el test de regresión de la Fase 3.5 → ahora pasa a verde
- Reproducir manualmente → el bug ya no ocurre
- Probar al menos 2 escenarios: happy path + edge case
- Verificar no romper nada:
- Si el fix fue en un hook: revisar todos los componentes que lo consumen
- Si el fix fue en un servicio: revisar todos los hooks que lo usan
- Si el fix fue en un tipo: revisar todos los lugares donde se usa ese tipo
- Buscar el mismo patrón — si el bug fue por un error común, revisar si existe en otros hooks/servicios
- Generar reporte Direct-to-Disk:
- Utilizar la plantilla oficial
templates/debug-report.template.md.
- Escribir el informe completo en
.agents/debug/<issue-kebab-case>-debug.md (write_to_file).
- Reportar en el chat únicamente la hipótesis en una oración, archivos modificados y el status del test de regresión.
Reglas de lo que SÍ debe hacer
- Escribir el reporte completo en
.agents/debug/<issue-kebab-case>-debug.md (write_to_file)
- Escribir un test o caso de regresión reproducible que falle antes del fix
- Reproducir el bug antes de tocar una sola línea de código
- Trazar el flujo completo de datos (componente → hook → servicio → query key)
- Verificar el fix con reproducción negativa (el bug ya no ocurre)
- Documentar la causa raíz encontrada (una oración)
- Revisar si el mismo patrón de bug existe en otros lugares del módulo
- Leer los servicios y hooks relevantes antes de tocar código
- Verificar el response real del backend (no asumir)
Reglas de lo que NO debe hacer
- NO volcar el reporte extenso ni logs masivos en la respuesta de chat
- NO aplicar un fix sin haber identificado la causa raíz
- NO omitir el test de regresión previo al fix
- NO hacer fixes "a ver si funciona" (trial and error)
- NO modificar código que no está relacionado con el bug (refactors en otro commit)
- NO ignorar la caché de React Query — es causa frecuente de bugs sutiles
- NO asumir que el backend devuelve lo que esperás — verificar el response real
- NO cerrar el bug sin verificar al menos 2 escenarios (happy + edge case)
- NO usar
as any o @ts-ignore para "arreglar" un error de tipos
- NO ignorar errores silenciosos (promesas sin catch, try/catch vacíos)
- NO committear console.log ni código de debug
- NO hacer refactors en el mismo commit del fix
Verificación
- Confirmar persistencia del reporte en
.agents/debug/<issue-kebab-case>-debug.md.
- Bug reproducido en Fase 1 y en test de regresión Fase 3.5.
- Causa raíz identificada en Fase 3 en una sola oración.
- Fix aplicado en Fase 4 y test de regresión pasando a verde.
- Bug ya no ocurre y no se rompió nada relacionado.
Al terminar
Confirmar persistencia del reporte en .agents/debug/<issue-kebab-case>-debug.md. Sugerir al usuario: nextjs-code-review para validar el fix con code review.
1---2name: nextjs-debug-flow3description: Debugging sistemático en 4 fases: investigar, analizar, hipotetizar, implementar. Regla de hierro: no se aplica ningún fix sin identificar la causa raíz. Usar con "debuggeá esto", "por qué falla", "investigá el error", "root cause", "arreglá este bug", "antes funcionaba y ahora no".4---56# Investigar — Debugging con Root Cause78Debugging sistemático para encontrar y arreglar bugs. Cuatro fases secuenciales.9**Nunca se saltea una fase.** Nunca se arregla sin entender la causa raíz.1011## Lectura previa obligatoria1213- `AGENTS.md` — patrón de módulos, convenciones del proyecto14- `README.md` — stack (React Query, zod, react-hook-form, MUI)15- Estructura de `src/modules/` — identificar el módulo dueño del área del bug16- Servicios relevantes en `src/modules/<dominio>/services/`17- Hooks que consumen esos servicios en `src/modules/<dominio>/hooks/`18- `src/modules/<dominio>/query/keys.ts` — query keys del módulo1920## Cuándo usar esta skill2122- "debuggeá este error"23- "por qué falla X"24- "investigá el bug"25- "encontrá la causa raíz"26- "arreglá este comportamiento"27- "antes funcionaba y ahora no"28- Errores 500, stack traces, comportamiento inesperado29- **Siempre usar esta skill para bugs. NUNCA debuggear directo.**3031## Cuándo NO usar esta skill3233- **Typo evidente o fix obvio de 1 línea** → Fast-Path: corregir directamente y verificar con `nextjs-code-review` sin ejecutar el ciclo forense de 4 fases.34- **Error de diseño/visual** (espaciado, color, tipografía) → `nextjs-design-audit`35- **Error de tipos o lint** → `nextjs-code-health`36- **Revisar código sin bug concreto** → `nextjs-code-review`37- **Planificar una feature nueva** → `nextjs-architect`38- **Problema de infraestructura/deploy** → no es debugging de código3940---4142## Metodología4344### Fase 1 — INVESTIGAR4546Recolectar toda la información antes de tocar código.4748### Pasos49501. **Reproducir el bug** — pasos exactos para triggerearlo512. **Capturar el error**:52 - Mensaje de error completo (sin truncar)53 - Stack trace completo54 - Request y response del servicio HTTP (network tab, payload, status code)55 - Estado del componente al momento del error (props, state, contexto)563. **Clasificar el bug**:57 - ¿Frontend o backend? (si el error viene del servidor, el fix puede estar en backend)58 - ¿De datos o de UI? (datos incorrectos vs renderizado roto)59 - ¿Consistente o intermitente? (siempre falla vs a veces)604. **Contexto del bug**:61 - ¿Qué usuario/hora/condición lo triggeró?62 - ¿Hay pasos previos necesarios?63 - ¿Se puede reproducir en incógnito / con caché limpia?6465### Qué buscar según el stack6667- **React Query:** ¿la query está stale? ¿se invalidó correctamente? ¿el `queryFn` está tirando error?68- **React Hook Form + Zod:** ¿el schema de validación rechaza datos válidos? ¿el error es de zod o del servicio?69- **Servicios HTTP:** ¿el endpoint es correcto? ¿el payload matchea lo que espera el backend? ¿el status code es el esperado?70- **Componentes:** ¿condicional de renderizado incorrecto? ¿prop no definida? ¿key duplicada en lista?7172---7374## Fase 2 — ANALIZAR7576Trazar el flujo de datos para aislar dónde se rompe.7778### Trazado del flujo79801. **Componente → Hook:** ¿el hook está recibiendo los parámetros correctos? ¿se está llamando?812. **Hook → Servicio:** ¿el hook está usando el servicio correcto? ¿los argumentos son los esperados?823. **Servicio → HTTP:** ¿la URL, método y payload son correctos? ¿los headers de auth están presentes?834. **Respuesta → Hook:** ¿la respuesta tiene la forma que espera el hook? ¿el status code se maneja correctamente?845. **Hook → Query Key:** ¿la query key es correcta? ¿staleTime/gcTime están causando datos viejos?8586### Puntos críticos a revisar8788- **Caché de React Query:** ¿datos stale? ¿la invalidación (`queryClient.invalidateQueries`) se está ejecutando?89- **Tipos de TypeScript:** ¿hay un `as` o `any` escondiendo un mismatch?90- **Zod schema:** ¿el schema de validación coincide con lo que manda el backend?91- **Estados no manejados:** ¿el componente asume que los datos siempre vienen? ¿maneja `undefined`, `null`, array vacío?92- **Efectos secundarios:** ¿un `useEffect` está disparando en el momento incorrecto?9394### Trazabilidad e Inspección de Caché (React Query)95Cuando el bug involucre datos desactualizados, queries que no refrescan o mutaciones sin efecto:961. **Identificar la query key exacta**: localizar la definición en `src/modules/<dominio>/query/keys.ts`.972. **Volcado del estado de la query**:98 ```typescript99 // Inspeccionar estado en runtime o en spec de reproducción100 console.log(queryClient.getQueryState(featureKeys.detail(id)));101 console.log(queryClient.getQueryData(featureKeys.detail(id)));102 ```103 Verificar campos críticos: `status`, `fetchStatus`, `isStale`, `dataUpdatedAt`, y `error`.1043. **Verificar invalidación**: Confirmar que las mutaciones ejecutan `await queryClient.invalidateQueries({ queryKey: ... })` y que los tags/keys coincidan en profundidad.105106---107108## Fase 3 — HIPOTETIZAR109110Formular la causa raíz ANTES de tocar código.111112### Cómo formular la hipótesis1131141. Escribir la causa raíz en **una oración**:115 > "El hook `useProcedures` devuelve `undefined` porque el servicio `getProcedures` no maneja el status 204 que el backend retorna cuando la lista está vacía."1162. **Validar:** ¿esta causa explica TODOS los síntomas observados?1173. **Si no los explica todos**, hay más de un bug o la hipótesis es incorrecta → volver a Fase 1.118119### Regla de hierro120**No se avanza a Fase 4 sin hipótesis validada.** Si no podés formular la causa en una oración, no entendiste el bug.121122---123124## Fase 3.5 — TEST DE REGRESIÓN OBLIGATORIO (TDD)125126**Regla estricta**: Antes de modificar cualquier línea de código productivo:1271. Crear o actualizar un test unitario (`*.spec.ts`) o script mínimo de reproducción en scratchpad que reproduzca el error.1282. Ejecutar el test con el runner del proyecto:129 ```bash130 pnpm test -- <path-al-spec>.spec.ts131 ```1323. Confirmar que el test **falla (en rojo)** verificando la hipótesis de la Fase 3.1334. Solo entonces avanzar a la Fase 4. El fix se considerará completo únicamente cuando este test pase a verde.134135---136137## Fase 4 — IMPLEMENTAR Y REGISTRAR138139Fix mínimo, verificado, sin efectos colaterales.140141### Pasos1421431. **Fix mínimo** — arreglar solo lo necesario, no refactorizar de paso1442. **Verificar el fix**:145 - Ejecutar el test de regresión de la Fase 3.5 → ahora pasa a verde146 - Reproducir manualmente → el bug ya no ocurre147 - Probar al menos 2 escenarios: happy path + edge case1483. **Verificar no romper nada**:149 - Si el fix fue en un hook: revisar todos los componentes que lo consumen150 - Si el fix fue en un servicio: revisar todos los hooks que lo usan151 - Si el fix fue en un tipo: revisar todos los lugares donde se usa ese tipo1524. **Buscar el mismo patrón** — si el bug fue por un error común, revisar si existe en otros hooks/servicios1535. **Generar reporte Direct-to-Disk**:154 - Utilizar la plantilla oficial [`templates/debug-report.template.md`](./templates/debug-report.template.md).155 - Escribir el informe completo en `.agents/debug/<issue-kebab-case>-debug.md` (`write_to_file`).156 - Reportar en el chat únicamente la hipótesis en una oración, archivos modificados y el status del test de regresión.157158---159160## Reglas de lo que SÍ debe hacer161162- Escribir el reporte completo en `.agents/debug/<issue-kebab-case>-debug.md` (`write_to_file`)163- Escribir un test o caso de regresión reproducible que falle antes del fix164- Reproducir el bug antes de tocar una sola línea de código165- Trazar el flujo completo de datos (componente → hook → servicio → query key)166- Verificar el fix con reproducción negativa (el bug ya no ocurre)167- Documentar la causa raíz encontrada (una oración)168- Revisar si el mismo patrón de bug existe en otros lugares del módulo169- Leer los servicios y hooks relevantes antes de tocar código170- Verificar el response real del backend (no asumir)171172## Reglas de lo que NO debe hacer173174- NO volcar el reporte extenso ni logs masivos en la respuesta de chat175- NO aplicar un fix sin haber identificado la causa raíz176- NO omitir el test de regresión previo al fix177- NO hacer fixes "a ver si funciona" (trial and error)178- NO modificar código que no está relacionado con el bug (refactors en otro commit)179- NO ignorar la caché de React Query — es causa frecuente de bugs sutiles180- NO asumir que el backend devuelve lo que esperás — verificar el response real181- NO cerrar el bug sin verificar al menos 2 escenarios (happy + edge case)182- NO usar `as any` o `@ts-ignore` para "arreglar" un error de tipos183- NO ignorar errores silenciosos (promesas sin catch, try/catch vacíos)184- NO committear console.log ni código de debug185- NO hacer refactors en el mismo commit del fix186187## Verificación188189- Confirmar persistencia del reporte en `.agents/debug/<issue-kebab-case>-debug.md`.190- Bug reproducido en Fase 1 y en test de regresión Fase 3.5.191- Causa raíz identificada en Fase 3 en una sola oración.192- Fix aplicado en Fase 4 y test de regresión pasando a verde.193- Bug ya no ocurre y no se rompió nada relacionado.194195## Al terminar196197Confirmar persistencia del reporte en `.agents/debug/<issue-kebab-case>-debug.md`. Sugerir al usuario: **nextjs-code-review** para validar el fix con code review.