記事Bの本文と examples/sample-b/ に対応。実行記録は evidence/rev1-2026-09-18/sample-b/run_log.md(初版は evidence/sample-b/run_log.md)。 「修正前の結果」は説明用の失敗例 v1 を実行した結果であり、実際のAI出力を観測したものではない。

1. 検証の対象

項目内容
対象の処理依頼の承認・差戻し(approve / send_back)
対象の版修正前 approval_v1.py(説明用の失敗例)/修正後 approval_v2.py(rev1)
実行環境macOS 26.6.2、Python 3.9.6(サポート終了版。サポート中の版では未確認)、SQLite 3.51.0(メモリ上)。2026-09-18 実行
本人確認や保存先は本物か代用か本人確認は操作者IDを引数で渡す代用。保存先はメモリ上の新規SQLite(本番の保存先ではない)
接続の設定明示的な確定・取消を使う設定(isolation_level が None でない)。外部キー検査は接続ごとに有効化し実値1を確認

2. 要件・テスト対応表

テストID要件/受入条件種類前提データ操作期待結果保存内容で照合するもの修正前(v1)修正後(v2)
T1REQ-003, 005/AC-001正常REQ-A01 提出済み、承認者=鈴木鈴木が承認承認済み履歴の最後の1行=(承認、鈴木、固定時刻、備考なし)。既存履歴は不変成功成功
T2REQ-003/AC-002権限なし(割当外)同上高橋(割当外)が承認拒否依頼・履歴の全行が操作前と同一失敗(承認されてしまう)成功
T3REQ-003/AC-003自己承認REQ-A03 依頼者=承認者=鈴木(異常データ)鈴木が承認拒否全行同一失敗(承認されてしまう)成功
T4REQ-003/AC-004状態外REQ-A02 下書き、承認者=鈴木鈴木が承認拒否全行同一失敗(承認済みになる)成功
T5REQ-006/AC-008重複REQ-A01 提出済み鈴木が2回承認2回目は拒否1回目後と2回目後で全行同一。承認履歴1件失敗(履歴が2件)成功
T6REQ-007/AC-010途中失敗REQ-A01 提出済み状態更新直後に保存失敗を模擬失敗全行が操作前と同一(状態も履歴も戻る)失敗(承認済みなのに履歴なし)成功
T7REQ-004/AC-006入力不足REQ-A01 提出済み鈴木が理由なしで差戻し拒否全行同一失敗(差し戻される)成功
T8REQ-004, 005正常同上鈴木が理由ありで差戻し差戻し履歴の最後の1行=(差戻し、鈴木、固定時刻、理由)。既存履歴は不変成功成功
T9REQ-003役割REQ-A05 承認者でない運用管理者を割当(異常データ)運用管理者が承認拒否全行同一失敗(承認されてしまう)成功
T10(保存先の関係)関係の保護存在しない依頼ID履歴を直接追加保存先が拒否外部キー検査の実値が1成功(保存先の設定のため)成功
T11REQ-003, 006保存先の状態条件REQ-A02 下書き。処理側の確認を素通り鈴木が承認失敗全行同一(UPDATEの状態条件と更新件数で止まる)スキップ(該当関数なし)成功
T12REQ-007接続設定自動確定モードの接続鈴木が承認変更前に拒否全行同一失敗(処理が進む)成功

件数:v1 は原版8件中6件失敗+追加4件中2件失敗・1件スキップ。v2 は12件すべて成功。

3. 発見した不備と修正記録

番号発見したテスト不備の内容原因(コードのどこ)修正内容修正後に通ったテスト
D-1T2, T3誰が承認しようとしているかを見ていないapprove の冒頭で state しか読んでいない承認者の割当と依頼者との一致を確認し、違えば拒否T2, T3
D-2T4, T5対象の状態を見ていないUPDATE に状態の条件がない提出済みのときだけ承認。UPDATE にも状態条件を付け、更新件数が1でなければ取り消すT4, T5, T11
D-3T6状態変更と履歴追加を別々に確定している2回の commit の間で失敗すると片方だけ残る2つの変更を1つのトランザクションにまとめる(with conn:)T6
D-4T7差戻し理由の有無を見ていないsend_back に検査がない理由が空なら拒否T7
D-5(rev1)T9操作者の役割を見ていない。割当だけで判断users の role を読んでいない役割が承認者でなければ拒否。役割と割当を別条件にT9
D-6(rev1)T12取消を保証できない接続設定でも処理が進むwith conn: の動作が接続設定に依存自動確定モード・未確定処理ありの接続は変更前に拒否T12
D-7(rev1、保存先)T10宣言した関係が守られていない(外部キー検査が既定で無効)common.py の接続で PRAGMA を設定していない接続作成時に PRAGMA foreign_keys = ON、実値1を確認T10

4. AIへの修正指示(送った文章の例)

記事B 第6.2節の指示文と同じ(役割・接続設定の項目を含む)。

4b. テストの検出力(実行確認済み)

故意に誤らせたコピーを一時フォルダに作り(mutation_check.py)、強化したテストが検知するかを確かめた。誤らせたコードは正本に混ぜず、終了時に削除。

故意の誤変更初版テスト(GPT環境の観測)改訂版テストが検知したテスト判定
UPDATEの状態条件と更新件数の検査を削除見逃しT11検知
割当外を拒否する直前に既存履歴を削除見逃しT2検知
理由なし差戻しを拒否する直前に履歴を追加見逃しT7検知
差戻し成功時の操作者を別人・時刻を空に見逃しT8検知

5. この検証で確かめていないこと

範囲確かめていない理由いつ・どこで確かめるか
2人の承認者が同時に操作したとき単一プロセス・逐次実行のみ。T11は保存先条件の動作確認であって同時操作の再現ではない09-03 の同時操作テストで、実際の保存先を使って確認
本物の本人確認(ログイン)操作者IDを引数で渡す代用。役割確認はIDの役割を見るだけ05-03 / 08-03 で認証機能を実装した後
複数の役割を持つ人1人1役割の最小モデル05-03
画面からの操作処理関数を直接呼んでいる画面実装後の 09-02 通し検証
本番の保存先での動作メモリ上のSQLite環境を分けた検証環境で
対応しない接続設定での取消処理前に拒否する方式にしたため、その設定での取消は未確認必要なら別途
差戻しの重複テストを用意していない追加テストを検討
サポート中のPythonでの実行この環境には3.9.6しかない環境を用意してから

6. 判定