Kredo Blog｜AIへの最小再現コード 練習教材
作成：2026年10月6日

目的
関数の2回目の呼び出しで結果が混ざる問題を、短いコードで再現します。
修正前・if not候補・is None修正版を、同じ6条件で比較します。
特定のAIサービスの実回答ではなく、記事用に作成して実行した比較教材です。

同梱ファイル（UTF-8）
broken.py：修正前。省略したリストが呼び出し間で共有される。
candidate_truthy.py：if not候補。渡した空リスト自身へ追記できない。
fixed.py：is None修正版。
check_notes.py：3候補に同じ6条件を当てるunittestコード。
request-template.txt：コード・実測値・仕様を含むAIへの依頼文。
expected-output.txt：検証環境で得られた実際のstdout/stderr。
README.txt：この説明。

準備と実行
1. ZIPを専用の練習フォルダーへ展開してください。
2. ターミナルでそのフォルダーを開いてください。
3. Python 3が入っている環境で、次を一行ずつ実行します。
   使用しているPython 3のコマンドがpythonまたはpyの場合は、python3を置き換えます。

python3 --version
python3 -B broken.py
python3 -B candidate_truthy.py
python3 -B fixed.py
python3 -B check_notes.py broken
python3 -B check_notes.py candidate_truthy
python3 -B check_notes.py fixed

追加パッケージは不要です。-Bはバイトコードキャッシュの書き出しを抑えます。
教材のプログラムはネットワーク通信やデータファイルへの書き込みをしません。

期待される比較
broken：6項目中3項目合格、2項目失敗、1項目で例外。終了コード1。
candidate_truthy：6項目中5項目合格、1項目失敗。終了コード1。
fixed：6項目すべて合格。終了コード0。
修正前と中間候補の不合格は、教材として意図した結果です。
所要時間やログ内のパス、行番号の表示は環境によって変わります。

テストする仕様
・notes省略時、またはNoneのときは、新しいリストを毎回作る。
・後の呼び出しで、前に返したリストの内容を変えない。
・リストを明示したときは、そのリスト自身へ追記し、同じリストを返す。
・空のリストを明示した場合も、上の条件を保つ。
・labelは文字列、notesはリスト・None・省略という範囲で試す。
入力型の誤り、並行処理、実際の画面・保存処理までは、この教材の検証範囲に含みません。

check_notes.pyではテスト間の状態を分離するため各テストの前にモジュールを再読み込みします。
ただし、2回目の動きを確かめるテストの中では、関数を定義し直さず連続して呼び出します。
再現に必要な順序を消していない点を見比べてください。

練習
1. 1回しか呼ばない例で、今回の不具合を説明できるか考える。
2. if not版のどの条件が不合格か、実行結果で確かめる。
3. 実際のコードへ戻すなら、まだ試していない範囲を一文で書く。

記事
https://kredo.jp/media/ai-debug-minimal-reproducible-example/
参考
https://stackoverflow.com/help/minimal-reproducible-example
https://docs.python.org/3.12/tutorial/controlflow.html#default-argument-values
https://docs.python.org/3.12/library/unittest.html
