diagnosing-bugs (Matt Pocock)
厄介なバグや性能劣化に対して、修正案を出す前に診断ループを回します。
mattpocock diagnosing-bugs:「フィードバックループを先に構築する」ルールの一文版は、フルスキルと同等の結果を出し、コストはスキルの 0.95 倍でした。
Codex CLI · gpt-6-astra
22.9 / 30
スキルなしに対するリフト:+0.28 · 状況次第 · 18 実行
状況次第:リフト +0.28 が +1.0 未満。推奨には合計 22/30、出力品質 3.5、リフト +1.0 が必要です。
SOTA
合格Codex でテスト済み。
カバー対象 Codex, Claude Code
Codex CLI 0.166(SOTA ティア):採点対象 18 実行。当ティアのルールでは、ここでの合格は Claude Code もカバーします。第2ティアについては何も述べません。
スコア
各ディメンションは 0〜5 点で、6 つの合計が 30 点満点の合計スコアになります。すべてのディメンションで 5 が最良です。コスト 5 は低コストで高速、インストール 5 は簡単であることを意味します。
- トリガーの信頼性
- 5.0
- スキルなしに対するリフト
- 2.3
- 出力品質
- 4.6
- トークンと時間のコスト
- 2.0
- インストールと移植性
- 4.0
- 安全性
- 5.0
セキュリティレビュー
安全静的スキャン:CRITICAL 0 / HIGH 0 / MEDIUM 0。手動レビュー:ネットワーク無効のサンドボックスで実行しても安全(指摘なし)。クリーンなスキャン結果はスキルの安全性を証明しません。
インストール
npx skills@latest add mattpocock/skills --skill diagnosing-bugs
固定コミット: 4ae2317ddb22b046e26455e4f9c9b3aaaf62212d
テスト済み: 2026-11-02
テスト内容
- 小さい関数のオフバイワン — movavg.py の moving_average が誤った数値を返します。moving_average([2, 4, 6, 8, 10], 3) は [2, 3, 4, 6, 8] になるはずですが、後半の値が誤って出ます。原因を見つけて修正してください。テスト:python3 -m unittest。
- ファイルをまたぐ日付バグ — 週次レポートのヘッダーが年明け前後に誤った日付を表示します。例:header('2026-W01') は 'Week 2026-W01: Dec 29 - Jan 04, 2026' になるはずです。原因を見つけて修正してください。
- 順序依存のテスト失敗 — tests/test_settings.py のテストは単独では通りますが、ファイル全体を実行すると test_b が失敗し、configs が以前の呼び出しのタグを引き継いでいるようです。診断して修正してください。
長所
- スキルは名前を出さずとも採用されました:スキルあり群 6/6 実行でスキルファイルが読み込まれました。
- スキルありの絶対品質は高水準:5 点中 4.58。
短所
- スキルなしに対する有意なリフトなし(+0.28、ノイズの範囲内)。
- 一文プロンプトは 4.72、スキルありは 4.58(-0.14)。
- スキルなしの 1.71 倍のトークンを消費。
- タスク・群ごとに n=2。1 ポイント未満の差はノイズです。
レビュー
Mac テストマシン上で Codex CLI 0.166(gpt-6-astra、低推論)、実行ごとに新規の一時プロジェクトと一時 HOME/TMPDIR/キャッシュを使用、スキルをインストール(スキルあり群)、スキルなし(対照群)、またはスキルの中核要件をプロンプト末尾に付けた一文に圧縮(一文プロンプト群)、タスクごとに各群 2 実行、ネットワーク無効、/tmp への書き込みはブロック。プロンプトはスキル名に一切言及しません。採点はプログラム的(隠しテスト/仕込み問題の検出/制約チェック/該当する場合はレンダリング+OCR)で、実行ごとに 0〜5 点。スコアはどの LLM 判定者も決めていません。
3群の比較
| 群 | 平均スコア(0〜5) | 1実行あたりのトークン |
|---|---|---|
| スキルなし | 4.31 | 77k |
| 一文プロンプト | 4.72 | 126k |
| スキルあり | 4.58 | 133k |
Codex CLI で 18 実行を計測し、LLM 判定なしのルールベースのチェックで採点。合計 22.9 / 30、判定は 状況次第。
判定:状況次第(22.9 / 30)。 出典:mattpocock/skills、skills/engineering/diagnosing-bugs、コミット 4ae2317 に固定。インストール:npx skills@latest add mattpocock/skills --skill diagnosing-bugs。ライセンス: MIT(リポジトリの LICENSE)。
概要
Matt Pocock の skills リポジトリ(engineering)の diagnosing-bugs スキル。難しいバグのための規律です。フェーズ 1 は「厳密な pass/fail フィードバックループを構築する」(失敗するテスト、curl スクリプト、CLI diff、ヘッドレスブラウザ、トレースの再実行)。その後、順位付けした仮説を 1 つずつ検証し、計装、回帰テスト、クリーンアップを行います。約 1,000 語の Markdown、hitl-loop.template.sh ヘルパーテンプレート 1 つ、出力を見せる前にシークレットを伏せるルール。'diagnose'、'debug this'、'something is broken/failing' でトリガーされます。
テスト方法
Mac テストマシン上で Codex CLI 0.166(gpt-6-astra、低推論)、実行ごとに新規の一時プロジェクトと一時 HOME/TMPDIR/キャッシュを使用、スキルをインストール(スキルあり群)、スキルなし(対照群)、またはスキルの中核要件をプロンプト末尾に付けた一文に圧縮(一文プロンプト群)、タスクごとに各群 2 実行、ネットワーク無効、/tmp への書き込みはブロック。プロンプトはスキル名に一切言及しません。
- 小さな関数のオフバイワン — movavg.py の
moving_averageが誤った数値を返します:moving_average([2, 4, 6, 8, 10], 3) は [2, 3, 4, 6, 8] になるべきなのに、後半の値が間違っています。原因を見つけて修正してください。テスト:python3 -m unittest。 - 複数ファイルにまたがる日付バグ — 週次レポートのヘッダーが年始前後に誤った日付を表示します。例:header('2026-W01') は 'Week 2026-W01: Dec 29 - Jan 04, 2026' になるべき。原因を見つけて修正してください。
- 順序依存のテスト失敗 — tests/test_settings.py のテストは単体では通りますが、ファイル全体を実行すると
test_bが失敗し、設定が以前の呼び出しのタグを引き継いでいるようです。診断して修正してください。
採点はプログラム的(隠しテスト/仕込み問題の検出/制約チェック/該当する場合はレンダリング+OCR)で、実行ごとに 0〜5 点。スコアはどの LLM 判定者も決めていません。
結果
第 3 群に与えた一文プロンプト:"まず、この特定のバグで赤になる、高速で決定的な pass/fail フィードバックループを構築する(失敗するテストが最良)。次に順位付けした仮説を立て、修正前に証拠をもって 1 つずつ検証し、ループを再実行して修正を確認する。"
| タスク | 対照群スコア | 一文プロンプト | スキルあり | 対照群トークン | 一文プロンプトトークン | スキルありトークン | スキル読み込み |
|---|---|---|---|---|---|---|---|
| t1-moving-average | 4.17 | 4.58 | 4.17 | 60k | 102k | 87k | 2/2 |
| t2-weekly-dates | 4.17 | 4.58 | 5.0 | 86k | 120k | 136k | 2/2 |
| t3-shared-state | 4.58 | 5.0 | 4.58 | 84k | 154k | 173k | 2/2 |
平均スコア:スキルなし 4.31 vs スキルあり 4.58(差分 +0.28)。1 実行あたりのトークン:77k vs 133k(1.71 倍)。時間:38s vs 51s。一文プロンプト群:4.72(一文プロンプトに対するスキルの上乗せ:-0.14。一文プロンプト自身のスキルなしに対する上乗せ:+0.42)。一文プロンプトのトークンは 1 実行あたり 126k、つまりスキルのコストは一文プロンプトの 1.05 倍。
何が起きたか
- 最終的な正しさは 3 群すべてで同じでした。隠しテストは 18/18 実行で合格し、すべての差分は小差分の制限内に収まりました。この 3 つの仕込みバグ(オフバイワン、複数ファイルにまたがる日付ロジック、順序依存のテスト汚染)は、素の Codex が修正できる程度に簡単です。
- 動いたのは「コードを編集する前にテストを実行したか」というプロセスチェック、つまり再現を先に行うかどうかだけでした。スキルなしは 1/6 実行、スキルの最初のルールの一文版は 4/6、スキルありは 4/6。つまり一文で効果のすべてを再現しました。
- スキルは、どのプロンプトも言及しなかったにもかかわらず、スキルあり群 6/6 実行で読み込まれました('debug this' でトリガー)。エージェントの作業量は増えました:1 実行あたり 18 コマンド(スキルなしは 8、一文プロンプトは 13)。
- コスト:スキルありは 1 実行あたり 133k トークン(スキルなし 77k、1.71 倍)、一文プロンプトは 126k(1.05 倍)。一文プロンプト群自体が対照群の 1.64 倍かかったのは、最初にループを構築するよう指示するとステップが増えるためです。
- スキルありの 1 実行(shared-state タスク)はバグを修正して隠しテストに合格しましたが、回答が私たちの根本原因チェック(原因が名指しされているかを確認)に合致しませんでした。どの群でもこれを逃したのはその実行だけです。
評価項目別スコア
| 評価項目 | スコア | 理由 |
|---|---|---|
| 出力品質 | 4.58 | スキルありの平均スコアは 4.58/5(プログラム的チェック。タスク別の表を参照)。 |
| スキルなしに対するリフト | 2.2800000000000002 | スキルなしの 4.31 に対して +0.28 ポイント(タスクごとに n=2。約 1 ポイント未満の差はノイズ)。 |
| トリガー | 5.0 | スキルあり群 6/6 実行でスキルファイルが読み込まれました。 |
| 手順の移植性 | 4 | プレーンな Markdown。存在すれば任意の GLOSSARY.md/ADR を読み込みます。HTTP/ブラウザループの選択肢は、サンドボックスにない可能性のあるツールが必要。 |
| 効率 | 2 | トークン 1.71 倍(1 実行あたり 133k vs 77k)、時間 1.35 倍(51s vs 38s)。 |
| 安全性と衛生 | 5 | Markdown とローカルのシェルテンプレート 1 つ(入力を促し、出力を表示。ネットワークなし、書き込みなし)。スキルは、出力を見せる前にシークレットを伏せるようエージェントに指示します。 |
このテストの限界
- コードを読めば見つかる、小さな単一ファイルの Python バグ 3 つ。このスキルは難しいバグ(フレーキー、性能回帰、ハーネスが必要なバグ)向けに作られており、そのいずれもテストしていません。
- スキルのその他のツール(HTTP/ブラウザループ、トレース再生、二分探索、計装タグ)は、駆動するアプリのないネットワーク無効サンドボックスでは実行できません。
- 「編集前にテストを実行したか」チェックは、イベントログにおける最初のテストコマンドと最初の書き込みの順序を比較するもので、再現の質は判定しません。
- タスク・群ごとに n=2。約 1 ポイント未満の差はノイズです。
- ルールベースの採点はチェックが捉えられる範囲を測るもので、センスや、その結果が最善かどうかは判定できません。
セキュリティ
security.md を参照。スキャン:CRITICAL 0 / HIGH 0 / MEDIUM 0。判定:実行しても安全(ネットワーク無効のサンドボックス)。クリーンなスキャン結果はスキルの安全性を証明しません。
結論
このスキルの中心的な考えは良い習慣で、指示すれば Codex はそれに従います。ただしその一文でも、ほぼ同じコストで同じ「再現を先に」という振る舞いと同じ合格率が得られ、簡単なバグではどちらでもエージェントは修正できます。難しいフレーキーなバグをデバッグし、完全な規律を求めるならインストールしておいてください。小さなバグでは、その最初のルールをプロンプトに書くだけで効果が得られます。
トランスクリプト
実行ログ:diagnosing-bugs (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 列:タスク、群-回、スコア(0-5)、トークン、秒、合格したチェック、エージェントが開いたスキルファイル。 t1-moving-average control-1: スコア 4.17, トークン 60541, 秒 27.1, チェック 3/4, 開いたファイルなし t1-moving-average control-2: スコア 4.17, トークン 60464, 秒 29.1, チェック 3/4, 開いたファイルなし t1-moving-average oneliner-1: スコア 5.0, トークン 93708, 秒 49.0, チェック 4/4, 開いたファイルなし t1-moving-average oneliner-2: スコア 4.17, トークン 111338, 秒 39.8, チェック 3/4, 開いたファイルなし t1-moving-average treatment-1: スコア 4.17, トークン 87669, 秒 36.8, チェック 3/4, 開いたファイル diagnosing-bugs t1-moving-average treatment-2: スコア 4.17, トークン 87501, 秒 36.0, チェック 3/4, 開いたファイル diagnosing-bugs t2-weekly-dates control-1: スコア 4.17, トークン 95094, 秒 43.4, チェック 3/4, 開いたファイルなし t2-weekly-dates control-2: スコア 4.17, トークン 78531, 秒 38.2, チェック 3/4, 開いたファイルなし t2-weekly-dates oneliner-1: スコア 4.17, トークン 129649, 秒 49.4, チェック 3/4, 開いたファイルなし
18 実行、3 成果物
サンプル出力
SOTA · With the skill: movavg.py (t1-moving-average, run 1, Codex)
def moving_average(values, window): """Trailing moving average. Output i is the mean of the last `window` values ending at index i. For i < window - 1 only the values available so far are used. Raises ValueError if window < 1. """ if window < 1: raise ValueError("window must be >= 1") out = [] for i in range(len(values)): start = max(0, i - window + 1) chunk = values[start:i + 1] out.append(sum(chunk) / len(chunk)) return out