9-IO 2026 Budget Vote Process
This case study asks what the 9 Input Output treasury-withdrawal
proposals looked like on-chain, who they paid, and how DReps voted on
them. The dataset is the 1,688-transaction lattice rooted at submission
transaction
73e171a4c0730b4b59ecae271ab89f12a9d56360b02920e1f95107dbdc1d6762:
one submission transaction and 1,687 vote transactions.
The report is SPARQL-driven. The typed cardano:Proposal,
cardano:TreasuryWithdrawals, and cardano:GovActionId predicates added
in the proposal and vote work make the workflow one emitter command plus
SPARQL, instead of CBOR-specific Python decoding or string matching.
Proposal labels below use the public IO/Momentum proposal names and the governance action index order for the shared submission transaction.1
Dataset and queries
The dataset assembly is documented in Dataset selection,
with the full transaction list in selections.txt,
the entity overlay in overlay.yaml, and the reproduce
pipe in README.md. The SPARQL evidence is split into one
page per query: Q1 asks,
Q2 beneficiary,
Q3 guard policy,
Q4 anchors,
Q5 vote tallies,
Q6 DRep behaviour, and
Q7 anchor hosts.
Entity rules
overlay.yaml names two 9-IO entities. The guard policy is
io.budget-guard-policy, keyed by script hash
fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64. The treasury
beneficiary credential is intersect.treasury-holding, keyed as a
StakeKey with bytes
8583857e4a12ffe1e6f641a1785a0f2f036c565cfbe6ff9db8e5a469, so the
lattice resolves the shared beneficiary credential to its named form. The
shared governance action id remains a raw query filter because the current
keys: grammar has no GovActionId leaf type.
Findings
Asks per proposal
The 9 proposals ask for 162,145,961 ada in total. Every row routes to the same recipient credential.
| Proposal | ADA ask |
|---|---|
| Cardano Maintenance | 62,134,630 |
| Consensus | 27,714,342 |
| Cardano Upgrades | 13,103,039 |
| Cardano High Assurance | 13,078,578 |
| Pogun | 12,290,000 |
| Plutus | 11,877,575 |
| L2 Scalability | 10,425,871 |
| Blockfrost | 7,920,000 |
| Developer Experience | 3,601,926 |
Single beneficiary and guard
All 9 disbursements route to one stake credential, 8583857e4a12ffe1e6f641a1785a0f2f036c565cfbe6ff9db8e5a469, and all 9 proposals carry one guard policy, fa24fb305126805cf2164c161d852a0e7330cf988f1fe558cf7d4a64.
Proposer rationale anchors
The proposal procedure shell exposes 9 proposer rationale anchors as typed cardano:Anchor nodes. See Q4 for the full IPFS URL list and query.
Vote tallies per proposal
The lattice contains 2,374 IO vote rows across 9 action indexes. The typed cardano:GovActionId join scopes votes to the shared submission transaction and uses cardano:hasIndex to distinguish the 9 proposals.
| Action index | Proposal | Abstain | No | Yes | Total |
|---|---|---|---|---|---|
| 0 | Developer Experience | 27 | 60 | 201 | 288 |
| 1 | Cardano Upgrades | 12 | 25 | 232 | 269 |
| 2 | Consensus | 11 | 18 | 239 | 268 |
| 3 | Cardano Maintenance | 24 | 39 | 206 | 269 |
| 4 | L2 Scalability | 38 | 65 | 161 | 264 |
| 5 | Cardano High Assurance | 22 | 31 | 210 | 263 |
| 6 | Plutus | 29 | 36 | 196 | 261 |
| 7 | Blockfrost | 44 | 89 | 109 | 242 |
| 8 | Pogun | 35 | 82 | 133 | 250 |
DRep behaviour
Across the IO-scoped vote set, 275 DReps appear. 129 voted as a mono-bloc, while 146 changed verdict across the 9 proposals. The mono-bloc breakdown was 110 Yes-only, 16 No-only, and 3 Abstain-only.
Rationale-anchor host distribution
The IO vote set contains 928 vote rationales with anchors. The top host is most-brass-sun.quicknode-ipfs.com with 422 rationales, about 45% of anchored IO vote rationales. See Q7 for the top-12 host table.
How to reproduce
The reproduce pipe is documented in README.md. In
summary, from this directory:
cq-rdf overlay --in overlay.yaml > overlay.ttl
xargs -P8 -n1 cq-rdf body --provider koios < selections.txt > bodies.ttl
cat overlay.ttl bodies.ttl > package.ttl
# Then run any of the 7 documented queries after saving its SPARQL block:
arq --data package.ttl --query q1-asks.rq
In package.ttl, every per-transaction-position blank node is namespaced
by its short transaction id, so positional bnodes such as _:input1,
_:vote1, and _:proposal1 do not collide across the 1,688
transactions. Content-addressed identifiers are emitted as stable
urn:cardano:id:* IRIs, so cross-transaction joins work without depending
on blank-node labels. The reader does not need to apply this naming rule;
cq-rdf body handles it.
Use the submission transaction id
73e171a4c0730b4b59ecae271ab89f12a9d56360b02920e1f95107dbdc1d6762
as the IO-action filter for vote queries. Reusing that filter prevents
co-bundled governance actions from leaking into the report.
-
Proposal labels and asks were reconciled against IO's 2026 proposal overview and the individual Momentum/GovernanceSpace pages for Developer Experience, Cardano Upgrades, Consensus, Cardano Maintenance, L2 Scalability, Cardano High Assurance, Plutus, Blockfrost, and Pogun. ↩