From af92b0bce04c26f2bf991a9575fd0fb4713a5abc Mon Sep 17 00:00:00 2001 From: MJ Mikulski Date: Fri, 6 Nov 2026 13:48:30 +0100 Subject: [PATCH] fix(harbor_agent): restore pathspec in the Harbor agent environment Harbor imports pathspec through dirhash and scantree, but the shared policy excludes it (#4193), so every Harbor rollout failed with ModuleNotFoundError. Re-enable it for this component the same way terminal_bench_4, miniswe_sandboxed_agent and harbor_agent_general do. Co-Authored-By: Claude Opus 5.5 Signed-off-by: MJ Mikulski --- responses_api_agents/harbor_agent/pyproject.toml | 3 ++- .../harbor_agent/tests/test_dependencies.py | 11 +++++++++++ responses_api_agents/harbor_agent/uv.lock | 8 +++++--- scripts/component-lock-policy.json | 5 +++++ 4 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 responses_api_agents/harbor_agent/tests/test_dependencies.py diff --git a/responses_api_agents/harbor_agent/pyproject.toml b/responses_api_agents/harbor_agent/pyproject.toml index 500ceaa9f8f..c890a7c0064 100644 --- a/responses_api_agents/harbor_agent/pyproject.toml +++ b/responses_api_agents/harbor_agent/pyproject.toml @@ -8,6 +8,7 @@ requires-python = ">=3.13.14" dependencies = [ "nemo-gym[dev,ray,sandbox]", "harbor @ git+https://github.com/laude-institute/harbor.git@9dddd797b57ab8a0f9d6352a20fce73abbb29573", + "pathspec==1.1.1", ] [tool.uv] @@ -29,7 +30,7 @@ override-dependencies = [ "torchaudio; sys_platform == 'never'", "pycountry; sys_platform == 'never'", "gprof2dot; sys_platform == 'never'", - "pathspec; sys_platform == 'never'", + "pathspec", ] exclude-dependencies = [ "fasttext-wheel", diff --git a/responses_api_agents/harbor_agent/tests/test_dependencies.py b/responses_api_agents/harbor_agent/tests/test_dependencies.py new file mode 100644 index 00000000000..374bb36d0a4 --- /dev/null +++ b/responses_api_agents/harbor_agent/tests/test_dependencies.py @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""Dependencies the Harbor agent server venv must provide.""" + + +def test_harbor_job_imports() -> None: + # Harbor imports pathspec through dirhash and scantree; Gym's default environment excludes it. + from harbor.job import Job + + assert Job.__name__ == "Job" diff --git a/responses_api_agents/harbor_agent/uv.lock b/responses_api_agents/harbor_agent/uv.lock index 9e63a2975aa..aab8d636062 100644 --- a/responses_api_agents/harbor_agent/uv.lock +++ b/responses_api_agents/harbor_agent/uv.lock @@ -24,7 +24,7 @@ constraints = [ overrides = [ { name = "gprof2dot", marker = "sys_platform == 'never'" }, { name = "opencv-python-headless", marker = "sys_platform == 'never'" }, - { name = "pathspec", marker = "sys_platform == 'never'" }, + { name = "pathspec" }, { name = "pycountry", marker = "sys_platform == 'never'" }, { name = "pynvvideocodec", marker = "sys_platform == 'never'" }, { name = "spacy", specifier = ">=3.8.13" }, @@ -1497,6 +1497,7 @@ source = { virtual = "." } dependencies = [ { name = "harbor" }, { name = "nemo-gym", extra = ["dev", "ray", "sandbox"] }, + { name = "pathspec" }, ] [package.optional-dependencies] @@ -1509,6 +1510,7 @@ requires-dist = [ { name = "harbor", git = "https://github.com/laude-institute/harbor.git?rev=9dddd797b57ab8a0f9d6352a20fce73abbb29573" }, { name = "nemo-gym", extras = ["dev", "ray", "sandbox"], editable = "../../" }, { name = "nemo-gym", extras = ["telemetry"], marker = "extra == 'telemetry'", editable = "../../" }, + { name = "pathspec", specifier = "==1.1.1" }, ] provides-extras = ["telemetry"] @@ -2466,7 +2468,7 @@ dependencies = [ { name = "ast-serialize" }, { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, - { name = "pathspec", marker = "sys_platform == 'never'" }, + { name = "pathspec" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/34/4e/64300736cf0a0373a27b94a91b664ee7382e36f77b0621bae6381da3e180/mypy-2.4.0.tar.gz", hash = "sha256:77bdaebd452f43fcfc4cc3ba94352a3ea537cd01e3f2d0879f48673d2ec00d6e", size = 4064425, upload-time = "2026-10-01T20:40:39.229Z" } @@ -4250,7 +4252,7 @@ version = "0.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, - { name = "pathspec", marker = "sys_platform == 'never'" }, + { name = "pathspec" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/e4/40998faefc72ba1ddeb640a44fba92935353525dba110488806da8339c0b/scantree-0.0.4.tar.gz", hash = "sha256:15bd5cb24483b04db2c70653604e8ea3522e98087db7e38ab8482f053984c0ac", size = 24643, upload-time = "2024-08-03T20:08:59.413Z" } wheels = [ diff --git a/scripts/component-lock-policy.json b/scripts/component-lock-policy.json index 0dd2112e628..1ddf36b2beb 100644 --- a/scripts/component-lock-policy.json +++ b/scripts/component-lock-policy.json @@ -82,6 +82,11 @@ "protobuf==6.33.6" ] }, + "responses_api_agents/harbor_agent": { + "override-dependencies": [ + "pathspec" + ] + }, "responses_api_agents/harbor_agent_general": { "override-dependencies": [ "pathspec",