{"repo":"NousResearch/hermes-agent","public_id":"22420","display_label":"Adding Windows platform guards for UNIX-only test imports","summary":"Multiple issues and PRs addressing missing platform guards for UNIX-only stdlib modules (pwd, fcntl, grp) in test files, which cause failures on Windows. Proposed fixes use pytest.importorskip or skip decorators at the module level.","subsystem":"hermes_cli","counts":{"members":9,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":2,"merged_prs":1,"attempt_prs":6},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":22683},"resolution":{"state":"partially_resolved","by":"pr-22683"},"freshness":{"state":"verified","last_verified_at":"2026-05-09T18:12:04+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.20444444444444443},"fix_edges":[{"issue_number":22420,"pr_number":22683,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":22420,"title":"tests: add Windows skip guards for UNIX-only stdlib imports (pwd, fcntl) on v2026.5.7","url":null,"state":"closed"},{"kind":"issue","number":24531,"title":"test: bare `import grp` in TestSystemServiceIdentityRootHandling lacks platform guard","url":null,"state":"closed"},{"kind":"pr","number":22442,"title":"fix(tests): skip pwd/fcntl-dependent suites on Windows via importorskip","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"369cee018d46560e7076e209f311756aa5ec1f70","number":0},{"kind":"commit","value":"4e8b8573c","number":0},{"kind":"commit","value":"b959cfa05","number":0},{"kind":"pr","value":"#22683","number":22683},{"kind":"pr","value":"#22683","number":22683}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":22447,"title":"fix(tests): add Windows skip guards for UNIX-only pwd/fcntl imports","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22683","number":22683}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":22567,"title":"tests: add Windows skip guards for UNIX-only stdlib imports","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#22683","number":22683}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":22683,"title":"tests: add Windows skip guards for UNIX-only stdlib imports (salvage #22567)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["scripts/release.py","tests/hermes_cli/test_gateway_service.py","tests/tools/test_file_sync_back.py"],"fix_hunks":[{"file":"scripts/release.py","hunks":["@@ -67,6 +67,7 @@\n     \"[redacted:email]\": \"wesleysimplicio\",\n     \"[redacted:email]\": \"SiliconID\",\n     \"[redacted:email]\": \"xieNniu\",\n+    \"[redacted:email]\": \"wali-reheman\",\n     \"[redacted:email]\": \"uzunkuyruk\",\n     \"[redacted:email]\": \"Zhekinmaksim\",\n     \"[redacted:email]\": \"KvnGz\","]},{"file":"tests/hermes_cli/test_gateway_service.py","hunks":["@@ -1,13 +1,14 @@\n \"\"\"Tests for gateway service management helpers.\"\"\"\n \n import os\n-import pwd\n import subprocess\n from pathlib import Path\n from types import SimpleNamespace\n \n import pytest\n \n+pwd = pytest.importorskip(\"pwd\")\n+\n import hermes_cli.gateway as gateway_cli\n from gateway import status\n from gateway.restart import (","@@ -1284,20 +1285,17 @@ class TestSystemServiceIdentityRootHandling:\n \n     def test_auto_detected_root_is_rejected(self, monkeypatch):\n         \"\"\"When root is auto-detected (not explicitly requested), raise.\"\"\"\n-        import pwd\n         import grp\n \n         monkeypatch.delenv(\"SUDO_USER\", raising=False)\n         monkeypatch.setenv(\"USER\", \"root\")\n         monkeypatch.setenv(\"LOGNAME\", \"root\")\n \n-        import pytest\n         with pytest.raises(ValueError, match=\"pass --run-as-user root to override\"):\n             gateway_cli._system_service_identity(run_as_user=None)\n \n     def test_explicit_root_is_allowed(self, monkeypatch):\n         \"\"\"When root is explicitly passed via --run-as-user root, allow it.\"\"\"\n-        import pwd\n         import grp\n \n         root_info = pwd.getpwnam(\"root\")","@@ -1309,7 +1307,6 @@ def test_explicit_root_is_allowed(self, monkeypatch):\n \n     def test_non_root_user_passes_through(self, monkeypatch):\n         \"\"\"Normal non-root user works as before.\"\"\"\n-        import pwd\n         import grp\n \n         monkeypatch.delenv(\"SUDO_USER\", raising=False)"]},{"file":"tests/tools/test_file_sync_back.py","hunks":["@@ -1,6 +1,5 @@\n \"\"\"Tests for FileSyncManager.sync_back() — pull remote changes to host.\"\"\"\n \n-import fcntl\n import io\n import logging\n import os","@@ -12,6 +11,8 @@\n \n import pytest\n \n+fcntl = pytest.importorskip(\"fcntl\")\n+\n from tools.environments.file_sync import (\n     FileSyncManager,\n     _sha256_file,\n"]}]},{"kind":"pr","number":24551,"title":"test: guard bare import grp with pytest.importorskip at module level","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"4a4b9bd2dc86b1c360e31e4e104b226f6f1b0521","number":0}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":24560,"title":"test: guard bare import grp with module-level pytest.importorskip","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#24551","number":24551},{"kind":"pr","value":"#24531","number":24531},{"kind":"pr","value":"#24551","number":24551}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":24570,"title":"fix: add platform guard for grp import in test_gateway_service.py","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#24551","number":24551},{"kind":"pr","value":"#24531","number":24531}],"category":"duplicate_of","implication":"duplicate"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}