Current definition latency-v1. Charts stamped with it were computed by src/resolution/latency.py, and every value plotted for a past date could have been computed on that date.
compute(df, **params) -> pd.Series # hours, indexed venue:market_id
Slow settlement is the quiet failure mode of a prediction market. It never shows up in a dispute count: nobody contests the outcome, the money simply sits. Zone 11 measures dispute frequency everywhere else; this is the other half, and it needs no credential at all — both venues ship the timestamps for free.
closed != settled ACTUALLY COSTS YOUKalshi's expiration_time is the SCHEDULED expiration and settlement_ts is when the contract actually settled. Anchoring on the wrong one does not produce a slightly-off number, it produces a nonsense one. Measured on 13,237 finalized Kalshi markets:
anchor = close_time median +2.53h 0 negative anchor = expected_expiration_time median +0.03h 5,599 negative anchor = expiration_time median -167.97h 13,089 negative
The third row says Kalshi settles a week before its contracts expire. It does not. schema.py carries settlement_time so this stays fixed in one place.
The anchors mean different things and the difference is not cosmetic:
Kalshi close_time is when TRADING STOPS. It is scheduled, and a
contract cannot settle before it.
Polymarket endDate is a DEADLINE — "by June 30". A market resolves the
moment the event happens, which is often long before it.28.8% of Polymarket markets (22,897 of 79,539) close BEFORE their stated end date, a median of 162 hours early. That is the venue working correctly, not negative latency. Pooling those into a mean drags Polymarket's average to −142 hours and would let us publish "Polymarket settles six days before the deadline" as if it were an operational fact about payout speed.
So compute reports signed hours and nothing else, and summary() splits the two populations rather than averaging across them:
early resolved before its stated deadline (Polymarket, mostly)
settled resolved at or after the anchor — the comparable population
censored trading stopped, never settled. Excluded from every quantile,
counted in `censored_n`, because dropping it silently is how a
venue's slowest contracts disappear from its latency figure.On the comparable population the venues are nearly identical at the median — Kalshi 2.53h, Polymarket 2.71h — and diverge hard in the tail: p99 of 85h against 679h. The tail is the finding. A median is a claim about a normal day; the 99th percentile is a claim about the day it matters.
1,886 Kalshi markets are closed with no settlement timestamp — 12.5% of everything past trading close, median age 188 days. That reads like a settlement backlog and it is not: 1,859 of the 1,886 have zero volume. They are untraded strike ladders (500 hourly EURUSD, 500 USDJPY, 400 index strikes) that nobody has any reason to settle. Only 27 censored markets carry volume at all, and their median age is 36 days. Report the count, then report what it is.
Newest first. Each entry says what changed and whether values that had already been published moved with it, followed by the sentence from the module that decided the verdict.
close_time -> settlement_time, signed, three populations, censoring counted not dropped.
The first version of this metric. There is no earlier definition to restate.
None on the site today. The definition is versioned and exported, and no chart currently carries its stamp — either a chart is missing from the export or the module is no longer drawn. The catalogue reports the gap rather than hiding the metric, because a definition nobody can see the output of is exactly the thing a reader should be told about.