THE RED GUILD / 01
una introducción random
a algunas cosas interesantes
De un commit, a un trabajo autónomo
matta
security knowmad
@mattaereal
GITHUB × AI
THE RED GUILD / 02
Seis ejercicios
01
Publicar la landing
02
Ejecutar un check propio
03
Conversar con Hermes
04
Exponer una página local
05
Recibir un evento de GitHub
06
Pedir una review del PR
Automatizar checks, delegar una revisión y evaluar el resultado con criterio humano.
GITHUB × AI
THE RED GUILD / 03
6 mandamientos
01
No usar AI
(a menos que lo autorice)
02
Pensar, probar, fallar
03
Pingponear con otras
personas, amigos
04
Buscar en internet
05
Consultarle a un agente en
chat
06
Delegárselo a un agente
EJERCICIO 1
THE RED GUILD / 04
01
Una landing publicada
Cloná el material. Mové la app a una carpeta lab
nueva.
EJERCICIO 1
THE RED GUILD / 05
La landing del HackerSpace
Nodo Serrano · Tandil
La landing viene lista.
Reconocé el título y las secciones.
El ejercicio sigue un cambio visible.
Foto del espacio publicada en NodoSerrano.org.
EJERCICIO 1
THE RED GUILD / 06
Clonar el material en tu equipo
Host · acceso al material resuelto antes del taller
git clone https://github.com/theredguild/github-ai-automation-lab.git
cd github-ai-automation-lab
Este checkout contiene guía y slides. No será el repo de tu app.
EJERCICIO 1
THE RED GUILD / 07
Mover la app a una carpeta lab
Host · desde github-ai-automation-lab/
mv hackerspace-site ../lab
El destino lab NO debe existir. Si hay un error, detenete.
TERMINAL Y WEB
THE RED GUILD / 08
Entrar en TU proyecto
Host · después del movimiento correcto
cd ../lab
pwd
Ejemplo de salida
/home/TU_USUARIO/proyectos/lab
Debe terminar en /lab. Si falla cd, no ejecutes git init.
EJERCICIO 1
THE RED GUILD / 09
Todo el sitio viaja en esta carpeta
Host · carpeta lab, fuera del material
lab/
app/
package.json
pnpm-lock.yaml
.gitignore
.dockerignore
Dockerfile
.devcontainer/devcontainer.json
Vista parcial. public/ y el resto del sitio también se movieron; .git sigue en el material.
EJERCICIO 1
THE RED GUILD / 10
Crear TU repositorio en GitHub
01
Abrí github.com/new en tu
cuenta personal.
02
Elegí un nombre y Private.
03
Dejalo vacío: sin README,
licencia ni .gitignore.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 11
Crear un token fino para la práctica
01
Abrí Fine-grained tokens →
Generate new token.
02
Nombre reconocible y
vencimiento corto: 7 días.
03
Resource owner: tu cuenta
personal.
Referencia oficial de GitHub · 2022 · interfaz histórica
EJERCICIO 1
THE RED GUILD / 12
Seleccionar sólo TU repo privado
01
Repository access: Only select
repositories.
02
Seleccioná sólo el repo recién
creado.
03
No elijas All repositories.
Referencia oficial de GitHub · 2022 · cuentas de ejemplo
EJERCICIO 1
THE RED GUILD / 13
Permisos para Git y PR del ejercicio 1
Repository permission | Acceso |
Contents | Read and write |
Pull requests | Read and write |
Metadata | Read-only, automático |
TERMINAL Y WEB
THE RED GUILD / 14
Login con el token de TU repo
Host · después de crear repo y token
gh auth login
gh auth status
Elegí Paste an authentication token. Pegalo en privado, con entrada oculta.
EJERCICIO 1
THE RED GUILD / 15
Opciones del login interactivo
Ejemplo de prompts · GitHub CLI 2.103.3
GitHub.com
Paste an authentication token
HTTPS
Authenticate Git: Yes
Token: entrada oculta
El token sólo se pega cuando gh lo pide. No es un comando ni una captura real.
EJERCICIO 1
THE RED GUILD / 16
Iniciar el historial de lab
Host · sólo dentro de lab, con Dockerfile y package.json
git init -b main
git config user.name
git config user.email
Nombre y email del commit no son el login de GitHub.
EJERCICIO 1
THE RED GUILD / 17
Publicar esta carpeta en TU repo
Host · lab, antes de instalar dependencias
git add .
git commit -m "Inicio del sitio"
git remote add origin https://github.com/TU_USUARIO/REPO.git
git push -u origin main
Revisá git status antes del commit. El repo remoto debe estar vacío.
EJERCICIO 1
THE RED GUILD / 18
Abrir el proyecto en el editor
lab/
app/
public/
package.json
pnpm-lock.yaml
Dockerfile
.gitignore
.devcontainer/
package.json · fragmento
{
"scripts": {
"dev": "next dev",
"build": "next build"
}
}
Editor local · ejemplo ilustrativo. Los archivos ya vienen en la app.
EJERCICIO 1
THE RED GUILD / 19
.gitignore ya viene incluido
lab/
app/
public/
package.json
pnpm-lock.yaml
Dockerfile
.gitignore
.devcontainer/
.gitignore
**/node_modules/
**/.next/
**/.vercel/
.env
.env.*
!.env.example
*.pem
*.key
Fragmento: no reemplaces el archivo incluido; ya protege también caches y metadatos.
EJERCICIO 1
THE RED GUILD / 20
Verificar herramientas del host
Host · raíz del clon de TU repo
node --version
pnpm --version
Ejemplo de salida
v22.x.x
10.20.0
Node 22 y pnpm 10.20.0 en tu equipo.
EJERCICIO 1
THE RED GUILD / 21
Instalar las dependencias
Host · raíz del clon de TU repo
pnpm install --frozen-lockfile
Ejemplo de salida
Lockfile is up to date
Done in … using pnpm v10.20.0
La landing y el lockfile ya vienen incluidos en el starter.
EJERCICIO 1
THE RED GUILD / 22
Build de producción
Host · lab, después de instalar
pnpm build
Ejemplo de salida
Compiled successfully
Generating static pages …
El build va antes de pnpm dev. Esperá que termine sin errores.
EJERCICIO 1
THE RED GUILD / 23
Ver archivos ignorados después del build
Host · lab, después de pnpm install y pnpm build
git status --ignored
git ls-files node_modules .next
Si ls-files no muestra nada, no hay archivos seguidos que reparar.
EJERCICIO 1
THE RED GUILD / 24
Sólo si ya se habían versionado artefactos
Reparación opcional · no ejecutar en el starter limpio
git rm -r --cached CARPETA
CARPETA: node_modules o .next, sólo si ls-files la mostró. --cached conserva el disco.
EJERCICIO 1
THE RED GUILD / 25
Archivos que vamos a usar
Archivo | Qué vas a tocar |
app/page.tsx | El título visible de la landing |
package.json | Comandos del proyecto |
pnpm-lock.yaml | Dependencias fijadas |
Dockerfile | Entorno del runner |
EJERCICIO 1
THE RED GUILD / 26
Servidor de desarrollo
Host · lab, después del build
pnpm dev
Ejemplo de salida
Local: http://localhost:3000
Ready in …
Abrí http://localhost:3000 en tu equipo. Dejá esta terminal abierta.
EJERCICIO 1
THE RED GUILD / 27
Primera comprobación de la página
EN TU
PROYECTO
01
Comprobá el título HackerSpace Nodo Serrano.
02
Usá Conocer el espacio para navegar por la
página.
03
Revisá los enlaces de contacto.
04
Localizá el título en app/page.tsx.
EJERCICIO 1
THE RED GUILD / 28
Importar TU repo en Vercel
01
Add New → Project → Import Git
Repository.
02
Elegí tu cuenta y TU repo
personal.
03
Autorizá sólo ese repo a la
GitHub App de Vercel.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 29
La integración tiene sus propios permisos
01
GitHub → Installed GitHub Apps
→ Vercel.
02
Configure → Only select
repositories.
03
Elegí tu repo y guardá; no
pegues el PAT.
Ejemplo genérico de GitHub App · documentación oficial
EJERCICIO 1
THE RED GUILD / 30
Reconocer la autodetección del framework
01
Framework: Next.js.
02
Raíz: . en TU repo; no hackerspace-site/.
03
Conservá detección por package.json y lockfile.
Recorte de documentación oficial de Vercel
EJERCICIO 1
THE RED GUILD / 31
Configuración del deployment
Campo | Ejemplo del workshop |
Framework Preset | Next.js |
Root Directory | . (raíz de TU repo) |
Install Command | Automático según pnpm-lock.yaml |
Build Command | pnpm build |
Environment Variables | Ninguna necesaria para la landing |
EJERCICIO 1
THE RED GUILD / 32
Leer el build antes de abrir la URL
01
Después de Deploy, abrí Build Logs.
02
Si falla, leé el primer error.
03
Ready no basta: también hay que abrir la landing.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 33
Deployment, Logs y Resources
01
Deployment: estado y
URL de la versión.
02
Logs: salida de la
ejecución.
03
Resources: archivos y
funciones publicados.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 34
Comprobar lo publicado en Vercel
01
Verificá Production, Ready y main.
02
Abrí la URL y reconocé la landing.
03
Abrí el commit en GitHub y compará el SHA.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 35
Comprobar qué rama es Production
01
Settings → Environments →
Production.
02
Branch Tracking: main.
03
Preview: ramas no asignadas
a Production.
Captura pública · Vercel Community · septiembre de 2025
EJERCICIO 1
THE RED GUILD / 36
Guardar, confirmar y enviar
Guardar
archivo en tu equipo
Commit
versión local
Push
repositorio de
GitHub
El repositorio recibe el cambio después del push.
Guardar cambia el archivo. Commit crea una versión. Push la envía a GitHub.
EJERCICIO 1
THE RED GUILD / 37
Branch development
Host · raíz del clon de TU repo
git switch main
git pull --ff-only
git switch -c development
Ejemplo de salida
Switched to a new branch 'development'
Si development ya existe, usá git switch development
EJERCICIO 1
THE RED GUILD / 38
Cambiar de rama: switch y checkout
switch: cambia ramas | checkout: también restaura archivos |
Crear: git switch -c development | Crear: git checkout -b development |
Cambiar: git switch main | Cambiar: git checkout main |
EJERCICIO 1
THE RED GUILD / 39
Cambio visible en development
app/page.tsx
ANTES
<h1 id="titulo">HackerSpace Nodo Serrano</h1>
DESPUÉS
<h1 id="titulo">Aprender y construir en comunidad</h1>
Cambiá sólo el texto y guardá el archivo
EJERCICIO 1
THE RED GUILD / 40
Diff antes del commit
Terminal · development · después de editar el título
git status
git diff
Ejemplo de salida
On branch development
modified: app/page.tsx
Revisá el cambio antes de confirmarlo.
EJERCICIO 1
THE RED GUILD / 41
Commit y push de development
Host · raíz del clon de TU repo
git diff
git add app/page.tsx
git commit -m "Actualiza la portada del HackerSpace"
git push -u origin development
Ejemplo de salida
development -> development
El push entrega el nuevo commit a la integración de Vercel
EJERCICIO 1
THE RED GUILD / 42
El commit que acabás de enviar
Host · raíz del clon de TU repo
git log -1 --oneline
git rev-parse --short HEAD
Ejemplo de salida
49a1de0 Actualiza la portada del HackerSpace
49a1de0
El SHA identifica esa versión del cambio.
EJERCICIO 1
THE RED GUILD / 43
Production y Preview
GitHub · main
build
Production
GitHub · development
build
Preview
main conserva Production. development recibe su Preview.
EJERCICIO 1
THE RED GUILD / 44
Preview no requiere otro proyecto
01
Push a development: Preview
automático.
02
Mismo proyecto →
Deployments → Preview.
03
Comprobá rama, commit y
Ready.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 45
Preview creado no significa acceso anónimo
01
Deployment Protection
controla quién puede entrar.
02
Si pide login, usá la sesión
autorizada.
03
No desactives protección
para ocultar un fallo.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 46
Comparación de las dos URLs
EN TU
PROYECTO
01
En Preview, buscá Aprender y construir en
comunidad.
02
En Production, buscá HackerSpace Nodo Serrano.
03
Compará branch y SHA en Vercel.
04
Conservá ambas URLs abiertas.
EJERCICIO 1
THE RED GUILD / 47
Propuesta de integración en main
01
En GitHub, abrí Pull requests.
02
Creá un PR con base main y compare development.
03
Leé el título y la descripción antes de enviarlo.
Interfaz de referencia · documentación oficial
GITHUB × AI
THE RED GUILD / 48
development propone cambios a main
01
Base: main, la rama que recibe los cambios.
02
Compare: development, la rama que los propone.
03
El PR muestra el diff antes de integrar.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 49
Corroborar Preview desde el PR
01
Último commit: buscá el
estado de Vercel.
02
Inspect / Visit Preview / View
deployment.
03
En Vercel compará repo,
rama, SHA y URL.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 50
El estado de Vercel también llega a GitHub
01
Buscá Vercel en checks del último commit.
02
Details abre el deployment correspondiente.
03
No es el workflow manual de Actions que veremos después.
Interfaz de referencia · documentación oficial
TERMINAL Y WEB
THE RED GUILD / 51
Crear el PR con gh
Terminal del proyecto · repo de la práctica
gh pr create --base main --head development \
--title "Actualiza la portada del HackerSpace" \
--body "Cambia el titulo visible de la landing."
gh pr list --state open
Ejemplo de salida
https://github.com/TU_USUARIO/REPO/pull/NUMERO
La CLI devuelve el enlace del PR creado.
EJERCICIO 1
THE RED GUILD / 52
Files changed del PR
01
Abrí Files changed.
02
Localizá app/page.tsx.
03
Compará el texto eliminado y el agregado.
04
Abrí el Preview asociado si aparece.
Interfaz de referencia · documentación oficial
TERMINAL Y WEB
THE RED GUILD / 53
Leer el PR desde la terminal
Reemplazá NUMERO por el número del PR
gh pr view NUMERO --json number,title,state,url
gh pr diff NUMERO
gh pr view NUMERO --web
Ejemplo de salida
PR #NUMERO · development → main
app/page.tsx
El mismo PR tiene una vista en la terminal y otra en GitHub.
EJERCICIO 1
THE RED GUILD / 54
La revisión desde GitHub
01
Files changed muestra el cambio propuesto.
02
Review changes permite enviar el comentario de revisión.
03
Otra persona puede aprobar o pedir cambios.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 55
El mismo review desde gh
Terminal · repo de práctica
gh pr diff NUMERO
gh pr review NUMERO --comment \
--body "Revisé el cambio del título."
gh pr view NUMERO --web
Comment sirve también para practicar con tu propio PR.
EJERCICIO 1
THE RED GUILD / 56
Tres formas de integrar un PR
Opción | Qué queda en main |
Merge commit | Los commits de la rama y un commit de merge |
Squash and merge | Un commit que agrupa los cambios del PR |
Rebase and merge | Commits reaplicados con SHA nuevos y sin merge |
EJERCICIO 1
THE RED GUILD / 57
Merge commit conserva el recorrido
Cada círculo es un commit. Los SHA son de ejemplo.
tiempo
main
development
4f2a9b1
81c7d02
c50e8ab
49a1de0
ab8f40c
M e73ac91
El dibujo representa commits de ejemplo.
EJERCICIO 1
THE RED GUILD / 58
Squash agrupa los cambios
Cada círculo es un commit. Los SHA son de ejemplo.
tiempo
main
development
4f2a9b1
81c7d02
c50e8ab
49a1de0
ab8f40c
S 958bc21
2 commits → 1 nuevo commit en main
El dibujo representa commits de ejemplo.
EJERCICIO 1
THE RED GUILD / 59
Rebase deja una historia lineal
Cada círculo es un commit. Los SHA son de ejemplo.
tiempo
main
development
4f2a9b1
81c7d02
c50e8ab
49a1de0
ab8f40c
D′ 958bc21
E′ b62a103
Los commits reaplicados tienen SHA nuevos.
El dibujo representa commits de ejemplo.
EJERCICIO 1
THE RED GUILD / 60
La integración desde la interfaz
01
Revisá la conversación y los
checks.
02
Elegí el método de integración
en el desplegable.
03
Para el taller: Create a merge
commit y confirmar.
Interfaz de referencia · documentación oficial
TERMINAL Y WEB
THE RED GUILD / 61
Merge del PR con gh
Después de revisar el diff · conservar development
gh pr merge NUMERO --merge
gh pr view NUMERO --json state,mergeCommit
Ejemplo de salida
state: MERGED
mergeCommit: SHA_DEL_MERGE
Elegí una sola operación de merge para ese PR.
EJERCICIO 1
THE RED GUILD / 62
La historia después de integrar
Cada círculo es un commit. Los SHA son de ejemplo.
tiempo
main
development
4f2a9b1
81c7d02
c50e8ab
49a1de0
ab8f40c
M e73ac91
main avanzó al merge y development conserva su referencia.
EJERCICIO 1
THE RED GUILD / 63
Comprobación después del merge
EN TU
PROYECTO
01
Esperá el nuevo deployment de Production.
02
Comprobá Aprender y construir en comunidad.
03
Revisá branch main y el commit del merge.
04
Conservá development para los próximos
ejercicios.
EJERCICIO 1
THE RED GUILD / 64
Diagnóstico del primer deployment
Síntoma | Dónde mirar |
El repo no aparece | Owner y autorización de la integración |
No detecta Next.js | Root Directory y package.json |
El build falla | Primer error de los logs |
No aparece el cambio | Push, branch, SHA y URL abierta |
Se subieron builds o dependencias | .gitignore y reparación de la guía 1.1 |
EJERCICIO 1
THE RED GUILD / 65
Resultado del ejercicio
01
Un repo propio con main y development.
02
Una aplicación Next.js que construye.
03
URLs de Production y Preview identificadas.
04
Un cambio integrado mediante un PR.
05
Los archivos confirmados y enviados a GitHub.
EJERCICIO 1
THE RED GUILD / 66
Demo opcional: abrir Codespaces
01
Sólo TU repo publicado y main
funcionando.
02
Reutilizá una instancia o abrí
Code → Codespaces.
03
Revisá main, cuenta
pagadora y cuota.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 67
Demo: la misma landing, remota
Codespace · checkout propio limpio, main ya sincronizada
pnpm install --frozen-lockfile
pnpm dev
Sólo landing. Sin gh auth login ni refresh. Ejercicios 2–6 en el host.
EJERCICIO 1
THE RED GUILD / 68
Ver la demo y volver al host
01
Ports → 3000 → Open in Browser.
02
Mantené el puerto privado y reconocé la landing.
03
Ctrl+C, Stop codespace y volvé al host.
Interfaz de referencia · documentación oficial
EJERCICIO 1
THE RED GUILD / 69
El mismo recorrido en tu proyecto
Se conserva
Se adapta
Repo, branches, commits y PR.
Integración Git con Vercel.
Comparación de Preview y
Production.
Framework y directorio raíz.
Gestor, lockfile y build.
Variables que realmente necesita
la app.
EJERCICIO 2
THE RED GUILD / 70
02
Docker y runner
Volvé al host. Los checks se ejecutarán en
containers.
EJERCICIO 2
THE RED GUILD / 71
Host, VM y container
MÁQUINA VIRTUAL
CONTAINERS LINUX
Aplicaciones
Kernel propio de la VM
Hipervisor
Container A
Container B
Proceso Node
Proceso Python
Filesystem A
Filesystem B
Kernel Linux del host compartido
Host físico o VM
Cada container aísla procesos y archivos, pero comparte el kernel del host Linux.
EJERCICIO 2
THE RED GUILD / 72
Dos configuraciones, dos usos
Archivo dentro de lab | Para qué se usa |
Dockerfile | docker build local: imagen taller |
.dockerignore | Archivos fuera del contexto de build |
.devcontainer/devcontainer.json | Sólo demo opcional de Codespaces |
EJERCICIO 2
THE RED GUILD / 73
Leer la receta antes de construir
En el editor: lab/Dockerfile · extracto del archivo real
FROM node:22.23.4-bookworm-slim
RUN npm install --global pnpm@10.20.0
WORKDIR /workspace
USER node
CMD ["bash"]
Base → instalación → carpeta → usuario → comando inicial.
EJERCICIO 2
THE RED GUILD / 74
Cliente y daemon de Docker
Host · lab, con Docker Desktop o Engine iniciado
docker version
Ejemplo de salida
Client: Docker Engine …
Server: Docker Engine …
docker version debe mostrar Client y Server.
EJERCICIO 2
THE RED GUILD / 75
Herramientas incluidas
Herramienta | Uso |
Node 22 y pnpm 10.20.0 | Aplicación y checks |
git y gh 2.103.3 | Git y API de GitHub |
cloudflared 2026.10.3 | Túneles de los ejercicios 4 a 6 |
Runner 2.338.2 | Ejecutar un job de Actions |
libatomic1 | Node administrado por Hermes en Linux glibc |
EJERCICIO 2
THE RED GUILD / 76
Comprobar permisos antes del build
Preflight con el instructor · Linux con Docker Engine
id -u
id -g
El ejemplo usa node 1000:1000. Si tus IDs difieren, elegí antes la alternativa de la guía.
EJERCICIO 2
THE RED GUILD / 77
Dockerfile, imagen y container
Dockerfile
receta
Imagen
herramientas
build
Container A
Container B
run
La imagen se construye una vez. Cada docker run crea una instancia.
EJERCICIO 2
THE RED GUILD / 78
Build sólo para UID/GID 1000:1000
Host · si elegiste el build adaptado, omití este comando
docker build -t taller .
Ejemplo de salida
Building …
Imagen disponible: taller
No ejecutes ambas opciones: este build sobrescribe la imagen adaptada.
EJERCICIO 2
THE RED GUILD / 79
Reconocer la imagen construida
Host del taller
docker image ls taller
Ejemplo de salida
REPOSITORY TAG
taller latest
Buscá la imagen taller. Todavía no es un container en ejecución.
EJERCICIO 2
THE RED GUILD / 80
Primera shell dentro de la imagen
Host del taller
docker run --rm -it --name herramientas taller
CMD abre Bash. No hace falta una red propia para explorar la imagen.
EJERCICIO 2
THE RED GUILD / 81
Reconocer dónde estás
Dentro del container herramientas
whoami
pwd
node --version
pnpm --version
Ejemplo de salida
node
/workspace
v22.x.x
10.20.0
Usuario node, directorio /workspace y las versiones esperadas.
EJERCICIO 2
THE RED GUILD / 82
Otro proceso en el mismo container
Otra terminal del host, mientras herramientas siga abierto
docker exec -it herramientas bash
Aparece una segunda shell en la misma instancia.
EJERCICIO 2
THE RED GUILD / 83
Workflow, job y steps
checks.yml
Workflow
Job check
Runner elegido
Instalar lockfile
Biome
TypeScript
El job elige un runner. Sus steps ejecutan los comandos.
EJERCICIO 2
THE RED GUILD / 84
Permisos cuando aparece Actions
Operación del mismo repo | Permiso del PAT |
Iniciar y leer runs por CLI | Actions: Read and write |
Enviar .github/workflows por Git | Workflows: Write |
Runner registrado desde la web | Ningún permiso nuevo del PAT |
EJERCICIO 2
THE RED GUILD / 85
Agregar el workflow por terminal
Alternativa CLI · si elegís la web, seguí a su paso sin ejecutar este bloque
git switch main
git pull --ff-only
mkdir -p .github/workflows
cp docs/snippets/checks.yml .github/workflows/checks.yml
git add .github/workflows/checks.yml
git commit -m "Agrega checks manuales"
git push origin main
Elegí una sola forma de agregar el archivo: terminal o web.
EJERCICIO 2
THE RED GUILD / 86
Evento, permisos y runner
Editor · .github/workflows/checks.yml · primera parte
name: Checks del workshop
on:
workflow_dispatch:
permissions:
contents: read
jobs:
check:
runs-on: [self-hosted, linux, workshop]
timeout-minutes: 10
workshop debe coincidir con la label del runner.
EJERCICIO 2
THE RED GUILD / 87
Los comandos que ejecutará el job
Editor · mismo job · segunda parte
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
with:
persist-credentials: false
- run: pnpm install --frozen-lockfile
- run: pnpm lint
- run: pnpm typecheck
El commit de checkout queda fijado y Git no conserva su credencial.
EJERCICIO 2
THE RED GUILD / 88
Agregar el workflow desde GitHub
EN TU
PROYECTO
01
Alternativa web: abrí docs/snippets/checks.yml.
02
En GitHub creá .github/workflows/checks.yml en
main con ese contenido.
03
Después, sincronizá main y development con el
bloque siguiente.
04
Si ya lo enviaste por CLI, sólo comprobá el archivo
en GitHub.
EJERCICIO 2
THE RED GUILD / 89
El mismo workflow en development
Host · árbol limpio · web o CLI: sincronizá ambas ramas
git switch main
git pull --ff-only
git switch development
git merge main
git push origin development
development contiene el workflow que se va a ejecutar.
EJERCICIO 2
THE RED GUILD / 90
Cómo recibe trabajo el runner
Persona
Inicia workflow
GitHub
Job pendiente
UI o gh workflow run
Runner
Conexión saliente
Consulta trabajo
Job asignado
El runner inicia la conexión hacia GitHub. No requiere un túnel.
EJERCICIO 2
THE RED GUILD / 91
Registro desde la interfaz de GitHub
01
Settings, Actions, Runners.
02
Elegí New self-hosted runner.
03
Seleccioná Linux y la arquitectura de tu imagen.
Interfaz de referencia · documentación oficial
EJERCICIO 2
THE RED GUILD / 92
Instancia dedicada al runner
Host · nueva terminal para el runner
docker run --rm -it --name lab-runner taller
Instancia efímera, sin perfil de Hermes ni archivos del host.
EJERCICIO 2
THE RED GUILD / 93
Registro de un runner efímero
Dentro de lab-runner
cd /opt/actions-runner
./config.sh --url https://github.com/TU_USUARIO/REPO \
--name workshop-runner --labels workshop --ephemeral
El programa pide el token temporal con entrada oculta. No uses tu PAT.
EJERCICIO 2
THE RED GUILD / 94
Escucha del runner
Dentro de /opt/actions-runner
exec ./run.sh
Ejemplo de salida
Listening for Jobs
La terminal queda esperando trabajo.
EJERCICIO 2
THE RED GUILD / 95
Inicio del workflow por la web
01
Abrí Actions y Checks del
workshop.
02
Elegí Run workflow y la branch
development.
03
Confirmá el inicio de esa
ejecución.
Interfaz de referencia · documentación oficial
EJERCICIO 2
THE RED GUILD / 96
Inicio del workflow por gh
Otra terminal del host
gh workflow run checks.yml --ref development
gh run list --workflow checks.yml --limit 5
Anotá el RUN_ID de la ejecución recién creada.
EJERCICIO 2
THE RED GUILD / 97
Esperar el resultado del run
Host · reemplazá RUN_ID por el número real
gh run view RUN_ID --json status,conclusion
gh run view RUN_ID --web
Ejemplo de salida
check completed success
Estado puntual por CLI; seguimiento del run y steps en el navegador.
EJERCICIO 2
THE RED GUILD / 98
Lectura del primer error
01
Abrí el job y sus steps.
02
Localizá el primer step que
falla.
03
Leé archivo, línea y mensaje
antes de reintentar.
Interfaz de referencia · documentación oficial
EJERCICIO 2
THE RED GUILD / 99
Un fallo de tipos controlado
app/estado.ts
ANTES
export const plazas: number = 20;
DESPUÉS
export const plazas: number = "20";
Guardá este cambio en development.
EJERCICIO 2
THE RED GUILD / 100
Enviar el error de tipos
Host · development
git diff
git add app/estado.ts
git commit -m "Introduce un error de tipos para la practica"
git push origin development
El nuevo SHA identifica la versión que debe fallar.
EJERCICIO 2
THE RED GUILD / 101
Nuevo runner para el segundo run
EN TU
PROYECTO
01
Creá otra instancia lab-runner desde la misma
imagen.
02
Obtené un token nuevo y repetí config.sh con
--ephemeral.
03
Iniciá run.sh y dispará checks.yml sobre
development.
04
Comprobá que TypeScript señale app/estado.ts.
EJERCICIO 2
THE RED GUILD / 102
El fallo desde la terminal
Host · RUN_ID de la ejecución con el error
gh run view RUN_ID --log-failed
Ejemplo de salida
app/estado.ts(1,14): error TS2322:
Type 'string' is not assignable to type 'number'.
TypeScript debe señalar la asignación incompatible.
EJERCICIO 2
THE RED GUILD / 103
Corrección del error
app/estado.ts
ANTES
export const plazas: number = "20";
DESPUÉS
export const plazas: number = 20;
Guardá y enviá la corrección.
EJERCICIO 2
THE RED GUILD / 104
Confirmar y ejecutar la corrección
Host · después de repetir el registro efímero
git add app/estado.ts
git commit -m "Corrige el tipo de plazas"
git push origin development
# Con otro runner efímero registrado y escuchando:
gh workflow run checks.yml --ref development
Buscá el run nuevo y comparalo con los dos anteriores.
EJERCICIO 2
THE RED GUILD / 105
Tres versiones y sus resultados
Ejecución | Qué se reconoce |
Baseline | SHA inicial y checks completos |
Error introducido | SHA nuevo y typecheck fallido |
Corrección | Tercer SHA y checks completos |
En tu proyecto | Los mismos comandos que usa tu equipo |
EJERCICIO 2
THE RED GUILD / 106
Comprobación antes del agente
Host del taller
docker ps
Ejemplo de salida
CONTAINER ID IMAGE COMMAND NAMES
…
El runner efímero terminó antes de dar acceso al agente.
EJERCICIO 3
THE RED GUILD / 107
03
Hermes con OpenRouter
y Telegram
Configurar el agente y conversar desde dos
interfaces.
EJERCICIO 3
THE RED GUILD / 108
Instancia del agente
Host · runner cerrado · imagen taller
docker run -it --name lab-agent \
-p 127.0.0.1:8644:8644 \
-v hermes-home:/home/node/.hermes \
-v "$PWD":/workspace \
taller
Hermes en lab-agent:8644. Next irá en lab-app:3000.
Comparten /workspace y node_modules; paquetes del sistema separados. Perfil Hermes sólo en lab-agent.
EJERCICIO 3
THE RED GUILD / 109
Modelo, harness y agente
Parte | En esta práctica |
Modelo | Responde y propone llamadas a herramientas. Opción gratuita. |
Harness | Hermes coordina el modelo y ejecuta herramientas habilitadas. |
Agente | Sistema con modelo, harness, instrucciones y herramientas. |
Proveedor | OpenRouter da acceso al modelo. |
Canal | Terminal y Telegram. |
Entorno | lab-agent ejecuta Hermes y sus herramientas. |
EJERCICIO 3
THE RED GUILD / 110
Instalar Hermes en vivo
lab-agent · /workspace · usuario node · proyecto y perfil escribibles
hermes --version
Si la instalación o el check fallan, detenete. No uses Hermes como root ni borres el perfil.
1. Seguí la instalación CLI para Linux dentro de lab-agent.
Guía oficial: https://hermes-agent.nousresearch.com/docs/getting-started/installation#linux--macos--wsl2
2. Después de instalar, comprobá la versión. No necesita proveedor.
EJERCICIO 3
THE RED GUILD / 111
Wizard de configuración
Terminal del agente · Hermes disponible
hermes setup
Full Setup permite seleccionar OpenRouter y usar tu propia credencial.
EJERCICIO 3
THE RED GUILD / 112
Selección de OpenRouter
01
Navegá con las flechas hasta OpenRouter.
02
Confirmá la elección.
03
Si pide API key, creala en openrouter.ai/settings/keys.
04
Autorizá o ingresá la credencial en el wizard, sin proyectarla.
Captura de referencia publicada por OpenRouter
EJERCICIO 3
THE RED GUILD / 113
Elección del modelo gratuito
01
En el catálogo de OpenRouter, elegí una entrada :free.
02
Comprobá contexto de al menos 64K y soporte de herramientas.
03
Seleccioná ese ID exacto en Hermes.
04
Continuá con esa opción gratuita y sin fallback a modelos pagos.
EJERCICIO 3
THE RED GUILD / 114
Primera conversación por terminal
Con OpenRouter y el modelo guardados
hermes chat
Ejemplo de salida
Hermes conectado.
Mensaje de prueba: Respondé exactamente: Hermes conectado.
EJERCICIO 3
THE RED GUILD / 115
Creación del bot en Telegram
EN TU
PROYECTO
01
Abrí el BotFather oficial: t.me/BotFather.
02
Enviá /newbot y elegí un nombre.
03
Elegí un username único terminado en bot.
04
Guardá el token en privado para el wizard.
EJERCICIO 3
THE RED GUILD / 116
Canal Telegram en el wizard
Tené el token del bot y tu ID numérico de Telegram
hermes gateway setup
# Canal: Telegram
# Bot token: el que entregó BotFather
# Allowed users: tu ID numérico
El ID numérico identifica al usuario permitido. El @username es otro dato.
EJERCICIO 3
THE RED GUILD / 117
Gateway de mensajería
Sólo si el wizard no dejó un gateway activo
hermes gateway run
Si el wizard ya lo inició, conservá esa instancia. Usá sólo una por bot.
EJERCICIO 3
THE RED GUILD / 118
Primera respuesta por Telegram
EN TU
PROYECTO
01
Abrí el chat privado del bot que creaste.
02
Pulsá Start y enviá /help.
03
Enviá: Respondé exactamente: Hermes conectado.
04
Comprobá la respuesta y los mensajes del
gateway.
EJERCICIO 3
THE RED GUILD / 119
Telegram antes del túnel
Long polling por HTTPS
Gateway
Hermes
API de
Telegram
App de
Telegram
Consulta actualizaciones
Envía un mensaje
Recibe la respuesta
Recibe el mensaje
Hermes inicia la conexión. Este canal funciona sin abrir un puerto público.
EJERCICIO 3
THE RED GUILD / 120
Diagnóstico de la conversación
Síntoma | Qué revisar |
Error 401 del proveedor | Credencial de OpenRouter |
Error 429 o modelo sin endpoint | Cuota o disponibilidad de la entrada gratuita |
Usuario no autorizado | ID en la allowlist de Telegram |
Dos gateways para el mismo bot | Dejar una sola instancia activa |
Responde /help, pero no el mensaje | Proveedor, modelo y logs del gateway |
EJERCICIO 4
THE RED GUILD / 121
04
Entender y crear
el túnel
Seguir una request desde otra máquina hasta tu
aplicación.
TÚNELES
THE RED GUILD / 122
Cloudflare sin cuenta ni dominio
Quick Tunnel
Una URL temporal para el servicio local.
Sin registrar un dominio para seguir el taller.
Los túneles con nombre y dominio propio quedan como referencia opcional.
EJERCICIO 4
THE RED GUILD / 123
Las partes de una URL
https://tu-hostname.trycloudflare.com/api/health
HTTPS · puerto 443
DNS público
Ruta de Next
Estructura de ejemplo: usá el hostname real de tus logs.
El hostname localiza el servicio. El path elige un recurso.
EJERCICIO 4
THE RED GUILD / 124
Dos localhost diferentes
Host del taller
Container cloudflared
localhost
vuelve al host
localhost
vuelve al connector
Para otro container: http://lab-app:3000
127.0.0.1 siempre vuelve al entorno desde el que se hace la consulta.
EJERCICIO 4
THE RED GUILD / 125
Dirección según el lugar de la consulta
Desde dónde | Origen de Next |
Host del taller | http://127.0.0.1:3000 |
Dentro de lab-app | http://127.0.0.1:3000 |
Otro container en red-taller | http://lab-app:3000 |
Otra computadora en Internet | La URL HTTPS del túnel |
EJERCICIO 4
THE RED GUILD / 126
Red compartida: recién cuando hace falta
Host · antes de app y connector del túnel
docker network create red-taller
Ejemplo de salida
NAME DRIVER
red-taller bridge
Conecta app y connector por nombre. No era necesaria en ejercicios anteriores.
EJERCICIO 4
THE RED GUILD / 127
Container de la aplicación
Host · raíz del repo · imagen taller
docker run -it --name lab-app \
--network red-taller \
-p 127.0.0.1:3000:3000 \
-v "$PWD":/workspace \
taller
Next en lab-app:3000; Hermes en lab-agent:8644.
Comparten /workspace y node_modules; paquetes del sistema separados. Perfil Hermes sólo en lab-agent.
EJERCICIO 4
THE RED GUILD / 128
Publicación de un puerto
Host
127.0.0.1:3000
lab-app
0.0.0.0:3000
-p 127.0.0.1:3000:3000
Publicación del host
Dirección de escucha de Next
127.0.0.1:3000 del host se reenvía al puerto 3000 de lab-app.
EJERCICIO 4
THE RED GUILD / 129
La app que usaremos como origen
Dentro de lab-app · /workspace
pnpm install --frozen-lockfile
pnpm build
pnpm start --hostname 0.0.0.0
Ejemplo de salida
Local: http://localhost:3000
Ready in …
El servidor queda escuchando en el puerto 3000.
EJERCICIO 4
THE RED GUILD / 130
Endpoint sencillo para observar la conexión
Editor · app/api/health/route.ts · ya provisto
export function GET() {
return Response.json({ status: "ok", service: "nodoserrano" });
}
GET /api/health devuelve un JSON pequeño.
EJERCICIO 4
THE RED GUILD / 131
Primera request desde el host
Otra terminal del host
curl -i http://127.0.0.1:3000/api/health
Ejemplo de salida
HTTP/1.1 200 OK
{"status":"ok","service":"nodoserrano"}
HTTP 200 y status ok del servicio nodoserrano.
EJERCICIO 4
THE RED GUILD / 132
Request desde la red interna
Host · se crea un cliente temporal en la misma red
docker run --rm --network red-taller \
taller \
curl -i http://lab-app:3000/api/health
Ejemplo de salida
HTTP/1.1 200 OK
{"status":"ok","service":"nodoserrano"}
La respuesta debe ser la del mismo origen.
EJERCICIO 4
THE RED GUILD / 133
Cloudflare y cloudflared
Cloudflare
cloudflared
Red pública que recibe HTTPS y
enruta la request.
Proceso junto al origen que inicia
y mantiene el túnel.
EJERCICIO 4
THE RED GUILD / 134
La conexión empieza desde adentro
Red red-taller
cloudflared
Next
lab-app:3000
Cloudflare
Red pública
Conexión
saliente
cloudflared abre una conexión saliente hacia Cloudflare.
EJERCICIO 4
THE RED GUILD / 135
Primer Quick Tunnel
Host · con lab-app respondiendo en la red interna
docker run --rm -it --name lab-tunnel \
--network red-taller \
taller \
cloudflared tunnel --no-autoupdate \
--url http://lab-app:3000
cloudflared imprime una URL HTTPS trycloudflare.com.
EJERCICIO 4
THE RED GUILD / 136
La URL que generó tu proceso
EN TU
PROYECTO
01
Buscá la URL HTTPS en los logs de cloudflared.
02
Copiala completa y abrila en otra pestaña.
03
Comprobá que muestra la landing del
HackerSpace.
04
Conservá abierta la terminal del túnel.
EJERCICIO 4
THE RED GUILD / 137
La misma ruta por la URL pública
Otra terminal del host · reemplazá TU_URL_PUBLICA
curl -i https://TU_URL_PUBLICA/api/health
Ejemplo de salida
HTTP/1.1 200 OK
{"status":"ok","service":"nodoserrano"}
Compará el body con la respuesta local.
EJERCICIO 4
THE RED GUILD / 138
Ida y vuelta de la request
Cliente
URL HTTPS
Cloudflare
Next
/api/health
cloudflared
La respuesta vuelve
por el mismo
recorrido.
HTTPS público
HTTP interno
Cliente, Cloudflare, connector y origen conservan roles distintos.
EJERCICIO 4
THE RED GUILD / 139
DNS: de un nombre a una dirección
Nombre | Dónde se resuelve |
localhost / 127.0.0.1 | El propio entorno de la consulta |
lab-app | DNS interno de red-taller |
Tu hostname trycloudflare.com | DNS público hacia Cloudflare |
/api/health | Ruta dentro de la aplicación |
EJERCICIO 4
THE RED GUILD / 140
Comprobación desde otro cliente
EN TU
PROYECTO
01
Abrí la URL pública desde el teléfono u otro
navegador.
02
Agregá /api/health al final de esa misma URL.
03
Compará la respuesta con curl local.
04
Identificá qué terminal mantiene la app y cuál el
túnel.
EJERCICIO 4
THE RED GUILD / 141
Interrupción del origen
Host · cloudflared sigue abierto
docker stop lab-app
curl -i https://TU_URL_PUBLICA/api/health
Ejemplo de salida
HTTP/2 502
…
La request pública ya no puede obtener una respuesta sana del origen.
EJERCICIO 4
THE RED GUILD / 142
Recuperar la aplicación
EN TU
PROYECTO
01
En el host: docker start -ai lab-app.
02
Cuando vuelva Bash: pnpm start --hostname
0.0.0.0.
03
En otra terminal repetí curl local y público.
EJERCICIO 4
THE RED GUILD / 143
Otro arranque y otra URL
EN TU
PROYECTO
01
Detené sólo la terminal del túnel con Ctrl+C.
02
Comprobá que la app todavía responde
localmente.
03
Repetí el docker run de cloudflared.
04
Usá el hostname nuevo que impriman sus logs.
EJERCICIO 4
THE RED GUILD / 144
Diagnóstico por capas
Síntoma | Primera comprobación |
Falla curl local | Next, build y puerto publicado |
Falla lab-app:3000 desde la red | Nombre, red y escucha 0.0.0.0 |
Connector no conecta | Salida de red y logs de cloudflared |
URL anterior no responde | Hostname del último proceso |
Origen responde pero ruta no existe | Path enviado y Route Handler |
EJERCICIO 4
THE RED GUILD / 145
Qué acceso público estamos habilitando
01
El túnel alcanza el servicio al que apuntaste, con sus rutas.
02
HTTPS protege el transporte público.
03
La URL no reemplaza la autenticación de tu aplicación.
04
GitHub necesita llegar sin un formulario de login interactivo.
EJERCICIO 4
THE RED GUILD / 146
Referencia opcional: dirección estable
Quick Tunnel
Túnel con nombre
Un comando, hostname temporal
y sin cuenta o dominio.
Configuración de cuenta y una
dirección estable para el servicio.
EJERCICIO 4
THE RED GUILD / 147
Referencia de la interfaz de túneles
01
Cloudflare agrupa los túneles en su panel de red.
02
Esta captura muestra Hostname routes.
03
El taller continúa con Quick Tunnels desde la terminal.
Interfaz de referencia · documentación oficial
EJERCICIO 4
THE RED GUILD / 148
El mismo túnel para tu proyecto
EN TU
PROYECTO
01
Identificá el proceso y su puerto de escucha.
02
Comprobá su ruta local de health.
03
Elegí el origen correcto desde donde corre
cloudflared.
04
Seguí una request completa y una interrupción.
EJERCICIO 5
THE RED GUILD / 149
05
GitHub llama a
nuestro servidor
Recibir un webhook firmado y entender cada parte
de su entrega.
EJERCICIO 5
THE RED GUILD / 150
Consultar o recibir un aviso
Polling
Webhook
Tu proceso pregunta si hay
novedades, aunque no haya
cambios.
GitHub hace un POST cuando
ocurre un evento seleccionado.
EJERCICIO 5
THE RED GUILD / 151
Qué contiene el aviso
Persona
Abre un PR
GitHub
POST firmado
Evento pull_request
Next
/api/github
Cloudflare
+ cloudflared
Body JSON → validación → HTTP 200
El evento inicia una request; la respuesta HTTP confirma la recepción.
EJERCICIO 5
THE RED GUILD / 152
El receptor ya está en el proyecto
01
Ruta del ejemplo: POST /api/github.
02
Archivo provisto: app/api/github/route.ts.
03
Hermes puede adaptarlo a tu backend.
04
La firma y los filtros siguen siendo requisitos del receptor.
EJERCICIO 5
THE RED GUILD / 153
Abrir el sobre HTTP
Parte | Qué identifica |
POST + /api/github | Método y ruta del receptor |
X-GitHub-Event | Tipo de evento: pull_request |
X-GitHub-Delivery | ID de esta entrega |
X-Hub-Signature-256 | HMAC del body con el secret |
Body JSON | Repo, acción y datos del PR |
EJERCICIO 5
THE RED GUILD / 154
Una firma compartida
GitHub
Secret + body
Receptor
Mismo secret + raw body
Firma enviada
Firma calculada
¿Iguales?
Ambos extremos calculan HMAC-SHA256 sobre los mismos bytes.
EJERCICIO 5
THE RED GUILD / 155
Qué debe hacer el receptor
Pseudocódigo · el código completo ya está provisto
al recibir POST:
leer bytes con límite de tamaño
verificar HMAC con el secret
interpretar JSON y validar el repo
filtrar los eventos permitidos
detectar una entrega repetida
registrar metadata y responder
La firma se comprueba antes de interpretar el JSON.
EJERCICIO 5
THE RED GUILD / 156
GitHub dentro del agente
Host y después shell de lab-agent
docker exec -it lab-agent bash
gh auth login
gh auth status
Token propio del repo: Contents Read + Pull requests Write; Webhooks si administra hooks.
EJERCICIO 5
THE RED GUILD / 157
Preparar el receptor con Hermes
Hermes chat · /workspace
Revisá app/api/github/route.ts de este proyecto.
Adaptalo sólo si hace falta para este backend.
Usá TU_USUARIO/REPO como repo permitido.
Prepará .env.local sin pisar variables existentes.
Generá un secret aleatorio y guardalo allí.
No imprimas secretos ni hagas push.
Explicá qué cambió y cómo comprobarlo.
Tarea para Hermes dentro del repo autorizado.
EJERCICIO 5
THE RED GUILD / 158
Configurar el webhook con Hermes
Hermes chat · /workspace
Configurá un único webhook en TU_USUARIO/REPO.
URL: https://TU_URL_PUBLICA/api/github
Usá el secret de .env.local sin mostrarlo.
Content type JSON, sólo Pull requests y TLS verificado.
No dupliques ni toques hooks de otros servicios.
Mostrá URL, eventos y estado, sin credenciales.
Tarea para Hermes dentro del repo autorizado.
EJERCICIO 5
THE RED GUILD / 159
Crear el webhook desde GitHub
EN TU
PROYECTO
01
Repo → Settings → Webhooks → Add webhook.
02
Payload URL: tu PUBLIC_URL + /api/github.
03
Content type: application/json; pegá tu secret.
04
Sólo Pull requests, SSL verification y Active.
EJERCICIO 5
THE RED GUILD / 160
La configuración nueva en el servidor
EN TU
PROYECTO
01
En la terminal de lab-app detené Next con Ctrl+C.
02
Ejecutá pnpm start --hostname 0.0.0.0.
03
Si cambió el código, hacé pnpm build antes del
start.
04
Comprobá health y el rechazo de una request sin
firma.
EJERCICIO 5
THE RED GUILD / 161
Comprobar el rechazo sin firma
Host · request deliberadamente sin firma
curl -i -X POST http://127.0.0.1:3000/api/github \
-H 'Content-Type: application/json' \
--data '{"action":"opened"}'
Ejemplo de salida
HTTP/1.1 401 Unauthorized
{"error":"invalid_signature"}
Con el receptor configurado, esperamos HTTP 401.
EJERCICIO 5
THE RED GUILD / 162
Encontrar las entregas reales
01
Abrí tu webhook y Recent Deliveries.
02
Elegí el ping o el evento de PR de tu práctica.
03
Inspeccioná Request, Response y el estado HTTP.
Interfaz de referencia · documentación oficial
EJERCICIO 5
THE RED GUILD / 163
Provocar un evento de PR
Host · si ya hay un PR abierto, usá ese PR
git switch development
git pull --ff-only
# Editá el h1 en app/page.tsx y guardá.
git add app/page.tsx
git commit -m "Presentar el HackerSpace de Nodo Serrano"
git push
gh pr create --base main --head development \
--title "Presentar el HackerSpace" \
--body "Cambio de texto para observar el webhook."
Un PR development → main produce una entrega pull_request.
EJERCICIO 5
THE RED GUILD / 164
El PR que vamos a seguir
Host · misma terminal de práctica
gh pr list --base main --head development
gh pr view NUMERO --web
Anotá el número que muestra tu PR real.
EJERCICIO 5
THE RED GUILD / 165
Seguir una entrega sin saltar capas
EN TU
PROYECTO
01
Anotá acción, PR y delivery GUID en GitHub.
02
Observá el log github-webhook de lab-app.
03
Compará el GUID y el repo en ambos extremos.
04
Comprobá status received en la respuesta HTTP.
EJERCICIO 5
THE RED GUILD / 166
El botón Redeliver de GitHub
EN TU
PROYECTO
01
En Settings, Webhooks abrí el hook de /api/github.
02
Recent Deliveries: elegí la entrega de tu PR.
03
Usá Redeliver para pedir otro intento.
04
Leé la respuesta: duplicate si el receptor recuerda
ese GUID.
EJERCICIO 5
THE RED GUILD / 167
El status orienta la investigación
Respuesta | Dónde mirar |
401 invalid_signature | Secret y bytes originales |
403 repository_not_allowed | owner/repo del servidor |
404 / gateway error | Path, túnel y proceso |
413 o 415 | Tamaño y Content-Type JSON |
503 receiver_not_configured | Variables y reinicio |
EJERCICIO 5
THE RED GUILD / 168
Cambiar de receptor para el próximo
ejercicio
EN TU
PROYECTO
01
Identificá el hook que termina en /api/github.
02
En la web desmarcá Active y guardá.
03
También podés pedir a Hermes que desactive sólo
ese hook.
04
Conservá su historial de entregas.
EJERCICIO 5
THE RED GUILD / 169
Repetirlo en otro backend
EN TU
PROYECTO
01
Crear una ruta POST pequeña y una ruta health.
02
Validar HMAC sobre los bytes originales.
03
Limitar body, repo, eventos y duplicados.
04
Correlacionar una entrega con respuesta y logs.
EJERCICIO 6
THE RED GUILD / 170
06
Una revisión
pedida desde GitHub
Filtrar antes del modelo y publicar una revisión que
una persona pueda evaluar.
EJERCICIO 6
THE RED GUILD / 171
Un filtro antes de gastar tokens
Request
HMAC válido
Filtros
repo + label + estado
Tarea
Modelo + gh
No coincide → ignored
Sin llamada al modelo
Sólo un evento permitido se transforma en una tarea.
EJERCICIO 6
THE RED GUILD / 172
Qué cambia respecto del ejercicio 5
Componente | Destino de este ejercicio |
Receptor | Gateway de Hermes, puerto 8644 |
Path público | /webhooks/github-pr-review |
Disparador | Etiqueta ai-review en PR propio |
Lectura | gh pr view y gh api de repo fijo |
Salida | Adaptador github_comment |
EJERCICIO 6
THE RED GUILD / 173
Volver al agente dedicado
Host → shell de lab-agent
docker exec -it lab-agent bash
cd /workspace
hermes chat
La configuración se prepara desde la CLI del agente.
EJERCICIO 6
THE RED GUILD / 174
La ruta nativa preparada por Hermes
Hermes chat · /workspace
Leé docs/snippets/hermes-webhook.yaml.
Fusioná la ruta en tu perfil sin borrar Telegram ni OpenRouter.
Fijá TU_USUARIO/REPO, base main y etiqueta ai-review.
Generá un secret nuevo para Webhooks y guardalo en el perfil.
Mantené filtros antes del modelo y destino de comentario fijo.
No imprimas secretos ni habilites proveedores pagos.
Indicá cómo reiniciar el gateway y comprobar /health.
Tarea para Hermes dentro del repo autorizado.
EJERCICIO 6
THE RED GUILD / 175
Webhooks sin perder el setup existente
EN TU
PROYECTO
01
Conservá proveedor, modelo y Telegram del
ejercicio 3.
02
Hermes prepara la ruta nativa desde el archivo
provisto.
03
Usá un secret nuevo para este receptor.
04
Reiniciá el gateway desde su terminal cuando la
configuración esté lista.
EJERCICIO 6
THE RED GUILD / 176
Cuándo se solicita una review
Pseudocódigo · filtros nativos antes del modelo
si repo o head_repo no son el mío: ignorar
si la base no es main: ignorar
si la acción no es labeled: ignorar
si la etiqueta no es ai-review: ignorar
si el PR es draft o está cerrado: ignorar
pedir revisión de base SHA y head SHA recibidos
Un push o una etiqueta diferente no gastan una revisión.
EJERCICIO 6
THE RED GUILD / 177
La tarea tiene repo y versión
01
Repo fijo; base SHA y head SHA del evento.
02
Diff inmutable: comparar base SHA...head SHA.
03
Antes de leer y devolver: ambos SHAs iguales; base main.
04
Si cambian, solicitud desactualizada; no review.
EJERCICIO 6
THE RED GUILD / 178
El diff es material para analizar
Diff del PR
Datos no confiables
Agente
Analiza con límites
Lectura para revisar
Permisos del token + container aislado + aprobaciones
El agente tiene acceso al repo autorizado y conserva sus aprobaciones.
EJERCICIO 6
THE RED GUILD / 179
Quién publica la respuesta
Parte | Responsabilidad |
Modelo | Analizar el diff y redactar la revisión |
Adaptador github_comment | Entregar el texto al PR permitido |
Repo y número de PR | Fijar el destino de la entrega |
Persona | Evaluar el comentario y decidir el cambio |
EJERCICIO 6
THE RED GUILD / 180
Iniciar con la configuración nueva
lab-agent · sesión de gh ya iniciada
hermes gateway run
El proceso mantiene Telegram y Webhooks activos.
EJERCICIO 6
THE RED GUILD / 181
Primero, el gateway local
Otra terminal del host
curl -i http://127.0.0.1:8644/health
Ejemplo de salida
HTTP/1.1 200 OK
El health debe responder antes de exponer el gateway.
EJERCICIO 6
THE RED GUILD / 182
Cambiar el origen del Quick Tunnel
Host · gateway Hermes en lab-agent:8644 activo
# Primero detené el túnel anterior en su terminal.
docker network connect red-taller lab-agent
docker run --rm -it --name lab-tunnel \
--network red-taller \
taller \
cloudflared tunnel --no-autoupdate \
--url http://lab-agent:8644
Detené el túnel anterior. Conectá lab-agent a red-taller una sola vez.
Origen Hermes lab-agent:8644, no Next lab-app:3000. Misma imagen taller y /workspace, incluido node_modules.
EJERCICIO 6
THE RED GUILD / 183
Crear el hook de revisión
EN TU
PROYECTO
01
URL actual del túnel + /webhooks/github-pr-review.
02
Secret nuevo de Hermes, JSON y TLS verificado.
03
Sólo eventos Pull requests.
04
Revisá esos campos en la web o delegá la
configuración al agente.
EJERCICIO 6
THE RED GUILD / 184
La conexión de GitHub al gateway
Hermes chat · /workspace
Creá o actualizá sólo el webhook de esta review.
Repo: TU_USUARIO/REPO
URL: https://TU_URL_PUBLICA/webhooks/github-pr-review
Usá el secret del gateway sin imprimirlo.
Eventos Pull requests, JSON y TLS verificado.
Comprobá que el hook de Next haya quedado inactivo.
Tarea para Hermes dentro del repo autorizado.
EJERCICIO 6
THE RED GUILD / 185
Un cambio que los tipos no detectan
app/capacidad.ts
ANTES
return capacidad - ocupados;
DESPUÉS
return capacidad + ocupados;
Con capacidad 20 y 5 ocupados, buscamos 15 lugares libres.
EJERCICIO 6
THE RED GUILD / 186
Enviar el cambio al PR abierto
Host · después de editar y guardar
git switch development
git add app/capacidad.ts
git commit -m "Practicar revision del calculo de lugares"
git push
El push actualiza el PR; todavía no pide revisión.
EJERCICIO 6
THE RED GUILD / 187
La etiqueta que pide la revisión
01
En el repo creá ai-review si no existe.
02
Creá también prueba-webhook para el caso negativo.
03
En el PR, Labels permite agregar y quitar cada etiqueta.
Interfaz de referencia · documentación oficial
EJERCICIO 6
THE RED GUILD / 188
Otra etiqueta no invoca el modelo
EN TU
PROYECTO
01
En el PR, abrí Labels.
02
Agregá prueba-webhook.
03
Comprobá entrega y resultado según el filtro.
EJERCICIO 6
THE RED GUILD / 189
Pedir ahora la revisión
EN TU
PROYECTO
01
En el PR, abrí Labels.
02
Agregá ai-review.
03
Comprobá entrega y resultado según el filtro.
EJERCICIO 6
THE RED GUILD / 190
Recibido no significa terminado
Entrega GitHub
202 Accepted
Acuse de recepción
Tarea del gateway
Modelo y gh
Comentario
GitHub
El acuse HTTP y el comentario ocurren en momentos distintos.
EJERCICIO 6
THE RED GUILD / 191
Leer la respuesta real
Host · alternativa: conversación del PR
gh pr view NUMERO --web
Leé la conversación del PR y el SHA desde GitHub.
EJERCICIO 6
THE RED GUILD / 192
Dónde se cortó la revisión
Última evidencia | Siguiente comprobación |
No hay entrega | Hook activo y evento labeled |
Falla de red o firma | Hostname, path, secret y gateway |
Evento ignorado | Repo, head, base, label y draft |
No lee el diff | toolsets y gh auth status en lab-agent |
Respuesta sin comentario | Acceso al PR y github_comment |
EJERCICIO 6
THE RED GUILD / 193
Corregir con una decisión humana
app/capacidad.ts
ANTES
return capacidad + ocupados;
DESPUÉS
return capacidad - ocupados;
La persona decide el cambio y lo verifica.
EJERCICIO 6
THE RED GUILD / 194
Comprobar el comportamiento
Host · raíz del repo · Node 22
pnpm test
pnpm lint
pnpm typecheck
Las pruebas existentes comprueban el cálculo, además de lint y tipos.
EJERCICIO 6
THE RED GUILD / 195
Cerrar el ciclo del cambio
Host · PR sigue abierto
git add app/capacidad.ts
git commit -m "Corregir calculo de lugares libres"
git push
El PR conserva la corrección y la conversación.
EJERCICIO 6
THE RED GUILD / 196
Pedir review del commit corregido
EN TU
PROYECTO
01
Después del push corregido, abrí Labels del PR.
02
Quitá ai-review y volvé a agregarla.
03
La entrega nueva debe referirse al SHA corregido.
04
Compará el SHA de la respuesta con el commit
corregido.
EJERCICIO 6
THE RED GUILD / 197
Trasladarlo a tu proyecto
EN TU
PROYECTO
01
Fijá repo y rama base en toda la ruta.
02
Elegí una intención explícita para pedir revisión.
03
Separá código no confiable, credenciales y jobs.
04
Definí quién evalúa el resultado antes del merge.
CIERRE
THE RED GUILD / 198
El sistema que acabamos de conectar
GitHub
Vercel
build y deploy
push del commit
Runner
jobs de Actions
cloudflared
túnel
Hermes
review del PR
job
webhook
tarea
GitHub relaciona cambios, ejecuciones y eventos
CIERRE
THE RED GUILD / 199
Cierre de la práctica
EN TU
PROYECTO
01
Desactivá los hooks. Aunque falle, cerrá la exposición:
detené Next, gateway y túnel del host.
02
Detené lab-tunnel, lab-app, lab-agent, herramientas y lab-runner,
espere o ejecute un job. Cancelá sólo tu run de Actions.
03
Revocá en GitHub los PAT dedicados.
Cerrá también las sesiones temporales con logout.
04
Conservá el repo y los perfiles privados.
No borres credenciales ni recursos ajenos.
También a mitad del curso. Sólo recursos creados; si no usaste Docker, omitilo.
CIERRE
THE RED GUILD / 200
De un commit
a trabajo autónomo
Un cambio, un check, un túnel y una revisión solicitada.
The Red Guild · NodoSerrano