---
cursor:
  subagentId: "bc-04a09f82-ef21-5baa-a204-4e3d9343728f"
---

# Metrics sweep: shared brief for the layer workers

Purpose. Jacob Steeves (Bittensor founder) gives the opening keynote at Exploit Summit, Montreal, on 28 Sep 2026. He wants "up and to the right" growth charts from across the Bittensor subnet teams. This sweep collects every time series that can be found, breadth first. Grading comes after. Today is 24 Sep 2026.

The slide the data must fit: `media/reference/data-slide-example.png` in the Project store (`/cursor/stores/bc-96ff1b3e-00b6-4da6-8a0d-5e72965f7e86/`). Four small panels, one big latest number each, a sparkline, the start value and the end date. So what is needed is dated points, not adjectives.

## Definitions

- **Netuid**: the subnet number on the chain. SN51 = netuid 51.
- **Series**: the same measure read on at least three dates. Two points or one point is a **single number**, listed separately.
- **Team-stated**: the team said it (X post, blog, podcast). **Third party**: a tracker, journalist or analyst said it. **Chain**: read from the Bittensor chain, the team's own chain, a signed ledger, or a public API/dashboard the team runs.
- **Shape** (be honest): `rising` (last point is the highest and the trend is up), `flat`, `U` (fell then rose past the start or near it), `peaked` (the high is in the middle, now lower), `falling`.
- **Cumulative**: a running total (always rises by construction; say so in the note). **Rate**: per day/week/month (the honest growth signal).

## Already done: do NOT redo these

Lium SN51 (billing, GPUs, burns, renters, alpha price), Chutes SN64 tokens a day and requests a day, Engy SN53 tokens a day, SayGM SN28 tokens, Hippius SN75 bytes stored and files and accounts and credits, NOVA SN68 molecules and nanobodies, Data Universe SN13 rows, Beam SN105 transfers and tasks. Other metrics for those subnets (for example Chutes users or GPUs online, Engy dollars settled, Hippius egress) are in scope.

## Roster (from `docs/research/ecosystem-as-empowerment.md`, 17 Sep 2026)

X handles are in that doc's tables. Each worker has a layer list in its assignment.

## Sources and tools

1. Team websites, dashboards, explorers, Grafana instances, status pages, docs. Look for JSON endpoints behind dashboards (open the page's JS bundle or network calls). Many Next.js dashboards call `/api/...` routes; try them with a browser User-Agent header.
2. X posts. Two ways:
   - Free, no budget: `https://api.fxtwitter.com/<handle>/status/<id>` for a known status id. Also `https://api.fxtwitter.com/<handle>` gives the profile (follower count).
   - The X API v2 (costs budget). Bearer token is in the file `/tmp/sweep/x_bearer`. Never print it, never write it into any output. Use it as `-H "Authorization: Bearer $(cat /tmp/sweep/x_bearer)"`.
     Search: `GET https://api.x.com/2/tweets/search/all?query=<urlencoded>&max_results=10&start_time=2025-01-01T00:00:00Z&tweet.fields=created_at,text,note_tweet,entities,attachments,public_metrics&expansions=attachments.media_keys&media.fields=url,type,preview_image_url`. Wait 1.2 s between calls (1 request per second limit). Every returned tweet costs one read. **Your budget is 30 reads.** Keep `max_results=10` and use tight queries such as `from:lium_io (revenue OR billed OR GPUs OR renters)`. Log every call's returned count to `/tmp/sweep/xreads-<layer>.log` (one line per call: `<count> <query>`). Stop at 30.
     `media.fields=url` gives the image URL of any chart the team posted; download it with curl.
3. Trackers: taostats.io (public pages; API needs a key, skip it), tao.app, subnetradar.com (has per-subnet pages and `subnet-news`), taomarketcap.com, dtaoscan.io, subnetalpha.ai, taopedia.org, backprop.finance.
4. Hugging Face: `https://huggingface.co/api/models?author=<org>` and `/api/datasets?author=<org>` (downloads, likes, lastModified); `/api/datasets/<repo>/commits/main?limit=1000&p=N` for commit logs (a cumulative series can be summed from commit messages); `/api/models/<repo>` gives `downloads` (last 30 days) and `downloadsAllTime` when `expand[]=downloadsAllTime` is passed.
5. GitHub: `https://api.github.com/repos/<org>/<repo>` (stars, forks), `/stargazers` with `Accept: application/vnd.github.star+json` gives starred_at timestamps (paginate 100 per page; unauthenticated limit is 60 requests an hour, so pick repos carefully), `/commits?since=...` for commit counts per month, `/releases`.
6. The chain: `wss://archive.chain.opentensor.ai:443` via `substrateinterface` (installed in the venv). Storage items under `SubtensorModule`: `SubnetTAO[netuid]`, `SubnetAlphaIn[netuid]`, `SubnetAlphaOut[netuid]`, `EmissionValues`, `TotalNetworks`, `SubnetworkN[netuid]`, `NetworksAdded`, `TotalStake`. Values in rao (divide by 1e9). Historical reads: `s.get_block_hash(block)` then `s.query(..., block_hash=bh)`. Block time is 12 s; block 9,138,843 was 24 Sep 2026 ~17:00 UTC. dTAO started 13 Feb 2025 at about block 4,920,350.
7. arXiv, taodaily.io, tao.media, taoprotocol.org, macrocosmosai.substack.com for team-published charts and numbers.

Python: `source /tmp/sweep/.venv/bin/activate` first (requests, bs4, lxml, pandas, matplotlib, substrate-interface, playwright are installed; system Chrome is at `/usr/local/bin/google-chrome`; for Playwright use `p.chromium.launch(executable_path="/usr/local/bin/google-chrome", headless=True)`).

Do not write anything to `/workspace`. Scratch goes under `/tmp/sweep/<layer>/`.

## What to record for every metric

- subnet name and netuid
- metric name and unit; say whether it is cumulative or a rate
- the points: `YYYY-MM-DD` and value (at least three for a series). If a date is only a month, use the first of that month and say "month only" in the note.
- source URL for each point (a status id, an API URL, a page), and the access date (today, 24 Sep 2026)
- source type: `team`, `third-party`, or `chain`
- shape, honestly
- caveats: what the number does and does not count, whether it is team-stated, whether it is emission-funded rather than customer-funded
- chart images: if the team published a chart image, save it to `/cursor/stores/bc-96ff1b3e-00b6-4da6-8a0d-5e72965f7e86/media/charts-gallery/<subnet>-<metric>.png` (lowercase, hyphens) and record the source URL beside it.

## Output files (one pair per worker)

1. `/cursor/stores/bc-96ff1b3e-00b6-4da6-8a0d-5e72965f7e86/internal/metrics-sweep/<layer>.md` starting with this exact frontmatter:

```
---
cursor:
  subagentId: "<your own agent id if you know it, else the string bc-04a09f82-ef21-5baa-a204-4e3d9343728f-worker-<layer>>"
---
```

Sections: `## Series found` (one subsection per series with a points table), `## Single numbers` (a table: subnet, netuid, metric, value, date, source, type), `## Not rising` (series whose honest shape is flat, peaked or falling; they still go in Series found, this is a pointer list), `## Could not find` (what was looked for and where), `## X reads used` (the count), `## Charts saved` (file, source URL).

2. `/cursor/stores/bc-96ff1b3e-00b6-4da6-8a0d-5e72965f7e86/internal/metrics-sweep/<layer>.json`, valid JSON:

```json
{
  "layer": "<layer>",
  "series": [
    {
      "key": "targon-buybacks-tao",
      "subnet": "Targon",
      "netuid": 4,
      "layer": "compute",
      "name": "TAO bought back from revenue per month",
      "unit": "TAO",
      "kind": "rate",
      "sourceType": "team",
      "shape": "rising",
      "note": "Team posts; monthly; not audited.",
      "points": [
        {"date": "2026-06-20", "value": 300, "source": "x.com/TargonCompute/status/…", "verified": false}
      ]
    }
  ],
  "singles": [
    {"subnet": "Targon", "netuid": 4, "name": "…", "unit": "…", "value": 0, "date": "2026-08-20", "source": "…", "sourceType": "team", "note": "…"}
  ],
  "notFound": ["…"],
  "xReads": 0
}
```

`verified: true` means you read the value yourself from a chain, a ledger, an API, a dashboard or a page that the team runs and that shows the number; `false` means it rests on a post or an article. `source` is required on every point.

Work breadth first: many subnets, every counter you can find. Then, if time remains, deepen the best two or three. Report back in the chat with: the number of series and singles, the three strongest rising series in one line each, the X reads used, and the two file paths.
