AI Tools #6: Evaluating Local Models in a Plan-Execute-Review Loop A Rust harness called local-llm-loop, built by softwarewrighter, drives opencode against local models in an autonomous plan-execute-review loop and found that tool-use reliability moves wall-clock time more than tokens per second, with gpt-oss-20b MXFP4 on an RTX 5060 Ti completing the fastest full loop at 1m13s to a cargo test-green crate. Tested across a fleet of 8–9 machines including RTX 3060 12 GB, 5060 Ti 16 GB, 3090 24 GB, and M1 Max 64 GB, the harness requires models to clear two hardware-independent gates — native tool-calling that llama.cpp parses and strict-JSON output — which eliminated most small general models, though the emit self-heal channel carried gpt-oss-20b through the JSON gate unaided. The author notes the results rank speed only in this harness, with quality ranking listed as future work. local-llm-loop is a small Rust harness that drives opencode against a local model in an autonomous plan, execute, review loop. Give it a spec file — a goal plus architectural decisions — and it asks a model to produce a design and a list of steps, then works through them. TL;DR Shape Three separate LLM calls — plan, code, verify — with Rust deterministically owning the plan cursor, step history, and splicing between them. A mixture of deterministic and probabilistic parts, inspired by the RLM approach Two gates A model must clear native tool-calling that llama.cpp parses, and strict-JSON output. Both are hardware-independent, and they eliminate most small general models Measured on A fleet of 8–9 machines: RTX 3060 12 GB, 5060 Ti 16 GB, 3090 24 GB, M1 Max 64 GB Fastest complete loop gpt-oss-20b MXFP4 on the 5060 Ti, 1m13s to a cargo test-green crate Main finding Tool-use reliability moves wall-clock more than tokens per second. A model that one-shots each envelope beats a faster model that retries Caveat This ranks speed only, in this harness. Quality ranking is future work Resource Link local-llm-loop softwarewrighter/local-llm-loop opencode opencode.ai Related RLM: Recursive Language Models · Pi minimal agent Comments Discord The loop The binary is named bootstrap. In its orchestrate mode it turns a spec into a plan, then iterates the steps: a tool-using model implements each step, and a supervising model reviews the result and decides what happens next. spec.txt │ ▼ LLM plan ──► Plan{design, steps } ──► plan.json │ ▼ Rust owns the cursor + history loop over steps: LLM execute, tools ──► StepResult ──► step-NN-result.json LLM review ──► ReviewDecision ──► step-NN-review.json │ ├─ continue → advance cursor ├─ insert → splice new steps after cursor ├─ skip → drop next step └─ stop → halt for human The division of labour is the point. Every LLM call is a stateless opencode run; all the context it needs — goal, design, prior summaries, the current step — is passed in the prompt, and the Rust side owns the state. That is what makes insert, skip, and replan deterministic rather than something the model has to remember to do. Roles hand off through sentinel-delimited JSON, and every artifact is persisted. The harness is model-agnostic: it shells out to opencode run --model