What changed in the investor-reputation scores, why we changed it, and the effect on real accounts, in plain language.
EigenRep gives every X/Twitter account a reputation score, one overall score, plus a score for each of 10 industries (AI, fintech, space, biotech, nuclear, and so on). It reads who follows whom across ~10.45 million accounts (the second-ring crawl as supplied). This page shows the raw production graph we received and the upgrades we shipped on top of it.
We start from the dev package you provided: the second-ring (S1) crawl as supplied — 10,450,658 accounts and 76.4M follow edges from 101,564 crawled sources — which also ships an LLM read of the crawled core’s recent tweets (120,855 accounts — 1.2% of the graph by count, but the connected core that carries the reputation; scored per sector). Account and classification counts are read off the rendered files; the edge and source counts are from the supplied graph.
We say as supplied rather than complete deliberately: the pipeline metadata lists 107,167 qualifying S1 accounts against the 101,564 that actually appear as edge sources. The gap may be private or zero-following accounts rather than missed ones — but nothing in the package establishes that, so “full” is not a claim we can back. Everything below is built on top of this package.
Reputation straight off the follow graph has one flaw: famous people look like experts in everything. Everyone follows them, so the math ranks them in every industry — on the raw graph Barack Obama is a top “quantum-computing” person, Elon Musk tops AI, defense, robotics and space, and NASA and OpenAI sit atop the investor lists. That’s accurate about fame, wrong about expertise; the job is to turn it into real sector standing, with famous and brand accounts off the sector lists.
Not hypothetical — here is what raw follow-graph reputation put on the leaderboards, and what our improvements do with each.
| account | raw graph showed | now | the fix |
|---|---|---|---|
| Elon Musk | robotics 997 · space 997 · AI 900 (researched membership) · semi 491 (graded, de-walled) | specialty lens, focused to his real domains | |
| J.K. Rowling | 0 in every sector · Fame tier | fame filter, keeps a global rank, no sector | |
| Turning Point USA | 0 in every sector · Org tier | org filter, a political org, not an operator | |
| TBPN (a podcast) | 0 in every sector | org filter, a media brand, not a person | |
| Piers Morgan | 0 in every sector · Fame tier | fame filter, a journalist, not defense | |
| Cristiano Ronaldo | 0 in every sector | skill-graph density gate, an athlete’s huge following dilutes to ~0 |
The dev package already scores each account’s tweets by sector. On top of that we ship eight improvements — each fixes a different failure of raw follow-graph reputation:
Each improvement: what it is, how it works, why, and the result. Verdicts are audited, not self-assessed — ✓ Fully solved, ◐ Mostly / Partly / Partial works with the limit stated in Result, ◐ Stopgap deliberate placeholder. One card reads Fully.
scores.json): per-sector confidence 0–1 from bio + ~20 tweets; a sector is content-confirmed at conf ≥ 0.5. The resulting content sector score — not the raw confidence — is what weights its endorsement in RE.verifiedType = Business hard-masks (companies only); Government defers to the classifier (it is issued to individual officials too, so an account reading as a person is spared). Where the type is missing — most of the graph, because the crawl discarded it — a trained person-vs-entity classifier over name + bio + graph features stands in, and the curated org_augment list hard-masks the residue (160 handles as this page rendered, incl. @tbpn; the list is hand-edited, so how many accounts it closes changes with it and is not a fixed number).verifiedType cache’s 0.27%.verifiedType, so no re-fetch would label them — curation closed them. The general case (an org with no type and expert followers) stays open, which is why grey contamination is not yet bounded. Durable fix: capture account type at crawl time (see the raw-data section).compute_rho_global.py), which is what catches most celebrities → Fame tier, every sector 0.build_final_newgraph.py at render time.global_db)✓ FullyLO_PCT = p0.5 anchor up to the KNEE_PCT = p99.9 knee across 0–BAND = 950, then log-linear from the knee to the maximum across 950–1000. BAND = 950 is deliberate: it is the same band the sector scale uses, so the two axes are the same 0–1000 transform and the same band — which is what removed the artefact where the same person read 868 global against 953 fintech purely because two different maps were in play. Same transform, not one ruler: each axis is anchored to its own population — global to the whole-graph distribution, each sector to that sector’s — so a global 850 and a sector 850 carry different evidence. Compare within an axis, never across. The frozen decibel reference (decibel_R_REF.txt) still fixes the content-layer sector magnitudes, which is where the ‘db’ in the column name comes from. Base algorithm: EigenTrust (Kamvar, Schlosser & Garcia-Molina, WWW 2003) — personalized PageRank, α=0.20. Constants read live from build_combined_scores.py.build_combined_scores.py while this page renders — if one is retuned or renamed the page fails to build rather than printing a stale formula.build_combined_scores.py.investor_sector_tags.txt as this page rendered — and the durable fix is the same content/entity signal used everywhere else.max(existing, membership × authority), where membership is the 0–1 research value and authority = 250 + 650·clip(global_db÷950)0.8 — so the research says which sector, the graph still says how much. Silence is no longer neutral. The original brief asked only for an account’s defining sectors, so an omission carried no information and the graph’s score stood. The corrected spec requires all ten to be judged, so an omission is a considered negative: research precedence removes the content anchor beneath it (provenance r, 1,191 removals). A record qualifies only when research_status=verified and sector_scope=complete. Presence of research_status alone is not enough — narrow identity-rescue passes emit it too, and their silence means “this pass was not looking”, not “not this sector”. Separately, a researched account now propagates: it emits sector reputation to everyone it follows (3,115 source cells), so a correction reaches the accounts downstream of it rather than stopping at the account itself. Ceiling 900, above the curated-tag cap of 850 and below the content-verified elite.score_source == ‘a’ — tweet-LLM in 260 cases, seed curation in 8) scored a researched, leaderboard-eligible account ≥500 in a sector its research record does not list. Each of the 268 was judged on its evidence: the anchor layer wrong in 168 (63%), the research in 92 (34%), 8 arguable — where they disagree the anchor layer is wrong about 1.8× as often, and 142 of the cases sat inside a sector’s top 100 or top 1,000, so these were visible placements rather than tail noise. The failure is structural, not random: AI is ambient, so a fintech founder who merely talks about AI outranks working AI researchers (131 of the 268 cases are ai_ml, 66% of them anchor errors); drone and defense companies bleed into space (70% error over 27 cases); market commentary bleeds into fintech (88% over 8 cases, the worst rate of any sector with enough cases to quote) even though finance is not financial technology. Read it for what it is: a frozen, dated cohort (2026-07-28, non-org and non-low-confidence records only, and it grows), measuring one direction only — the anchor layer’s false positives on 268 contested placements, not content scoring in general, and not the reverse case where research asserts a sector content missed (Dorsey, Cook above). Nothing inside the graph tells you which placements are the wrong ones.llm_<sector>_score) → nowEvery tracked account, all 10 sectors: raw graph → our final scores. Overall is whole-graph reputation on the 0–1000 db scale. The sector work does not touch it, but the two overall values are not the same quantity: the after side is re-derived by the percentile-anchored rescale and by the seed de-bias that strips the free self-teleport mass personalized PageRank hands its own seed accounts — so rank order changes too, not just the units. Sector numbers are standing within that sector. Bold green = content-anchored — the sector was confirmed by the tweet classifier or by seed curation. The MAGNITUDE is still the graph's (ρ-lensed PageRank), not a tweet count. Amber = graded — follower-standing, a curated marquee tag, or researched membership (the per-sector layer is in score_source). Red strike = fame removed. · = never scored.
| account | overall (db) | AI | Fin | Robo | Space | Bio | Clim | Qtm | Nuc | Def | Semi |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Real experts (AI leaders), focused to their true domains | |||||||||||
| @sama | 997→992Legend | 1000→998 | 979→675 | 981→489 | 979→410 | 976→481 | 977→425 | 972→373 | 977→450 | 978→409 | 979→445 |
| @karpathy | 996→988Legend | 1000→999 | 978→467 | 1000→999 | 976→371 | 977→446 | 972→370 | 973→377 | 965→344 | 978→362 | 980→443 |
| @ylecun | 995→986Legend | 1000→999 | 970→396 | 982→511 | 973→345 | 973→430 | 970→345 | 973→391 | 967→343 | 976→345 | 978→444 |
| @gdb | 995→983Legend | 1000→999 | 978→463 | 979→464 | 969→344 | 963→416 | 971→344 | 968→344 | 970→340 | 974→346 | 976→418 |
| @demishassabis | 995→983Legend | 1000→999 | 971→425 | 978→508 | 973→351 | 1000→999 | 973→363 | 972→396 | 961→340 | 976→348 | 974→433 |
| @andrewyng | 995→982Legend | 1000→999 | 968→399 | 981→506 | 970→343 | 973→429 | 970→345 | 969→377 | 963→337 | 975→344 | 979→441 |
| @elonmusk: raw fame in every sector → his real anchors kept (space, robotics, PayPal fintech), AI and defense asserted by researched membership, the rest a de-walled grey ring | |||||||||||
| @elonmusk | 1000→1000Legend | 980→900 | 982→966 | 1000→997 | 1000→997 | 978→531 | 976→900 | 976→441 | 980→451 | 984→675 | 981→491 |
| Balanced multi-sector radars: earned anchors plus lighter interest around them | |||||||||||
| @davidsacks47 | 973→967Elite | 961→950 | 969→953 | 959→488 | 965→513 | 861→464 | 962→445 | 829→360 | 967→395 | 973→525 | 965→516 |
| @peterdiamandis | 977→973Titan | 966→955 | 965→558 | 975→570 | 973→957 | 971→954 | 973→556 | 964→400 | 969→418 | 971→469 | |
| @leijun | 961→950Notable | 770→356 | 960→416 | 962→872 | 831→383 | 864→358 | 834→418 | 812→207 | 783→214 | 963→315 | 971→564 |
| @tashaark | 964→956Notable | 804→450 | 797→545 | 971→956 | 922→535 | 965→570 | 863→265 | 895→405 | 963→465 | 909→477 | |
| Famous non-experts, removed from every sector (kept only a global Fame rank) | |||||||||||
| @jk_rowling | 975→970Fame | ||||||||||
| @barackobama | 986→986Fame | ||||||||||
| Organizations, moved to the Org tier, off the person lists | |||||||||||
| @openai | 994→996Org | ||||||||||
| @nasa | 986→985Org | ||||||||||
| Marquee investors the graph can’t place from tweets (off-topic posts, diffuse elite following): sector asserted editorially (seed-list basis), magnitude set by their real inbound endorsement strength | |||||||||||
| @pmarca | 989→989Legend | 977→850 | 979→675 | 981→489 | 981→450 | 976→675 | 974→459 | 971→357 | 978→370 | 981→675 | 977→439 |
| @naval | 985→983Legend | 975→850 | 978→675 | 978→477 | 980→439 | 968→488 | 973→448 | 965→344 | 975→358 | 979→426 | 972→413 |
| @balajis | 983→981Legend | 973→850 | 977→900 | 975→469 | 979→434 | 973→505 | 973→446 | 961→360 | 975→372 | 981→438 | 967→403 |
| @wolfejosh | 980→976Titan | 967→707 | 973→480 | 971→410 | 977→675 | 976→850 | 974→410 | 968→337 | 973→348 | 977→675 | 967→395 |
| @kenhowery | 967→959Notable | 950→563 | 962→850 | 960→423 | 974→614 | 960→454 | 773→421 | 807→183 | 968→358 | 976→596 | 741→307 |
| @edyson | 970→963Elite | 951→563 | 966→464 | 926→381 | 967→800 | 963→850 | 970→431 | 934→310 | 969→308 | 965→368 | 965→318 |
| Legion team & tracked accounts: pre-optimization the raw graph gives them a top score in every sector (fame) → post, a graded score where the follower graph shows real sector concentration, or removed where the account reads as an org/brand (e.g. @murphcapital, “new media…for emerging VCs”, is entity-typed out) or shows no concentration | |||||||||||
| @wazzcrypto | 947→764Ranked | 827→303 | 965→921 | 801→171 | 923→176 | 822→161 | 892→163 | ||||
| @pavelprata | 959→936Notable | 725→707 | 827→657 | 797→484 | 972→511 | 966→513 | 798→408 | 784→331 | 868→391 | 875→502 | 770→368 |
| @zemariamacedo | 947→764Ranked | 931→541 | 948→708 | 935→274 | 938→257 | 943→284 | 911→224 | 944→220 | 948→147 | 949→270 | 935→338 |
| @murphcapital | 938→668Unranked | ||||||||||
| @redphone | 944→729Unranked | 932→451 | 946→706 | 918→236 | 935→190 | 933→102 | 931→228 | 949→200 | 948→170 | 946→113 | 913→214 |
| @matty_ | 935→638Unranked | 844→395 | 935→697 | 867→145 | 929→177 | 714→137 | 917→157 | 877→118 | 805→165 | ||
| @lukedelphi | 937→655Unranked | 876→506 | 934→695 | 936→234 | 916→174 | 876→156 | 910→189 | ||||
| @iamsage | 920→566Unranked | 722→441 | 906→686 | 797→203 | 852→112 | 837→150 | 591→184 | 801→168 | |||
| @therosieum | 931→612Unranked | 873→568 | 931→688 | 818→141 | 844→120 | 790→245 | 904→203 | 915→129 | 894→138 | 810→128 | |
| @fabrizio_builds | 907→526Unranked | 709→424 | 800→681 | 817→157 | 893→197 | 872→230 | |||||
| @uselegion | 822→399Unranked | 462→485 | 685→659 | 723→335 | |||||||
| @legiondotcc | 937→659Unranked | 846→416 | 934→698 | 950→212 | 944→145 | 946→144 | 800→105 | 893→136 | 951→105 | 948→170 | 822→163 |
Each account is a radar: red = raw graph (maxed everywhere, fame), green = the score rendered on this page — content-confirmed anchors high, graded follower-standing (plus curated tags and researched membership where they apply) around them, true zero where there’s no connection. 2,533,491 accounts hold a sector standing; accounts with no sector signal keep only a global rank.
The follower signal is powerful, but it has a hard limit we measured directly: experts follow famous people too, so who-follows-you cannot, by itself, tell an investor apart from a journalist or a celebrity when they share the same audience. Here is the actual inbound endorsement each account receives from high-ranked AI experts:
| account | who they are | inbound AI-expert reputation (live, selectivity-weighted) | AI share of their inbound reputation | concentration vs. baseline |
|---|---|---|---|---|
| @pmarca | AI investor (a16z) | 5,750,301 (rank 13) | 41.5% | 1.31× |
| @karaswisher | tech journalist | 1,972,621 | 40.5% | 1.28× |
| @mrbeast | YouTuber | 1,064,602 | 38.8% | 1.23× |
| @cristiano | footballer | 197,266 | 34.7% | 1.10× |
Share = the fraction of that account’s own inbound reputation coming from AI (REai÷ΣRE), not the share of their followers who are AI experts. This is the one block on the page pasted rather than rendered — computed from the inbound cache RE.npy (on disk as this rendered: 2026-07-29), last reproduced 2026-07-27, so it can age independently.
Andreessen holds a large AI-expert endorsement — though not the largest; he ranks 13th, behind @karpathy, @sama, @openai, @ylecun and @elonmusk. The damning part is the concentration: Kara Swisher’s is statistically identical to his (1.28× vs 1.31×), and even a footballer sits at 1.10×. Lower the bar to give Andreessen an AI score, and you hand the same to a journalist, a YouTuber, and Ronaldo. So the score can’t rest on raw endorsement mass.
Two things resolve it. Content reads what an account posts — the AI investor vs. the AI journalist. Expert density (inbound expert-reputation ÷ followers) separates real accounts from mass fame: a celebrity’s base dilutes their expert-followers to ~0 (@lebronjames 0.01) while narrow technical accounts run orders of magnitude denser (hand-checked examples; the operational rule is the threshold, not the range). Density decides whether an account is admitted — a content anchor or curated tag also admits. Once in, sectors are graded on a continuous curve rather than kept/dropped, which is what replaces spiky one-sector radars with a real gradient; a sector below the evidence floor (RE < 250) still reads 0 rather than an invented value.
On famous accounts it can look binary (a top expert ≈ 1000, a masked celebrity = 0), but that’s a trick of picking famous examples. Across the graph the scores fill the whole range, and an account that clears the admit gate gets a graded radar rather than a spike-then-zeros.
The honest size of that claim: 2,533,491 accounts hold at least one sector standing — 25% of the 10,240,832 that are eligible for a person leaderboard at all. So “a real account is a full grey radar” is not true of the typical account: the majority carry a global rank and nothing else, with too little inbound evidence in any single sector to place them. The gradient below describes the accounts that are placed.
The distribution is well-spread. Measured on the file rendered above, the 5,457,033 graded (grey) follower-derived standings run: 10th percentile 262, median 541, 90th 650; across all 5,512,014 standings of every layer it is 263 / 541 / 653 — the middle is full, not a wall of 1000s and 0s. The sample table above features famous experts (≈1000) and masked accounts (0), which makes it read more binary than the graph is.
A placed account is usually a mix. @lisasu is semi 1000 and AI 953 (her real domains), and holds 10 graded sectors in all — robotics 484, biotech 416, fintech 396, space 390 around them. @pavelprata carries AI 707, fintech 657 and 10 sectors in total — biotech 513, space 511, defense 502, robotics 484. Both lists are read from the radar rendered above, so they say what these accounts actually hold rather than naming sectors that may have gone to zero.
x, and they are the one case where a 0 means “we looked and it is not true” rather than “we have no evidence”. In none of the four is it “ranked low” — a real mid-tier account like @zemariamacedo reads fintech 708, AI 541 and 10 graded sectors in total; @wazzcrypto keeps a content-anchored fintech 921 plus a lighter grey ring (6 sectors). The pure follow-graph fame we removed now shows up only as masked celebrities/orgs, not as zeroed real people.One concrete lesson, and it is the direct cause of the hardest problem still open in this build.
This graph was built out of paid API calls to X. Each profile call returns a full profile object — ~24 fields. The production crawl kept five of them (name, bio, follower_count, following_count, total_tweets) and discarded the rest, including the field that most directly identifies an organization: verifiedType (Business / Government). Not every one of the 10.45M accounts was individually fetched — most are follow-graph targets discovered from crawled sources — so read this as “the crawl was paid for”, not “every row is a paid profile fetch”.
Why it bit us. Keeping companies and agencies off people-leaderboards is exactly what verifiedType is for — and you cannot reliably guess it from a name or bio. Because it wasn’t stored, everything we built to replace it is inference: a hand-curated media list, name/bio regexes, and a trained person-vs-entity classifier. That stack is why some organizations reach the leaderboards at all: @huggingface, @economist and @perplexity_ai carry no verifiedType, so even a re-fetch wouldn’t label them and only hand curation could close them. And it is why a single bad pattern in that stack once silently zeroed 16 real experts before we caught it — the reason the regexes are now features to a classifier, never a standalone mask.
Business is decisive, but Government is issued to individual officials as well as to agencies, so it defers to the classifier rather than masking outright — and an unpaid organization carries no type at all. Where we do hold it, it is authoritative — self-declared and paid for via X Verified Organizations, not inferred — so Business now hard-masks, outranking the classifier. We hold it for 2,540 accounts (against a scoreable pool of ~2.49M), and applying just those masked 1,127 Business/Government accounts — 345 of them still holding sector scores (counted in the 2026-07-27 build log; the shipped file keeps no pre-mask state, so these two are dated numbers, not live ones) — @consensys, @coinbasemarkets, @coinlist, CNBC show accounts, a CIA press account, CAL FIRE. Stored at crawl time for every account, org filtering stops being a machine-learning problem and becomes a dictionary lookup.One asymmetry to respect: verifiedType = Business/Government is proof of an organization, but its absence proves nothing — it is a paid tier, not a label. @huggingface and @mit are both blank. So absence must never be read as “person”, and a classifier is still needed for the remainder.
The fix going forward: store the entire raw response from every paid call, keyed by the numeric user ID (itself worth keeping — handles get renamed, IDs don’t, and the cheaper bulk endpoint needs them). Storage is cheap; re-scraping millions of accounts to recover one dropped field is not. Note this is not retroactively recoverable — the fields were never written, so closing the gap means re-fetching profiles, not re-reading the crawl we already have.
docs/technical/eigenrep-dev-migration-v2.1-to-final.md and eigenrep-architecture-audit-2026-07.md.