TAO
Methodology

How Taonets judges

Every score we publish is computed from live subtensor storage and the registered repos' public GitHub metadata, with the recipe published here. Nothing is a verdict — it's a transparent, evidence-first heuristic. Where the chain can't prove a signal, we don't model it.

Integrity score (live-chain engine)

composite risk, 0 (clean) → 100 (strong adverse signals)

emission concentrationweight 50%

What. The share of a subnet's live emission captured by its single best-earning uid.

How. SubtensorModule::Emission returns one u64 per uid (rao earned this epoch). We normalize by the vector's sum; the maximum entry is the top-1 share. ≤25% scores 0, ≥75% scores 100, linear in between.

Abuse it flags. A scoring topology (or validator block) that consistently pins emission on one insider shows up as extreme, sustained concentration.

zombie repoweight 30%

What. Development dormancy — how long since the registered repo was last pushed.

How. GitHub pushed_at for the repo registered in SubnetIdentitiesV3, fetched live by the worker. <30 days scores 0, ≥240 days scores 100, linear in between.

Abuse it flags. Founders abandon the product but leave the race running, harvesting emissions with zero work.

emission statusweight 20%

What. Whether the subnet actually pays: SubnetEmissionEnabled, FirstEmissionBlockNumber and SubnetTaoInEmission.

How. Any of — emissions disabled by the owner, first-emission block never set, or TaoInEmission = 0 — scores 100 (there is nothing to mine). Otherwise 0.

Abuse it flags. A subnet that markets itself to miners while paying zero is the most basic trap; this signal makes it impossible to miss.

Renormalization. A subscore is computed only when its input exists. The composite divides by the weights actually present, so missing data never masquerades as a neutral score. Confidence = 85% × the share of model weight that had data. Bands. 0–29 clean · 30–54 watch · 55–74 elevated · 75–100 high.

Signals we refuse to fabricate

not modeled — and why

  • Owner self-mining. Requires walking transfer/stake/registration-fee edges from owner coldkeys — a transfer indexer taonets doesn't run yet.
  • Validator oligopoly. Requires the validator set and stake weights (metagraph), not read by the worker today.
  • Registration capture. Requires per-uid registration history and winner distributions over time.
  • Race churn / pool games. Require crown-change history and transfer timing — same missing indexer.

These arrive when taonets runs its own indexer. Until then the engine scores a shorter list — but a true one.

Worth-mining model

clearly-labeled assumptions over live data

  • • Live inputs: daily emission (SubnetTaoInEmission), alpha price (SubnetMovingPrice), pool depth (SubnetAlphaIn/Out), registration burn (Burn) and active miners (Active).
  • • Marginal share ≈ (1 / active miners) × your skill multiplier — an approximation; real share follows the subnet's own scoring.
  • • Revenue = share × daily emission, valued at the live alpha price.
  • • Slippage scales with daily reward sales vs pool depth (3× the consumed fraction, capped 90%).
  • • Upfront cost = hardware + registration burn; break-even = upfront ÷ net daily.
  • • Verdicts: worth it > 8% monthly ROI · thin > 2% · no otherwise. Zero-emission subnets always model to “no”, because there is genuinely nothing to mine.

Emission dominance

what the crown numbers mean

  • • The top uid of a subnet is whoever's entry in the Emission vector is largest right now — the de-facto champion of the live race.
  • Top-1 / top-10 shares are that uid's (and the ten largest uids') fraction of total subnet emission, normalized per epoch.
  • Earning uids counts non-zero entries; active miners counts flags in the Active bitmap from the last epoch.
  • • Per-uid identities, reigns and crown-change history need metagraph history; until that indexer exists, taonets shows concentration without names.

Race scores

read from the chain, archived per epoch

Every subnet race's scores are read directly from subtensor storage: Incentive (the validator network's normalized per-uid score, 0–65,535, what emission actually follows), Scores (the raw validator-aggregated value in the subnet's own scale) and the per-uid Emission vector for payout context. The scoreboard shows normalized incentive; the raw value is shown alongside because its meaning (seconds, accuracy points, task counts) is subnet-specific.

Stats are computed over qualifiers — uids with a non-zero incentive. “Lowest validated score” is the smallest non-zero incentive; uids at zero did not score. When the top uid holds ≥99.5% of all incentive the race is flagged winner-take-all — a payout structure, not a concentration anomaly.

The chain does not store past vectors, so history starts when taonets first reads a subnet: one archived summary per epoch (epoch = block ÷ Tempo), up to 96 epochs. Hidden per-validator test sets are computed off chain and never published — we show what the chain shows, no reconstruction.

Repo watch

the race-change detector

For every on-chain registered repo, the worker revalidates the default branch's head commit against GitHub roughly every 10 minutes using conditional requests — an unchanged repo answers 304 and costs no rate limit, so the watch is both fast and free. When the head SHA moves, the event (sha, commit message, commit date, detection time) is recorded on the subnet and surfaces on the Race tab, the subnet overview and the dashboard signal feed within minutes of the push.

A moved head commit means the race's code, tasks or benchmark may have changed. It is a trigger to re-verify, not a semantic diff: taonets reports exactly what changed at the repo level (the commit itself) and links to it, rather than guessing what the diff means for scoring.

Semantic labels

from the projects' own words

Each subnet's name, GitHub description, topics and README head are fetched live for the repo registered in SubnetIdentitiesV3. A weighted word-boundary keyword match assigns a mission type: description and topics weigh most, the name next, the README least. No match → the subnet is shown as unclassified rather than guessed. Labels are auditable: the taxonomy's keywords live in one file in the repo, and every classification can be traced to the exact sentence that triggered it.

Appeals & corrections

Dispute an assessment by emailing [email protected] with your coldkey/hotkey set and evidence. Because every subscore cites its exact storage read, disputes resolve by pointing at the chain: either the read says what we published, or we publish a correction.

Taonets is an independent analytics product. It is not affiliated with Bittensor/Opentensor Foundation. Scores describe statistical patterns on-chain; they are not statements of fact about any person or team.

Data sources & refresh

Chain (subtensor RPC, direct). The taonets worker reads subtensor storage over a persistent WebSocket: SubnetOwner, SubnetIdentitiesV3, SubnetEmissionEnabled, FirstEmissionBlockNumber, SubnetTaoInEmission, SubnetMovingPrice, SubnetAlphaIn/Out, Emission, Tempo, Active, Burn, RegistrationsThisInterval — plus the race-score vectors Incentive, Scores and the per-uid Emission read on a faster (~30 min) cadence. Merge-only sweeps with per-field TTLs; page traffic never touches public RPCs.
GitHub. Repo metadata (description, topics, language, stars, pushed_at) plus the README head, fetched for the on-chain registered repo with conditional (ETag) requests, rate-limit pacing and negative caching for dead repos. The repo watch revalidates every repo's head commit every ~10 minutes on the same free conditional path.
Price & block. The worker's live feed (CoinGecko/taostats price, chain head) with per-field freshness stamps — stale sources are shown as stale, not silently mixed.
Freshness. Pages re-render on a short ISR schedule and re-read the worker's cache on every render, so chain data lands on the site within ~1 minute of each sweep. If the worker is absent, a banner says so — nothing is simulated in the meantime.
Found a mistake? We publish our math precisely so you can hold us to it. [email protected]