{"slug": "i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation", "title": "I built an AI team that ships real work — and shows you the conversation", "summary": "A developer released Agent Team, an open-source MIT-licensed local-first runtime in which a Master agent plans work and Researcher, Builder and Reviewer agents execute it, emitting real artifacts plus an auditable log of bot-to-bot messages, timelines and verification bound to each artifact revision. In a 2026-09-13 run through the local Claude Code CLI, the system produced a Japanese launch page and three social-post drafts with four deliverables, 10 passing programmatic checks and a 6/6 reviewer verdict across 39 model turns and 35 tool calls at a $1.66 list-price equivalent. The project supports the Claude API, any OpenAI-compatible endpoint and local Ollama per bot, and the developer is seeking feedback on the review-revise-re-review loop and on limiting workers to task, artifact refs and inbox rather than full history.", "body_md": "Most \"multi-agent\" demos are bots narrating to each other. The log is the product; the work is secondary. I wanted the opposite: one request in, real files out, and a trail I could audit afterwards.\n\n**Agent Team** is an open-source (MIT), local-first runtime where a Master plans, a Researcher / Builder / Reviewer actually do the work, and you get the artifacts **plus** the real bot-to-bot messages, a timeline, and verification bound to each artifact revision.\n\nRepo: [https://github.com/FORIFOR/Multibot](https://github.com/FORIFOR/Multibot) · Site + 59s intro: [https://forifor.github.io/Multibot/](https://forifor.github.io/Multibot/)\n\n`message.sent` events — messages that were really delivered to another bot's mailbox. A question from the Builder wakes the Researcher, which answers with `reply_to`. Acknowledgements never wake a model.\nThe default connection runs every agent session through the local `claude -p`. Claude Code owns the loop for one session; the team's tools (`send_message`, `publish_artifact`, `run_check`, …) are exposed to it as MCP tools through a small stdio proxy that forwards each call to the runtime's ToolGateway. Policy, budget and the event log are identical to the API path; Claude Code's own built-in tools are disabled for these sessions. Cost and usage are read from the CLI's JSON result, and the model it actually used comes from `modelUsage`, never from the model's own claims.\n\nClaude API (official SDK), any OpenAI-compatible chat endpoint and local Ollama work the same way, per bot.\n\nOn 2026-09-13 I ran this request through the local Claude Code CLI: *\"From this product description, build a Japanese launch page and three social-post drafts. Record assumptions for anything missing. Stop before publishing. Have the Reviewer verify.\"*\n\n| Model (reported by the provider) | `claude-opus-5` | \n| Plan | Master chose 1 builder task + 1 reviewer task and skipped the researcher; 8 recorded assumptions (no prices, no invented numbers, placeholder URLs only) | \n| Deliverables | `index.html` (single-file page),`posts.md` ,`HANDOFF.md` ,`final-report.md` | \n| Verification | 10 programmatic checks → all pass; reviewer verdict 6/6, plus 4 optional findings sent back as a real message | \n| Usage | 39 model turns · 35 tool calls · $1.66 list-price equivalent · 18 min 37 s | \n| Status | completed | \n\nThe generated files, the final report and the 77-event JSONL log are committed under `docs/evidence/` without edits. Four runs total: run 1 finished *partial* and exposed a bug (a reviewer verifying two tasks had only its last verdict applied — fixed), runs 2–3 hit limits that were then tuned. One request is not a benchmark, and the prompts are original seeds.\n\nThe demo video on the site drives the real UI and runtime with a **scripted test provider** (labelled on screen) so it is deterministic and free to reproduce.\n\nStack: Python 3.12 / FastAPI / SQLite (WAL, append-only events, SSE), React + TypeScript. macOS seatbelt sandbox for builder commands (no network, writes only inside the task workspace); elsewhere a plain subprocess that says so in every result.\n\n```\ngit clone https://github.com/FORIFOR/Multibot && cd Multibot\ncd backend && uv venv .venv --python 3.12 && uv pip install --python .venv/bin/python -e '.[dev]'\ncd ../frontend && pnpm install && pnpm build && cd ../backend\n.venv/bin/agentteam probe    # real capability check through `claude -p`\n.venv/bin/agentteam serve    # http://127.0.0.1:8787\n```\n\nI'd love feedback on two things: whether the review → revise → re-review loop bound to revisions holds up on your tasks, and where \"fewer messages, more evidence\" (workers get their task, artifact refs and inbox — not the history) breaks down.", "url": "https://wpnews.pro/news/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation", "canonical_source": "https://dev.to/forifor/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation-251a", "published_at": "2026-09-12 15:44:18+00:00", "updated_at": "2026-09-12 16:15:14.308708+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "large-language-models", "ai-infrastructure"], "entities": ["Agent Team", "Claude Code", "Anthropic", "OpenAI", "Ollama", "FastAPI", "SQLite", "GitHub"], "alternates": {"html": "https://wpnews.pro/news/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation", "markdown": "https://wpnews.pro/news/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation.md", "text": "https://wpnews.pro/news/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation.txt", "jsonld": "https://wpnews.pro/news/i-built-an-ai-team-that-ships-real-work-and-shows-you-the-conversation.jsonld"}}