LAB 006 — GUIDE
— 合否を機械に決めさせる —
道具を1つ作ると、次に困るのは「本当に直っているか」です。 AI は作業のあと、たいてい「できました」と言います。けれどそれは報告であって、 確かめた結果ではありません。 この記事では、合否を AI の言葉ではなく機械が出す1つの番号で決める仕組みを作ります。
約45分
全部やる場合の目安
5 STEP
手順の数
0 か 1 か
合否はこれだけで決める
※ LAB 000〜 LAB 005 を終えている前提です。特にLAB 000 の「動いた ≠ 正しい」と、 LAB 005 で作った自分専用の道具を使います。
INTRO
AI に頼んだ作業が終わると、「できました」「修正しました」「テストも通っています」と返ってきます。 それを読んで安心して次へ進む——自然な流れですが、ここに落とし穴があります。
AI は、自分が書いたものを自分で確かめて、自分で「合格」と言っています。 つまり作った人が、そのまま採点もしている状態です。 人間でも、自分の答案を自分で採点すると甘くなりやすいのと同じで、 AI でも同じ偏りが起きやすいと考えて、仕組みで備えます(STEP 4・5 で具体的に出てきます)。
対策は、AI を疑い続けることではありません。 合否を決める役を、AI の言葉から「機械が出す番号」に移すだけです。 機械は毎回同じ基準で、疲れず、言葉に流されずに判定します。
これは LAB 000 の 「動いた ≠ 正しい」の続きです。あのときは自分の目で結果を1つ見ることで確かめました。 今回はその確かめ方を、毎回、自動で、同じ基準でやれる形にします。
STEP 1 — 目安 5分
機械に合否を決めさせる、といっても難しい仕組みは要りません。使うのは、 終了コード(プログラムが終わるときに返す番号)だけです。
Mac のプログラムは、終わるときに必ず番号を1つ返します。 0 なら成功、0 以外なら失敗——これは決まりごとです。 「たぶん大丈夫そう」と判断する余地が入り込みません。
まず番号を自分の目で見てみます。ターミナル(文字で Mac に命令する画面)に、次の2行を貼って Enter を押してください。
true は「何もせず成功して終わる」命令、
false は「何もせず失敗して終わる」命令、
echo $? は「直前の命令が返した番号を表示する」命令です。
true; echo $? ← 0 と出る(成功)
false; echo $? ← 1 と出る(失敗)
なぜ番号なのか:画面に「成功しました」と表示させる方法だと、 その文字を出すのも作った側(AI)になります。番号は、プログラムが実際にどう終わったかで決まるので、 言葉で取り繕えません。
✓ ここまでの確認: 1行目のあとに 0、2行目のあとに 1 と表示された。 「成功は 0、失敗は 0 以外」だけ覚えていれば、次へ進めます。
STEP 2 — 目安 15分
ここで作るのは自己テストです。 道具を実際に動かして、結果が思ったとおりかを確かめ、 全部合っていれば 0、1つでも違えば 0 以外で終わる小さなプログラムです。 「自動で採点してくれる採点表」だと思ってください。
書くのは AI に頼みます。ただし、どういう形のものが「テスト」なのかを知らないと、 できあがったものが本物かどうか見分けられません。先に、いちばん小さな見本を動かして形を見ておきましょう。
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(...) が番号を返す行です。
本物のテストも、項目が増えるだけで同じ形です。
形が分かったら、LAB 005 で作った道具のテストを頼みます。 条件を最初に全部伝えるのがコツです。
この道具を確かめるテストを _selftest.py という名前で作って。
条件:
・全部通れば終了コード0、1つでも違えば0以外で終わること
・画面に「たぶん大丈夫」と書いて終わる作りにしない。必ず終了コードで合否が決まる形にする
・最後に「成功 ◯ / 失敗 ◯」と項目の数も表示する
・私の本物のファイルやノートには触らず、一時フォルダに作った偽のデータで試す
作ったら実際に走らせて、画面の出力と終了コードをそのまま見せて。
項目の数も出させる理由:確かめる項目が0個だと、何も確かめていないのに 終了コードは 0(成功)になります。「全部通りました(12 項目)」のように数が出ていれば、 空っぽのテストにだまされません。
✓ ここまでの確認: ① 見本で ❌ の行と最後の 1 が出た。 ② 自分の道具のテストを走らせると、項目の数と、最後に終了コードが表示される。 落ちた項目があるときは、読んで内容を AI に伝え直すだけで構いません。
STEP 3 — 目安 5分
テストは何度も走らせます。もしテストが本物のファイルを使って動くと、 テストの途中で失敗したとき、本物の方が壊れることがあります。 確かめるつもりの作業で、大事なものを傷つけては本末転倒です。
そこで、テストは毎回一時フォルダ(走るたびに作り、終わったら消える仮の置き場)に 偽のデータを用意して、そこだけを触らせます。
STEP 2-2 の頼み方にはもう入れてあります。できあがったテストが本当にそうなっているかは、 AI に自分で白状させるのが早いです。
この _selftest.py は、私の本物のファイルやノートを
読んだり、書き換えたり、消したりしていないか確認して。
していたら、どこで何をしているかを教えて。
直す前に、まず報告だけして。
「直す前に報告だけ」と付ける理由:確認のつもりが、 そのまま書き換えに進んでしまうのを防ぐためです。
それでも万一に備えて。 LAB 002 で作った「戻れる仕組み」は、テストを作る前にも効きます。 道具のフォルダが記録(コミット)された状態で始めれば、何が起きても元に戻せます。
STEP 4 — 目安 10分 / この記事の山場
テストを作っても、まだ穴があります。テストが落ちたとき、 AI が「作ったものを直す」のではなく「テストの方を直して」通してしまうことがあるのです。 条件をゆるめる、項目を消す——すると緑になり、「通りました」と報告されます。 けれど、何も確かめていません。
筆者が自作したタスクキュー(AI への作業依頼を1件ずつ自動で流す道具)でも、 「テストの側を甘くして通すこと」と「合否を決めるコマンド自体の書き換え」を 指示文ではっきり禁じています。自分の書いたものを自分で採点させると、判定の方を緩めて「通った」と報告する事故を招くからです。
守ることは3つです。AI への頼み方に、そのまま入れられます。
落ちたら直すのは作った側。テストの条件を変える・項目を減らすのは禁止にします。
合否を出すコマンド(python3 _selftest.py など)自体を、作業の途中で変えさせません。
「通りました」の一言で終わらせず、実際の出力と終了コードを貼らせます。
頼み事の最後に、毎回この文を付けます。
作業が終わったら、python3 _selftest.py; echo $? を実際に走らせて、
出力の最後の部分と、終了コードを貼って。
通らないときは、テストを緩めたり、項目を消したり、書き換えたりせず、
作ったものの方を直して。
どうしても直せないときは、直せない理由を書いて、そこで止まって。
「止まって」と付ける理由:出口を用意しないと、 AI は行き詰まったとき、通すためにテストの方を曲げる方向へ逃げやすくなります。 「直せないなら止まっていい」と先に伝えておけば、その逃げ道が要らなくなります。
上の頼み方でも、走らせて結果を報告するのは AIです。 もっと確実なのは、作業が終わったあとに、AI とは別のものが同じコマンドを走らせることです。
筆者のタスクキューは、タスクごとに「完了条件」(合否を決めるコマンド)を持てます。 Claude の作業が終わったあと、そのコマンドを機械が走らせ、 終了コード 0 で初めて完了。違えば出力を渡してやり直させます。 やり直しには回数の上限があり(際限なく回して、AI の利用量を使い果たさないため)、 行き詰まったときは人に聞くために止まる出口も渡してあります。
この道具は自作なので、読者のみなさんが同じものを用意する必要はありません。
手でやるなら、「できました」と言われたら自分でターミナルに
python3 _selftest.py; echo $? と打つだけ。数秒で終わります。
大事なのは「確かめるのが AI 以外であること」です。
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 になる") # 逆の順:文字列が条件になり、必ず ✅
見破り方は簡単です。合格したテストを、一度だけ疑います。 作ったものを1か所わざと壊して、テストが ❌ になるかを見る。❌ にならなければ、そのテストは何も見ていません。
この _selftest.py が本物か確かめたい。
今のフォルダを一時フォルダにコピーして、そのコピーの方で、
作ったものを1か所だけわざと壊して、テストを走らせて。
❌ になるかどうかを、結果で見せて。
本物のフォルダは壊さないで。
コピーの方を壊す理由:本物を壊して元に戻し忘れる事故を、最初から起こさないためです。 ✅ のままだった項目は、そこだけ AI に作り直させて、もう一度同じ確かめをします。
もう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 に見せれば足ります。
鋭い疑問です。完全な解決ではありません。だから STEP 4(採点させない)と STEP 5(疑う・別の目を入れる)があります。それでも、画面を読んで「大丈夫そう」と判断するより、毎回同じ基準で、番号で決まる方が、見落としは確実に減ります。
小さな道具のテストなら、数秒で終わります。長くかかるなら、テストか道具が大きすぎるサインです。LAB 005 の「小さく作る」は、ここでも効きます。
いいえ。まずは壊れると困る部分——ファイルを消す・上書きする・個人情報を扱う所——から始めてください。見た目だけの道具なら、実物を1回見るだけで十分なこともあります。
はい。直した箇所を覆うテストを1つ足してから終わりにします。直したのに確かめる仕組みが無いと、次に誰かが触ったとき同じ場所が静かに壊れても気づけません。
NEXT
まず、LAB 005 で作った道具1つに、小さなテストを付けてみてください。 目的は完璧なテストではなく、「合否が番号で出る」という感覚を1回体験することです。
LAB 007(準備中)
増えた道具を1枚の画面にまとめる
道具が増えてくると、次は「どれがどこにあるのか分からない」が困りごとになります。 それを1枚の画面にまとめる話です。
※ この記事は、筆者が実際に使っているテストと完了条件の運用をもとにしていますが、結果を保証するものではありません。 AI の振る舞いは製品やバージョンで変わるので、「機械が番号で決める」という考え方の方を持ち帰ってください。