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

# 08-02 保存処理 実行記録（Phase 5B-2B）

- 実行日時: 2026-09-20 23:31 JST
- 実行環境（実測）: macOS 26.6.2 / Node.js v24.18.0（標準機能のみ、追加パッケージなし）
- 実行場所: <PROJECT_ROOT>/examples/08-02-storage-check
- 記録方法: コマンドを実行し、stdout・stderr・終了コードを整形・省略せずにそのまま記録した。stderr が空の場合は「stderr: （出力なし）」と記す。
- 対象: storage.js（保存のみ、Phase 5A 以降変更なし）、submit_guard.js（提出前の存在・状態のガード、新規）、approval.js（08-01 の正本のコピー、新規）、run.js（手順1〜7、変更）。history の at は実行のたびに変わる。

### 1. `node run.js`

```text
$ node run.js
=== 1. 必須項目が欠けた入力（件名なし） ===
拒否されました: 必須項目が不足しています（件名・内容・承認者）
保存された依頼の件数: 0
=== 2. 正常な入力の保存 ===
保存後のrequests: [{"id":"REQ-0001","requester":"佐藤","title":"会議室の予約","content":"9/25 10時から","state":"下書き","approver":"鈴木"}]
保存後のhistory: [{"requestId":"REQ-0001","action":"作成","actor":"佐藤","at":"2026-09-20T14:31:48.230Z"}]
=== 3. 保存した依頼に対して、08-01の判定関数を呼ぶ（提出前） ===
鈴木が承認できるか: canApprove("下書き", 割当=true, 本人=false) => false
=== 4. 状態の更新（提出）：ガードを通して保存する ===
更新後のrequests: [{"id":"REQ-0001","requester":"佐藤","title":"会議室の予約","content":"9/25 10時から","state":"提出済み","approver":"鈴木"}]
更新後のhistory件数: 2 最後の履歴: {"requestId":"REQ-0001","action":"提出","actor":"佐藤","at":"2026-09-20T14:31:48.231Z"}
=== 5. 保存した依頼に対して、08-01の判定関数を呼ぶ（提出後） ===
鈴木が承認できるか: canApprove("提出済み", 割当=true, 本人=false) => true
=== 6. ガードが止める場合：存在しない依頼、提出済みの依頼をもう一度提出 ===
REQ-9999: 拒否されました: 対象の依頼が見つかりません（REQ-9999）
REQ-0001: 拒否されました: 状態が「提出済み」のため提出できません（提出できるのは 下書き・差戻し のときだけ）
拒否のあとのrequestsの状態: 提出済み / history件数: 2 （変わっていない）
=== 7. 参考：ガードを通さずに storage.js を直接呼ぶと（存在しない依頼） ===
例外で止まります: TypeError: Cannot set properties of undefined (setting 'state')
→ storage.js は対象の存在を確かめない。呼ぶ側（ガード）で確かめる設計にしている
```

stderr: （出力なし）

終了コード: 0

