mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-31 19:16:29 +00:00
Fixes #73973. A finite one-shot whose dispatch was claimed (claim_dispatch increments repeat.completed BEFORE execution) but whose run died before mark_job_run was left permanently wedged: completed==times, last_run_at null, state 'scheduled'. The run-claim TTL blocked re-dispatch, and once it expired the dispatch-limit guard silently removed the job with no output and no error. Two complementary fixes: - cron/scheduler.py run_one_job: the outer handler now catches BaseException, not just Exception. The inner run_job handler re-raises CancelledError/KeyboardInterrupt/SystemExit after agent teardown, and none of those are Exception subclasses, so the outer 'except Exception' missed them and mark_job_run(False) was never called. Failures are now recorded first (mark_job_run + finish_execution, each independently guarded), then non-Exception BaseExceptions are re-raised to preserve teardown semantics. Plain Exceptions keep the existing behavior (recorded, return False, no re-raise). Empty str(e) (bare CancelledError) falls back to the exception class name. - cron/jobs.py: when either removal site (claim_dispatch or the get_due_jobs dispatch-limit guard) drops a one-shot whose claimed run never completed (last_run_at null), _write_wedged_oneshot_diagnostic now writes an operator-visible .md into cron/output/<job_id>/ instead of vanishing silently. Best-effort: diagnostics can never break the removal. No diagnostic when last_run_at is set (normal completion race). |
||
|---|---|---|
| .. | ||
| scripts | ||
| __init__.py | ||
| blueprint_catalog.py | ||
| executions.py | ||
| jobs.py | ||
| lifecycle_guard.py | ||
| scheduler.py | ||
| scheduler_provider.py | ||
| suggestion_catalog.py | ||
| suggestions.py | ||