Programación cron
Responsabilidad
Permite al agent «arrancarse solo a la hora fijada»: informes, backups, resúmenes, etc. sin que haya nadie presente. El subsistema cron/ ofrece planificador, almacenamiento de jobs, registro de ejecuciones, guardián de ciclo de vida, catálogo de blueprints/sugerencias y aislamiento independiente de toolsets (los jobs programados pueden desactivar herramientas para evitar acciones peligrosas sin supervisión). El gateway impulsa el planificador con un latido de 60s.
Archivos clave
def run_job:2659— núcleo de ejecución de un job_run_job_script / _run_job_script_with_claim_heartbeat:2113-2247— ejecución de job tipo script + latido de leaseestado de ejecución e interrupción:352-445—get_running_job_ids/mark_running_jobs_interrupted/_consume_interrupted_flagresolución de toolsets:143-210—_resolve_cron_disabled_toolsets/_resolve_cron_enabled_toolsets(aislamiento de herramientas para jobs programados)pools de hilos:501-547—_get_parallel_pool/_get_sequential_pool_CronStorePaths / _current_cron_store:106-157— rutas del almacenamiento de jobscerrojo y directorio de salida:251-360—_jobs_lock_file/_job_output_dir_normalize_job_record:426-461— normalización del registro de jobmáquina de estados de ejecución:99-156—create_execution/mark_execution_running/finish_executionrecover_interrupted_executions:156-213— recuperación tras crash +list_executions/latest_executioncheck_gateway_lifecycle:69-112— evita que scripts de cron toquen el ciclo de vida del gatewayblueprint_catalog— catálogo de blueprints de jobssuggestion_catalog/suggestions— generación de sugerencias de cron_start_cron_ticker:22335— latido de 60s en el gateway que impulsa la planificación
Flujo de datos
- El gateway arranca
_start_cron_ticker:22335, que dispara el planificador cada 60s. - El planificador lee el almacenamiento de jobs (
cron/jobs.py:106) y, según la expresión cron, selecciona los jobs vencidos. - Para cada job vencido:
check_gateway_lifecycle:112escanea el script para evitar que modifique el ciclo de vida del gateway- resuelve los toolsets del job (
cron/scheduler.py:210), normalmente desactivando herramientas peligrosas (misma idea que el auto-deny de los subagentes) - anota una ejecución en
create_execution(cron/executions.py:99) run_job(cron/scheduler.py:2659) corre: el tipo script va por_run_job_script:2113; el tipo conversación se entrega arun_conversation:588
- Si cae a mitad de la ejecución, la próxima vez
recover_interrupted_executions(cron/executions.py:156) recupera la marca. - El resultado se entrega vía el gateway (o se refleja a la plataforma indicada).
Resumen
El énfasis del subsistema cron está en la «seguridad sin supervisión»: aislamiento de toolsets, lifecycle_guard contra modificaciones accidentales, y máquina de estados de ejecución para recuperación tras crash. La planificación la impulsa el latido del propio gateway, sin necesidad de un demonio cron externo.