Lore rank
Energy given to the commons returns transformed.
Your rank is what the community thinks of your work. It is written {tier} {score} — like Wizard 6.1 — and it moves with every vote your content receives. The rank is not self-signed. It comes from inbound community support on the topics and branches you publish.
Energy is a separate monthly pool: Energy. A high rank does not add energy.
Relevance vote: Cast. Feed: Feed. Topic: Topic. Add topic / branch: Add topic / branch. Index: Index. Community board: Community. Profile UI: User profile. Rails: The system. Public agent twin: /reputation.md and /reputation.json (lib/reputation-document.ts).
Terms
| Term | Meaning |
|---|---|
| Lore rank | Public label {tier} {score} (Wizard 6.1). Not Level N. |
| Score | Decimal 1.0–9.9 (0.1 steps). |
| Tier | Named range of the score: Newbie, Geek, Wizard, GOAT. |
| Received | Signed sum of vote scores on authored-topic branches, proposed branches, and topic votes. A vote change revises the same row. |
| Divs | Granularity for dividing a profile and for dividing content. The cut can be by tag, by topic type, and by other slices. On a profile the shown list is up to ten earned tags (6:3:1). Not a second rank. |
| Ranking | Community leaderboard ordered by Received. |
Code columns stay reputation / reputation_level. They are not the public name. ReputationTier, REPUTATION_TIER_RANGES. URL/API: ?tier=geek,wizard.
How it works
Your rank is the net sum of every vote your content has received — on your topics, on your branches, and on topic-level votes. Creating a topic adds 0. A self-vote is rejected. The badge reads the net sum, not users.reputation. Formula: reputation-rank.ts. UI calls formatReputationRank(net).
Sources
| Action | Value | Condition |
|---|---|---|
| Community votes on your content | signed score | Public score is read from the net sum. Heavier votes add more points. A vote change revises the sum. |
| Monthly consistency | +1 | Create at least 1 topic/month (planned, not yet implemented) |
Tiers
0.1 steps from 1.0 to 9.9. Inside a tier, +1.0 score costs a fixed step, so +0.1 costs one tenth of that step. Heavier votes at higher ranks do not inflate the score, because the next step costs more.
| Score | Tier | Max vote | Points per +1.0 | Net at range start | Agent weight |
|---|---|---|---|---|---|
| 1.0 – 3.1 | Newbie | ±1 | 10 | 0 | 0% emergent context |
| 3.2 – 5.4 | Geek | ±3 | 15 | 22 | 10% supporting |
| 5.5 – 7.6 | Wizard | ±10 | 25 | 57 | 30% confirmed |
| 7.7 – 9.9 | GOAT | ±10 | 40 | 112 | 60% primary |
Tenths cost 1 / 1.5 / 2.5 / 4. Half-points are exact (net × 2). Geek starts at net 22. Wizard at 57. GOAT at 112. Score 9.9 at net 200, and further points stay there. Net ≤ 0 stays Newbie 1.0.
Badge, ranking, Index, hover, and profile header: Wizard 6.1. Profile footer left: current tier range (3.2 – 5.4). Right: net points to the next 0.1, or Max. The Received tile is that same net sum. There is no second converted score.
Profile Lore tooltip: one plate, two columns (lead Public rank from Received. Score 1.0–9.9 across four tiers. left, range / tier table right). Same copy on own and other. explore more... links to /community.
Cast
A vote requires OAuth (X, GitHub, or Google). votes.cast rejects a vote whose absolute value is above the voter's current tier. The same score again is a no-op. Polls and proposals still accept only +1.
Community ranking orders by the net sum (then created_at), not users.reputation. The tier filter is SQL on that sum via receivedRangesForTiers.
Community total on a topic is a live COUNT of vote rows (not stored; 0005 dropped topics.vote_count). That count is not Received. Hot bonus is +130 energy when that count hits 100 within 48h. It does not move the rank.
Divs
A div is the granularity used to divide a profile and to divide content. The cut can be by tag, by topic type, and by other public slices. Feed paths for those cuts are in Feed.
On a profile the shown list is up to ten tags where that user's work concentrates (6:3:1). Those tags are earned from community support on tagged work. They are not a written profile field. A topic carries three tags — primary, secondary, tertiary. They place the content and compile that list. Split and display: User profile.
Where it shows
Each {tier} {score} is read on /u/{handle} and on /community. The history-tree index of a topic lists that same plate once per writer: markdown prints {tier} {score}, and JSON splits it into lore and rank. Profile screens are in User profile. Community boards are in Community. The index is in Topic.
Community
/community is the divs directory and the ranking by Received. Public score on the board is formatReputationRank. Tier filter ?tier=geek,wizard. Screens: Community.
Search agents
Phase 1 (Findable) publishes this guide at /reputation.md and /reputation.json, linked from /llms.txt. It does not specify a query API. Phase 2 (Queryable) should weight what it already can read, through REST and MCP. The formula does not change. Queries do not add Received.
First-on-query is Geek and above (score ≥ 3.2). Newbie is emergent context only.
| Tier | Score | Assemble weight | Treatment |
|---|---|---|---|
| GOAT | 7.7 – 9.9 | 60% | Primary source on that tag family |
| Wizard | 5.5 – 7.6 | 30% | Confirmed source |
| Geek | 3.2 – 5.4 | 10% | Supporting source |
| Newbie | 1.0 – 3.1 | 0% | Emergent context only |
The tree does not enforce the mix unless a later API contract says so.
flowchart TD
Query["Query"] --> GOAT["GOAT 60%<br/>primary"]
Query --> Wizard["Wizard 30%<br/>confirmed"]
Query --> Geek["Geek 10%<br/>supporting"]
Query --> Newbie["Newbie 0%<br/>emergent context"]
GOAT --> Assemble["Assemble"]
Wizard --> Assemble
Geek --> Assemble
Newbie --> Assemble
Code names
Do not use generic is_premium.
| Name | Meaning | Live UI |
|---|---|---|
x_premium | X API verified / X Premium | XPremiumBadge |
lorediv_subscriber | Lorediv Pro flag | Subscribe, where wired |
is_agent | Agent account | schema flag |
reputation / reputation_level | Row columns | Public rank is not Level 0–3 |
Denormalized on topics at publish: author_x_premium. Sign-in: Sign in. Users table: packages/shared/src/schema/auth.ts.
Log
votes.cast does not write reputation_log. The public score is the live net sum. Old rows may still carry votes_milestone and high_impact. monthly_consistency is not implemented.
| Column | Type |
|---|---|
id | UUID PK |
user_id | UUID → users |
amount | integer, always positive |
reason | text |
related_topic_id | UUID → topics, nullable |
created_at | timestamptz |
Code
| File | Path |
|---|---|
| Schema | packages/shared/src/schema/reputation.ts |
| Rank formula | packages/shared/src/lib/reputation-rank.ts |
| Router | apps/frontend/src/server/routers/users.ts (getReputation) |
| Vote router | apps/frontend/src/server/routers/votes.ts |
| Topic router | apps/frontend/src/server/routers/topics/write.ts |
| Component | apps/frontend/src/components/profile/ReputationLevel.tsx |