{"slate_id":"cfb-single_stat-draftkings-2026-10-31-touchdowns","sport":"cfb","site":"draftkings","slate_date":"2026-10-31","slate_type":"single_stat","slate_subtype":"touchdowns","tour":null,"competition":null,"league_label":null,"is_draft":false,"config":{"$comment":"DraftKings College Football Touchdowns — 6 picks, NO salary cap. Added 2026-08-27 alongside cfb/draftkings/showdown.json during the audit that followed the FanDuel CFB import failure. Two real exports on the operator's machine prove the product and would BOTH have been rejected by the admin importer before this file existed: 'DKSalaries (75) touchdowns.csv' and its unnamed twin 'DKSalaries (62).csv' (identical bodies), both for the 2026-08-29 slate day the operator was uploading FanDuel slates for. VERIFIED FROM THOSE EXPORTS: 501 rows across 14 teams and 7 games; header 'Position,Name + ID,Name,ID,Roster Position,Game Info,TeamAbbrev,AvgPointsPerGame,Status' with NO Salary column at all; Roster Position is the single value 'FLEX' on every row; Position is {QB: 72, RB: 104, WR: 325} — no TE (DK files college tight ends under WR) and no kicker. The absent Salary column is what types the file: infer_slate_type_from_family_a returns 'single_stat' for a Family-A file with no salaries that is not tiers, and 'FLEX' rather than 'UTIL' is exactly the case the 2026-08-14 widening was written for — see the long note on that function, which cites DK's golf 'Birdies or Better' export for the same reason. WHY ELIGIBLE IS '*': matching every other single_stat config in the repo (nba, ncaab, wnba, mlb/draftkings, golf — all six UTIL slots, all ['*']). A capless one-stat pool imposes no positional structure; the only rule is how many players you pick. Note this is the one place a literal wildcard is correct — the classic and showdown configs list real tokens because their slots ARE positional. LESS CERTAIN — SPOT-CHECK: the roster SIZE (6) and min_teams / min_games, none of which the export states. Six is what every single_stat config in the repo uses except mlb/fanduel (4 pitchers, a different product); DK's capless pools are consistently six picks. min_teams 2 / min_games 2 match the multi-game sports (nba, ncaab, wnba, mlb) and are correct for this pool specifically — it spans 7 games — but would be wrong for a hypothetical single-game TD pool, which would need its own entry. SCORING: 1 point per touchdown scored, passing / rushing / receiving alike, resolved through scoring_by_subtype from the 'touchdowns' entry added to _registry.json in the same change. The undifferentiated 'td' key is deliberate — the contest counts touchdowns, not touchdowns-by-type. cfb had NO entry in single_stat_subtypes before this, so valid_single_stat_subtypes_for_sport('cfb') returned [] and finalize_import refused the commit for want of a subtype the admin had no legal value to supply; the config and the registry entry only work as a pair. || ROSTER SIZE CORRECTED 2026-09-11, from six slots to three. DK's published rules say, in the same words for every sport it sells a single-stat contest in, 'Lineups will consist of 3 players and must include players from at least 2 different <SPORT> teams' -- NFL gameTypes 353/354/355, CFB 363/364, MLB 334/337/338/342/345/346, NBA+WNBA 335/336/343/344/348, CBB 362, NHL 358/359, golf 341/347/349-352. Six was a guess, and the config that introduced it said so: 'LESS CERTAIN -- SPOT-CHECK: the roster SIZE (6) ... none of which the export states.' It was carried into every later single-stat config by copying. The export cannot state it, because a capless pool's CSV has no roster block -- only the rules do. || min_games is 1, not 2: DK requires two different TEAMS, and two teams can be the two halves of one game. Requiring two games rejected a lineup DK accepts. || SCORING CORRECTED 2026-09-11. This file shipped {'touchdowns': {'td': 1}}. Nothing writes a stat named 'td' -- LINEAR['cfb'] carries rushing_tds / receiving_tds / passing_tds -- so the lookup missed and every player scored 0.0, silently. The keys are now the ones the corpus actually holds, and passing touchdowns are excluded because DK's CFB rules exclude them in terms: 'Note: passing touchdowns do not count and will not accumulate points.' The old comment on this file asserted the opposite. TOTAL YARDS added at the same time: DK publishes two CFB single-stat gameTypes, 363 (touchdowns) and 364 (total yards), and only one was modelled. || TOUCHDOWN COVERAGE IS PARTIAL, confirmed against DK's published CFB Single Stat rules on 2026-09-16. DK counts SEVEN kinds: 'rushing touchdowns, receiving touchdowns, kick return touchdowns, missed field goal return touchdowns, punt return touchdowns, offensive fumble recovery touchdowns, and defensive touchdowns' (and excludes passing touchdowns, which this file already honours). Only the first two are priced, because only the first two exist in the CFB corpus -- there is no return-TD, fumble-recovery-TD or defensive-TD column to read. The remaining five are left out rather than approximated, for the reason the NASCAR and MMA vectors give in scoring/draftkings.py: an invented count fits the model to the wrong target and every backtest metric looks healthy while it does. The practical effect is small but one-directional -- a return specialist is projected at zero on a touchdowns slate. Source those columns before selling this slate type as complete.","site":"draftkings","sport":"cfb","slate_type":"single_stat","salary_cap":null,"roster_slots":[{"name":"UTIL1","eligible":["*"]},{"name":"UTIL2","eligible":["*"]},{"name":"UTIL3","eligible":["*"]}],"min_teams":2,"min_games":1,"scoring_by_subtype":{"touchdowns":{"rushing_tds":1,"receiving_tds":1},"total_yards":{"rushing_yards":1,"receiving_yards":1}},"export_format":{"header":["UTIL","UTIL","UTIL"],"id_format":"{name} ({site_player_id})"}},"locked_at":null,"first_game_start":"2026-10-31T16:00:00Z","last_game_start":"2026-10-31T20:15:00Z","late_swap_enabled":true,"display_name":null,"is_free":false,"group_key":"ec330943cbae59d9","group_slate_type":"single_stat","projection_window":null}