# Charles Schwab Challenge — simulate at Colonial

CourtEdge models **Colonial Country Club** under `course_id: "colonial"` in `data/pga-course-profiles.json` (accuracy + approach over distance).

## Quick start (field loaded)

1. Open **[PGA DK Lineup Lab](/pga-dk-lineup-lab.html?preset=schwab-classic)** (defaults to Charles Schwab preset).
2. **Reload slate** — loads `data/pga-dk-slate-schwab-classic.json` (~70 golfers with chalk + flyer own% tiers).
3. See **Colonial — course difficulty & history** (difficulty grade, top course-history scores, **3 to look into**).
4. See **Chalk vs leverage flyers** and sort the player pool by **Own%**.

Course history source: `data/pga-colonial-course-history.json` (merged into slate on build).

Rebuild field after editing names/salaries:

```bash
node scripts/build-pga-schwab-classic-slate.mjs
```
3. Scroll to the green **Round simulate** card.
4. Click **Sim Round 2 field** (full field) or **Sim Round 3 (cut)** / **Sim Round 4 (cut)** after the cut.
5. After a round finishes, paste DK points and **Apply round results** (see [PGA-ROUND-SIM.md](./PGA-ROUND-SIM.md)).

CLI:

```bash
node scripts/prep-pga-schwab-sim.mjs --round 2 --sim --sims 1000
```

## Live DK field (recommended before lock)

Bundled classic slates are **empty on purpose**. For the real Schwab field:

1. Export **DraftKings PGA Classic** salaries + projections (CSV or JSON).
2. In the lab: **Slate upload** → choose **Colonial (Charles Schwab)** → upload JSON.
3. Or merge into `data/pga-dk-slate-schwab-classic.json` and redeploy.

Minimum player fields:

| Field | Use |
|-------|-----|
| `name` | DK name |
| `salary` | Classic flex salary |
| `projection` | Full-event or round-total proj |
| `ceiling` / `floor` | Sim draws |
| `ownership_pct` | Leverage in stack ranks / GPP |

Set on the slate root:

```json
{
  "tournament": "Charles Schwab Challenge",
  "course_id": "colonial",
  "cut_line": 65
}
```

## Which round to sim

| Button | Pool |
|--------|------|
| **Sim Round 2** | Everyone in the slate |
| **Sim Round 3 (cut)** | `made_cut` or top N by cut rules |
| **Sim Round 4 (cut)** | Same — Sunday classic is usually post-cut builds |

Showdown **Captain + FLEX** is a separate preset (Saturday/Sunday DK showdown export), not the full-week Classic sim.

## Compare to actual scores

After DK posts round points:

```json
{
  "round_results": {
    "Scottie Scheffler": { "2": 52.5 },
    "Ben Griffin": { "2": 48.1 }
  },
  "players": [
    { "name": "Scottie Scheffler", "r2_pts": 52.5 }
  ]
}
```

```bash
node scripts/sim-pga-round-accuracy.mjs \
  --round 2 \
  --slate data/pga-dk-slate-schwab-classic.json \
  --apply-actuals actuals-r2.json \
  --csv data/pga-schwab-r2-accuracy.csv
```

## Course-fit plays

With `course_id: "colonial"`, **Core plays — this slate** ranks accuracy/approach fits (see [PGA-CORE-PLAYS.md](./PGA-CORE-PLAYS.md) and [Charles Schwab preview](/articles/charles-schwab-2026-preview.html)).

## Limits

- Independent Monte Carlo per golfer (not full-field correlation like SaberSim).
- No automatic pull from PGA Tour leaderboard — you paste DK round points.
- Demo slate projections are illustrative; swap in your model or DK/FTN export for real decisions.
