{"repo":"NousResearch/hermes-agent","public_id":"22400","display_label":"HERMES_CRON_SESSION leak fixes in test runner scripts","summary":"These issues and pull requests address a variable leak where HERMES_CRON_SESSION bleeds into pytest when tests run under cron. Several fixes also adjust pytest-split installation to work with uv-based environments.","subsystem":"cron","counts":{"members":8,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":6},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":22767},"resolution":{"state":"resolved","by":"pr-22767"},"freshness":{"state":"verified","last_verified_at":"2026-05-09T19:47:53+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.25},"fix_edges":[{"issue_number":22400,"pr_number":22767,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":22401,"pr_number":22767,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":22400,"title":"scripts/run_tests.sh leaks HERMES_CRON_SESSION into pytest under cron","url":null,"state":"closed"},{"kind":"pr","number":22421,"title":"fix(scripts): unset HERMES_CRON_SESSION and use uv for pytest-split install","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"f00dc6d7a3a1d1a1cc5e98507d2efb201990f517","number":0},{"kind":"pr","value":"#22767","number":22767},{"kind":"pr","value":"#22400","number":22400},{"kind":"pr","value":"#22401","number":22401}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":22441,"title":"fix(tests): scrub HERMES_CRON_SESSION in canonical test runner","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22767","number":22767}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":22503,"title":"fix(scripts): support uv venv for pytest-split + unset HERMES_CRON_SESSION","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22767","number":22767}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":22519,"title":"fix(test-runner): scrub HERMES_CRON_SESSION in run_tests.sh (#22400)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22441","number":22441},{"kind":"pr","value":"#22400","number":22400},{"kind":"pr","value":"#22441","number":22441}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":22725,"title":"fix(scripts): scrub HERMES_CRON_SESSION in run_tests.sh","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22767","number":22767},{"kind":"pr","value":"#22401","number":22401}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":22730,"title":"fix(scripts): declare pytest-split in dev deps and unset HERMES_CRON_SESSION","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22767","number":22767},{"kind":"pr","value":"#22767","number":22767},{"kind":"pr","value":"#22401","number":22401}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":22767,"title":"fix(tests): harden run_tests.sh (uv-aware bootstrap + scrub HERMES_CRON_SESSION)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["pyproject.toml","scripts/run_tests.sh"],"fix_hunks":[{"file":"pyproject.toml","hunks":["@@ -54,7 +54,7 @@ dependencies = [\n modal = [\"modal>=1.0.0,<2\"]\n daytona = [\"daytona>=0.148.0,<1\"]\n vercel = [\"vercel>=0.5.7,<0.6.0\"]\n-dev = [\"debugpy>=1.8.0,<2\", \"pytest>=9.0.2,<10\", \"pytest-asyncio>=1.3.0,<2\", \"pytest-xdist>=3.0,<4\", \"mcp>=1.2.0,<2\", \"ty>=0.0.1a29,<0.0.22\", \"ruff\"]\n+dev = [\"debugpy>=1.8.0,<2\", \"pytest>=9.0.2,<10\", \"pytest-asyncio>=1.3.0,<2\", \"pytest-xdist>=3.0,<4\", \"pytest-split>=0.9,<1\", \"mcp>=1.2.0,<2\", \"ty>=0.0.1a29,<0.0.22\", \"ruff\"]\n messaging = [\"python-telegram-bot[webhooks]>=22.6,<23\", \"discord.py[voice]>=2.7.1,<3\", \"aiohttp>=3.13.3,<4\", \"slack-bolt>=1.18.0,<2\", \"slack-sdk>=3.27.0,<4\", \"qrcode>=7.0,<8\"]\n cron = []  # croniter is now a core dependency; this extra kept for back-compat\n slack = [\"slack-bolt>=1.18.0,<2\", \"slack-sdk>=3.27.0,<4\"]"]},{"file":"scripts/run_tests.sh","hunks":["@@ -44,7 +44,15 @@ PYTHON=\"$VENV/bin/python\"\n # ── Ensure pytest-split is installed (required for shard-equivalent runs) ──\n if ! \"$PYTHON\" -c \"import pytest_split\" 2>/dev/null; then\n   echo \"→ installing pytest-split into $VENV\"\n-  \"$PYTHON\" -m pip install --quiet \"pytest-split>=0.9,<1\"\n+  if command -v uv >/dev/null 2>&1; then\n+    uv pip install --python \"$PYTHON\" --quiet \"pytest-split>=0.9,<1\"\n+  elif \"$PYTHON\" -m pip --version >/dev/null 2>&1; then\n+    \"$PYTHON\" -m pip install --quiet \"pytest-split>=0.9,<1\"\n+  else\n+    echo \"error: neither uv nor pip is available in $VENV — pytest-split is missing\" >&2\n+    echo \"  fix: run  uv pip install -e \\\".[dev]\\\"  from $REPO_ROOT\" >&2\n+    exit 1\n+  fi\n fi\n \n # ── Hermetic environment ────────────────────────────────────────────────────","@@ -67,6 +75,7 @@ unset HERMES_YOLO_MODE HERMES_INTERACTIVE HERMES_QUIET HERMES_TOOL_PROGRESS \\\n       HERMES_TOOL_PROGRESS_MODE HERMES_MAX_ITERATIONS HERMES_SESSION_PLATFORM \\\n       HERMES_SESSION_CHAT_ID HERMES_SESSION_CHAT_NAME HERMES_SESSION_THREAD_ID \\\n       HERMES_SESSION_SOURCE HERMES_SESSION_KEY HERMES_GATEWAY_SESSION \\\n+      HERMES_CRON_SESSION \\\n       HERMES_PLATFORM HERMES_INFERENCE_PROVIDER HERMES_MANAGED HERMES_DEV \\\n       HERMES_CONTAINER HERMES_EPHEMERAL_SYSTEM_PROMPT HERMES_TIMEZONE \\\n       HERMES_REDACT_SECRETS HERMES_BACKGROUND_NOTIFICATIONS HERMES_EXEC_ASK \\\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}