Ejecución desatendida
El operador se ausenta; una cola se procesa. Cada elemento se ejecuta en un proceso independiente sin interfaz gráfica, por lo que un límite de uso o un fallo cuesta una iteración, no toda la noche. El estado reside en disco en la carpeta de la ejecución; la salida del proceso reemplaza /clear. Los hechos indicadores para claude -p están en la habilidad headless-claude.
Configuración y perfil del repositorio. <repo>/.claude/project-workflow.json es opcional; esta habilidad lee sus claves projects_dir (por defecto my-projects), profile (por defecto <projects_dir>/WORKFLOW.md), backlog_file (por defecto <projects_dir>/backlog.md) y bootstrap (una lista de argumentos, o nulo). Lea la sección § Ejecución desatendida del perfil si el archivo existe: comandos de prueba, fuentes de descubrimiento, clases permitidas automáticamente. Cuando el perfil y esta habilidad difieran, gana el perfil.
Fases: cargar un archivo al entrar en su fase
| Fase | Quién | Lectura |
|---|---|---|
| armar | operador presente | § Armar a continuación, luego discover.md para construir la cola |
| iteración | away-orchestrator, uno por proceso | iteration.md |
| estado, desarmar | operador | § Estado, § Desarmar a continuación |
project-workflow y away-run comparten archivos (el archivo de trabajo pendiente, <projects_dir>/proposals/open/), no llamadas, excepto una: una fila project invoca /project-workflow a través de la herramienta Skill en modo desatendido.
Una oleada de proyecto abarca varias filas project, un grupo de pasos de § Forma de la sesión de wave.md cada una (1; 2-3; 4-7). Cada fila trabaja desde los nombres de ## Reanudar hasta el final de su grupo, confirma chore(<NNNN>): checkpoint wave N at step <n>, y añade la fila de continuación para el siguiente paso a menos que se haya alcanzado el límite. Una fila añade una, attempts 0, solo si completó al menos un paso; una fila que no completó ninguno permanece claimed y reintenta por su cuenta attempts. Esto termina: cada fila de continuación sigue al menos uno de los siete pasos de la oleada, y el límite de intentos termina un paso que nunca se completa. El punto de control y ## Reanudar son la única transferencia (iteration.md § 3).
Disposición
<repo>-worktrees/away-<date>/ árbol de trabajo, rama away/<date> desde main
<carpeta de ejecución>/ rastreada en away/<date>; arm.ps1 -RunFolder,
queue.md decisions.md log.md por defecto <projects_dir>/away/<date>/
morning-report.md escrito por la iteración de cierre
<repo>-worktrees/away-<date>-run/ temporal, no rastreado: away.env, watchdog.sh,
entry-prompt.md, watchdog.log, iter-NNN.*, bloqueos
tarea programada away-<repo>-<date> cada 15 minutos hasta la parada forzosa
Filas de la cola
templates/queue.md contiene el esquema. Columnas: id | item | agent | status | claimed_by | lease_until | attempts | evidence. agent es mechanical-worker, stream-worker, researcher, project o discover. Cada edición de la cola toma el bloqueo: mkdir <scratch>/queue.lock (atómico; si falla, reintenta cada 10 s durante 2 minutos; una carpeta de bloqueo con última modificación de hace más de 10 minutos está obsoleta, con o sin su archivo owner: elimínela), edite, rm -rf el bloqueo. Lo que sigue a un reintento fallido de 2 minutos está en iteration.md § 2 y § 4. Una reclamación establece claimed_by en la etiqueta de reclamación de la iteración (iter-NNN, exactamente como la da el mensaje de entrada) y lease_until; una concesión caducada significa una iteración muerta y la fila se puede reclamar de nuevo, attempts + 1.
Armar (operador presente)
- Cola. Constrúyala con
discover.md: solo filas de nivel 1, cada una con una verificación con nombre. El trabajo de nivel 2 se convierte en propuestas. Nombre el valor predeterminado para cada decisión que una fila pueda encontrar; una fila con una decisión abierta y sin valor predeterminado no se pone en cola. - Postura. Diga claramente: la ejecución usa
--permission-mode bypassPermissions, por lo que cada llamada de herramienta se ejecuta sin aviso; las reglas de denegación global aún se aplican. "Sin compuertas" (las preguntas abiertas se convierten en valores predeterminados con nombre, los fallos se saltan y reintentan) es optativo por ejecución, establecido comogates: noneen el encabezado de la cola; nunca se infiere de una ejecución anterior. - Armar. Simulación primero, luego real, desde PowerShell:
powershell -NoProfile -File <skill>/arm.ps1 -Repo <path> -StopAt "<YYYY-MM-DD HH:MM>" -Queue <queue.md> -WhatIf. Crea el árbol de trabajo enaway/<date>desdemain, siembra la carpeta de ejecución desdetemplates/y la confirma con la cola, ejecuta elbootstrapargv de la configuración ({worktree}reemplazado por la ruta del árbol de trabajo, cwd el checkout principal; se omite si la clave está ausente o es nula) y espera a que termine, copiawatchdog.shyentry-prompt.mdal área temporal, escribeaway.env, y registra la tarea (Register-ScheduledTask, nuncaschtasks /Create: PowerShell 5.1 estropea las comillas de/TR). Un bootstrap con código de salida distinto de cero se rechaza antes de que exista cualquier tarea; el árbol de trabajo y la rama permanecen para inspección. La tarea no tiene principal, por lo que se ejecuta solo mientras el operador ha iniciado sesión, en una ventana de consola que al cerrarla se mata: bloquee la pantalla, no cierre sesión. - Verificar.
Get-ScheduledTask -TaskName 'away-*'muestra la tarea; el primer disparo escribewatchdog upenwatchdog.log. - Ediciones posteriores de la cola. arm.ps1 confirma la cola una vez. Confirme cualquier edición de la cola realizada después del armado en
away/<date>usted mismo (bajo el bloqueo de la cola una vez que la tarea se ha disparado): las iteraciones tratan el trabajo no confirmado que no hicieron como si fuera de otro y nunca lo preparan.
Qué hace el vigilante (watchdog.sh)
- Lanza
claude -p --agent away-orchestrator --max-turns N, aviso en la entrada estándar. El modelo y el esfuerzo provienen del frontmatter del agente; sin--effort, sin indicador TTL, sin--disable-slash-commands(deshabilitaría Skill). - Juzga una iteración por
is_error/api_error_statusy siqueue.mdcambió, nunca pornum_turns. Tres iteraciones sin cambio en la cola la terminan. - Límite de uso: espera hasta el restablecimiento que el mensaje indica. "Ha alcanzado su límite de Opus" continúa en Sonnet (
--model sonnet) solo para filasmechanical-worker; sin ninguna reclamable, espera hasta el restablecimiento. - Superación de presupuesto (
subtypeerror_max_budget_usd, kindbudget): sin espera, ya que el límite es por proceso. Mantiene la reclamación de la fila, por lo que la siguiente iteración toma la siguiente fila y esta regresa cuando su concesión caduca; las superaciones cuentan paraFAIL_MAXcomo los errores. - Reserva de cuota: con un gasto imputado de
WINDOW_CAP_USDen una ventana móvil de 5 horas, espera hasta que la ventana se libere; los últimosRESERVE_MINminutos se destinan al cierre. - Cola vacía: una iteración de cierre escribe el informe matutino, luego sale. Cualquier otra salida deja un informe breve escrito por el vigilante. Cada salida escribe
STOP, por lo que los disparos posteriores de la tarea no hacen nada; elimínelo para reanudar. - Después de cada iteración de elemento, cancela las concesiones mantenidas bajo la etiqueta de reclamación de esa iteración, por lo que una fila interrumpida por un límite o error se reintenta, no queda varada hasta el cierre. Omite esto después del cierre, que no reclama nada, y después de una superación de presupuesto (arriba).
- Registra
claude: <ruta>al inicio de cada iteración: el binario que está a punto de ejecutar. - Se niega a ejecutarse en
main, en un checkout de main, o en una rama que no seaaway/*. - Ejecución de prueba:
CLAUDE=<script simulado> AWAY_NO_SLEEP=1 bash watchdog.sh <away.env>contra un árbol de trabajo temporal enaway/*; las esperas se registran, no se toman. UnCLAUDEoPYestablecido en el entorno prevalece sobre el que nombraaway.env, por lo que el simulacro se ejecuta incluso con unaway.envescrito por el armado; confirme por la línea de registroclaude: <simulacro>.
Estado
Vea el final de <scratch>/watchdog.log; lea queue.md. Antes de confiar en "otro vigilante está activo", confirme un proceso claude.exe (tasklist) y una línea reciente iteration N starting: un bloqueo huérfano estaciona cada disparo en silencio. Git Bash no tiene pgrep.
Desarmar
powershell -NoProfile -File <skill>/disarm.ps1 -Repo <path> -Date <date>: escribe STOP, anula el registro de la tarea y verifica que Get-ScheduledTask -TaskName 'away-*' no devuelva nada. Una tarea que permanece registrada sigue generando bash cada 15 minutos. El árbol de trabajo y la rama permanecen para revisión: lea el informe matutino, luego fusione away/<date> por la ruta habitual del repositorio, o elimínelo.
Por qué está construido de esta manera
- La resiliencia reside fuera del CLI.
CronCreate durable:truevolvió solo para la sesión (2026-09-19);/loopreingresa la misma sesión; unnohup … &desde una llamada de herramienta Bash tiene como padre a ese shell; Git Bash no tienesetsid. - Un límite de uso se espera hasta el restablecimiento que sus mensajes indican, no mediante una retirada creciente, y una iteración nunca se juzga fallida por un
num_turnsbajo: una retirada excede el restablecimiento, y una iteración puede cerrar una fila en un turno informado.