Skip to content

Honest XvB economics: measured realization + win odds on both earnings surfaces - #874

Merged
VijitSingh97 merged 3 commits into
developfrom
feat/xvb-honest-economics
Aug 3, 2026
Merged

Honest XvB economics: measured realization + win odds on both earnings surfaces#874
VijitSingh97 merged 3 commits into
developfrom
feat/xvb-honest-economics

Conversation

@VijitSingh97

Copy link
Copy Markdown
Collaborator

What

The expected-vs-actual card and the XvB tier calculator both priced XvB's published per-tier estimate as income. Measured on production (30d ending 2026-08-02): wins paid ~19% of that face value, making the card read 54% while the P2Pool leg ran at 120% — and the calculator's Net/yr showed +2.97 XMR/yr for a tier measured at about −1.8.

The winners file we already mirror over Tor publishes the qualifier count per round, so both surfaces become honest with no new egress and no re-derivation of XvB's reward_calc:

  • parse_round_stats — second parse of the same fetched body: round-type frequencies, qualifier averages, span. Cached beside the reward estimates with the same XvB algo over-donates when the XvB stats fetch is stale/failing (no staleness guard) #311 staleness rule.
  • Expected wins — the card's "—" becomes a forecast: rounds-per-day ÷ qualifiers for the held tier (verified against production: predicted 0.84 whale wins/day, measured 0.84/day).
  • Measured realization — confirmed payouts within 2h of each settled win ÷ face value per win, ≥5 wins required. The earnings card's XvB leg and the calculator's Net/yr scale by it and label themselves (measured); until measurable, face value stands, labeled (face value) and described as an upper bound.
  • Draw line — each tier's win odds + qualifier count in the calculator, which also makes a single-qualifier tier (Mega, currently one donor winning 42% of rounds) self-evident.

Testing

Tier 1/2 per docs/dev/testing-strategy.md: parser bounds + aggregation, storage contract, forecast/realization/tempering unit tests, calculator payload tests, frontend logic + component render tests (271 node tests). Full suite + docs voice lint green; patch coverage 98%.

Docs: docs/dashboard.md updated for all three surfaces in house voice.

Closes #866. Closes #872.

🤖 Generated with Claude Code

VijitSingh97 and others added 3 commits August 2, 2026 21:42
The expected-vs-actual card folded XvB's published per-tier estimate into
expected at face value, and the tier calculator's Net/yr did the same — on a
production Whale box the card read 54% while the P2Pool leg ran at 120%, and
the calculator showed +2.97 XMR/yr for a tier measured at about -1.8.

The winners file we already mirror over Tor carries the qualifier count per
round, so both surfaces can be honest without new egress or re-deriving
reward_calc:

- parse_round_stats aggregates every round (one fetch, second parse): type
  frequencies, players averages, span.
- xvb_expected_wins_day forecasts wins/day for the held tier (verified against
  production: predicted 0.84/day, measured 0.84/day) — fills the wins row's
  expected cell.
- xvb_realization measures what wins actually paid (confirmed payouts within
  2h of each settled win vs face value per win); the earnings card's XvB leg
  and the calculator's Net/yr scale by it when >=5 wins are measurable, and
  say so; face value stands labeled as an upper bound otherwise.
- The calculator shows each tier's draw (win odds + qualifier count), which
  also makes a single-qualifier tier's fragility self-evident.

Closes #866. Closes #872.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@VijitSingh97

Copy link
Copy Markdown
Collaborator Author

Post-merge correction: the '~19% of face value' figure in this PR body was an interim 2h-window measurement, superseded by the study's final on-chain figure of 33% [28%, 39%] (all three sidechains, 25 rounds). The realization pipeline this PR shipped was subsequently corrected to a 6h baseline-subtracted window (#879) and the estimator band re-derived in #900.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant