<!-- 公開用の匿名化コピー。原証拠は evidence/ 配下（非公開）。変換規則は evidence_public/CONVERSION_RECORD.md を参照。内容の実行結果は変えていない。 -->

# 09-01 テストケース・検出力確認 実行記録（Phase 5B-2B）

- 実行日時: 2026-09-20 23:33 JST
- 実行環境（実測）: macOS 26.6.2 / Node.js v24.18.0（標準機能のみ、追加パッケージなし）
- 実行場所: <PROJECT_ROOT>/examples/09-01-unit-tests
- 記録方法: 各コマンドを順に実行し、stdout・stderr・終了コードを整形・省略せずにそのまま記録した。stderr が空の場合は「stderr: （出力なし）」と記す。run_tests.js の1行目の日時は実行のたびに変わる。
- 対象: approval.js（08-01 の正本のコピー、変更なし）、test_cases.js・run_tests.js（変更なし）、mutants.js・run_mutation_tests.js（新規。故意に壊した版は正本に混ぜず、メモリ上の関数として定義）。

### 1. `node run_tests.js`

```text
$ node run_tests.js
実行環境: darwin, Node.js v24.18.0, 2026-09-20T14:33:34.609Z

TC-01 [正常] 入力={"state":"提出済み","isAssignedApprover":true,"isSelf":false} 期待値=true 実行結果=true 判定=PASS（割当承認者が他人の提出済み依頼を承認できる）
TC-02 [異常] 入力={"state":"下書き","isAssignedApprover":true,"isSelf":false} 期待値=false 実行結果=false 判定=PASS（下書き状態は承認できない）
TC-03 [異常] 入力={"state":"承認済み","isAssignedApprover":true,"isSelf":false} 期待値=false 実行結果=false 判定=PASS（承認済みの依頼を再度承認できない）
TC-04 [異常] 入力={"state":"提出済み","isAssignedApprover":false,"isSelf":false} 期待値=false 実行結果=false 判定=PASS（割り当てられていない承認者は承認できない（REQ-002））
TC-05 [異常] 入力={"state":"提出済み","isAssignedApprover":true,"isSelf":true} 期待値=false 実行結果=false 判定=PASS（自己承認はできない（REQ-003））
TC-06 [境界] 入力={"state":"","isAssignedApprover":true,"isSelf":false} 期待値=false 実行結果=false 判定=PASS（状態が空文字（想定外の入力）の場合は承認できない）

合計: 6件、PASS: 6件、FAIL: 0件
```

stderr: （出力なし）

終了コード: 0

### 2. `node run_mutation_tests.js`

```text
$ node run_mutation_tests.js
テストケース: 6件、壊した版: 5通り

M1 状態の判定を削除（どの状態でも承認できる）: 検出できた（FAIL になったテスト: TC-02, TC-03, TC-06）
M2 割当承認者の判定を削除（割当外でも承認できる）: 検出できた（FAIL になったテスト: TC-04）
M3 自己承認の判定を削除（本人でも承認できる）: 検出できた（FAIL になったテスト: TC-05）
M4 状態の比較を「提出済み以外なら承認できる」に反転: 検出できた（FAIL になったテスト: TC-01, TC-02, TC-03, TC-06）
M5 状態が空文字のときだけ承認できてしまう（境界の壊れ方）: 検出できた（FAIL になったテスト: TC-06）

5通りすべての壊れ方を検出できた。このテストは、少なくともこれらの壊れ方には検出力がある
```

stderr: （出力なし）

終了コード: 0

