Cron — planification
Responsabilité
Permettre à l'agent de « tourner tout seul à l'heure » : rapports programmés, sauvegardes, briefings sans présence humaine. Le sous-système cron/ fournit un scheduler, un stockage des jobs, un historique d'exécution, un garde-fou du cycle de vie, un catalogue de blueprints / suggestions, ainsi qu'une isolation par toolsets dédiée (les jobs planifiés peuvent désactiver certains outils, pour éviter les actions dangereuses en mode sans surveillance). La passerelle pilote le scheduler via un heartbeat de 60 s.
Fichiers clés
def run_job:2659— cœur d'exécution d'un job_run_job_script / _run_job_script_with_claim_heartbeat:2113-2247— exécution de job script + heartbeat de bailétat d'exécution et interruption:352-445—get_running_job_ids/mark_running_jobs_interrupted/_consume_interrupted_flagrésolution toolsets:143-210—_resolve_cron_disabled_toolsets/_resolve_cron_enabled_toolsets(isolation d'outils pour les jobs planifiés)pool de threads:501-547—_get_parallel_pool/_get_sequential_pool_CronStorePaths / _current_cron_store:106-157— chemins de stockage des jobsverrous et répertoire de sortie:251-360—_jobs_lock_file/_job_output_dir_normalize_job_record:426-461— normalisation d'un enregistrement de jobmachine à états d'exécution:99-156—create_execution/mark_execution_running/finish_executionrecover_interrupted_executions:156-213— récupération post-crash +list_executions/latest_executioncheck_gateway_lifecycle:69-112— empêche les scripts cron de modifier par erreur le cycle de vie de la passerelleblueprint_catalog— catalogue de blueprints de jobssuggestion_catalog/suggestions— génération de suggestions cron_start_cron_ticker:22335— heartbeat 60 s dans la passerelle pilotant le scheduler
Flux de données
- La passerelle démarre
_start_cron_ticker:22335, qui déclenche le scheduler toutes les 60 s. - Le scheduler lit le stockage des jobs (
cron/jobs.py:106) et sélectionne les jobs dus selon l'expression cron. - Pour chaque job dû :
- passage par
check_gateway_lifecycle:112qui scanne le script, pour empêcher toute modification du cycle de vie de la passerelle - résolution des toolsets du job (
cron/scheduler.py:210), avec désactivation usuelle des outils dangereux (même approche que l'auto-deny du sous-agent) - enregistrement d'une exécution dans
create_execution(cron/executions.py:99) run_job(cron/scheduler.py:2659) exécute réellement : script →_run_job_script:2113, conversation → alimenterun_conversation:588
- passage par
- Crash en cours d'exécution → la prochaine exécution de
recover_interrupted_executions(cron/executions.py:156) récupère le marquage. - Le résultat est livré via la passerelle (ou mirroré vers une plateforme donnée).
Résumé
Le point clé du sous-système cron est « la sécurité en mode sans surveillance » : isolation des toolsets, lifecycle_guard contre les fausses manœuvres, machine à états d'exécution pour la récupération post-crash. Le scheduling lui-même est piloté par le heartbeat de la passerelle, sans daemon cron externe requis.