Claude
Skills
Sign in
Back

mlb-trade-evaluator

Included with Lifetime
$97 forever

Computes the full impact of a proposed MLB fantasy trade across all 10 H2H categories (R/HR/RBI/SB/OBP, K/ERA/WHIP/QS/SV), rest-of-season dollar value, positional flexibility, slot-value optionality, adverse-selection prior, and weeks 21-23 playoff impact. Produces a signed verdict (accept / counter / reject) with rationale and a specific counter if applicable. Use when user mentions "trade evaluation", "trade value", "should I accept", "trade delta", "counter offer", or pastes in a trade proposal from Yahoo. Defaults to COUNTER in the middle band — pure REJECT is reserved for clearly predatory offers.

General

What this skill does

# MLB Trade Evaluator

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

## Example

**Scenario**: Opponent offers Aaron Judge (OF) for Bobby Witt Jr. (SS) + Spencer Strider (SP). Today is 2026-06-10. User is 4th in 12-team league. `cat_pressure` signals from `mlb-category-state-analyzer`: SB pressure 85, HR pressure 55, K pressure 70, QS pressure 80, OBP pressure 60; others 40-50. User has spare OF depth but thin SS. Opponent archetype from `mlb-opponent-profiler`: `active`.

**Rest-of-season ATC projections** (weeks 11-23, ~105 games remaining):

| Player | R | HR | RBI | SB | OBP | K | QS | SV | $ value |
|---|---|---|---|---|---|---|---|---|---|
| Judge (incoming) | 75 | 28 | 78 | 2 | .405 | — | — | — | $34 |
| Witt (outgoing) | 70 | 20 | 65 | 25 | .355 | — | — | — | $32 |
| Strider (outgoing) | — | — | — | — | — | 165 | 12 | 0 | $26 |

**Per-category delta** (ours minus theirs, weighted by `cat_pressure`):

| Cat | Delta (raw) | Pressure | Weighted Δ |
|---|---|---|---|
| R | +5 | 45 | +2.3 |
| HR | +8 | 55 | +4.4 |
| RBI | +13 | 45 | +5.9 |
| SB | **−25** | **85** | **−21.3** |
| OBP | +.050 (×PA) | 60 | +3.0 |
| K | **−165** | **70** | **−115.5** |
| QS | **−12** | **80** | **−96.0** |
| SV | 0 | 45 | 0 |
| ERA/WHIP | neutral | 50 | 0 |
| **Sum** | | | **−217.2** |

**Raw trade value delta** = $34 − ($32 + $26) = **−$24**.

**Slot-value bonus** (principle #9): 2 players out, 1 player in → we clear **+1 net slot**; they clear 0. `slot_value_delta = (1 − 0) × $2.50 = +$2.50`.

**Adverse-selection pipeline** (delegated to `@skills/adverse-selection-prior/`):
- Inputs: `offer_type=trade`, `proposer_archetype=active`, `offer_symmetry_score=20` (pre-adj ratio −37%, clearly lopsided against us), `proposer_info_asymmetry=55`.
- Output from skill: `prior_ev_probability=0.30`, `recommended_adjustment=0.85`, rationale cites active trader selecting this offer from many possibilities despite surface lopsidedness against us.

**Adjusted trade value delta**:
```
trade_value_delta_raw       = −$24.00
+ slot_value_delta          = +$2.50
= trade_value_delta_pre_adj = −$21.50
× recommended_adjustment    = × 0.85
= trade_value_delta_adjusted= −$18.28
```

Express as % of outgoing dollars: `−$18.28 / $58 = −31.5%` → below the **−20%** REJECT threshold.

**Positional flex delta**: −30 (lose a scarce SS, gain a surplus OF).
**Playoff impact** (weeks 21-23): Judge's schedule has 19 games vs Witt's 18 + Strider's 4 starts → **−35** (lose 4 starts of Ks/QS during championship weeks).

**Verdict ladder (principle #8)**:
- `delta_pct = −31.5%`, clearly below `−20%`.
- Adverse-selection prior is 0.34 (strong evidence offer is −EV for us).
- Advocate and critic agree: SB, K, QS all crushed at high pressure.
- Triggers the narrow **REJECT** case: `delta < −20%` AND clear adverse-selection evidence.

**Verdict**: **REJECT**. Even the always-counter rule yields: we include the counter we would have sent — "Judge + Webb + Ruiz for Witt + Strider" — as the walk-away ask, but pre-commit to reject because the haircut keeps it underwater.

## Workflow

Copy this checklist and track progress:

```
Trade Evaluation Progress:
- [ ] Step 1: Parse the offer (players in, players out, both sides)
- [ ] Step 2: Pull rest-of-season ATC projections for every player
- [ ] Step 3: Compute per-category deltas (counting + ratio)
- [ ] Step 4: Apply cat_pressure weights from category-state-analyzer
- [ ] Step 5: Compute raw trade_value_delta in dollars
- [ ] Step 6: Compute slot_value_delta (optionality bonus)
- [ ] Step 7: Invoke @skills/adverse-selection-prior/ and apply the haircut
- [ ] Step 8: Assess positional_flex_delta
- [ ] Step 9: Compute playoff_impact (weeks 21-23 only, July+)
- [ ] Step 10: Render verdict + counter via the +15% / -20% ladder
```

**Step 1: Parse the offer**

Record exactly who is being given up and who is being received, on both sides. Trades are zero-sum within the league. See [resources/template.md](resources/template.md#trade-offer-input) for the input schema.

- [ ] List all players moving to our roster (IN)
- [ ] List all players moving off our roster (OUT)
- [ ] Note each player's Yahoo position eligibility (C/1B/2B/3B/SS/OF/Util/SP/RP)
- [ ] Note any IL status, trade protection clauses, or two-start weeks in flight
- [ ] Capture the opponent's team slug so we can read `context/opponents/<team>.md` for their archetype

**Step 2: Pull rest-of-season projections**

The authoritative source is **FanGraphs ATC** (ensemble projection). Fallback: FanGraphs Depth Charts, then Razzball Player Rater. For every player involved, get projected totals for remaining season.

- [ ] For hitters: rest-of-season R, HR, RBI, SB, OBP, and PAs
- [ ] For pitchers: rest-of-season K, IP, ERA, WHIP, QS, SV
- [ ] Cite each source URL in the signal file frontmatter
- [ ] If a projection is missing, drop confidence to 0.5 and flag

See [resources/methodology.md#projection-sourcing](resources/methodology.md#projection-sourcing) for detailed source order.

**Step 3: Compute per-category deltas**

For counting stats (R, HR, RBI, SB, K, QS, SV): simple sum of incoming minus outgoing.

For ratio stats (OBP, ERA, WHIP): weight by projected PAs (batters) or IP (pitchers). See [resources/methodology.md#ratio-category-math](resources/methodology.md#ratio-category-math) for the weighting formula.

- [ ] Counting stat deltas per cat
- [ ] Ratio cat deltas expressed as a shift in team average, weighted by volume
- [ ] Record each in a per-cat delta table (both teams, side by side)

**Step 4: Apply `cat_pressure` weights**

Read the most recent `signals/YYYY-MM-DD-cat-state.md` from `mlb-category-state-analyzer`. For each of the 10 cats, multiply the raw delta by `cat_pressure / 50`.

- [ ] Weighted delta = raw_delta × (cat_pressure / 50)
- [ ] Sum the weighted deltas → `cat_pressure_weighted_delta`

**Step 5: Compute raw `trade_value_delta`**

Use FanGraphs Auction Calculator rest-of-season dollar values (or Razzball as fallback).

```
trade_value_delta_raw = Sum($ of players IN) − Sum($ of players OUT)
```

This is the starting point — it does NOT yet include the slot-value bonus or the adverse-selection haircut.

**Step 6: Compute `slot_value_delta` (optionality bonus)**

Every open bench slot is worth ~$2-3 in optionality: it can host a streamer, an IL stash, or a handcuff speculation. A 2-for-1 trade frees a roster slot on one side.

```
slot_value_delta = (N_slots_cleared_for_us − N_slots_cleared_for_them) × $2.50
```

Where:
- `N_slots_cleared_for_us` = (players OUT from our side) − (players IN to our side), clamped at ≥ 0
- `N_slots_cleared_for_them` = mirror on their side

Examples:
- 1-for-1: 0 slots cleared either side → `slot_value_delta = $0`
- 2-for-1 (we send 2, get 1): +1 slot us, 0 them → **+$2.50**
- 1-for-2 (we send 1, get 2): 0 us, +1 them → **−$2.50**
- 3-for-1 (we send 3, get 1): +2 us, 0 them → **+$5.00**

Add to `trade_value_delta_raw` to form `trade_value_delta_pre_adj`.

See [resources/methodology.md#slot-value-optionality](resources/methodology.md#slot-value-optionality) for the rationale (game-theory-principles.md #9).

**Step 7: Invoke `@skills/adverse-selection-prior/` and apply the haircut**

This step operationalizes principle #4 (adverse selection on incoming offers). The evaluator does NOT compute the prior itself — it delegates to the dedicated skill and consumes the output.

- [ ] Prepare inputs for `@skills/adverse-selection-prior/`:
  - `offer_type`: `trade` (or `counter_offer` if this is a counter to a prior proposal)
  - `proposer_archetype`: read from `context/opponents/<opponent-team>.md` (one of `active`, `expert`, `dormant`, `frustrated`, `unknown`). If file missing, use `unknown`.
  - `offer_symmetry_score`: integer 0-100 derived from our own surface valuation. Map via:
    - `trade_value_delta_pre_adj / Σ($_OUT)` ≥ 0 → 72 (offer loo
Files: 4
Size: 87.2 KB
Complexity: 42/100
Category: General

Related in General