PTENES
Saltar al contenido
MÓDULO 5.5 · "MODO ENSEÑANZA"

🤖 Action de review + cron de security

Dos automatizaciones que se cuidan solas — listas para copiar. Una GitHub Action de review que se ejecuta en cada PR (checkout → type check → agente → comenta) y un cron de security diario que revisa una parte distinta del repo cada día. Sin ralentizar tu máquina y sin necesitar el modelo más caro. Cada término se explica en el momento.

6
Temas
~40
Minutos
Copiar
Prerequisito
Receta
Tipo
Progreso: 0% 0 de 6

📖 Glosario vivo (lee antes — vuelve siempre que lo necesites)

Este módulo está lleno de términos de automatización. Definimos los nuevos en lenguaje sencillo aquí — los fundamentos (modelo, agente, harness, skill) ya aparecieron en la Ruta 1:

GitHub Action — una automatización que GitHub ejecuta en la nube cuando sucede algo (se abre un PR, dan las doce). Describes los pasos en un archivo YAML en .github/workflows/.
PR (pull request) — la solicitud de «quiero incorporar estos cambios al código principal». Es donde el equipo (o el agente) revisa antes de aceptar.
checkout — descargar los archivos de la branch en la máquina donde se ejecuta la Action, para que pueda leer y ejecutar el código.
type check — una verificación automática (p. ej., tsc en TypeScript) que detecta errores de tipo antes de ejecutar. Es el «pasó el control de calidad» barato.
cron — un programador de tareas: «ejecuta esto todos los días a las 9 h». La «línea de crontab» es la sintaxis de ese horario (0 9 * * *).
security review — una revisión centrada en fallas de seguridad (contraseña expuesta, inyección, permisos incorrectos), no en el estilo.
structured output — hacer que el agente responda en un formato fijo (JSON con campos), en lugar de texto libre, para que otro programa pueda leerlo y decidir.
auto-merge — integrar el PR al código principal automáticamente, sin que nadie tenga que hacer clic. Potente y peligroso: úsalo con gates.
1

🦴 Esqueleto de la Action

🧠 Imagínalo así: una fábrica con una cinta transportadora. Cada vez que llega una pieza nueva (un PR), la cinta se pone en marcha sola: toma la pieza, pasa por el control de calidad, llama al inspector (el agente) y le pega una etiqueta con su evaluación. No tienes que poner la cinta en marcha a mano: responde al activador. Una GitHub Action es esa cinta, pero para código.

Pocock describe una "agent review action": una GitHub Action que "se ejecuta en un PR, hace checkout, verifica los tipos, ejecuta el agente de revisión (un prompt local) y responde 'looks good'." El secreto de toda Action está en su estructura: tiene un disparador (o on: — lo que conecta con la cadena), uno o más jobs (lo que se ejecuta), y dentro de cada job una secuencia de steps (los pasos). Este esquema siempre es el mismo — solo cambia lo que va dentro.

¿Por qué esto lo desbloquea tanto? Porque «run agents on GitHub Actions» es unreasonably effective" — puedes paralelizar todo lo que quieras sin preocuparte por los recursos de la máquina local. La cadena se ejecuta en la nube de GitHub: tu laptop puede estar apagada. El prompt local (un archivo de instrucciones de revisión que vive en el propio repo) es el cerebro del inspector: versionado junto con el código, igual que una skill. Error común: creer que necesitas un servidor propio funcionando las 24 horas. No: la Action solo se activa con el disparador, hace el trabajo y se apaga; pagas solo por los minutos usados.

on: pull_request el detonante job: review (se ejecuta en la nube de GitHub) checkout type check agente de revisión comenta en el PR steps = la secuencia que recorre el agente. Tu máquina local puede estar apagada.

Activador → job → steps. Este esqueleto es universal; lo que cambias es el contenido de los steps.

Ilustración: una cinta transportadora futurista que recibe un pull request y pasa por estaciones de inspección automáticas

Abajo está el YAML real de la review action — la primera de las dos piezas copiables de este módulo. Guárdala como .github/workflows/review.yml. Observa el esqueleto: on: (disparador), jobs:, y los steps: en el orden correcto. Copia y ajusta solo el comando de tu type check:

.github/workflows/review.yml — agent review action
name: agent-review
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - name: Checkout PR
        uses: actions/checkout@v4

      - name: Type check
        run: npx tsc --noEmit        # guard rail barato e determinístico

      - name: Review agent
        run: npx claude -p "$(cat .github/review-prompt.md)" --output review.md
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}

      - name: Comment on PR
        run: gh pr comment "$PR" --body-file review.md
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR: ${{ github.event.pull_request.number }}

En 1 frase: una Action es una cinta transportadora en la nube: el activador la pone en marcha, los pasos se ejecutan y ni siquiera hace falta que el resto de tu máquina esté encendida.

Profundiza (opcional): ¿por qué el prompt de review está en el repo?

Si el "prompt local" de la revisión vive dentro del repositorio (p. ej., .github/review-prompt.md), se versiona junto con el código: mejora en un PR, queda registrada en el historial y todo el equipo ve la misma instrucción. Es el mismo principio del DRY humano (módulo 3-6): "hice esta revisión 100 veces → se convierte en un procedimiento, lo distribuyo al equipo y todos revisan de la misma manera". La Action es solo la cadena de ejecución; el prompt es la skill que ejecuta.

2

🔧 checkout → type check → review

🧠 Imagínalo así: antes de que el especialista (caro) examine al paciente, el personal de enfermería ya midió la presión y la temperatura (barato y rápido). Si la temperatura ya es altísima, ni hace falta el especialista. El type check es el filtro barato; el agente de revisión es el especialista, y solo lo llamas cuando lo básico ya pasó.

Estos tres steps son la columna vertebral de la review action, en el orden que Pocock menciona: "haz checkout, type check, ejecuta el agente de revisión». El orden importa por economía: primero descargas el código y después ejecutas la revisión determinista y barata (el type check detecta errores obvios en segundos), y solo entonces gastamos tokens con el agente. Si el type check falla, muchas veces ni siquiera vale la pena despertar al agente — ya sabes que el PR está roto.

Esto es pura "economía de tokens" (módulo 1-5): el agente es el paso más caro, así que rodéalo de guard rails baratos. Otro motivo para seguir ese orden: el agente revisa mejor cuando el código ya compila. Error común: echarle todo al agente de una vez («revisa y corrige los tipos y ejecuta las pruebas»). No: separa los pasos. Lo determinista (type check, lint, pruebas) hace lo determinista; el agente hace lo que requiere criterio. Cada cual en lo suyo, y lo costoso al final.

1 · checkoutcosto ~0 2 · comprobación de tiposbarato · determinista 3 · agente de reviewCOSTOSO (tokens) — al final, solo si ya pasó Primero, guard rails baratos; el modelo solo entra al final. (módulo 1-5: ahorro de tokens)
Ilustración: tres estaciones de inspección en secuencia, la última destacada con un brillo que indica un costo mayor

Recuperación rápida: ¿por qué el type check viene antes de agente de revisión?

En 1 frase: primero los baratos y deterministas (checkout, type check), el agente costoso solo al final, y solo si lo básico pasó.

3

💬 Comentar en el PR

🧠 Imagínalo así: el inspector de la fábrica no se guarda el dictamen en la cabeza: pega una nota visible en la pieza: «ok» o «atención en el punto X». Quien llegue después lee la nota. El comentario en el PR es esa nota: el resultado del agente queda donde mira el equipo, no perdido en un log.

El paso final de la review action es comentar en el propio PR — Pocock dice que el agente «responde “looks good”» ahí mismo. ¿Por qué comentar en el PR y no en un correo o un chat? Porque el PR es donde se toma la decisión: el comentario queda junto al diff, al lado de la discusión, y GitHub ya avisa a quienes lo siguen. Es el resultado natural del AFK en la nube: el agente trabaja solo y deja el dictamen visible, cómo hace el bot github-actions que publica un "Triage" con TL;DR y dificultad (viste esto en el módulo 4-4, Loops × Filas).

Aquí está el segundo valor del review (módulo 4-6): el comentario no sirve solo para gate ("esto es peligroso, detente"): te da observabilidad. Lees lo que encontró el agente y ves tu propio sistema de conexiones. Error común: dejar que el agente apruebe o rechace en silencio. Si el dictamen no aparece en el PR, pierdes la oportunidad de mejorar el harness con el tiempo — y caes en la trampa de «¿quién revisa a la IA que dice que todo está bien?». El comentario visible es lo que te mantiene al mando.

agente de revisión terminó de revisar 🤖 github-actions · comentó en el PR #128 ✅ Se ve bien — pasó la verificación de tipos ⚠️ 1 punto: validar el input en el endpoint /login visible para el equipo · junto al diff · te da observabilidad

🔬 Ejemplo resuelto: un PR pasa por toda la cadena

El dev abre el PR #128 («agrega endpoint de inicio de sesión»). La acción de revisión se activa:

  1. checkout — la Action descarga la branch del PR en la nube (tu máquina ni siquiera tiene que estar encendida).
  2. type check — tsc se ejecuta en 12s. Pasa. (Si fallara, ni siquiera se llamaría al agente.)
  3. agente de revisión — el agente lee el diff con el prompt local de revisión. Encuentra una entrada sin validar.
  4. comenta en el PR — publica: «✅ type check ok; ⚠️ validar input en /login». El dev lo ve de inmediato.

Resultado: revisión en ~2 min, sin que abras la laptop, y el informe queda registrado en el lugar correcto.

En 1 frase: el dictamen del agente va al PR —donde lo ve el equipo— para servir de gate y darte observabilidad de tu sistema.

4

🗓️ Cron diario rotativo

🧠 Imagínalo así: "si alguien vive robándote la bicicleta, quizá deberías comprar un candado." En vez de corregir un problema de seguridad solo cuando estalla, pones un guardia que hace una ronda todos los días, y cada día inspecciona una calle diferente del barrio. En un mes, se habrá revisado todo el barrio, sin que nadie se canse.

La segunda automatización es la joya del módulo. Pocock cuenta que el modelo Fable encontró bugs profundos y fallas de seguridad que otros no vieron, pero recalca: no es magia del modelo. "Descubrirías estos bugs con modelos más baratos si buscaras en los lugares correctos y usaras el prompt/harness adecuado." La receta: un cron diario de revisión de seguridad que "cada día revisa una parte nueva del repo con un modelo relativamente sencillo". El cron es el programador; lo «rotativo» es el truco: no revisas todo el repo cada día (es caro y lento), revisas una sección por día, recorriendo el repositorio.

¿Por qué funciona tan bien la rotación? Porque distribuye el costo en el tiempo y, tarde o temprano, lo cubre todo. ¿Un repo con 30 carpetas? Una carpeta al día → cobertura total en 30 días, con un modelo barato. Y el beneficio real no es solo encontrar el bug: es la lección. «¿Qué aprendiste? Que hay problemas de seguridad en tu código; deberías tener algo que se ejecute y revise si hay más en el futuro». Ese es el corazón de los sistemas que se mejoran a sí mismos (módulo 4-5): no revisas solo el código, revisas el sistema que produce el código. Error común: ejecutar la revisión de seguridad en todo el repo de una vez — sale caro, tarda y al final terminas desactivándola. La rotación es lo que hace que el hábito sea sostenible.

La línea de crontab es el corazón técnico de esto y la segunda pieza del módulo que puedes copiar. Son cinco campos: minuto, hora, día del mes, mes y día de la semana; y el * significa "todo". La línea de abajo es la real que pegas en el schedule: de una GitHub Action para ejecutarla todos los días a las 9h UTC. Copia:

.github/workflows/security.yml — crontab de la revisión de seguridad diaria
# campos do cron:  minuto  hora  dia-do-mês  mês  dia-da-semana
# "0 9 * * *"  =  todo dia às 09:00 UTC
on:
  schedule:
    - cron: "0 9 * * *"   # security review diário, fatia rotativa do repo
cron 0 9 * * * día 1 · /auth día 2 · /api día 3 · /db día N · … Una porción por día, modelo barato → todo el repo cubierto a lo largo del mes.
Ilustración: un guardia de seguridad robótico que patrulla a diario diferentes sectores de un repositorio de código

En 1 frase: un cron diario revisa una parte rotativa del repo con un modelo barato — compras el candado antes de que vuelvan a robarte la bici.

Para profundizar (opcional): ¿cómo decidir QUÉ parte revisar hoy?

Dos formas sencillas. (1) Por calendario: usa el día del mes para indexar una lista de carpetas (día 1 → carpeta 0, día 2 → carpeta 1…). (2) Por prioridad: mantén una fila de las carpetas «más activas» (con commits más recientes o que afectan auth/pago) y recórrela primero. Lo importante es que la porción sea pequeña y diferente cada día — así el modelo barato puede encargarse y el costo se mantiene estable. Pocock también sugiere encontrar la causa raíz: ¿por qué este bug pasó tanto tiempo sin que lo notaras? La respuesta se convierte en la próxima mejora del sistema.

5

🧱 Estructurar los datos de explore

🧠 Imagínalo así: el detective vuelve de la investigación. Si te cuenta la historia en un párrafo enredado, tienes que leerlo todo para decidir. Pero si te entrega un formulario completado — "¿Es grave? Sí. ¿Puede corregirlo por su cuenta? Sí. ¿Confianza? 90%" — decides en 2 segundos y hasta un robot puede leerlo. El secreto del AFK es hacer que el agente entregue el formulario, no la historia.

Pocock describe el flujo completo de explora: «error de telemetría (Sentry) → crea un issue → etiqueta explore → el agente devuelve dato estructurado (¿se puede corregir ya o hace falta una persona?) → implementa → revisa → etiqueta auto-merge o le avisa a una persona." El punto clave es el structured output: en lugar de que el agente devuelva un texto larguísimo, devuelve campos fijos: gravedad, si se puede corregir automáticamente y confianza. ¿Por qué? Porque un campo «se puede corregir automáticamente: sí/no» es algo que otro programa puede leerlo y usarlo para decidir el siguiente paso por su cuenta. Texto suelto, no.

Es lo que conecta toda la cola (módulo 4-4): la issue recibe labels (agent:explore → agent:in-progress), el agente hace la clasificación AFK y devuelve el dato estructurado, y ese dato decide el enrutamiento: corregirlo de inmediato o enviar el punto de control human-in-the-loop más adelante. «Push human-in-the-loop checkpoints further toward the final output.» Error común: dejar que el agente responda en prosa e intentar adivinar con una regex si aprobó. Frágil. Pide JSON con campos definidos — así la automatización encadena acciones sin ambigüedad.

structured output de explore (el agente devuelve esto)
{
  "issue": 795,
  "severity": "high",
  "auto_fixable": true,
  "confidence": 0.9,
  "root_cause": "input não validado em /login",
  "suggested_label": "agent:implement",
  "needs_human": false
}
agente explore investiga el issue dato estructurado severity: highauto_fixable: trueneeds_human: false auto_fixable → implementa needs_human → avísale a la persona

En 1 frase: haz que el explore devuelva campos (JSON), no prosa — así la automatización lee, decide y encadena por sí sola.

6

⚠️ Auto-merge con cautela

🧠 Imagínalo así: un portón automático que se abre solo es una maravilla… hasta el día en que se abre para el auto equivocado. La solución no es cerrar el portón para siempre, sino establecer condiciones claras (solo se abre para una placa registrada, durante el día y con el sensor funcionando). Auto-merge es ese portón: excelente con controles, peligroso sin ellos.

Al final del flujo, el agente «tag auto-merge o le avisa a una persona". El auto-merge es el máximo nivel de AFK: el PR entra en el código principal sin que nadie haga clic. Pero también es el lugar más peligroso; por eso el nombre del tema incluye «con cautela». Pocock insiste en el objetivo correcto: «push human-in-the-loop checkpoints further toward the final output" — empuja el punto de aprobación hacia adelante, eliminando puntos de control donde se pueda, con cuidado. No se trata de sacar a las personas de todo, sino de apartarlas de donde no aportan valor.

¿Dónde se puede hacer auto-merge con tranquilidad? Cuando «el PR solo refactoriza internamente, no cambia el comportamiento; la IA dice “no hace falta revisarlo”». Pero entonces llega la pregunta de oro de Pocock: "¿quién revisa a la IA que dice que todo está bien?" (¿quién revisa a la IA que dice que todo está bien?). La respuesta: necesitas muestrear algunos PR que el agente aprobó por su cuenta, para calibrar la confianza con el tiempo. «We're reviewing not just the code, but the SYSTEM that produces the code.» Error común: activar auto-merge en todo el día 1. Empieza con poco (solo los campos auto_fixable: true + confidence ≥ 0.9 + comprobación de tipos en verde), audita durante unos días y solo entonces amplía. La cautela es lo que mantiene confiable el sistema.

type check en verde confidence ≥ 0.9 solo refactorización interna GATE ¿todas verdaderas? sí → fusión automática no → avisa al humano

Recuperación rápida: ¿cuál es la postura correcta de Pocock sobre el auto-merge?

En 1 frase: auto-merge es una puerta automática: funciona muy bien con gates claros, y aún puedes tomar una muestra para preguntarte «¿quién revisa a la IA que dice que todo está bien?».

🧾 Resumen del módulo

✓
La Action es una cinta transportadora en la nube — disparador (on:) → job → steps. Tu máquina puede estar apagada.
✓
checkout → verificación de tipos → agente de revisión → comenta — primero los baratos y el agente caro al final; deja un parecer en el PR.
✓
Cron diario rotativo — una porción al día, un modelo barato; "compra el candado". Revisa el sistema, no solo el código.
✓
Salida estructurada + auto-merge con cautela — los campos (JSON) deciden el enrutamiento; define criterios claros y revisa una muestra de los PR aprobados.

Próximo módulo:

5.6 — Review fluido + dónde encontrar: video walkthrough con TTS, optimizar el review humano y dónde conseguir skills listas (mattpocock/skills, aihero.dev/skills).