Keep infrastructure outside the non-deterministic loop.
The daemon owns polling, queueing, claims, Git, GitHub and timeouts. The harness owns the reasoning. Neither side quietly steals the other's job.
A single-host Rust daemon that watches labelled GitHub issues, claims the work, gives your AI harness an isolated place to operate, enforces the boring deterministic rules, then turns the result into the branch, push, pull request and issue lifecycle around it.
hermes plugins install barkley-assistant/caduceus --enable
The daemon owns the machinery that should never depend on model vibes: polling, claims, worktrees, process supervision, Git, GitHub, retries and finalisation. The worker gets the code problem and a narrow contract. That's the whole trick.
Caduceus is deliberately not an autonomous software company in a box. It is operator infrastructure around an agent: explicit boundaries, boring failure modes, inspectable state and a human at the merge button.
The daemon owns polling, queueing, claims, Git, GitHub and timeouts. The harness owns the reasoning. Neither side quietly steals the other's job.
No inbound listener. The daemon polls GitHub outbound and keeps credentials away from the worker environment instead of exposing a webhook-shaped attack surface.
Point it at Codex, Claude Code, pi or your own harness. Plugin updates never overwrite your edited bridge; upstream changes arrive as a sibling candidate instead.
Caduceus and your AI harness meet through a sanitised environment contract and one result file. That keeps the worker replaceable and the daemon testable without teaching either half too much about the other.
CADUCEUS_*worker-result.json◀──────bounded resultWorkers are allowed to think for a while. They are not allowed to become immortal. Caduceus wraps each run in the kinds of constraints boring daemons have been using forever, then adds optional OCI isolation when the host boundary is not enough.
The Rust supervisor owns the worker lifetime and terminates the process tree when the run exceeds its configured boundary.
Each claimed issue gets its own Git worktree instead of letting concurrent workers stampede through the same checkout.
stdout and stderr are captured into a per-run transcript with an explicit byte cap and truncation marker.
Exercise the whole path without commit, push, comments, labels, PR creation or issue closure, and inspect the report before trusting it.
The simplest mode: isolated Git worktree, sanitised environment and supervised child process on a host you already trust.
executor_mode: trusted_host
worker_parallelism: 1
poll_interval_seconds: 120Docker or Podman execution with an immutable image reference, resource ceilings, explicit network policy and bounded stop/reconcile behaviour.
executor_mode: oci
sandbox:
engine: docker
image: worker@sha256:…
resources:
cpus: 2.0
memory_mb: 2048
pids: 256
network: noneThis is daemon software, not a vibes dashboard. Runs leave transcripts. State has supported migration paths. JSON is the default backend, SQLite is optional, writes are validated and atomic, and `status` / `doctor` are meant to tell you when something is actually wrong.
$ hermes caduceus status
status read complete
$ caduceus migrate-state --to-sqlite --dry-run
validate ok
write skipped # dry-run
$ hermes caduceus doctor
configuration check
scheduler check
worker bridge check
$ _It exists to remove operator toil, not the operator. The daemon surfaces the run, the evidence and the failure state; maintainers still own the decision that actually changes production.
Caduceus is open source, MIT licensed, Linux-first and deliberately small enough that the operator can understand the process wrapping their agent.