Any task → the loop it needs. A band of agents on Band that engineers a verification loop per task, then runs it on your real code until your real tests pass.
Project description
🐍 Ouroboros
any task → the loop it needs
The snake that eats its own tail — the oldest symbol for a loop that feeds itself until it's whole.
The problem: every coding-agent tool runs the same fixed loop for every task — a CSS tweak and a database migration get the identical Planner→Coder→Reviewer pipeline. When the loop's exit condition is too weak for the task, confident-but-wrong code ships. Ouroboros builds the loop the specific task needs — and a band of agents builds it, then runs it, on one audit trail.
Try it: https://nataliamw.github.io/ouroboros/ — describe your task; the loop synthesizes live. Run the loop on YOUR repo:
python run_on_repo.py --repo ../your-project --test "pytest -q" --file src/thing.py --goal "fix the bug"It runs your real test command in a generate→test→revise loop until your tests pass — or hands you a verified failure. No fixtures, your code.
…or as a live Band room of 6 agents working on your repo:
python band_repo.py --repo ../your-project --test "pytest -q" --file src/thing.py --goal "fix the bug"Six agents register on Band, connect over WebSocket, and coordinate the loop through
@mentionhandoffs — and two of them carry real tools:@QAEngineerruns your test command,@CodeAuthorpatches your file. Verified live: the room fixed a real bug in a real repo and only finalized once the real tests went green.Band of Agents Hackathon · Track 2 — Multi-Agent Software Development
Why it's useful (not a toy)
Point Ouroboros at a real project and a real test command. It runs the loop on
your code: your tests are the exit gate, a model patches the target file using the
real failure output, and it only ships a change your own suite accepts. Verified
end-to-end — on a real repo with a real pytest bug, the loop failed on a genuine
AssertionError, patched the file via AI/ML API, re-ran the suite, and shipped the
fix in one revision. If it can't make your tests pass in the budget, it stops and
hands you a verified failure instead of a confident wrong answer.
The shift this is built on
In June 2026, Addy Osmani and Boris Cherny (the creator of Claude Code) put a name to where agentic coding is going: loop engineering. The skill is no longer writing the perfect prompt — it's designing the loop the agent runs inside: generate → check → revise, until a real exit condition holds. As Peter Steinberger put it in a post that hit 6.5M views eleven days before this hackathon's deadline:
"You shouldn't be prompting coding agents anymore. You should be designing loops that prompt your agents."
There's a catch nobody's solved yet: building the loop is still manual, expert work — and every coding-agent tool ships the same loop for everything. A CSS tweak and a database migration get the identical Planner→Coder→Reviewer pipeline. That's vibe coding with extra steps.
Ouroboros closes that gap. It's a Band room where agents engineer the loop for the specific task, then run it — and pull in the specialists that task needs, on demand. Loop engineering, done by a band of agents instead of by hand.
And the loop is real: the checks don't fake pass/fail from a fixture — they
execute the generated Python in a sandboxed subprocess. A buggy revision genuinely
fails with an AssertionError, the loop genuinely bounces, and the fix (written by a
live AI/ML API model when keys are present, or a deterministic fallback when they're
not) only ships once it actually passes the tests.
What it does (in one run)
python demo.py feeds the room two different tasks and you watch it build two
different loops:
| Task A — bugfix (pure function) | Task B — auth change (high-stakes) | |
|---|---|---|
| signature gate | a repro-test (fails before, passes after) | an acceptance-test, end to end |
| critics | one standing rival reviewer | rival reviewer + a SecurityCritic recruited on demand |
| max revisions | 2 (tight) | 3 |
| human gate | none | a TechLead must sign before it ships |
Same room. Same agents. Different loop — because the loop is engineered for the task, not copy-pasted. That difference is the entire point.
How Band is the coordination layer (not a wrapper)
Three agents, two phases, all on one Band room transcript:
Phase 1 — design the loop
- @LoopArchitect (Pydantic AI) reads the task and proposes a loop: which checks gate it, which critics vote, when it may stop, whether a human must sign.
- @LoopCritic (LangGraph) attacks the proposed exit condition before any code
is written — "this is gameable", "this surface needs a security critic" — and
recruits that specialist into the room on demand via Band's add-participant
tool (
band_add_participant). This is the most Band-native moment in the system: the room decides, at runtime, that it needs a voice nobody added up front, and adds it.
Phase 2 — run the loop
- @LoopRunner (Pydantic AI) executes the assembled loop: generate a revision
(live via AI/ML API when keyed), let every critic (including the recruited one)
attack it, really run the required checks in a subprocess (
qa.py), and decide — stop, revise again, or pause for the human gate. Each revision is a real@mentionbounce in the room, and @QA posts the real ✅/❌ results into it.
Take Band out and this is impossible: the loop's design and its execution live on the same audit trail, so you can read the loop a room built before you trust the code it produced. The transcript is the record of both.
user ──"new task"──▶ @LoopArchitect ──proposes loop──▶ @LoopCritic
│
band_add_participant ◀──────┤ (recruits @SecurityCritic
│ when the task is high-stakes)
▼
@LoopRunner
generate → critics attack → revise → re-check
│
⛔ human gate (high-stakes only)
▼
verified code + the LoopSpec that produced it
Why it fits the rubric
- Application of Technology — Band is load-bearing in two distinct ways: dynamic
recruitment (the room grows its own membership to fit the task) and a visible
design-then-execute handoff chain, all as
@mentionrouting on one trail. - Originality — nobody else turns loop engineering itself into the multi-agent
product. Every other Track-2 entry runs a fixed pipeline; Ouroboros synthesizes
the pipeline per task. The thing it generates is the artifact (
LoopSpec). - Business Value — the failure mode of agentic coding is confident-but-wrong code shipping because the loop's exit condition was too weak. Ouroboros makes the loop inspectable and task-appropriate, with a human gate where the stakes demand one.
- Presentation — the whole thesis is one screen: two tasks, two loops, side by side, with the difference highlighted. Open the transcript to see it happen.
Market & business value
Who has the pain: every team shipping code with AI agents — and in 2026 that's most of them. The cost isn't speed, it's trust: a confidently-wrong change that passed a too-weak loop and made it to production.
- TAM — AI coding tools are a multi-billion-dollar category (Copilot, Cursor, Claude Code, Devin et al.), and every one of them runs a fixed loop. Loop quality is the next axis of competition.
- SAM — teams running agents against high-stakes surfaces (auth, payments, PII, migrations) where a wrong merge is expensive and a human gate is non-negotiable. These are exactly the teams that can't use a one-size-fits-all pipeline.
- Unique selling proposition — Ouroboros doesn't run a better loop; it builds
the right loop per task and makes it inspectable — you read the
LoopSpeca room engineered (its checks, critics, human gate) before you trust the code it produced. Competitors ship the pipeline; Ouroboros ships the pipeline plus the reasoning for its shape. - Where revenue comes from — a CI-native control plane: per-seat for the loop composer, usage-based for runs in the sandbox, and an enterprise tier for the audit trail and human-gate policy (the compliance story regulated teams actually pay for).
Architecture
| File | Role |
|---|---|
loopspec.py |
the Task and LoopSpec — the inspectable loop artifact |
qa.py |
real QA — executes generated code + tests in a sandboxed subprocess |
tasks.py |
concrete tasks with real buggy/fixed code + tests the loop runs |
specialists/architect.py |
@LoopArchitect — proposes a loop for the task |
specialists/critic.py |
@LoopCritic — attacks it, recruits specialists on demand |
specialists/runner.py |
@LoopRunner — runs generate→(real QA)→revise to the exit condition |
shared/band_harness.py |
thin Band wrapper + offline LocalRoom with recruit() |
demo.py |
deterministic two-task demo (zero credentials) |
band_agents.py |
live Band path (thenvoi SDK + credentials) |
docs/ |
the self-contained web viewer (GitHub Pages) |
Run it
Offline, deterministic, no credentials (this is what's on video):
python demo.py
Rebuild the web view from a real run:
python docs/build_data.py # regenerates docs/data.json + docs/index.html
Live, on Band (cross-framework agents over real rooms — verified working):
cp .env.example .env # add AIMLAPI_API_KEY + FEATHERLESS_API_KEY
cp agent_config.example.yaml agent_config.yaml # add Band agent_id/api_key per agent
pip install "band-sdk[pydantic-ai,langgraph]" python-dotenv pyyaml
python band_agents.py # connects all 6 agents to Band over WebSocket
Then in a Band room, add the six agents and @mention @LoopArchitect with a task.
This has been run for real: the six agents register on the Band platform, connect
over WebSocket, and coordinate a task end-to-end through @mention handoffs in a
live room — LoopArchitect → LoopCritic → LoopRunner → CodeAuthor → QAEngineer →
RivalReviewer, all on the Band transcript.
Tech
- Band (
bandSDK, v1.0.0) — the coordination layer: rooms,@mentionrouting, on-demand recruitment. - Cross-framework agents — Pydantic AI (Architect, Runner, Author, QA) + LangGraph (Critic). Six agents, three frameworks, one room.
- Two LLM providers, used for a reason — not bolted on. The author/architect/runner
reason on AI/ML API (frontier). The @RivalReviewer runs a Featherless OSS model
(Qwen2.5-72B) — a different vendor and model. That split is load-bearing: an
adversarial review only counts if a genuinely different brain does it, never the same
model grading its own work. Take Featherless out and the "rival" reviewer is just the
author talking to itself. (Verified live against
api.featherless.ai.) - No build step for the demo — the loop's control flow is deterministic, so the recording is byte-for-byte reproducible and doesn't depend on a live model.
MIT. Built by the Neon Code team — because the loop deserves to be engineered, not copy-pasted.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ouroboros_loop-0.1.0.tar.gz.
File metadata
- Download URL: ouroboros_loop-0.1.0.tar.gz
- Upload date:
- Size: 37.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aa8009fb76c4edc4ff55d10ce090fd0de8dc268b926fe844af1f63e5dbc14f7c
|
|
| MD5 |
99e45213f64ebac85f786cc3dc9e36b4
|
|
| BLAKE2b-256 |
f03c4417c067e3ec9a9f7c4be8f2e0be1910e9d6c2be2c786de7234a493f51d0
|
File details
Details for the file ouroboros_loop-0.1.0-py3-none-any.whl.
File metadata
- Download URL: ouroboros_loop-0.1.0-py3-none-any.whl
- Upload date:
- Size: 41.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11cd2b766bb105dcbc9ffec2b9e1dd36b3ffa8e0abfc7c0bf703da7ccdbd91ac
|
|
| MD5 |
c480bfc6dd456be5ff808b8eee61d66c
|
|
| BLAKE2b-256 |
9b923b597d77d693e88054360fd8e6e4245f6161f26cb9843b5bbd8825aae144
|