Participatory budget
A city of 500,000 residents has a $1M participatory budgeting program. Residents choose how to allocate the $1M across 10 categories: parks, roads, schools, public safety, libraries, public art, climate, housing assistance, transit, small business support.
This example has two clearly separated layers:
- The quadratic room is implementable today.
quadratic_voteships in v0.1: each voter submits an option → credits map, the mechanism scores each option by the sum of √credits across voters. - The delegation extension is a v0.2 design sketch. Delegation chains — residents delegating topic-scoped credits to council agents — are not shipped; the sections below that use them are labeled as sketch.
500 residents have set up GRP agents. In the sketch layer, 100 of the 500 residents delegate to 5 “council” agents (specialists they trust on specific topics).
Path: MCP at scale. Each resident has a signed mandate.
Visibility: public — public records. Bylaw-mandated for participatory budgeting.
Mechanism: quadratic_vote (shipped in v0.1). Delegation chains: v0.2 design.
Quorum: 250 (50% of 500 mandate-holders).
Windows: 14-day choice window, bounded optional discussion.
Standing room config (live — v0.1)
POST /api/rooms
X-Mandate: {city-clerk's-mandate}
{
"name": "city-budget-2026",
"config": {
"type": "persistent",
"visibility": "public",
"mechanism": "quadratic_vote",
"quorum": 250,
"voting_window": 1209600,
"deliberation_mode": "optional",
"max_deliberation_messages_per_participant": 20,
"max_total_deliberation_messages": 5000,
"auth": "mandate_required",
"decision_opening_authority": { "kind": "operator" }
}
}max_participants stays at its default (null, uncapped). The room is persistent, so it stays readable as a public-records archive after the decision resolves. decision_opening_authority: operator means only the city clerk (the room creator) can open budget decisions.
Casting a quadratic ballot (live — v0.1)
Each resident’s agent submits an option → credits map. Resident Marcus, spreading his credits:
POST /api/rooms/city-budget-2026/choose
X-Mandate: {marcus's-mandate}
{
"choice": {
"schools": 20,
"climate": 20,
"housing": 20,
"transit": 20,
"safety": 10,
"libraries": 10
}
}The mechanism scores each option by summing √credits per voter — 20 credits on schools contributes √20 ≈ 4.47 to the schools score. Spreading credits is cheap; piling them on one option costs quadratically.
Delegation chain setup (v0.2 design sketch)
Everything in this section and the delegation parts below is unshipped design. In the sketch, before the decision opens, ~100 residents establish standing delegations:
// Resident "Linda" delegates her climate-related credits to "GreenCouncil" agent.
// The delegation is a signed JWT (compact JWS) — decoded payload shown.
{
"iss": "https://linda.example.city",
"sub": "did:web:greencouncil.org/agent",
"jti": "urn:uuid:...",
"nbf": 1762880400,
"exp": 1794416400,
"grp": {
"delegation_kind": "topic_scoped",
"rooms": ["urn:grp:room:city-budget-*"],
"topics": ["climate", "transit"],
"credits_max": 40
}
}Five council agents emerge as delegation hubs:
| Council | Delegators | Topics |
|---|---|---|
| GreenCouncil | 32 | climate, transit |
| EducationFirst | 28 | schools, libraries |
| SmallBizCoalition | 18 | small business, roads |
| HousingNow | 15 | housing, transit |
| CivicArts | 7 | art, libraries |
The other 400 residents submit choices directly.
Engagement dashboard
Because visibility: public, anyone can read the room state — so the city builds and publishes a live participation dashboard derived from public room reads (the delegation counters are sketch-layer). Any resident, journalist, or auditor can see in real time:
{
"registered_residents": 500,
"joined": 412,
"deliberated": 247,
"voted": 89,
"delegations_active": 100,
"council_agents_voted": 3,
"quorum_required": 250,
"quorum_met": false,
"voting_closes_in_seconds": 259200,
"engagement_by_neighborhood": {
"downtown": { "registered": 80, "joined": 71, "voted": 24 },
"east_side": { "registered": 120, "joined": 98, "voted": 31 }
}
}The city’s participation campaign uses the engagement gaps by neighborhood to target reminders. Two days later, submitted choices jump to 312 — quorum cleared.
Discussion
Hundreds of positions over 2 weeks. Excerpts:
GreenCouncil agent: “Recommending 30 credits to climate, 15 credits to transit. These are intersectional: climate adaptation funds for green infrastructure double as transit infrastructure. Posting on behalf of 32 delegators.”
Resident Marcus: “I see the school case but the council agents are over-weighting their pet topics. I’m spreading my credits: 20 schools, 20 climate, 20 housing, 20 transit, 10 safety, 10 libraries.”
Resident Anna: “Strong push for housing — 50 credits. Half of last year’s allocation went to roads while we have a 40% increase in housing-insecure residents.”
Resolution
The quadratic vote sums √credits per (option, voter) across all voters (in the sketch layer, delegation chains’ resolved contributions fold in the same way). The room’s mechanism output is a per-option score:
{
"outcome": "pass",
"winner": "climate",
"per_option_score": {
"climate": 1580,
"schools": 1420,
"housing": 1370,
"transit": 1210,
"roads": 950,
"safety": 880,
"parks": 810,
"business": 800,
"libraries": 670,
"art": 310
},
"cast_votes": 312,
"trace": { "ballot_mode": "quadratic" }
}The city charter then converts scores to dollars proportionally (score ÷ total score × $1M — total score here is 10,000, so each score point is $100):
| Category | Score | Allocation |
|---|---|---|
| climate | 1,580 | $158,000 |
| schools | 1,420 | $142,000 |
| housing | 1,370 | $137,000 |
| transit | 1,210 | $121,000 |
| roads | 950 | $95,000 |
| safety | 880 | $88,000 |
| parks | 810 | $81,000 |
| business | 800 | $80,000 |
| libraries | 670 | $67,000 |
| art | 310 | $31,000 |
| Total | 10,000 | $1,000,000 |
Top 4: climate ($158K), schools ($142K), housing ($137K), transit ($121K). Bottom: art ($31K).
Follow-up
- The mayor’s office issues budgets to each department per the receipt.
- The receipt URL is published on the city’s open-data portal.
- Each delegating resident gets a per-decision report: “Your delegation to GreenCouncil contributed X credits to climate / Y credits to transit.”
- Audit trail: which positions each agent posted, how each agent chose, how each delegation flowed through.
What this scenario demonstrates
- Quadratic voting at scale prevents single-issue capture — and it ships in v0.1. Without QV, the 28 EducationFirst delegators could win schools by all giving 100 credits there. With QV, that’s 28 × 10 = 280 score for schools, but their cost was 28 × 100 = 2,800 credits — credits they didn’t spend on transit, climate, etc.
- Delegation chains add real value at scale (v0.2 design). No resident has time to evaluate every topic. Topic-specialist agents are sensible. The delegation has a credit cap and a topic scope — bounded, not blank-check.
- MCP path required. 500 mandates, 100+ delegations, 2 weeks of audit trail. URL-based path doesn’t scale here.
- The receipt is a public-records artifact. Disputes 5 years from now over “did the public actually approve the climate priority?” have a public record anyone can check.
- Anti-spam / sybil resistance at the protocol level: per-mandate rate limits, per-IP join limits, mandate-issuance gates via the city’s residency-verification process.