curso-claude-code / Correa larga / módulo 12
Claude Code · la biblia completa

Módulo 12 — Suelta la correa: loops, background y el famoso Ralph

Al terminar este módulo, vas a correr tu primer trabajo autónomo con candados: Claude trabajando solo, tú durmiendo tranquilo.

Ya le pusiste candados (módulo 10) y le agrandaste las manos (módulo 11). Hoy es el módulo que cierra el arco: sueltas la correa. No de golpe — peldaño por peldaño, y siempre con los candados puestos primero. Todo lo que sigue solo funciona porque ya llevas once módulos construyendo la red de abajo: la máquina del tiempo, la constitución, los candados. Sin eso, esto no es autonomía — es correr con tijeras.

12.1 — La escalera de autonomía

Hasta hoy, todo lo que hizo Claude lo viste pasar frente a tus ojos, turno por turno. Hay cuatro peldaños para ir soltando esa mirada, de menos a más:

🧠 ANALOGÍA CLAVE

La correa. Todo este arco ha sido sobre qué tan larga la traes: los candados (módulo 10) fueron el contrato; el MCP (módulo 11) le agrandó el mundo. Hoy la sueltas — un peldaño a la vez, sin dejar el carrete.

Peldaño 1 — Tareas en segundo plano. Le encargas algo que tarda y sigues trabajando en lo tuyo mientras corre, en vez de quedarte viendo la pantalla.

👀 LO QUE VAS A VER

Teclea (o pega) esto (en tu terminal):

claude --bg --exec "arma el inventario completo de ~/Descargas, con detalle de cada subcarpeta"

Vas a ver algo así (transcripción real, capturada para este manual):

Starting background service…
backgrounded · dfccf2dc · arma el inventario completo de ~/Descargas…
  claude agents             list sessions
  claude attach dfccf2dc    open in this terminal
  claude logs dfccf2dc      show recent output
  claude stop dfccf2dc      stop this session

Qué significa: Claude arrancó a trabajar en OTRA sesión, aparte, mientras tú regresas a la tuya — y el propio comando te deja el menú de seguimiento: claude agents para ver la lista de lo que corre, claude logs dfccf2dc para asomarte sin interrumpir, claude attach dfccf2dc para reconectarte, y claude stop dfccf2dc para frenarlo. (El código dfccf2dc cambia en cada encargo — usa el que TE salga.)

Si en vez de eso ves que la terminal se queda esperando sin regresarte el control: te faltó el --exec con el encargo entre comillas — sin eso, --bg abre una sesión interactiva, no una de fondo. Y si claude agents te contesta que "requiere terminal interactiva": estás en un script — ahí se usa claude agents --json.

Peldaño 2 — Headless: Claude como comando. ¿Te acuerdas del Loro, del módulo 8? Cada vez que termina de hablar, por dentro usa exactamente esto: claude -p — Claude SIN conversación, como un comando más de tu terminal. Entra, hace la chamba, imprime el resultado, sale.

👀 LO QUE VAS A VER

Teclea (o pega) esto:

claude -p "lee inventario.md y dime en 3 líneas qué tan desordenada está la carpeta"

Vas a ver algo así:

Tu carpeta de Descargas tiene 342 archivos, el 40% instaladores viejos.
Hay al menos 15 duplicados por nombre. Los 10 más pesados son videos.
Prioridad de limpieza: instaladores > duplicados > videos sin revisar.

Qué significa: confirmado en vivo para este manual (con otro prompt, mismo mecanismo): claude -p no abrió una conversación — contestó y se cerró, como si fuera pwd o ls. Por eso es la pieza que arma todo lo demás: un script, un cron, otro programa, le pueden hablar a Claude sin que haya un humano tecleando.

Peldaño 3 — Metas medibles: /goal. No para hasta que se cumple una condición que TÚ escribiste. Después de cada turno, un evaluador revisa: ¿ya se cumplió? Si no, sigue solo, con la razón como pista.

👀 LO QUE VAS A VER

Teclea (o pega) esto (dentro de Claude Code):

/goal las 10 descripciones en productos-dummy.md están completas, cada una entre 40 y 60 palabras

Vas a ver algo así:

Goal set. Working until condition is met...
[turn 1] 3 of 10 descriptions written. Continuing.
[turn 2] 7 of 10 descriptions written. Continuing.
[turn 3] 10 of 10 descriptions written, all within range. Goal met.

Qué significa: tú NO le dijiste "sigue" cada vez — el propio sistema revisó la condición después de cada turno y decidió si continuar. /goal clear la cancela si te arrepientes.

⚠️ REGLA QUE NUNCA DEBES OLVIDAR

Criterio de terminado MEDIBLE, o no hay loop. "Que las descripciones queden bonitas" no sirve — nadie, ni Claude, sabe cuándo eso es cierto. "Que las 10 tengan entre 40 y 60 palabras" sí — se cuenta. Si no lo puedes comprobar con un comando o un conteo, todavía no está listo para soltarlo solo: sigue revisándolo tú, a mano.

Peldaño 4 — Agendado: rutinas que trabajan aunque tu compu duerma. El último peldaño ya no vive en tu sesión — vive en la nube. Le dices qué hacer y cada cuánto, y corre solo, aunque cierres la laptop.

👀 LO QUE VAS A VER

Teclea (o pega) esto (dentro de Claude Code):

/schedule

Vas a ver algo así:

Let's create a scheduled routine.
What should it do? › Every Monday, review ~/Curso-Claude and write a short report.
When should it run? › Mondays at 8:00 AM
✔ Routine created: "reporte-semanal" (runs weekly, Mon 08:00)

Qué significa: esta rutina vive en la nube de Anthropic, no en tu compu — corre aunque tengas la laptop apagada. El mínimo es cada hora; para "cada lunes" sobra margen de tiempo.

Si en vez de eso ves que el comando no existe en tu versión: pregúntale directo a Claude "¿cómo agendo una rutina recurrente?" — es una función relativamente nueva y el camino exacto puede haber cambiado.

12.2 — El famoso Ralph loop

Todo lo de arriba es oficial, documentado, con soporte. Ahora la pieza que le da nombre a este módulo — y que nació completamente al margen de cualquier documentación.

🧠 ANALOGÍA CLAVE

El becario incansable que cada vuelta llega fresco. Imagina un becario que reinicia su memoria cada vez que termina una tarea — pero antes de irse, deja todo anotado en el pizarrón (los archivos, el proyecto en disco). A la vuelta siguiente no se acuerda de nada de la conversación, pero LEE el pizarrón, ve dónde quedó el trabajo, y sigue. Otra vez. Y otra. Terco, sin drama, sin cansarse.

El origen (patrón comunitario). El 14 de julio de 2025, el ingeniero Geoffrey Huntley publicó una técnica que cabe en un renglón de terminal:

while :; do cat PROMPT.md | claude-code ; done

Un while de bash, infinito, que relanza al agente contra el MISMO archivo de instrucciones una y otra vez. Huntley lo resume así: "Ralph is a technique. In its purest form, Ralph is a Bash loop." — "Ralph es una técnica. En su forma más pura, Ralph es un loop de Bash." El nombre viene de Ralph Wiggum, el niño de Los Simpson: terco, despistado, optimista — muy bueno construyendo cosas, pero que se cae de la resbaladilla. La forma de corregirlo no es vigilarlo en vivo: es ponerle un letrero junto a la resbaladilla (agregar una regla al PROMPT.md cada vez que se equivoca).

Por qué funciona (comunidad). Dos cosas que ya conoces con otro nombre: cada vuelta arranca con la mesa limpia (módulo 2 — contexto fresco, sin el ruido de vueltas anteriores) y el estado real vive en la máquina del tiempo (módulo 4 — archivos y git en disco, no en la conversación). El becario no recuerda, pero el pizarrón sí.

Los fracasos (comunidad), citados por el propio inventor. Esto no te lo cuenta un curso genérico:

"Ralph will test you." — "Ralph te va a poner a prueba."
"You'll wake up to a broken codebase that doesn't compile." — "Vas a amanecer con un codebase roto que ni compila."
"There's no way in heck would I use Ralph in an existing code base." — "Ni loco lo usaría en un codebase existente."

Ralph es para empezar de cero (greenfield), no para meterlo a un sistema delicado que ya funciona. Y si lo dejas correr de más, aparecen comportamientos raros — hay un reporte de que un Ralph desatendido se puso a agregarle criptografía post-cuántica a un proyecto que nadie se la pidió. Terco no siempre es sinónimo de sensato.

El dato que corre de boca en boca (según el propio Huntley, repetido después por Anthropic): un contrato de $50,000 USD entregado como MVP funcional por $297 USD de consumo de API. Es un dato de su autor, no una medición independiente — cuéntalo así.

La versión moderna (plugin oficial). Anthropic empacó la idea como plugin: ralph-wiggum / ralph-loop. Ojo con la diferencia técnica: el bash loop original relanza un PROCESO nuevo cada vuelta (contexto 100% fresco); el plugin usa un hook Stop que intercepta el intento de Claude de terminar la sesión y le reinyecta el mismo encargo DENTRO de la misma sesión — no es un reinicio completo. Misma filosofía, mecanismo distinto.

🚀 NIVEL PRO

Si esto te suena a chino, bríncatelo: no lo necesitas para seguir. El plugin oficial se instala y se usa así:

/plugin marketplace add anthropics/claude-code
/plugin install ralph-wiggum@claude-plugins-official
/ralph-loop "construye la API con CRUD completo y tests" --max-iterations 50 --completion-promise "LISTO"

--max-iterations es el freno real (sin él, no para); --completion-promise es el texto exacto que Claude tiene que decir para que el loop sepa que terminó — es una comparación literal de texto, no "entiende" que acabaste, así que el tope de vueltas sigue siendo tu red principal.

12.3 — Los guardrails: la correa bien puesta

Un loop sin candados es el escenario de "amaneces con un codebase roto". Un loop CON candados es un becario incansable trabajando dentro de una jaula razonable. Los candados, en orden:

Y tu red de siempre sigue aplicando aquí, sin que tengas que hacer nada extra: si algo sale raro, la máquina del tiempo (módulo 4) te regresa a como estaba antes de soltar el loop — un /rewind o un vistazo a git, no una tragedia.

⚠️ REGLA QUE NUNCA DEBES OLVIDAR

Lo irreversible JAMÁS entra al loop. Gastar dinero, publicar, borrar en masa, mandar correos o mensajes — los mismos gates del módulo 10 — no se automatizan nunca, ni en el loop más candadeado del mundo. Si el trabajo necesita cruzar uno de esos, el loop se detiene ANTES y te lo deja listo para tu firma.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: un claude -p en una carpeta que NUNCA has abierto con Claude Code de forma normal se niega a leer o escribir CUALQUIER cosa, aunque tu settings.json de esa carpeta traiga un allowlist bien escrito.

Causa: confirmado en vivo para este manual — la primera vez que Claude Code entra a una carpeta, necesita que TÚ confirmes (en una sesión normal, con pantalla) que confías en ella. En modo headless nadie está ahí para confirmar, así que Claude Code no se arriesga: ignora tu allowlist de settings.json entero y trata la carpeta como no confiable.

Salida: dos caminos. (1) Abre claude normal en esa carpeta UNA vez, antes de automatizar nada — con eso queda "confiada" para siempre. (2) Si de plano el loop va a correr en una carpeta nueva sin que nadie la abra antes, no dependas del settings.json: dale los permisos directo en la línea de comando con --allowedTools (como ya viste arriba) — ese sí aplica sin pedir confianza previa.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: "Mi /goal lleva 30 vueltas y no ha terminado."

Causa: el criterio quedó ambiguo, o de plano es más grande de lo que pensabas.

Salida: Esc lo frena en seco (o espera a que llegue tu --max-turns en headless). Revisa la bitácora para ver en qué se atoró, y reescribe el criterio más concreto — casi siempre el problema es la redacción, no el trabajo.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: "Dejé un Ralph corriendo toda la noche y el proyecto amaneció roto."

Causa: exactamente el fracaso que su propio inventor advierte — sin tope de vueltas, sin criterio verificable, o usado sobre algo delicado que ya funcionaba (en vez de empezar de cero).

Salida: por eso las reglas de esta sección no son opcionales. Y si ya pasó: tu máquina del tiempo (módulo 4) te regresa a antes de soltar el loop — es exactamente para esto que existe.

12.4 — Cuándo sí, cuándo no

Un checklist honesto antes de soltar cualquier correa:

Suéltala cuando...NO la sueltes cuando...
El final se comprueba con un comando o un conteoEl criterio es "que se vea bonito" o depende de tu gusto
Es trabajo nuevo o de bajo riesgoEs algo delicado que YA funciona en producción
La zona de trabajo está acotada a una carpetaNecesita una decisión de diseño o de negocio en el camino
Tienes máquina del tiempo corriendo por debajoNo hay forma de revisar el resultado después
Nada de lo que hace cruza un gateCualquier paso del camino necesita un gate humano

ASÍ LO USAMOS EN SPAI

🫘 ASÍ LO USAMOS EN SPAI

En la casa existe un skill interno bautizado try — el que responde "¿ya quedó?" convirtiendo esa pregunta borrosa en una meta medible por comando, y corre el loop (con /goal nativo o con un Ralph) hasta que se cumple de verdad. Pero la meta nunca incluye lo que la constitución marca como sagrado: "confirmar antes de gastar" en cualquier API de paga, y la ley del roster de agentes: "un subagente JAMÁS cruza un gate (gastar, publicar, borrar, mergear, deploy): el cruce sube al humano." La regla que lo resume: el goal se define SOLO sobre lo medible; los gates humanos JAMÁS entran al loop. Autonomía grande, puertas cerradas con llave — y la llave la trae una persona.

HAZLO TÚ — Tu primer trabajo autónomo

🔧 HAZLO TÚ

Qué vas a lograr: dos cosas — (a) tu primer maratón con candados de verdad, sobre una tarea de bajo riesgo; (b) una rutina agendada que trabaja sola cada semana.

Qué necesitas: los seeds ejercicios/m12/productos-dummy.md (10 productos ficticios) y ejercicios/m12/checklist-maraton.md (la plantilla del contrato).

Pasos — parte (a), el maratón:

  1. Copia productos-dummy.md a ~/Curso-Claude/maraton-productos/ y llena a mano el checklist-maraton.md: qué se va a hacer, zona de trabajo, criterio medible, tope de vueltas, qué queda fuera (los gates).
  1. Párate en la carpeta y lanza el loop:
👀 LO QUE VAS A VER

Teclea (o pega) esto:

cd ~/Curso-Claude/maraton-productos
claude -p "/goal las 10 descripciones en productos-dummy.md están completas, cada una entre 40 y 60 palabras, tono cálido de panadería mexicana; anota cada vuelta en bitacora.md" \
  --max-turns 15 --allowedTools "Read" "Edit" "Write"

Vas a ver algo así (transcripción real de un maratón miniatura corrido para este manual — 3 productos; el tuyo con 10 puede tomar varias vueltas):

Quedó en una sola vuelta:
- productos-mini.md: las 3 descripciones escritas, cero "PENDIENTE".
  Conteo verificado — todas dentro del rango, tono cálido de panadería.
- bitacora.md: creada con la línea de la vuelta 1.

Ojo con dos cosas de esa pantalla, que son lección: (1) con claude -p pelón NO ves el turno-por-turno en vivo — al final te suelta el resumen, y el paso-a-paso queda escrito en la bitácora (por eso el contrato la exige); (2) el maratón de este manual contestó con la voz de la constitución de la casa — headless también carga tu CLAUDE.md, tal como el módulo 5 te lo prometió.

Qué significa: --max-turns 15 es tu tope de vueltas; --allowedTools es tu zona acotada (solo puede leer, editar y crear archivos — nada de terminal libre ni internet); el /goal es tu criterio medible. Los tres candados del checklist, en una sola línea.

Si en vez de eso ves que se detiene ANTES de 15 sin terminar: revisa bitacora.md — seguramente chocó con algo que no podía hacer con las herramientas permitidas; ajusta el criterio o la lista de herramientas y reintenta.

🪤 AQUÍ SE ATORA LA GENTE

Síntoma: "Error: Input must be provided either through stdin or as a prompt argument when using --print" — ni siquiera arrancó.

Causa: el orden de la línea de comando importa. --allowedTools (y --disallowedTools) se comen TODO lo que sigue como si fueran más herramientas — si tu encargo entre comillas queda DESPUÉS de --allowedTools, se lo traga como si fuera una herramienta más, y no le queda ningún encargo que ejecutar. Se probó en vivo para este manual: exactamente ese error salió al poner --allowedTools antes del encargo.

Salida: el encargo (tu texto entre comillas, con o sin /goal) siempre PRIMERO, pegado a -p; --max-turns, --allowedTools y los demás flags, después — como quedó arriba, ya corregido.

  1. Mientras corre, ve por un café — no necesitas quedarte viendo la pantalla.
  1. Al terminar, abre bitacora.md completa (no solo el resultado final) y verifica TÚ el criterio: cuenta las palabras de al menos 2 descripciones a mano. No le creas al reporte — compruébalo.

Pasos — parte (b), la rutina de los lunes:

  1. Dentro de Claude Code, corre /schedule (sección 12.1) y descríbele: "cada lunes a las 8am, revisa ~/Curso-Claude y escribe un reporte corto de qué cambió esta semana."
  1. Confirma que quedó creada — Claude te va a decir cómo verla o borrarla si cambias de opinión.

¿LO LOGRASTE?

  • Existen las 10 descripciones y cumplen el criterio — lo comprobaste tú, no solo leíste el reporte.
  • Existe bitacora.md con el registro de cada vuelta.
  • El loop se quedó DENTRO de la zona de trabajo que le diste (nada se tocó fuera de esa carpeta).
  • Tu rutina de los lunes aparece creada y sabes cómo revisarla o cancelarla.
✓ ¿TE LO LLEVAS?
  1. ¿Cuál es la diferencia entre headless (claude -p) y un loop tipo Ralph?
  2. Nombra los 4 candados que llevaba tu maratón de hoy — ¿cuál te costó más trabajo escribir con precisión?
  3. Si tu maratón necesitara en algún punto mandar un correo o gastar dinero, ¿qué debería pasar?
📖 GLOSARIO

headless / claude -p — Claude sin conversación: como comando, para automatizar.

background task — encargo que corre en segundo plano mientras haces otra cosa.

/goal — meta medible: no para hasta cumplirla.

cron / rutina — reloj que dispara trabajo solo (los lunes a las 8…), sin que abras la sesión.

plugin — paquete instalable de comandos, skills o hooks hechos por otros.

Ralph loop — el becario incansable: loop que relanza al agente fresco contra el mismo encargo.

guardrail — candado de la autonomía: tope de gasto/vueltas, zona acotada, criterio medible.

🎓 CÓMO LO ENSEÑAS

La demo de 5 minutos: lanza EN VIVO un /goal chico y verificable (algo que termine en 2-3 vueltas frente al grupo) y deja que corra sin tocar nada — el silencio incómodo de "¿ya, o sigue solo?" es la demo. Cuando diga "Goal met", muestra la bitácora.

El error que el alumno VA a cometer: escribir un criterio de terminado que en realidad es una opinión ("que quede bien") y sorprenderse de que el loop no para o para mal. Capitalízalo: pídeles su primera versión del criterio EN VOZ ALTA, y que el grupo vote si se puede comprobar con un comando — casi siempre no, a la primera.

La pregunta de arranque: "si te vas a dormir y dejas a Claude trabajando solo toda la noche, ¿qué tendría que ser cierto para que despertaras tranquilo — no emocionado, tranquilo?"


Verificado contra documentación oficial el 2026-07-12.