# PGA Showdown Round 4 salaries

Round 4 Showdown salaries are **required** for Sunday showdown lineups. Ingest from **FTN showdown ownership** (projections/ownership/CPT) and/or **DraftKings export** (official flex + CPT before lock).

**FTN import:** see [FTN-PGA-SHOWDOWN-IMPORT.md](./FTN-PGA-SHOWDOWN-IMPORT.md) — `node scripts/import-ftn-pga-showdown.mjs --fetch --rebuild`

## Tonight (heuristic field — already bundled)

The bundled R4 slate uses **70 made-cut golfers** from Sunday pairings (Byron Nelson). Jon Rahm and all missed-cut names are excluded via `pairings[]` allowlist.

Salaries are **heuristic** until you paste the official DK Showdown CSV:

- 4 rows: confirmed from DK Network
- ~28 rows: classic-derived (DK Classic × 0.70)
- ~38 rows: tier heuristic

Lab status bar shows **Salaries: Mixed estimate…** and a yellow banner until `salary_source: official_dk`.

Rebuild from emergency JSON (if needed):

```bash
node scripts/build-pga-dk-showdown-r4-slate.mjs \
  --import ../courtedge-worker/pga-dk-slate-showdown-r4-FINAL.json
```

## Morning workflow (official DK CSV)

1. Open DraftKings → **Round 4 Showdown** contest → **Export players** (columns: `Name`, `Salary`, `Captain Salary`, optional `Projection`, `Ownership %`).
2. From `courtedge-deploy`:

```bash
node scripts/import-pga-dk-showdown-paste.mjs \
  --csv /path/to/dk-r4-showdown.csv \
  --round 4 \
  --tournament "THE CJ CUP Byron Nelson" \
  --course-id tpc_craig_ranch
```

This writes `data/pga-dk-slate-showdown-weekend.json` and rebuilds:

- `data/pga-dk-slate-showdown-r4-cpt.json` (1 CPT + 5 FLEX)
- `data/pga-dk-slate-showdown-r4.json` (six flex)

3. Verify:

```bash
node -e "const j=require('./data/pga-dk-slate-showdown-r4-cpt.json'); console.log(j.players.length, j.salary_source, j.tournament)"
node scripts/test-pga-dk-optimizer.mjs
```

Expect **70 golfers**, `salary_source: official_dk`, no Jon Rahm.

4. Deploy:

```bash
bash deploy-now.sh
```

5. Hard refresh **PGA DK lab** → preset **Showdown — Round 4 (Captain + 5 FLEX, made cut)** → **Reload slate**. Status bar should show **Salaries: Official DK export** and **70 made cut · R4**.

## Paste-only (no file)

```bash
pbpaste | node scripts/import-pga-dk-showdown-paste.mjs --csv - \
  --round 4 \
  --tournament "THE CJ CUP Byron Nelson" \
  --course-id tpc_craig_ranch
```

Or paste CSV in the lab **CSV overlay** after load (updates salaries on existing pool without full rebuild).

## Rebuild from weekend JSON only

If `data/pga-dk-slate-showdown-weekend.json` already has `players[]` with `made_cut: true`:

```bash
node scripts/build-pga-dk-showdown-r4-slate.mjs
# optional captain column from raw DK CSV:
node scripts/build-pga-dk-showdown-r4-slate.mjs --csv /path/to/dk-r4-showdown.csv
```

## Required player fields (R4)

One row per golfer:

```json
{
  "name": "Scottie Scheffler",
  "salary": 11776,
  "captain_salary": 17664,
  "projection": 35.6,
  "made_cut": true,
  "make_cut_pct": 1
}
```

Without `made_cut: true` or `make_cut_pct >= 0.5`, the R4 build drops everyone.

## Verify golfer field

```bash
node -e "
const j=require('./data/pga-dk-slate-showdown-r4-cpt.json');
const n=new Set(j.players.map(p=>p.name));
console.log(n.size,'golfers ·',j.salary_source);
console.log('Rahm?', n.has('Jon Rahm'));
console.log('Top 5:', [...j.players].sort((a,b)=>b.salary-a.salary).slice(0,5).map(p=>p.name+':'+p.salary).join(', '));
"
```

Expect ~70 made-cut golfers for a full Sunday field (not `0`).
