Loading…
Loading…
Transparent by design
Everything that moves a score is documented here and implemented as tested pure functions. Version strings are stored on every snapshot and result.
Market data comes from a pluggable provider. Until a live provider is connected, a deterministic simulated provider generates a seeded random walk at six-hour steps; the footer states when data is simulated. In production the provider is CoinGecko (via MARKET_DATA_API_KEY). Every snapshot stores its source, takenAt, constituent version and formula version. Simulated values are never presented as live, and live values are never fabricated: if data is missing the narrative is marked unavailable.
Each narrative has a versioned constituent set of five assets. Weights are equal and capped at 35% per asset; any excess is redistributed so a single large-cap token cannot dominate. Constituent sets are immutable during a live Race and every change creates a new version.
narrative_score = price × 0.4 + breadth × 0.25 + volume × 0.2 + momentum × 0.15
All components are clamped to 0–100 before weighting. The pre-lock snapshot uses the seven days before the lock; Race snapshots measure from the Race start.
A narrative needs usable data for at least 60% of its constituents (minimum two). Otherwise it is marked unavailable, ranked last, and shown as “n/a”. If fewer than 60% of narratives have usable final data the Race cannot settle and must be voided by an admin.
At settlement narratives are ordered by final Narrative Score. Starting rank is the pre-lock rank.
| Role | Base points | Cap |
|---|---|---|
| Leader | 1st: 100 · 2nd: 40 · 3rd: 20 | 150 |
| Challenger | Top 3: 60 · 4th: 20 | 90 |
| Wildcard | 20 per position gained vs start, max 80 | 120 |
multiplier = 0.5 + energy / 100 (0 → ×0.5, 100 → ×1.5) role_points = min(cap, base × multiplier) race_score = leader + challenger + wildcard (max 360)
Energy is virtual. Scores are produced by a pure function (scoreLineup) covered by unit tests. Settlement is idempotent: re-running it produces the same results and never awards XP twice.
An admin may void a Race (for example, a data outage). Void entries award no XP, do not count toward accuracy, and neither extend nor break streaks.
Crowd Picks aggregate human lineups only. AI lineups are excluded. We publish the most common pick per role, Energy-weighted conviction per narrative, a consensus lineup (top pick per role, de-duplicated, Energy re-scaled to 100) and the biggest disagreement (the role whose top two choices are closest). Crowd data is hidden from eligible players until their own lineup is locked or the Race has closed.
The three coaches are deterministic rule sets (strategy version ai-rules-v1), not machine learning. They draft from the pre-lock snapshot, lock at the deadline with the same three-role / 100-Energy structure, and store the snapshot id they used. They are never generated or revised after the Race starts.
| Event | XP |
|---|---|
| Locked a valid lineup | +10 |
| Correct winning Leader | +100 |
| Challenger finished top 3 | +40 |
| Successful Wildcard | +60 |
| Three-Race participation streak | +25 |
| Three correct Leaders in a row | +50 |
Levels: Observer 0 · Scout 250 · Analyst 750 · Strategist 1500 · Meta Hunter 3000 · Navigator 6000.
meta_rating = round(avg_race_score × 4 + leader_accuracy × 300 + challenger_accuracy × 150 + wildcard_accuracy × 150)
Ratings are provisional until a player has three settled Races. Meta DNA needs the same sample and summarises best narrative, best role, early-discovery performance (Wildcard positions gained), conviction calibration (Energy placed on hits vs misses), consensus-vs-contrarian tendency (how often your Leader matched the crowd) and average finishing score. Labels: Early Hunter, Rotation Reader, Wildcard Scout, Consensus Navigator, Contrarian, Balanced Strategist.