cEDH プレイグループ は何をしますか?
このスキルは、1つのcEDHプレイグループの小さな手動編集可能な記録を保持し、それをTopDeck.ggのトーナメントデータと組み合わせます。主な役割は4つあり、さらにその結果をグループのDiscordに投稿します:
- プレイヤー: TopDeckのプロフィールIDを使ってプレイヤーとその所有デッキを追加します。
- メタ: 過去30日間の使用率と勝率をデフォルトで表示します。
- 入力: 練習結果、現在のデッキ、メモ、参加可否を記録します。
- ポッド: グループが有意義な練習を得られるように席を配置します。
すべての計算は scripts/ 内のPythonスクリプト(stdlibのみ使用)で行われます。あなたの仕事はそれらを実行し、出力を読み、グループが活用できるアドバイスに変換することです。統計を手動で再計算しないでください。スクリプトがエッジケース(パートナー名、引き分け、少数サンプル)を処理します。手動で行うと異なる答えが出るリスクがあります。
セットアップとファイルの場所
- スクリプト: このファイルと同じ階層の
scripts/。python <skill-dir>/scripts/<name>.py ...で実行します。 - データ:
~/cedh-playgroup/(環境変数CEDH_PLAYGROUP_DIRで上書き可能)。roster.json,games.json,notes.json,availability.json、およびcache/tournaments.json(TopDeckから取得したデータ)があります。これらはプレーンなJSONなので、ユーザーに表示したり手動で編集させても問題ありません。 - TopDeck APIキー: 環境変数
TOPDECK_API_KEY。https://topdeck.gg/account で無料で取得できます。もしキーがない場合はその旨を伝え、設定方法を説明してください。ユーザーにチャットにキーを貼り付けさせないでください。
帰属はTopDeck APIの条件です。 トーナメントデータを使用するすべての回答の最後に次の文を付けてください:*トーナメントデータ提供:TopDeck.gg (https://topdeck.gg)*。スクリプトがこれを出力します。要約する際も保持してください。
最新性:まず同期
TopDeckには「プレイヤーXの結果」を取得する専用エンドポイントはありません。sync.py は指定された期間内の終了したすべてのEDHトーナメントを取得し、プレイヤーとメタの統計はすべてそのキャッシュから得られます。メタレポート、プレイヤースタッツ、ポッド編成の前に、キャッシュの古さを確認してください(cache/tournaments.json 内の synced リスト)。約1日以上古い場合、または必要な期間をカバーしていない場合は、同期を実行します:
python scripts/sync.py # 過去30日間、1週間ごとに取得
python scripts/sync.py --days 60 # メタの「変化率」トレンド列に必要
python scripts/sync.py --import saved_response.json # オフライン/テスト用
一括エンドポイントにはレート制限があります。スクリプトはHTTP 429で自動的にバックオフするので、そのまま実行させてください。30日間の同期には1〜2分かかることがあります。
1. プレイヤー
python scripts/playgroup.py add-player "Eric" --topdeck https://topdeck.gg/profile/<id> --deck kinnan
python scripts/playgroup.py set-decks "Sam" --deck najeela --deck "tymna kraum" --primary najeela
python scripts/playgroup.py set-decks "Lee" --deck "magda" --add # 上書きせずに追加
python scripts/playgroup.py set-decks "Jo" --deck glarb --gauntlet-pilot yes
python scripts/playgroup.py remove-player "Max"
python scripts/analyze.py players # 全員表示、もしくは: players Eric Sam
--topdeckはプロフィールリンク(topdeck.gg/profile/<id>またはtopdeck.gg/profile/%40handle)、@ハンドル、またはIDそのものを受け付けます。トーナメント結果は生のプレイヤーIDのみを認識するため、スクリプトはプロフィールページを開き、そのplayer-idメタタグからIDを読み取ります。見つけたTopDeck表示名を出力します。その名前がユーザーが意図した人物と異なる場合、その旨を伝えてください。ルックアップが失敗した場合(オフラインなど)、指定されたものを保存し警告を出します。後でプレイヤーを再追加して統計が一致するようにしてください。ユーザーが名前だけを指定した場合、TopDeckプロフィールリンクを尋ねてください。表示名でのマッチングは同姓の他人を拾う可能性があります。- 統率者名はTopDeckの表記に曖昧マッチングされます("tymna kraum" → "Tymna the Weaver / Kraum, Ludevic's Opus")。スクリプトは選択したマッチを出力します。代替案がリストされた場合は、ユーザーに確認してください。
playgroup.py resolve <name>で名前をチェックして保存せずに確認できます。 - ガントレットパイロットは、自分のデッキではなくグループの共有デッキの1つを使う意思があるプレイヤーです。これにより、誰も所有していないトップメタデッキがポッドに登場できるようになります。
- 期間内にTopDeckのイベントがゼロのプレイヤーでもエラーではありません。単に追跡対象イベントに最近参加していないだけです。より多くの履歴が必要な場合は
sync.py --days 90を提案してください。
プレイヤーを報告する際は、練習に役立つ情報を先頭に持ってきてください:現在のデッキ、最近の成績(戦績と順位)、および練習記録の内容。表をそのまま表示するだけではいけません。
2. メタレポート
python scripts/analyze.py meta # 30日間、16名以上参加イベント、トップ25
python scripts/analyze.py meta --days 14 --min-players 32 --top 15
python scripts/analyze.py matchups "kinnan" # このデッキの得意/不得意な相手
python scripts/analyze.py matchups --player Eric # 特定プレイヤーの自分のテーブルからのデータ
列:エントリー数、メタシェア、前回同期間との変化率、勝率、引き分け率、トップカット進出率、最高順位。
メタの3つの視点。 質問に応じて適切なものを選ぶか、ユーザーが単に「メタはどう?」と尋ねた場合はローカルとビッグを並べて表示します:
| 視点 | コマンド | 回答内容 |
|---|---|---|
| ローカル | meta --local | グループが実際に直面するもの:保存された拠点からの距離内のイベント(全サイズ)、過去30日間 |
| ビッグイベント | meta --big | 大規模トーナメントで勝っているもの:100名以上、場所を問わず、過去90日間(稀) |
| グローバル | meta | TopDeck上の16名以上参加の全イベント |
拠点エリアと「ビッグ」の閾値は playgroup.py home --zip 18201 --miles 100 --big-min 101 で一度設定するか、--zip Z --miles M で一回限り指定します。ローカルビューはTopDeckのイベント座標を使用します。オンラインイベントや場所不明のイベントは位置特定できず、レポートにはその数が表示されます。ローカルサンプルは小さいため、シェアは「出現率」、勝率は「参考値」として扱います。ローカルとビッグで結果が異なる場合、それが有用な情報です:ローカルでは人気でもビッグイベントでは弱いデッキ、あるいはビッグイベントで勝っているが近くで誰も使っていないデッキなど。pods.py --local または --big により、「トップメタに立ち向かう」という目標でその視点を使用します。
数値を印刷するより、それをどう読み解くかが重要です:
- 勝率は4人戦の数値です。 平均は約25%で、引き分けが含まれるとさらに低くなります。レポートは期間内の観測平均を出力します。30%のデッキは非常に強いです。勝率を50%に対して評価しないでください。
- 少数サンプルは誤解を招きます。 約20エントリー未満、または
matchupsで約10テーブル未満の場合は、数値を「参考値」として扱い、「確定」とは言わないでください。 - 人気(シェア)と強さ(勝率、トップカット進出率)は異なる質問です。シェア以上に成績が良いデッキや、人気なのにトップカット進出率が低いデッキを指摘してください。
--min-players 16は小規模ローカルイベントをメタビューから除外します。ユーザーが地域の状況を尋ねた場合は、この閾値を下げてください。- グループ自身の
notes.jsonも関連する場合は引用してください(「最近LGSでMagdaが多いとメモにありますが、グローバルでも2%増加しています」)。
回答は次のように構成します:3〜5個の箇条書きの重要なポイント、次に表(重要なものに絞る)、最後にそれがこのグループの練習にとって何を意味するか(例:「誰もNajeelaを所有していませんが、使用率3位です。ガントレット用に1コピー用意する価値があります」)。
3. 入力:結果、デッキ、メモ、参加可否
python scripts/playgroup.py log-game --date 2026-11-08 \
--seat "Eric=Kinnan" --seat "Sam=Najeela" --seat "Lee=Tymna Kraum" --seat "Kim=Yuriko" \
--winner Sam # または --winner draw; ターン順不明なら --no-order を追加
python scripts/playgroup.py note "最近LGSでMagdaをよく見かける" --author Eric --tag meta
python scripts/playgroup.py avail 2026-11-08 Eric Sam Lee Kim Jo # --replace で上書き
python scripts/playgroup.py gauntlet-deck add "Najeela" --list <url>
python scripts/playgroup.py show games # roster | games | notes | avail
人々はカジュアルに結果を報告します(「samがnajeelaで勝った、私はleeとkimでkinnan、tymna、yuriko、その後引き分け」)。各ゲームを1回の log-game 呼び出しに変換してください。
席順はターン順です。これは重要です:TopDeckの4人テーブルでは、席1の勝率は約23%、席4は約14%です。--seat はターン順にリストしてください(席1が最初)。報告でターン順が不明な場合は、一度確認してください(「誰が最初でしたか?」)。不明な場合は --no-order で記録します。ゲームは戦績とマッチアップにはカウントされますが、席の統計には含まれません。グループに最適な報告形式を伝えてください。それが全員の席プロフィールに反映されます:G1(ターン順):Eric Kinnan、Sam Najeela、Lee Tymna/Kraum、Kim Yuriko。勝者 Sam。統計に影響する点(誰が勝ったか、誰がどのデッキを使ったかなど)が不明瞭な場合は、記録前に確認してください。記録後は、各ゲームを1行で読み上げて間違いを確認できるようにしてください。
ユーザーが複数のゲームを貼り付けた場合は、すべて記録し、その夜の結果をまとめてください:誰が何に勝ったか、連勝中の記録など。
4. 練習ポッド
今回のセッションに参加する人
毎週参加者が変わるため、ポッドを編成する前に誰が参加するかを確定します。優先順位:
- ユーザーが名前を挙げる(「Jeff以外全員」、「Eric、Ryan、Saige、Alex」)。
- その日付に対してすでに保存されたリスト(
playgroup.py show avail)。 - 質問する。クライアントに選択式質問ツールがある場合は、ロスターをチェックボックスでリストし、名前が多い場合は複数の質問に分割し、日付も尋ねてください。それ以外の場合は1行で質問します。
回答を保存して、ポッド、Discord投稿、後続のレポートで一致させます:
python scripts/playgroup.py avail 2026-11-08 --all --remove Jeff Saige # 全員からJeffとSaigeを除外
python scripts/playgroup.py avail 2026-11-08 Ishmael # 後からの参加を追加
python scripts/playgroup.py avail 2026-11-08 --remove Ryan # 後からの不参加を削除
python scripts/pods.py --date 2026-11-08 # 保存されたリストからポッド編成
python scripts/pods.py --all --except Jeff # 一回限り、保存しない
ポッドを投稿した後にリストが変更された場合は、再編成し、誰が移動したかを伝えてください。すでに自分のポッドを見た人を黙って再配置しないでください。
python scripts/pods.py --date 2026-11-08 # その夜の参加者リストを使用
python scripts/pods.py --players Eric Sam Lee Kim Jo Ana Max
python scripts/pods.py --date 2026-11-08 --focus Eric # Ericの苦手マッチアップを4倍重視
python scripts/pods.py --date 2026-11-08 --deck "Sam=Tymna Kraum" --w-repeat 0
ビルダーは席割りとデッキ選択を検索し、4つの目標でスコアリングします(すべてデフォルトでオン)。目標をオフにするには重みを0に設定し、強調するには値を上げます:
| 目標 | フラグ | 評価する内容 |
|---|---|---|
| トップメタに立ち向かう | --w-meta | 各テーブルにトップNメタデッキを配置(--top-meta 15) |
| バランスの取れたポッド | --w-balance | ポッドごとに平均的な強さを揃える(プレイヤー戦績+デッキ勝率) |
| 重複ペアリングを避ける | --w-repeat | 最近の記録ゲームで同じテーブルに座ったペアを再配置しない |
| 苦手マッチアップを練習 | --w-matchup | プレイヤーが苦手とするデッキと対戦させる(下記参照) |
誰の苦手マッチアップか? 「自分の苦手マッチアップを練習したい」はデッキではなくプレイヤー自身に焦点を当てています。ビルダーは、各プレイヤーの自身のTopDeckテーブルと練習ゲームから、各対戦統率者に対する勝率を推定します。これらのサンプルは小さいため、同じペアリングでのそのデッキのフィールド全体の勝率に縮小します。Rograkh/Thrasiosに対して1勝11敗のパイロットでも、それに対しては弱いままです。たとえKinnanプレイヤーが全体的にはその対戦で好成績でも同様です。マッチアップについて尋ねたプレイヤーのためにポッドを編成する前に、自分でエビデンスを確認してください:
python scripts/analyze.py matchups --player Eric --days 90 # Eric自身のテーブル、全イベントサイズ
python scripts/analyze.py matchups kinnan # デッキのフィールド全体、比較用
この2つが一致しない場合、その点を明確に伝えてください(「一般的にKinnanはNajeelaに対して有利ですが、あなたはSamに対して0勝3敗です」)。これは有益なコーチングです:ギャップはデッキではなくプレイヤーのプレイにあるのです。
席。 ビルダーは各ポッドのターン順も設定します。--seat-mode practice(デフォルト)では、各プレイヤーはその席の通常の勝率に対して自分の戦績が最も弱い席に配置されます。席2で0勝6敗は悪いです。席4で2勝10敗は平均的です。--seat-mode best は得意な席を練習します(例:トーナメント前)。random は単にシャッフルします。プレイヤーごとの席とマッチアップのエビデンス:
python scripts/analyze.py profile # 全員、または: profile Eric Ryan
ポッドの説明:これが重要です。 スクリプトが出力する各席について、プレイヤーのエビデンス数、席の評価(最悪、最高、またはまだデータなし、戦績と席平均との差)、このテーブルでのマッチアップ(「練習が必要 vs …」と「有利 vs …」、自分の戦績とフィールド全体の率)、およびこのテーブルにいない苦手マッチアップを表示します。それを各プレイヤーに対する短いデータドリブンな「なぜ」に変換してください。例:
席1: Alex(Tayam使用)。 席1はAlexの最も苦手な席です(1勝10敗、席1の平均より約7ポイント低い)。そのためここで練習します。また、トーナメントではSisayに対して0勝7敗であり、DarisonのSisayがこのテーブルにいます。Ob Nixilisに対しては有利なので、これは勝つべき相手です。
説明のルール:
- 実際の戦績(1勝10敗、0勝7敗)を引用してください。それらが信頼性を生みます。
- 約6ゲーム未満のデータに依存する場合は「少数サンプル」と述べてください。0勝2敗を過大評価しないでください。
- プレイヤーにデータがない場合(TopDeckリンクなし、記録ゲームなし)、その席は仮置きであり、練習記録が埋めていくと述べてください。理由をでっち上げないでください。
- どのような追加データがあれば精度が向上するかで締めくくってください。ターン順で記録されたすべてのゲームが席とマッチアップの読み取りを改善します。
ポッドのサイズは4人で、余りは3人ポッドにします。5人の場合、1人が抜けてローテーションします。ユーザーが5人ポッドを希望する場合は、それは彼らの判断であり、全員を着席させると伝えてください。出力の「Sitting out」行でローテーションする人を指定します。
各ポッドを、なぜそのように構成されたかを平易な言葉で提示してください:どのメタデッキに直面するか、各プレイヤーが練習するべき苦手マッチアップ、そして避けられなかった重複ペアリング。スクリプトのメモは素材です。ポッドごとに1つか2つの重要なものを選び、すべてを貼り付けないでください。ガントレットデッキが割り当てられた場合は、パイロットにそのことを知らせてください。