diff --git a/benchmarks/pm-resolution-delay.yml b/benchmarks/pm-resolution-delay.yml index aad77768..2ee3b434 100644 --- a/benchmarks/pm-resolution-delay.yml +++ b/benchmarks/pm-resolution-delay.yml @@ -5,7 +5,7 @@ number: "039" title: Resolution delay, Polymarket vs Kalshi seo_title: "Prediction market resolution delay live 2026" seo_description: "Polymarket and Kalshi resolution time measured live: median delay from close to payout, broken down by category. Polymarket anchored on UMA ProposePrice, Kalshi on settlement_ts from the public API." -subtitle: How long from market close to final settlement — Polymarket measured onchain via UMA ProposePrice→QuestionResolved, Kalshi via settlement_ts minus close_time from the public REST API. Auto-generated multivariate parlays excluded from Kalshi data. +subtitle: "How long from market close to final settlement: Polymarket measured onchain via UMA ProposePrice to QuestionResolved, Kalshi via settlement_ts minus close_time from the public REST API. Auto-generated multivariate parlays excluded from Kalshi data." category: Trading status: live @@ -43,7 +43,7 @@ methodology: - "Polymarket join: questionID = keccak256 of the proposal ancillary data, verified against QuestionInitialized events." - "Kalshi anchor: settlement_ts from the public markets API (exact timestamp, no polling error). Delay = settlement_ts - close_time. close_time is the scheduled market close, not the real-world event end." - "Kalshi scope: traditional prediction markets only. Exotics (auto-generated multivariate parlays) are excluded by design: they auto-settle so fast they never appear in status=closed, so the watchlist only contains real market questions. Categories from /events/{event_ticker} (lazy cache): Sports→sports, Politics/Elections→politics, Crypto/Financials→crypto, everything else→other." - - "Anchor asymmetry: Polymarket's 2h UMA challenge window is protocol-enforced — no market can resolve in under 2h on the clean path. Kalshi has no such floor; traditional sports and politics markets settle in minutes to hours after close_time. The difference in distributions reflects both operational speed and architecture." + - "Anchor asymmetry: Polymarket's 2h UMA challenge window is protocol-enforced: no market can resolve in under 2h on the clean path. Kalshi has no such floor; traditional sports and politics markets settle in minutes to hours after close_time. The difference in distributions reflects both operational speed and architecture." - "Categories: sports, politics, crypto, other, consistent across venues. Per-category rows are the honest unit of comparison because market types run different resolution windows." - "Disputes (Polymarket only): a DisputePrice before resolution marks the market disputed. Disputed delays land in the disputed series and are excluded from the main category rows." - "Pending backlog (Polymarket only): markets past their scheduled endDate with no onchain resolution, polled from Gamma every cycle." @@ -51,7 +51,7 @@ methodology: findings: - "Polymarket across all markets: median onchain resolution delay {{p50:polymarket-all}} from first proposal to resolution, p99 at {{p99:polymarket-all}}. The within 2 hours share is in the table above, measured, and does not match the 93 percent figure that circulates without a methodology." - - "Kalshi across all markets (excluding auto-generated parlays): median resolution delay {{p50:kalshi-all}} from scheduled close_time to settlement_ts. Kalshi resolves internally — no onchain oracle, no mandatory challenge window. The difference vs Polymarket's median reflects both operational speed and Polymarket's protocol-enforced 2h minimum." + - "Kalshi across all markets (excluding auto-generated parlays): median resolution delay {{p50:kalshi-all}} from scheduled close_time to settlement_ts. Kalshi resolves internally: no onchain oracle, no mandatory challenge window. The difference vs Polymarket's median reflects both operational speed and Polymarket's protocol-enforced 2h minimum." - "Categories are not comparable on a single median: sports, crypto and politics markets run different resolution processes on each venue." - "Disputes (Polymarket only) are rare but expensive: disputed markets carry materially longer delays than the clean path." diff --git a/benchmarks/pm-ws-latency.yml b/benchmarks/pm-ws-latency.yml index 2b39c732..f66c26de 100644 --- a/benchmarks/pm-ws-latency.yml +++ b/benchmarks/pm-ws-latency.yml @@ -52,7 +52,7 @@ methodology: findings: - "Polymarket's CLOB WebSocket connects and delivers the first orderbook snapshot in {{p50:polymarket}} p50 (24h, all regions). This is the startup cost a new subscriber pays to go from a fresh dial to live market data." - - "Kalshi's WebSocket ticker channel is delta-only: it does not send a market snapshot on subscription. The 'connect-to-snapshot' timing for Kalshi measures the time from dial to the first incremental price update, not to a full snapshot. On an active market this is typically 10–60s and reflects market activity level as much as connection speed. The inter-arrival and disconnect metrics below are more representative of the real-time feed health." + - "Kalshi's WebSocket ticker channel is delta-only: it does not send a market snapshot on subscription. The 'connect-to-snapshot' timing for Kalshi measures the time from dial to the first incremental price update, not to a full snapshot. On an active market this is typically 10 to 60s and reflects market activity level as much as connection speed. The inter-arrival and disconnect metrics below are more representative of the real-time feed health." - "Inter-arrival time on the feed (the steady-state update rate on an active market) is published as a metric panel below for both venues. The faster the inter-arrival, the more granular the real-time picture a subscriber gets." disclaimer: "Connect-to-snapshot includes Cloudflare edge latency and routing from each probe region. Numbers vary with network conditions and market activity. This bench measures observed end-to-end startup time, not venue-side processing time alone." diff --git a/src/lib/pm-stats.ts b/src/lib/pm-stats.ts index 2815465f..f591611c 100644 --- a/src/lib/pm-stats.ts +++ b/src/lib/pm-stats.ts @@ -103,7 +103,7 @@ function promUrl(): string | null { * worker after every tierA sweep. Bump the suffix if the summary shape * changes so a stale-shape blob can never deserialize into a misaligned * payload. The cohort-snapshot module appends its own `:v1`. */ -export const PM_HUB_KEY = "pm-hub"; +export const PM_HUB_KEY = "pm-hub-v2"; /** * Fetch the venue + data feed cohort in one Promise.all fan out. Returns