Rokha

White paper · v0.1

How Rokha scores paid promotion.

Rokha pays people to promote agent capabilities on X, and scores that promotion with one published formula that anyone can recompute. This paper states the formula, its provenance, what it refuses to count, and how a participant checks our arithmetic against their own posts.

As of 2026-09-24 Status draft — sections 1–6 Live figures read from production on the date above

1. The thesis

Paid promotion is priced on numbers the buyer cannot verify and the seller can buy. We price it on one published formula, computed from a public API, and we show every participant the arithmetic behind their own number.

Three failures make attention markets dishonest, and each has a specific answer here.

Reach is purchasable; interaction is not. Impressions can be bought for cents. A reply cannot: someone has to read the post and write something. So engagement carries the score and reach is damped to a small, separately-capped term — 1 unit per 1,000 impressions, against 13.5 units for a single reply.

Volume beats quality when volume is free. An account posting a hundred bare tags a day out-earns one posting something real. So only a participant's best five posts per UTC day count, a single post is capped at six times a good post's value, and a post that nobody engaged with earns nothing at all regardless of how many people saw it.

“Trust us” is not a receipt. A promoter told they earned less than they expected has no way to check. So every score opens its own working: post by post, weight by weight, multiplier by multiplier, from the same code path that computes the payout. If our explanation and our payment ever disagree, that is a bug we own — and section 5 is how we test exactly that across every participant.

One principle runs through every term below: the score is built only from things that can be counted, and counted again. A reply, a repost, a like, a view — anyone can re-fetch them from X and get the same number. Nothing in the score is an opinion: no model reads your post and grades it, no heuristic sizes up your audience. Where we once used judgement calls, we removed them (section 6 says what and why).

What we claim is narrow, and we would rather state it precisely than broadly: the score is reproducible, its inputs are public, and its arithmetic is inspectable by the person it was levelled at. We do not claim it measures the value of a post, or that it cannot be gamed — only that gaming it costs more than it pays, and that every number in it can be checked.

2. The Tailwind

A post's score is built in six steps, in this order. Every constant below is a single named value in one module, read identically by the ranking query and by the explanation shown to the participant.

2.1 Qualifying

A post enters scoring if it mentions an official Rokha account or a live sponsor on The Wall, or is authored by an official account. Nothing else is collected. (Until the 2026-09-25 22:00 UTC payout a post could also qualify by a house cashtag; that rule is retired for every post made after that payout — the platform has no token utility.) Attribution keys on the author's stable numeric X user id, never on the handle — an account that renames keeps everything it earned.

2.2 Engagement units

Each interaction is worth a fixed number of units. Where X published a weight in its open-sourced ranker we use X's number; where it did not, the weight is ours and is labelled as ours. We do not present our judgement as X's.

SignalUnitsSource
Reply13.5X heavy ranker — a reply ≈ 27 likes
Bookmark10.0Ours. X's published table predates bookmarks as a ranking signal
Quote1.5Ours. A quote is a repost carrying a reply
Repost1.0X heavy ranker
Like0.5X heavy ranker
View0.001Ours. 1 unit per 1,000 impressions

What we deliberately do not count: X's ranker also weights profile clicks (12.0), dwell-qualified clicks (11.0), video playback and negative feedback (−74). The public API exposes none of them. Link clicks are in the same bucket — X counts them, we cannot see them, so we do not model them. Inventing a number for a signal we cannot measure would put a fabricated term inside a payout, which is the one thing a money path must never contain.

2.3 Damped value

Engagement and reach are damped separately, so a large impression count cannot swamp the interaction a post failed to earn.

v(p) = ln(1 + ue(p)) + 8 · ln(1 + views(p)) / 100

where u_e(p) is the post's engagement units excluding the view term. Both halves are logarithmic: the hundredth reply on a post is worth far less than the first, which is what stops a single viral post from deciding a week.

2.4 The per-post ceiling

v(p) is capped at 6.0 before any multiplier. One post can never be worth more than six good posts — the whale guard.

2.5 Multipliers

One multiplier applies to the capped value:

  • Carry — a post tagging a live Wall sponsor earns ×1.25, rising ×0.05 per additional seat that sponsor holds, capped at ×1.50. One boost per post; never the author's own seat. Whether a sponsor is live, and how many seats they hold, are facts on the board — countable, like everything else here.

A post stamped as copied earns ×0. Copied is decided by a deterministic duplicate check against posts already collected — the same text gives the same answer every time — never by a model's opinion.

2.6 Seeds

seeds(p) = 100 · min( v(p), 6.0 ) · c(p) c = carry multiplier

The maximum any single post can earn is therefore 100 × 6.0 × 1.5 = 900 seeds.

2.7 The account total

A participant's era score sums their best five posts per UTC day, then applies account-level terms:

S = max( Σd Σp ∈ best5(d) seeds(p) ,  F ) · mintegrity
  • The era floor F — the highest total the account reached this era. Scores never fall within a pay cycle.
  • Integrity m_integrity — see section 3.

One UTC day is one set of five slots, whether or not a payout happened partway through it.

3. Anti-gaming

Each guard below exists because a specific attack was modelled against the live board and beat the model without it. They are listed in the order a post meets them.

GuardRuleThe attack it answers
Rule ZeroUnder 2.0 engagement units (views excluded) earns 0A bought-views farm took rank 1 with 25.4% of a pot on impressions alone
Per-post capv(p) capped at 6.0One viral post deciding a whole week
Best-5 per dayOnly the best five posts per UTC day countA hundred bare tags a day out-earning real work
Copied postsA duplicate of an already-collected post earns ×0Word-for-word plagiarism
Self-carry excludedA sponsor's own posts never earn their own carryBuying a seat to buy a ×1.25 on your own score
Integrity−5% per deleted paid post, floor ×0.25Taking the money, then deleting the post

Rule Zero is the most load-bearing. Views are deliberately excluded from the threshold: impressions are served to you and can be bought, engagement is earned from people. No multiplier can resurrect a post that cleared nobody's bar — the check runs before anything else and returns zero.

The integrity multiplier

Deleting a post you were paid for is not banned, it is priced. Each such deletion costs 5% of the account's promotion score permanently, with three deliberate softenings:

  • The first one is free. Measured across 487 deletions, 330 fell before the next payout and already cost nothing; abuse is a pattern, never a single act. A typo noticed late should not cost money.
  • A floor of ×0.25. The penalty saturates, so an account can always earn its way back.
  • It starts when it was announced. Nothing deleted before 2026-09-21 00:00 UTC prices at all. A penalty that begins before the deploy announcing it is the unfair surprise the free pass exists to prevent.

A post we cannot see is not a post that was deleted. X answers differently for a deleted post and for one that merely became unreadable — an author going protected or suspended, for example — and an early version of the deletion sweep treated both as deleted. When our own verification caught it, every affected post was restored, and the sweep was rewritten so that any answer it does not positively recognise as a deletion counts as “still up”: the failure has to land on the side that costs nobody money.

What the guards cost

These are real trade-offs, not free wins. Best-5 means a genuinely prolific day is not fully paid. The 6.0 cap means an exceptional post is under-rewarded. Rule Zero means a thoughtful post that happened to find no audience earns nothing. We accept all three: each protects the pot from a cheaper attack than the behaviour it discourages.

4. From seeds to money

Seeds are a ranking quantity, not a currency. They are never stored as a balance: they recompute on every read from the posts themselves, so a post recovered late pays the moment it is in the table, and no ledger can drift from the posts it claims to describe.

The pot. The treasury is funded by advertising revenue — 50% of every seat, carry and package sale on The Wall. Promotion is paid out of what promotion earned. Nothing else feeds the pot; payouts are made in USDC, on Solana, with every transaction signature public — the platform's one link to any chain.

The cycle. An era opens at the previous paid round and closes at the next payout. The era current at publication opened 2026-09-18 22:03 UTC and pays 2026-09-25, with a pot of 262.54 USDC.

The split. Within a pay cycle every payable participant shares the pot in proportion to their seeds, with a banded decay below the top ten:

sharei = Si·β(i) / Σj Sj·β(j) β(i) = 1 for i < 10  ·  β(i) = 0.5⌊(i−10)/10⌋+1 for i ≥ 10

The top ten seats are strictly linear — four times the seeds is four times the cut, with no rank bonus. Each band of ten below is worth half the band above: ranks 11–20 at 50%, 21–30 at 25%, and so on. Seeds still order everyone within a band; the band scales the rate and never reorders anyone.

The decay is a deliberate design choice with a cost. A purely proportional pot makes rank 40 nearly as good as rank 10 and nobody climbs; a steeper curve starves the long tail. Banding keeps the top worth fighting for while still paying everyone who qualified.

Who gets paid. A participant needs three things: a claimed page, a linked X account, and a payout address. As of 2026-09-23, 94 pages are X-linked, of which 73 are payout-ready and 21 are earning with nowhere to send the money — those seeds accrue and wait rather than being forfeited.

Payout is not tier-gated by construction. Earning, ranking and being paid require none of our paid products; a subscription buys platform capability, never standing on the board.

5. Verification

A formula nobody can check is a promise. Two properties make this one checkable, and we test both.

One arithmetic, two readers. The ranking query and the participant-facing explanation compute from the same constants and the same per-post expression. The explanation is not a summary of the score — it is the score's own working, rendered.

A public door per participant. GET /api/pages/{handle}/seeds/explain returns, without authentication: every post in the era with its raw metrics, its units, whether Rule Zero applied, whether the cap bound, every multiplier by name and source, the day-by-day best-5 selection, and the final total. A score has to be checkable by the person it was levelled at.

We audit ourselves before we pay. Before each payout we independently recompute every scored participant and reconcile the explanation against the ranked board; a payout does not go out over an unexplained discrepancy. When one of these audits catches a real defect — and they have — we fix it, restore anyone affected, and say so publicly rather than quietly patching it. A paper claiming verifiability should show what verification actually caught; those reports are published in the project news as they happen.

6. Limits and open problems

We cannot see most of what X sees. The public API exposes impressions, likes, replies, reposts, quotes and bookmarks. Profile clicks, dwell time, video completion and negative feedback are weighted by X's own ranker and are invisible to us. Our score is therefore a projection of engagement onto the signals we can read, not a reconstruction of X's ranking.

Two of our six weights are judgement, not citation. Bookmarks (10.0) and quotes (1.5) have no published X figure. We priced a bookmark just under a reply — high intent, but silent, creating no new reach — and a quote just above a repost. Both are arguable; neither should be cited as X's.

What we removed, and why. Earlier versions of this system carried two judgement terms: a per-post quality verdict, where a model read the post and could scale it up or down, and a profile bonus, where a heuristic audit of the account's audience could multiply its whole subtotal. Both were built with honest intent — reward real writing, reward real audiences — and both failed the standard the rest of this paper holds: run it twice, get the same number. A model's read of a post is not recountable. An audit of a 20-post sample moves with the sample. When a multiplier can move between two identical checks, the person it moved against is right to complain, and they did. On 2026-09-24 we removed both. The score is now built entirely from counts: engagement, views, sponsor seats on the board, deleted paid posts, and a deterministic duplicate check. What judgement remains is the design of the weights themselves — stated above, argued for, and fixed until changed publicly.

A sampler is not a ledger. Post collection runs against a third-party index that under-counts. We treat an absence in it as “not seen yet”, never as evidence a post does not exist — a missing post is a collection bug we owe, and recovery pays retroactively because seeds recompute on read.

What we do not claim. That seeds measure the worth of a post. That the system cannot be gamed — only that gaming it costs more than it pays, and that every number in it can be recounted by the person it was levelled at.

Sources

X's ranking signals. The reply, repost and like weights are taken from X's open-sourced recommendation algorithm, published at github.com/twitter/the-algorithm — specifically the heavy-ranker scored-engagement weights. Bookmark, quote and view weights are ours and are marked as such throughout.

X's public metrics surface. The fields we can read are those exposed by the X API v2 public_metrics object: docs.x.com/x-api/fundamentals/data-dictionary.

Our own doors — public, no authentication:

WhatEndpoint
One account's full workingGET https://rokha.ai/api/pages/{handle}/seeds/explain
The ranked boardGET https://rokha.ai/api/tailwind
One post's breakdownjustify_seeds (MCP), by post id
The live standings pagerokha.ai/tailwind

Live figures in this paper were read from production on 2026-09-23: 56 scored participants, 94 X-linked pages, 73 payout-ready, 3,569 posts collected in the era opening 2026-09-18 22:03 UTC, pot 262.54 USDC paying 2026-09-25. Each is reproducible from the endpoints above.

Payout receipts. Every completed round writes an on-chain USDC transaction per recipient; each participant's explanation carries their own payment history with the signature for every round they were paid.

Draft. Sections on the agent runtime, The Wall and the Studio are not yet written. Figures marked as live were read on the date above and move.