NousResearch/hermes-agent

Remove unnecessary crontab requirement from cronjob tool

Cluster 1589 · cron. Data as of

Nothing open on GitHub. Fix merged in #1638 on 17 Mar 2026. Check it covers your case.

The short answer

0open issues
0open PRs
4items grouped
Known?
Yes. 4 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #1638. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this resolved, deciding PR #1638. That is separate from the fix event.
Still open
Nothing open on GitHub.

A bug was reported that crontab is required even when crons are internal, followed by multiple fix attempts removing that unnecessary dependency from the cronjob tool.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #1638 fix(tools): remove unnecessary crontab requirement from cronjob tool

    merged to main

    files: tests/tools/test_cronjob_tools.py, tools/cronjob_tools.py

    Show the diff
    • tests/tools/test_cronjob_tools.py
      @@ -62,22 +62,44 @@ def test_deception_blocked(self):
       
       
       class TestCronjobRequirements:
      -    def test_requires_crontab_binary_even_in_interactive_mode(self, monkeypatch):
      +    def test_requires_no_crontab_binary(self, monkeypatch):
      +        """Cron is internal (JSON-based scheduler), no system crontab needed."""
               monkeypatch.setenv("HERMES_INTERACTIVE", "1")
               monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
               monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
      -        monkeypatch.setattr("shutil.which", lambda name: None)
      -
      -        assert check_cronjob_requirements() is False
      +        # Even with no crontab in PATH, the cronjob tool should be available
      +        # because hermes uses an internal scheduler, not system crontab.
      +        assert check_cronjob_requirements() is True
       
      -    def test_accepts_interactive_mode_when_crontab_exists(self, monkeypatch):
      +    def test_accepts_interactive_mode(self, monkeypatch):
               monkeypatch.setenv("HERMES_INTERACTIVE", "1")
               monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
               monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
      -        monkeypatch.setattr("shutil.which", lambda name: "/usr/bin/crontab")
       
               assert check_cronjob_requirements() is True
       
      +    def test_accepts_gateway_session(self, monkeypatch):
      +        monkeypatch.delenv("HERMES_INTERACTIVE", raising=False)
      +        monkeypatch.setenv("HERMES_GATEWAY_SESSION", "1")
      +        monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
      +
      +        assert check_cronjob_requirements() is True
      +
      +    def test_accepts_exec_ask(self, monkeypatch):
      +        monkeypatch.delenv("HERMES_INTERACTIVE", raising=False)
      +        monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
      +        monkeypatch.setenv("HERMES_EXEC_ASK", "1")
      +
      +        assert check_cronjob_requirements() is True
      +
      +    def test_rejects_when_no_session_env(self, monkeypatch):
      +        """Without any session env vars, cronjob tool should not be available."""
      +        monkeypatch.delenv("HERMES_INTERACTIVE", raising=False)
      +        monkeypatch.delenv("HERMES_GATEWAY_SESSION", raising=False)
      +        monkeypatch.delenv("HERMES_EXEC_ASK", raising=False)
      +
      +        assert check_cronjob_requirements() is False
      +
       
       # =========================================================================
       # schedule_cronjob
    • tools/cronjob_tools.py
      @@ -8,7 +8,6 @@
       import json
       import os
       import re
      -import shutil
       import sys
       from pathlib import Path
       from typing import Any, Dict, List, Optional
      @@ -414,13 +413,10 @@ def check_cronjob_requirements() -> bool:
           """
           Check if cronjob tools can be used.
       
      -    Requires 'crontab' executable to be present in the system PATH.
           Available in interactive CLI mode and gateway/messaging platforms.
      +    The cron system is internal (JSON file-based scheduler ticked by the gateway),
      +    so no external crontab executable is required.
           """
      -    # Ensure the system can actually install and manage cron entries.
      -    if not shutil.which("crontab"):
      -        return False
      -
           return bool(
               os.getenv("HERMES_INTERACTIVE")
               or os.getenv("HERMES_GATEWAY_SESSION")

2 PRs closed without merging

From the close comments: merged via another change 2

  • #1610 fix(tools): remove unnecessary crontab dependency from cronjob tools · merged via another change → #1638, #1633
  • #1633 fix(tools): remove unnecessary crontab requirement from cronjob tool · merged via another change → #1638
Closed issues · 1
  • Closed#1589[Bug]: Crontab is required despite crons being internal?
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.50: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Subsystem
cron
Merged PRs
#1638
Closed issues
1
Attempts
2 PRs closed without merging
Fix link checked
17 Mar 2026. This confirmation is old and may be out of date (a revert or reopen would not have invalidated it here); re-verify.

For your agent

The same facts, typed.