{"slate_id":"cfb-showdown-draftkings-2026-10-31","sport":"cfb","site":"draftkings","slate_date":"2026-10-31","slate_type":"showdown","slate_subtype":null,"tour":null,"competition":null,"league_label":null,"is_draft":false,"config":{"$comment":"DraftKings College Football Showdown Captain Mode — 6 players, $50,000 cap: 1 CPT (1.5x SALARY and 1.5x POINTS) + 5 FLEX. Added 2026-08-27 during the audit that followed the FanDuel CFB import failure: cfb/draftkings shipped main + the two draft configs and NO showdown, so every DraftKings single-game college-football slate died in finalize_import on 'No slate config registered for cfb/draftkings/showdown'. This is not hypothetical and it is not narrow — infer_slate_type_from_family_a returns 'showdown' for ANY Family-A file with exactly two distinct teams, so the failure covers every CFB single-game export whether or not it carries a CPT token. FOUR REAL EXPORTS from the operator's own 2026-08-29 slate day confirmed every value below: DKSalaries (58).csv UNC@TCU (146 rows), (59) NCST@UVA (168), (60) HAW@STAN (140), (61) MEM@UNLV (134). VERIFIED FROM THOSE EXPORTS: (1) Roster Position is exactly {CPT, UTIL} and the two counts are equal in all four files (73/73, 84/84, 70/70, 67/67) — every player is listed once per slot, which is DK's captain-mode shape. (2) The CPT row's Salary is exactly 1.5x the same player's UTIL Salary on EVERY row of all four files; the ratio set is the single value {1.5}. Note the importer stores the row's own Salary and the optimizer re-applies salary_multiplier (sim_engine/optimizer.py), so the 1.5 below is load-bearing and must not be dropped on the theory that the export prices it in — the UTIL row it stores does not. (3) WHAT THE ELIGIBLE LISTS ACTUALLY MATCH AGAINST IS THE ROSTER SLOT, NOT THE POSITION. parse_dk_csv fills ParsedRow.positions from the DK 'Roster Position' column, so every row of these files arrives carrying exactly ['CPT'] or ['UTIL'] and NOTHING ELSE — verified by parsing the fixture. CPT and UTIL are therefore the two load-bearing tokens below; an eligible list built from the 'Position' column alone would match no row and make the whole pool unrosterable. This is why nfl/draftkings/showdown.json carries CPT / FLEX / A-CPT alongside its real positions, and the same reason applies here. FLEX and A-CPT are carried for the DK variants that use those slot names. (4) The real positions are listed too, as forward-compatibility for any import path that populates the Position column instead — and they are taken from these exports rather than copied from cfb/draftkings/main.json, because the two differ. The Position column across all four single-game files is {QB, RB, WR, K}: KICKERS APPEAR (8-12 per file) and there is no TE token at all, since DK files college tight ends under WR. main.json lists TE and no K, so a copy of it would have had both halves wrong. TE is kept anyway — it costs nothing if DK never emits it and rescues the slate if DK starts. LESS CERTAIN — SPOT-CHECK: the slot COUNT (1 CPT + 5 FLEX) and the $50,000 cap, neither of which any export states. Both match nfl/draftkings/showdown.json, which is DK's own football captain-mode format. Arithmetic against all four real pools is consistent and binding: the cheapest legal six is $6,500 in every file and the most expensive is $65,900-$70,700, so a $50,000 cap is affordable and constrains the build rather than sitting inert. SCORING: full PPR with the three 100/300-yard 3-point bonuses, inherited verbatim from cfb/draftkings/main.json — DK does not change scoring between classic and showdown, only the roster. Key names follow that sibling (passing_yard / rushing_yard / receiving_yard) rather than nfl/draftkings/showdown.json's shorter pass_yd form; the repo is inconsistent here and matching the same-sport sibling is what lets the two cfb configs be diffed directly. Nothing consumes this dict today — SlateConfig types it as a free-form dict[str, float] — so it is documentation until a site-aware scorer reads it. || ELIGIBILITY CORRECTED 2026-09-14. Both slot kinds listed TE. DraftKings' published CFB Showdown roster is '1 Captain (CPT) (QB, RB, WR, K), 5 UTIL (QB, RB, WR, K)' - no tight end. The operator's own exports agree: every real DK CFB file in this repo carries Position in {QB, RB, WR, K} and no TE row at all, so the token was unreachable rather than harmful. Same correction cfb/draftkings/main.json took the same day; note the showdown pool DOES include kickers where Classic does not.","site":"draftkings","sport":"cfb","slate_type":"showdown","salary_cap":50000,"roster_slots":[{"name":"CPT","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"],"salary_multiplier":1.5,"score_multiplier":1.5},{"name":"FLEX1","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"]},{"name":"FLEX2","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"]},{"name":"FLEX3","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"]},{"name":"FLEX4","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"]},{"name":"FLEX5","eligible":["QB","RB","WR","K","CPT","FLEX","UTIL","A-CPT"]}],"max_per_team":5,"min_teams":2,"min_games":1,"scoring":{"passing_yard":0.04,"passing_td":4,"passing_int":-1,"passing_300_bonus":3,"rushing_yard":0.1,"rushing_td":6,"rushing_100_bonus":3,"receiving_yard":0.1,"receiving_td":6,"reception":1,"receiving_100_bonus":3,"fumble_lost":-1},"export_format":{"header":["CPT","FLEX","FLEX","FLEX","FLEX","FLEX"],"id_format":"{name} ({site_player_id})"}},"locked_at":null,"first_game_start":"2026-11-01T03:00:00Z","last_game_start":"2026-11-01T03:00:00Z","late_swap_enabled":true,"display_name":null,"is_free":false,"group_key":"6d10cbde0bc350a2","group_slate_type":"showdown","projection_window":null}