{"record":{"id":"ccbb49e5f126a805","repo":"NousResearch/hermes-agent","slug":"cron-job-job-name-idle-for-int-secs-ago-s","errorCode":null,"errorMessage":"Cron job '{job_name}' idle for {int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) — last activity: {_last_desc}","messagePattern":"Cron job '(.+?)' idle for (.+?)s \\(limit (.+?)s\\) — last activity: (.+?)","errorType":"exception","errorClass":"TimeoutError","httpStatus":null,"severity":"error","filePath":"cron/scheduler.py","lineNumber":4515,"sourceCode":"                try:\n                    _activity = agent.get_activity_summary()\n                except Exception:\n                    pass\n            _last_desc = _activity.get(\"last_activity_desc\", \"unknown\")\n            _secs_ago = _activity.get(\"seconds_since_activity\", 0)\n            _cur_tool = _activity.get(\"current_tool\")\n            _iter_n = _activity.get(\"api_call_count\", 0)\n            _iter_max = _activity.get(\"max_iterations\", 0)\n\n            logger.error(\n                \"Job '%s' idle for %.0fs (inactivity limit %.0fs) \"\n                \"| last_activity=%s | iteration=%s/%s | tool=%s\",\n                job_name, _secs_ago, _cron_inactivity_limit,\n                _last_desc, _iter_n, _iter_max,\n                _cur_tool or \"none\",\n            )\n            request_hard_interrupt(agent, \"Cron job timed out (inactivity)\")\n            raise TimeoutError(\n                f\"Cron job '{job_name}' idle for \"\n                f\"{int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) \"\n                f\"— last activity: {_last_desc}\"\n            )\n\n        # Guard against non-dict returns from run_conversation under error conditions\n        if not isinstance(result, dict):\n            raise RuntimeError(\n                f\"agent.run_conversation returned {type(result).__name__} instead of dict: {result!r}\"\n            )\n\n        # If the agent itself reported failure (e.g. all retries exhausted on\n        # API errors, model abort, mid-run interrupt), do not silently mark the\n        # job as successful. run_agent populates `failed=True`/`completed=False`\n        # on these paths and may put the error into `final_response`, which\n        # would otherwise be delivered as if it were the agent's reply and the\n        # job's `last_status` set to \"ok\". Raise so the except handler below\n        # builds the proper failure tuple. (issue #17855)","sourceCodeStart":4497,"sourceCodeEnd":4533,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/cron/scheduler.py#L4497-L4533","documentation":"Error \"Cron job '{job_name}' idle for {int(_secs_ago)}s (limit {int(_cron_inactivity_limit)}s) — last activity: {_last_desc}\" thrown in NousResearch/hermes-agent.","triggerScenarios":"Thrown at cron/scheduler.py:4515 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Investigate why the job stalled (provider hang, long tool call) and rerun.","Raise the cron inactivity limit only if the workload legitimately runs longer."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}