Skip to the content.

Development log

Otto was built between 7 and 14 September 2026 in 138 commits. This is the commit-by-commit record of what changed and, wherever a number was taken, what the number said. Test counts are the suite’s size at that commit. Hashes are short hashes on main.

The through-line: build the instrument first, change one thing, read the number, keep or revert. Several changes below were reverted on the number, and several “fixes” turned out to be harness bugs rather than agent behaviour. Both kinds are recorded, because a log that only keeps the wins is not a log.

Day 1 — 7 Sep: skeleton and routing

commit change
7457e8d Project skeleton.
13c5e03 .gitignore.
b731179 CLI moved into agent/cli/.
073ef46 agent/router/mapping.py as pure data: task seats, candidate chains, per-route params.
7eb924b The router and its first tests: resolve a seat to the first usable candidate.
cc5d646 Router construction and policy: what “usable” means for a provider.
8eac27e Model catalogue and hard-pinned routes.

Day 2 — 8 Sep: a CLI, observability, CI

commit change
703e7a1 First README.
30324f6 GitHub Actions: pytest on every push and PR.
6addd2a Basic CLI, a diffusion view for Mercury (Inception) models, provider imports moved under agent/.
ee1ba46 CI fix.
07206ad CLI branch merged.
9ebc3d5 Provider errors rendered as messages instead of tracebacks (three provider-error issues).
2e115f3, a297520 Langfuse observability: every model call traced.
c3d59de Warm-up and caching: six small changes so the first fan-out does not stampede providers, and a key that changes mid-process is noticed.

Day 3 — 9 Sep: the swarm

commit change
8428ff5 “The hive”: several agents per role, one vote, one live session. The architecture the next two days replaced, and the baseline the first golden-set number was taken against (9/10).

Day 4 — 10 Sep: a routed graph, conversation memory, workspaces, containers

The specialist graph.

The front end learns to converse.

Tiered memory.

A workspace and a container.

Day 5 — 11 Sep: habits, vendors, benchmarks, and the loop rewrite

Teaching the solver to debug, one habit at a time.

More vendors, more senses.

Claw-Eval against Otto, not against a model.

The loop rewrite (three steps, then everything that followed).

Day 6 — 12 Sep: new surfaces, self-evolution, hardening, and a day of live use

Browser, desktop, lessons.

Routing that learns, memory that gives back.

SWE-bench, and the harness bugs it hid.

A day of live use.

Day 7 — 13 Sep: setup, documents, sessions

Day 8 — 14 Sep: a persistent interpreter, an embedding API, the phone tools, otto serve