Claudeに作業を頼むと、最後に「できました」という報告が返ってきます。何を変えたかの箇条書きと、テストが通ったという一言。読むとほっとして、そのまま次の作業に進みたくなります。
この報告は、たいてい嘘ではありません。それでも、変わったものをすべて説明しているとは限らないという点が、このレッスンの主題です。
報告は本当でも、全部ではないことがある
/diffコマンドは、作業ツリーの変更を、Claudeがここまでに加えた編集も含めてまとめて見せてくれます。報告だけで終わらせず、この差分を自分の目で開く一手間が、見落としを防ぐ最後の砦になります。
見落としがちなパターンは、だいたい3つに絞れます。
本来の依頼とは関係のない箇所が、ついでに書き換わっている
既存のテストがスキップされたり、中身を確かめない形に緩められたりしている
依頼の実現に本当は要らない外部ライブラリや設定値が、静かに追加されている
具体例で確かめる
会議室の予約アプリを想像してください。Claude Codeに「同じ会議室・同じ時間帯の二重予約を防ぐチェックを追加して」と頼みました。返ってきた報告はこうです。
$同じ会議室・同じ時間帯の二重予約を防ぐチェックを追加して二重予約のチェックを追加しました予約が重なっている場合は、注意メッセージを表示するようにしましたテストはすべて通っています
嘘は書かれていません。実際に差分を開くと、こうなっていました。
+import { format } from "moment";
+
function createBooking(room, start, end) {
+ if (hasOverlap(room, start, end)) {
+ throw new Error("この時間帯はすでに予約されています");
+ }
return saveBooking(room, start, end);
}
-test("過去の日付は予約できない", () => {
- expect(() => createBooking(room, pastDate, pastDate)).toThrow();
-});
+test.skip("過去の日付は予約できない", () => {
+ expect(() => createBooking(room, pastDate, pastDate)).toThrow();
+});
-const NOTIFY_EMAIL = "office@example.com";
+const NOTIFY_EMAIL = "kanri-test@example.com";
3つのパターンに当てはめると、こう見えます。新しく増えたものとして、二重予約のチェックには使っていない外部ライブラリが1行増えています。確認が甘くなった箇所として、過去の日付を予約できないことを確かめる既存のテストが、test.skipで無効化されています。頼んでいない変更として、予約通知の送信先が本番のアドレスからテスト用のアドレスに書き換わっています。
どれも報告の3行には出てきません。「テストはすべて通っています」という一文は、スキップされたテストを合格として数えてしまう場合があるという事実まで含めて読むと、印象が変わってきます。
やってみよう
演習1:次の一回を、自分で試す
次にClaudeが変更を報告してきたら、結論を読む前に3つを自問してください。頼んでいない変更はないか。確認が甘くなった箇所はないか。新しく増えたもの(ライブラリ・設定値・環境変数)はないか。実際に/diffを開き、3つそれぞれに「ある/ない」を書き出してみましょう。
演習2:見つけたものを1行に言い換える
見つけた違和感があれば、「〜が変わった」という現象の言い方ではなく、「なぜ気になるか」まで1行で言い換えてみてください。次のレッスンでは、この違和感を直す・尋ねる・置くの3つに仕分ける方法を扱います。
今日のまとめ
3行で振り返ります。
- Claudeの報告は嘘ではないことが多いが、変わったものをすべて説明しているとは限らない
- 見落としがちなパターンは、頼んでいない変更・確認が甘くなった箇所・新しく増えたものの3つに絞れる
- 報告を読んで終わらせず、
/diffで差分そのものを自分の目で確かめる一手間が見落としを防ぐ
次のレッスンでは、差分から見つけた指摘を、直す・尋ねる・置くの3つに仕分けるレビューの習慣を扱います。
セルフチェック
1. 本文の会議室予約アプリの例で、「新しく増えたもの」に当たる変更はどれですか。
2. 報告に出てこない見落としのパターンとして、本文で挙げられた3つの組み合わせはどれですか。
3. 「テストはすべて通っています」という報告について、本文が注意を促している点はどれですか。