Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
251 commits
Select commit Hold shift + click to select a range
473ffa3
test: add a black-box harness and make tests black-box by policy
jdchawla29 Oct 9, 2026
4fec972
chore: accept any uv from 0.12.2 on
jdchawla29 Oct 9, 2026
452865e
test: drive the control channel frame by frame
jdchawla29 Oct 9, 2026
2ce5c07
fix(environment): reject a falsy non-object tasks.start args
jdchawla29 Oct 9, 2026
cb43122
fix(environment): report a template's KeyError as its own error
jdchawla29 Oct 9, 2026
5b06809
test: drive file tracking over the filetracking/1 wire
jdchawla29 Oct 9, 2026
f59f1f6
test: resolve environment references from one fixture tree
jdchawla29 Oct 9, 2026
d21b96a
fix(environment): name a missing .py source as missing
jdchawla29 Oct 9, 2026
b2d581c
fix(environment): stop serving cleanly on SIGTERM from hud serve
jdchawla29 Oct 9, 2026
15c7f04
test: table the direct-control rollouts and read their spans from disk
jdchawla29 Oct 9, 2026
56970d6
test: claim, step and free robot slots through the public control plane
jdchawla29 Oct 9, 2026
4918a5b
test: spawn robot sims and gym envs through their public entry points
jdchawla29 Oct 9, 2026
4b70807
refactor: remove the unused hint catalog and private grader export
jdchawla29 Oct 9, 2026
7255a61
test: pin each package's public names and the CLI identity
jdchawla29 Oct 9, 2026
4e03010
test: drive telemetry uploads through real rollouts
jdchawla29 Oct 9, 2026
7c5217d
test: read local span files and instrument spans from real runs
jdchawla29 Oct 9, 2026
f82c3ce
test: query Trace on the traces real rollouts record
jdchawla29 Oct 9, 2026
ddadd86
test: delete formatting-trivia, private-helper and duplicated tests
jdchawla29 Oct 9, 2026
c07f49f
test: pin settings precedence through the hud CLI
jdchawla29 Oct 9, 2026
1cde0f4
test: grade templates in real rollouts and keep the text helpers as t…
jdchawla29 Oct 9, 2026
7c1605a
test: pin the HUD API request policy against the fake services
jdchawla29 Oct 9, 2026
49773c2
test: observe model routing as the requests that reach each server
jdchawla29 Oct 9, 2026
b93b905
test: pin the training wire against the fake catalog and RL service
jdchawla29 Oct 9, 2026
f1fe268
test: cover the MCP transport and validation patches
jdchawla29 Oct 9, 2026
73644fd
test: drive HUDConsole.select with keystrokes only
jdchawla29 Oct 9, 2026
afa5496
test: cover robot video teardown and per-episode robot traces
jdchawla29 Oct 9, 2026
1ee3e34
refactor: drop the exporter's guard against non-string span directories
jdchawla29 Oct 9, 2026
f54f640
test: type the grader templates and the stalled video callback
jdchawla29 Oct 9, 2026
0c15a0b
test: give the escaped-child completion row a load-proof margin
jdchawla29 Oct 9, 2026
fc346c6
fix(robot): never show negative zero in tool observations
jdchawla29 Oct 9, 2026
435ba86
test: let the black-box policy ratchet files that predate it
jdchawla29 Oct 9, 2026
676a54d
test(harness): script provider-native items, finish reasons and strea…
jdchawla29 Oct 9, 2026
2559e39
test(agents): drive each provider agent through a served workspace
jdchawla29 Oct 9, 2026
656c9c5
fix(agents): make ClaudeToolSearchTool.threshold defer custom tools
jdchawla29 Oct 9, 2026
b91c81d
refactor(agents): delete the unused OpenAI apply_patch engine
jdchawla29 Oct 9, 2026
48dae24
test(agents): pin the RFB input each computer-use action sends
jdchawla29 Oct 9, 2026
50aee75
fix(agents): scale Gemini computer-use coordinates to the screen
jdchawla29 Oct 9, 2026
1ffc73b
fix(agents): send GeminiConfig.excluded_predefined_functions to Gemini
jdchawla29 Oct 9, 2026
412b761
fix(agents): send Gemini's browser chords for the environment, not th…
jdchawla29 Oct 9, 2026
5a92be1
test(agents): pin how tool-agent rollouts end and recover
jdchawla29 Oct 9, 2026
d7f1c43
test(agents): pin each provider's native workspace tools on a real wo…
jdchawla29 Oct 9, 2026
d7ed49c
test(agents): pin how ClaudeAgent retries a failing Messages stream
jdchawla29 Oct 9, 2026
7c50259
test(agents): pin Chat Completions training options and citation requ…
jdchawla29 Oct 9, 2026
227f408
test(agents): pin which endpoint and credential each agent's requests…
jdchawla29 Oct 9, 2026
6450fc1
fix(agents): request a catalog model by its id, not the name typed
jdchawla29 Oct 9, 2026
42ecea4
test(agents): pin how MCP server tools are offered to and reach each …
jdchawla29 Oct 9, 2026
1afd5f3
test(agents): run the Claude and Codex CLI agents against stub CLIs
jdchawla29 Oct 9, 2026
01f6cd4
test(agents): sandbox-lane rows for CLI agents on a process-bound con…
jdchawla29 Oct 9, 2026
07c17d0
test(agents): pin the LeRobot datasets RobotAgent(save=True) records
jdchawla29 Oct 9, 2026
9005fa6
test(agents): delete the agent tests the scenarios replace
jdchawla29 Oct 9, 2026
f52a910
test(agents): satisfy ty in the agent scenarios
jdchawla29 Oct 9, 2026
e9e4867
test: answer image commands from a store in the fake docker
jdchawla29 Oct 9, 2026
c2579be
test: adapt Harbor case directories against the fake docker
jdchawla29 Oct 9, 2026
9ca8f25
fix: report a task.toml that is not UTF-8 as a finding
jdchawla29 Oct 9, 2026
964745d
fix: classify Compose include and extends as unsupported, as documented
jdchawla29 Oct 9, 2026
3cb094c
test: run the scripts harbor.export generates
jdchawla29 Oct 9, 2026
05e5efc
test: add a flaky TCP relay and an eventually() poller to the harness
jdchawla29 Oct 9, 2026
214d9bd
test: drive SSHClient through a relay in front of a served workspace
jdchawla29 Oct 9, 2026
9ee3bfb
test: drive RFBClient against the harness VNC server
jdchawla29 Oct 9, 2026
7a254b1
test: add a fake DevTools endpoint to the harness
jdchawla29 Oct 9, 2026
b81d57c
test: cover CDPClient against the fake DevTools endpoint
jdchawla29 Oct 9, 2026
5385214
fix: name the failed command in CDPError
jdchawla29 Oct 9, 2026
695ffda
test: pin capability URL normalization and Connection validation
jdchawla29 Oct 9, 2026
29df8fe
test: cover MCPClient against a FastMCP server
jdchawla29 Oct 9, 2026
6fa6a61
test: add a scripted control-channel peer to the harness
jdchawla29 Oct 9, 2026
2664014
test: drive the control-channel client against a scripted peer
jdchawla29 Oct 9, 2026
13935ee
fix: close the far side of a spliced stream when one side resets
jdchawla29 Oct 9, 2026
adac873
test: narrow the decoded pixel before comparing channels
jdchawla29 Oct 9, 2026
13449b6
test: run the Harbor controller through fixture tasks with a generic …
jdchawla29 Oct 9, 2026
559bc1b
docs: state which verifier reward files and values count
jdchawla29 Oct 9, 2026
334d4c5
test: drive oracle environments end to end through hud eval and Tasks…
jdchawla29 Oct 9, 2026
c0c6a99
test: rewrite the template tests as black-box tests users can copy
jdchawla29 Oct 9, 2026
8381724
test: run every hud init template and cookbook from a user's starting…
jdchawla29 Oct 9, 2026
78472e5
fix: import EvaluationResult from hud.graders in the a2a-chat cookbook
jdchawla29 Oct 9, 2026
12c91c6
ci: run the pre-release lifecycle as the hosted template scenario
jdchawla29 Oct 9, 2026
6bc72d5
test: track the compose-variables case's project .env
jdchawla29 Oct 9, 2026
4aa7b1f
test: drop the gateway Bedrock row the Claude transport scenario covers
jdchawla29 Oct 9, 2026
bcf24eb
test: accept the host's platform in the missing-CLI error
jdchawla29 Oct 9, 2026
bf17558
ci: check cookbooks nightly and give the live lane its data file
jdchawla29 Oct 9, 2026
541a41c
test: keep Docker's config directory when isolating the home
jdchawla29 Oct 9, 2026
0cb5082
docs: describe the template scenarios and cookbook lane in CONTRIBUTING
jdchawla29 Oct 9, 2026
ca499e3
refactor(environment): handle SIGTERM in the serve entry points, not …
jdchawla29 Oct 9, 2026
216f784
ci: keep the sandbox job's environment off the mounted checkout
jdchawla29 Oct 9, 2026
07561f1
perf(harbor): install the controller before copying task-specific inputs
jdchawla29 Oct 9, 2026
006881a
docs: align the runtime, task and job reference with the rollout engine
jdchawla29 Oct 9, 2026
03f3478
test: let fake docker emulate container files and scripted agents linger
jdchawla29 Oct 9, 2026
3918335
test: rebuild the rollout lifecycle as one scenario table
jdchawla29 Oct 9, 2026
5eeba96
fix: export the failure step of a rollout that never launched
jdchawla29 Oct 9, 2026
3dd6921
test: rebuild local runtime sources as scenario tables
jdchawla29 Oct 9, 2026
6049a07
fix: report a child's exit code when it dies before serving
jdchawla29 Oct 9, 2026
e60ed62
test: rebuild verifier placement and failures as one scenario table
jdchawla29 Oct 9, 2026
4372803
test: rebuild scheduling and pooling as scenario tables
jdchawla29 Oct 9, 2026
e7166df
test: pin platform reporting on the wire against the fake services
jdchawla29 Oct 9, 2026
ed45136
test: drive hosted rollouts against the fake platform
jdchawla29 Oct 9, 2026
d108f47
fix: stop polling a hosted rollout once its cancellation is requested
jdchawla29 Oct 9, 2026
4152443
test: run tunneled rollouts end to end through the fake runtime service
jdchawla29 Oct 9, 2026
55bb3b5
test: pin DockerRuntime through the fake docker executable
jdchawla29 Oct 9, 2026
0ff117c
test: snapshot Modal and Daytona through fake SDK modules
jdchawla29 Oct 9, 2026
2e190a5
test: pin taskset files and platform tasksets at the API
jdchawla29 Oct 9, 2026
861bed3
test: read file tracking spans from a real tracked workspace rollout
jdchawla29 Oct 9, 2026
0bc0be7
test: run a whole conversation through Chat against a chat environment
jdchawla29 Oct 9, 2026
395dfde
fix: give each block of a multi-block prompt turn its own message
jdchawla29 Oct 9, 2026
5334d9a
test: type the eval scenarios cleanly and drop a timing-bound workspa…
jdchawla29 Oct 9, 2026
4e6fde4
fix: report a spawned env that exits before serving while its daemon …
jdchawla29 Oct 9, 2026
7778711
docs: list the newer harness fakes and drop a reference to absent sce…
jdchawla29 Oct 9, 2026
a235c8d
test(cli): drive the hud shell contract through the real CLI
jdchawla29 Oct 9, 2026
36ccfe9
fix(cli): report the exception a command failed with in CLI analytics
jdchawla29 Oct 9, 2026
1000775
test(cli): drive hud jobs list, get and cancel against the fake platform
jdchawla29 Oct 9, 2026
98eaf06
fix(cli): show tool calls in local hud trace output
jdchawla29 Oct 9, 2026
a7b6086
test(cli): drive hud qa against the fake platform
jdchawla29 Oct 9, 2026
77008a9
test(cli): drive hud models against the fake catalog and training API
jdchawla29 Oct 9, 2026
34ab56c
test(cli): drive the workspace link and Project placement through hud
jdchawla29 Oct 9, 2026
9f89cc6
test(cli): drive hud deploy against a fake build pipeline
jdchawla29 Oct 9, 2026
8097c10
test(cli): drive hud sync against a stateful fake taskset store
jdchawla29 Oct 9, 2026
884b102
test(cli): run hud eval end to end with scripted models
jdchawla29 Oct 9, 2026
14b2fed
fix(cli): make hud eval report errored runs consistently and exit 1
jdchawla29 Oct 9, 2026
69c38b4
test(cli): drive hud task list, start and grade through the CLI
jdchawla29 Oct 9, 2026
2f24072
test(cli): run hud serve as a process and talk to it
jdchawla29 Oct 9, 2026
2b73fc8
test(cli): drive hud init through the CLI and evaluate what it creates
jdchawla29 Oct 9, 2026
fd0e365
test(cli): remove the CliRunner and helper-level CLI tests
jdchawla29 Oct 9, 2026
619cf7b
test(cli): type the fake Project records and analytics events
jdchawla29 Oct 9, 2026
a8c95e5
test(cli): name the qa wait rows
jdchawla29 Oct 9, 2026
c640a45
test: baseline the workspace tests that predate the black-box rule
jdchawla29 Oct 9, 2026
eaf8b8d
test(cli): expect the host's platform in analytics events
jdchawla29 Oct 9, 2026
7e70e15
test(cli): match the runtime-config refusal without pydantic's version
jdchawla29 Oct 9, 2026
ff646bf
test(cli): expect the missing-source error for hud serve missing.py
jdchawla29 Oct 9, 2026
be3856f
ci: run the sandbox job on a Python image with a current uv
jdchawla29 Oct 9, 2026
9615894
test: give model routing one home
jdchawla29 Oct 9, 2026
2f1f771
test: drop tests that repeat a contract covered elsewhere or pin priv…
jdchawla29 Oct 9, 2026
e176eb8
test(harbor): record compose and docker output only for the cases abo…
jdchawla29 Oct 9, 2026
569e0ac
test(eval): assert what each Docker row is about instead of whole tra…
jdchawla29 Oct 9, 2026
f95d4da
test(eval): record only what varies in each Modal and Daytona launch
jdchawla29 Oct 9, 2026
704ab4e
test(environment): pin tasks.list by the schemas templates declare
jdchawla29 Oct 9, 2026
99ddb9e
test(cli): check what rendered output says, not how it is laid out
jdchawla29 Oct 9, 2026
4dad754
test(agents): pin the tool results each provider receives, not its wh…
jdchawla29 Oct 9, 2026
592bbb5
test(eval): pin how a job counts its runs and what cancelling a tasks…
jdchawla29 Oct 9, 2026
1740d4e
test(environment): pin hook order around serving
jdchawla29 Oct 9, 2026
0090cd7
test(agents): round-trip every provider agent's config through dump a…
jdchawla29 Oct 9, 2026
2d67e86
test(agents): an agent without computer use leaves the screen alone
jdchawla29 Oct 9, 2026
8e553a5
test(capabilities): an MCP auth token reaches the server on every req…
jdchawla29 Oct 9, 2026
247a93b
test(cli): a stalled analytics endpoint does not hold up a command
jdchawla29 Oct 9, 2026
70bc1f1
test(cli): a first deploy lands in the Project its selection order picks
jdchawla29 Oct 9, 2026
bde28ba
test(cli): hud trace falls back to the platform and local traces comp…
jdchawla29 Oct 9, 2026
92338ca
test(eval): pin the no-placement message, env= selection and the chil…
jdchawla29 Oct 9, 2026
59e8654
test(clients): each protocol opens as its own working client
jdchawla29 Oct 9, 2026
bb8ff2f
test: type the Docker failure table's error column and widen the anal…
jdchawla29 Oct 9, 2026
86de2d9
test(environment): SIGTERM stops a server whose session is still grading
jdchawla29 Oct 9, 2026
d52e945
fix(environment): stop serving promptly when a session is still open
jdchawla29 Oct 9, 2026
358dc03
test: run every rollout outcome under every placement against fixture…
jdchawla29 Oct 9, 2026
611797b
test: give rollout contracts one home in tests/test_rollout.py
jdchawla29 Oct 9, 2026
44b294b
test: run every provider agent against every fixture environment
jdchawla29 Oct 9, 2026
ccda8da
test: run every rollout outcome over the HUD runtime tunnel too
jdchawla29 Oct 9, 2026
e2a128f
test: run every rollout outcome in Modal and Daytona sandboxes too
jdchawla29 Oct 9, 2026
316f290
Merge main into test-overhaul
jdchawla29 Oct 9, 2026
99a22b9
test(agents): expect the decoded Bedrock invoke path
jdchawla29 Oct 9, 2026
d2951fb
test(cli): compare the shell's stderr by its words
jdchawla29 Oct 9, 2026
a91b19b
Merge main into test-overhaul
jdchawla29 Oct 13, 2026
8e89fbd
test(cli): carry hud qa's task-level checks into the QA scenarios
jdchawla29 Oct 13, 2026
d91a156
test(cli): list hud harbor among the commands and read help at a fixe…
jdchawla29 Oct 13, 2026
b211879
test(environment): adopt main's direct-control scenarios, recorded bl…
jdchawla29 Oct 13, 2026
2b96c87
test(cli): drive hud harbor through the CLI against the fake platform
jdchawla29 Oct 13, 2026
3e051ff
ci: let the Docker and Sandbox jobs' environments create user namespaces
jdchawla29 Oct 13, 2026
e72d7bd
test(cli): show the whole result when a harbor import rerun fails
jdchawla29 Oct 13, 2026
96d7f46
revert: keep the hint catalog, apply_patch engine, exporter guard and…
jdchawla29 Oct 13, 2026
65b4eba
test: one set of fixture environments and the policies that solve them
jdchawla29 Oct 13, 2026
f2a85ab
test: share the agent builders and serve every in-test MCP server one…
jdchawla29 Oct 13, 2026
1a3b005
test: cut a workspace through the harness relay
jdchawla29 Oct 13, 2026
874944f
test(cli): check each harbor message on the stream the CLI writes it to
jdchawla29 Oct 13, 2026
23a280d
test: pin hud.graders' shipped exports, private combiner included
jdchawla29 Oct 13, 2026
7031211
fix: treat EPERM from the first group signal like an exited group
jdchawla29 Oct 13, 2026
37109b8
test(eval): check what cloud placements decide, not the commands they…
jdchawla29 Oct 14, 2026
27cdf0b
test(eval): check what DockerRuntime decides, not the commands it sends
jdchawla29 Oct 14, 2026
277ca7c
test(agents): check which hosted tools a request offers, not every sc…
jdchawla29 Oct 14, 2026
3a989b1
test(agents): check what the CLI agents decide, not every byte they h…
jdchawla29 Oct 14, 2026
4c2feae
test(environment): assert each control frame's payload once, not its …
jdchawla29 Oct 14, 2026
30fa28b
test(agents): pin the step fields a provider turn sets, not the empty…
jdchawla29 Oct 14, 2026
671b8d5
test(cli): state each dry-run plan as its changes from the default plan
jdchawla29 Oct 14, 2026
d3e9fb3
test(agents): type a CLI run's outcome as the trace types it
jdchawla29 Oct 14, 2026
a8ea83b
test(harness): reject model requests the real providers would reject
jdchawla29 Oct 14, 2026
e43d938
Revert "test(harness): reject model requests the real providers would…
jdchawla29 Oct 14, 2026
9b584e3
test: run the agent matrix against each provider's real model in the …
jdchawla29 Oct 14, 2026
925efc5
test(agents): assert what agents do, and leave wire formats to the pr…
jdchawla29 Oct 14, 2026
d3d5ea8
test(agents): let real models and CLIs prove the agents, script only …
jdchawla29 Oct 14, 2026
6685f24
test: run Docker and Modal placements for real, and drop their fake SDKs
jdchawla29 Oct 14, 2026
f936755
test(harbor): resolve adapt's images with real Docker, and drop the f…
jdchawla29 Oct 15, 2026
01c5995
test(agents): name what each reply becomes on the step, and share the…
jdchawla29 Oct 15, 2026
f3b1aac
test(cli): check what deploy uploads and triggers, not how it renders
jdchawla29 Oct 15, 2026
938474d
fix(cli): report the model a dry-run eval would use from its toml sec…
jdchawla29 Oct 15, 2026
a375a69
test(cli): check eval's runs and refusals by outcome, and lay project…
jdchawla29 Oct 15, 2026
eddd5e6
test(cli): check qa's runs, exits and verdicts rather than its tables
jdchawla29 Oct 15, 2026
06a2703
test(cli): check what sync leaves on the platform and in the export, …
jdchawla29 Oct 15, 2026
195fc80
test(cli): check what sync leaves on the platform and in the export, …
jdchawla29 Oct 15, 2026
b5557d7
test(cli): declare harbor's platform as routes and check imports by o…
jdchawla29 Oct 15, 2026
742394f
test(cli): check the workspace link's ids and the selected project, n…
jdchawla29 Oct 15, 2026
9428be3
test(cli): check the shell's output streams and error kinds, not its …
jdchawla29 Oct 15, 2026
0c9491a
test(cli): check what jobs reads and cancels, not its tables
jdchawla29 Oct 15, 2026
58029f0
test(cli): check which model and checkpoint the models commands reach…
jdchawla29 Oct 15, 2026
d2472aa
test(cli): check task's slugs, prompts, scores and error kinds
jdchawla29 Oct 15, 2026
4cd1e64
test(cli): check what trace reads and that it prints model text verbatim
jdchawla29 Oct 15, 2026
bcbebcb
test(cli): check init's refusals by error kind
jdchawla29 Oct 15, 2026
78d0ac5
test(robot): record datasets with the real lerobot and read them back…
jdchawla29 Oct 15, 2026
eb43486
test(robot): fold the recording scenarios into the robot gates and sh…
jdchawla29 Oct 15, 2026
040f114
test(cli): read the root command list from filled name cells, so wrap…
jdchawla29 Oct 15, 2026
2efb71b
test(harbor): accept the Linux daemon's wording for an unreachable si…
jdchawla29 Oct 15, 2026
7a96809
fix(robot): stop the bridge's tick loop on Python 3.11
jdchawla29 Oct 15, 2026
06ee991
test(harness): let the fake screen read what a client sent before it …
jdchawla29 Oct 15, 2026
a6ab2d1
Merge main into test-overhaul
jdchawla29 Oct 15, 2026
95dec12
fix(eval): keep the traceback of a rollout that fails before launch
jdchawla29 Oct 15, 2026
9447530
test(robot): one env builder for in-process sims, and slot refusals b…
jdchawla29 Oct 15, 2026
e770691
test(environment): check the control protocol by codes and file track…
jdchawla29 Oct 15, 2026
d1dd3cc
test(environment): check loader and tunnel refusals by kind, not message
jdchawla29 Oct 15, 2026
d6784c7
test(eval): check local runtime refusals by type, keeping the message…
jdchawla29 Oct 15, 2026
40bde31
test(eval): check taskset files by round trip and refusals by type
jdchawla29 Oct 15, 2026
334e0d2
test(eval): check invalid schedules by type
jdchawla29 Oct 15, 2026
1afe4b2
test(eval): check what a hosted submission carries, not its whole body
jdchawla29 Oct 15, 2026
528a357
test(eval): one test per verifier behaviour instead of a case table, …
jdchawla29 Oct 15, 2026
ad0a1a7
fix(harbor): check every task before export writes any
jdchawla29 Oct 15, 2026
67c79d6
test(harbor): check what export writes and run its image for real, in…
jdchawla29 Oct 15, 2026
569c451
test(harbor): check import bundling through hud harbor import, not it…
jdchawla29 Oct 15, 2026
510b591
test(graders): check judge prompts by their sections and grading fail…
jdchawla29 Oct 15, 2026
57d35d5
test: plain expected values instead of inline snapshots, and the trai…
jdchawla29 Oct 15, 2026
68b8a69
test(cli): cut deploy to one test per contract
jdchawla29 Oct 16, 2026
4ca24a6
test(cli): cut eval to the rules it owns; layouts and routing live wi…
jdchawla29 Oct 16, 2026
d47b9ee
test(cli): hud serve is covered by the loader's serving-process scena…
jdchawla29 Oct 16, 2026
4821d7a
test(cli): init keeps one naming and one preset row and the refusals …
jdchawla29 Oct 16, 2026
a0bf59b
test(cli): harbor keeps one test per import, report and cancel rule
jdchawla29 Oct 16, 2026
a85e628
test(cli): jobs and models keep one row per rule
jdchawla29 Oct 16, 2026
3f18e43
test(cli): qa and shell keep one row per rule; help listings and the …
jdchawla29 Oct 16, 2026
b72ad13
test(cli): sync, task, trace and workspace keep one row per rule
jdchawla29 Oct 16, 2026
38bc9a7
test: rename tests/harness to tests/support
jdchawla29 Oct 16, 2026
f511136
test: one home for in-process envs and serving helpers
jdchawla29 Oct 16, 2026
1d5a421
test: run the CLI tests against one stateful fake of the HUD platform
jdchawla29 Oct 16, 2026
8ed93bd
test: report rollouts and run hosted ones against the shared platform…
jdchawla29 Oct 16, 2026
4d87df7
test: move telemetry, training, robot and catalog tests onto the plat…
jdchawla29 Oct 16, 2026
4cd5233
test: cut agent rows that repeat a rule another row proves
jdchawla29 Oct 16, 2026
6c013c4
test: one eval row per rule in the scheduling, runtime, taskset and r…
jdchawla29 Oct 16, 2026
5a9b2d9
test: one row per rule in the control protocol, loader and robot cont…
jdchawla29 Oct 16, 2026
89e726a
test: trim utils tables, keep only the SDK parse checks in test_fakes…
jdchawla29 Oct 16, 2026
06f8b99
fix: snapshot sys.modules with copy() when loading a package source
jdchawla29 Oct 16, 2026
3045e86
test: check which credential a CLI agent hands its CLI, not the argv …
jdchawla29 Oct 16, 2026
3eaa869
test: replace the Harbor golden files with a scenario per adaptation …
jdchawla29 Oct 16, 2026
ae1dd26
docs: tests assert the fields a case is about, never a recorded copy …
jdchawla29 Oct 16, 2026
c810af4
test: delete tests that only restate the code they call
jdchawla29 Oct 16, 2026
0030e85
test: delete what a full read showed restates code or repeats another…
jdchawla29 Oct 16, 2026
df7f540
test: drop Harbor controller fixtures that repeat another fixture's rule
jdchawla29 Oct 16, 2026
329286c
test: let a Harbor controller fixture start from a base fixture
jdchawla29 Oct 16, 2026
35cd3fe
test: give two Harbor variants only what their rule needs
jdchawla29 Oct 16, 2026
d462f93
test: keep the platform's own rules out of the platform fake
jdchawla29 Oct 16, 2026
871f76b
test: cut tests and assertions that catch no bug another test misses
jdchawla29 Oct 17, 2026
94782b7
cli: every command that changes platform state takes --dry-run and as…
jdchawla29 Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 4 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
run: uv python install ${{ matrix.python-version }}

- name: Run tests
run: uv run --python ${{ matrix.python-version }} --all-extras pytest --cov --cov-report=''
run: uv run --python ${{ matrix.python-version }} --all-extras pytest -n auto --cov --cov-report=''

lint-ruff:
runs-on: ubuntu-latest
Expand All @@ -41,6 +41,9 @@ jobs:
uv run --with=".[dev]" ruff format . --check
uv run --with=".[dev]" ruff check .

- name: Check tests stay black-box
run: uv run --no-project python scripts/check_tests.py

lint-ty:
runs-on: ubuntu-latest
steps:
Expand Down
156 changes: 156 additions & 0 deletions .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
name: E2E

# Tests marked `e2e` need something outside the test process. Each job selects
# the ones its runner can provide; they skip themselves when it cannot.

on:
pull_request:
paths:
- "hud/**"
- "tests/**"
- "environments/**"
- "pyproject.toml"
- ".github/workflows/e2e.yml"
push:
branches: [main]
schedule:
- cron: "17 7 * * *"
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
docker:
name: Docker
runs-on: ubuntu-latest
timeout-minutes: 60
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

# Ubuntu 24.04 runners block unprivileged user namespaces through AppArmor;
# environments' bubblewrap sandboxes need them, as they have on HUD's hosts.
- name: Allow unprivileged user namespaces
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

- name: Run Docker scenarios
run: >-
uv run --python 3.12 --all-extras
pytest -m "e2e and docker" -n 4 --timeout 1800 --durations 20

sandbox:
name: Sandbox
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

# Ubuntu 24.04 runners block unprivileged user namespaces through AppArmor;
# environments' bubblewrap sandboxes need them, as they have on HUD's hosts.
- name: Allow unprivileged user namespaces
run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

# Environments run in containers with HUD's seccomp profile, so the
# sandbox scenarios run there too, as root, with bubblewrap installed.
- name: Run sandbox scenarios in a container
run: >-
docker run --rm
--security-opt seccomp=hud/eval/docker-seccomp.json
--security-opt systempaths=unconfined
--security-opt apparmor=unconfined
--volume "$PWD:/src" --workdir /src
--env UV_PROJECT_ENVIRONMENT=/opt/venv
python:3.12-bookworm
sh -c 'apt-get update -qq && apt-get install -y -qq bubblewrap openssh-client >/dev/null
&& pip install -q "uv>=0.12.2"
&& uv run --all-extras pytest -m "e2e and sandbox" -n 4 --timeout 600'

live:
name: Live
# Secrets are not available to pull requests from forks or Dependabot.
if: >-
github.event_name != 'pull_request' ||
(github.event.pull_request.head.repo.full_name == github.repository &&
github.event.pull_request.user.login != 'dependabot[bot]')
runs-on: ubuntu-latest
timeout-minutes: 45
env:
HUD_API_KEY: ${{ secrets.HUD_API_KEY }}
HUD_CI_DATA_FILE_ID: ${{ vars.HUD_CI_DATA_FILE_ID }}
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

# The CLI agents' live scenarios run the real Claude Code and Codex CLIs.
- name: Install the agent CLIs
run: npm install --global @anthropic-ai/claude-code @openai/codex

- name: Run live scenarios
run: >-
uv run --python 3.12 --all-extras
pytest -m "e2e and live and not hosted" -n 4 --timeout 1200 --durations 20

modal:
name: Modal
# Runs real Modal sandboxes on the account in MODAL_TOKEN_ID / MODAL_TOKEN_SECRET;
# without them the scenarios skip themselves.
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 45
env:
MODAL_TOKEN_ID: ${{ secrets.MODAL_TOKEN_ID }}
MODAL_TOKEN_SECRET: ${{ secrets.MODAL_TOKEN_SECRET }}
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Run Modal scenarios
run: >-
uv run --python 3.12 --all-extras
pytest -m "e2e and modal" -n 4 --timeout 1200 --durations 20

lerobot:
name: LeRobot
# Records robot rollouts with the real lerobot package (and torch), which no
# extra installs, so it runs on its own schedule.
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Run LeRobot scenarios
run: >-
uv run --python 3.12 --all-extras --with 'lerobot[dataset]'
pytest -m "e2e and lerobot" -n 4 --timeout 600 --durations 20

cookbooks:
name: Cookbooks
# Cookbooks live outside the package, so SDK changes can break them silently.
if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Check cookbooks
run: >-
uv run --python 3.12 --all-extras
pytest tests/e2e/test_cookbooks.py -m e2e -n 4 --timeout 1200 --durations 20
54 changes: 16 additions & 38 deletions .github/workflows/pre-release.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
name: Pre-release

# The release gate (release.yml) looks up a successful run of this workflow on the
# tagged commit, so keep its file name and trigger.

on:
workflow_dispatch:

Expand All @@ -15,8 +18,6 @@ jobs:
concurrency:
group: ci-example-${{ matrix.template }}
cancel-in-progress: false
env:
EXAMPLE_NAME: ci-${{ matrix.template }}
strategy:
fail-fast: false
matrix:
Expand All @@ -27,53 +28,30 @@ jobs:
uses: actions/checkout@v4

- name: Install uv
uses: astral-sh/setup-uv@v5

- name: Create example environment
run: uv run hud init "$RUNNER_TEMP/$EXAMPLE_NAME" --template "${{ matrix.template }}"

- name: Install example with the SDK from this checkout
working-directory: ${{ runner.temp }}/${{ env.EXAMPLE_NAME }}
run: |
uv build --wheel --no-create-gitignore --out-dir .hud-sdk "$GITHUB_WORKSPACE"
uv add --no-sync .hud-sdk/hud-*.whl
uv sync --all-extras
sed -i '/^RUN .*uv sync/i COPY .hud-sdk .hud-sdk' Dockerfile.hud
echo '!.hud-sdk/' >> .dockerignore
echo '!.hud-sdk/**' >> .dockerignore

- name: Run example checks
working-directory: ${{ runner.temp }}/${{ env.EXAMPLE_NAME }}
run: |
uv run --no-sync hud task list --source .
if [ -d tests ]; then
uv run --no-sync ruff format . --check
uv run --no-sync ruff check .
uv run --no-sync pytest -q
fi
uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0

- name: Deploy example environment
working-directory: ${{ runner.temp }}/${{ env.EXAMPLE_NAME }}
# The hosted test skips without credentials, which must not pass the gate.
- name: Require credentials
env:
HUD_API_KEY: ${{ secrets.HUD_API_KEY }}
run: uv run --no-sync hud deploy --no-env
run: test -n "$HUD_API_KEY"

- name: Run hosted task lifecycle
working-directory: ${{ runner.temp }}/${{ env.EXAMPLE_NAME }}
# hud init, install this checkout's SDK, deploy, run one rollout on the HUD
# runtime with a live model, check its lifecycle, and read the trace back.
- name: Deploy and run the template on HUD
env:
HUD_API_KEY: ${{ secrets.HUD_API_KEY }}
HUD_CI_DATA_FILE_ID: ${{ vars.HUD_CI_DATA_FILE_ID }}
HUD_TELEMETRY_LOCAL_DIR: ${{ runner.temp }}/traces-${{ matrix.template }}
run: |
uv run --no-sync "$GITHUB_WORKSPACE/scripts/example_lifecycle.py" prepare "${{ matrix.template }}"
timeout --signal=INT --kill-after=30s 15m uv run --no-sync hud eval .hud/ci-tasks.json claude \
--model claude-sonnet-4-6 --gateway --runtime hud --max-steps 10 --config max_tokens=2048 -y
uv run --no-sync "$GITHUB_WORKSPACE/scripts/example_lifecycle.py" check
HUD_E2E_TRACE_DIR: ${{ runner.temp }}/traces
run: >-
uv run --python 3.12 --all-extras
pytest -m "e2e and hosted" -p no:cacheprovider -rs
"tests/e2e/test_templates.py::test_a_deployed_template_runs_on_hud_and_its_trace_reads_back[${{ matrix.template }}]"

- name: Save traces
if: always()
uses: actions/upload-artifact@v4
with:
name: example-traces-${{ matrix.template }}
path: ${{ runner.temp }}/traces-${{ matrix.template }}
path: ${{ runner.temp }}/traces/${{ matrix.template }}
retention-days: 7
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ build/
!docs/v6/build/
*.egg-info/
uv.lock
# Harbor case fixtures carry a project's .env as test data.
!tests/integrations/harbor/cases/**/.env

# Media files
*.jpg
Expand Down
59 changes: 34 additions & 25 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ adding local workarounds.
- `CONTRIBUTING.md` for setup, test, lint, and type-check commands.
- `pyproject.toml` for supported Python versions, dependencies, optional extras,
ruff, ty, pytest, and coverage configuration.
- Source files and colocated tests for exact behavior. Trust code and tests over
- Source files and their tests for exact behavior. Trust code and tests over
stale prose.
- `cookbooks/` for runnable end-to-end examples (each is its own uv project).

Expand All @@ -31,6 +31,8 @@ inventory of current incidents.
- `hud/cli/` is the Typer surface over the same modules.
- `hud/integrations/` contains packaged adapters for external task formats.
- `hud/_legacy.py` and `hud/patches/` quarantine v5 compatibility.
- `tests/` mirrors the `hud` package layout: tests for `hud/cli/` live in
`tests/cli/`, tests for top-level modules in `tests/` itself.
- `cookbooks/` contains standalone runnable examples outside the `hud` package.

## Working Style
Expand All @@ -53,14 +55,15 @@ Use the commands in `CONTRIBUTING.md` as the source of truth. Common commands:

```bash
uv sync --extra dev
uv run pytest -q
uv run ruff format . --check
uv run ruff check .
uv run --extra dev --extra train ty check
uv run python scripts/check_tests.py
uv run pytest -n auto
```

The shared pre-push hook lives in `.githooks/pre-push`, but agents should not
change local git config unless explicitly asked.
Locally, ruff and ty are the loop; CI runs the test suite. Run the tests you
touched, and leave the full suite and the `e2e` lanes to CI.

Tests run on Python 3.11 and 3.12 in CI. `pyproject.toml` currently supports
Python `>=3.11, <3.13`.
Expand Down Expand Up @@ -119,27 +122,33 @@ Python `>=3.11, <3.13`.
- Use `TYPE_CHECKING` imports for type-only imports that would otherwise add
runtime dependency cost or cycles.

## Testing Expectations

- Add or update focused tests for behavior changes. Put tests near the module
they cover, following the existing `*/tests/` layout.
- Test behavior and contracts, not private implementation details.
- Regression tests should fail on the old behavior through the normal lifecycle
or public boundary. Do not manually seed private state such as internal maps,
caches, cursors, or prepared containers just to prove a changed line.
- If a bug involves internal state, reach it through real setup and execution:
construction, configuration, preparation, run loop, provider response, tool
execution, or public API call.
- Do not add hooks, helper methods, or abstraction layers only to make tests
easier. If a test needs that, reconsider the behavior boundary instead.
- Test names should describe the observable behavior or contract, not the
private mechanism.
- Mock external services, provider APIs, network, Docker, browser, and filesystem
boundaries as needed. Do not mock core logic just to make a test easy.
- Mark tests that require `HUD_API_KEY`, network access, or deployed services as
integration tests.
- Run the narrowest relevant tests first, then broader checks when the blast
radius is shared or user-facing.
## Testing

Tests are black-box: they drive the SDK through a public boundary and fake only
what lies outside it. `tests/support` holds those fakes: the HUD
services, scripted model providers, a `docker` executable, a VNC screen, and the
real `hud` CLI run in a subprocess. `CONTRIBUTING.md` shows how to use it.

- Enter through a public boundary: the `hud` CLI, an exported name, the control
channel or another wire protocol, a file format, or a process effect.
- Fake only the outside world: HUD services, model providers, Docker, cloud SDKs,
the clock. Never patch a `hud` name, import a private one, or touch a private
attribute; `scripts/check_tests.py` enforces this in CI. Configure the SDK the
way a user does, through environment variables (`hud_env.set(...)`).
- Never hand-build what a producer emits. Run the producer, so the test covers
the seam between it and its consumer.
- Assert what a user or a peer observes: the reward, run and trace fields,
output and exit codes, files, what the platform recorded, wire frames. Prefer
fixture environments whose reward proves the path ran.
- Write a scenario once per contract, as a table; a new case is a new row.
Assert the fields the case is about, never a recorded copy of a whole output:
no snapshots of argv, request bodies or rendered text.
- Do not add tests to check your own change. Check it with a temporary script,
and extend a scenario only when the change adds or fixes a contract; a bug fix
lands with the scenario row that failed before it.
- Tests needing something outside the process are marked `e2e` plus `docker`,
`sandbox`, `live` (a real HUD account) or `hosted`, and run only when selected.
- Test names describe the observable behavior, not the mechanism.

## Operational Debugging

Expand Down
Loading
Loading