FRL 自由研究ラボ

LAB 006 — GUIDE

AIの「できました」を信じない

— 合否を機械に決めさせる —

道具を1つ作ると、次に困るのは「本当に直っているか」です。 AI は作業のあと、たいてい「できました」と言います。けれどそれは報告であって、 確かめた結果ではありません。 この記事では、合否を AI の言葉ではなく機械が出す1つの番号で決める仕組みを作ります。

約45分

全部やる場合の目安

5 STEP

手順の数

0 か 1 か

合否はこれだけで決める

この記事の道順

  1. はじめに — 「できました」は結果ではなく報告
  2. STEP 1 — 合否を「番号」で決める(終了コード)
  3. STEP 2 — 合否を出す小さなテストを作る
  4. STEP 3 — 本物のデータに触らせない
  5. STEP 4 — 合否を AI に採点させない
  6. STEP 5 — テストそのものを疑う
  7. つまずき集(症状から引く)
  8. よくある質問
  9. 次の一歩

※ LAB 000〜 LAB 005 を終えている前提です。特にLAB 000 の「動いた ≠ 正しい」と、 LAB 005 で作った自分専用の道具を使います。

INTRO

「できました」は、結果ではなく報告です

AI に頼んだ作業が終わると、「できました」「修正しました」「テストも通っています」と返ってきます。 それを読んで安心して次へ進む——自然な流れですが、ここに落とし穴があります。

AI は、自分が書いたものを自分で確かめて、自分で「合格」と言っています。 つまり作った人が、そのまま採点もしている状態です。 人間でも、自分の答案を自分で採点すると甘くなりやすいのと同じで、 AI でも同じ偏りが起きやすいと考えて、仕組みで備えます(STEP 4・5 で具体的に出てきます)。

対策は、AI を疑い続けることではありません。 合否を決める役を、AI の言葉から「機械が出す番号」に移すだけです。 機械は毎回同じ基準で、疲れず、言葉に流されずに判定します。

✕ 言葉で決める(自己申告) AI「できました!」 人が信じるかどうか 確かめる手段が無い 本当に直ったかは分からない ○ 機械が決める(終了コード) AI「できました!」 機械がテストを走らせる AI の言葉は関係なし 0 → 合格(完了) 0 以外 → 不合格(やり直し)

これは LAB 000 の 「動いた ≠ 正しい」の続きです。あのときは自分の目で結果を1つ見ることで確かめました。 今回はその確かめ方を、毎回、自動で、同じ基準でやれる形にします。

01

STEP 1 — 目安 5分

合否を「番号」で決める(終了コード)

機械に合否を決めさせる、といっても難しい仕組みは要りません。使うのは、 終了コード(プログラムが終わるときに返す番号)だけです。

Mac のプログラムは、終わるときに必ず番号を1つ返します。 0 なら成功、0 以外なら失敗——これは決まりごとです。 「たぶん大丈夫そう」と判断する余地が入り込みません。

プログラムは、終わるときに番号を1つ返します プログラム(テスト) 終わるとき 番号を1つ返す 0 = 成功(全部通った) 1 など 0 以外 = 失敗 合否が「番号」に落ちるので、人の気分や言い回しが入らない

まず番号を自分の目で見てみます。ターミナル(文字で Mac に命令する画面)に、次の2行を貼って Enter を押してください。 true は「何もせず成功して終わる」命令、 false は「何もせず失敗して終わる」命令、 echo $? は「直前の命令が返した番号を表示する」命令です。

true; echo $?     ← 0 と出る(成功)
false; echo $?    ← 1 と出る(失敗)

なぜ番号なのか:画面に「成功しました」と表示させる方法だと、 その文字を出すのも作った側(AI)になります。番号は、プログラムが実際にどう終わったかで決まるので、 言葉で取り繕えません。

✓ ここまでの確認: 1行目のあとに 0、2行目のあとに 1 と表示された。 「成功は 0、失敗は 0 以外」だけ覚えていれば、次へ進めます。

02

STEP 2 — 目安 15分

合否を出す小さなテストを作る

ここで作るのは自己テストです。 道具を実際に動かして、結果が思ったとおりかを確かめ、 全部合っていれば 0、1つでも違えば 0 以外で終わる小さなプログラムです。 「自動で採点してくれる採点表」だと思ってください。

書くのは AI に頼みます。ただし、どういう形のものが「テスト」なのかを知らないと、 できあがったものが本物かどうか見分けられません。先に、いちばん小さな見本を動かして形を見ておきましょう。

2-1 見本を動かして、❌ と 1 を見る

LAB 001 の要領で Claude Code を起動して、 次の文章をそのまま貼ってください。Python は LAB 000 で動かしたものと同じです。

次のコードを、今のフォルダに _selftest_demo.py という名前で保存して。
保存したら「python3 _selftest_demo.py; echo $?」を実際に走らせて、
画面に出た内容を、省略せずそのまま見せて。

import sys

NG = 0   # 失敗の数


def check(label, cond):
    global NG
    if cond:
        print("  ✅", label)
    else:
        print("  ❌", label)
        NG += 1


check("1 + 1 は 2 になる", 1 + 1 == 2)
check("わざと間違えた例:1 + 1 は 3 になる", 1 + 1 == 3)

sys.exit(1 if NG else 0)   # 失敗が1つでもあれば 1、無ければ 0 で終わる

✅ が1行、❌ が1行出て、最後に 1 と表示されるはずです。 2つ目の項目はわざと間違えてあるので、これでいい。 「落ちるべきときにちゃんと落ちて、番号が 1 になる」ことの確認になっています。

形はこれだけです。check が1項目ぶんの確認で、 条件が合えば ✅、違えば ❌ と数える。最後の sys.exit(...) が番号を返す行です。 本物のテストも、項目が増えるだけで同じ形です。

2-2 自分の道具のテストを頼む

形が分かったら、LAB 005 で作った道具のテストを頼みます。 条件を最初に全部伝えるのがコツです。

この道具を確かめるテストを _selftest.py という名前で作って。
条件:
・全部通れば終了コード0、1つでも違えば0以外で終わること
・画面に「たぶん大丈夫」と書いて終わる作りにしない。必ず終了コードで合否が決まる形にする
・最後に「成功 ◯ / 失敗 ◯」と項目の数も表示する
・私の本物のファイルやノートには触らず、一時フォルダに作った偽のデータで試す
作ったら実際に走らせて、画面の出力と終了コードをそのまま見せて。

項目の数も出させる理由:確かめる項目が0個だと、何も確かめていないのに 終了コードは 0(成功)になります。「全部通りました(12 項目)」のように数が出ていれば、 空っぽのテストにだまされません。

✓ ここまでの確認: ① 見本で ❌ の行と最後の 1 が出た。 ② 自分の道具のテストを走らせると、項目の数と、最後に終了コードが表示される。 落ちた項目があるときは、読んで内容を AI に伝え直すだけで構いません。

03

STEP 3 — 目安 5分

本物のデータに触らせない

テストは何度も走らせます。もしテストが本物のファイルを使って動くと、 テストの途中で失敗したとき、本物の方が壊れることがあります。 確かめるつもりの作業で、大事なものを傷つけては本末転倒です。

そこで、テストは毎回一時フォルダ(走るたびに作り、終わったら消える仮の置き場)に 偽のデータを用意して、そこだけを触らせます。

✕ 本物のファイルを使う テスト 本物のノート・写真 テストが失敗すると、本物が壊れる ○ 偽のデータを使う テスト 一時フォルダの偽データ 終わったら消える。本物は無傷 走らせるたびに偽データを作り直すので、前回の結果が残って判定が狂うことも防げます。

STEP 2-2 の頼み方にはもう入れてあります。できあがったテストが本当にそうなっているかは、 AI に自分で白状させるのが早いです。

この _selftest.py は、私の本物のファイルやノートを
読んだり、書き換えたり、消したりしていないか確認して。
していたら、どこで何をしているかを教えて。
直す前に、まず報告だけして。

「直す前に報告だけ」と付ける理由:確認のつもりが、 そのまま書き換えに進んでしまうのを防ぐためです。

それでも万一に備えて。 LAB 002 で作った「戻れる仕組み」は、テストを作る前にも効きます。 道具のフォルダが記録(コミット)された状態で始めれば、何が起きても元に戻せます。

04

STEP 4 — 目安 10分 / この記事の山場

合否を AI に採点させない

テストを作っても、まだ穴があります。テストが落ちたとき、 AI が「作ったものを直す」のではなく「テストの方を直して」通してしまうことがあるのです。 条件をゆるめる、項目を消す——すると緑になり、「通りました」と報告されます。 けれど、何も確かめていません。

筆者が自作したタスクキュー(AI への作業依頼を1件ずつ自動で流す道具)でも、 「テストの側を甘くして通すこと」と「合否を決めるコマンド自体の書き換え」を 指示文ではっきり禁じています。自分の書いたものを自分で採点させると、判定の方を緩めて「通った」と報告する事故を招くからです。

✕ 判定の方を緩めて通す ❌ テストが落ちた テストの条件を緩める / 項目を消す ✅ 通った 何も確かめていない ○ 作った方を直して通す ❌ テストが落ちた テストはそのまま 作ったものを直す ✅ 通った 本当に直っている どちらも画面は同じ「✅」になるのが、いちばん怖いところです。

守ることは3つです。AI への頼み方に、そのまま入れられます。

① テストを緩めない

落ちたら直すのは作った側。テストの条件を変える・項目を減らすのは禁止にします。

② 判定の道具を書き換えない

合否を出すコマンド(python3 _selftest.py など)自体を、作業の途中で変えさせません。

③ 結果そのものを見せさせる

「通りました」の一言で終わらせず、実際の出力と終了コードを貼らせます。

頼み事の最後に、毎回この文を付けます。

作業が終わったら、python3 _selftest.py; echo $? を実際に走らせて、
出力の最後の部分と、終了コードを貼って。
通らないときは、テストを緩めたり、項目を消したり、書き換えたりせず、
作ったものの方を直して。
どうしても直せないときは、直せない理由を書いて、そこで止まって。

「止まって」と付ける理由:出口を用意しないと、 AI は行き詰まったとき、通すためにテストの方を曲げる方向へ逃げやすくなります。 「直せないなら止まっていい」と先に伝えておけば、その逃げ道が要らなくなります。

もう一段強くする:走らせるのも AI にさせない

上の頼み方でも、走らせて結果を報告するのは AIです。 もっと確実なのは、作業が終わったあとに、AI とは別のものが同じコマンドを走らせることです。

筆者のタスクキューは、タスクごとに「完了条件」(合否を決めるコマンド)を持てます。 Claude の作業が終わったあと、そのコマンドを機械が走らせ、 終了コード 0 で初めて完了。違えば出力を渡してやり直させます。 やり直しには回数の上限があり(際限なく回して、AI の利用量を使い果たさないため)、 行き詰まったときは人に聞くために止まる出口も渡してあります。

筆者のタスクキューの場合(自動で作業を流す自作の道具) AI が作業する AI とは別のプログラムが 検証コマンドを走らせる 0 → 完了 0 以外 → 出力を渡してやり直し やり直しは回数に上限あり 道具が無くても、AI が「できました」と言ったら、自分で同じコマンドを1回走らせれば同じ効果です。

この道具は自作なので、読者のみなさんが同じものを用意する必要はありません。 手でやるなら、「できました」と言われたら自分でターミナルに python3 _selftest.py; echo $? と打つだけ。数秒で終わります。 大事なのは「確かめるのが AI 以外であること」です。

05

STEP 5 — 目安 10分

テストそのものを疑う

機械に任せても、テストが間違っていたら、間違った合格が出ます。 いちばん厄介なのは、いつも ✅ になるテストです。何を壊しても通るので、 ✅ を見るたびに安心してしまいます。

実際、筆者の記録にもあります。確認用の関数の引数の順を取り違え、 必ず成功する空のテストを10件まとめて作ってしまったことがありました(2026-08-16)。 Python では、中身のある文字列は「条件を満たしている」として扱われます。次のように書くと、 条件のつもりで渡した式が逆の位置に入り、ラベルの文字列が条件になって、どんな場合でも ✅ になります。

def check(label, cond):
    print("  ✅" if cond else "  ❌", label)


check("1 + 1 は 3 になる", 1 + 1 == 3)   # 正しい順:ラベル、条件
check(1 + 1 == 3, "1 + 1 は 3 になる")   # 逆の順:文字列が条件になり、必ず ✅

5-1 わざと壊して、赤くなるか見る

見破り方は簡単です。合格したテストを、一度だけ疑います。 作ったものを1か所わざと壊して、テストが ❌ になるかを見る。❌ にならなければ、そのテストは何も見ていません。

合格したテストを、一度だけ疑う ✅ 全部通った コピーを1か所わざと壊して もう一度走らせる ❌ になった → テストは本物 ✅ のまま → 何も見ていない 壊したら赤くなる、を一度だけ確かめれば、以後の ✅ に意味が出ます。
この _selftest.py が本物か確かめたい。
今のフォルダを一時フォルダにコピーして、そのコピーの方で、
作ったものを1か所だけわざと壊して、テストを走らせて。
❌ になるかどうかを、結果で見せて。
本物のフォルダは壊さないで。

コピーの方を壊す理由:本物を壊して元に戻し忘れる事故を、最初から起こさないためです。 ✅ のままだった項目は、そこだけ AI に作り直させて、もう一度同じ確かめをします。

5-2 書いた本人とは別の目を入れる

もう1つの手は、コードを書いた AI とは別の AI に見てもらうことです。 書いた本人だと、次のことが起きやすいからです。

新しい会話(Claude Code を別に起動し直す)で、こう頼みます。直させず、指摘だけさせるのが肝です。

あなたはこのコードを書いた本人ではありません。
このフォルダの道具と _selftest.py を読んで、指摘だけして。ファイルは変更しないで。
見てほしいこと:
・壊れていても通ってしまうテスト項目(条件が常に真、ほぼ空の確認)が無いか
・本物のファイルやノートに触っていないか
・テストが確かめていない大事な動きが無いか

別の AI も AI なので、機械の番号の代わりにはなりません。 あくまで、番号では拾えない見落としを補う「2枚目の目」です。

機械が決められるのは、テストが見ている範囲だけです。 画面の見た目・使いやすさ、ブラウザの拡張機能、実機(本物の機械)が要るものは、機械では判定しにくい。 最後は人が実物を1回見ること——LAB 005 で 「本物のレシートで1回試す」と書いたのは、そのためです。

✓ ここまでの確認: わざと壊したコピーで、テストが ❌ になり、終了コードが 0 以外になった。 これで「✅ と 0 は信じてよい」と言える状態になりました。

TROUBLE

つまずき集(症状から引く)

起きていること 原因 どうするか
AI は「通りました」と言うのに、自分で走らせると落ちる 報告を信じて、結果を見ていなかった STEP 4 の頼み方で、出力と終了コードを貼らせる。自分でも1回走らせる
全部 ✅ なのに、使うと間違っている その間違いを、テストが確かめていない 間違いを言葉で伝え、その確認を1項目足してもらう。次からは同じ間違いを機械が見つける
いつも ✅ しか見たことがない 何を壊しても通る、空のテストかもしれない STEP 5-1:コピーをわざと壊して ❌ になるか見る
「全部通りました(0 項目)」と出る 確かめる項目が1つも無い(0個なら必ず成功になる) 項目の数が 0 でないことを毎回見る。0 なら作り直させる
テストの項目が減っている・条件が緩くなっている 落ちるテストを、直さずに変えて通した 「テストファイルを変更していないか。したなら何をなぜ変えたか」と聞く。STEP 4 の3つを頼み事に入れ直す
テストを走らせたら、本物のファイルが変わった 偽のデータではなく、本物を使っていた STEP 3:偽データに切り替えさせる。変わった分は LAB 002 の仕組みで戻す
直しても直しても、AI が堂々巡りで通らない テストが大きすぎる、または期待する結果が AI に伝わっていない 落ちている項目を1つだけ選び、期待する結果を言葉で書いて伝える。それでも駄目なら止めて、道具を小さくする

FAQ

よくある質問

テストが読めなくても大丈夫ですか?

大丈夫です。テストの中身は AI が書きます。あなたが読むのは、✅ と ❌ の行、項目の数、最後の終了コードだけ。落ちたときは、❌ の行をそのまま AI に見せれば足ります。

テストも AI が書くなら、結局は同じでは?

鋭い疑問です。完全な解決ではありません。だから STEP 4(採点させない)と STEP 5(疑う・別の目を入れる)があります。それでも、画面を読んで「大丈夫そう」と判断するより、毎回同じ基準で、番号で決まる方が、見落としは確実に減ります。

毎回やると時間がかかりませんか?

小さな道具のテストなら、数秒で終わります。長くかかるなら、テストか道具が大きすぎるサインです。LAB 005 の「小さく作る」は、ここでも効きます。

全部の道具に必要ですか?

いいえ。まずは壊れると困る部分——ファイルを消す・上書きする・個人情報を扱う所——から始めてください。見た目だけの道具なら、実物を1回見るだけで十分なこともあります。

既にある道具を直すときも、同じですか?

はい。直した箇所を覆うテストを1つ足してから終わりにします。直したのに確かめる仕組みが無いと、次に誰かが触ったとき同じ場所が静かに壊れても気づけません。

NEXT

次の一歩

まず、LAB 005 で作った道具1つに、小さなテストを付けてみてください。 目的は完璧なテストではなく、「合否が番号で出る」という感覚を1回体験することです。

  • 合否は、言葉ではなく終了コード(0 か、それ以外か)で決める
  • テストは偽のデータで動かし、本物には触らせない
  • 落ちたら作った側を直す。テストは緩めさせない
  • 合格したテストも、一度だけ壊して赤くなるか確かめる

LAB 007(準備中)

増えた道具を1枚の画面にまとめる

道具が増えてくると、次は「どれがどこにあるのか分からない」が困りごとになります。 それを1枚の画面にまとめる話です。

※ この記事は、筆者が実際に使っているテストと完了条件の運用をもとにしていますが、結果を保証するものではありません。 AI の振る舞いは製品やバージョンで変わるので、「機械が番号で決める」という考え方の方を持ち帰ってください。