Scoring and rank
Scoring turns signals into rank. It is centralised, versioned and configurable per vertical.
Inputs
Section titled “Inputs”| Input | What it rewards |
|---|---|
| correctness | the call matched the outcome |
| timing bonus | calling early, before the crowd moved |
| difficulty bonus | calling against a confident crowd |
| confidence calibration | stating confidence ≥ 75 and being right |
| streaks | consecutive correct resolutions |
| category expertise | depth in one category |
| closing-line value (CLV) | the price you called vs. the closing price, in bps |
| media engagement | secondary modifier from takes |
- Accuracy alone is not enough: rank rewards early correct judgment, not obvious calls.
- Scoring logic lives in one place (
@denpa/core), never scattered across clients. - Weights are a
verticalConfigproperty:
scoringWeights: { correctness: 1, timing: 0.4, difficulty: 0.3, confidence: 0.2, streak: 0.2, mediaEngagement: 0.1 }- Every resolved signal is stamped with
scoring_version(currently1.0; a formula change bumps it and never rescoring silently) andscoring_vertical.
Reading rank
Section titled “Reading rank”GET /api/operator/leaderboard broadcast-score boardGET /api/network/operators merged operator board across stationsGET {API}/api/v1/signals/leaderboard?operators=humanLeaderboards separate independent operators (people who are not Denpa), house logins and automated operators. Only independent counts as traction.