dr➔ver

Durable, budgeted agent runner

plan · act · observe · survive

An agent is a loop. drover makes that loop survive a crash and stay under budget, by running it as a rerun workflow with every model call governed by the leash proxy.

go install github.com/sylvester-francis/drover/cmd/drover@latest

Two ways the loop breaks, each already solved

An agent is a loop: plan, act, observe, repeat. In production it isn't durable (a crash halfway through a twelve-step job restarts the whole job and pays for it twice) and it isn't bounded (nothing stops a stuck loop from spending forever). drover doesn't reinvent either fix. It runs the loop as a rerun workflow and points every model call at a leash proxy: rerun makes the run survive a crash; leash makes it survive the invoice.

The loop is a durable workflow

for step := 0; step < maxSteps; step++ {
    resp := Do("model-N", callModel) // a completion, through the leash proxy
    if resp.Stopped != "" { break } // leash tripped a budget → stop, cleanly
    if !resp.Acting()    { break } // a final answer → done
    for _, call := range resp.ToolCalls {
        Do("tool-N", invokeTool) // a side effect, journaled once
    }
}

Every nondeterministic input (the model's reply, a tool's result) is captured inside a Do, so a crash resumes at the step that was in flight. drover keeps no state of its own: on recovery the conversation is refolded from the journal. A completed step replays without re-running; a tool caught mid-flight re-runs (at-least-once), so tools must be idempotent.

Owns only orchestration

↻

Durable by construction

The loop is a rerun workflow. A crash resumes at the in-flight step, replaying completed ones from the journal: no repeated work, no double charge.

➔

Bounded by leash

Every call goes through the leash proxy. When a budget trips, the call is refused and the run stops cleanly, with the reason recorded.

●

Composes, owns nothing

No persistence of its own, no governance of its own. drover is one durable agent leash can govern, not a special case.

⚙

Any provider, in Go

OpenAI, Anthropic, Gemini, and a local Ollama behind one interface, plus an offline fake. Define agents and tools in a little Go: no SDK lock-in, no config DSL.

Three layers, one job

rerundurable execution
crash · replay · resume
droverorchestrates the loop
plan · act · observe
leashspend governance
meter · refuse · stop

drover orchestrates. rerun makes it durable. leash makes it affordable.