Inspiration
When disaster funding runs short, emergency planners have to split a fixed fund across counties that all have real claims, using evidence that is incomplete and often contested. The decision has to hold up later, in front of auditors, officials and the public. Most AI tools hand back an answer with no record of why it survived. I wanted a tool that shows its work: who objected, what evidence they cited, what changed because of it, and what is still unresolved.
What it does
MetroDesk runs a council of five AI agents on an emergency funding brief. The Negotiator proposes an allocation. Four reviewers challenge it with cited evidence: Analyst tests facts and sources, Risk hunts for hazards and failure modes, Strategy compares alternatives and tradeoffs, and Stability weighs longer-term effects and who carries the burden. The Negotiator revises over three rounds, and each reviewer checks whether the revision actually fixes its own objections. Then every reviewer votes, and a Moderator records the decision along with the dissent and every unresolved issue.
Multi-agent councils often fail by agreeing with themselves. As Alex Prompter put it, you get "one perspective five times." MetroDesk is built against that failure. Disagreement is part of the structure, dissent is recorded instead of smoothed over, and two of the anchor roles that design calls for are already in the council: Stability covers long-horizon, second-order effects, and Risk plays the adversary looking for what breaks. The disagreement is real. In the recorded runs, three of four reviewers voted against the final proposal for Hurricane Quillon, and all four did for the Front Range wildfire.
Nothing is taken on trust. The server checks every citation against the exact passage in its source, recomputes every dollar from the line items against the budget and minimum reserve, and sends any answer that fails back to the model for correction. The result is an exportable decision record: the ledger, cited evidence, every proposal version, the full transcript, the votes and the dissent.
How we built it
Every agent turn is a separate call to NVIDIA Nemotron 3 Ultra (nvidia/Nemotron-3-Ultra-550b-a55b) on Nebius Token Factory, with a strict JSON schema for each operation. A run is a fixed schedule of 21 contributions: the opening proposal, three rounds of four challenges and a revision, four votes and the determination. Its large context window let long documents go straight into each agent's context, with no separate retrieval layer, and the server checks every quoted passage against them.
Agents call Tavily search and extract mid-turn, up to two calls per turn, to ground objections in live sources. Across the three recorded runs that came to 74 searches and 19 extracts.
The server is Node 22 and does the policing: citation checks against source text, budget arithmetic, objection tracking across rounds, and a correction loop that returns failed answers to the model. When an answer stops at the token limit, the limit doubles from 16,384 up to 65,536; after six failed attempts the run pauses for reviewer triage instead of accepting a bad answer. Every provider call is recorded with its request ID, latency and token use.
The front end is a Three.js theater with Brief, Floor, Evidence and Decision views, showing who is speaking beside the readable contributions. When hosted, the server requires a login, limits failed sign-ins, sends a strict Content Security Policy and keeps all provider keys server-side.
Challenges we ran into
Nemotron's hidden reasoning counts against max_tokens, and 50 calls hit the limit, some after 65,536 completion tokens, so I built retries that double the limit automatically. Getting content right took heavy policing: the server rejected 210 of 358 model answers before accepting them, most often for quoting passages that weren't in the cited source. Prompts averaged about 40,000 tokens and the slowest call took over five minutes. On the platform side, telling AI Cloud and Token Factory apart wasn't intuitive at first, and not every listed model endpoint answered.
Copyright was its own challenge. After the runs, I removed web text that isn't clearly licensed for republication from the records and from the repository history. Citations, URLs and the agents' short quotes stay, and docs/SOURCES.md lists every source.
Accomplishments that we're proud of
This is my first contest submission, and the first project I've taken end to end. Three complete live deliberations ran through it: Hurricane Quillon ($46.75 million across 10 counties), the Cedar and Iowa River flood fight ($18.5 million across 8 recipients) and the Front Range wildfire ($9.6 million across 6 counties). Each produced 21 accepted contributions, four proposal versions, four votes and a determination. The records are archived from the live runs; web text not clearly licensed for republication was removed, and the citations were kept. VERIFICATION.md discloses every flaw the runs produced, including unverified citations and unresolved objections. The server checked 405 citations across the three runs and flagged the 59 it couldn't verify instead of passing them through.
What we learned
Structured disagreement beats agreement. A council is only worth running if the structure forces real challenges and keeps the dissent, and the server has to verify what the agents claim, because a model will confidently quote passages that aren't there. Strict structured output on Nemotron was solid: none of the 358 successful calls returned malformed JSON. Grounding with Tavily removed a whole layer I would otherwise have hand-built.
What's next for MetroDesk
MetroDesk keeps going whether or not it wins. Next, each agent will be able to dispatch its own team of agents for specific tasks, and the council will keep memory across sessions so earlier decisions, evidence and dissent carry into the next run. From the same council design, I'll add isolated first-round positions, so each reviewer forms its view before seeing the others. I'll also add a dedicated devil's advocate that can run on its own as a quick check, and a trigger that saves the full council for decisions that are uncertain and hard to reverse.
Log in or sign up for Devpost to join the conversation.