Después de cada iteración del maker, comparar el hash del output file:
INITIAL_HASH=$(shasum -a 256 ~/MD-HTML/output.md 2>/dev/null || echo "NEW_FILE")
CURRENT_HASH=$(shasum -a 256 ~/MD-HTML/output.md)
if [ "$INITIAL_HASH" = "$CURRENT_HASH" ]; then
NO_PROGRESS_COUNT=$((NO_PROGRESS_COUNT + 1))
else
NO_PROGRESS_COUNT=0
INITIAL_HASH=$CURRENT_HASH
fi
if [ $NO_PROGRESS_COUNT -ge 5 ]; then
echo "STALLED: No progress in 5 iterations"
# Actualizar admp_triage: status='stalled', checker_notes='No progress detected'
exit 1
fi
Opción B — Vía el config de Hermes Agent:
iteration:
no_progress_threshold: 5 # Iteraciones sin cambio en el output → stall
no_progress_window: "files" # Qué monitorear: "files", "tool_results", "all"
Opción C — Vía el cron watchdog (ya cubierto en el SOP de Loop Engineering):
hermes cron create "0 /2 " \
"Revisá la sheet admp_triage. Items con status='in_progress' hace más de 2 horas,
y cuyo output_file no cambió de hash en la última hora → marcar stalled." \
--name "No-Progress Watchdog" \
--skill admp-triage-loop \
--deliver telegram
La regla de oro del no-progress detection: Si un agente autónomo pasó 5 iteraciones sin modificar el archivo de output, no va a modificarlo en la iteración 6. Lo que va a hacer en la iteración 6 es gastar más tokens. Cortalo.
### Defensa 3: Dollar Budget Ceiling
Esta es la que Uber no tenía cuando quemó su presupuesto anual de AI en 4 meses. Un cap de iteraciones frena el loop por cantidad de tool calls. Un dollar budget frena el loop por plata gastada — que es lo que realmente te importa.
Hermes Agent tiene iteration_budget:
class IterationBudget:
def __init__(self, max_total: int):
self.max_total = max_total
self._used = 0
def consume(self) -> bool:
# Retorna False si se acabó el presupuesto
...
@property
def remaining(self) -> int:
return max(0, self.max_total - self._used)
Pero iteration_budget es un cap de iteraciones, no de dólares. Para un dollar budget real, necesitás una capa extra:
Implementación de dollar budget en el loop:
mkdir -p ~/.hermes/skills/budget-guard
cat > ~/.hermes/skills/budget-guard/SKILL.md
When to Activate
Al inicio de cada ciclo del loop orquestador, ANTES de delegar sub-agentes.
Procedimiento
### 1. Leer estado actual del presupuesto
- Consultar la sheet admp_triage, columna daily_token_usage y monthly_token_usage.
- Si no existen, inicializar en 0.
### 2. Estimar costo de la tarea pendiente
- Multiplicar selected_output por un factor de complejidad:
- sop → ~15,000 tokens → ~USD 0.045
- articulo → ~8,000 tokens → ~USD 0.024
- investigacion → ~30,000 tokens → ~USD 0.09
### 3. Decidir
- Si daily_token_usage + estimado > daily_limit → NO ejecutar. Marcar item como budget_blocked.
- Si monthly_token_usage + estimado > monthly_limit → NO ejecutar. Notificar por Telegram.
- Si hay presupuesto → ejecutar. Después actualizar daily_token_usage y monthly_token_usage.
### 4. Reportar
- Al final de cada día, calcular total gastado y reportar por Telegram:
"📊 Budget Report: USD X.XX gastados hoy (límite: USD Y.YY). Mensual: USD Z.ZZ / USD M.MM."
Pitfalls
La estimación es aproximada. El costo real puede variar ±30%.
Si el presupuesto diario se agotó, los items quedan para mañana. No forzar.
Configuración recomendada de dollar budget:
`yaml
budget:
daily_limit_usd: 5.00 # Un loop autónomo no debería gastar más de USD 5/día
monthly_limit_usd: 50.00 # USD 50/mes es generoso para un loop de contenido
alert_at_percent: 80 # Notificar cuando llegás al 80% del límite mensual
hard_stop: true # true = frenar todo. false = solo notificar.
La regla de producción: El dollar budget no es una sugerencia. Es un kill-switch. Si el loop llega al límite, frena. No "termina esta tanda y frena." Frena ya. La diferencia entre "terminar esta tanda" y "frenar ya" es lo que separa un sobrecosto de USD 12 de un sobrecosto de USD 340.