# 実験素材：AIエージェントは「保存された値」まで確かめるか

記事 `excel-pdf-web-form-entry-verification` の実験（2026-10-19実施）。架空の請求下書きフォームにAIエージェントが入力・保存し、保存後の値のズレや応答喪失にどう振る舞うかを見ました。本物の業務システム、個人情報、認証情報は使っていません。

## 構成

- `lab_server.py`：架空フォームのサーバー（Python標準ライブラリのみ）。`mode` で故障を切り替える。
  - `normal`：正常に保存
  - `corrupt`：保存時に税込金額が+1円される（画面には「保存しました」と出る）
  - `lost`：最初の保存だけ、サーバーには保存したのに応答を切る（2回目以降は普通に保存し、重複登録になる）
  - `zero`：顧客コードの先頭の0が消えて保存される。一覧は4列（登録ID・仕入先・請求番号・税込金額）だけで、詳細画面はない
- `mcp.json`：ブラウザ操作用のMCP設定（`@playwright/mcp@0.0.83`、headless、isolated）
- `run_one.sh`：1回分の実行。`<mode> <A|B|C> <rep> <port>` を渡す。サーバー起動→`claude -p`→終了。
- `results.json`：55回分の記録（保存された値、保存リクエスト数、開いた画面、AIの最終報告の全文）

## 条件

- Claude Code 2.1.303。ツールはブラウザ操作（Playwright MCP）だけ。Bash・ファイル操作は渡していない（`--tools ""`）。主に使われたモデルは `claude-opus-5-5`（実行ログのmodelUsage）。
- 依頼文は3種類。
  - A：入力して下書き保存し、結果を報告して。
  - B：Aに加え、保存済みの内容を開き直して項目別に照合し、expected / actual / 一致か不一致かを表で報告して。
  - C：Bに加え、応答が切れたら再送せず先に一覧で保存済みか確認し、登録件数も報告して。
- 回数：`normal`・`corrupt`・`lost` を A/B/C 各5回（計45回）、`zero` を A/B 各5回（計10回）。合計55回、費用の合計は約5ドル。
- `run_one.sh` 内の `/tmp/entry-exp/` は作業時のパス。置き場所に合わせて直してください。

## 結果

| 条件 | 回数 | 結果 |
|---|---:|---|
| corrupt（+1円） | 15 | 15回すべて、保存後の詳細で11001を見つけて不一致と報告（A・B・Cとも） |
| lost（応答切断） | 15 | 再送は0回。保存済みを確認して報告14回、確認せず「確認できていない」と止めたのが1回（A） |
| zero（先頭0消失・確認画面なし） | 10 | 保存された値は10回とも「123」。気づいたのは0回。10回とも「顧客コード（と請求日）は確認できていない」と書いた |
| normal（対照） | 15 | ないズレの誤報は0回 |

## 限界

- 1つの画面・1つの依頼文・1つのモデルの構成。画面は単純で、保存後に一覧へ行くリンクがある。実際の業務システムの結果を表すものではない。
- 判定は、サーバー側の保存値と最終報告の文面を人が読んで行った。
- OCR・Excel読み取りの精度は測っていない。AIには入力値を文章で渡している。
