计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
circuit-breaker-pattern【效率与协作】Implementa lógica de disyuntor para llamadas a herramientas de agentes — rastreando el estado de salud de las herramientas, transitando entre estados cerrado/abierto/semiabierto, reduciendo el alcance de la tarea cuando las herramientas fallan, enrutando a alternativas mediante mapas de capacidad, y aplicando presupuestos de fallos para prevenir la a…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Degradación elegante cuando las herramientas fallan. Un agente que llama a cinco herramientas y una está rota no debería fallar por completo — debería reconocer la herramienta rota, dejar de llamarla, reducir el alcance a lo que todavía es alcanzable, e informar honestamente sobre lo que se omitió. Esta habilidad codifica esa lógica utilizando el patrón de disyuntor de los sistemas distribuidos, adaptado a la orquestación de herramientas de agentes.
La perspectiva central, del "Problema del Fuego en la Cocina" de kirapixelads: el expeditor (capa de orquestación) no debe cocinar. La separación de responsabilidades entre decidir qué intentar y cómo intentarlo evita que el orquestador quede atrapado en el bucle de reintentos de una herramienta que falla.
Declarar qué proporciona cada herramienta y qué alternativas existen. Este mapa es la base para la reducción del alcance — sin él, un fallo de herramienta deja al agente adivinando qué hacer a continuación.
capability_map:
- tool: Grep
provides: content search across files
alternatives:
- tool: Bash
method: "rg or grep command"
degradation: "loses Grep's built-in output formatting"
- tool: Read
method: "read suspected files directly"
degradation: "requires knowing which files to check; no broad search"
fallback: "ask the user which files to examine"
- tool: Bash
provides: command execution, build tools, git operations
alternatives: []
fallback: "report commands that need to be run manually"
- tool: Read
provides: file content inspection
alternatives:
- tool: Bash
method: "cat or head command"
degradation: "loses line numbering and truncation safety"
fallback: "ask the user to paste file contents"
- tool: Write
provides: file creation
alternatives:
- tool: Edit
method: "create via full-file edit"
degradation: "requires file to already exist for Edit"
- tool: Bash
method: "echo/cat heredoc"
degradation: "loses Write's atomic file creation"
fallback: "output file contents for the user to save manually"
- tool: WebSearch
provides: external information retrieval
alternatives: []
fallback: "state what information is needed; ask user to provide it"
Para cada herramienta, documentar:
Esperado: Un mapa de capacidades completo que cubra cada herramienta que usa el agente. Cada entrada tiene al menos una alternativa manual, incluso si no existe alternativa de herramienta. El mapa hace explícito lo que normalmente es implícito: qué herramientas son críticas (sin alternativas) y cuáles son sustituibles.
En caso de fallo: Si la lista de herramientas no está clara, comenzar con allowed-tools del frontmatter de la habilidad. Si las alternativas son inciertas, marcarlas como degradation: "unknown — test before relying on this route" en lugar de omitirlas.
Configurar el rastreador de estado para cada herramienta. Cada herramienta comienza en estado CERRADO (saludable, operación normal).
Circuit Breaker State Table:
+------------+--------+-------------------+------------------+-----------------+
| Tool | State | Consecutive Fails | Last Failure | Last Success |
+------------+--------+-------------------+------------------+-----------------+
| Grep | CLOSED | 0 | — | — |
| Bash | CLOSED | 0 | — | — |
| Read | CLOSED | 0 | — | — |
| Write | CLOSED | 0 | — | — |
| Edit | CLOSED | 0 | — | — |
| WebSearch | CLOSED | 0 | — | — |
+------------+--------+-------------------+------------------+-----------------+
Failure budget: 0 / 5 consumed
Definiciones de estado:
Transiciones de estado:
Esperado: Una tabla de estado inicializada para todas las herramientas con estado CLOSED y conteos de fallos en cero. El umbral de fallos y el presupuesto se declaran explícitamente.
En caso de fallo: Si la lista de herramientas no puede enumerarse de antemano (descubrimiento dinámico de herramientas), inicializar el estado en el primer uso de cada herramienta. El patrón sigue aplicándose — simplemente se construye la tabla de forma incremental.
Cuando el agente necesita llamar a una herramienta, seguir esta secuencia de decisión. Esta es la lógica del expeditor — decide si intentar la llamada, no cómo ejecutarla.
ANTES de cada llamada a herramienta:
1. Verificar el estado de la herramienta en la tabla del disyuntor
2. Si está OPEN:
a. Verificar si es momento de un sondeo semiabierto
- Sí → transicionar a HALF-OPEN, proceder con llamada de sondeo
- No → omitir esta herramienta, enrutar a alternativa (Paso 4)
3. Si está HALF-OPEN:
a. Hacer una llamada de sondeo
b. Éxito → transicionar a CLOSED, reiniciar fallos consecutivos a 0
c. Fallo → transicionar a OPEN, incrementar presupuesto de fallos
4. Si está CLOSED:
a. Hacer la llamada normalmente
DESPUÉS de cada llamada a herramienta:
1. Éxito:
- Reiniciar fallos consecutivos a 0
- Registrar marca de tiempo del último éxito
2. Fallo:
- Incrementar fallos consecutivos
- Registrar marca de tiempo del último fallo y mensaje de error
- Incrementar presupuesto de fallos consumido
- Si fallos consecutivos >= umbral:
transicionar a OPEN
log: "Circuit OPENED for [tool]: [failure count] consecutive failures"
- Si presupuesto de fallos agotado:
PAUSAR — no continuar la tarea
Informar al usuario (Paso 6)
El expeditor nunca reintenta una llamada fallida inmediatamente. Registra el fallo, verifica los umbrales y continúa. Los reintentos ocurren solo a través del mecanismo de sondeo HALF-OPEN en un paso posterior.
Esperado: Un bucle de decisión claro que el agente sigue antes y después de cada llamada a herramienta. El estado de salud de las herramientas se rastrea continuamente. La capa del expeditor nunca se bloquea en una herramienta que falla.
En caso de fallo: Si rastrear el estado entre llamadas es impráctico (p.ej., ejecución sin estado), degradar a un modelo más simple: contar los fallos totales y pausar al alcanzar el presupuesto. El disyuntor de tres estados es ideal; un contador de fallos es el patrón mínimo viable.
Cuando el circuito de una herramienta está OPEN, consultar el mapa de capacidades (Paso 1) y enrutar a la mejor alternativa disponible.
Prioridad de enrutamiento:
Ejemplo de decisión de enrutamiento:
Herramienta necesaria: Grep (circuito OPEN)
Tarea: encontrar todos los archivos que contienen "API_KEY"
Ruta 1: Bash con comando rg
→ Degradación: pierde el formato de salida integrado de Grep
→ Decisión: ACEPTABLE — usar esta ruta
Si Bash también está OPEN:
Ruta 2: Leer archivos de configuración sospechosos directamente
→ Degradación: requiere adivinar qué archivos; sin búsqueda amplia
→ Decisión: PARCIAL — intentar solo rutas de configuración conocidas
Si Read también está OPEN:
Ruta 3: Preguntar al usuario
→ "Necesito encontrar archivos que contengan 'API_KEY' pero mis herramientas
de búsqueda no están disponibles. ¿Puede ejecutar: grep -r 'API_KEY' ."
→ Decisión: ALTERNATIVA — el usuario proporciona la información
Si el usuario no está disponible:
Ruta 4: Reducción del alcance
→ Eliminar "encontrar referencias a API key" del alcance de la tarea
→ Documentar: "OMITIDO: búsqueda de API key — no hay herramientas disponibles"
Esperado: Cuando el circuito de una herramienta se abre, el agente enruta transparentemente a una alternativa o degrada el alcance. La decisión de enrutamiento y cualquier degradación se documentan en la salida de la tarea para que el usuario sepa qué fue afectado.
En caso de fallo: Si el mapa de capacidades está incompleto (sin alternativas listadas), adoptar por defecto la reducción del alcance e informar. Nunca omitir trabajo silenciosamente — siempre documentar qué fue omitido y por qué.
Cuando las herramientas tienen el circuito abierto y las alternativas se han agotado, reducir la tarea a lo que todavía puede completarse con herramientas que funcionan. Esto no es un fracaso — es una gestión honesta del alcance.
Protocolo de reducción del alcance:
Informe de Reducción del Alcance:
Alcance original: 5 sub-tareas
[x] 1. Leer archivos de configuración (Read: CLOSED)
[x] 2. Buscar patrones obsoletos (Grep: CLOSED)
[ ] 3. Ejecutar suite de pruebas (Bash: OPEN — sin alternativa)
[x] 4. Actualizar documentación (Edit: CLOSED)
[ ] 5. Desplegar en staging (Bash: OPEN — sin alternativa)
Alcance reducido: 3 sub-tareas alcanzables
Diferidas: 2 sub-tareas requieren Bash (circuito OPEN)
Recomendación: Completar sub-tareas 1, 2, 4 ahora.
Las sub-tareas 3 y 5 requieren Bash — se sondeará en el próximo ciclo
o el usuario puede ejecutar los comandos manualmente.
No intentar las sub-tareas diferidas. No reintentar herramientas con circuito abierto esperando que funcionen. El disyuntor existe precisamente para prevenir esto — confiar en su estado.
Esperado: Una partición clara de la tarea en trabajo alcanzable y diferido. El agente completa todo el trabajo alcanzable e informa sobre los elementos diferidos con el motivo y qué los desbloquearía.
En caso de fallo: Si la reducción del alcance elimina todas las sub-tareas (cada herramienta está rota), saltar directamente al Paso 6 — pausar e informar. Un agente sin herramientas que funcionen no debería pretender hacer progreso.
Cuando una herramienta devuelve datos que pueden estar obsoletos (resultados en caché, instantáneas desactualizadas, contenido obtenido previamente), etiquetarlos explícitamente en lugar de tratarlos como frescos.
Indicadores de obsolescencia:
Protocolo de etiquetado:
Al presentar datos potencialmente obsoletos:
"[STALE DATA — retrieved at {timestamp}, may not reflect current state]
File contents as of last successful Read:
..."
"[CACHED RESULT — Grep returned identical results to previous call;
filesystem may have changed since]"
"[UNVERIFIED — WebSearch result from {date}; current status unknown]"
Nunca presentar silenciosamente datos obsoletos como actuales. El usuario o el agente posterior debe conocer la calidad de los datos para tomar decisiones sólidas.
Esperado: Todas las salidas de herramientas que pueden estar obsoletas llevan etiquetas explícitas. Los datos frescos no se etiquetan (el etiquetado se reserva para la incertidumbre, no para la confirmación).
En caso de fallo: Si la obsolescencia no puede determinarse (sin marcas de tiempo, sin línea base de comparación), anotar la incertidumbre: "[FRESHNESS UNKNOWN — no baseline for comparison]". La incertidumbre sobre la actualidad es en sí misma información.
Rastrear los fallos totales en todas las herramientas. Cuando el presupuesto se agota, el agente pausa e informa en lugar de continuar acumulando errores.
Aplicación del Presupuesto de Fallos:
Presupuesto: 5 fallos por ciclo
Actual: 4 / 5 consumidos
Fallo 1: Bash — "permission denied" (paso 3)
Fallo 2: Bash — "command not found" (paso 3)
Fallo 3: Bash — "timeout after 120s" (paso 4)
Fallo 4: WebSearch — "connection refused" (paso 5)
Estado: 1 fallo restante antes de la pausa obligatoria
→ La siguiente llamada a herramienta procede con mayor precaución
→ Si falla: PAUSAR y generar informe de estado
Al agotar el presupuesto:
FAILURE BUDGET EXHAUSTED — PAUSING
Completed work:
- Sub-task 1: Read configuration files (SUCCESS)
- Sub-task 2: Search for deprecated patterns (SUCCESS)
Incomplete work:
- Sub-task 3: Run test suite (FAILED — Bash circuit OPEN)
- Sub-task 4: Update documentation (NOT ATTEMPTED — paused)
- Sub-task 5: Deploy to staging (NOT ATTEMPTED — paused)
Tool health:
Grep: CLOSED (healthy)
Read: CLOSED (healthy)
Edit: CLOSED (healthy)
Bash: OPEN (3 consecutive failures — permission/command/timeout)
WebSearch: OPEN (1 failure — connection refused)
Failures: 5 / 5 budget consumed
Recommendation:
1. Investigate Bash failures — likely environment issue
2. Check network connectivity for WebSearch
3. Resume from sub-task 4 after resolution
La pausa e informe cumple la misma función que un disyuntor en sistemas eléctricos: previene que el daño se acumule. Un agente que sigue llamando herramientas rotas desperdicia la ventana de contexto, confunde al usuario con errores repetidos, y puede producir resultados parciales inconsistentes.
Esperado: El agente se detiene limpiamente cuando el presupuesto de fallos se agota. El informe incluye trabajo completado, trabajo incompleto, estado de salud de las herramientas y próximos pasos accionables.
En caso de fallo: Si el agente no puede generar un informe limpio (p.ej., el rastreo de estado se perdió), emitir la información disponible. Un informe parcial es mejor que la continuación silenciosa.
Verificar que la lógica de orquestación (Pasos 2-7) esté claramente separada de la ejecución de herramientas.
El expeditor (orquestación) hace:
El expeditor NO hace:
Si el expeditor está "cocinando" (haciendo llamadas a herramientas para solucionar otros fallos de herramientas), la separación está rota. El expeditor debería enrutar a una herramienta alternativa o reducir el alcance — no intentar reparar la herramienta rota.
Esperado: Un límite claro entre las decisiones de orquestación y la ejecución de herramientas. La capa del expeditor puede describirse sin referenciar APIs específicas de herramientas o tipos de error.
En caso de fallo: Si la orquestación y la ejecución están entrelazadas, refactorizar extrayendo la lógica de decisión en un paso separado que se ejecuta antes de cada llamada a herramienta. El paso de decisión produce uno de cuatro resultados: CALL, SKIP, PROBE o PAUSE. El paso de ejecución actúa sobre ese resultado.
Cuando múltiples herramientas comparten infraestructura (red, sistema de archivos, permisos), una única causa raíz puede disparar varios disyuntores simultáneamente. Detectar y manejar este patrón correlacionado en lugar de tratar cada disyuntor de forma independiente.
Indicadores de fallo en cascada:
Protocolo de respuesta:
Retroceso compuesto: Cuando los fallos en cascada se disparan, usar retroceso exponencial para las sondas semiabiertas: sondear en el paso 3, luego en el paso 6, luego en el paso 12. Limitar el intervalo máximo a 20 pasos para prevenir el bloqueo permanente del circuito. Esto evita sondas rápidas que abrumen un sistema en recuperación.
Esperado: Los fallos correlacionados se detectan y tratan como un único evento sistémico en lugar de N disparos de disyuntor independientes. El presupuesto de fallos cuenta el evento sistémico una vez, no N veces.
En caso de fallo: Si la detección de correlación es impráctica (los fallos tienen diferentes firmas de error a pesar de una causa compartida), recurrir a disyuntores independientes por herramienta. El sistema aún degrada elegantemente — simplemente consume el presupuesto más rápido.
Antes de activar el bucle del disyuntor (Paso 3), opcionalmente verificar que una herramienta está disponible y es probable que tenga éxito. Esto reduce los disparos innecesarios del disyuntor por fallos predecibles.
Verificaciones previas a la llamada:
| Verificación | Método | Acción al fallar |
|---|---|---|
| La herramienta existe | Verificar que está en la lista de allowed-tools | Omitir — ni siquiera intentar |
| Estado del servidor MCP | Verificar el estado del proceso/conexión del servidor | Enrutar a alternativa inmediatamente |
| Disponibilidad de recursos | Verificar que existe el archivo/URL/endpoint objetivo | Enrutar o degradar el alcance |
Tabla de decisión:
Puntuación previa a la llamada:
AVAILABLE → proceder al bucle del disyuntor (Paso 3)
DEGRADED → proceder con precaución, reducir el umbral de fallos en 1
UNAVAILABLE → omitir herramienta, enrutar a alternativa (Paso 4) sin consumir presupuesto
Las verificaciones previas a la llamada son orientativas, no autoritativas. Una herramienta que pasa las verificaciones previas puede aún fallar durante la ejecución. El disyuntor sigue siendo el mecanismo principal de fiabilidad.
Esperado: Los fallos predecibles (herramientas faltantes, servidores inalcanzables) se detectan antes de que consuman el presupuesto de fallos. El disyuntor maneja solo los fallos genuinos en tiempo de ejecución.
En caso de fallo: Si las verificaciones previas a la llamada no están disponibles o añaden demasiada sobrecarga, omitir este paso completamente. El bucle del disyuntor del Paso 3 maneja todos los fallos — la selección previa a la llamada es una optimización, no un requisito.
fail-early-pattern — patrón complementario: fail-early valida entradas antes de que comience el trabajo; circuit-breaker gestiona fallos durante el trabajoescalate-issues — cuando el presupuesto de fallos se agota o la reducción del alcance es significativa, escalar a un especialista o humanowrite-incident-runbook — documentar patrones recurrentes de fallos de herramientas como libros de ejecución para un diagnóstico más rápidoassess-context — evaluar si el enfoque actual puede adaptarse cuando múltiples herramientas están degradadas; se complementa con las decisiones de reducción del alcancedu-dum — arquitectura de dos relojes que separa la observación de la decisión; patrón complementario para reducir el costo de observación en bucles de agentes