{"slate_id":"cs-main-draftkings-2026-10-29","sport":"cs","site":"draftkings","slate_date":"2026-10-29","slate_type":"main","slate_subtype":null,"tour":null,"competition":null,"league_label":null,"is_draft":false,"config":{"$comment":"DK Counter-Strike captain-mode slate — 1 CPT at 1.5x + 5 FLEX, $50k cap. Verified against real 2026-07-20 export ('DKSalaries - 2026-07-20T235134.988.csv'): DK CS ships every player as Position=P with Roster Position=CPT/FLEX; DK CS is captain-mode only, so main and showdown share this shape (matches the valorant/rl pattern). Scoring follows DK's published CS2 rules; tune as DK revises. || CAPTAIN-MODE VOCABULARY CORRECTED 2026-07-30. DraftKings captain-mode exports carry Roster Position = CPT / FLEX, and the importer reads Roster Position FIRST for DraftKings (DK_COLUMNS['position'] = ['Roster Position', 'Position', 'Pos'] in services/slate_import.py — the FanDuel override is the exception, not the rule). Each player appears TWICE in the export, once per slot label, and finalize_import unions the positions on dedupe — so the optimizer sees positions ['CPT', 'FLEX'], never the sport's own position token. This config listed only the sport token, so EVERY player matched zero slots and the slate produced no lineups. Verified against the real exports committed under apps/api/tests/fixtures/ (soccer showdown: 104 rows -> 52 players, all carrying exactly ['CPT','FLEX'], 6 of 6 slots unfillable). CPT and FLEX are now accepted alongside the sport tokens, which is also semantically right for captain mode: any player may occupy any slot, and the captain premium is expressed by the slot's multipliers rather than by eligibility. Note the cs config's own comment already recorded that DK ships 'Position=P with Roster Position=CPT/FLEX' — the fact was known, but the config was written against the Position column the importer does not use for DraftKings. || SCORING CORRECTED 2026-09-28 against the card the engine actually scores (dfs_api.projection.scoring.draftkings, itself pinned to DK's published rules): the previous block was a placeholder that matched neither DK's page nor the engine (e.g. kill 3 vs DK's 1.5, headshot/map-win/perfect-map lines DK does not publish, no rounds-not-played or match-sweep term). Values are DK's RulesAndScoring payload as captured in tests/fixtures/dk_esports_rules.json and pinned to LINEAR by test_dk_esports_scoring_matches_dk; team_* keys are the separately drafted TEAM slot's card.","site":"draftkings","sport":"cs","slate_type":"main","salary_cap":50000,"roster_slots":[{"name":"CPT","eligible":["P","CPT","FLEX"],"salary_multiplier":1.5,"score_multiplier":1.5},{"name":"FLEX1","eligible":["P","CPT","FLEX"]},{"name":"FLEX2","eligible":["P","CPT","FLEX"]},{"name":"FLEX3","eligible":["P","CPT","FLEX"]},{"name":"FLEX4","eligible":["P","CPT","FLEX"]},{"name":"FLEX5","eligible":["P","CPT","FLEX"]}],"max_per_team":4,"min_teams":2,"min_games":1,"scoring":{"kill":1.5,"assist":1,"death":-1,"entry_kill":0.5,"clutch_1v2":1,"clutch_1v3":2,"clutch_1v4":3,"clutch_1v5":5,"quad_kill":3,"ace":5,"rounds_not_played":0.5,"match_sweep":5},"export_format":{"header":["CPT","FLEX","FLEX","FLEX","FLEX","FLEX"],"id_format":"{name} ({site_player_id})"}},"locked_at":"2026-10-29T09:30:00Z","first_game_start":"2026-10-29T09:30:00Z","last_game_start":"2026-10-29T11:00:00Z","late_swap_enabled":false,"display_name":null,"is_free":false,"group_key":"ddd8137d8ed6263d","group_slate_type":"main","projection_window":null}