mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-10 13:31:38 +00:00
A finite one-shot cron job whose side effect kills the tick (gateway suicide, OOM, segfault, hard-timeout) re-fired forever: mark_job_run — which increments repeat.completed and removes the job — runs AFTER the job, so an abrupt tick death never records completion and every supervisor relaunch re-dispatches the job (#38758). Commit the dispatch BEFORE the side effect: - claim_dispatch() increments repeat.completed under the cross-process jobs lock and persists it before run_job(), converting finite one-shots from at-least-once to at-most-times. - Called from run_one_job (the shared body used by BOTH the built-in ticker and the external Chronos fire_due path) before run_job. - mark_job_run skips the increment for pre-claimed one-shots (no double-count) and still removes at the limit. - get_due_jobs drops a stale one-shot already at its dispatch limit so a job claimed-but-not-cleaned-up after a crash stops appearing as due. - No-op for recurring jobs (advance_next_run) and infinite/no-repeat one-shots; a handed-in job dict absent from the store proceeds. Closes #38758 |
||
|---|---|---|
| .. | ||
| __init__.py | ||
| conftest.py | ||
| test_blueprint_catalog.py | ||
| test_claim_job_for_fire.py | ||
| test_codex_execution_paths.py | ||
| test_compute_next_run_last_run_at.py | ||
| test_cron_context_from.py | ||
| test_cron_inactivity_timeout.py | ||
| test_cron_no_agent.py | ||
| test_cron_profile_isolation.py | ||
| test_cron_prompt_injection_skill.py | ||
| test_cron_provider_pin.py | ||
| test_cron_script.py | ||
| test_cron_workdir.py | ||
| test_cronjob_schema.py | ||
| test_file_permissions.py | ||
| test_jobs.py | ||
| test_jobs_changed_notify.py | ||
| test_jobs_crossprocess_lock.py | ||
| test_parallel_pool.py | ||
| test_rewrite_skill_refs.py | ||
| test_run_one_job.py | ||
| test_scheduler.py | ||
| test_scheduler_mcp_init.py | ||
| test_scheduler_provider.py | ||
| test_suggestions.py | ||