mlb-two-start-scout

$npx mdskill add lyndonkl/claude/mlb-two-start-scout

Identify double-start pitchers and rank them by streaming value.

  • Helps fantasy managers select pitchers scheduled to start twice.
  • Depends on FantasyPros and FanGraphs probability grids.
  • Scores matchups using league Quality Start rules and streamability.
  • Outputs ranked lists with risk flags for bullpen games and openers.

SKILL.md

.github/skills/mlb-two-start-scoutView on GitHub ↗
---
name: mlb-two-start-scout
description: For a given fantasy week (Monday-Sunday), identifies every starting pitcher scheduled to start twice, validates both probable starts, grades each matchup against the league's Quality Starts (QS) scoring rules, and ranks the list by streamability_score. Flags bullpen-game and opener risks that nearly never produce QS. Use when user mentions "two-start pitchers", "weekly streaming", "Monday-Sunday pitcher plan", "double start", "2-start SP", or preparing the weekly streaming plan on Sunday nights.
---
# MLB Two-Start Scout

## Table of Contents
- [Example](#example)
- [Workflow](#workflow)
- [Common Patterns](#common-patterns)
- [Guardrails](#guardrails)
- [Quick Reference](#quick-reference)

## Example

**Scenario**: Fantasy week of Monday 2026-04-20 through Sunday 2026-04-26. League scores Quality Starts (QS = 6+IP and <=3ER), not Wins. User needs to decide which two-start SPs to stream from free agency.

**Step 1 outputs (from web search)** -- FantasyPros two-start-pitchers.php plus FanGraphs probables-grid cross-check:

| SP | Team | Start 1 | Start 2 | Notes |
|---|---|---|---|---|
| Logan Webb | SFG | Mon 4/20 @ COL | Sat 4/25 vs WSH | confirmed on both sources |
| Seth Lugo | KCR | Tue 4/21 @ DET | Sun 4/26 vs NYY | confirmed |
| Bryan Woo | SEA | Mon 4/20 vs HOU | Sun 4/26 @ OAK | confirmed |
| Ranger Suarez | PHI | Tue 4/21 vs NYM | Sun 4/26 @ ATL | confirmed |
| (Team TBD) | MIA | Wed 4/23 vs STL | Mon (next wk)?? | OPENER RISK -- drop |

**Step 2 outputs** -- matchup signals per start:

Logan Webb: Start 1 at Coors (park_pitcher_factor 25, brutal) but weak COL lineup; Start 2 vs WSH at home (park 55). qs_probability 58, k_ceiling 62, era_whip_risk 55, streamability_score 62.

Seth Lugo: Start 1 at DET (avg), Start 2 vs NYY (top-3 wOBA). qs_probability 45, era_whip_risk 68, streamability_score 48.

Bryan Woo: Start 1 vs HOU (tough), Start 2 at OAK (weakest AL lineup, pitcher park 60). qs_probability 66, k_ceiling 70, streamability_score 71.

Ranger Suarez: Start 1 vs NYM (tough), Start 2 at ATL (top-2 wOBA, hitter park). qs_probability 40, era_whip_risk 72, streamability_score 42.

**Step 3 output** -- ranked two-start board (only free agents shown to user):

| Rank | SP | FA status | Streamability | QS prob | K ceiling | Risk | Verdict |
|---|---|---|---|---|---|---|---|
| 1 | Bryan Woo | FA in your league | 71 | 66 | 70 | 45 | ADD + START both |
| 2 | Logan Webb | Rostered | 62 | 58 | 62 | 55 | - (not available) |
| 3 | Seth Lugo | FA | 48 | 45 | 58 | 68 | SKIP -- risky vs NYY |
| 4 | Ranger Suarez | FA | 42 | 40 | 55 | 72 | SKIP -- both matchups bad |
| -- | MIA opener | FA | -- | -- | -- | -- | IGNORE -- bullpen game |

**User-facing recommendation (delivered by streaming-strategist via communication-storytelling skill):**

> "This week has one strong two-start streamer: Bryan Woo of Seattle. He pitches twice (Monday vs Houston, Sunday at Oakland) and Oakland has the weakest hitting lineup in the American League. ADD Bryan Woo if he is a free agent. Bid $3-5 FAAB. Two starts means double the strikeouts and double the chance at a Quality Start -- even if Monday's matchup vs Houston goes poorly, the Oakland start is likely to salvage the week."

## Workflow

Copy this checklist and track progress:

```
Two-Start Scout Progress:
- [ ] Step 1: Define the fantasy week (Mon-Sun dates) and pull the two-start list
- [ ] Step 2: Cross-reference two lists and validate both probable starts per SP
- [ ] Step 3: Flag bullpen-game and opener risks -- remove from board
- [ ] Step 4: Compute per-start matchup signals (qs_probability, k_ceiling, era_whip_risk)
- [ ] Step 5: Aggregate to per-SP streamability_score
- [ ] Step 6: Cross-reference with Yahoo free-agent pool, rank, and emit signal file
```

**Step 1: Define the week and pull the two-start list**

Confirm the Monday-Sunday dates in ISO format (e.g., 2026-04-20 through 2026-04-26). Yahoo fantasy weeks lock at 9am ET Monday. See [resources/methodology.md](resources/methodology.md#week-definition) for week-boundary handling.

- [ ] Monday date confirmed (start of week)
- [ ] Sunday date confirmed (end of week)
- [ ] Web-search FantasyPros two-start-pitchers.php for the upcoming week
- [ ] Record URL and `computed_at` timestamp for the signal frontmatter

**Step 2: Cross-reference and validate both starts**

FantasyPros is primary but lags short-notice rotation changes. Cross-check FanGraphs probables-grid to verify both starts are still scheduled and neither has been pushed or bumped. See [resources/methodology.md](resources/methodology.md#cross-reference-validation).

- [ ] For each SP on the FantasyPros list, find both probable-start dates on FanGraphs grid
- [ ] If FanGraphs shows a different pitcher for one of the two dates, reduce confidence and note the conflict
- [ ] If the SP has been scratched or pushed (injury news, weather makeup), remove from board or flag
- [ ] Record both sources in `source_urls`

**Step 3: Flag bullpen-game and opener risks**

Teams that deploy openers (e.g., rebuilding clubs using a 1-inning reliever to start the game) rarely produce QS for the "nominal starter". These hurt ERA/WHIP and give zero QS. De-prioritize or drop entirely. See [resources/methodology.md](resources/methodology.md#opener-bullpen-detection).

- [ ] Check each SP's recent game logs -- is their typical outing <5 IP? Opener risk.
- [ ] Check if the team has announced a "bullpen day" for either scheduled start
- [ ] Flag any SP whose team is known to use openers regularly (mark `opener_risk: true`)
- [ ] Remove opener-risk SPs from the top of the ranking or drop entirely

**Step 4: Compute per-start matchup signals**

For EACH of the two starts, compute matchup signals individually. A two-start SP with one great matchup and one terrible matchup is materially different from one with two average matchups. See [resources/methodology.md](resources/methodology.md#per-start-scoring).

- [ ] For each start: pull opponent team wOBA vs pitcher handedness
- [ ] For each start: pull park factor (hitter vs pitcher park)
- [ ] For each start: pull weather (rain-out and wind risk)
- [ ] For each start: compute `qs_probability`, `k_ceiling`, `era_whip_risk` per the signal-framework definitions

**Step 5: Aggregate to per-SP streamability_score**

Average the two starts, weighted toward QS probability because our league is QS-scoring (not W-scoring). See [Quick Reference](#quick-reference) for the exact weighting formula.

- [ ] Compute per-SP `streamability_score` using the QS-weighted formula
- [ ] Flag SPs with one "great" matchup and one "disaster" matchup separately -- variance matters
- [ ] Apply opener-risk penalty if any
- [ ] Rank SPs from highest to lowest `streamability_score`

**Step 6: Cross-reference free agents, rank, and emit signal**

The user can only stream SPs who are free agents (FA). Filter the board to rostered vs available, and annotate the Yahoo FA status. Emit the signal file following [resources/template.md](resources/template.md).

- [ ] Pull Yahoo FA pool for SP position (via `mlb-league-state-reader` or handoff)
- [ ] Annotate each SP as `roster_status: fa | rostered-other | rostered-user`
- [ ] Emit signal file `signals/YYYY-MM-DD-two-start.md` using the template
- [ ] Validate via `mlb-signal-emitter` (all scores in range, confidence >= 0.4, sources cited)
- [ ] Hand off to `mlb-streaming-strategist` (which runs advocate + critic variants)

Minimum standard: average rubric score of 3.5 or above. Validate using [resources/evaluators/rubric_mlb_two_start_scout.json](resources/evaluators/rubric_mlb_two_start_scout.json).

## Common Patterns

**Pattern 1: Two good matchups (rare, high-value stream)**
- **Profile**: Both starts vs bottom-tier offenses, at least one in a pitcher-friendly park, neither in Coors or GABP.
- **Action**: Strong ADD candidate. Willing to bid real FAAB (see `mlb-faab-sizer`). Start both games.
- **Watch for**: A hot FA is likely to draw multiple bids -- the `mlb-waiver-analyst` will size the bid.

**Pattern 2: One good, one disaster (split decision)**
- **Profile**: One start vs WSH or COL hitters (disaster), one vs OAK or CHW (plum).
- **Action**: Depends on daily-lineup flexibility. If the user can START the good day and BENCH the bad day, this becomes a high-value add. If the league locks weekly, score this lower -- the bad start will tank ratios.
- **Watch for**: Note the league's lineup cadence. Yahoo daily lineup lock means we can bench the bad start. Flag explicitly.

**Pattern 3: Two bad matchups (avoid)**
- **Profile**: Both starts vs top-10 offenses, one or both in hitter parks.
- **Action**: Even with two starts, expected Ks are undone by the ERA/WHIP damage. SKIP. Note that 2-start weeks are not automatically good.
- **Watch for**: The "two starts!" heuristic can trap beginners. Always check matchup quality, not just start count.

**Pattern 4: Opener / bullpen-game risk**
- **Profile**: Rebuilding team (MIA, OAK, CHW, PIT, WAS) deploys a 1-inning opener; the "starter" enters in the 2nd. Their typical outing is 3-4 IP.
- **Action**: IGNORE. Zero QS upside, full ratio risk. Remove from board.
- **Watch for**: FantasyPros sometimes lists the nominal starter without flagging opener risk. Cross-check the pitcher's recent game logs for sub-5-IP outings.

## Guardrails

1. **Two starts does not mean good streamer.** The volume multiplier only pays off when the per-start matchup quality is at or above league average. Two starts vs top-5 offenses can produce negative QS value. Always evaluate matchup quality, not just the start count.

2. **Our league is QS, not W.** Weighting must reflect this. 6+IP <=3ER matters more than wins. A pitcher on a bad team with good matchups can still produce QS. A pitcher on a great team with bad matchups cannot reliably. The formula in [Quick Reference](#quick-reference) codifies this.

3. **Validate BOTH starts on FanGraphs.** FantasyPros publishes Sunday night; rotation changes happen Monday-Wednesday. If the second start shifts to a different pitcher, the SP is no longer a two-start SP -- remove from the board. Never use the FantasyPros list as the only source.

4. **Opener teams are traps.** MIA, OAK, CHW, PIT, WAS and a rotating cast of rebuilders use openers or short starts. The nominal "starter" listed may throw 3 innings. Zero QS upside. Always cross-check recent game logs.

5. **Weather matters more for two-start weeks.** A rain-out of one of the two starts converts a two-start SP to a one-start SP, and the value drops by roughly half. Flag any start with >30% rain probability as a downgrade on confidence.

6. **Coors Field is a cliff.** Any start in Coors (COL home) automatically caps `streamability_score` at ~60 no matter the matchup. The park factor is extreme enough that even an ace gives up 5+ runs some nights. Two-start SPs with a Coors game should rank below SPs with two neutral-park starts.

7. **Cross-reference Yahoo FA status before ranking.** A top-ranked two-start SP who is already rostered is irrelevant to the streaming decision. Always annotate `roster_status` and present the user only with actionable (FA) options at the top, with rostered SPs as context below.

8. **Signal file is authoritative.** Downstream agents (streaming-strategist, waiver-analyst) read the emitted signal file and do not re-derive. If the signal file is missing a field or has confidence < 0.4, downstream agents must flag it, not fill it in.

## Quick Reference

**Key formulas:**

```
qs_probability (per start) = rolling_QS_rate * matchup_multiplier
  where matchup_multiplier =
      0.35 * (100 - opp_wOBA_normalized)    # worse offense = higher QS
    + 0.25 * park_pitcher_factor            # pitcher park = higher QS
    + 0.25 * (100 - weather_risk)           # dry = higher QS
    + 0.15 * bullpen_state_of_own_team      # bullpen backs up 6+IP

k_ceiling (per start) = projected_Ks * 100 / 12
  # 12 Ks in a start = 100 ceiling

era_whip_risk (per start) = 0.5 * opp_wOBA_normalized
                          + 0.3 * park_hitter_factor
                          + 0.2 * pitcher_blowup_history

streamability_score (per start) =
    0.55 * qs_probability          # QS-league weight -- DOMINANT
  + 0.25 * k_ceiling
  + 0.20 * (100 - era_whip_risk)

streamability_score (per SP, two-start week) =
    mean(start_1_score, start_2_score)
  - opener_risk_penalty                    # -30 if either start has opener risk
  - coors_penalty                          # -10 if either start is at Coors
  - weather_penalty                        # -5 per start with rain risk > 30%
```

**Recommendation thresholds:**

| streamability_score | Recommendation (if FA) |
|---|---|
| >= 70 | ADD + START both. Bid $3-8 FAAB. |
| 55-69 | ADD + START both if SP slot open. Bid $1-3 FAAB. |
| 40-54 | Only add if you have daily flexibility to bench the bad start. |
| < 40 | SKIP. Two starts does not salvage two bad matchups. |

**Opener-risk teams (as of 2026-04-17, verify each week):**

| Team | Opener frequency | Typical starter IP |
|---|---|---|
| MIA | High | 3-4 IP |
| OAK | High | 3-5 IP |
| CHW | Moderate | 4-5 IP |
| PIT | Moderate | 4-5 IP |
| WAS | Occasional | 5-6 IP |

**Park-factor extremes (pitcher-friendly = high, hitter-friendly = low in pitcher_factor terms):**

| Park | Pitcher factor | Notes |
|---|---|---|
| Coors (COL) | ~20 | Disaster for any pitcher |
| GABP (CIN) | ~35 | Hitter-friendly, especially for LHB |
| Fenway (BOS) | ~45 | Lefty matters a lot |
| Petco (SDP) | ~65 | Pitcher-friendly |
| Oracle (SFG) | ~68 | Pitcher-friendly |
| T-Mobile (SEA) | ~70 | Most pitcher-friendly |

**Key resources:**

- **[resources/template.md](resources/template.md)**: Ranked two-start board output format with per-start breakdowns and verdict column
- **[resources/methodology.md](resources/methodology.md)**: Web-search recipes for FantasyPros + FanGraphs, cross-reference validation, opener detection, QS-weighted scoring procedure
- **[resources/evaluators/rubric_mlb_two_start_scout.json](resources/evaluators/rubric_mlb_two_start_scout.json)**: Quality criteria across 8 dimensions

**Inputs required:**

- Fantasy week definition (Monday date, Sunday date, ISO format)
- Yahoo free-agent pool for SP position (or handoff from `mlb-league-state-reader`)
- Web-search access (FantasyPros, FanGraphs, RotoWire weather, MLB.com)

**Outputs produced:**

- Ranked list of two-start SPs with per-start matchup scores
- Per-SP `streamability_score` (QS-weighted)
- Opener-risk flags and Coors/weather penalties
- Free-agent annotations
- Signal file `signals/YYYY-MM-DD-two-start.md` for downstream agents

More from lyndonkl/claude

SkillDescription
abstraction-concrete-examplesBuilds structured abstraction ladders that translate high-level principles into concrete, actionable examples across 3-5 levels. Bridges communication gaps, reveals hidden assumptions, and tests whether abstract ideas work in practice. Use when explaining concepts at different expertise levels, moving between abstract principles and concrete implementation, identifying edge cases by testing ideas against scenarios, designing layered documentation, decomposing complex problems into actionable steps, or bridging strategy-execution gaps.
academic-letter-architectGuides the creation of evidence-based academic recommendation letters, reference letters, and award nominations that combine concrete examples, meaningful comparisons, and genuine enthusiasm. Use when writing recommendation letters for students, postdocs, or colleagues, or when user mentions recommendation letter, reference, nomination, letter of support, endorsement, or needs help with strong advocacy and comparative statements.
adr-architectureDocuments significant architectural and technical decisions with full context, alternatives considered, trade-offs analyzed, and consequences understood. Creates a decision trail that helps teams understand why decisions were made. Use when choosing between technology options, making infrastructure decisions, establishing standards, migrating systems, or when user mentions ADR, architecture decision, technical decision record, or decision documentation.
adverse-selection-priorProduces a Bayesian prior probability that an offered transaction is +EV for the recipient, given that the counterparty chose to propose it. Applies Akerlof market-for-lemons logic -- if they offered it, they believe it is +EV for them, so the prior that it is +EV for us is materially below 50%. Reusable across trade evaluation, waiver drops (another team dropping a player is also adverse selection), job-offer analysis, M&A, and any "someone offered me this" situation. Use when you receive an unsolicited trade/offer/proposal, analyzing incoming trade prior, evaluating why a counterparty proposed a deal, or when user mentions adverse selection, market for lemons, why did they offer this, incoming trade prior, they proposed it, Bayesian adjustment on received offer.
alignment-values-north-starCreates actionable alignment frameworks that give teams a shared North Star (direction), values (guardrails), and decision tenets (behavioral standards). Enables autonomous decision-making while maintaining organizational coherence. Use when starting new teams, scaling organizations, defining culture, establishing product vision, resolving misalignment, creating strategic clarity, or when user mentions North Star, team values, mission, principles, guardrails, decision framework, or cultural alignment.
analogy-weight-checkFor every analogy in a substacker draft, verifies it carries mechanical weight — the analogy does real work explaining the mechanism, not merely decorates it. Cross-references analogy-catalog.md for novelty (is this analogy reused from a prior post?) and domain fit (biology > organizational > sports preferred; physics/military disfavored). Use whenever an analogy appears in the draft. Trigger keywords: analogy weight, decorative, mechanical weight, reused analogy, catalog check, metaphor check.
answer-uncomfortable-questionTakes one strategic question about substacker ("should we launch paid?", "is this section dead?", "are we writing for the wrong audience?") and produces the mandatory evidence + reasoning + downside triad plus a recommendation. Used 3 times per Growth Strategist review. Trigger keywords: uncomfortable question, strategic question, evidence reasoning downside, triad.
attribute-performanceFor each substacker post that materially over- or under-performs the rolling baseline (|z| ≥ 1.0), produces a plain-English attribution paragraph with calibrated confidence (high / medium / low / unexplained). Considers subject-line effect, topic zeitgeist, external share, day-of-week, length effect, and audience-notes signals. Labels unexplained outliers explicitly rather than fabricating a story. Use after compute-baseline when outlier posts exist. Trigger keywords: attribution, why did this post work, outlier explanation, performance analysis.
auction-first-price-shadingComputes the optimal shaded bid for a first-price sealed-bid auction given a true private value, an estimate of the number of competing bidders N, and a value-distribution assumption. Implements the `(N-1)/N` equilibrium shading rule for uniform private values, adjusts for log-normal or empirical value distributions, layers a risk-aversion adjustment, and caps output against the bidder's remaining budget. Domain-neutral auction theory reusable across fantasy sports (baseball FAAB, NBA/NHL waiver auctions), prediction-market limit sizing, sealed procurement bids, and any blind-bid context. Use when user mentions "first-price auction bid", "sealed bid shading", "(N-1)/N", "FAAB bid amount", "auction shading", "optimal bid first-price", "bid for sealed-bid", "blind bid sizing", or when downstream logic needs a principled shade factor rather than an ad-hoc heuristic.
auction-winners-curse-haircutApplies a Bayesian haircut to a bid valuation for common-value auctions where winning is itself evidence the bidder over-estimated. Takes a raw valuation, a value-type classification (common_value / private_value / mixed), the number of informed bidders N, and a signal-dispersion estimate, and returns an adjusted valuation. Domain-neutral and reusable across fantasy FAAB, prediction markets, M&A bids, ad-auction budgets, and any generic bidding context. Use when user mentions "winner's curse", "common value auction", "valuation haircut", "adverse valuation", "Bayesian bid adjustment", or "over-paying in auction".