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

⚙️ GitHub Actions + agentes

Hasta ahora el agente trabajó en tu máquina. En este módulo sale de tu computadora y empieza a ejecutarse en la nube, activado por eventos de tu repositorio. Entenderás qué es una GitHub Action, cómo una acción de revisión comenta en un PR por sí sola, como una simple label conecta al agente, y por qué todo esto "no bloquea tu notebook". Cada palabra nueva se explica en el momento.

6
Temas
~45
Minutos
T4.1-4.2
Prerequisito
Práctica
Tipo
Progreso: 0% 0 de 6

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

Este módulo entra en el mundo de GitHub. Si «CI», «Action» y «PR» son novedades para ti, fija primero estos términos; el resto del módulo solo los usa:

CI (Integración continua) — del inglés Continuous Integration. Es un robot en la nube que, cada vez que cambia el código, ejecuta verificaciones automáticas (pruebas, build, lint). Piensa en él como un «portero» que revisa cada entrega antes de dejarla pasar.
GitHub Action — la herramienta de CI del propio GitHub. Escribes un archivo .yml dentro de .github/workflows/ diciendo "cuando ocurra X, ejecuta estos pasos". Es gratis y vive junto a tu repositorio.
PR (Pull Request) — una "propuesta de cambio". En lugar de modificar directamente el código principal, abres un PR: un conjunto de cambios que se puede revisar, comentar y aprobar antes de incorporarlo (el merge).
Workflow / job / step — un flujo de trabajo es todo el archivo; tiene uno o más jobs (tareas que se ejecutan en una máquina virtual); cada job tiene steps (pasos en orden: descargar el código, ejecutar un comando…).
Checkout — casi siempre, el primer paso: descargar (clonar) el código del repositorio dentro de la máquina virtual para que los siguientes pasos tengan los archivos necesarios.
Type check — «verificación de tipos»: un comando que comprueba si el código coincide con los tipos declarados (ej.: tsc en TypeScript). Detecta errores tontos antes de ejecutar.
Label — una etiqueta de color que pegas en un issue o PR (p. ej., bug, agent:explore). Además de organizar, puede lanzar automatizaciones.
Agente de revisión — el agente ejecutándose como revisor: lee el diff del PR y escribe un comentario («looks good» o «cuidado con X»), como lo revisaría un colega.
1

☁️ Agentes en CI

🧠 Imagínalo así: tienes un excelente empleado, pero solo trabaja cuando está sentado en la tu mesa, usando el tu computadora. Ahora imagina que le das una sala propia en la oficina de la empresa (la nube), que se activa sola cada vez que llega un pedido. Trabaja allí y tu escritorio queda libre. Eso es lo que CI hace con el agente.

En los módulos anteriores ejecutaste el agente AFK (lejos del teclado) en tu máquina, dentro de una sandbox. El siguiente nivel es sacar al agente de tu computadora y ponerlo en el CI (integración continua). CI es simplemente un robot que vive junto a tu repositorio y ejecuta pasos automáticamente cuando sucede algo: alguien abre un PR, hace un push, o pega una etiqueta. En GitHub, este robot se llama GitHub Action.

La clave de Matt Pocock es unir ambas cosas: "Run agents using Sand Castle on GitHub Actions — unreasonably effective, parallelize as much as you want, not worried about local resources." Es decir: ejecutar agentes en la nube de GitHub es increíblemente eficaz, porque puedes paralelizar tantas como quieras sin preocuparte por los recursos de tu máquina. El CI se convierte en el nuevo hogar del agente: se activa solo cuando un disparador lanza, realiza la tarea en una máquina virtual descartable y desaparece. El porqué de que esto sea tan potente: no dependes de que tu notebook esté encendida, y la Action ya tiene acceso al código, al historial y a las credenciales del proyecto.

tu máquina planificar · revisar (no se queda bloqueada) evento PR · push · label CI — GitHub Actions (nube) máquina virtual descartable ejecuta el agente · paraleliza · desaparece El trabajo pasa de tu escritorio a una sala que se conecta sola.

El agente se activa en la nube solo cuando se dispara un evento, y tu máquina sigue libre.

Ilustración conceptual: un agente robótico que sale de una laptop y se dirige a un servidor en la nube con engranajes de GitHub

⚠️ Error común de principiante

Creer que «CI» es una herramienta paga y complicada que solo usan las grandes empresas. No: GitHub Actions es gratis en cualquier repositorio, y un workflow útil cabe en ~20 líneas de YAML. El costo de entrada es casi cero; lo difícil es solo el primer archivo.

En 1 frase: ejecutar el agente en CI es darle una sala en la nube que se activa sola — tu máquina queda libre y puedes paralelizar a voluntad.

Profundiza (opcional): ¿por qué «Sand Castle» + Actions y no solo Actions?

La GitHub Action es el disparador y la máquina; el Sand Castle es lo que ejecuta al agente con aislamiento dentro de ella. Sin sandbox, un agente suelto podría, en palabras de Matt, «delete your home directory or exfiltrate env vars». La Action proporciona la infraestructura en la nube; el sandbox proporciona la contención. Los dos juntos = AFK en la nube con seguridad.

2

🔍 La acción de review

🧠 Imagínalo así: cada vez que alguien entrega un informe, un revisor con experiencia lo lee enseguida y pega una nota adhesiva: "está excelente" o "mira este párrafo". Nunca duerme, nunca olvida y hace esto gratis con cada informe. La acción de revisión es ese revisor, pero para código.

El ejemplo concreto que da Matt es una agent review action: "una acción de revisión del agente que se ejecuta en un PR, hace un checkout, verifica los tipos, ejecuta el agente de revisión (un prompt local) y responde 'se ve bien'." Al dividir esto en pasos, la Action hace cuatro cosas, en este orden: (1) se activa cuando un PR está abierto; (2) hace el checkout del código; (3) ejecuta el type check para detectar errores obvios; y (4) llama al agente de revisión, que lee el diff y comenta.

Fíjate en algo importante: el review agent es "un prompt local" — es decir, el cerebro del revisor es solo un prompt guardado en el propio repositorio (una instrucción como «revisa este diff en busca de errores, seguridad y claridad; responde en portugués»). Esto es puro harness: la Action es el chasis que lleva ese prompt a la nube y lo ejecuta en cada PR. El porqué de que esto valga oro: creas una barrera de calidad que se ejecuta en todo PR, sin depender de que alguien se acuerde de revisarlo. Y el error común es pedirle a este agente que aprueba y haz merge por tu cuenta — al principio solo comenta; quien decide sigues siendo tú (volveremos a esto en el tema 6 y en el módulo 4.6).

on: pull_request 1 · checkoutdescarga el código 2 · comprobación de tiposdetecta errores tontos 3 · agente de reviewlee el diff (prompt local) 4 · comentar en el PR"se ve bien" / señala un riesgo Un revisor que nunca duerme, en cada PR. Su cerebro es un prompt en tu repo.
Ilustración: un agente revisor que lee un pull request y escribe un comentario de aprobación

Recuperación rápida: en la review action de Matt, ¿qué es el «review agent»?

En 1 frase: la review action es "checkout → type check → agente lee el diff → comenta en el PR" — un revisor que nunca duerme.

3

🏷️ Etiquetas que activan

🧠 Imagínalo así: en la cocina de un restaurante, el mesero no grita la orden: pega un papelito en la rueda de pedidos. El cocinero ve «🟥 postre» y empieza. La label es ese papelito: pegas una etiqueta y el agente adecuado empieza a trabajar.

Aquí está el truco: no necesitas «ejecutar un comando» para activar al agente. Basta con agregar una etiqueta. Matt lo muestra al revisar las issues de Sand Castle: después de la clasificación, "adds a label agent:implement and implements on GitHub Actions". La label es el disparador: la Action escucha el evento "se agregó una label" y activa al agente correspondiente. En su flujo real aparecen tres labels (issue #795): agent:explore (investigará y volverá con datos), agent:in-progress (está trabajando) y agent:implement (ordena implementarlo de verdad).

¿Por qué usar labels en vez de comandos? Porque, en palabras de Matt, "todo el desarrollo es solo una cola de tareas: los PM las agregan a la cola y tú las completas; varios nodos van sacando tareas de la cola." Todo desarrollo es una cola de tareas. La label indica cómo entra la tarea en la cola y dice qué tipo de trabajo necesita. En su ejemplo, el bot github-actions todavía publica un comentario de "Triage" con un TL;DR y la dificultad estimada, todo activado por el cambio de etiqueta. El error común aquí es intentar un único loop gigante que lo haga todo; eso «no coincide con la forma en que trabajan los equipos». Las etiquetas separan las fases (explorar → implementar) y te mantienen al mando en cada paso. Esto prepara el módulo 4.4 («Loops × Filas»).

Issue #795 bug de telemetría tú pegas la label → agent:explore agent:in-progress agent:implement Action escucha "label" → dispara el agente adecuado para esa fase

En 1 frase: agregar una etiqueta como agent:explore o agent:implement es el disparador: la etiqueta activa al agente correcto.

4

📤 El PR como resultado

🧠 Imagínalo así: un empleado no publica nada directamente en el sitio web de la empresa. Te entrega un borrador en una carpeta para que lo revises y apruebes. El PR es esa carpeta: el agente nunca toca el código principal por su cuenta; te entrega una propuesta.

Cuando el agente termina una tarea en la nube, el su salida es un PR — no un commit directo en la branch principal. Esto es fundamental por dos motivos. Primero, seguridad: el código nuevo queda en una branch separada, así que nada entra en el producto sin pasar por una puerta de control. En segundo lugar, visibilidad: el PR reúne en un solo lugar el diff, los comentarios de la review action, el resultado del type check y la discusión; se convierte en el «paquete» que revisas.

Aquí es donde todo encaja: el agente produce el PR (tema 3 → label → implementa), la acción de review comenta en ese mismo PR (tema 2), y tú decide el merge. Matt describe el ciclo completo de una automatización: "error de telemetría (Sentry) → crea issue → label explore → el agente devuelve datos estructurados (¿se puede corregir ya o hace falta una persona?) → implementa → revisa → tag auto-merge o avisa a la persona." Fíjate en el final: o lo marca para auto-merge, o él te llama. La idea clave del módulo 4.6 ya aparece: "push human-in-the-loop checkpoints further toward the final output" — empujar cada vez más hacia el final el punto en el que tú intervienes. El error común es dejar que el agente haga commit directamente en main «para ir más rápido»; pierdes de una vez la instancia de revisión y la observabilidad.

label activa agent:implement PR — salida del agente un paquete revisable (branch aislada) diff type check comentario de la acción de review tú decides auto-merge o revisar merge ajustes Nada entra en main por sí solo: la salida siempre es una propuesta que pasa por tu puerta de control.

🔬 Ejemplo resuelto: del bug de Sentry al PR listo

Un error aparece en el Sentry (monitoreo). Mira el recorrido de punta a punta, todo en la nube:

  1. Issue creada automáticamente a partir del error de Sentry.
  2. Pegas agent:explore. El agente investiga y vuelve con dato estructurado: «causa probable X; ¿puedes corregirlo por tu cuenta? sí/no».
  3. Es corregible → pegas agent:implement. El agente se ejecuta en GitHub Actions y abre un PR con la reparación.
  4. A acción de revisión comenta en el PR: pasó la comprobación de tipos, el diff parece seguro, "looks good".
  5. Desenlace: o marca auto-merge (cambio trivial), o te avisa (necesita supervisión humana).

Solo apareciste para pegar dos labels y dar el visto bueno final. El resto se ejecutó en la nube y todo terminó en un PR revisable.

Ilustración: un pull request como un paquete organizado que contiene diff, comentarios de review y verificaciones, a la espera de aprobación

En 1 frase: la salida del agente es un PR — una propuesta que se puede revisar, nunca un commit directo en main.

5

🔋 Sin bloquear la máquina local

🧠 Imagínalo así: tienes un solo horno en casa y quieres hornear diez pasteles. En casa, haces uno a la vez y la cocina se pone muy caliente. Si alquilas diez hornos en una cocina industrial, horneas los diez al mismo tiempo y tu casa se mantiene fresca. La nube es la cocina industrial.

Este es el gran motivo práctico para mover agentes a CI. La frase de Matt lo dice todo: "paraleliza todo lo que quieras, no me preocupan los recursos locales." Cada Action se ejecuta en una máquina virtual propia y desechable, proporcionada por GitHub. Puedes tener cinco PR abiertos al mismo tiempo, cada uno con su agente trabajando en paralelo, y tu laptop ni siquiera se calienta; incluso puede estar apagada. Esto conecta con el módulo 4.2 ("Paralelizar & sandboxes"): allí los agentes paralelos competían por el tu CPU; aquí se ejecutan en máquinas separadas en la nube, así que la paralelización se vuelve prácticamente ilimitada. Hay un beneficio adicional de ahorro que conecta con el módulo 1.5: con un harness bien configurado (guard rails, verificación de tipos, prompts claros), puedes usar un modelo más barato para hacer el mismo trabajo, con menos tokens "dándose contra la pared". El error común es seguir ejecutándolo todo localmente «porque es más sencillo» y bloquear toda la máquina cada vez que inicias dos o tres agentes.

LOCAL — una CPU disputada 1 CPU A1A2A3 NUBE — una VM por agente VM · A1 VM · A2 VM · A3 paralelas y descartables · tu notebook libre

En 1 frase: en la nube cada agente obtiene su propia máquina virtual: paralelización casi ilimitada, tu máquina siempre libre.

6

🛠️ Armar la tuya

🧠 Imagínalo así: crear tu primera Action es como instalar un interruptor en la pared: trabajoso una vez, mágico para siempre. Después solo tienes que «apretar el botón» (abrir un PR) y la luz se enciende sola.

Es hora de juntar todo en un archivo real. Crea un archivo en .github/workflows/agent-review.yml en tu repositorio. Hace exactamente lo que describe Matt: dispara on: pull_request, hace el checkout, ejecuta el type check, llama al agente de revisión (con el prompt local) y comenta en el PR. Lee cada línea: está todo comentado:

.github/workflows/agent-review.yml
# Roda um agente de review em todo Pull Request.
name: Agent Review

# GATILHO: toda vez que um PR e aberto ou recebe novos commits.
on:
  pull_request:
    types: [opened, synchronize, reopened]

# Permissoes minimas: ler o codigo, escrever comentarios no PR.
permissions:
  contents: read
  pull-requests: write

jobs:
  review:
    runs-on: ubuntu-latest          # maquina virtual descartavel na nuvem
    steps:
      # 1) CHECKOUT - baixa o codigo do PR pra dentro da VM
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0            # historico completo, pra gerar o diff

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install deps
        run: npm ci

      # 2) TYPE CHECK - pega erros de tipo antes de revisar
      - name: Type check
        run: npx tsc --noEmit

      # 3) REVIEW AGENT - roda o agente com um PROMPT LOCAL
      - name: Run review agent
        id: review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          # gera o diff do PR contra a branch base
          git diff origin/${{ github.base_ref }}...HEAD > /tmp/pr.diff
          # o "cerebro" do revisor e so um prompt versionado no repo
          npx @anthropic-ai/claude-code -p \
            "$(cat .github/prompts/review.md)

            Diff a revisar:
            $(cat /tmp/pr.diff)

            Responda em portugues. Se estiver ok, diga 'looks good'.
            Senao, aponte bugs, riscos de seguranca e melhorias." \
            > /tmp/review.md

      # 4) COMENTA NO PR - publica o parecer do agente
      - name: Comment on PR
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            const body = fs.readFileSync('/tmp/review.md', 'utf8');
            await github.rest.issues.createComment({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              body: "Agent Review\n\n" + body
            });

Eso es todo. Observa que lo «inteligente» del revisor está en .github/prompts/review.md — un prompt local, como dice Matt. Cambiar el comportamiento del revisor es editar un texto, no tocar las tuberías. Este mismo esqueleto se convierte en la base de todo el curso: cambia el disparador (de pull_request para schedule) y se convierte en el cron de revisión de seguridad del módulo 4.5; cambia la etiqueta que lo activa y se convierte en el agente de implementación del tema 3. Empieza con algo simple: solo la revisión comenta. No le des permiso para hacer auto-merge de inmediato; recuerda el módulo 4.6, "¿quién revisa a la IA que dice que todo está bien?". Primero observa cómo trabaja el agente (la observabilidad que te da la revisión); después, a medida que confíes en él, acerca el punto de control humano al final.

En el YAML anterior, ¿dónde está el «cerebro» (el comportamiento) del agente de revisión?

Profundiza (opcional): qué es ese secrets.ANTHROPIC_API_KEY?

Un secret es un valor sensible: aquí, la clave de API que autoriza al agente a llamar al modelo. La registras en Settings → Secrets and variables → Actions del repositorio, y la Action lo inyecta como variable de entorno en runtime. Nunca pegues claves directamente en el YAML: el archivo queda en el historial del repo, y ese es exactamente el tipo de filtración que la revisión busca detectar.

En 1 frase: un YAML de ~40 líneas + un prompt local ya te da un revisor en la nube; cambia el disparador y se convierte en cualquier otra automatización.

🧾 Resumen del módulo

✓
Agente en CI = AFK en la nube — el agente sale de tu máquina y se ejecuta en GitHub Actions, activado por eventos.
✓
Acción de revisión — en un PR → checkout → verificación de tipos → agente revisor (prompt local) → comenta en el PR.
✓
Se activan las labels — agent:explore / agent:implement activan al agente adecuado; todo es una cola.
✓
PR es la salida — propuesta revisable, nunca un commit directo en main; tú decides el merge.
✓
Sin bloquear la máquina — una VM por agente, paralelización casi ilimitada, notebook libre.

Próximo módulo:

4.4 — Loops × Filas: por qué Matt piensa en «fila, no bucle», el Ralph loop de Huntley y la analogía del rey medieval.