skills/mlb-two-start-scout/SKILL.md
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.
npx skillsauth add lyndonkl/claude mlb-two-start-scoutInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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."
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 for week-boundary handling.
computed_at timestamp for the signal frontmatterStep 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.
source_urlsStep 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.
opener_risk: true)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.
qs_probability, k_ceiling, era_whip_risk per the signal-framework definitionsStep 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 for the exact weighting formula.
streamability_score using the QS-weighted formulastreamability_scoreStep 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.
mlb-league-state-reader or handoff)roster_status: fa | rostered-other | rostered-usersignals/YYYY-MM-DD-two-start.md using the templatemlb-signal-emitter (all scores in range, confidence >= 0.4, sources cited)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.
Pattern 1: Two good matchups (rare, high-value stream)
mlb-faab-sizer). Start both games.mlb-waiver-analyst will size the bid.Pattern 2: One good, one disaster (split decision)
Pattern 3: Two bad matchups (avoid)
Pattern 4: Opener / bullpen-game risk
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.
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 codifies this.
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.
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.
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.
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.
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.
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.
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:
Inputs required:
mlb-league-state-reader)Outputs produced:
streamability_score (QS-weighted)signals/YYYY-MM-DD-two-start.md for downstream agentstesting
Cluster a conference's event records into a small set of coarse themes with finer sub-clusters, an explicit outlier bucket, and soft (multi-membership) affinities — using the hybrid embed-then-label pipeline (embed abstracts, reduce, density-cluster, then LLM-label the clusters) when embedding libraries are available, and an LLM-reasoned hierarchical fallback when they are not. Embeddings do the grouping; the LLM only names the groups. Conference-agnostic. Use when turning structured event records into a navigable theme map for preference elicitation and scheduling, when you need 6-8 reasonable themes rather than 20 muddy ones, or when overlapping talks must belong to more than one theme. Trigger keywords - theme clustering, cluster talks, embed then label, soft membership, outlier talks, conference themes, topic map.
development
Build a personal conference schedule as a constraint-optimization problem — hard constraints (no time overlap, room-to-room travel time, capacity/registration, the attendee's own must-attends and blackouts) plus a user-owned weighted objective trading interest against breadth, pacing (maximize contiguous free time), and serendipity. Surfaces unbreakable conflicts (two high-value overlapping talks the model cannot rank) as decisions for the human rather than silently picking, and reports what each choice traded away. Conference-agnostic. Use to turn a preference profile plus a theme map into a day-by-day plan, to resolve overlapping sessions, or to balance a packed vs paced schedule. Trigger keywords - schedule optimization, conference schedule, constraint optimization, overlapping talks, contiguous free time, conflict surfacing, packed vs paced.
development
Parse a heterogeneous conference program (markdown, HTML, PDF-derived text, or JSON) into normalized event records with per-field confidence scores and independent classification axes (topic, depth, format, prerequisites, recorded, capacity). Detects the program's format before extracting, treats every inferred field as uncertain (present vs inferred vs missing), and flags thin or missing abstracts so downstream enrichment can target them. Conference-agnostic. Use when ingesting a conference or event schedule into a structured store, normalizing a talk/session list, or extracting per-session metadata with calibrated confidence. Trigger keywords - program ingestion, parse schedule, session extraction, event records, conference program, talk metadata, per-field confidence.
development
Build a personalized preference profile from a small number of well-chosen, cluster-grounded questions instead of a long survey. Represents the person's interests as an uncertainty region over the theme map, picks the single highest-information-gain choice-based question (contrasting real talks from different clusters), balances exploiting known interests against exploring uncertain ones, deliberately injects outlier probes to fight selection bias, and stops as soon as the schedule would be stable. Also elicits the user-owned objective weights and hard constraints. Interactive — runs where it can actually ask the person. Conference-agnostic. Use to turn a theme map into a preference profile, to decide what to ask a conference attendee, or to elicit scheduling priorities. Trigger keywords - preference elicitation, ask few questions, information gain, choice-based questions, selection bias probe, objective weights, attendee preferences.