or agony if you dont have enough VRAM.
Pit two AI agents against each other over any proposition and get a reasoned verdict. The proposition can be a design/architecture choice, a technical tradeoff, a strategy or policy, or a head-to-head X vs Y comparison.
The name comes from Ancient Greek drama
I had an idea for using two agents to debate over a topic and produce a verdict. My first implementation was a python based MCP server you connected a harness to. I also tried this in go.
This worked, but I didn't like the idea of having to start the server each time, and connecting the harness afterwards before I could use this feature.
I attended GopherconUK 2026, and got particularly excited about the Kronk package: a go API that provided local inference with LLMs, with the intent to remove the need for a model server (or mcp server).
I wanted to experiment with using a spec document to guide an LLM on autopilot, rather than traditional prompting in a harness, to move from a MCP server architecture to a TUI app. I had a spec document and had Kimi K3 refine it. The spec details the requirements, constraints, and UX design choices I wanted. I sent Sonnet 5 on the implementation.
The result worked... but was quite bloated. I was happy with the general direction but saw a lot of room for improvement in terms of design, maintainability, and code quality (you can see so in the commit history).
NOTE: This project is still in early stages of development.
go run ./agonThis opens the TUI at the main menu.
- Start a new debate: fill in the topic and (optionally) freeform starting context. You can specify paths to documents, code, etc, which will be added into the models read only sandbox.
- Browse archive: reopen any past debate, read-only.
Archived debates are written to debates/<session_id>.json (one file per session,
written exactly once when the verdict completes; a killed or crashed run leaves no
file).
- Menu:
↑/↓select ·enterconfirm ·ctrl+cquit. - New-debate form:
tab/shift+tabmove between fields ·enternext field (or submit from the last field) ·ctrl+ssubmit ·esccancel. - Session view (live or archived; exclusive full-screen, no menu chrome while a
debate is open):
j/kor↑/↓scroll the transcript ·aabort the live debate (with confirmation; discards the in-memory transcript, nothing is archived) ·escback to the menu (a live debate keeps running in the background; reopen it from the archive list, marked●, to resume watching) ·ctrl+cquit the app. - Archive list:
↑/↓select ·enteropen (read-only) ·escback to the menu.
Only one debate can be live at a time; starting a new one while another is running is blocked until you finish or abort it.
proposition(default): one claim.advocateargues FOR,criticargues AGAINST.versus: two named options compete; each side advocates its own option.
formal (default), informal, genz, unhinged. Tone is style only; it never lowers
the bar on substance, evidence, or honesty, and both sides share one tone so the debate stays
even.
Debaters back claims with citations rendered as clickable markdown links in the
transcript: [label](https://…) for external facts, [path:line](path#Lline) for files.
If the starting context contains a path that resolves to an existing directory or file, both
sides get sandboxed, read-only tool access (read_file, grep, list_dir) to that location
so they can ground and cite real content; tool calls appear inline as collapsible ⚙ blocks
and are recorded in the archive alongside the messages.
This project uses a Makefile with the following targets:
make build- Compile the binarymake run- Run the TUI in the foreground (Ctrl-C to quit)make test- Run all tests with the race detector, serialized (recommended for -race)make vet- Run go vetmake fmt- Check gofmt formattingmake clean- Remove the built binary