harbor-glovebox
Run a Harbor trial inside a glovebox microVM instead of a shared-kernel container. Each trial boots one hardware-isolated VM behind glovebox's outgoing-traffic filter, and the filter's records land beside the trial's other artifacts.
Status
The harbor-trial live check drives one trial's environment calls on a real microVM in CI, then runs harbor run with Harbor's oracle agent over a one-task dataset through this environment. No run over a published dataset with a model-backed agent has used it yet.
Use
Install the released package:
pip install harbor-glovebox
To run the unreleased code on main instead, install all three packages from the repository at one revision. That needs git on the machine. Set R to the same tag or full commit for all three, since two people who install main on different days get different code. --upgrade --force-reinstall replaces a released glovebox-driver or glovebox-hosts that already satisfies the version pins:
R=git+https://github.com/AlexanderMattTurner/agent-glovebox.git@<tag-or-full-commit>
pip install --upgrade --force-reinstall \
"glovebox-hosts @ $R#subdirectory=glovebox-hosts" \
"glovebox-driver @ $R#subdirectory=glovebox-driver" \
"harbor-glovebox @ $R#subdirectory=harbor-glovebox"
Then run a trial:
harbor run --dataset <dataset> --agent claude-code \
--env harbor_glovebox.environment:GloveboxEnvironment
The host needs what any glovebox launch needs. glovebox sandbox preflight checks it, and each trial runs that check before it builds anything.
Users
A command runs as the user Harbor names, else the task's [agent].user or [verifier].user. With neither named, it runs as glovebox's de-privileged account, never as the image's own USER. Before that account's first command, it takes over the image's working directory and what the image's USER owned in its home. A task that names the image's own account keeps those files as they are. Every command inherits the image's ENV, as docker exec would carry it. Harbor names root itself for its own setup steps, such as installing the agent. Every command, root's included, sends its traffic through the in-VM filter and then the host filter outside the VM.
What it refuses, and why
network_mode = "public". glovebox has no unfiltered mode. Useallowlistand list every host the task needs. Put the agent's model endpoint in Harbor'sextra_allowed_hosts.- Wildcard and IP allowlist entries. The filter matches hostnames only. Harbor rejects such a task before it starts.
- A bare top-level name as an allowlist entry, such as
com. A public suffix with a dot, such asgithub.io, is accepted, but it reaches that one host alone. An ordinary entry also reaches one label below it, soexample.comadmitsapi.example.com. Under a public suffix that label is a stranger's name. - A download larger than 1 GiB. The guest's archive arrives in the host's memory whole, so the transfer fails rather than grow without bound.
- A task image that already ships
/logs,/tests,/solutionor/harbor. The guest's root is read-only, so each of Harbor's fixed trees is a link onto the guest's writable/tmpdisk, and the image build refuses to replace a tree the image carries. - Multi-container tasks (a
docker-compose.yamlin the task's environment directory).
storage_mb is ignored, as Harbor's own Docker environment ignores it.
Metadata
Release files for harbor-glovebox 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| harbor_glovebox-0.1.0.tar.gz | 15.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| harbor_glovebox-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.9 kB
Release files / harbor_glovebox-0.1.0.tar.gz
| Download URL | harbor_glovebox-0.1.0.tar.gz |
|---|---|
| Size | 15.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5fb8659cc1bb73fdcb4f422a148a01e58265421e9e955290922dbb1f7010736e
|
|
BLAKE2b-256 checksum How to use checksums |
8f9c27ffe4a4d423c71f254966f38b98868dd7a80698ed02e4977212ab674096
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / harbor_glovebox-0.1.0-py3-none-any.whl
| Download URL | harbor_glovebox-0.1.0-py3-none-any.whl |
|---|---|
| Size | 15.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
823e9f2149c58b5b2f58b1b85565c7c96f5e14299017f810e854e4087dbf6170
|
|
BLAKE2b-256 checksum How to use checksums |
afcdacf22d82a96980d0d0dbb694d44696b4b835152c130c9907497ca2031aaa
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.3 {"installer":{"name":"uv","version":"0.12.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|