harbor run -d drugtargetbench/drugtargetbenchharbor run -d drugtargetbench/drugtargetbenchAgentic causal target discovery across 20 semi-synthetic biobank worlds. Derive a cardiac phenotype from raw cine-MRI, then identify the proteins that causally drive disease under ten planted trap mechanisms and a real laboratory budget.
harbor run -d drugtargetbench/drugtargetbenchAgentic causal target discovery across 20 semi-synthetic biobank worlds. Derive a cardiac phenotype from raw cine-MRI, then identify the proteins that causally drive disease under ten planted trap mechanisms and a real laboratory budget.
harbor run -d drugtargetbench/drugtargetbenchThree layers, deliberately separate:
| Layer | Holds | Why |
|---|---|---|
| GitHub (this repo) | task generator, task packages, manifests, CI | small, reviewable, versioned |
| Hugging Face dataset | per-world imaging and omics shards | large, immutable, content-addressed |
| Harbor Hub | published task packages and dataset manifests | what users actually run |
The imaging corpus is never committed here and never enters a Harbor package.
Each task fetches only worlds/<world-id>/* from a pinned commit sha.
The asset dataset (sammargolis/drugtargetworld-assets) is gated on Hugging
Face, because its cine-MRI is derived from registration-gated ACDC anatomy.
Users accept the ACDC terms once on the dataset page, then run with a token:
export HF_TOKEN=hf_...
harbor run -d drugtargetbench/drugtargetbench@v1.1 -a <agent> -m <model>
Each task's environment/docker-compose.yaml passes HF_TOKEN to the image
build as a BuildKit secret; the Dockerfile's materialise step reads it from
/run/secrets/hf_token. The token is never written to an image layer and is
not in the container environment, so the agent cannot read it. Without a
token, or before the terms are accepted, the build stops with a gated-repo
error. v1.0 predates the gate and no longer builds.
# 1. audit the panel into the source of truth
python harbor/scripts/build_manifest.py \
--panel <panel-dir> --plan <plan.json> \
--out harbor/harbor_conversion_manifest.json
# 2. pack per-world shards with checksums
python harbor/scripts/prepare_assets.py \
--panel <panel-dir> --manifest harbor/harbor_conversion_manifest.json \
--out <prepared-assets>
# 3. upload, then pin the returned commit sha
hf upload drugtargetbench/drugtargetbench-assets <prepared-assets> / \
--repo-type dataset
echo "<full-40-char-sha>" > harbor/data_revision.txt
# 4. regenerate tasks against the pinned revision
python harbor/scripts/generate_tasks.py \
--manifest harbor/harbor_conversion_manifest.json --out harbor/tasks
python harbor/scripts/build_datasets.py \
--manifest harbor/harbor_conversion_manifest.json \
--tasks harbor/tasks --out harbor
# 5. gates
scripts/release_harbor.sh validate
scripts/release_harbor.sh oracle
check_release.py refuses any revision that is not a full 40-character sha,
so a task can never ship pointing at main.
One Harbor task per (world, budget regime): 20 worlds x 3 regimes = 60 tasks. Task ids come from the panel plan's slot id, never from enumeration order, so a world keeps its Harbor identity across releases. The three regimes for a world share one asset shard, so imaging is not duplicated.
sealed/ splits in two. oracle_state.npz is the only piece that reaches the
task container, unpacked to a root-owned /opt/dtb-oracle that the
unprivileged agent account cannot read; the experiment service reads it and
enforces the budget. Everything else -- the driver list, trap mapping,
directions, latent trait, phenotype baseline -- exists only in the verifier
environment, which runs in environment_mode = "separate".
/app/data is not declared as an artifact, so the imaging corpus never
travels back as a trial result. Only submission.json and phenotype.csv do.
The verifier calls the repository's own cardioseek.scoring.score, so the
Harbor reward is rubric v0.9 and not a re-derivation. The full component
breakdown (target identification, causal confidence, discrimination,
direction of effect, phenotype construction, safety penalty) is written to
/logs/verifier/score.json; reward.txt carries the rubric total normalised
to 0-1 because Harbor rewards are unit-scaled.
Three layers, deliberately separate:
| Layer | Holds | Why |
|---|---|---|
| GitHub (this repo) | task generator, task packages, manifests, CI | small, reviewable, versioned |
| Hugging Face dataset | per-world imaging and omics shards | large, immutable, content-addressed |
| Harbor Hub | published task packages and dataset manifests | what users actually run |
The imaging corpus is never committed here and never enters a Harbor package.
Each task fetches only worlds/<world-id>/* from a pinned commit sha.
The asset dataset (sammargolis/drugtargetworld-assets) is gated on Hugging
Face, because its cine-MRI is derived from registration-gated ACDC anatomy.
Users accept the ACDC terms once on the dataset page, then run with a token:
export HF_TOKEN=hf_...
harbor run -d drugtargetbench/drugtargetbench@v1.1 -a <agent> -m <model>
Each task's environment/docker-compose.yaml passes HF_TOKEN to the image
build as a BuildKit secret; the Dockerfile's materialise step reads it from
/run/secrets/hf_token. The token is never written to an image layer and is
not in the container environment, so the agent cannot read it. Without a
token, or before the terms are accepted, the build stops with a gated-repo
error. v1.0 predates the gate and no longer builds.
# 1. audit the panel into the source of truth
python harbor/scripts/build_manifest.py \
--panel <panel-dir> --plan <plan.json> \
--out harbor/harbor_conversion_manifest.json
# 2. pack per-world shards with checksums
python harbor/scripts/prepare_assets.py \
--panel <panel-dir> --manifest harbor/harbor_conversion_manifest.json \
--out <prepared-assets>
# 3. upload, then pin the returned commit sha
hf upload drugtargetbench/drugtargetbench-assets <prepared-assets> / \
--repo-type dataset
echo "<full-40-char-sha>" > harbor/data_revision.txt
# 4. regenerate tasks against the pinned revision
python harbor/scripts/generate_tasks.py \
--manifest harbor/harbor_conversion_manifest.json --out harbor/tasks
python harbor/scripts/build_datasets.py \
--manifest harbor/harbor_conversion_manifest.json \
--tasks harbor/tasks --out harbor
# 5. gates
scripts/release_harbor.sh validate
scripts/release_harbor.sh oracle
check_release.py refuses any revision that is not a full 40-character sha,
so a task can never ship pointing at main.
One Harbor task per (world, budget regime): 20 worlds x 3 regimes = 60 tasks. Task ids come from the panel plan's slot id, never from enumeration order, so a world keeps its Harbor identity across releases. The three regimes for a world share one asset shard, so imaging is not duplicated.
sealed/ splits in two. oracle_state.npz is the only piece that reaches the
task container, unpacked to a root-owned /opt/dtb-oracle that the
unprivileged agent account cannot read; the experiment service reads it and
enforces the budget. Everything else -- the driver list, trap mapping,
directions, latent trait, phenotype baseline -- exists only in the verifier
environment, which runs in environment_mode = "separate".
/app/data is not declared as an artifact, so the imaging corpus never
travels back as a trial result. Only submission.json and phenotype.csv do.
The verifier calls the repository's own cardioseek.scoring.score, so the
Harbor reward is rubric v0.9 and not a re-derivation. The full component
breakdown (target identification, causal confidence, discrimination,
direction of effect, phenotype construction, safety penalty) is written to
/logs/verifier/score.json; reward.txt carries the rubric total normalised
to 0-1 because Harbor rewards are unit-scaled.