Every open bracket, every hour, with no opinion.
The ladder logger (agents/kalshi_ladder_logger.py) has no forecast and no model. Once an hour it walks every daily-high and daily-low temperature ladder Kalshi lists, about forty ladders across twenty cities, and writes one row per open bracket: the best bid and ask in cents, the last trade, volume and open interest, and the contracts resting at the best bid and ask, all from Kalshi's own public market payload at the moment of the read. For brackets priced between 60c and 95c it also pulls the order book, so the size within two cents of the ask is known too.
Each row is tagged with the regime it was read in, because the same price means different things at different times:
About five thousand rows a day. The row's shape is documented at the top of the logger, and DEPLOY.md lists everything that has to run.
When the day has already decided.
Each ladder settles on one airport station's official daily maximum or minimum. The robot reads that station's hourly observations through the day and keeps the running extreme two ways: the single most extreme reading, and the extreme confirmed by a second reading, which is what the call uses. A bracket is dead once the confirmed running high has cleared its top by a full degree (or, for a low ladder, the confirmed running low has cleared its bottom). "Cleared by a full degree" is the margin that keeps the settlement report's rounding and the occasional revised observation from turning a dead call into a live one.
The call is written into the row with the readings behind it, so it can be audited later: the raw and the confirmed extreme, how many readings, how far the bracket was cleared by, and the time of the latest reading. And it is scored: a bracket called dead that settles Yes anyway is the observation feed's error, counted on the scorecard and on the front page as "the observation's misses". The count is small because the margin is generous; it is never assumed to be zero.
03 · The favorite rule and the feeBuying the likely bracket at the price that was really there.
The favorite-longshot bias is the claim that likely outcomes are underpriced. The desk tests it with one fixed rule and no discretion: the first time a bracket's midpoint sits between 65c and 90c in a regime, buy Yes at the ask that was resting at that read, pay Kalshi's taker fee, and hold to settlement. The entry is scored per contract: a winner earns one dollar less the ask and the fee, a loser loses the ask and the fee. The fee is Kalshi's schedule, ceil(7 · p · (1 − p)) cents at price p.
Capacity matters as much as sign. Every entry records the contracts that were resting at that ask, because a rule that makes six cents a contract on seventeen contracts a day is worth a dollar. The scorecard shows the median size and the dollars a week the rule could have bought at the ask; the offline scripts (agents/exp_favorites.py) add day-clustered bootstrap intervals, which the page does not compute and which decide nothing until there are weeks of settled entries.
Who collects the cent on a dead contract.
On a dead bracket the only trade left is a Yes seller taking a cent from a Yes bidder, or a No buyer at 99c, which is the same trade seen from the other side. The robot pulls the order book of every dead bracket on every pass and records the queue: the Yes asks resting at one cent, at or under two cents, at or under five, and in total; and the Yes bids at three cents or better, which are stale bids somebody could still sell into. The median queue at one cent is the number on the front page, and the piece Who collects the cent on a dead contract reads the exchange's own trade tape from the moment a bracket dies to the close, with agents/backfill_tape.py.
Computed in the database, never typed in.
Three SQL files in the repository build everything the public pages show as a live number: research_views.sql (the favorite rule's entries and the logger's health), scorecard_views.sql (the weekly scorecard) and board_views.sql (the live board and the site's stats). They are materialized views over the logger's rows and the outcomes table, readable with the public key, and nothing else in the database is.
Postgres refreshes them every fifteen minutes, and the logger asks for a refresh after every pass, so a number on the site is never more than a pass behind. The board shows the latest read of every bracket in the last six hours; if the robot stops, the board empties and the front page's chip says how long it has been quiet, from the heartbeat row the logger writes after every pass.
Raw reads are kept for twenty-eight days; a month of them is about what the free database holds. Before a row ages out, everything the site scores from it has been copied into permanent tables (retention.sql): the favorite rule's entries with their results, one row per day of what the robot read, and each week of the scorecard, frozen once its rows are gone. The scorecard, the receipts and the front page's all-time counts read those tables, so the record outlives the rows it came from.
Kalshi's own result settles every market, recorded once per ticker and day. The scorecard's weeks are ISO weeks of the market date. Only settled entries carry a P&L; open ones are counted, not scored.
A probability, a rule, a date. Then the result.
A call is a dated, falsifiable statement about what the data will show, with our probability stated before the fact and the exact command that decides it. On the grading date the command is run on a fresh export of the database, the result is pasted into the call, and its tag flips to hit or miss. A call is never edited after it is posted; if a rule turns out to be ambiguous it is graded against us. The score is the Brier score over graded calls, the mean of (probability − outcome)², where 0 is perfect and 0.25 is a coin flip. The calls page keeps them all, misses included.
07 · The whalesDecoded from their own fills, not from a leaderboard.
A Polymarket wallet's fills are public. The desk pulls every one (agents/wallet_trades.py), resolves every market it traded against the venue's own result, and scores each fill: what was paid, what it settled at, how long it was held. That is enough to say what the strategy actually is, where it wins and where it loses, without reading a single post about it. The first piece, The boring strategy that printed, decoded, is 9,030 fills read this way; its hold times, not its entry prices, are what identify it as an observation bot. The same method applies to any public wallet, and the desk's calls include one about that wallet's next month.
The whale finder applies it to every wallet at once: each week it lists every temperature event on Polymarket over the last two weeks, pulls every taker fill of every market, groups them by wallet, scores each with the same first-in first-out rule and labels it from its fills alone (an observation bot buys on the market's day and sells within the hour; a tail seller is long No on the tails and holds; the thresholds are printed on the page). For the wallets that rank it runs the paper mirror: a copier who saw each fill on the public feed, waited sixty seconds or five minutes, and paid the next ask that printed on that outcome, holding to resolution or copying the exit. No order is placed. The mirror is the desk's answer to "should I follow this wallet": the cost of arriving second, in cents a share, on the wallet's own buys. One wallet contributes too few buys to decide anything, so the figures that count are pooled by profile, every wallet of a kind added together.
08 · The desk that started thisA forecast desk, scored against the price, closed.
From July 24 to September 8, 2026, the site was a forecast desk: NWS guidance fitted into a probability for every Kalshi temperature contract, compared with the price, published when they disagreed, and scored after settlement head to head with the price on the same markets. Seven weeks and 11,427 settled markets later the price had won on every cut, and a closing research note tested every NWS resource the desk had not used; none beat the price either. The desk was closed on September 17, 2026, and its record is on the receipts page. The logger that had been reading the ladders beside it, with no model, is the robot this site runs on now.
09 · What this is notDescriptive, never prescriptive.
The Gap Desk is an information publication. It measures prediction markets and publishes what it finds with the sources and the timestamps, and most of what it finds is that an edge belongs to someone else: a market maker's queue, a bot's observation feed, a spread that eats the signal. It does not recommend trades, size positions, manage risk, execute orders or hold funds, and it never tells you what to bet. What you do with a measurement is entirely your call.
The fine print, in full light.
A desk that publishes its receipts should not hide its disclaimers. This is the complete legal posture, in plain language; the full versions are the terms and the privacy policy.
Everything The Gap Desk publishes, this site, the pieces, the board, the scorecard, the calls and the emails, is information and education only. Nothing here is investment, financial, trading, legal or tax advice, and nothing is a recommendation or solicitation to buy or sell any contract. The desk is not a registered investment adviser, broker-dealer, commodity trading advisor or fiduciary with any regulator, anywhere.
Event contracts are all-or-nothing: a position can, and regularly does, go to zero. If you choose to trade anywhere, on anything, only ever risk money you can bear to lose entirely.
A measurement is built from public data, and public data can be wrong, late or incomplete. The desk warrants nothing about accuracy, completeness or availability. The record is history, and history is not a promise: past results do not guarantee future results.
Prediction-market trading is regulated and may be unavailable or restricted where you live. It is your responsibility to know and follow the rules that apply to you; if you trade on any venue, that venue's own terms and eligibility rules govern, not anything written here.
The Gap Desk is independent. It is not affiliated with, endorsed by or sponsored by Kalshi, Polymarket, NOAA or the National Weather Service. Their names appear only to identify the markets and the public data being measured.
The desk holds no trading account, never touches your funds and never executes an order. It shows you a measurement and its receipts. Every decision you make, including the decision to do nothing, is yours alone.