codex-pr-review
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
$titleviene 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, losgitse ejecutan dentro dedrupal/. 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_ENTRYPOINTCarpeta 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_ENTRYPOINTno es concluyente:__CFBundleIdentifier(com.microsoft.VSCode→ VS Code,com.todesktop.*→ Cursor,com.google.Antigravity→ Antigravity), oVSCODE_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/
- Si existe
-
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 comopr-<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 usamerge-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_mapyfile_usage(si maneja media). Por qué: rollbacks rotos. - NUNCA aprobar
|rawen Twig sin verificar que el origen es 100% controlado por el sistema. Por qué: XSS persistente. - NUNCA aprobar
$query->execute()dentro dehook_*_altersin cache. Por qué: N+1 en cada render. - NUNCA aprobar nuevo
dependencies:en*.info.ymlsin verificar que el módulo está encomposer.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.mden esta sesión. - NUNCA aprobar
EntityFieldManagerInterface::getFieldStorageDefinitions()sin verificar que el field exists primero. Por qué: tras eliminar un field y antes decron/field_purge_batch, el storage queda zombi y revienta queries. - NUNCA aprobar Batch API nueva sin
finishedcallback que maneje$success === FALSE. Por qué: batches que fallan en mitad dejan datos a medias y nadie se entera. - NUNCA aprobar
entityTypeManager->getStorage()->loadMultiple()sinarrayvací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:
- Primera línea del informe es exactamente
Español confirmado. - El archivo está en
<carpeta-IDE>/Revisiones PRs/lint-review-pr<N>.md - El título incluye número de PR exacto y las ramas (base ← head)
- He leído
references/metodologia-codex-completa.mden esta sesión - He leído
references/plantillas-hallazgos.mden esta sesión - Cada hallazgo tiene Problema (Severidad), Riesgo y Solución
- Ninguna severidad "Alta" es solo de estilo (typo, espacio, comentario)
- Todas las soluciones de código compilan mentalmente y siguen DI/PSR-12
- No he propuesto cambios fuera del alcance del PR (salvo seguridad crítica)
- No he referenciado ni nombrado otros PRs en el documento
- Todas las explicaciones en español, todo el código en inglés
- He aplicado las 5 preguntas Codex a cada bloque significativo
- El informe incluye Resumen ejecutivo, Hallazgos, Riesgos, Sugerencias y Checklist final
- Si hay hallazgos Alta sin resolver, el veredicto NO es "OK"
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 |
More from j4rk0r/claude-skills
skill-advisor
Pre-execution assistant that builds a full execution plan with installed skills (✅) AND uninstalled gaps (❌) the task needs, then offers to install missing skills one by one. Use BEFORE starting any multi-step task. Triggers: 'recommend skills', 'what skill should I use', 'advise', 'suggest', 'help me with', or any work instruction involving code, design, planning, debugging, docs, testing, commits, PRs, strategy.
9skill-guard
Security auditor for Claude Code skills. Analyzes skills BEFORE installation using a 9-layer threat detection engine (permissions, static patterns, LLM semantic analysis, bundled scripts, data flow, MCP abuse, supply chain, reputation, anti-evasion) with scoring 0-100 and community audit registry. MUST be used whenever the user is about to install a skill — via npx skills add, /find-skills recommendation, /skill-advisor suggestion, or manual request. Also use when user says 'is this skill safe', 'audit this skill', 'check this skill', 'security scan', 'review before installing', or any mention of skill safety/trust/security. Intercept ALL skill installations proactively.
8skill-learner
>
6lint-drupal-module
Lint review completo de un módulo Drupal 11 combinando 4 fuentes en paralelo — PHPStan level 5 + phpstan-drupal, PHPCS Drupal/DrupalPractice, agente drupal-qa (estándares) y agente drupal-security (OWASP). Dos modos — completo (todo el módulo) y diff (solo archivos cambiados vs develop). Genera informe markdown estructurado en la carpeta del IDE con resumen ejecutivo, hallazgos clasificados por severidad, acciones P0/P1/P2 y comandos de verificación. Úsalo siempre que el usuario quiera auditar calidad o seguridad de un módulo Drupal custom, aunque no diga "lint". Triggers — "lint review", "lint del módulo", "auditar módulo Drupal", "revisar módulo custom", "phpstan del módulo", "validar módulo", "qa del módulo", o cuando el usuario pregunta "¿está bien este módulo?", "¿hay errores?", "¿es seguro?". También antes de un release, antes de un PR a develop, o al validar un módulo recién creado.
6milestone
Persistent development milestone tracker with full context across conversations. Use when: tracking multi-session features, resuming work from a previous conversation, asking 'what's left to do on X' or 'what's pending', breaking work into trackable subtasks, planning complex implementations, updating progress after coding, checking project status, completing a subtask with QA validation, auditing what's missing in the project, syncing milestones with actual code state, or closing/archiving a finished milestone. Also trigger when user references a milestone by name, says 'what did we do last time', 'resume where we left off', 'how far along is X', 'mark this as done', 'milestone done', 'close this milestone', 'what's missing', 'audit the project', 'sync milestones', or wants to plan a feature with subtasks. Commands: /milestone, /milestone <name>, /milestone init, /milestone sync, /milestone start, /milestone done, /milestone update.
5usage-tracker
Track and report local Claude Code usage per request: tokens consumed, estimated cost in €, sessions, projects, and tool breakdown. Use when the user asks about consumption, credits, usage, cost per request, wants to see a report, asks why a specific request was expensive, suspects a process is consuming tokens, wants to optimize their Claude Code usage, or wants to audit tool usage by request. Also triggers on Spanish phrases: 'cuánto me está costando', 'cuántos tokens', 'consumo de hoy', 'qué petición fue cara', 'está consumiendo mucho', 'optimizar consumo', 'reporte de uso', 'ver uso', 'instalar tracker', 'hook no registra'. Commands: /usage-tracker report [hoy|semana|mes|all] [proyecto], /usage-tracker top-requests [hoy|semana], /usage-tracker install, /usage-tracker status
5