Revisión Codex — Pull Request
Primera línea del informe generado: "Español confirmado."
Antes de revisar — pregúntate (framework Codex)
- ¿Qué tipo de cambio es? Hook nuevo, refactor, hotfix, migración, config — el tipo determina qué puntos Codex aplican.
- ¿Cuál es el peor escenario en producción? Si este código falla, ¿qué se rompe? Eso fija la severidad de los hallazgos.
- ¿Hay algo fuera del diff que el cambio asume? Schema, config, dependencias, índices BD, permisos — los olvidos viven en lo que no se ve.
- ¿Es idempotente? Si se ejecuta dos veces (retry, doble clic, re-deploy, re-import config), ¿pasa algo malo?
- ¿Se puede desactivar? ¿Hay kill-switch (config/setting/feature flag) si la feature explota a las 3am sin tiempo de redeploy?
Si no puedes responder a las cinco con confianza, lee el código circundante antes de emitir el informe.
Ejemplo de aplicación (mini-PR)
PR: añade mymodule_node_update() que calcula un score y lo guarda en una tabla custom vía db_query("INSERT ... VALUES ('" . $title . "')").
- (1) Tipo: hook de entidad + escritura SQL → aplican Codex 1, 3, 4, 9.
- (2) Peor escenario: SQL injection si
$title viene de input + nodos nuevos sin score (falta _insert).
- (3) Asume: que la tabla custom existe (¿hay update hook? ¿schema?).
- (4) Idempotente: ¿qué pasa al re-guardar el nodo? ¿duplica filas o hace UPDATE? Verificar.
- (5) Kill-switch: no hay → hallazgo Media (Codex 11).
Resultado: 4 hallazgos (3 Alta + 1 Media), ninguno fuera del alcance del PR.
Fast path (resumen ejecutable)
1. Leer references/metodologia-codex-completa.md (~70 líneas, completo)
2. Leer references/plantillas-hallazgos.md (~230 líneas, completo)
3. cd a drupal/ si existe, si no raíz del workspace
4. Pedir/confirmar número de PR y ramas (base ← head). Si no se sabe, preguntar.
5. git fetch origin pull/<N>/head:pr-<N> (descarga rama del PR)
6. git diff --name-only origin/<base>...pr-<N> → lista de archivos
7. Aplicar Decision tree para elegir puntos Codex prioritarios
8. Aplicar las 5 preguntas del framework Codex (sección anterior)
9. Revisar archivo por archivo, anotando hallazgos con Severidad
10. Detectar IDE: leer CLAUDE_CODE_ENTRYPOINT (claude-vscode/claude-cursor/claude-antigravity).
Solo si no es concluyente, caer a detección por carpeta existente.
11. Escribir informe en <carpeta-IDE>/Revisiones PRs/lint-review-pr<N>.md
12. Auto-verificar contra el Checklist de auto-verificación (final del documento)
Si cualquier paso falla, detente y consulta la sección "Edge cases del propio flujo".
Ubicación fija (no preguntar)
Repo git: si existe carpeta drupal/ en el workspace, los git se ejecutan dentro de drupal/. Si no, raíz del workspace.
Carpeta de salida (auto-detectada por IDE):
Paso 1 — detectar el IDE por variable de entorno (PRIORITARIO). Ejecuta printenv CLAUDE_CODE_ENTRYPOINT (o equivalente) y aplica:
CLAUDE_CODE_ENTRYPOINT |
Carpeta a usar |
claude-antigravity |
.antigravity/Revisiones PRs/ |
claude-cursor |
.cursor/Revisiones PRs/ |
claude-vscode |
.vscode/Revisiones PRs/ |
otros (cli, vacío, etc.) |
continuar al Paso 2 |
Señales secundarias si CLAUDE_CODE_ENTRYPOINT no es concluyente: __CFBundleIdentifier (com.microsoft.VSCode → VS Code, com.todesktop.* → Cursor, com.google.Antigravity → Antigravity), o VSCODE_PID/CURSOR_*/ANTIGRAVITY_* cuando existan.
Si el IDE se identificó por env, crea la carpeta correspondiente aunque no exista todavía. NUNCA caigas a detección por carpeta cuando el env var es claro — eso causa el bug de elegir .cursor/ solo porque sobrevive de un uso anterior del IDE.
Paso 2 — fallback por existencia de carpeta (solo si no hay señal de env):
- Si existe
.antigravity/ en la raíz del workspace → .antigravity/Revisiones PRs/
- Si existe
.cursor/ (y no .antigravity/) → .cursor/Revisiones PRs/
- Si existe
.vscode/ (y no las anteriores) → .vscode/Revisiones PRs/
- Si no existe ninguna →
docs/revisiones-prs/
Nombre del archivo: lint-review-pr<N>.md (N = número de PR, sin ceros a la izquierda). Crear la carpeta si no existe. Un archivo por PR (no sobrescribir entre PRs).
Flujo
- Detectar contexto del PR:
- Pedir/confirmar al usuario el número de PR y las ramas exactas (base ← head). Si no se proporcionan, preguntar antes de continuar.
git fetch origin pull/<N>/head:pr-<N> (descarga la rama del PR como pr-<N> local).
git fetch origin <base> (asegura que la rama base esté actualizada).
git diff --name-only origin/<base>...pr-<N> → lista de archivos.
- Aplicar el Decision tree (siguiente sección).
- Cargar referencias necesarias (ver sección "Carga de referencias").
- Revisar solo los archivos del PR + dependencias mínimas.
- Emitir el informe con la estructura obligatoria.
Decision tree según contenido del PR
| Contenido del PR |
Puntos Codex prioritarios |
Foco extra |
.module / .php (hooks, services, controllers) |
1, 2, 3, 4, 5, 6, 7, 9, 11, 13 |
DI, access, transactions |
.twig solo |
8, 14 |
XSS, cache metadata, i18n |
.yml config (*.schema.yml, *.routing.yml, *.services.yml) |
11, 15, 18 |
Schema completo, overrides |
*.install / update hooks |
1, 5, 9, 17 |
Idempotencia, rollback |
Migrations (migrate_plus.migration.*) |
16 |
id_map, file usage |
.scss / .js solo |
— |
Linters, A11y, BigPipe |
| Diff vacío |
Reportar "PR sin cambios respecto a la base" y salir |
|
| PR ya mergeado |
Avisar al usuario; confirmar si se quiere revisar histórico |
|
Sin acceso a pull/<N>/head |
Pedir confirmación de número de PR / repo correcto |
|
| >200 archivos cambiados |
Avisar al usuario y pedir confirmación |
|
Solo composer.lock |
Revisar deps añadidas/eliminadas, no líneas |
|
Edge cases del propio flujo
- Si
git fetch origin pull/<N>/head:pr-<N> falla → verificar acceso al repo, número de PR, o si el repo no es GitHub (GitLab usa merge-requests/<N>/head).
- Si la rama base no existe localmente →
git fetch origin <base>:<base>.
- Si el PR tiene >200 archivos cambiados → avisar al usuario y pedir confirmación antes de revisar (puede ser merge ruidoso).
- Si solo hay cambios en
composer.lock → revisar deps añadidas/eliminadas, no líneas individuales.
- Si el PR ya fue mergeado → avisar al usuario y confirmar si se quiere revisar histórico igualmente.
Carga de referencias
Esta skill tiene dos archivos en references/. Reglas de carga:
- MANDATORY — leer ANTES de citar puntos Codex: lee completo
references/metodologia-codex-completa.md (~70 líneas, 18 puntos con el PORQUÉ). NUNCA parafrasees los puntos sin haberlo leído. NUNCA uses range limits al leerlo.
- MANDATORY — leer ANTES de redactar hallazgos: lee completo
references/plantillas-hallazgos.md (~230 líneas, 14 plantillas con código real). Adapta los snippets al PR real, no inventes código.
- Si ya las has leído en esta sesión, no recargar — el contexto las conserva.
- Do NOT load ninguna otra documentación externa, README, ni archivos del propio módulo más allá del diff y dependencias mínimas.
NEVER (lecciones aprendidas a las malas)
- NUNCA marcar "Alta" un hallazgo de estilo (typo, espacio, comentario). Por qué: diluye severidad, el equipo deja de leer las Altas reales.
- NUNCA sugerir refactors fuera del diff salvo seguridad crítica o data loss. Por qué: rompe el alcance del PR y genera fricción con el autor.
- NUNCA referenciar ni nombrar otros PRs en el documento. Por qué: el revisor del PR pierde foco y mezcla discusiones.
- NUNCA aprobar
\Drupal::service() en clases nuevas con el argumento "ya había antes". Por qué: perpetúa deuda y bloquea testing.
- NUNCA dar por bueno
accessCheck(FALSE) sin comentario // accessCheck OK porque... en la línea siguiente. Por qué: bypass silencioso de permisos.
- NUNCA aprobar migración sin verificar
id_map y file_usage (si maneja media). Por qué: rollbacks rotos.
- NUNCA aprobar
|raw en Twig sin verificar que el origen es 100% controlado por el sistema. Por qué: XSS persistente.
- NUNCA aprobar
$query->execute() dentro de hook_*_alter sin cache. Por qué: N+1 en cada render.
- NUNCA aprobar nuevo
dependencies: en *.info.yml sin verificar que el módulo está en composer.json. Por qué: deploy roto en CI.
- NUNCA escribir el informe en inglés. Código y comandos en inglés; explicaciones en español.
- NUNCA marcar el informe como "OK" si hay cualquier hallazgo de severidad Alta sin resolver.
- NUNCA citar un punto Codex sin haber leído
references/metodologia-codex-completa.md en esta sesión.
- NUNCA aprobar
EntityFieldManagerInterface::getFieldStorageDefinitions() sin verificar que el field exists primero. Por qué: tras eliminar un field y antes de cron/field_purge_batch, el storage queda zombi y revienta queries.
- NUNCA aprobar Batch API nueva sin
finished callback que maneje $success === FALSE. Por qué: batches que fallan en mitad dejan datos a medias y nadie se entera.
- NUNCA aprobar
entityTypeManager->getStorage()->loadMultiple() sin array vacío como guarda. Por qué: loadMultiple([]) devuelve TODAS las entidades — bug clásico de fuga de memoria.
Severidades (criterio fijo)
| Severidad |
Criterio |
| Alta |
Seguridad explotable, data loss, rompe producción, bloquea deploy |
| Media |
Bug funcional, incumple estándar del proyecto, deuda inmediata |
| Baja |
Estilo, micro-optimización, mejora opcional |
Si dudas entre dos niveles, baja uno. Las Altas deben ser realmente Altas.
Estructura obligatoria del informe
Español confirmado.
# Revisión de código — PR #<N> (<base> ← <head>)
## Resumen ejecutivo
<2-4 frases: alcance del PR, conteo por severidad, veredicto>
## Hallazgos por categoría
### Seguridad
### Lógica de negocio / Codex
### Estándares / DI
### Performance / Cache
### Accesibilidad / i18n
### Tests / CI
## Riesgos (tabla)
| Área | Riesgo | Severidad | Mitigación |
## Sugerencias accionables
1. ...
## Checklist final
- [ ] Hallazgos Alta resueltos
- [ ] Tests pasan
- [ ] Schema config actualizado
- [ ] Update hooks idempotentes
Cada hallazgo va con Problema (Severidad), Riesgo y Solución (con código). Adapta las plantillas de references/plantillas-hallazgos.md.
Idioma y tono
- Español en todo el texto. Inglés en código, nombres de clase, comandos y rutas.
- Tono profesional, directo, simpático con el equipo que aplicará las correcciones.
- Detalle proporcional a la complejidad del hallazgo.
Checklist de auto-verificación (antes de entregar)
Antes de dar por cerrado el informe, comprueba uno por uno:
Si alguna casilla queda sin marcar, vuelve atrás y arregla antes de entregar.
Recovery — qué hacer si algo falla
| Síntoma |
Acción |
references/metodologia-codex-completa.md no existe |
Avisar al usuario, no inventar puntos Codex |
references/plantillas-hallazgos.md no existe |
Generar hallazgos sin plantilla pero con misma estructura |
git fetch origin pull/<N>/head falla |
Verificar número de PR, repo correcto, o si es GitLab (merge-requests/<N>/head) |
| Rama base no existe localmente |
git fetch origin <base>:<base> y reintentar |
.cursor/ o .vscode/ no se puede crear |
Pedir al usuario que cree la carpeta y reintentar |
| PR demasiado grande (>200 archivos) |
Pedir confirmación antes de continuar |
| PR ya mergeado |
Avisar y confirmar si se revisa histórico igualmente |
| El usuario no proporciona número de PR |
Preguntar antes de continuar, no asumir |
1---2name: codex-pr-review3description: Revisa pull requests en proyectos Drupal 11 (u otro) siguiendo la metodología Codex (lógica de negocio, edge cases de hooks/queries, seguridad, performance, completitud). Genera un informe .md en la carpeta del IDE detectado (.antigravity/, .cursor/, .vscode/ o docs/) con hallazgos por severidad y soluciones accionables. Usar cuando el usuario pida "revisión Codex", "revisión de PR", "revisar PR", "revisar PR4---56# Revisión Codex — Pull Request78Primera línea del informe generado: **"Español confirmado."**910## Antes de revisar — pregúntate (framework Codex)11121. **¿Qué tipo de cambio es?** Hook nuevo, refactor, hotfix, migración, config — el tipo determina qué puntos Codex aplican.132. **¿Cuál es el peor escenario en producción?** Si este código falla, ¿qué se rompe? Eso fija la severidad de los hallazgos.143. **¿Hay algo fuera del diff que el cambio asume?** Schema, config, dependencias, índices BD, permisos — los olvidos viven en lo que no se ve.154. **¿Es idempotente?** Si se ejecuta dos veces (retry, doble clic, re-deploy, re-import config), ¿pasa algo malo?165. **¿Se puede desactivar?** ¿Hay kill-switch (config/setting/feature flag) si la feature explota a las 3am sin tiempo de redeploy?1718Si no puedes responder a las cinco con confianza, lee el código circundante antes de emitir el informe.1920### Ejemplo de aplicación (mini-PR)2122PR: añade `mymodule_node_update()` que calcula un score y lo guarda en una tabla custom vía `db_query("INSERT ... VALUES ('" . $title . "')")`.2324- **(1) Tipo:** hook de entidad + escritura SQL → aplican Codex 1, 3, 4, 9.25- **(2) Peor escenario:** SQL injection si `$title` viene de input + nodos nuevos sin score (falta `_insert`).26- **(3) Asume:** que la tabla custom existe (¿hay update hook? ¿schema?).27- **(4) Idempotente:** ¿qué pasa al re-guardar el nodo? ¿duplica filas o hace UPDATE? Verificar.28- **(5) Kill-switch:** no hay → hallazgo Media (Codex 11).2930Resultado: 4 hallazgos (3 Alta + 1 Media), ninguno fuera del alcance del PR.3132## Fast path (resumen ejecutable)3334```351. Leer references/metodologia-codex-completa.md (~70 líneas, completo)362. Leer references/plantillas-hallazgos.md (~230 líneas, completo)373. cd a drupal/ si existe, si no raíz del workspace384. Pedir/confirmar número de PR y ramas (base ← head). Si no se sabe, preguntar.395. git fetch origin pull/<N>/head:pr-<N> (descarga rama del PR)406. git diff --name-only origin/<base>...pr-<N> → lista de archivos417. Aplicar Decision tree para elegir puntos Codex prioritarios428. Aplicar las 5 preguntas del framework Codex (sección anterior)439. Revisar archivo por archivo, anotando hallazgos con Severidad4410. Detectar IDE: leer CLAUDE_CODE_ENTRYPOINT (claude-vscode/claude-cursor/claude-antigravity).45 Solo si no es concluyente, caer a detección por carpeta existente.4611. Escribir informe en <carpeta-IDE>/Revisiones PRs/lint-review-pr<N>.md4712. Auto-verificar contra el Checklist de auto-verificación (final del documento)48```4950Si cualquier paso falla, detente y consulta la sección "Edge cases del propio flujo".5152## Ubicación fija (no preguntar)5354- **Repo git:** si existe carpeta `drupal/` en el workspace, los `git` se ejecutan **dentro de `drupal/`**. Si no, raíz del workspace.55- **Carpeta de salida (auto-detectada por IDE):**5657 **Paso 1 — detectar el IDE por variable de entorno (PRIORITARIO).** Ejecuta `printenv CLAUDE_CODE_ENTRYPOINT` (o equivalente) y aplica:58 | `CLAUDE_CODE_ENTRYPOINT` | Carpeta a usar |59 |---|---|60 | `claude-antigravity` | `.antigravity/Revisiones PRs/` |61 | `claude-cursor` | `.cursor/Revisiones PRs/` |62 | `claude-vscode` | `.vscode/Revisiones PRs/` |63 | otros (`cli`, vacío, etc.) | continuar al Paso 2 |6465 Señales secundarias si `CLAUDE_CODE_ENTRYPOINT` no es concluyente: `__CFBundleIdentifier` (`com.microsoft.VSCode` → VS Code, `com.todesktop.*` → Cursor, `com.google.Antigravity` → Antigravity), o `VSCODE_PID`/`CURSOR_*`/`ANTIGRAVITY_*` cuando existan.6667 **Si el IDE se identificó por env**, crea la carpeta correspondiente aunque no exista todavía. **NUNCA caigas a detección por carpeta cuando el env var es claro** — eso causa el bug de elegir `.cursor/` solo porque sobrevive de un uso anterior del IDE.6869 **Paso 2 — fallback por existencia de carpeta** (solo si no hay señal de env):70 1. Si existe `.antigravity/` en la raíz del workspace → `.antigravity/Revisiones PRs/`71 2. Si existe `.cursor/` (y no `.antigravity/`) → `.cursor/Revisiones PRs/`72 3. Si existe `.vscode/` (y no las anteriores) → `.vscode/Revisiones PRs/`73 4. Si no existe ninguna → `docs/revisiones-prs/`7475- **Nombre del archivo:** `lint-review-pr<N>.md` (N = número de PR, sin ceros a la izquierda). Crear la carpeta si no existe. Un archivo por PR (no sobrescribir entre PRs).7677## Flujo78791. **Detectar contexto del PR**:80 - Pedir/confirmar al usuario el **número de PR** y las **ramas exactas** (base ← head). Si no se proporcionan, preguntar antes de continuar.81 - `git fetch origin pull/<N>/head:pr-<N>` (descarga la rama del PR como `pr-<N>` local).82 - `git fetch origin <base>` (asegura que la rama base esté actualizada).83 - `git diff --name-only origin/<base>...pr-<N>` → lista de archivos.84 - Aplicar el **Decision tree** (siguiente sección).852. **Cargar referencias necesarias** (ver sección "Carga de referencias").863. **Revisar solo los archivos del PR** + dependencias mínimas.874. **Emitir el informe** con la estructura obligatoria.8889## Decision tree según contenido del PR9091| Contenido del PR | Puntos Codex prioritarios | Foco extra |92|---|---|---|93| `.module` / `.php` (hooks, services, controllers) | 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 | DI, access, transactions |94| `.twig` solo | 8, 14 | XSS, cache metadata, i18n |95| `.yml` config (`*.schema.yml`, `*.routing.yml`, `*.services.yml`) | 11, 15, 18 | Schema completo, overrides |96| `*.install` / update hooks | 1, 5, 9, 17 | Idempotencia, rollback |97| Migrations (`migrate_plus.migration.*`) | 16 | id_map, file usage |98| `.scss` / `.js` solo | — | Linters, A11y, BigPipe |99| **Diff vacío** | Reportar "PR sin cambios respecto a la base" y salir |100| **PR ya mergeado** | Avisar al usuario; confirmar si se quiere revisar histórico |101| **Sin acceso a `pull/<N>/head`** | Pedir confirmación de número de PR / repo correcto |102| **>200 archivos cambiados** | Avisar al usuario y pedir confirmación |103| **Solo `composer.lock`** | Revisar deps añadidas/eliminadas, no líneas |104105## Edge cases del propio flujo106107- Si `git fetch origin pull/<N>/head:pr-<N>` falla → verificar acceso al repo, número de PR, o si el repo no es GitHub (GitLab usa `merge-requests/<N>/head`).108- Si la rama base no existe localmente → `git fetch origin <base>:<base>`.109- Si el PR tiene >200 archivos cambiados → avisar al usuario y pedir confirmación antes de revisar (puede ser merge ruidoso).110- Si solo hay cambios en `composer.lock` → revisar deps añadidas/eliminadas, no líneas individuales.111- Si el PR ya fue mergeado → avisar al usuario y confirmar si se quiere revisar histórico igualmente.112113## Carga de referencias114115Esta skill tiene dos archivos en `references/`. Reglas de carga:116117- **MANDATORY — leer ANTES de citar puntos Codex:** lee **completo** [`references/metodologia-codex-completa.md`](references/metodologia-codex-completa.md) (~70 líneas, 18 puntos con el PORQUÉ). **NUNCA** parafrasees los puntos sin haberlo leído. **NUNCA** uses range limits al leerlo.118- **MANDATORY — leer ANTES de redactar hallazgos:** lee **completo** [`references/plantillas-hallazgos.md`](references/plantillas-hallazgos.md) (~230 líneas, 14 plantillas con código real). Adapta los snippets al PR real, no inventes código.119- **Si ya las has leído en esta sesión**, no recargar — el contexto las conserva.120- **Do NOT load** ninguna otra documentación externa, README, ni archivos del propio módulo más allá del diff y dependencias mínimas.121122## NEVER (lecciones aprendidas a las malas)123124- **NUNCA** marcar "Alta" un hallazgo de estilo (typo, espacio, comentario). *Por qué:* diluye severidad, el equipo deja de leer las Altas reales.125- **NUNCA** sugerir refactors fuera del diff salvo seguridad crítica o data loss. *Por qué:* rompe el alcance del PR y genera fricción con el autor.126- **NUNCA** referenciar ni nombrar otros PRs en el documento. *Por qué:* el revisor del PR pierde foco y mezcla discusiones.127- **NUNCA** aprobar `\Drupal::service()` en clases nuevas con el argumento "ya había antes". *Por qué:* perpetúa deuda y bloquea testing.128- **NUNCA** dar por bueno `accessCheck(FALSE)` sin comentario `// accessCheck OK porque...` en la línea siguiente. *Por qué:* bypass silencioso de permisos.129- **NUNCA** aprobar migración sin verificar `id_map` y `file_usage` (si maneja media). *Por qué:* rollbacks rotos.130- **NUNCA** aprobar `|raw` en Twig sin verificar que el origen es 100% controlado por el sistema. *Por qué:* XSS persistente.131- **NUNCA** aprobar `$query->execute()` dentro de `hook_*_alter` sin cache. *Por qué:* N+1 en cada render.132- **NUNCA** aprobar nuevo `dependencies:` en `*.info.yml` sin verificar que el módulo está en `composer.json`. *Por qué:* deploy roto en CI.133- **NUNCA** escribir el informe en inglés. Código y comandos en inglés; explicaciones en español.134- **NUNCA** marcar el informe como "OK" si hay cualquier hallazgo de severidad Alta sin resolver.135- **NUNCA** citar un punto Codex sin haber leído `references/metodologia-codex-completa.md` en esta sesión.136- **NUNCA** aprobar `EntityFieldManagerInterface::getFieldStorageDefinitions()` sin verificar que el field exists primero. *Por qué:* tras eliminar un field y antes de `cron`/`field_purge_batch`, el storage queda zombi y revienta queries.137- **NUNCA** aprobar Batch API nueva sin `finished` callback que maneje `$success === FALSE`. *Por qué:* batches que fallan en mitad dejan datos a medias y nadie se entera.138- **NUNCA** aprobar `entityTypeManager->getStorage()->loadMultiple()` sin `array` vacío como guarda. *Por qué:* `loadMultiple([])` devuelve TODAS las entidades — bug clásico de fuga de memoria.139140## Severidades (criterio fijo)141142| Severidad | Criterio |143|---|---|144| **Alta** | Seguridad explotable, data loss, rompe producción, bloquea deploy |145| **Media** | Bug funcional, incumple estándar del proyecto, deuda inmediata |146| **Baja** | Estilo, micro-optimización, mejora opcional |147148Si dudas entre dos niveles, **baja uno**. Las Altas deben ser **realmente** Altas.149150## Estructura obligatoria del informe151152```markdown153Español confirmado.154155# Revisión de código — PR #<N> (<base> ← <head>)156157## Resumen ejecutivo158<2-4 frases: alcance del PR, conteo por severidad, veredicto>159160## Hallazgos por categoría161### Seguridad162### Lógica de negocio / Codex163### Estándares / DI164### Performance / Cache165### Accesibilidad / i18n166### Tests / CI167168## Riesgos (tabla)169| Área | Riesgo | Severidad | Mitigación |170171## Sugerencias accionables1721. ...173174## Checklist final175- [ ] Hallazgos Alta resueltos176- [ ] Tests pasan177- [ ] Schema config actualizado178- [ ] Update hooks idempotentes179```180181Cada hallazgo va con **Problema (Severidad)**, **Riesgo** y **Solución** (con código). Adapta las plantillas de [`references/plantillas-hallazgos.md`](references/plantillas-hallazgos.md).182183## Idioma y tono184185- **Español** en todo el texto. Inglés en código, nombres de clase, comandos y rutas.186- Tono profesional, directo, simpático con el equipo que aplicará las correcciones.187- Detalle proporcional a la complejidad del hallazgo.188189## Checklist de auto-verificación (antes de entregar)190191Antes de dar por cerrado el informe, comprueba uno por uno:192193- [ ] Primera línea del informe es exactamente `Español confirmado.`194- [ ] El archivo está en `<carpeta-IDE>/Revisiones PRs/lint-review-pr<N>.md`195- [ ] El título incluye número de PR exacto y las ramas (base ← head)196- [ ] He leído `references/metodologia-codex-completa.md` en esta sesión197- [ ] He leído `references/plantillas-hallazgos.md` en esta sesión198- [ ] Cada hallazgo tiene **Problema (Severidad)**, **Riesgo** y **Solución**199- [ ] Ninguna severidad "Alta" es solo de estilo (typo, espacio, comentario)200- [ ] Todas las soluciones de código compilan mentalmente y siguen DI/PSR-12201- [ ] No he propuesto cambios fuera del alcance del PR (salvo seguridad crítica)202- [ ] No he referenciado ni nombrado otros PRs en el documento203- [ ] Todas las explicaciones en español, todo el código en inglés204- [ ] He aplicado las 5 preguntas Codex a cada bloque significativo205- [ ] El informe incluye Resumen ejecutivo, Hallazgos, Riesgos, Sugerencias y Checklist final206- [ ] Si hay hallazgos Alta sin resolver, el veredicto NO es "OK"207208Si alguna casilla queda sin marcar, vuelve atrás y arregla antes de entregar.209210## Recovery — qué hacer si algo falla211212| Síntoma | Acción |213|---|---|214| `references/metodologia-codex-completa.md` no existe | Avisar al usuario, no inventar puntos Codex |215| `references/plantillas-hallazgos.md` no existe | Generar hallazgos sin plantilla pero con misma estructura |216| `git fetch origin pull/<N>/head` falla | Verificar número de PR, repo correcto, o si es GitLab (`merge-requests/<N>/head`) |217| Rama base no existe localmente | `git fetch origin <base>:<base>` y reintentar |218| `.cursor/` o `.vscode/` no se puede crear | Pedir al usuario que cree la carpeta y reintentar |219| PR demasiado grande (>200 archivos) | Pedir confirmación antes de continuar |220| PR ya mergeado | Avisar y confirmar si se revisa histórico igualmente |221| El usuario no proporciona número de PR | Preguntar antes de continuar, no asumir |