Winning Autolab With Hermes Delegation
This guide adds a Hermes-native coordination path to this repo while keeping OpenCode canonical.
The goal is unchanged: maximize useful, non-duplicated experiments per GPU-hour until you beat current master on val_bpb.
Concept Map
- repo rules ->
AGENTS.md - Hermes parent workflow ->
delegate_task(...) - repo-local shared skills ->
.agents/skills/ - experiment worker state ->
scripts/hermes_worker.pyandscripts/opencode_worker.py - durable ledger ->
research/notes.md,research/do-not-repeat.md, andresearch/experiments/
Checked-In Hermes Assets
AGENTS.mdThe only checked-in repo rulebook Hermes should load.docs/hermes-subagents-guide.mdHermes-specific operator guide.scripts/setup_hermes_profile.pyCreates or updates a local Hermesautolabprofile home and wires in the repo skill directory.scripts/print_hermes_kickoff.pyPrints a standard parent-session kickoff prompt.scripts/hermes_worker.pyCreates isolated worktrees and prints ready-to-usedelegate_taskpayloads for experiment workers..agents/skills/Shared repo-local skills, includingautolab-hermes-delegation.
The repo intentionally does not ship .hermes.md. Hermes gives .hermes.md higher priority than AGENTS.md, which would create a second drifting rulebook.
Minimal Workflow
- Refresh current local benchmark truth:
uv run scripts/refresh_master.py --fetch-dag- Create or update the local Hermes profile home:
uv run scripts/setup_hermes_profile.py --profile autolabThis script prefers hermes profile create autolab --clone when your Hermes build supports profile subcommands. On older builds that only expose HERMES_HOME, it creates ~/.hermes/profiles/autolab/ directly and writes an autolab wrapper in ~/.local/bin/.
- If you have not configured a model/provider for Hermes yet, do that once:
autolab setupFallback if the wrapper is not on PATH yet:
HERMES_HOME=~/.hermes/profiles/autolab hermes setup- Print a kickoff prompt and start the parent session from the pre-training project root:
uv run scripts/print_hermes_kickoff.py --gpu-slots 1
autolab chat --toolsets "terminal,file,web,skills,delegation,clarify"- In the parent Hermes session:
- use
delegate_task(...)for planner, reviewer, researcher, reporter, and memory-keeper - keep Hermes
memoryout of the default toolsets so repo markdown stays the durable record - keep Hermes child concurrency at
min(gpu_slots, 3) - if you need more than 3 child workers, use multiple top-level Hermes sessions or use OpenCode instead
Role Contracts
Use the autolab-hermes-delegation skill as the canonical contract for Hermes roles. The default toolsets are:
- planner and reviewer:
["file"] - memory-keeper:
["file"] - researcher:
["web", "file", "skills", "terminal"] - reporter and experiment-worker:
["terminal", "file", "skills"]
Hermes children get a fresh context, cannot ask the user for clarification, cannot delegate again, and only return their final summary to the parent. Pass the full role contract in every delegation call.
Experiment Worker Flow
Create one explicit worktree reservation per experiment:
uv run scripts/hermes_worker.py create exp-warmdown-20 \
--campaign "schedule: shorter cooldowns" \
--hypothesis "Shorten warmdown to test whether the long cooldown tail is wasting the fixed budget."Then print the worker payload:
uv run scripts/hermes_worker.py delegate exp-warmdown-20Paste the emitted delegate_task(...) block into the parent Hermes session. That payload includes:
- the absolute worktree path
- the experiment id
- the reserved log path
- the allowed edit scope
- the required commands
- the required final report fields
The worker stays in the isolated worktree. The parent session and memory-keeper stay in the main checkout.
When the run is fully recorded, clean up the worktree:
uv run scripts/hermes_worker.py cleanup exp-warmdown-20Worktree Rules
- Do not enable profile-wide
worktree: truefor the Hermes parent by default. This repo expects the coordinating parent to stay in the main checkout. - Use explicit worker worktrees through
scripts/hermes_worker.pyfor paid experiment runs. scripts/setup_hermes_profile.pyforcesworktree: falsein the Hermes profile config for that reason.
What Good Looks Like
You are using the Hermes-native flow well when:
AGENTS.mdremains the only checked-in repo context file Hermes loads- planners reject duplicate or stale ideas before a paid run starts
- each worker payload stays single-change and worktree-isolated
- memory updates happen in the main checkout after the worker summary returns
- no parent session tries to exceed Hermes' 3-child delegation ceiling