{"about":"Known issues in The Odds Gap archive downloads, by capture date. `from` is inclusive and `until` exclusive, both UTC; null means open-ended. A row's `marks` column carries the tokens below, separated by semicolons.","columns":{"added":["marks"],"left_empty":[],"odds":["snapshot_ts","sport","away","home","commence_time","market","side","line","book","american_odds","devig_fair_prob","best_price_flag","marks"],"props":["player","market","line","game_date","anchor","ts","consensus_fair","best_book","best_odds","n_books","player_id","marks"],"same_as":{"odds":"/api/odds-export.csv","props":"/api/props-export.csv"}},"could_not_confirm":["Global Polymarket soccer moneylines (three-way, mostly June and July 2026) look to be stored before that venue's fee and the file does not add it. Read from the code, not from a recorded finding.","Whether exchange spread lines captured between 2026-06-04 and 2026-07-02 carry the sign error fixed in BL-041 and BL-042.","Whether a stale exchange quote before 2026-08-25 was written again on each scan or only shown on the board.","The order of rows inside a day file was checked on six odds days (2026-06-04, 07-20, 08-20, 09-19, 09-26, 09-27), not on all of them. Every download checks it again and stops rather than mis-flag a best price."],"day_is":"one UTC calendar day of captures. A props day holds the captures made that day, so a game's four checkpoints can sit in two day files.","first_day":{"odds":"2026-06-04","props":"2026-08-04"},"lag_hours":24,"limits":{"files_per_key_per_utc_day":300,"streams_at_once_sitewide":2},"marks":{"consensus_pre_exchange_repair":"A prop's consensus fair is the median across every quoting book, exchanges included, so fairs captured before the repair lean on the ProphetX prices above wherever ProphetX was quoting.","exchange_top_of_book":"Before the $100 fill rule, exchange prices were the top of the order book, which could be a few dollars resting. A Kalshi side with no ask also fell back to the bid until 2026-07-20, quoting the favorite about 5 cents too cheap.","kalshi_ask_unit_unverified":"A Kalshi ask of $1.00 was read as one cent on some prop markets.","kalshi_line_game_unverified":"A Kalshi spread or total could be attached to the wrong game: a later game of an MLB series or a doubleheader carried the earlier game's run line and total, the same reached across weeks in college football, and until 2026-09-10 a college spread could be credited to the wrong school.","novig_size_unverified":"Novig order sizes were read as dollars when Novig sends cents, so the size behind a Novig price was overstated 100 times and a price with about $1 behind it could pass the $100 fill rule. Stored rows carry no size, so which ones failed cannot be recovered.","polymarket_us_depth_unmeasured":"From its launch on 2026-08-07 Polymarket US prices were taken from the feed's headline with the size behind them never measured. The same could happen on a refused book read until 2026-09-14, and those rows cannot be told apart.","prophetx_fee_applied_on_export":"ProphetX rows captured before 2026-08-06 were stored without the venue's 2% commission on winnings.","prophetx_fee_boundary_day":"The storage change was committed at 14:50 UTC on 2026-08-06 and the site tells the two eras apart by date, so ProphetX rows from earlier that day may still be the price before commission, about 2% of winnings too good.","prophetx_pre_repair":"ProphetX prices captured before the 2026-08-26 repair were not always takeable at $100. On props, some sides were derived from the other side of the market rather than read from resting orders. On game lines the size behind a price was misread, a smaller effect.","soccer_moneyline_without_draw":"A soccer moneyline stored with no draw price. Most June 2026 World Cup sportsbook rows are like this (the draw was not captured), and Novig's soccer price is draw no bet. devig_fair_prob on such a row is a two-way de-vig and is not comparable with a three-way row: on the World Cup rows it invents 8 to 12 points of edge."},"notes":[{"books":["prophetx"],"boundary":null,"from":null,"handling":"Odds rows are kept and marked. In the props file a ProphetX best price from before the repair is left blank, never replaced with a second-best, and the row is marked.","id":"prophetx_pre_repair","mark":"prophetx_pre_repair","source":"BUG_LEDGER.md BL-176, BL-259; app.py EXCHANGE_REPAIR_AT","status":"fixed","tables":["odds","props"],"until":"2026-08-26T15:11:45+00:00","what":"ProphetX prices captured before the 2026-08-26 repair were not always takeable at $100. On props, some sides were derived from the other side of the market rather than read from resting orders. On game lines the size behind a price was misread, a smaller effect."},{"books":["prophetx"],"boundary":null,"from":"2026-08-26T15:11:45+00:00","handling":"No ProphetX mark from the boundary on. It is the start of the site's own clean window for exchange prices.","id":"exchange_repair_boundary","mark":null,"source":"BUG_LEDGER.md BL-259; The Odds Gap LLC/SIGNAL.md","status":"fixed","tables":["odds","props"],"until":null,"what":"2026-08-26T15:11:45+00:00 is the price repair boundary (BL-259). From that moment ProphetX prices are read from each side's own resting orders at a $100 fill."},{"books":["prophetx"],"boundary":null,"from":null,"handling":"The commission is applied on the way out, so american_odds is the price a taker realised, and the row is marked.","id":"prophetx_fee_applied_on_export","mark":"prophetx_fee_applied_on_export","source":"BUG_LEDGER.md BL-142, BL-143; matched_lines.py PROPHETX_ADJUSTED_FROM","status":"fixed","tables":["odds"],"until":"2026-08-06T00:00:00+00:00","what":"ProphetX rows captured before 2026-08-06 were stored without the venue's 2% commission on winnings."},{"books":["prophetx"],"boundary":"deploy time not found (git log, brain/journal.jsonl)","from":"2026-08-06T00:00:00+00:00","handling":"Kept as stored and marked for the whole day.","id":"prophetx_fee_boundary_day","mark":"prophetx_fee_boundary_day","source":"git f54acdd5; matched_lines.py PROPHETX_ADJUSTED_FROM","status":"fixed","tables":["odds"],"until":"2026-08-07T00:00:00+00:00","what":"The storage change was committed at 14:50 UTC on 2026-08-06 and the site tells the two eras apart by date, so ProphetX rows from earlier that day may still be the price before commission, about 2% of winnings too good."},{"books":["novig"],"boundary":null,"from":null,"handling":"Novig odds rows captured before the fix are kept and marked, and so is a props row whose best book is Novig. The price is the one Novig showed; what is unverified is that $100 could take it.","id":"novig_size_unverified","mark":"novig_size_unverified","source":"BUG_LEDGER.md BL-980; qa/signal_freeze_expected.json frozen_at","status":"fixed","tables":["odds","props"],"until":"2026-09-28T12:35:55.043398+00:00","what":"Novig order sizes were read as dollars when Novig sends cents, so the size behind a Novig price was overstated 100 times and a price with about $1 behind it could pass the $100 fill rule. Stored rows carry no size, so which ones failed cannot be recovered."},{"books":["kalshi","novig","polymarket","polymarket_us","prophetx"],"boundary":"deploy time on 2026-07-22 not found, so that whole day is marked","from":null,"handling":"Exchange rows captured before the rule are kept and marked.","id":"exchange_top_of_book","mark":"exchange_top_of_book","source":"app.py MIN_EXCHANGE_FILL_USD (git 4260b34c); BUG_LEDGER.md BL-054, BL-080","status":"fixed","tables":["odds"],"until":"2026-07-23T00:00:00+00:00","what":"Before the $100 fill rule, exchange prices were the top of the order book, which could be a few dollars resting. A Kalshi side with no ask also fell back to the bid until 2026-07-20, quoting the favorite about 5 cents too cheap."},{"books":["polymarket_us"],"boundary":"deploy time on 2026-08-13 not found, so that whole day is marked","from":"2026-08-07T00:00:00+00:00","handling":"Rows before the depth check are kept and marked. The later cases are not marked.","id":"polymarket_us_depth_unmeasured","mark":"polymarket_us_depth_unmeasured","source":"BUG_LEDGER.md BL-178, BL-550","status":"fixed","tables":["odds"],"until":"2026-08-14T00:00:00+00:00","what":"From its launch on 2026-08-07 Polymarket US prices were taken from the feed's headline with the size behind them never measured. The same could happen on a refused book read until 2026-09-14, and those rows cannot be told apart."},{"books":["kalshi"],"boundary":"pushed 2026-09-28, time not found, so that whole day is marked","from":null,"handling":"Every Kalshi spread and total row captured before the fix is kept and marked. Moneylines are not part of this issue.","id":"kalshi_line_game_unverified","mark":"kalshi_line_game_unverified","source":"BUG_LEDGER.md BL-912, BL-499","status":"fixed","tables":["odds"],"until":"2026-09-29T00:00:00+00:00","what":"A Kalshi spread or total could be attached to the wrong game: a later game of an MLB series or a doubleheader carried the earlier game's run line and total, the same reached across weeks in college football, and until 2026-09-10 a college spread could be credited to the wrong school."},{"books":[],"boundary":null,"from":null,"handling":"Kept as stored and marked, on any date.","id":"soccer_moneyline_without_draw","mark":"soccer_moneyline_without_draw","source":"BUG_LEDGER.md BL-911, BL-177","status":"open","tables":["odds"],"until":null,"what":"A soccer moneyline stored with no draw price. Most June 2026 World Cup sportsbook rows are like this (the draw was not captured), and Novig's soccer price is draw no bet. devig_fair_prob on such a row is a two-way de-vig and is not comparable with a three-way row: on the World Cup rows it invents 8 to 12 points of edge."},{"books":["kalshi","novig","polymarket","polymarket_us","prophetx"],"boundary":null,"from":null,"handling":"A moneyline like this is left out when its two sides cannot be a real pair or a side is far off the sportsbooks. Spread and total rows have no such check and are not marked.","id":"exchange_penny_asks","mark":null,"source":"BUG_LEDGER.md BL-910, BL-356","status":"open","tables":["odds"],"until":null,"what":"An empty or unreadable order book can return the resting 1-cent ask, stored as if it were a $100 fill (seen as +9252 on both sides, or -9900 against +2243), and an empty book can quote both sides of a spread or total at the same placeholder price. Mostly Kalshi and Polymarket US."},{"books":["kalshi","novig","polymarket","polymarket_us","prophetx"],"boundary":null,"from":null,"handling":"That book's moneyline is left out for that scan. Its spread and total rows still ship.","id":"impossible_exchange_moneylines","mark":null,"source":"BUG_LEDGER.md BL-240, BL-241","status":"open","tables":["odds"],"until":null,"what":"Exchange moneylines that could not be a real pair of prices: two sides summing past the cap, a three-way soccer line outside its band, or a side far off the sportsbooks in the same scan."},{"books":["novig","prophetx","polymarket_us"],"boundary":null,"from":null,"handling":"Excluded from the file entirely, as they are from the per-scan export.","id":"wrong_game_quarantine","mark":null,"source":"BUG_LEDGER.md BL-426; brain/DECISIONS.md 2026-09-08","status":"fixed","tables":["odds"],"until":null,"what":"Novig, ProphetX and Polymarket US college rows whose match to a game cannot be verified (two schools sharing a nickname). Every such row written before the 2026-09-08 fix is affected."},{"books":["kalshi"],"boundary":null,"from":null,"handling":"Not detected and not marked.","id":"kalshi_doubleheader_moneyline","mark":null,"source":"BUG_LEDGER.md BL-940, BL-115","status":"open","tables":["odds"],"until":null,"what":"Both games of an MLB doubleheader can carry one Kalshi event's moneyline. Before 2026-08-03 some NFL Kalshi moneylines were also priced off a season market."},{"books":[],"boundary":null,"from":null,"handling":"Kept as stored. Group on teams and date, not on commence_time alone.","id":"moved_kickoff","mark":null,"source":"BUG_LEDGER.md BL-287, BL-930","status":"open","tables":["odds"],"until":null,"what":"The feed moves commence_time when a game is delayed or goes live, so one game can appear under more than one start time."},{"books":[],"boundary":null,"from":null,"handling":"Kept as stored and not marked.","id":"sportsbook_prices_as_posted","mark":null,"source":"BUG_LEDGER.md BL-184, BL-241, BL-913","status":"open","tables":["odds"],"until":null,"what":"A sportsbook price far from every other book is kept, because a book posting a bad number is a fact about that book. A few are errors in the feed, such as two sides swapped."},{"books":[],"boundary":null,"from":null,"handling":"Nothing is backfilled or smoothed.","id":"coverage_gaps","mark":null,"source":"BUG_LEDGER.md BL-245, BL-150, BL-550","status":"open","tables":["odds"],"until":null,"what":"Hourly scans run in a daily window, so about nine hours a night have no rows. Exchange quotes could be up to two hours stale before 2026-08-25, exchange spreads and totals were uneven before 2026-08-08, and Polymarket US has no NFL rows for 12:29 to 17:02 UTC on 2026-09-13."},{"books":["prophetx"],"boundary":null,"from":null,"handling":"Every props row captured before the repair is marked. The file does not record which books made up a consensus, so the mark is on all of them.","id":"consensus_pre_exchange_repair","mark":"consensus_pre_exchange_repair","source":"BUG_LEDGER.md BL-259, BL-284","status":"fixed","tables":["props"],"until":"2026-08-26T15:11:45+00:00","what":"A prop's consensus fair is the median across every quoting book, exchanges included, so fairs captured before the repair lean on the ProphetX prices above wherever ProphetX was quoting."},{"books":["kalshi","novig","polymarket","polymarket_us","prophetx"],"boundary":null,"from":null,"handling":"Not marked: the books behind a consensus are not stored.","id":"props_consensus_includes_exchanges","mark":null,"source":"BUG_LEDGER.md BL-284, BL-980","status":"open","tables":["props"],"until":null,"what":"Exchange prices are part of every stored consensus fair, so the Novig size issue (before 2026-09-28) and the Kalshi ask issue below can sit inside a fair even where the best book is a sportsbook."},{"books":["kalshi"],"boundary":"fixed 2026-08-26, time not found, so that whole day is marked","from":null,"handling":"A props row whose best book is Kalshi, captured before the fix, is marked.","id":"kalshi_ask_unit_unverified","mark":"kalshi_ask_unit_unverified","source":"BUG_LEDGER.md BL-186","status":"fixed","tables":["props"],"until":"2026-08-27T00:00:00+00:00","what":"A Kalshi ask of $1.00 was read as one cent on some prop markets."},{"books":[],"boundary":null,"from":null,"handling":"The league is recovered where one source pins it. Where none does, player_id starts with the sport family (football:, basketball:) rather than a guess.","id":"props_league_not_recorded","mark":null,"source":"BUG_LEDGER.md BL-559, BL-565, BL-566; app.py _props_resolve_sport","status":"fixed","tables":["props"],"until":"2026-09-14T00:00:00+00:00","what":"Props captured before 2026-09-14 did not record their league, and touchdown scorer markets were not captured before then."}],"order":{"odds":"by scan, then game, the per-scan export's order","props":"by capture time; the props export sorts by game date instead, the rows are the same"}}
