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.
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.
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.
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.
Every call goes through the leash proxy. When a budget trips, the call is refused and the run stops cleanly, with the reason recorded.
No persistence of its own, no governance of its own. drover is one durable agent leash can govern, not a special case.
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.
drover orchestrates. rerun makes it durable. leash makes it affordable.