28 named sources, 6 categories, one weighted dial.
Mittari does not scrape Twitter. It aggregates 28 named, named-source feeds across 6 categories with published per-source weights. Below: the categories, how the weighting works, what we do when sources disagree, and how source-list changes are governed.
The six categories
Why 28 and not more
A wider source list does not produce more signal. It produces more noise. The PUTKI HQ source library was capped at 28 in late 2025 because that is where the marginal signal of an additional source dropped below the marginal cost of monitoring it. Adding a 29th source costs us editorial attention; the same attention applied to existing sources improves freshness and reduces lag, which is the actual differentiator on a daily signals feed.
28 is also a cap chosen to make weight transparency tractable. Every source has a published weight (visible on /mittari and on each signal permalink). With 28 sources, a reader can audit our weighting in 4 minutes. With 60 sources they cannot.
How weighting actually works
Each source carries a base weight (0-10) that reflects long-run accuracy on PUTKI HQ's back-tested calls. Yle Urheilu and HockeyNews.fi carry the highest base weights (9 / 10) because their team-news desks have produced the lowest false-positive rate over the trailing 18 months. OddsPortal carries a 7 because its aggregation logic occasionally double-counts soft bookmakers.
On top of the base weight, every signal carries a freshness multiplier (1.0× at <2h, decaying to 0.4× at 24h+) and a corroboration multiplier (a source that agrees with at least two independent sources keeps its weight; a lone-voice source is discounted to 0.6×). The combined weight is what produces the dial reading. Sources cannot be cherry-picked; the pipeline is deterministic.
What happens when sources disagree
Signals where the weighted disagreement crosses a configured threshold (current default: variance across sources > 0.35 on the normalised score) are flagged as CONTESTED. The dial reads "Myrsky" — storm — and the signal is published with an explicit "sources disagree" callout instead of a confident dial position. We would rather show uncertainty than fake confidence.
In a one-year backtest, ~8% of all signals hit the CONTESTED state. Those signals are exactly the ones experienced operators read most carefully — uncertainty is the actual product on those days.
Source-list governance
Sources can be added, removed, or re-weighted. Every change is logged on /paivityslog with a date, a reason, and (where the change is reactive to a known accuracy failure) a postmortem link. The most recent change (2026-01-18): re-weighted HockeyNews.fi from 8 → 9 after a 6-month trailing accuracy of 0.91 on transfer-day calls. The previous change (2025-12-04): added IL (Ilmatieteen laitos) at weight 6 after FMI deprecated their open-data feed.
Editorial bias: a source that ever runs as a paid PUTKI HQ affiliate is automatically capped at weight 0. We do not pay sources; sources do not pay us; both directions are documented on /affiliaatti.
- PUTKI HQ source library /source_map.py (commit-tracked, public via /api/mittari/copy)
- PUTKI HQ Operator Runbook §M-7 — source weighting governance
- /paivityslog — change log for every source-list edit since 2025-11
- THL Rahapelitutkimus 2023 (academic reference for trust calibration)