mcpField
M
mlb-opponent-profiler

mlb-opponent-profiler

github.com/lyndonklデータ・データベース18743 回インストール9 週間前に更新
リポジトリ

mlb-opponent-profiler について

MLB Opponent Profilerは、Yahooリーグの対戦相手プロフィールを作成・更新するファンタジーベースボール用スキルです。ロスターや活動データと分類器を組み合わせ、既存プロフィールの手動メモを保持します。

主な機能

  1. 01Yahooのチーム、ロスター、ドラフト、取引ページの取得
  2. 02MLBロスターとマネージャー活動の特徴抽出
  3. 03前週の事後分布を使ったタイプ更新
  4. 04ロスター構成に基づくカテゴリ強度の推定
  5. 05プロフィール更新時の手動メモ保持
  6. 06週次の対戦相手プロフィールシグナル出力

活用シーン

  1. 01新しい週のYahoo対戦相手プロフィール更新
  2. 02相手のロスター強度と放棄しそうなカテゴリの比較
  3. 03シーズンを通じた相手の行動変化の追跡

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/lyndonkl/claude --skill mlb-opponent-profiler

インストール後、Claude Code で/mlb-opponent-profilerを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

resources/
methodology.md
template.md
resources/evaluators/
rubric_mlb_opponent_profiler.json

詳細

MLB 対戦相手プロファイラー

目次

例

シナリオ:第5週の月曜朝です。活動量の多い週(7回の移動、追加選手に14ドルを使用、対戦成績4勝1敗)を再び確認した後、Springfield Isotopes(マネージャーはNikolay)のプロフィールを更新します。

入力:

team_name: "Springfield Isotopes"
yahoo_session: <authenticated chrome context>
prior_profile:                       # from context/opponents/springfield-isotopes.md (Week 4)
  archetype: balanced
  archetype_confidence: 0.50
  posterior: {balanced: 0.42, stars_and_scrubs: 0.18, punt_sv: 0.02, punt_sb: 0.04,
              punt_wins_qs: 0.03, hitter_heavy: 0.12, pitcher_heavy: 0.08,
              inactive: 0.00, frustrated_active: 0.11, unknown: 0.00}

ステップ1 -- Yahooのスクレイピング(4ページ):チーム一覧、team_id=8のチームページ、ドラフト結果、tid=8で絞り込んだ取引。URLはmethodology.mdに記載されています。

ステップ2 -- MLBの特徴量抽出で、次の結果が得られます:

sp_roster_share: 0.35; closer_count: 2; sb_speed_count: 4; power_bat_count: 6
moves_per_week: 3.3; faab_spent_pct: 0.32; faab_avg_bid: 2.5
lineup_set_daily: true; trade_offers_sent: 1; trade_offers_received: 0
record_last_2_weeks: "8-2-0"; days_since_last_login: 0

ステップ3 -- opponent-archetype-classifierを呼び出す:

archetype_taxonomy:            # see resources/template.md -- 10 archetypes
  balanced: {...}
  stars_and_scrubs: {...}
  ...
observed_features: <from step 2>
archetype_prior: <prior_profile.posterior>     # sequential: last week's posterior is this week's prior
observation_weight: 0.65        # Week 5 -- see methodology.md observation_weight_calibration
correlated_feature_pairs:
  - [moves_per_week, faab_spent_pct]            # active managers do both
  - [sp_roster_share, closer_count]             # they trade off

ステップ4 -- 分類器が次の結果を返す:

posterior:
  balanced:            0.58    # up from 0.42 -- evidence accumulating
  stars_and_scrubs:    0.12
  hitter_heavy:        0.10
  frustrated_active:   0.08    # record is winning, so frustrated_active down
  pitcher_heavy:       0.07
  punt_sb:             0.03
  punt_sv:             0.01
  punt_wins_qs:        0.01
  inactive:            0.00
  unknown:             0.00

map_archetype: balanced
classification_confidence: 37.7      # 0.58 * 0.65 * 100 -- still just under 40
best_response_hints:
  - "Match cat-for-cat; decided on execution"
  - "Include in N-estimate for every common-value FAAB target"
  - "Active manager -- probe for fair consolidation trades"

ステップ5 -- 既存のcontext/opponents/springfield-isotopes.mdを読み込み、手動メモを保持したまま、機械生成セクションを更新する:

「Summary」、「Apparent weaknesses」、「Best response」、「Open questions」セクションには、ユーザーが手動で記述したメモが含まれています。そのまま保持してください。更新するのは次の項目のみです:

  • YAMLフロントマター:last_updated、confidence、source_urls
  • セクション2(アーキタイプ):archetype、archetype_confidence、archetype_evidence
  • セクション3(カテゴリの強さ):cat_strength、presumed_punts、likely_pushes
  • セクション4(行動特性):activity_level、last_active、waiver_aggression、faab_remaining、faab_avg_bid_pct、trade_propensity

ステップ6 -- 週次シグナルをsignals/wk05-opponent-profiles.mdに出力する:

---
type: opponent_profile_summary
date: 2026-04-20
week: 5
emitted_by: mlb-opponent-profiler
confidence: 0.65
source_urls: [<11 team pages + transactions + teams>]
---
## Archetype shifts since Week 4
- Springfield Isotopes: balanced 0.42 -> 0.58 (confidence 0.50 -> 0.66). Nikolay continues active pattern, record confirms execution.
- Jennys Team: inactive 0.78 -> 0.84 (confidence 0.80 -> 0.85). Still zero moves. Profile hardening.
- ...9 more

## New reactivity triggers fired
- Team 7 (Kenyi) -- outbid us on Wade Miley at $14; shift `faab_avg_bid_pct` up

ワークフロー

このチェックリストをコピーして、進捗を記録してください:

Opponent Profiler Progress (per team, x 11 for all_opponents):
- [ ] Step 1: Resolve team identity (team_name -> team_id, manager_alias)
- [ ] Step 2: Scrape 4 Yahoo pages for this team
- [ ] Step 3: Extract MLB-specific features (9 features; see template.md)
- [ ] Step 4: Load prior_profile.posterior as archetype_prior (sequential update)
- [ ] Step 5: Invoke opponent-archetype-classifier with 10-archetype MLB taxonomy
- [ ] Step 6: Compute cat_strength (0-100 per cat) from roster composition
- [ ] Step 7: Read existing context/opponents/<slug>.md; identify manual-notes sections
- [ ] Step 8: Write updated file atomically (preserve manual notes)
- [ ] Step 9: (at end of batch) Emit signals/wkNN-opponent-profiles.md summary

ステップ1:チームを特定する

入力は、単一のteam_name(大文字と小文字を区別せず、Yahooの標準チーム名に対してあいまい一致)またはall_opponents: true(ユーザー自身のteam_idを除き、team_ids 1~12を順に処理)のいずれかです。team_idとteam-slug(小文字化し、ハイフンで区切った形式)を対応付けます。

  • team_nameがいずれのYahooチームにも一致しない場合は、エラーを返します。推測してはいけません
  • team-slugは、ディスク上のcontext/opponents/<slug>.mdのファイル名と一致する必要があります(存在しない場合は新しいファイルを作成します)

ステップ2:Yahooの4ページをスクレイピングする

正確なURLの流れはresources/methodology.mdに記載されています。必要なページは次のとおりです:

  • https://baseball.fantasysports.yahoo.com/b1/23756/teams -- マネージャー、最終ログイン、勝敗
  • https://baseball.fantasysports.yahoo.com/b1/23756/<team_id> -- ロースターと残りのFAAB
  • https://baseball.fantasysports.yahoo.com/b1/23756/<team_id>/draftresults -- ドラフト指名の分布
  • https://baseball.fantasysports.yahoo.com/b1/23756/transactions?tid=<team_id> -- 追加、放出、入札、トレード
  • 引用できるよう、各スクレイピングで正確なURLをsource_urlsに記録します
  • いずれかのページで4xx/5xxまたは認証エラーが返された場合は、適切に処理を縮退させます(ガードレール#3を参照)

ステップ3:MLBの特徴量を抽出する

スクレイピングしたページから計算します。正確な計算式についてはresources/methodology.mdを参照してください。

  • sp_roster_share、closer_count、sb_speed_count、power_bat_count(ロースター構成)
  • moves_per_week、faab_spent_pct、faab_avg_bid(ウェーバー活動)
  • lineup_set_daily(bool -- 過去7日間に、ベンチ入りしているがMLBで出場中の選手がいたか)
  • trade_offers_sent、trade_offers_received
  • record_last_2_weeks、days_since_last_login

ステップ4:事前分布を逐次更新する

prior_profile.posterior(指定されている場合)を読み込み、分類器にarchetype_priorとして渡します。これが逐次ベイズ更新の要点です。先週の事後分布を今週の事前分布として使用します。

  • prior_profileがない場合は、分類体系の事前分布を使用します(第1週のみ)
  • prior_profile.posteriorの合計が1.0でない場合は、正規化し、assumptions_flaggedにフラグを立てます
  • 観測の重みは週数に応じて大きくなります:Wk1-2 = 0.25、Wk3-4 = 0.45、Wk5-7 = 0.65、Wk8-11 = 0.80、Wk12+ = 0.90

ステップ5:opponent-archetype-classifierを呼び出す resources/template.md の 10 種の MLB 分類体系を、観測された特徴、事前分布、observation_weight とともに渡します。このスキルでベイズ計算を再実装しないでください。 分類器は posterior、map_archetype、classification_confidence、best_response_hints、feature_contribution_breakdown、assumptions_flagged を返します。

  • correlated_feature_pairs を渡します(ガードレール #1 を参照)
  • 分類器が map_archetype: "inconclusive" を返した場合、信頼度は返された値のまま、分類を unknown として記述します
  • 分類器の出力を上書きしたり、再解釈したりしないでください。そのまま保存します

ステップ 6:cat_strength を算出する(猫ごとに 0~100)

分類器は分類を返します。猫ごとの 10 個の強さスコアは、別のロスター基準の推定器から取得します(これは MLB 固有のもので、このスキル内に残します)。手法については resources/methodology.md を参照してください。

  • ロスター全体で、各猫の予測シーズン合計を合算します
  • 50 をリーグ平均として、0~100 に正規化します
  • スコアが 35 未満の猫を presumed_punts として導出します
  • スコアが 65 を超える猫を likely_pushes として導出します

ステップ 7:既存ファイルを読み込み、手動メモのセクションを特定する

重要:このスキルが手動で作成されたメモを上書きすることはありません。 resources/methodology.md を参照してください。

  • context/opponents/<slug>.md を開きます。存在しない場合は、テンプレートから新しいファイルを出力します
  • セクション 1(概要)、5(明らかな弱点/強み)、6(最善の対応)、8(反応トリガー)、9(未解決の質問)をそのまま保持します
  • 更新するのは、フロントマター(last_updated、confidence、source_urls)、セクション 2(分類)、セクション 3(カテゴリの強さ)、セクション 4(行動)、セクション 7(対戦履歴――対戦したことがある場合)のみです

ステップ 8:ファイルをアトミックに書き込む

  • 一時ファイル <slug>.md.tmp に書き込み、fsync してから rename します
  • rename の前に、出力のフロントマターとセクション順序が yahoo-mlb/context/frameworks/opponent-profile-schema.md に準拠していることを検証します

ステップ 9:シグナルファイルを出力する

(all_opponents: true モードの場合)11 件すべての更新が完了した後、signals/wkNN-opponent-profiles.md を出力します。形式については resources/template.md を参照してください。

  • 前週から 0.05 を超えて変化した分類の事後確率をすべて含めます
  • 0.10 を超える信頼度の変化をすべて含めます
  • 今週発生した反応トリガーのイベントをすべて列挙します

よくあるパターン

パターン 1:inactive(休眠中のマネージャー。例:Jenny's Team)

  • シグナル:moves_per_week < 0.5、faab_spent_pct < 0.05、days_since_last_login > 3、または lineup_set_daily = false
  • 最善の対応:N 人の入札者による FAAB 推定には含めません。戦力を集約するトレードを提案します。ロースターが衰えていくことを想定し、週ごとのラインナップ放置による優位性を活用します。
  • 確信度は急速に高まります:非アクティブ状態は明白です。第 4 週までに archetype_confidence が 0.80 を超えると予想されます。

パターン 2:punt_wins_qs(Marmol 戦略。打者のみ+RP のみの投手陣)

  • シグナル:sp_roster_share < 0.25、closer_count >= 3、moves_per_week > 3(打者の成績を狙って入れ替えを繰り返す)
  • 最善の対応:K と QS を譲り(2 カテゴリーを労せず失います)、残り 8 カテゴリーのうち 6 つを押さえます。相手に対して SP をストリーミングしないでください。

パターン 3:punt_sv(クローザー不在、エリート SP+打者陣)

  • シグナル:closer_count = 0、sp_roster_share > 0.40、ラウンド 1~3 で上位の SP を指名
  • 最善の対応:SV を譲り、打者の 5 カテゴリー+K+QS+ERA+WHIP をすべて狙います。ストリーマーとしてクローザーを追い求めないでください。

パターン 4:frustrated_active(アクティブだが負けが込んでいる。トレードに前向き)

  • シグナル:moves_per_week > 4 かつ record_last_2_weeks の W% < 0.35
  • 最善の対応:絶好のトレード相手です。オファーに応じてくれるでしょう。調子を落としているスター選手を狙います(相手には高値で売り、こちらは安値で買います)。

パターン 5:balanced(デフォルト)

  • シグナル:明確に捨てているカテゴリーはなく、すべての特徴においてロースター構成がリーグ平均の標準偏差 1 以内
  • 最善の対応:カテゴリーごとに対抗します。勝負は週ごとの実行力で決まります。アンダードッグの場合(matchup_win_probability < 0.40)、分散を狙います。

ガードレール

  1. 分類器への委譲を徹底すること。 このスキルでベイズ計算を実装してはいけません。事後確率、尤度、正規化の計算を始めたら、そこで中止してください。それらは opponent-archetype-classifier の担当です。このスキルが担うのは、分類体系(MLB固有)、特徴量の抽出(Yahoo固有)、出力形式です。「cat_strength のために予測シーズン合計を合算する」以上の計算は、問題の兆候です。

  2. 手動メモの保持は絶対条件です。 ユーザーは、戦略的なメモを含むセクション1、5、6、8、9を手作業で作成します。このスキルでは再現できないメモもあります(例:「Jenniferのメールは不達だったため、DMで探りを入れるよう提案する」)。これらのセクションを無条件に上書きすると、ユーザーの作業が失われます。必ず読み取り・変更・書き込みの順に行ってください。コミット前に差分を検証し、変更箇所がフロントマターとセクション2、3、4、7だけであることを確認してください。

  3. スクレイピング失敗時は適切に対処すること。 Yahooページが4xx/5xxを返した場合、またはセッションが認証されていない場合、推測してはいけません。該当する特徴量を null とし、失敗したURLをフロントマターの scrape_errors: ブロックに記録し、confidence を0.2下げてください。信頼度を下げた状態でも、プロフィールは出力してください。部分的なプロフィールのほうが、プロフィールがないより適切です。

  4. 逐次更新の原則を守ること。 先週の事後確率は、今週の事前確率になります。毎週必ずそうしてください。分類体系の事前確率から再開してはいけません(それでは1~4週間分の証拠が失われます)。例外は、prior_profile.confidence < 0.20 の場合です。そのときは最初からやり直してください(事前プロフィールの信頼性が実質的に失われているためです)。

  5. 相関する特徴量を適切に扱うこと。 moves_per_week と faab_spent_pct は強く相関しています(積極的なマネージャーは両方を行います)。分類器に correlated_feature_pairs を渡し、過大評価を抑えてください。同様に、sp_roster_share と closer_count も相関します(ロスター枠の制約により、互いにトレードオフの関係にあります)。

  6. アーキタイプから cat_strength を作り出さないこと。 cat_strength は、アーキタイプから導き出すものではなく、実際のロスター構成に基づく独立した推定値です。外野手層の薄い balanced チームは、平均を下回るSBになります。「balanced なら全項目が50台」という前提を引き継いで、その事実を覆い隠してはいけません。ロスターに基づいて計算してください。

  7. アーキタイプの unknown は有効です。 classification_confidence が40未満の場合、分類器の出力を反映した archetype_confidence とともに archetype: unknown と記述してください。証拠が乏しいのにMAPを無理に確定してはいけません。下流のエージェントは、unknown の場合、広範なヒューリスティックにフォールバックします。

  8. 引用を必須とすること。 出力するすべてのプロフィールで、正確なYahoo URLを source_urls に列挙してください。週間シグナルファイルには、全11チームのすべてのURLを記載してください(チームページのURLは重複を除いてください)。

  9. 単一チーム更新と全対戦相手モードを区別すること。 単一チームの更新(トレードオファーの到着時、またはFAAB競争の観察時)では、プロフィールファイルだけを出力し、週間サマリーシグナルは出力しません。週間サマリーシグナルは、11チームすべての更新が完了した後にのみ出力します。

  10. チームのスラッグは固定すること。 スラッグはチーム名を小文字にし、ハイフンでつないだもので、シーズン中は変更しません(例:jennys-team、springfield-isotopes)。マネージャーがシーズン途中でチーム名を変更しても、元のスラッグを維持し、フロントマターの team_name に新しい名前を保存してください。ファイル名を変更してはいけません(下流エージェントの参照が切れてしまいます)。

クイックリファレンス

パイプラインのワンライナー:

scrape_yahoo(4_pages) -> extract_mlb_features -> invoke(opponent-archetype-classifier,
  taxonomy=mlb_10_archetype, prior=last_week_posterior, observation_weight=f(week))
  -> compute_cat_strength(roster) -> read_existing_md -> merge_preserve_notes
  -> atomic_write -> [if all_opponents] emit_weekly_signal

MLBの10アーキタイプ分類(組み込み済み):

アーキタイプ主なシグナル事前確率(第1週)
balancedカテゴリを放棄せず、すべてのカテゴリで競う0.25
stars_and_scrubsエリート選手4~5人+控えの穴埋め選手0.10
punt_svクローザーなし、ほかのポジションを充実させる0.10
punt_sb長打力重視の打線0.10
punt_wins_qsSPが手薄で、RPが多い(Marmol)0.05
hitter_heavysp_roster_share < 0.300.10
pitcher_heavysp_roster_share > 0.450.10
inactive移動なし、ラインアップが更新されていない0.10
frustrated_active移動が多く、成績は負け越し0.05
unknown判定基準では結論が出ない0.05

事前確率の合計は1.00です。12チーム制の基本発生率を基準とするガードレールに従い、一様分布ではなく、知見に基づく値を設定しています。

観測の重み付けスケジュール:

週重み根拠
1~20.25ドラフトのみの情報で、ノイズが多い
3~40.45最初のウェイバー情報が見える
5~70.65傾向が安定し始める
8~110.80行動パターンが十分に把握できる
12+0.90残る疑いは真の曖昧さによるもの

主なリソース:

  • resources/template.md:MLBの10アーキタイプ分類のYAML(分類器に渡します)、対戦相手ごとの.md出力テンプレート(opponent-profile-schema.mdに準拠)、週次サマリーのシグナルテンプレート。
  • resources/methodology.md:YahooのスクレイピングURLの流れ、特徴量抽出の計算式、cat_strengthの推定方法、読み取り・変更・書き込みのプロトコル、逐次更新のプロトコル、段階的縮退処理。
  • resources/evaluators/rubric_mlb_opponent_profiler.json:10項目の品質基準(分類の完全性、特徴量抽出の正確性、Yahooスクレイピングの網羅性、分類器への委任の純粋性、出力スキーマへの準拠、手動メモの保持、逐次更新の正確性、シグナルファイルの出力、スクレイピング失敗時の適切な処理、出典)。

必要な入力:

  • team_name(文字列、単一チーム)またはall_opponents: true
  • yahoo_session(認証済みChromeコンテキスト)
  • prior_profile(任意。指定がない場合は、分類の事前確率から初期化)

生成される出力:

  • 更新済みのcontext/opponents/<team-slug>.md(更新したチームごとに1つ)-- 手動メモは保持されます
  • signals/wkNN-opponent-profiles.md(all_opponentsモードの場合のみ)-- アーキタイプの変化、確信度の変化、反応性イベントのサマリー

下流の利用者(5つのエージェント):

  • mlb-lineup-optimizer -- leverage_vs_opponentのために§3のcat_strengthと§6のbest_responseを読み取ります
  • mlb-category-state-analyzer -- 対戦相手が重視・放棄するカテゴリを予測するために§2のアーキタイプと§3を読み取ります
  • mlb-faab-sizer -- N入札者の推定のために、全11チームの§4(waiver_aggression、faab_remaining)を読み取ります
  • mlb-trade-analyzer -- §4(trade_propensity、trade_cooperation_score)と§5の弱点を読み取ります
  • mlb-fantasy-coach -- 朝のブリーフィングのために、その週の対戦相手の§6を読み取ります

コメント