From 5e8ad2ea2ace5239a42e08ad54ee8979a918a934 Mon Sep 17 00:00:00 2001 From: Jaideep <67646710+jdchawla29@users.noreply.github.com> Date: Thu, 23 Jul 2026 02:15:39 -0700 Subject: [PATCH 1/2] fix: prevent Daytona rollout failures (HUD-2206) --- hud/eval/runtime.py | 4 +++- hud/eval/tests/test_docker_provider.py | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/hud/eval/runtime.py b/hud/eval/runtime.py index a05e16ab1..133eff4d1 100644 --- a/hud/eval/runtime.py +++ b/hud/eval/runtime.py @@ -664,7 +664,7 @@ def __init__( self.snapshot_name = snapshot_name # Default command serves on *port*, so the SSH forward target always # matches what's listening; override only for a non-default layout. - self.command = command or f"hud serve env.py --host 0.0.0.0 --port {port}" + self.command = command or f"uv run hud serve env.py --host 0.0.0.0 --port {port}" self.workdir = workdir self.port = port self.ssh_host = ssh_host @@ -720,6 +720,7 @@ async def __call__(self, task: Task) -> AsyncIterator[Runtime]: kwargs: dict[str, Any] = { "image": Image.base(config.image), "ephemeral": True, + "auto_stop_interval": 0, } if daytona_resources is not None: kwargs["resources"] = daytona_resources @@ -751,6 +752,7 @@ async def __call__(self, task: Task) -> AsyncIterator[Runtime]: sandbox_params = CreateSandboxFromSnapshotParams( snapshot=self.snapshot_name, ephemeral=True, + auto_stop_interval=0, ) create_timeout = 120 diff --git a/hud/eval/tests/test_docker_provider.py b/hud/eval/tests/test_docker_provider.py index 1f757f7c4..1829b9bb8 100644 --- a/hud/eval/tests/test_docker_provider.py +++ b/hud/eval/tests/test_docker_provider.py @@ -195,6 +195,7 @@ async def create(*args: str, **kwargs: object) -> _FakeModalSandbox: class _CreateSandboxFromSnapshotParams: snapshot: str ephemeral: bool + auto_stop_interval: int @dataclass(frozen=True) @@ -207,6 +208,7 @@ class _CreateSnapshotParams: class _CreateSandboxFromImageParams: image: object ephemeral: bool + auto_stop_interval: int resources: object | None = None @@ -641,6 +643,7 @@ async def test_daytona_runtime_config_flows_into_daytona_sdk( assert create_params == _CreateSandboxFromImageParams( image=_DaytonaImage("img:tag"), ephemeral=True, + auto_stop_interval=0, resources=_DaytonaResources( cpu=2, memory=4, @@ -653,7 +656,7 @@ async def test_daytona_runtime_config_flows_into_daytona_sdk( assert calls["execute"] == ( "hud-serve", _SessionExecuteRequest( - command="cd /app && hud serve env.py --host 0.0.0.0 --port 8765", + command="cd /app && uv run hud serve env.py --host 0.0.0.0 --port 8765", run_async=True, ), ) @@ -692,11 +695,31 @@ async def test_daytona_task_runtime_config_overlays_provider_defaults( assert create_params == _CreateSandboxFromImageParams( image=_DaytonaImage("img:task"), ephemeral=True, + auto_stop_interval=0, resources=_DaytonaResources(cpu=2, memory=4), ) assert create_timeout == 45 +async def test_daytona_snapshot_sandboxes_disable_auto_stop( + monkeypatch: pytest.MonkeyPatch, +) -> None: + calls = _install_fake_daytona(monkeypatch) + + async with DaytonaRuntime("snapshot")(_row()): + pass + + create_call = calls["create"] + assert isinstance(create_call, tuple) + create_params, create_timeout = create_call + assert create_params == _CreateSandboxFromSnapshotParams( + snapshot="snapshot", + ephemeral=True, + auto_stop_interval=0, + ) + assert create_timeout == 120 + + async def test_daytona_runtime_config_rejects_unsupported_fields( monkeypatch: pytest.MonkeyPatch, ) -> None: From 4e8841dc0165c460aad8deb7c8bbcefe1abb239f Mon Sep 17 00:00:00 2001 From: Jaideep <67646710+jdchawla29@users.noreply.github.com> Date: Fri, 24 Jul 2026 00:21:29 -0700 Subject: [PATCH 2/2] fix: preserve Daytona image compatibility --- hud/eval/runtime.py | 4 +++- hud/eval/tests/test_docker_provider.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hud/eval/runtime.py b/hud/eval/runtime.py index 133eff4d1..b40d40a10 100644 --- a/hud/eval/runtime.py +++ b/hud/eval/runtime.py @@ -664,7 +664,9 @@ def __init__( self.snapshot_name = snapshot_name # Default command serves on *port*, so the SSH forward target always # matches what's listening; override only for a non-default layout. - self.command = command or f"uv run hud serve env.py --host 0.0.0.0 --port {port}" + self.command = ( + command or f'PATH="$PWD/.venv/bin:$PATH" hud serve env.py --host 0.0.0.0 --port {port}' + ) self.workdir = workdir self.port = port self.ssh_host = ssh_host diff --git a/hud/eval/tests/test_docker_provider.py b/hud/eval/tests/test_docker_provider.py index 1829b9bb8..d2458baa6 100644 --- a/hud/eval/tests/test_docker_provider.py +++ b/hud/eval/tests/test_docker_provider.py @@ -656,7 +656,9 @@ async def test_daytona_runtime_config_flows_into_daytona_sdk( assert calls["execute"] == ( "hud-serve", _SessionExecuteRequest( - command="cd /app && uv run hud serve env.py --host 0.0.0.0 --port 8765", + command=( + 'cd /app && PATH="$PWD/.venv/bin:$PATH" hud serve env.py --host 0.0.0.0 --port 8765' + ), run_async=True, ), )