BUILD IN PUBLIC · DDN SI LAB CHANGELOG
Watch DDN SI learn, with receipts.
Every model change, experiment and learning run, dated and in plain English. Experiments are written down
before they start, with the rule that ends them. Failed experiments and failed updates stay on this page.
The numbers that decide whether any of it worked live on the edge scoreboard.
Updated 2026-11-01 23:29 UTC.
Pre-registered experiments
EXP-2026-01
Maker mode: do resting bids below fair beat the Kalshi close?
running
Registered 2026-10-08 · lanes MLB:spread_maker_fav, NHL:spread_maker
- Hypothesis
- Our model is about equal to the market, and taking the ask costs about 2 points per bet. A post-only buy resting at or below the sharp consensus fair price saves that cost; if fills are not adversely selected, filled orders should beat the Kalshi closing mid on average.
- Metric
- Mean closing-line value of FILLED maker orders, in probability points, measured as Kalshi closing mid minus fill price on the same contract, with a 95% CI; secondary beat rate vs the close and adverse selection at +5 min, +30 min and the close.
- Sample size
- 30 filled orders per lane before any verdict (50 for MLB:spread_maker_fav, its
- Stop rule
- Harm stop: any lane at 30+ fills with mean CLV <= 0 and 95% CI-high below +0.1pp, or beat rate <= 50%, is demoted to shadow automatically (MLB:spread_maker_fav at 50+ fills also stops if beat <= 55% or mean <= +0.15pp). Hard caps throughout: $20 per day, 10 open orders, 3% of bankroll per order. Success: promotion is recommended only at 30+ fills with beat > 55% and CI-low > 0 (run line: 50+ fills, CI-low > +0.15pp, ROI >= 0); promotion is an owner decision, never automatic.
- Result
- Not concluded yet. The result is published here either way.
Notes, known biases
Prior evidence. A fill simulation on hourly Kalshi candles (June to October
2026) was adverse under the two strict fill assumptions (closing-line value -0.7
to -1.6pp, beat 19-30%) and positive only under the most optimistic one (run line
+1.27pp). Candles cannot show queue position, so live fills at 1-3 contracts are
the measurement.
Biases we know about. Fills arrive when the book moves through our price,
which is exactly the adverse case; that is why adverse selection is measured at
three horizons. P&L over this sample size is mostly variance: the verdict uses
closing-line value, not profit.
What we will not conclude. Nothing about taker edge, other sports or larger
size. A demoted lane stays off until the owner restarts its measurement.
Evidence →
Changelog
Model changes, fixes, analyses and lane promotions or demotions, newest first. Each one links to the change itself.
2026-10-09
Model change
Maker mode: stop paying the spread, start earning it
Since taking the ask costs about 2 points, two lanes now rest small post-only buy orders below fair value instead (MLB run line at 3 contracts, NHL puck line at 2) and wait to be filled. Every fill is scored for adverse selection 5 and 30 minutes later and at the close. After 30 fills, a lane drops to shadow automatically if its fills do not beat the close.
Details
- Rule: bid = the lower of (fair - buffer) and (best bid + 1 cent), always
below the ask; orders are post-only so they can never cross the spread, and are
cancelled 10 minutes before the start.
- Lanes:
MLB:spread_maker_fav (live, 3 contracts), NHL:spread_maker
(live, 2 contracts), MLB:moneyline_maker (shadow: the simulation showed
adverse fills), NHL:moneyline_maker (shadow only: not a canon lane).
- Honest prior: a fill simulation on hourly candles was adverse under the two
strict fill assumptions (closing-line value -0.7 to -1.6pp) and positive only
under the most optimistic one. The truth is in between, which is why this runs
live at 1-3 contracts with caps of $20 a day and 10 open orders.
- First night (Oct 8): 10 resting NHL puck-line bids posted, all below fair.
- Oct 9 (#334): when the owner tightened the NHL buffer to 0.5pp, resting
quotes did not move because repricing only reacted to fair-value moves. A
buffer change now requotes resting orders.
- The pre-registered experiment, with its stop rule, is on this page.
Evidence (#333, #334) →
2026-10-08
Fix
Two pricing bugs fixed after a zero-bet day
On Oct 7 the bot placed no bets. The model's per-pick probabilities were being written to a copy that was never saved, and spread and total picks could fall back to a generic confidence number that overstated their chance of covering. Both are fixed; spreads and totals now need a market-specific probability or they are not bet.
Details
What broke. 413 execution attempts were rejected because the pick had no stored probability
(probability_snapshot_missing), and a segment gate pinned since May could never
clear, so the one pick that survived was sized to zero.
What we found next. A backfill dry run showed NHL -1.5 puck-line picks
falling back to a generic ~53% confidence while their real cover rate is about
35-40%. That is fake edge: the bot would have "seen" value that was not there.
What changed. Picked-side probabilities are now persisted; the stale pins no
longer block; and execution refuses a spread or total pick that has no
market-specific probability (#326). Fewer bets is the expected result.
Evidence (#325, #326) →
2026-10-08
Experiment
Price-lag lane backtested negative, shipped in shadow only
Buying Kalshi when it looks cheap against the sharp market consensus lost money at every trigger margin from 1 to 5 points (291 bets at the default 2.5pp margin, ROI -7.4%, beat the close 44%). The lane runs in shadow with no money so it can prove itself live or stay off.
Details
| Margin |
Bets |
Beat the close [95% CI] |
ROI [95% CI] |
| 1.0pp |
483 |
43% [39, 48] |
-0.9% [-10.4, +8.6] |
| 2.5pp |
291 |
44% [38, 50] |
-7.4% [-19.7, +5.0] |
| 5.0pp |
143 |
48% [40, 56] |
-6.5% [-24.3, +11.2] |
Every trigger was MLB; NHL and NFL never triggered because Kalshi sits within the
fee of the consensus there. 96% of triggers fired 12-25 hours before the game,
and in those disagreements Kalshi turned out to be the side that was right. The
lane's live switch stays off; if it is ever turned on it demotes itself when the
last 30 fired candidates beat the close less than 45% of the time.
Evidence (#331) →
2026-10-08
Analysis
Edge mining: no lane beats the market at taker prices
An out-of-sample study of 820 clean picks and 134,308 hourly Kalshi quotes found no slice that clears our bet-now bar when we pay the ask. Our model is roughly the market; paying the spread plus fee costs about 2 points per bet. One lane (MLB -1.5 run-line picks) earned a maker-only probation.
Details
- Method: time-ordered 70/30 split, 2,768 segment tests, every rule judged on
the held-out 30% only.
- Bet now: none. The model's small early-underdog drift disappears at the
Kalshi ask (-0.10pp closing-line value against the Kalshi close).
- Probation: MLB -1.5 run-line picks beat the Kalshi close 70% of the time
against a 55% market baseline (ROI +3.0%), so they go maker-only at 1 contract
with written kill and promote rules.
- Dead: every claimed-edge, star-tier and confidence-tier slice, and all 27
stored-odds "winners" (ROI +25% to +62% on paper) that showed no clean
out-of-sample closing-line value.
- Realized bets: 167 clean bets made +15.0% ROI, but with -0.19pp average
closing-line value and a 49.1% beat rate. That profit is variance, not edge.
Evidence (#332) →
Learning runs (last 30 days)
Every time a learner runs it writes a receipt: what it learned from, what changed, and whether the change was verified. Runs that changed nothing are counted but not listed one by one.
2869 runs · 3 failed or rolled back · newest receipt 14 min ago (2026-11-01 23:15 UTC)
| Learner | Runs | Changed | No change | Failed | Results learned from | Last run (UTC) |
| Bet sizing fraction | 18 | 1 | 17 | 0 | 67 | 2026-10-31 20:33 |
| Closing-line edge decay | 17 | 17 | 0 | 0 | 17 | 2026-10-29 03:45 |
| Closing-line predictor | 4 | 1 | 3 | 0 | 31 | 2026-10-27 08:50 |
| Daily learning loop | 7 | 7 | 0 | 0 | 0 | 2026-10-26 20:00 |
| Edge rule miner | 670 | 225 | 445 | 0 | 7499 | 2026-11-01 22:45 |
| Fast learning loop | 41 | 40 | 1 | 0 | 0 | 2026-11-01 17:00 |
| Model signal weights | 20 | 0 | 17 | 3 | 17 | 2026-10-29 03:45 |
| Overconfidence haircut | 4 | 4 | 0 | 0 | 31 | 2026-10-27 08:50 |
| Per-sport calibration | 17 | 17 | 0 | 0 | 17 | 2026-10-29 03:45 |
| Segment registry | 672 | 298 | 374 | 0 | 7503 | 2026-11-01 23:15 |
| Signal blend weights | 4 | 4 | 0 | 0 | 31 | 2026-10-27 08:50 |
| Situational factors | 27 | 27 | 0 | 0 | 7457 | 2026-11-01 14:00 |
| Sport allocation | 17 | 1 | 16 | 0 | 17 | 2026-10-29 03:45 |
| Team strength ratings | 673 | 257 | 416 | 0 | 985 | 2026-11-01 23:00 |
| Variable importance | 671 | 342 | 329 | 0 | 7499 | 2026-11-01 22:30 |
| Walk-forward validation | 4 | 4 | 0 | 0 | 1200 | 2026-11-01 12:00 |
| Weekly learning loop | 3 | 3 | 0 | 0 | 0 | 2026-11-01 19:00 |
Recent changes
- Updated 2026-11-01 23:00 Team strength ratings: learned from 2 new results; state updated; games processed 2.
- Updated 2026-11-01 22:30 Variable importance: learned from 6 new results; 1 setting changed.
- Updated 2026-11-01 22:15 Segment registry: learned from 6 new results; 1 setting changed.
- Updated 2026-11-01 22:00 Team strength ratings: learned from 9 new results; state updated; games processed 9.
- Updated 2026-11-01 21:30 Variable importance: learned from 7 new results; 1 setting changed.
- Updated 2026-11-01 21:00 Team strength ratings: learned from 2 new results; state updated; games processed 2.
- Updated 2026-11-01 20:45 Edge rule miner: learned from 12 new results; 2 settings changed (edge rules rows 782 to 781).
- Updated 2026-11-01 20:30 Variable importance: learned from 12 new results; 1 setting changed.
- Updated 2026-11-01 20:15 Segment registry: learned from 12 new results; 1 setting changed.
- Updated 2026-11-01 20:00 Team strength ratings: learned from 1 new result; state updated; games processed 1.
- Updated 2026-11-01 19:45 Edge rule miner: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 19:30 Variable importance: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 19:15 Segment registry: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 19:00 Team strength ratings: learned from 6 new results; state updated; games processed 6.
- Updated 2026-11-01 19:00 Weekly learning loop: learned from 0 new results; 2 settings changed (monthly learning summary rows 24 to 38).
- Updated 2026-11-01 18:45 Edge rule miner: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 18:30 Variable importance: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 18:15 Segment registry: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 18:00 Team strength ratings: learned from 1 new result; state updated; games processed 1.
- Updated 2026-11-01 17:30 Variable importance: learned from 7 new results; 1 setting changed.
- Updated 2026-11-01 17:15 Segment registry: learned from 7 new results; 2 settings changed (segment status rows 380 to 381).
- Updated 2026-11-01 17:00 Team strength ratings: learned from 1 new result; state updated; games processed 1.
- Updated 2026-11-01 17:00 Fast learning loop: learned from 0 new results; 2 settings changed (daily learning model rows 39 to 40).
- Updated 2026-11-01 16:45 Edge rule miner: learned from 3 new results; 2 settings changed (edge rules rows 780 to 782).
- Updated 2026-11-01 16:30 Variable importance: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 16:15 Segment registry: learned from 3 new results; 1 setting changed.
- Updated 2026-11-01 16:00 Team strength ratings: learned from 4 new results; state updated; games processed 4.
- Updated 2026-11-01 15:45 Edge rule miner: learned from 1 new result; 1 setting changed.
- Updated 2026-11-01 15:30 Variable importance: learned from 1 new result; 1 setting changed.
- Updated 2026-11-01 15:15 Segment registry: learned from 1 new result; 1 setting changed.
- Updated 2026-11-01 14:15 Segment registry: learned from 0 new results; 1 setting changed.
- Updated 2026-11-01 14:00 Team strength ratings: learned from 1 new result; state updated; games processed 1.
- Updated 2026-11-01 14:00 Situational factors: learned from 122 new results; 3 settings changed (performance by situation rows 64 to 65).
- Updated 2026-11-01 13:15 Segment registry: learned from 0 new results; 1 setting changed.
- Updated 2026-11-01 12:00 Walk-forward validation: learned from 300 new results; 5 settings changed; overfit ratio 0.2278; total windows 4.
- Updated 2026-11-01 11:15 Segment registry: learned from 0 new results; 1 setting changed.
- Updated 2026-11-01 07:45 Edge rule miner: learned from 1 new result; 2 settings changed (edge rules rows 781 to 780).
- Updated 2026-11-01 07:30 Variable importance: learned from 1 new result; 1 setting changed.
- Updated 2026-11-01 07:15 Segment registry: learned from 1 new result; 1 setting changed.
- Updated 2026-11-01 07:00 Team strength ratings: learned from 3 new results; state updated; games processed 3.
21+ only. For entertainment and information; not financial advice. Past results do not predict future ones. Gambling problem? Call 1-800-GAMBLER.