-
Notifications
You must be signed in to change notification settings - Fork 0
Quick Start
A five-minute tour of BizarHarness. This page assumes you've already run the installer — see Getting Started if you haven't.
Start opencode from the root of any project that has a .bizar/ folder (run bizarharness init first if you don't have one):
cd ~/my-project
opencodeThe opencode TUI loads. You'll see the agent list — Odin is the default, and the others (Frigg, Vör, Quick, Mimir, Heimdall, Hermod, Thor, Baldr, Tyr, Vidarr, Forseti) are available for direct selection.
Type @odin help to ask the router agent what it can do. Odin will respond with a description of its decomposition strategy, the cost-tier routing table, and the principle that it never executes work itself — it always dispatches.
This is a useful first invocation because it confirms the agent definitions loaded and the Hindsight MCP server (if configured) is reachable.
For a quick, free, no-side-effects question, ask Frigg:
@frigg what does this project do
Frigg uses Semble to search the codebase, reads package.json and any top-level docs, and returns a 1-2 paragraph summary with file references. It will never edit anything. This is the cheapest agent in the system (DeepSeek V4 Flash, free tier), so it's safe to use liberally for orientation.
Other things to try with Frigg:
@frigg where is the database connection configured@frigg show me the public API surface of the auth module@frigg what test framework is used and how do I run a single test
For deeper codebase exploration, route to Mimir:
@mimir research how authentication flows through the request lifecycle
Mimir uses Semble as its primary search tool, falls back to grep only when Semble is not available, and produces a structured findings document with file:line references. It's also free (DeepSeek Flash), so this is the right agent for "go learn about X" tasks before you commit to a change.
For work that touches code, route to Thor:
@thor add a /healthz endpoint that returns 200 OK
Odin will see this request, decompose it, and dispatch:
-
@thor(M2.7) to implement the endpoint and add a test. - (Possibly)
@tyr(M3) in parallel to review the design and write integration coverage.
Both agents run in the same message, so they happen in parallel. Odin synthesizes the result and shows you the diff. Because implementation is always split across Thor and Tyr, you get a fast implementation and a high-quality review without paying the flagship-model cost for the whole job.
For very small, mechanical tasks, use Heimdall instead:
@heimdall rename `getUserById` to `findUserById` across the repo
@heimdall add a CHANGELOG entry for the v1.2 release
Heimdall is free (DeepSeek Flash) and is the right agent for file operations, renames, and boilerplate.
When you give Odin a request, it goes through five stages:
- Classify — is this read-only (Frigg), research (Mimir), simple (Heimdall), moderate (Thor), complex (Tyr), or ambiguous (Vör)?
- Decompose — break the request into independent work streams. A "build a login page" request might split into: backend route, frontend form, validation logic, tests.
-
Dispatch — fire 2+ subagent
taskcalls in a single message. The calls run in parallel; you don't pay wall-clock time for the slowest one twice. - Audit (sometimes) — for Tier 4 or Tier 5 work (Tyr or Vidarr), Odin dispatches the plan to Forseti first. Forseti reviews the plan and either approves, requests changes, or rejects. The plan only executes after Forseti signs off.
- Synthesize — collect the parallel results, resolve conflicts, and respond to you as a single coherent answer.
A task invocation looks roughly like this inside Odin's context:
→ task(subagent_type="thor", prompt="Implement /healthz endpoint. Use Hono. Return JSON {status:'ok'}. Add a vitest test.")
→ task(subagent_type="tyr", prompt="Review the /healthz design. Add an integration test that boots the server and curls /healthz.")
Odin fires both in one message. The results come back in the order they finish. You see a single synthesized answer.
Say you ask: "Add rate limiting to the /api/posts endpoint."
Odin classifies the request as moderate implementation with a security angle. It decomposes:
-
Stream A (Thor, M2.7): Implement a sliding-window rate limiter middleware. Wire it into
/api/posts. Add a unit test. - Stream B (Tyr, M3): Review the rate limit math, suggest a token-bucket alternative, write a load test that exercises the limiter.
Odin dispatches both, then synthesizes:
Thor added a sliding-window limiter (100 req / min per IP) at
src/middleware/rateLimit.ts:14, wired into/api/postsatsrc/routes/posts.ts:42, with a vitest unit test attests/rateLimit.test.ts:9. Tyr's review recommends a token-bucket alternative for bursty traffic; a load test attests/load/rateLimit.load.tsconfirms 100 req/min holds under 200 concurrent clients. Both implementations passnpm test.
The actual work was done in parallel. You didn't pick a model. You didn't pick an agent. You described the outcome and Odin handled the rest.
The agents listed above (@frigg, @mimir, @thor, etc.) are also first-class agents you can invoke by name. You don't have to go through Odin. Use direct invocation when:
- You know exactly which agent you want and the routing is obvious.
- You're chaining calls and don't want Odin re-classifying each step.
- You're debugging a routing decision and want to see what a specific agent does.
Going through Odin (the default) is the right call for any non-trivial request because Odin will decompose it, run the streams in parallel, and synthesize the result.
Next: Architecture — the Norse-pantheon metaphor, the 5-tier model architecture, and the Odin router in detail.
Norse-pantheon multi-agent system for opencode.