> polymarket-tracker --manual [← back to dashboard]

Polymarket Intelligence Terminal — Dashboard Guide

Reading guide for https://prophecy.rootkey.be/. Explains what every panel shows, what every number means, and how to interpret the chart.


0. Quick orientation

The dashboard is a single-page terminal-style view organized top-to-bottom:

┌─ STATUS BAR ─ (connection, last scan, latency, node, clock) ────────────────┐
├─ HEADER ─ (terminal title, session indicator) ──────────────────────────────┤
├─ STATS GRID ─ Total Signals │ 24H Signals │ High Conviction │ Last Scan ────┤
├─ PLOT (full width) ─ signal frequency, hourly, last 24h ───────────────────┤
├─ ROW: Conviction signals │ Prophecy whale signals ─────────────────────────┤
├─ ROW: Whale Tracker (half) │ Whale Feed (half) ────────────────────────────┤
├─ ROW: Top Sharps Leaderboard │ Archetype Distribution ─────────────────────┤
├─ Prophecy Live Trade Feed (full width) ────────────────────────────────────┤
├─ Today's Recommendations (full width) ─ nightly deduped BUY board ──────────┤
├─ Tracker Self-Check (full width) ─ how accurate the recommender has been ───┤
├─ Markets Active (full width) ──────────────────────────────────────────────┤
├─ Price Ticker (scrolling) ─────────────────────────────────────────────────┤
└─ FOOTER ─ model info, signal hit rate ─────────────────────────────────────┘

Most clickable rows open a detail flyout from the right (close with [X] or Esc).


1. Status bar

Field Meaning
CONN: ACTIVE Dashboard is connected to the backend. Solid green dot = healthy.
SCANS: N Cumulative number of scan cycles the legacy polymarket_signals scanner has run.
LAST: HH:MM:SS UTC When the dashboard last successfully refreshed its data from /api/dashboard.
LATENCY: Nms Round-trip time on the last refresh call. Anything under ~100ms is healthy.
NODE: PM-US-EAST-01 Cosmetic — identifies which of the (currently single) backend nodes is serving you.
Clock Live UTC time.

2. Stats grid (the four cards near the top)

Card What it counts
Total Signals All-time count of rows in polymarket_signals (the legacy market-conviction scanner, not the new prophecy alerts).
24H Signals Same source, last 24 hours only.
High Conviction Subset of 24h signals with conviction_score >= 70.
Last Scan Time since the legacy scanner last ran. The legacy scanner is invoked via whale-alert-cron.sh.

Important distinction: these counters reflect the legacy market-centric scanner (rule-based "this market's volume spiked"). The newer prophecy whale-signals path (LLM-narrated Telegram alerts on individual whale trades) lives in a different table (prophecy.signals). Both coexist — the stats cards are about the older, more frequent flow.


3. The Plot — plot --signal-frequency --24h

A bar chart showing how many legacy signals fired in each hour of the last 24 hours.

This plot is not about prophecy alerts — it tracks the older market-volume signal pipeline. For prophecy whale-alert frequency, look at the Prophecy Whale Signals panel below.


4. Conviction signals panel — signals --conviction

A list of bar-rendered conviction scores for the most recent legacy signals. Each row shows:

Conviction score interpretation

Range Color Meaning
80–100 green-glow Strong signal — large volume spike + price move + high liquidity.
50–79 mint accent Moderate — one or two factors contributing.
0–49 grey Weak — listed for reference but probably not actionable.

The score is a rule-based composite: spike_ratio (recent volume vs baseline) + price_change_30d + market liquidity, capped at 100. See scripts/smart-whale-tracker.py:calculate_conviction_score().

Click a row → detail flyout shows the underlying market with full price history, signal history, and direct link to Polymarket.


5. Prophecy whale signals panel — prophecy --whale-signals --tail

This is the LLM-narrated alert feed. Every row corresponds to a Telegram alert that fired (or would have fired) for a $10k+ trade by a wallet with skill_multiplier >= 1.2 and n_resolved >= 5.

Each row layout:

HH:MM:SS  archetype     skill_multiplier  market question (truncated)        YES/NO + size
                                          ↳ LLM narrative (when available)
Column Meaning
time When the trade was observed (UTC).
archetype Wallet's behavioral cluster — see §13. Color-coded: green-glow for sharp tier, mint for market-maker tier, grey for mixed/unknown, red for high-variance-loser.
skill_multiplier Bayesian-shrunk skill score, 0.1–3.0. Glows green if ≥ 2.0. See §13.
market The market question. Hover (or click row) for full text.
YES/NO + size Direction of the bet + USD size. Green for YES, red for NO.
narrative The LLM-generated WHAT/WHO/WHY/CAVEAT explanation, when Anthropic API is configured. Hidden when bare-fallback.

Empty state ("NO ALERTS IN LAST 24H — gates: size≥$10k, skill≥1.2×") means no qualifying trades in the window. Not a bug if it shows for hours at a time — real whales trade rarely. See §16 for the four-counter diagnostic if it stays empty unexpectedly.


6. Whale Tracker — 🐋 whales --tracked

Half-width data table showing the top whales in whale_wallets (the legacy wallet-tracking layer that pre-existed the prophecy sidecar). Five columns:

Column Source
WALLET Short hex address (full on hover).
VOL Total USD volume across tracked trades.
TRD Number of trades observed.
Q Quality score (legacy heuristic).
ARCHETYPE Cluster label from the legacy KMeans clusterer (scripts/profile_whales.py) — not the new prophecy archetype. Truncated with ellipsis at half-width; hover for full string.

Click a row → detail flyout with the whale's recent trade history.

Heads-up: This panel uses the old whale_wallets / KMeans pipeline. The newer prophecy archetypes (with sharp / no_contrarian / scalper / etc. labels) appear in §8 (Top Sharps) and the Prophecy Live Trade Feed (§10). Both pipelines coexist — the legacy one is kept for continuity until the prophecy data fully matures.


7. Whale Feed — whales --feed --live

A live firehose of recent whale-tagged trades from the legacy pipeline. Each row shows the wallet, market slug, side, size — minimal context, high refresh rate. Use this when you want raw activity vs the curated-with-narrative Prophecy panel above.


8. Top Sharps Leaderboard — prophecy --top-sharps --n=10

The headline output of the prophecy clustering pipeline. Top 10 wallets by skill_multiplier, filtered to n_resolved >= 30 (Bayesian prior is fully washed out by then) and excluding insufficient_history/noise archetypes.

Columns:

Column Meaning
# Rank (1 = highest skill_multiplier).
WALLET Short hex (0xabc1…def4). Hover for full address.
ARCH Prophecy archetype — see §13.
SKILL skill_multiplier, 0.1–3.0 scale. Higher = sharper. Population mean ≈ 1.0 post-formula-fix.
BRIER brier_shrunk — Bayesian-shrunk Brier score. Lower is better. 0.05–0.10 = exceptional, 0.20–0.25 = average.
HIT hit_rate_shrunk — fraction of resolved trades on the winning side, shrunk toward 50%. 70%+ is strong.
N n_resolved — number of resolved trades the score is computed on. Higher = more reliable.

Click a row → Sharp Detail flyout opens with the full wallet card (12 metrics: archetype, cluster ID, skill, brier, hit rate, n_resolved, n_trades, median size, capital HHI, yes bias, total volume, last seen) and a list of up to 20 recent trades from the last 30 days.


9. Archetype Distribution — prophecy --archetype-dist

A horizontal-bar chart showing how many wallets fall into each prophecy archetype. Filtered to exclude insufficient_history and noise (otherwise those would dwarf the chart at ~95% of the population).

Each row:

archetype-name        ▓▓▓▓▓▓▓▓▓▓▓▓▓▓░░░░░     count • avg_skill

Bar widths are normalized to the largest visible cluster, not the population total. So sharp at n=2 isn't invisible next to no_contrarian at n=143 — both bars are readable even when cluster sizes vary 70×.

Color-coding by archetype family: - Green-glow: sharp / capitalized_sharp / no_contrarian / yes_specialist (the skilled tiers) - Mint accent: scalper / market_maker / concentrated_specialist (operational tiers) - Grey: mixed_0 / mixed_1 / mixed_2 / mixed_3 (cluster fell into the catch-all branch)

Click a row → Archetype Detail flyout shows group summary stats (n_wallets, avg skill/brier/hit/median size/total volume) and a sortable members table. Each member is itself clickable → drills into the Sharp Detail flyout for that wallet. Multi-level nav (archetype → members → individual → trades) all flows through one flyout, no nested modals.


10. Prophecy Live Trade Feed — prophecy --live-trades --skill≥1.5

Full-width feed of every observation from the last 6 hours where: - Trade size ≥ MIN_OBSERVATION_USD (currently $100) AND - Wallet's skill_multiplier ≥ 1.5

Distinct from the Prophecy Whale Signals panel above. That one is the strict alert tier ($10k+ AND skill ≥1.2 → fires Telegram). This one has the lower bar — surfaces sharp-wallet activity that didn't clear the alert threshold but is still meaningful (smaller positions, slightly less sharp wallets).

Same row layout as the alert panel: time / archetype / skill / market / YES-or-NO + size. No LLM narrative on this tier (the enrichment cost is reserved for actual alerts).

If you see the Whale Signals panel empty but the Live Trade Feed busy, it means sharp wallets are active but not at the $10k+ threshold — common during quiet days.


11. Markets Active — markets --active

Full-width table of currently-tracked markets from the legacy pipeline. Columns: SYM / MARKET / YES / NO / VOL / 24H. Click a row → market detail flyout with full price history and signal history.

This panel reflects the legacy market-conviction scanner's universe (~50 markets at any time). Polymarket's full active universe is much larger (~3000+) and lives in prophecy.markets.


12. Detail flyout (slides in from right when you click a row)

The flyout is shared across panels — same component, different content modes:

Mode Triggered by Shows
market Click on Conviction or Markets Active row Market overview, pricing, signal strength, signal history, + a BUY recommendation (see §20)
whale (legacy) Click on Whale Tracker row Recent trades for that wallet from whale_trades
sharp (new) Click on Top Sharps Leaderboard row OR archetype-detail member row Full wallet profile (12 fields) + last 20 observed trades over 30d
archetype (new) Click on Archetype Distribution row Group summary + members table; each member is itself drill-into-able
stats / signals / scans Click on the four stat cards at top Per-card historical breakdown

Close: [X] button (top-right of flyout) or Esc key.


13. Metrics reference (the numbers explained)

Per-wallet metrics (Top Sharps, Sharp Detail flyout, Live Trade Feed)

Metric Range Lower-better? Meaning
skill_multiplier 0.1 – 3.0 No (higher = better) Bayesian-shrunk skill, recentered to 1.0 = population neutral. 2.0+ = top decile, 0.5- = below average. Used as the alert gate.
brier_shrunk 0.0 – 1.0 Yes Mean squared error between wallet's entry probabilities and realized outcomes, shrunk toward population prior. 0.05-0.10 = exceptional, 0.20-0.25 = average, 0.30+ = poor.
hit_rate_shrunk 0.0 – 1.0 No Fraction of resolved trades won, shrunk toward 50%. 0.70+ is strong; raw 100% on tiny samples gets pulled down by the prior.
n_resolved 0 – ∞ No (higher = more reliable) Count of resolved trades the score is computed on. Below ~10, scores are noisy.
n_trades 0 – ∞ Count of all trades, including unresolved.
median_size_usd 0+ Typical position size for this wallet. Useful proxy for "how much capital does this wallet deploy."
p95_size_usd 0+ 95th-percentile position size — captures occasional big swings.
size_cv 0+ Coefficient of variation on position size (σ/μ). <0.3 = consistent sizer (often scripted/MM); >1.0 = highly variable.
capital_hhi 0.0 – 1.0 Herfindahl-Hirschman index on capital allocation across markets. 0.1 = highly diversified; 0.7+ = concentrated specialist.
yes_bias 0.0 – 1.0 Fraction of trades on the YES side. 0.5 = balanced; <0.3 = NO-leaning; >0.7 = YES-leaning.
volume_total_usd 0+ Cumulative USD volume across all observed trades.
active_hour_mean 0 – 23 Mean UTC hour-of-day of trade entries. Bimodal distributions across the population identify timezone clusters.
hour_entropy 0 – ~4.6 Shannon entropy (base 2) of hour-of-day distribution. Low = clock-bound (3am traders, 9-5 traders); high = around-the-clock automated systems.

Per-trade metrics (alert payloads, trade feed rows)

Metric Meaning
entry_prob Implied probability the wallet's bet wins, per the market price at trade time. For a YES bet at price $0.30, entry_prob = 0.30.
size_usd / collateral_usd USD value of the position.
outcome_index 0 = YES, 1 = NO (Polymarket convention).
realized 1 if the wallet's chosen side won, 0 if lost, NULL if market hasn't resolved yet. Back-filled by the nightly job once resolution lands.
pnl_usd Realized USD P/L on the trade. Computed as (realized - entry_prob) × tokens_received.
conviction For prophecy alerts: skill_multiplier × collateral_usd — a combined "this is a big bet by a sharp wallet" score. Used for alert ranking but not gating.

Archetype labels (current vocabulary)

Archetype What centroids look like Interpretation
sharp Low brier (well below pop mean), moderate volume, varied features Skilled, well-calibrated trader.
capitalized_sharp Low brier AND high median_size (>5× population) Sharp with serious capital — whale in the classic sense.
no_contrarian yes_bias < 0.3, hit_rate_shrunk > 0.55 Profits by betting NO consistently — contrarian by structure.
yes_specialist yes_bias > 0.7, hit_rate_shrunk > 0.55 Profits by betting YES consistently.
scalper size_cv < 0.3, n_trades > 10, yes_bias > 0.6 Scripted/algorithmic, very consistent sizing, lots of small bets.
market_maker size_cv < 0.3, n_trades > 10, neutral bias Provides liquidity; tight sizing both sides.
concentrated_specialist capital_hhi > 0.6, n_trades < 20 Bets big on a few specific markets they have a view on.
high_variance_loser size_cv > 0.8, sharpe_like < -0.5 Volatile sizing, consistently losing — the inverse of sharp.
mixed_N Cluster centroid didn't fit any decision-tree branch HDBSCAN found a structure but the heuristic namer hasn't been tuned for it. The cluster is real; the label is "we know they're distinct, just don't have a name."
insufficient_history n_resolved < 3 (excluded from clustering) Wallet has too few resolved trades to score reliably. Hidden from most dashboard panels by API filter.
noise HDBSCAN labeled them outliers (-1) Eligible wallets that don't fit any cluster. Often interesting outliers worth investigating individually.

14. Ticker (scrolling)

Bottom-of-page horizontal scroll showing major-market mini-tickers (symbol, current price, change). Cosmetic; no actionable info beyond visual at-a-glance health.


Field Meaning
MODEL: <name> acc=N% prec=N% Stats from the legacy ML training pipeline (scripts/train_model.py).
Signal hit rate: N% Fraction of historical legacy signals that resolved in their predicted direction.

16. The alert pipeline (so you can predict what shows up where)

Every trade observed by the watcher passes through two gates:

Trade observed
   │
   ├─ Observation gate: size ≥ $100 AND wallet is profiled
   │     │
   │     └─ Yes → row written to prophecy.observations
   │              (feeds the Live Trade Feed panel — §10)
   │
   └─ Alert gate: size ≥ $10k AND skill_multiplier ≥ 1.2 AND n_resolved ≥ 5
         │
         └─ Yes → LLM narrates → Telegram push → row written to prophecy.signals
                  (feeds the Prophecy Whale Signals panel — §5)

If the Whale Signals panel is empty but the Live Trade Feed is active, the cause is almost always: sharp wallets are trading, but not at the configured size threshold. Lower the threshold in your local configuration to widen the alert volume.

If alerts go silent for an extended period, check: - The watcher service is running. - Recent activity is showing up in the Live Trade Feed (if not, it's an upstream data issue, not a gate issue). - Gate thresholds in your configuration haven't drifted too strict for current market activity.


17. Refresh cadence

Panel Polls every
Status bar / Stats grid / legacy panels 60s
Prophecy Whale Signals 30s
Top Sharps / Archetype Dist / Live Trade Feed 60s
Sharp / Archetype detail flyouts On-click (one-shot)
Today's Recommendations board On page load (reads the latest nightly run)
Market-flyout BUY recommendation On-click (1h cache; force button recomputes)
Nightly recommender (writes the board) Once daily at 03:00, chained after the nightly job (cron → run-nightly.sh)

If the dashboard goes stale (LAST timestamp drifts more than ~2 min), refresh the page or check that the Flask app (polymarket-dashboard.service) is running.


18. Quick interpretation cheat-sheet

If you see... It usually means...
Top Sharps row with skill ≈ 3.0, n_resolved 30+, brier < 0.10 Genuinely top-tier wallet, very rare. Worth following.
Top Sharps row with skill ≈ 3.0, n_resolved < 10 Skill score is noise — Bayesian prior hasn't washed out yet. Wait.
Whale Signals panel empty for hours Real whales just aren't trading — common during quiet markets. Live Trade Feed should still have activity.
Live Trade Feed empty for hours Watcher is down OR sharp-wallet activity has genuinely stopped. Check systemctl is-active polymarket-whale-watcher.
Archetype Distribution shows only mixed_N labels Clustering found structure but the heuristic namer needs retuning. Functionally OK; cosmetic.
All visible Top Sharps have similar archetype Either the heuristic namer collapses multiple clusters to one label, or the population is genuinely homogeneous.
MODEL: Loading... in footer Legacy ML model isn't trained or load failed. Out of scope for the prophecy pipeline.
Today's Recommendations board empty Last night's nightly run didn't complete, so there's no fresh board for today — it repopulates automatically after the next 03:00 run.
A board row shows +N related The recommender collapsed N near-duplicate same-bet markets into this one; hover the badge to see them.
BUY recommendation rationale says "Mechanical only" The LLM was unavailable (no key / SDK / API error), so the verdict fell back to the deterministic mechanical score. Still usable, just less nuanced.

19. Today's Recommendations — the nightly buy board

A full-width panel listing the system's actionable BUY calls for the day. It is written once per night by the recommender job (prophecy.jobs.recommender), which runs at 03:00 right after the nightly feature/skill refresh.

How the board is built each night:

  1. Candidates — every open market with tracked-whale activity in the last 24h (~100/night).
  2. Cheap ranking — each candidate gets a free flow-conviction score, abs(flow_signal) × log1p(flow_volume_weighted): it prioritizes markets where skill-weighted whale capital is taking a strong directional stance, not markets merely sitting at an extreme price.
  3. Dedup — candidates are clustered (one LLM call) so near-duplicate markets that are the same underlying bet collapse to the single highest-priority one. The clusterer is conservative: different outcomes of one event (e.g. "France wins the WC" vs "Mexico wins the WC") stay separate, and a different deadline or threshold counts as a different bet. Collapsed siblings appear as a +N related badge (hover for the list).
  4. Narration — only the top 25 de-duplicated markets get the full LLM verdict (cost control, ~$15/month).

What the board shows: only BUY YES / BUY NO rows with confidence ≥ RECOMMENDER_MIN_CONFIDENCE (default 60), ordered by confidence. HOLDs are filtered out. Each row: market question, verdict, confidence, YES price at the time of the call, and the rationale.

Config knobs (env / config.env): RECOMMENDER_TOP_N (default 25), RECOMMENDER_MIN_CONFIDENCE (default 60).

Empty board? It means last night's run didn't land (the board only shows today's rows). See the cheat-sheet row above.


20. The BUY recommendation (in the market flyout)

Click any market row → the flyout's market mode includes a BUY YES / BUY NO / HOLD recommendation. This is the same engine the nightly board uses, computed on demand for the one market you opened.


21. Tracker Self-Check — "how good are the recommendations?"

A meta-panel that grades the recommender against reality. Four quadrants:

Quadrant Question it answers
Resolution accuracy When markets the engine called eventually resolve, how often was the BUY side right?
Price drift Since each call, has the market moved in the recommended direction (early signal of being right/wrong)?
LLM vs mechanical How often does the LLM verdict diverge from the mechanical baseline, and which does better?
Consensus profile The spread of verdicts (BUY YES / BUY NO / HOLD) the engine produces — is it just rubber-stamping, or taking real stances?

This panel fills in over time — it needs recommendations to age and markets to resolve before the accuracy numbers mean anything. Expect it to be sparse at first and grow as the nightly board accumulates history.