No gestionas a un empleado dándole instrucciones por mensaje uno a la vez. Le das un contrato, un período de prueba y una forma de medir si sigue valiendo el sueldo. Fable 5 merece el mismo trato.
Este es el problema. Fable 5 puede funcionar durante horas sin ti, crear sus propios subagentes y terminar una semana de trabajo atrasado en una noche. También cuesta dinero real por token, da resultados por encima de lo esperado en cuanto dejas el alcance abierto y defenderá una respuesta incorrecta mejor que la mayoría de los humanos defiende una correcta.
Sin gestión, es una forma costosa de producir tonterías con confianza. Con un contrato, es lo más parecido a un empleado a tiempo completo que puedes tener por unos pocos dólares al día.
Ese es este contrato. No la teoría. Los archivos reales, en el orden en que los escribes, construidos alrededor de un despliegue real: los bots de monitoreo que ya ejecuto en un VPS en París a través de pm2. Los flujos de autenticación y las tablas de facturación no son mi superficie de ataque. Las claves RPC, las direcciones de billetera y las transacciones en vivo de blockchain sí lo son. El sistema a continuación está construido para eso, no para un repositorio SaaS genérico.
Cinco secciones. Cada una entrega un archivo. Tiempo total de configuración: menos de dos horas.
La Configuración
1claude CLI (Claude Code) con acceso a Fable 5 # créditos de uso, con tope2llm CLI + clave de OpenRouter # para los modelos baratos3jq, git, pm2, cron4un VPS con los bots ya ejecutándose
Con lo que terminas:
1agent-contract/2 CONTRACT.md # Sección 1: los términos de empleo3 ops/4 shift.sh # Sección 3: el turno diario5 dispatcher.md # prompt de enrutamiento, solo Fable6 intake.md # lector barato, lee los registros primero7 worker.md # modelo barato, hace el tecleo8 reviewer.md # Fable nuevo, revisa el trabajo9 boundaries.md # Sección 2: lo que puede y no puede tocar10 guardrails/signoff.sh # Sección 2: el sí/no determinista11 personnel/12 trust.tsv # Sección 4: quién se ha ganado la autonomía13 standing-checks/ # Sección 4: cosas que deben seguir siendo ciertas14 incidents/15 log.tsv # Sección 5: qué se rompió y cuándo16 runbook.md # Sección 5: qué hacer al respecto17 Makefile
Una regla citable antes de empezar, porque marca el tono de todo lo que sigue:
Un agente que califica su propia tarea es un agente que se da un aumento a sí mismo.
Nada en este sistema revisa su propio trabajo. Ni una vez.
Sección 1: El Contrato (CONTRACT.md)
Un contrato de empleado no es una lista de sugerencias. Son números, límites estrictos y cláusulas que se aplican sin importar si el empleado está de acuerdo o no. Escribe este archivo de la misma manera. Sin "por favor" o "intenta". Un modelo optimiza alrededor del lenguaje suave de la misma manera que un becario optimiza alrededor de un gerente que nunca revisa.
1# CONTRACT.md23## LÍMITES ESTRICTOS (sin excepciones, no se pregunta dos veces)4- Nunca toques claves de billetera, archivos .env o credenciales RPC sin aprobación.5- Nunca hagas push de un cambio a un proceso de bot en vivo (pm2 restart) sin una aprobación superada.6- Nunca superes las 150 líneas cambiadas en un solo commit sin preguntar primero.7- Nunca afirmes que una tarea está terminada basándote en tu propia lectura del resultado.8 Terminado significa que el script de aprobación devolvió 0. Nada más cuenta.9- Nunca inventes un endpoint de API, una dirección de contrato o un valor de configuración.10 Si no está en el repositorio, detente y pregunta.11- Nunca añadas una nueva dependencia. Escríbelo en ops/shift-log.md y detente ahí.12- Nunca edites o elimines una prueba, un umbral de alerta o una condición de monitor para hacer13 que algo pase. Eso no es una solución. Eso es fraude.14- Nunca operes con un esfuerzo superior a "alto" dentro de un turno. "xhigh" es para revisiones15 únicas que activas manualmente, nunca para el bucle automatizado.16- Nunca narres o expliques tu razonamiento interno en una respuesta. Se lee17 como servicial. En Fable 5 puede activar un clasificador de rechazo en su lugar.1819## ENRUTAMIENTO DE TRABAJO (quién hace qué, gana el contratista más barato y capaz)20| modelo | costo por tarea | ambición | juicio | gusto |21|-----------------|-----------------|----------|--------|-------|22| claude-fable-5 | alto | bajo | 10 | 10 |23| claude-opus-4-8 | medio | medio | 8 | 9 |24| claude-sonnet-5 | bajo | alto | 7 | 7 |25| trabajador OSS barato | más bajo | más alto | 5 | 4 |26271. Decidir qué hacer a continuación, revisar un diff, desempatar -> Fable 5,28 solo lectura, alto esfuerzo.292. Leer registros sin procesar, volcados o cualquier cosa de más de 50k tokens -> el trabajador barato.30 Nunca Fable. Eso es pagar la tarifa de un director para leer una hoja de cálculo.313. Cualquier cosa con la que un usuario o una cadena interactúe directamente -> necesita una puntuación de gusto32 de 8 o superior antes de enviarse.334. Todo lo demás -> sonnet-5, esfuerzo medio, sube un nivel en caso de error.3435## DEFINICIONES36- "juicio" = puede manejar lo más difícil del escritorio sin supervisión37- "terminado" = el script de aprobación salió con 0, punto final38- "pequeño" = menos de 50 líneas cambiadas39- "limpieza" = el comportamiento es bit a bit idéntico, aprobación verde antes y después4041## LA ÚNICA DEFINICIÓN DE TERMINADO QUE CUENTA42- Cada tarea tiene una línea de meta comprobable por máquina antes de que comience el trabajo.43- Un revisor que no ha visto ni el plan ni el borrador lo comprueba.44- guardrails/signoff.sh tiene el voto final. No el revisor. El script.45- Si el trabajador y el revisor no están de acuerdo dos veces seguidas, pasa a un humano.46 Sin tercera opinión, sin modelo de desempate.
Cambia por tus propios números. Cualquier cosa que dejarías pasar el 80% de las veces y aún llamarías "terminado" necesita un número o un "nunca" adjunto, o elimínalo.
Sección 2: Límites y la Aprobación
Un contrato de empleado no significa nada sin una verificación de antecedentes sobre lo que se les permite tocar, y un gerente que apruebe antes de que algo se envíe. Dos archivos.
ops/boundaries.md:
1## trabaja solo2redactar correcciones en una rama; actualizar shift-log.md; reiniciar una instancia de prueba3*no productiva*; marcar feeds de datos obsoletos45## necesita mi firma6cualquier cosa bajo wallets/, .env*, config/rpc.json; cualquier diff de más de 300 líneas;7cualquier cambio a un proceso pm2 en vivo; cualquier cosa que envíe una transacción89## me despierta inmediatamente10el revisor falla la misma corrección dos veces; el enrutador sirvió un modelo diferente11al solicitado; el gasto diario cruzó la línea; una verificación permanente se pone roja;12cualquier cosa pide una clave privada
ops/guardrails/signoff.sh (edita los comandos para que coincidan con tus bots):
1#!/usr/bin/env bash2set -e3npm run typecheck --if-present4npm test --if-present5pm2 describe "$BOT_NAME" | grep -q "status.*online" || exit 1
Ejecútalo una vez manualmente antes de que cualquier otra cosa en este sistema se ponga en marcha. Si no pasa limpio en tu configuración actual, esa es la primera tarea real. Todo lo que sigue asume que este script dice la verdad.
Sección 3: El Turno
Aquí están las matemáticas que lo hacen funcionar o lo rompen. Una sesión completa con Fable 5 haciendo el tecleo se convierte rápidamente en dinero real, cuatro cifras si lo dejas escribir durante horas. Fable 5 tomando las decisiones mientras un modelo barato hace el tecleo es una cuenta completamente diferente, aproximadamente el 15-20% de los tokens por el 100% de las decisiones.
Así que el turno tiene cuatro contrataciones, no una:
- Un modelo casi gratuito lee los registros nocturnos y la salida de pm2. Dice "tranquilo" o "accionable". Eso es todo.
- Fable 5, solo lectura, decide la única cosa de mayor valor para hacer y escribe una orden de trabajo. No toca el código.
- Un modelo de trabajador barato ejecuta la orden de trabajo en una rama aislada.
- Una instancia nueva de Fable 5, viendo solo la especificación y el diff, vota pasar o fallar.
El script determinista de la Sección 2 emite el voto de desempate. Cada vez.

ops/shift.sh:
1#!/usr/bin/env bash2set -euo pipefail3cd "$(dirname "$0")"4DAILY_BUDGET="${DAILY_BUDGET_USD:-5}"5INTAKE_MODEL="${INTAKE_MODEL:-openrouter/deepseek/deepseek-v4-flash}"6WORKER_MODEL="${WORKER_MODEL:-openrouter/moonshotai/kimi-k2.6}"78# 1. INTAKE, pennies9pm2 logs --lines 100 --nostream | llm -m "$INTAKE_MODEL" -s "$(cat intake.md)" \10 >> shift-log.md11grep -q "status: actionable" shift-log.md || { echo "quiet shift"; exit 0; }1213# 2. DISPATCH, Fable, xhigh, read-only, decides and stops14claude -p "$(cat dispatcher.md)15LOG: $(cat shift-log.md)16TRUST: $(cat personnel/trust.tsv)17BOUNDARIES: $(cat boundaries.md)" \18 --model claude-fable-5 --effort xhigh --allowedTools "Read" \19 --output-format json > /tmp/order.json2021SERVED=$(jq -r '.modelUsage | keys[0] // "claude-fable-5"' /tmp/order.json)22[[ "$SERVED" != *fable* ]] && { echo "rerouted, discard this run" >> shift-log.md; exit 2; }2324jq -r '.result' /tmp/order.json > work-order.json25ACTION=$(jq -r .action work-order.json)26[[ "$ACTION" == "stop" ]] && exit 027[[ "$ACTION" == "queue" ]] && { echo "queued for signature" >> shift-log.md; exit 0; }2829# 3. EXECUTE, cheap worker, isolated branch30BR="shift-$(date +%s)"31git worktree add "../$BR" -b "$BR" >/dev/null32( cd "../$BR" && llm -m "$WORKER_MODEL" -s "$(cat "$OLDPWD/worker.md")" \33 "$(cat "$OLDPWD/work-order.json")" > shift-notes.md )3435# 4. REVIEW, fresh Fable, spec and diff only, nothing else36VERDICT=$(claude -p "$(cat reviewer.md)37SPEC: $(jq -r .spec work-order.json)38DIFF: $(cd "../$BR" && git diff)" \39 --model claude-fable-5 --effort high --allowedTools "" \40 --output-format json | jq -r .result)4142# 5. THE ONLY VOTE THAT SHIPS ANYTHING43if [[ "$VERDICT" == PASS* ]] && ( cd "../$BR" && "$OLDPWD/guardrails/signoff.sh" ); then44 echo "PASS, shipped or queued per trust tier" >> shift-log.md45else46 echo "FAILED: $BR held for review" >> shift-log.md47fi
Una decisión tomada por Fable y una línea de código tecleada por Fable son dos precios diferentes. Solo paga el más alto por la decisión.
Sección 4: El Archivo Personal
La confianza no es una configuración para toda la empresa. Se gana por tarea, de la misma manera que no le darías a un nuevo empleado las claves de producción el primer día, sin importar lo bueno que fuera su portafolio.
personnel/trust.tsv rastrea cada trabajo recurrente por nombre: ejecuciones, pases, nivel actual.
- vigilado: menos de 10 ejecuciones, o menos del 90% de tasa de aprobación. Solo borradores, sin excepciones.
- prueba: 10-19 ejecuciones al 90%+. En cola para tu firma, cada vez.
- autorizado: 20+ ejecuciones al 95%+. Se envía sin ti.

Un error en una tarea autorizada no recibe una advertencia. Vuelve directamente a prueba y se imprime en stderr, que tu cron te envía por correo. La degradación automática es la única que realmente funciona.
La segunda mitad del archivo personal es personnel/standing-checks/. Cada trabajo terminado se gradúa aquí como un comando que debe seguir devolviendo verdadero, para siempre, verificado una vez al día:
1# personnel/standing-checks/bankr-claim-monitor.md2predicate: pm2 describe bankr-claim-monitor | grep -q "status.*online" && \3 sqlite3 claims.db "select count(*) from claims where ts > strftime('%s','now','-1 day')" | grep -qv "^0$"4last-verified: 2026-07-085on-violation: wake me, do not auto-restart blind
Una tarea que solo verificaste una vez no está terminada. Es una suposición con una marca de tiempo.
Ejecuta la verificación diariamente a través de cron. Un predicado fallido significa que algo que solía ser cierto dejó de serlo, en silencio, y nadie se habría dado cuenta sin este archivo.
Sección 5: El Informe de Incidentes
Esta es la sección que los manuales originales omiten, y es la que realmente importa una vez que el sistema está en vivo en una infraestructura que mueve dinero real. Cada sistema de agente eventualmente hace algo que no querías. La pregunta es si te enteras por un registro limpio o por una billetera vacía.
ops/incidents/runbook.md:
1| señal | significado | haz esto2|----------------------------------|---------------------------------------|--------3| salida 2 (redirigido) | un modelo diferente sirvió la solicitud | desecha la salida, nunca construyas sobre ella, reintenta mañana4| stop_reason: refusal | el clasificador de seguridad rechazó, HTTP 200 | no es un error, verifica el registro; si una tarea se rechaza repetidamente, la tarea probablemente está tocando algo que no debería5| la aprobación falla dos veces, misma corrección | el trabajador y el revisor no pueden converger | pásalo a una revisión humana, no reintentes una tercera vez automáticamente6| la verificación permanente se pone roja | algo terminado dejó de ser cierto | verifica la fecha de última verificación, compara lo que se envió desde entonces, no hagas reversión automática7| el gasto diario cruza la línea | presupuesto excedido | detén el turno, lee shift-log.md, encuentra qué etapa se disparó8| una tarea toca wallets/.env/rpc | intento de violación de límites | parada dura, esto nunca debería activarse si boundaries.md se respeta, trata cualquier ocurrencia como un error en el sistema mismo
Registra cada uno de estos en incidents/log.tsv con una marca de tiempo, ya sea que hayas actuado o no. El objetivo no es cero incidentes. Es cero incidentes de los que te enteres demasiado tarde.
Una vez a la semana, haz una pasada de compostaje: lee el registro de incidentes, las degradaciones del archivo de confianza y cualquier cosa que haya permanecido en cola y sin firmar durante más de 3 días. Extrae como máximo tres propuestas: un nuevo límite estricto para CONTRACT.md, una corrección a una descripción de trabajo, o una verificación permanente que te faltaba. Apruebas las tres manualmente. El sistema puede proponer su propia próxima regla. Nunca puede escribir una.
Calendario de Prueba
Tres hitos, no treinta días de cuidado de bebé:

Hito 1. Ejecuta el turno manualmente a diario durante una semana. Lee cada línea. Graduado cuando tres turnos seguidos se enrutan exactamente como lo habrías hecho tú.
Hito 2. Cron se hace cargo del turno. Revisas la cola con un café en lugar de ejecutarlo tú mismo. Graduado cuando dos trabajos recurrentes cruzan las 20 ejecuciones registradas.
Hito 3. Tu trabajo de mejor rendimiento se envía sin supervisión. Graduado cuando funciona una semana completa sin ninguna intervención tuya.
Las Reglas, Comprimidas
- Un contrato es un número o un nunca. Cualquier cosa más suave se optimiza.
- El despachador decide. El trabajador teclea. Ninguno revisa su propio trabajo.
- El juicio de Fable vale el precio. El tecleo de Fable generalmente no.
- La confianza es por trabajo, no para toda la empresa, y la degradación es automática y ruidosa.
- Una tarea terminada que no se vuelve a verificar no está terminada, es una suposición con una fecha.
- Los límites viven en un archivo que puedes leer en diez segundos, no en tu memoria.
- El registro de incidentes existe para que encuentres problemas de un informe, no de un saldo.
- Nunca construyas sobre la salida de un modelo que no pediste.
- Una vez a la semana, el sistema puede proponer una nueva regla. Tú sigues siendo quien la firma.
El modelo nunca fue la parte difícil. Construir algo a su alrededor que se mantenga honesto cuando nadie mira, ese es el verdadero trabajo. Esto es lo que parece para una flota de bots en lugar de una base de código.
Comienza con guardrails/signoff.sh. Ejecuta un turno manualmente. Escribe una verificación permanente para el último bot que enviaste. La primera vez que detecte algo que estabas seguro de que estaba bien, el resto de esto deja de ser opcional.
Sigue a @GipArcAI para más de estos análisis, y encuéntrame en X en https://x.com/gippp69.





