diff --git a/environments/featured/browser-use/Dockerfile.hud b/environments/featured/browser-use/Dockerfile.hud index 17c832cc0..d4a00b7ee 100644 --- a/environments/featured/browser-use/Dockerfile.hud +++ b/environments/featured/browser-use/Dockerfile.hud @@ -2,7 +2,7 @@ FROM mcr.microsoft.com/playwright/python:v1.63.0-noble@sha256:72bd171a9ffc2b4b59 WORKDIR /app COPY requirements.txt /app/ COPY .hud-sdk/ .hud-sdk/ -ARG HUD_SDK_VERSION=0.6.19 +ARG HUD_SDK_VERSION=0.6.20 RUN python3 -m pip install --no-cache-dir --require-hashes -r requirements.txt \ && python3 -c "from importlib.metadata import version; import os; assert version('hud') == os.environ['HUD_SDK_VERSION']; assert version('playwright') == '1.63.0'; print('HUD_ENV_SDK_VERSION=' + version('hud'))" COPY --chmod=644 env.py tasks.py /app/ diff --git a/environments/featured/browser-use/README.md b/environments/featured/browser-use/README.md new file mode 100644 index 000000000..a8602f55d --- /dev/null +++ b/environments/featured/browser-use/README.md @@ -0,0 +1,20 @@ +# Browser Use + +A visual web-research environment backed by a real Chromium browser. Agents can +inspect screenshots, navigate, click, scroll, and use the browser's developer +protocol without leaving the allowed website. + +The featured task asks the agent to inspect rental photos and count the chairs +at a specific kitchen table. Grading checks both the exact answer and whether +the agent cited screenshot evidence that actually showed the kitchen. + +The environment exposes: + +- `cdp`: direct browser control for compatible agents +- `mcp`: screenshot and browser-interaction tools + +Deploy from this directory with: + +```bash +hud deploy +``` diff --git a/environments/featured/browser-use/requirements.in b/environments/featured/browser-use/requirements.in index 128fbacce..636fe7958 100644 --- a/environments/featured/browser-use/requirements.in +++ b/environments/featured/browser-use/requirements.in @@ -1,3 +1,3 @@ -hud[agents]==0.6.19 +hud[agents]==0.6.20 playwright==1.63.0 uvicorn==0.54.0 diff --git a/environments/featured/browser-use/requirements.txt b/environments/featured/browser-use/requirements.txt index 42c2b5e99..9ea7f68d2 100644 --- a/environments/featured/browser-use/requirements.txt +++ b/environments/featured/browser-use/requirements.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv --no-config pip compile requirements.in --generate-hashes --universal --python-version 3.12 -o requirements.txt --offline +# uv --no-config pip compile requirements.in --generate-hashes --universal --python-version 3.12 -o requirements.txt aiofile==3.12.3 \ --hash=sha256:5c1bcc9e929c50834608e8cc1a4cc1d7503eb60c15a535b779fd39e2f372c017 \ --hash=sha256:caa6aa746b5e47e2165f7abd741b6415e49cf4d44fddc0f61844612cc3924d41 @@ -618,9 +618,9 @@ httpx2-jsfetch==1.0 ; sys_platform == 'emscripten' \ --hash=sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60 \ --hash=sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32 # via httpx2 -hud==0.6.19 \ - --hash=sha256:3288dc887ac4489383bb15ddcc10d3f59440b4af9fbfbed22c44598dffa00c94 \ - --hash=sha256:f9c45d614bb2efac228d41f23f215a1ae874bbe87eb73777ac90d994af2519f7 +hud==0.6.20 \ + --hash=sha256:4ffb877da4e9fd7f0c397fb60874a997824c110d3e6903fae2595f35b81a66f9 \ + --hash=sha256:7f5d084c12093dfe68b4e845cd428cf29208545d57085b6bb7c8c11437ec6802 # via -r requirements.in idna==3.20 \ --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ diff --git a/environments/featured/file-analysis/Dockerfile.hud b/environments/featured/file-analysis/Dockerfile.hud index 7b8ec073f..312267e38 100644 --- a/environments/featured/file-analysis/Dockerfile.hud +++ b/environments/featured/file-analysis/Dockerfile.hud @@ -5,7 +5,7 @@ WORKDIR /hud COPY pyproject.toml uv.lock env.py ./ COPY fixtures ./fixtures COPY .hud-sdk/ .hud-sdk/ -ARG HUD_SDK_VERSION=0.6.19 +ARG HUD_SDK_VERSION=0.6.20 RUN UV_PROJECT_ENVIRONMENT=/usr/local/venv uv sync --frozen --no-install-project --no-dev && chmod -R a+rX /usr/local/venv && chmod -R go-rwx /hud ENV PATH="/usr/local/venv/bin:${PATH}" WORKSPACE_DIR=/workspace RUN python -c "from importlib.metadata import version; import os; assert version('hud') == os.environ['HUD_SDK_VERSION']; print('HUD SDK', version('hud'))" diff --git a/environments/featured/file-analysis/README.md b/environments/featured/file-analysis/README.md new file mode 100644 index 000000000..cad4eb5a1 --- /dev/null +++ b/environments/featured/file-analysis/README.md @@ -0,0 +1,21 @@ +# File Analysis + +A document-analysis environment for tasks built from prompts, uploaded files, +and weighted grading criteria. Files are staged in an isolated workspace where +the agent can inspect them with shell tools and write a final report. + +The featured task is a supplier-payment reconciliation. It combines invoices, +bank payments, receiving records, and vendor terms, then grades the resulting +report for correct calculations, evidence, and recommended follow-up. + +The environment provides: + +- an isolated shell workspace with network access disabled +- file tracking for the agent's report +- criteria-based grading with an LLM judge + +Deploy from this directory with: + +```bash +hud deploy +``` diff --git a/environments/featured/file-analysis/pyproject.toml b/environments/featured/file-analysis/pyproject.toml index 81f447376..399c04ca6 100644 --- a/environments/featured/file-analysis/pyproject.toml +++ b/environments/featured/file-analysis/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "Argument-hints environment: prompt, data-file attachments, and rubric grading via console form hints (HUD v6)" requires-python = ">=3.12,<3.13" dependencies = [ - "hud[agents]==0.6.19", + "hud[agents]==0.6.20", "httpx>=0.27.0", ] diff --git a/environments/featured/file-analysis/uv.lock b/environments/featured/file-analysis/uv.lock index e1b776a68..9965d6da4 100644 --- a/environments/featured/file-analysis/uv.lock +++ b/environments/featured/file-analysis/uv.lock @@ -509,7 +509,7 @@ wheels = [ [[package]] name = "hud" -version = "0.6.19" +version = "0.6.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, @@ -532,9 +532,9 @@ dependencies = [ { name = "typer" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/b8/0fe598314c8d6f973fa1b28ef77d07f0b447a826da6e626af77468789aee/hud-0.6.19.tar.gz", hash = "sha256:f9c45d614bb2efac228d41f23f215a1ae874bbe87eb73777ac90d994af2519f7", size = 601342, upload-time = "2026-10-06T04:18:21.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/15/a18b524a7eb51c1e8bee1289e8ff0b89a547f973677c544fbacc95a9ae6b/hud-0.6.20.tar.gz", hash = "sha256:4ffb877da4e9fd7f0c397fb60874a997824c110d3e6903fae2595f35b81a66f9", size = 623289, upload-time = "2026-10-11T19:10:18.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/f9/30eab6fcc1a3da4a882f4bfb917a81c38fc7cfe6bbdb00ed22a07058b638/hud-0.6.19-py3-none-any.whl", hash = "sha256:3288dc887ac4489383bb15ddcc10d3f59440b4af9fbfbed22c44598dffa00c94", size = 706686, upload-time = "2026-10-06T04:18:19.838Z" }, + { url = "https://files.pythonhosted.org/packages/bd/14/08cad6667f2642adc7d0009969d3022d7326ce17f950248680c4245391e0/hud-0.6.20-py3-none-any.whl", hash = "sha256:7f5d084c12093dfe68b4e845cd428cf29208545d57085b6bb7c8c11437ec6802", size = 730660, upload-time = "2026-10-11T19:10:17.038Z" }, ] [[package]] @@ -804,7 +804,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "httpx", specifier = ">=0.27.0" }, - { name = "hud", extras = ["agents"], specifier = "==0.6.19" }, + { name = "hud", extras = ["agents"], specifier = "==0.6.20" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = "==0.11.2" }, diff --git a/environments/featured/flask-coding/Dockerfile.hud b/environments/featured/flask-coding/Dockerfile.hud index fc2d8d5db..160aa7eee 100644 --- a/environments/featured/flask-coding/Dockerfile.hud +++ b/environments/featured/flask-coding/Dockerfile.hud @@ -9,7 +9,7 @@ WORKDIR /hud COPY pyproject.toml uv.lock env.py grader.py flask.bundle ./ COPY .hud-sdk/ .hud-sdk/ -ARG HUD_SDK_VERSION=0.6.19 +ARG HUD_SDK_VERSION=0.6.20 RUN UV_PROJECT_ENVIRONMENT=/usr/local/venv uv sync --frozen --no-install-project \ && /usr/local/venv/bin/python -c "from importlib.metadata import version; import os; assert version('hud') == os.environ['HUD_SDK_VERSION']; print('HUD_SDK_VERSION=' + version('hud'))" \ && mkdir /app \ diff --git a/environments/featured/flask-coding/README.md b/environments/featured/flask-coding/README.md new file mode 100644 index 000000000..2ec936085 --- /dev/null +++ b/environments/featured/flask-coding/README.md @@ -0,0 +1,20 @@ +# Flask Coding + +A coding environment that gives the agent an isolated Flask repository and +grades its changes with hidden tests. Each task starts from a clean git +baseline, exposes only the working tree to the agent, and applies the hidden +test patch after the agent finishes. + +The featured task asks the agent to add binary-file loading support to +`flask.Config.from_file` while preserving the existing text and error-handling +behavior. The score comes from targeted fail-to-pass and regression tests. + +The workspace blocks network access and runs the agent as an unprivileged user. +Existing runs remain reproducible because each task pins its repository +baseline and test contract. + +Deploy from this directory with: + +```bash +hud deploy +``` diff --git a/environments/featured/flask-coding/pyproject.toml b/environments/featured/flask-coding/pyproject.toml index 8f4e3d104..f5180629a 100644 --- a/environments/featured/flask-coding/pyproject.toml +++ b/environments/featured/flask-coding/pyproject.toml @@ -6,7 +6,7 @@ requires-python = ">=3.11,<3.13" dependencies = [ "blinker==1.5", "click>=8.0", - "hud==0.6.19", + "hud==0.6.20", "itsdangerous>=2.0", "jinja2>=3.0", "pytest>=8.0,<9", diff --git a/environments/featured/flask-coding/uv.lock b/environments/featured/flask-coding/uv.lock index e720ef0d3..e2ee13a08 100644 --- a/environments/featured/flask-coding/uv.lock +++ b/environments/featured/flask-coding/uv.lock @@ -272,7 +272,7 @@ dev = [ requires-dist = [ { name = "blinker", specifier = "==1.5" }, { name = "click", specifier = ">=8.0" }, - { name = "hud", specifier = "==0.6.19" }, + { name = "hud", specifier = "==0.6.20" }, { name = "itsdangerous", specifier = ">=2.0" }, { name = "jinja2", specifier = ">=3.0" }, { name = "pytest", specifier = ">=8.0,<9" }, @@ -566,7 +566,7 @@ wheels = [ [[package]] name = "hud" -version = "0.6.19" +version = "0.6.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, @@ -589,9 +589,9 @@ dependencies = [ { name = "typer" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/b8/0fe598314c8d6f973fa1b28ef77d07f0b447a826da6e626af77468789aee/hud-0.6.19.tar.gz", hash = "sha256:f9c45d614bb2efac228d41f23f215a1ae874bbe87eb73777ac90d994af2519f7", size = 601342, upload-time = "2026-10-06T04:18:21.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/15/a18b524a7eb51c1e8bee1289e8ff0b89a547f973677c544fbacc95a9ae6b/hud-0.6.20.tar.gz", hash = "sha256:4ffb877da4e9fd7f0c397fb60874a997824c110d3e6903fae2595f35b81a66f9", size = 623289, upload-time = "2026-10-11T19:10:18.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/f9/30eab6fcc1a3da4a882f4bfb917a81c38fc7cfe6bbdb00ed22a07058b638/hud-0.6.19-py3-none-any.whl", hash = "sha256:3288dc887ac4489383bb15ddcc10d3f59440b4af9fbfbed22c44598dffa00c94", size = 706686, upload-time = "2026-10-06T04:18:19.838Z" }, + { url = "https://files.pythonhosted.org/packages/bd/14/08cad6667f2642adc7d0009969d3022d7326ce17f950248680c4245391e0/hud-0.6.20-py3-none-any.whl", hash = "sha256:7f5d084c12093dfe68b4e845cd428cf29208545d57085b6bb7c8c11437ec6802", size = 730660, upload-time = "2026-10-11T19:10:17.038Z" }, ] [[package]] diff --git a/environments/featured/libbet/Dockerfile.hud b/environments/featured/libbet/Dockerfile.hud index ba3e758d9..3f1d402d8 100644 --- a/environments/featured/libbet/Dockerfile.hud +++ b/environments/featured/libbet/Dockerfile.hud @@ -14,7 +14,7 @@ WORKDIR /app # the lock, and the runtime modules the wheel build needs (pyproject `only-include`). COPY pyproject.toml uv.lock env.py tasks.py emulator.py scoring.py games_loader.py ./ COPY .hud-sdk/ .hud-sdk/ -ARG HUD_SDK_VERSION=0.6.19 +ARG HUD_SDK_VERSION=0.6.20 RUN uv sync --frozen --no-dev RUN /app/.venv/bin/python -c "import importlib.metadata; import os; version = importlib.metadata.version('hud'); print('HUD_SDK_VERSION=' + version); assert version == os.environ['HUD_SDK_VERSION']" diff --git a/environments/featured/libbet/README.md b/environments/featured/libbet/README.md new file mode 100644 index 000000000..0e36df1bd --- /dev/null +++ b/environments/featured/libbet/README.md @@ -0,0 +1,19 @@ +# Libbet + +A visual Game Boy environment built from the freely licensed homebrew puzzle +game *Libbet and the Magic Floor*. Agents see the current screen and play with +MCP tools for the directional pad, buttons, waiting, and screenshots. + +The emulator advances only when a tool is called, so the game stays paused +while the agent reasons. The featured task gives the agent 40 action steps to +explore the game. + +Scoring rewards visually distinct progress discovered during play rather than +requiring a particular level completion. Screenshots and scoring details are +recorded in the trace. + +Deploy from this directory with: + +```bash +hud deploy +``` diff --git a/environments/featured/libbet/pyproject.toml b/environments/featured/libbet/pyproject.toml index de9a492ba..e61d3f664 100644 --- a/environments/featured/libbet/pyproject.toml +++ b/environments/featured/libbet/pyproject.toml @@ -4,7 +4,7 @@ version = "0.1.0" description = "A HUD environment template that wraps VideoGameBench Game Boy games as scored, turn-based agent evals." requires-python = ">=3.11,<3.13" dependencies = [ - "hud==0.6.19", + "hud==0.6.20", "pyboy>=2.7.0", # Game Boy backend "imagehash>=4.3.1", "pillow>=10.0.0", diff --git a/environments/featured/libbet/uv.lock b/environments/featured/libbet/uv.lock index a82a1af63..f7049545e 100644 --- a/environments/featured/libbet/uv.lock +++ b/environments/featured/libbet/uv.lock @@ -535,7 +535,7 @@ wheels = [ [[package]] name = "hud" -version = "0.6.19" +version = "0.6.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, @@ -558,9 +558,9 @@ dependencies = [ { name = "typer" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/b8/0fe598314c8d6f973fa1b28ef77d07f0b447a826da6e626af77468789aee/hud-0.6.19.tar.gz", hash = "sha256:f9c45d614bb2efac228d41f23f215a1ae874bbe87eb73777ac90d994af2519f7", size = 601342, upload-time = "2026-10-06T04:18:21.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/15/a18b524a7eb51c1e8bee1289e8ff0b89a547f973677c544fbacc95a9ae6b/hud-0.6.20.tar.gz", hash = "sha256:4ffb877da4e9fd7f0c397fb60874a997824c110d3e6903fae2595f35b81a66f9", size = 623289, upload-time = "2026-10-11T19:10:18.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/f9/30eab6fcc1a3da4a882f4bfb917a81c38fc7cfe6bbdb00ed22a07058b638/hud-0.6.19-py3-none-any.whl", hash = "sha256:3288dc887ac4489383bb15ddcc10d3f59440b4af9fbfbed22c44598dffa00c94", size = 706686, upload-time = "2026-10-06T04:18:19.838Z" }, + { url = "https://files.pythonhosted.org/packages/bd/14/08cad6667f2642adc7d0009969d3022d7326ce17f950248680c4245391e0/hud-0.6.20-py3-none-any.whl", hash = "sha256:7f5d084c12093dfe68b4e845cd428cf29208545d57085b6bb7c8c11437ec6802", size = 730660, upload-time = "2026-10-11T19:10:17.038Z" }, ] [[package]] @@ -579,7 +579,7 @@ dependencies = [ [package.metadata] requires-dist = [ - { name = "hud", specifier = "==0.6.19" }, + { name = "hud", specifier = "==0.6.20" }, { name = "imagehash", specifier = ">=4.3.1" }, { name = "numpy", specifier = ">=1.26" }, { name = "pillow", specifier = ">=10.0.0" }, diff --git a/environments/featured/robot-gripper/.dockerignore b/environments/featured/robot-gripper/.dockerignore index eccde8d80..4c89389f2 100644 --- a/environments/featured/robot-gripper/.dockerignore +++ b/environments/featured/robot-gripper/.dockerignore @@ -22,3 +22,4 @@ examples/ docs/ run_vla.py *.md +!README.md diff --git a/environments/featured/robot-gripper/Dockerfile.hud b/environments/featured/robot-gripper/Dockerfile.hud index 4eaa4676f..027c88ced 100644 --- a/environments/featured/robot-gripper/Dockerfile.hud +++ b/environments/featured/robot-gripper/Dockerfile.hud @@ -28,7 +28,7 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY wheels/ wheels/ COPY .hud-sdk/ .hud-sdk/ -ARG HUD_SDK_VERSION=0.6.19 +ARG HUD_SDK_VERSION=0.6.20 RUN uv sync --frozen --no-dev RUN /app/.venv/bin/python -c "from importlib.metadata import version; import os; assert version('hud') == os.environ['HUD_SDK_VERSION']; print('HUD SDK:', version('hud'))" diff --git a/environments/featured/robot-gripper/README.md b/environments/featured/robot-gripper/README.md new file mode 100644 index 000000000..5045d3fd8 --- /dev/null +++ b/environments/featured/robot-gripper/README.md @@ -0,0 +1,19 @@ +# Robot Gripper + +A tabletop robotics environment powered by a Newton physics simulation. Agents +control a gripper through MCP tools, inspect rendered views and simulator state, +and receive rewards from the resulting physical state. + +The environment includes tasks for opening a drawer, lifting and moving an +object, and maintaining a force-controlled grasp. The featured task asks the +agent to pick up a mug within a 40-step budget. + +Grading measures continuous progress as well as task completion, so partial +movement receives a proportional score while reaching the target earns the +success bonus. + +Deploy from this directory with: + +```bash +hud deploy +``` diff --git a/environments/featured/robot-gripper/pyproject.toml b/environments/featured/robot-gripper/pyproject.toml index 4dd7dcfb0..e54de8e53 100644 --- a/environments/featured/robot-gripper/pyproject.toml +++ b/environments/featured/robot-gripper/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.12,<3.13" # Eval-machine dependencies. The Newton physics engine (`newton` + `gizmo`) is # NOT on PyPI: it ships as a pre-built wheel in wheels/ (see [tool.uv.sources]). dependencies = [ - "hud==0.6.19", # HUD SDK: Environment, capabilities, hud eval + "hud==0.6.20", # HUD SDK: Environment, capabilities, hud eval "mujoco>=3.2.0", # rendering, model name lookups, IK "numpy>=1.26.0", "Pillow>=10.0.0", # base64 PNG encode/decode for render() diff --git a/environments/featured/robot-gripper/uv.lock b/environments/featured/robot-gripper/uv.lock index 348042153..ef906da21 100644 --- a/environments/featured/robot-gripper/uv.lock +++ b/environments/featured/robot-gripper/uv.lock @@ -570,7 +570,7 @@ wheels = [ [[package]] name = "hud" -version = "0.6.19" +version = "0.6.20" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, @@ -593,9 +593,9 @@ dependencies = [ { name = "typer" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/b8/0fe598314c8d6f973fa1b28ef77d07f0b447a826da6e626af77468789aee/hud-0.6.19.tar.gz", hash = "sha256:f9c45d614bb2efac228d41f23f215a1ae874bbe87eb73777ac90d994af2519f7", size = 601342, upload-time = "2026-10-06T04:18:21.633Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/15/a18b524a7eb51c1e8bee1289e8ff0b89a547f973677c544fbacc95a9ae6b/hud-0.6.20.tar.gz", hash = "sha256:4ffb877da4e9fd7f0c397fb60874a997824c110d3e6903fae2595f35b81a66f9", size = 623289, upload-time = "2026-10-11T19:10:18.434Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/f9/30eab6fcc1a3da4a882f4bfb917a81c38fc7cfe6bbdb00ed22a07058b638/hud-0.6.19-py3-none-any.whl", hash = "sha256:3288dc887ac4489383bb15ddcc10d3f59440b4af9fbfbed22c44598dffa00c94", size = 706686, upload-time = "2026-10-06T04:18:19.838Z" }, + { url = "https://files.pythonhosted.org/packages/bd/14/08cad6667f2642adc7d0009969d3022d7326ce17f950248680c4245391e0/hud-0.6.20-py3-none-any.whl", hash = "sha256:7f5d084c12093dfe68b4e845cd428cf29208545d57085b6bb7c8c11437ec6802", size = 730660, upload-time = "2026-10-11T19:10:17.038Z" }, ] [[package]] @@ -1635,7 +1635,7 @@ viewer = [ [package.metadata] requires-dist = [ - { name = "hud", specifier = "==0.6.19" }, + { name = "hud", specifier = "==0.6.20" }, { name = "imgui-bundle", marker = "extra == 'viewer'", specifier = ">=1.90" }, { name = "mujoco", specifier = ">=3.2.0" }, { name = "mujoco-warp", specifier = ">=3.8.0.1" },