Pool size
122
miners
122/256 passed the participation gate
Daily stream — live. Each day's settled standings are published here as they mature, with outcomes measured at 7, 14 and 28 days. Earlier weekly epochs remain below as the historical record. About the daily stream →
New — prediction performance by change type. For every kind of account change since the rich-data baseline: the best model's score, the current winner's score beside it, and the score broken into direction, size, range and goal — switchable across 7, 14 and 28-day outcomes. See the Performance tab → Full page →
SN21 · Apollo Finney · netuid 21 Daily 58 records 112,658 settled scores
View on taostatsSearch epoch · 122 scored of 256 registered
SN21 mining surface / Aggregate-only · D-05
Pulse · Operational snapshot
Headline numbers from the latest published epoch. SN21 closes one epoch per week — there is no live heartbeat, so "pulse" here means the standing state of the most recent close.
Pool size
122
miners
122/256 passed the participation gate
Baseline beat rate
100.0%
of pool
Share above the conditional-prior baseline
Elite tier
6
60.0% of emissions
EMA ≥ baseline + 1σ this epoch
Cohort context · this epoch vs all published
Leaders · this epoch
Top 2 of 122 scored
Current Leader
UID
171
Hotkey
5EcRKL...iBkd
Score
0.594
Runner-up
UID
133
Hotkey
5FW5NU...JrMW
Score
0.587
0.007 below leader
Top performer · this epoch
Identity on chain
Highest score in pool
0.594
That number is one miner's actual epoch-weighted score. Per IA D-05 we don't publish whose UID. Sort the SN21 miner table on taostats by score (descending) — the top row matches.
Mainnet · netuid 21
Tier band · Pool vs emissions
Live
Share of pool
measured
Share of emissions
policy constant
Elite
EMA ≥ baseline + 1σ
pool 4.9% · emit 60.0%
Competitive
beats baseline
pool 10.7% · emit 30.0%
Participating
passed gate
pool 10.7% · emit 10.0%
Tier rail · Emission shares + epoch context
4 metrics
Competitive
13
0.30 emissions share
Participating
13
0.10 emissions share
Multiplier
1.00×
Search
Formula
1.2.1
@ 861fdfc
Find yourself on chain
Opens taostats
Per IA D-05, no per-miner identifier ever leaves this server. The browser navigates straight to taostats.
For every kind of account change since the rich-data baseline (2026-08-20): the best model, the current winner beside it, and each score broken into its parts — 112,658 settled scores from 126 models.
Full page →Each stage is deliberate. The page counts the fourth: a change reaches it about 15 days after it happened, once its first outcome window has closed and settled.
Distribution · Score histogram + tier breakdown
Per IA D-05 the public surface publishes the shape of the score distribution — not per-miner identifiers. Bins are k-anonymity-collapsed to a 5-miner floor; the chain remains the source of truth for raw per-UID data.
Results · BD-2026-09-06-COR-1
Search ×1.00
Plain-language summary
Earning today
20/124
16% of the field
Not earning
104
most: running a model that already earns
Top score
0.594
leader of the pool
Score range
0.388
Wide range
Why the other 104 are not earning
Each row below names the rule that applied to it, and who holds the seat where that matters. Scores are unaffected — they are facts either way.
Verifiable against chain
Signed and chain-anchored
2026-09-06
Every published day is attested and hash-chained to the day before, and the feed's rolling root is committed on chain — so one anchor covers the whole history, not a single block span.
Reproduce locally
python scripts/verify_day.py --url https://hope-bittensor-api.onrender.com --day 2026-09-06 Recomputes every score from the day's signed receipt. Prints "ok": true when they reproduce, and names the entry that disagrees when they do not.
Scoring · v1.2.1 · commit 861fdfcac6
Per-miner results
124 miners
| Pos | UID | Hotkey | Score accuracy · edge vs field | Result | Chain |
|---|---|---|---|---|---|
| | 234 | 5EDE2D...iYqp | 0.571 +0.026 vs field | Not funded · Duplicate model
| taostats |
| | 160 | 5CyUYf...yyYU | 0.572 +0.025 vs field | Not funded · Duplicate model
| taostats |
| | 230 | 5EAcGJ...PdZq | 0.570 +0.025 vs field | Not funded · Duplicate model
| taostats |
| | 194 | 5D4WGv...r6mZ | 0.574 +0.025 vs field | Not funded · Duplicate model
| taostats |
| | 50 | 5EhW5L...YAxF | 0.572 +0.024 vs field | Not funded · Duplicate model
| taostats |
| | 110 | 5GCYWv...goaT | 0.572 +0.024 vs field | Not funded · Duplicate model
| taostats |
| | 134 | 5Feh5Q...bMoh | 0.568 +0.024 vs field | Not funded · Duplicate model
| taostats |
| | 42 | 5FWwba...3mdw | 0.572 +0.024 vs field | Funded · Competitive | taostats |
| | 32 | 5FqU7d...7QBW | 0.572 +0.023 vs field | Not funded · Duplicate model
| taostats |
| | 165 | 5FxE9o...U6ky | 0.567 +0.023 vs field | Not funded · Duplicate model
| taostats |
| | 125 | 5G3vwv...iZDK | 0.565 +0.020 vs field | Funded · Competitive | taostats |
| | 132 | 5FcD5D...TiuJ | 0.561 +0.018 vs field | Not funded · Duplicate model
| taostats |
| | 44 | 5Evf2A...voUX | 0.564 +0.018 vs field | Funded · Competitive | taostats |
| | 133 | 5FW5NU...JrMW | 0.588 +0.017 vs field | Funded · Competitive | taostats |
| | 208 | 5DG3Pr...vZxP | 0.559 +0.016 vs field | Not funded · Duplicate model
| taostats |
| | 181 | 5FNJHq...mP63 | 0.558 +0.016 vs field | Not funded · Duplicate model
| taostats |
| | 203 | 5Dz8LD...nxjh | 0.557 +0.015 vs field | Not funded · Duplicate model
| taostats |
| | 126 | 5Feaab...Kxjq | 0.554 +0.012 vs field | Not funded · One seat per coldkey
| taostats |
| | 254 | 5CXJtk...Es4n | 0.578 +0.011 vs field | Funded · Competitive | taostats |
| | 244 | 5ChwW1...QVyW | 0.585 +0.010 vs field | Funded · Participating | taostats |
| | 117 | 5HNYv1...8hTG | 0.568 +0.008 vs field | Funded · Participating | taostats |
| | 124 | 5CRib7...1bJ4 | 0.573 +0.008 vs field | Funded · Participating | taostats |
| | 188 | 5GNxWv...6z3G | 0.550 +0.006 vs field | Not funded · Duplicate model
| taostats |
| | 171 | 5EcRKL...iBkd | 0.594 +0.005 vs field | Not funded · Tenure
| taostats |
| | 9 | 5H8xxV...KdLK | 0.548 +0.005 vs field | Funded · Participating | taostats |
| | 178 | 5G7JTZ...nBn1 | 0.575 +0.004 vs field | Funded · Participating | taostats |
| | 25 | 5FRUMn...gpBA | 0.546 +0.004 vs field | Not funded · Duplicate model
| taostats |
| | 240 | 5FmpkW...LArt | 0.544 +0.003 vs field | Not funded · Duplicate model
| taostats |
| | 202 | 5HjSvQ...vgnj | 0.544 +0.002 vs field | Not funded · Duplicate model
| taostats |
| | 143 | 5Fe3Pq...94C8 | 0.543 +0.002 vs field | Not funded · Duplicate model
| taostats |
| | 39 | 5GTGB9...MRRb | 0.571 +0.001 vs field | Funded · Participating | taostats |
| | 1 | 5G6N3z...dxDf | 0.524 +0.001 vs field | Funded · Participating | taostats |
| | 136 | 5FNrY6...Vawc | 0.570 −0.000 vs field | Not funded · Tenure
| taostats |
| | 115 | 5G9NAx...wn1n | 0.539 −0.001 vs field | Not funded · Duplicate model
| taostats |
| | 247 | 5FsJJe...n9TQ | 0.534 −0.002 vs field | Not funded · Duplicate model
| taostats |
| | 89 | 5Dvj3h...RbPF | 0.573 −0.003 vs field | Funded · Participating | taostats |
| | 52 | 5Hpn6r...aGeU | 0.532 −0.004 vs field | Not funded · One seat per coldkey
| taostats |
| | 31 | 5Eetnz...PrV2 | 0.536 −0.004 vs field | Not funded · Duplicate model
| taostats |
| | 107 | 5HbmHu...17Hj | 0.532 −0.004 vs field | Not funded · Duplicate model
| taostats |
| | 163 | 5GWMRX...ALTz | 0.537 −0.004 vs field | Funded · Participating | taostats |
| | 138 | 5D5DbN...J7c1 | 0.549 −0.006 vs field | Not funded · One seat per coldkey
| taostats |
| | 30 | 5EgxN9...xCSx | 0.532 −0.007 vs field | Not funded · Duplicate model
| taostats |
| | 137 | 5H92Pj...EvAg | 0.533 −0.007 vs field | Not funded · Duplicate model
| taostats |
| | 34 | 5HQVEW...D2x2 | 0.533 −0.007 vs field | Not funded · Duplicate model
| taostats |
| | 88 | 5HaxtD...8ChW | 0.562 −0.009 vs field | Not funded · One seat per coldkey
| taostats |
| | 13 | 5D9m7r...tMBP | 0.529 −0.011 vs field | Not funded · One seat per coldkey
| taostats |
| | 214 | 5GcFM9...YAAE | 0.559 −0.011 vs field | Not funded · One seat per coldkey
| taostats |
| | 41 | 5F6px2...5vnD | 0.522 −0.012 vs field | Not funded · Duplicate model
| taostats |
| | 141 | 5C5kbk...BZGi | 0.523 −0.013 vs field | Not funded · One seat per coldkey
| taostats |
| | 91 | 5C812d...BBuc | 0.522 −0.013 vs field | Not funded · Duplicate model
| taostats |
| | 205 | 5CG1mJ...4v81 | 0.522 −0.013 vs field | Not funded · Duplicate model
| taostats |
| | 43 | 5GbCae...25xi | 0.553 −0.015 vs field | Not funded · Duplicate model
| taostats |
| | 249 | 5DVFGX...ffqU | 0.551 −0.016 vs field | Not funded · One seat per coldkey
| taostats |
| | 28 | 5GpnSX...fuEE | 0.519 −0.017 vs field | Not funded · Duplicate model
| taostats |
| | 114 | 5Gy2i5...TQnq | 0.519 −0.017 vs field | Not funded · Duplicate model
| taostats |
| | 60 | 5EnPyo...LABG | 0.548 −0.018 vs field | Not funded · Duplicate model
| taostats |
| | 76 | 5DeX1w...Cz2d | 0.548 −0.018 vs field | Not funded · Duplicate model
| taostats |
| | 106 | 5DChiJ...43yK | 0.516 −0.018 vs field | Not funded · Duplicate model
| taostats |
| | 48 | 5Esh2w...Jfrz | 0.547 −0.018 vs field | Funded · Participating | taostats |
| | 104 | 5GbXNr...nVpa | 0.516 −0.019 vs field | Not funded · Duplicate model
| taostats |
| | 130 | 5GbBRA...Nqtx | 0.516 −0.019 vs field | Not funded · Duplicate model
| taostats |
| | 6 | 5GgSss...9P3D | 0.515 −0.020 vs field | Not funded · One seat per coldkey
| taostats |
| | 95 | 5Gc5oY...T2uS | 0.515 −0.020 vs field | Not funded · Duplicate model
| taostats |
| | 200 | 5GsntL...yTwB | 0.514 −0.020 vs field | Not funded · Duplicate model
| taostats |
| | 112 | 5GvPoN...nwr7 | 0.502 −0.021 vs field | Not funded · One seat per coldkey
| taostats |
| | 154 | 5Gx5Vu...gA5e | 0.493 −0.022 vs field | Funded · Participating | taostats |
| | 198 | 5EqT93...SRJR | 0.539 −0.023 vs field | Not funded · One seat per coldkey
| taostats |
| | 242 | 5EceD1...S9kP | 0.510 −0.025 vs field | Not funded · Duplicate model
| taostats |
| | 246 | 5GRcTs...C25v | 0.504 −0.026 vs field | Not funded · Duplicate model
| taostats |
| | 167 | 5EeQAn...BAaB | 0.510 −0.026 vs field | Not funded · Duplicate model
| taostats |
| | 222 | 5Gipmi...kpow | 0.502 −0.027 vs field | Not funded · One seat per coldkey
| taostats |
| | 63 | 5D5Efz...qhtY | 0.468 −0.028 vs field | Not funded · Tenure
| taostats |
| | 164 | 5DoB4p...k9wA | 0.530 −0.029 vs field | Funded · Participating | taostats |
| | 142 | 5H6tLC...c1q3 | 0.502 −0.030 vs field | Not funded · Duplicate model
| taostats |
| | 33 | 5HTxhX...Lqim | 0.470 −0.032 vs field | Not funded · Tenure
| taostats |
| | 224 | 5HE7LP...W7fx | 0.499 −0.032 vs field | Not funded · Duplicate model
| taostats |
| | 120 | 5DXMBS...SypN | 0.500 −0.036 vs field | Funded · Participating | taostats |
| | 54 | 5HB9rT...MHVw | 0.443 −0.044 vs field | Funded · Participating | taostats |
| | 82 | 5EURAF...vZBX | 0.473 −0.057 vs field | Funded · Participating | taostats |
| | 100 | 5HWGvA...j3Pc | 0.463 −0.057 vs field | Not funded · One seat per coldkey
| taostats |
| | 69 | 5F1pHa...AxXR | 0.465 −0.061 vs field | Not funded · Below the earning cut
| taostats |
| | 92 | 5GZ1yJ...1PrF | 0.462 −0.062 vs field | Not funded · One seat per coldkey
| taostats |
| | 186 | 5HZ6xj...MMgj | 0.356 −0.162 vs field | Not funded · Below the earning cut
| taostats |
| | 149 | 5F7NuC...FfDr | 0.353 −0.165 vs field | Not funded · One seat per coldkey
| taostats |
| | 225 | 5H9XqN...KfZR | 0.294 −0.220 vs field | Not funded · One seat per coldkey
| taostats |
| | 113 | 5FCjRA...rnbc | 0.224 −0.293 vs field | Not funded · Duplicate model
| taostats |
| | 204 | 5HZ2P3...kQm6 | 0.143 −0.306 vs field | Not funded · One seat per coldkey
| taostats |
| | 189 | 5FnuP4...S932 | 0.207 −0.307 vs field | Not funded · Duplicate model
| taostats |
| | 233 | 5DNzet...HBqM | 0.207 −0.307 vs field | Not funded · Duplicate model
| taostats |
| | 87 | 5DytHK...s5ay | 0.207 −0.307 vs field | Not funded · Duplicate model
| taostats |
| | 192 | 5FtCS8...kPtN | 0.206 −0.308 vs field | Not funded · Duplicate model
| taostats |
| | 40 | 5FRCNV...7kvE | 0.206 −0.308 vs field | Not funded · Duplicate model
| taostats |
| | 252 | 5FHcm2...1GcA | 0.206 −0.308 vs field | Not funded · Duplicate model
| taostats |
| | 12 | 5DJBrU...wMbw | 0.206 −0.308 vs field | Not funded · Duplicate model
| taostats |
| | 58 | 5CzE7c...JkEk | 0.203 −0.310 vs field | Not funded · Duplicate model
| taostats |
| | 0 | 5FUUy2...HaFf | 0.200 −0.312 vs field | Not funded · Duplicate model
| taostats |
| | 72 | 5DhpQF...JxqV | 0.199 −0.312 vs field | Not funded · Duplicate model
| taostats |
| | 26 | 5GLTip...rdKX | 0.141 −0.383 vs field | Not funded · Duplicate model
| taostats |
| | 238 | 5GMyAK...iWZB | 0.136 −0.387 vs field | Not funded · Duplicate model
| taostats |
| | 251 | 5G7AeS...ycKx | 0.135 −0.388 vs field | Not funded · One seat per coldkey
| taostats |
| | 90 | 5Fbi74...jaRS | 0.134 −0.388 vs field | Not funded · One seat per coldkey
| taostats |
| | 17 | 5CLiZh...7n1K | 0.131 −0.392 vs field | Not funded · Duplicate model
| taostats |
| | 243 | 5ELUT7...4szw | 0.127 −0.395 vs field | Not funded · Duplicate model
| taostats |
| | 231 | 5FP4fx...asPQ | 0.127 −0.395 vs field | Not funded · Duplicate model
| taostats |
| | 8 | 5E81eb...qT9u | 0.127 −0.395 vs field | Not funded · Duplicate model
| taostats |
| | 239 | 5FhgUG...U8gZ | 0.122 −0.399 vs field | Not funded · Duplicate model
| taostats |
| | 140 | 5DegRL...C9vG | 0.122 −0.399 vs field | Not funded · Duplicate model
| taostats |
| | 162 | 5CSkpH...U8yv | 0.112 −0.408 vs field | Not funded · One seat per coldkey
| taostats |
| | 245 | 5FjSAs...LijJ | 0.000 −0.422 vs field | Below baseline — not funded
| taostats |
| | 105 | 5GurPz...hBc9 | 0.000 −0.422 vs field | Below baseline — not funded
| taostats |
| | 55 | 5HmAE2...zjur | 0.047 −0.456 vs field | Not funded · One seat per coldkey
| taostats |
| | 14 | 5CY6Hp...7j6B | 0.044 −0.463 vs field | Not funded · One seat per coldkey
| taostats |
| | 56 | 5DXBQ4...YFwR | 0.039 −0.474 vs field | Not funded · One seat per coldkey
| taostats |
| | 61 | 5E7E63...otnw | 0.036 −0.477 vs field | Not funded · One seat per coldkey
| taostats |
| | 45 | 5GRDAD...LTJK | 0.033 −0.480 vs field | Not funded · One seat per coldkey
| taostats |
| | 108 | 5DcDyf...oqRZ | 0.032 −0.481 vs field | Not funded · One seat per coldkey
| taostats |
| | 216 | 5DqRHM...Y8sm | 0.032 −0.481 vs field | Not funded · One seat per coldkey
| taostats |
| | 20 | 5Eqi6d...6Esk | 0.032 −0.481 vs field | Not funded · One seat per coldkey
| taostats |
| | 170 | 5HpwMH...A3bL | 0.032 −0.481 vs field | Not funded · One seat per coldkey
| taostats |
| | 169 | 5GEigf...32KS | 0.032 −0.482 vs field | Not funded · One seat per coldkey
| taostats |
| | 237 | 5Cyufm...THoR | 0.032 −0.482 vs field | Not funded · One seat per coldkey
| taostats |
| | 152 | 5GmWpN...N4VG | 0.031 −0.482 vs field | Not funded · One seat per coldkey
| taostats |
| | 70 | 5CrCRX...4Mt4 | 0.031 −0.482 vs field | Not funded · One seat per coldkey
| taostats |
| | 118 | 5H96DC...6iPT | 0.031 −0.483 vs field | Not funded · One seat per coldkey
| taostats |
Hotkey shown as 5CVCZw...TBq8 — full address on taostats.
Score range · 122 miners scored
Aggregate summary
Scores landed between 0.206 and 0.594 — top score 0.594
Range collapses to a 42.7-point window
0.187
0.613
Axis is auto-zoomed to the data range so percentile positions are legible even when the underlying histogram bins are coarse. Score cuts shown above are exact; positioning is proportional.
| Score range | Miner count | Share of pool |
|---|---|---|
| 0.00–0.05 | 14 | 11.5% |
| 0.05–0.10 | 0 | 0.0% |
| 0.10–0.20 | 14 | 11.5% |
| 0.20–0.45 | 13 | 10.7% |
| 0.45–0.50 | 9 | 7.4% |
| 0.50–0.55 | 40 | 32.8% |
| 0.55–0.60 | 32 | 26.2% |
| 0.60–0.65 | 0 | 0.0% |
| 0.65–0.70 | 0 | 0.0% |
| 0.70–0.75 | 0 | 0.0% |
| 0.75–0.80 | 0 | 0.0% |
| 0.80–0.85 | 0 | 0.0% |
| 0.85–0.90 | 0 | 0.0% |
| 0.90–0.95 | 0 | 0.0% |
| 0.95–1.00 | 0 | 0.0% |
Position bands · Find where you sit
5 bands
| Band | Score cut | Tier hint | What it means |
|---|---|---|---|
| Top score | 0.594 | Elite · 60% | Highest score achieved by any miner in this epoch’s qualifying pool. |
| Top 25% | 0.551 | Elite · 60% | Scoring at or above this puts you in the top quartile of the pool. |
| Mean score | 0.404 | — | Average across the qualifying pool — useful proxy for the conditional-prior baseline. |
| Median | 0.516 | Competitive · 30% | Half the pool scored at or above this, half below. |
| Bottom 25% | 0.206 | Participating · 10% | Scoring at or below this puts you in the bottom quartile of the pool. |
Tier hints are heuristic from this epoch's percentile cuts. Actual tier membership depends on EMA across multiple epochs vs the conditional-prior baseline + 1σ. See Methodology.
Score → band calculator
Heuristic
Enter a value between 0.000 and
1.000. Defaults shown match this epoch's distribution.
Band placement
Enter a score above
—
—
122/256 passed the gate.
| Tier | Count | Share of pool | Share of emissions |
|---|---|---|---|
| Elite | 6 | 4.9% | 60.0% |
| Competitive | 13 | 10.7% | 30.0% |
| Participating | 13 | 10.7% | 10.0% |
Elite-tier floor: met this epoch.
Accuracy by change type moved to the Performance tab — the cumulative picture with best model, current winner and score parts.
The score is an accuracy score from 0 to 1, where 1 is a perfect prediction. A score of 0.6 means the model is about 60% of the way to perfect. It is not the percentage of predictions that were correct.
It blends four things:
The leaderboard number is not a single day: it is the average of a model's recent predictions, where recent work counts more than old (a score twelve days old counts half). Predictions are locked before any outcome exists, and a day's first score settles about 15 days after its basket — 7 days of outcomes plus a settling week so late conversions count.
Mining? Look up your own scores by hotkey — per-day entries, win/lose by change type, and the signed receipt that lets you reproduce every number.
Epochs · Frozen records, newest first
Every closed epoch publishes as a permanent record at
/predictions/epochs/[release_key].
Published rows are immutable per IA D-13; corrections appear as separate
rows, not edits.
32 epoch slots · newest first · 15 have corrections
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Prior versions of this epoch slot (archived)
Methodology · Verification map
Every number on this dashboard is reconcilable to on-chain validator output. The links and procedure below are the entry points for verifying any published epoch independently — the chain is the source of truth; this site mirrors the spec and surfaces aggregates.
3 steps
Step 1 / 3
Mirrored canonical SN21 documents on this site — whitepaper, reward mechanism, epoch structure.
Step 2 / 3
scripts/verify_epoch.py reproduces any past epoch against a Bittensor archive node.
Step 3 / 3
Block range + scoring formula commit on every record lets you query the chain directly.
scripts/verify_epoch.py in the
SN21 repo reads the chain, fetches the off-chain archive artifacts,
re-runs the open-source scoring code, and either confirms or
contradicts the validator's claim for any past epoch.
python scripts/verify_epoch.py \
--epoch-id WR-2026-W18-PUB-E1 \
--validator-hotkey 5GxVLdpRGZN... \
--tier-2-base https://archive.example.io \
--block-hash 0x... Chain-integrity mode needs only a Bittensor archive node and a tier-2 archive URL. Full score recomputation additionally needs the operator's truth-file derived from the §9.A.2 reveal blob.
Open scriptPer-miner emissions on SN21 are derivable from per-miner scores (Reward Mechanism §"Component 2"). Publishing per-UID scores publishes per-UID emissions — doxxing-adjacent, and a strong anti-coordination signal. The chain already exposes per-UID data to anyone who queries it. The dashboard publishes what the chain does not: the shape of the distribution, the size of the qualifying pool, the baseline-beat rate, and the scoring formula version that produced them.
API & schema · Public read surface for researchers and validators
Every published epoch is reachable as JSON without a key. Drop the cURL line into a terminal, the Python snippet into a Jupyter cell, and you have the same data the dashboard is rendering — plus the provenance fields needed to reconcile against the chain.
Latest published epoch
GET 200https://adtao.io/api/sn21/latest.json
Returns { epoch: EpochReport | null }
— the freshest published row, or
null until
the first publish click. 60-second cache.
All published epochs
GET 200https://adtao.io/api/sn21/index.json
Returns { count, epochs: EpochReport[] }
newest first. Canonical snake_case pydantic shape per the
SN21 source-of-truth model. 60-second cache.
Total fields
21
Nullable
3
Aggregate-only
D-05
Schema version
v1.0
curl -sSL "https://adtao.io/api/sn21/latest.json" \
-H "Accept: application/json" | jq '.epoch'
Returns the full EpochReport JSON. Pair with
jq for pretty-printing.
import json, urllib.request
URL = "https://adtao.io/api/sn21/latest.json"
with urllib.request.urlopen(URL) as r:
resp = json.loads(r.read())
epoch = resp["epoch"]
if epoch is None:
raise SystemExit("no published epochs yet")
print(f"Epoch {epoch['epoch_id']}")
print(f"Pool size {epoch['pool_size']} of {epoch['total_registered_uids']}")
print(f"Beat rate {epoch['baseline_beat_rate']:.1%}")
print(f"Formula {epoch['scoring_formula_version']} @ {epoch['scoring_formula_commit'][:7]}")
print(f"Blocks {epoch['block_range_start']}-{epoch['block_range_end']}")
Zero dependencies — uses
urllib from the stdlib.
Pydantic source-of-truth
| Field | Type | Units | Semantic |
|---|---|---|---|
| epoch_id | string | release-key | Canonical SN21 release key — BD-2026-08-20 in the daily stream, WR-2026-W21-PUB-E1 in the weekly era. Stable URL path component. |
| epoch_type | string | enum | Standard epoch classification (Daily, Search, Discovery, …). Drives epoch_type_multiplier. |
| epoch_subtype | string | null | — | Optional sub-classification when epoch_type alone is insufficient. |
| block_range_start | integer | block height | Inclusive lower bound of the chain blocks aggregated for this epoch. |
| block_range_end | integer | block height | Inclusive upper bound. Reconcile via a Bittensor archive node. |
| scoring_formula_version | string | semver | Released aggregator wire-shape version. Pinned per epoch. |
| scoring_formula_commit | string | git sha (40) | Commit hash of SN21-adtao at epoch close. Links to the SHA-pinned source. |
| horizon_set | string[] | duration | Time horizons the scoring formula evaluated — 7d, 14d, 28d in the daily stream; 7d, 14d in the weekly era. |
| epoch_type_multiplier | float | × | Emission multiplier applied to this epoch_type. Constants per epoch type. |
| pool_size | integer | miners | Count of qualifying miners (passed the participation gate). |
| total_registered_uids | integer | miners | Count of UIDs registered on netuid 21 at epoch close. |
| pool_size_below_distribution_floor | boolean | — | True when pool_size < 15; histogram is omitted in that case. |
| baseline_beat_rate | float | ratio (0–1) | Share of pool with EMA above the conditional-prior baseline. |
| score_distribution | object | null | histogram | bin_edges, bin_counts, summary {mean, median, p25, p75, max}. Null when pool below floor. |
| tier_distribution | object | — | elite, competitive, participating { count, share_of_pool, share_of_emissions } + elite_floor_met. |
| tier_split_active | boolean | — | False when the pool collapses to a single undivided group. |
| emergency_intervention | object | — | { triggered, type, outcome, summary_text }. Routine epochs read { triggered: false }. |
| validator_output_snapshot_timestamp | string | ISO 8601 UTC | When the validator output was captured for this aggregation. |
| chain_fetch_timestamp | string | ISO 8601 UTC | When the chain reading completed. |
| commentary_markdown | string | null | markdown | Optional human commentary. Null on routine epochs. |
| aggregator_version | integer | — | Wire-shape version of the aggregator. Bumped when the same input produces different output. |
The dashboard reads from the JSON endpoint. The JSON came from the aggregator. The aggregator reads chain + validator output. The chain is the source of truth. Re-run the aggregator with the same inputs and you get the same JSON — or a discrepancy you can act on.
git clone https://github.com/ippcteam/SN21-adtao.git
cd SN21-adtao && pip install -e .
python scripts/verify_epoch.py \
--epoch-id WR-2026-W21-PUB-E1 \
--validator-hotkey 5GxVLdpRGZN... \
--tier-2-base https://archive.example.io Needs Python 3.11+ and a Bittensor archive node URL. The full score recomputation also needs the operator's truth-file (reveal blob per §9.A.2). Chain-integrity mode does not.
verify_epoch.py
Operator commentary
BD-2026-09-06-COR-1
Today's basket was below the minimum size to score a new allocation, so no new weights were set. The previous allocation stays in force on chain and continues to pay — the rows below show who it pays. Nobody's earnings stopped, and every model kept running. Correction of BD-2026-09-06: this entry supersedes the original report.