
## 2244-31 — visual_check 未実行ブロック発火（自動反省）

- session: 0b14ccab-5907-4a91-9c03-ff28d41600f2
- 視覚関連編集: 16件
- visual_check_log: 当日エントリなし
- 違反: feedback_visual_check_auto_enforcement.md / feedback_self_check_visual_proof.md
- 再発防止: Stop hook 経由で物理ブロック → visual_check.py 実行強制

---

## 2244-B — fleet auditor の claude -p 残存をユーザー指摘まで見落とし（課金枠監視の構造的穴）

### 事象
- 2026-06-01: ユーザー「6/15どうなった」→ Jarvisが3並列Agentで調査し「fleet v4でSDK経路ゼロ達成・claude -p廃止」と報告。実際には **worker経路（spawn_runner.sh→expect→TUI）だけ** がSDKゼロで、**auditor経路は claude -p が残っていた**。
- 2026-06-06: ユーザー「心配だからもう1度claude -p使ってないか+他に課金枠使いそうなもの動いてないか確認して」→ 本体が grep網羅＋実コード読みで **`auditor_daemon.py` L157 → `claude_oneshot()` → `_common.py` L210/L227 `["claude","-p",...]`** の残存を発見・物理ガード化（RuntimeError）。
- ＝ユーザーが念押ししなければ発見できなかった ＝ `feedback_user_indication_zero`（ユーザー指摘ゼロ運用ゴール）の明確な違反。

### ユーザー直接引用
> 「どう考えても直すべきだしこれから作るものも全部使わないことを最優先事項に入れないとまずいよね。後どうして今回穴があったことを見落としたのかとそれのメモと2度と起こらないようにして欲しいし自分から見つけて守成(是正)して欲しいよね」

### 真因（なぜ見落としたか・5点）
1. **経路バイアス（worker tunnel vision）**：6/15課金の文脈が「worker daemonの実タスク実行コスト」だったため、3Agent全員が無意識に worker経路（`spawn_runner.sh`/`spawn_expect.sh`）にスコープを固定。`auditor_daemon.py` は「監査役・補助」という認知で課金主体の候補から外れ、同じ `_common.py` 内の別関数 `claude_oneshot()` を呼んでいる事実を誰も追わなかった。
2. **確証バイアス（既存記憶の追認）**：`feedback_fleet_tui_v4_sdk_zero_achieved.md` と REMINDER に既に「v4でSDKゼロ達成」と断定して書いてあった。Agentたちは「達成済み」を前提に **反証ではなく確認** をしに行ったため、全コードを `grep claude -p` で網羅する動機が消えた。記憶が監査をショートさせた。
3. **ファイル単位検証の穴（file-scope ≠ repo-scope）**：Agent-3は `spawn_runner.sh`/`spawn_expect.sh` を開いて「--print ゼロ」を目視確認した＝**見たファイルの中だけ** が正しかった。「これらのファイルに無い」を「リポジトリに無い」と誤って一般化。`grep -rn "claude -p\|--print" scripts/` を一度でも打てば `_common.py` L227 と `auditor_daemon.py` の import が即ヒットしたはず。Agent-2も worker log だけを実測し、auditor のログ経路を見ていない。
4. **Lv5の同DNA共謀（同一前提の二重化）**：2026-06-01の各Lv5監査も「SDKゼロ」を追認した。だがLv5は本来 **本体と独立に前提を疑う** 役。実際は本体Agent群と同じ「worker＝課金主体」「v4で達成済み」という前提を共有していたため、独立検証になっておらず、同じ盲点をもう一度通過させた（＝検証の多重化が単なる多数決になり盲点を増幅）。
5. **能動検査の不在（受動運用化）**：禁止事項（claude -p / Agent SDK）に対する **定期的・能動的な全体grep検査が存在しなかった**。「やってないはず」という記憶に依存し、ユーザーの「心配だから確認して」という外部トリガーが来て初めて全網羅grepが走った。自律で気づけなかった核心はここ。

### 是正（実施済み・このセッション）
- `_common.py` L219 `claude_oneshot()` を即 `raise RuntimeError`（claude -p物理禁止ガード）に書換。残コードは到達不能で履歴保持。
- `auditor_daemon.py` L157-164 を try/except でラップ。RuntimeError時は `[AUDIT-SKIPPED]`＋verdict=warning でdaemon生存（クラッシュさせない）。auditorは現在 launchd 停止中（status 78）で課金ゼロだが、再稼働前にTUI化（`spawn_interactive_claude`経路）必須。
- `feedback_fleet_tui_v4_sdk_zero_achieved.md` に「SDKゼロは worker のみ正確・fleet全体ではない」訂正を追記済（L36）。

### 恒久ルール
- **「使ってない」を証明する時は file-scope でなく repo-scope の grep網羅で立証する。** 1経路（spawn_runner）が安全でも別関数（claude_oneshot）が地雷。→ `feedback_grep_whole_repo_not_file_scope.md` 新設。
- **禁止事項（claude -p / Agent SDK / Claude API）は記憶を信用せず、能動的に全リポ grep で定期検査する。** 「達成済みと書いてある」は検査をスキップする理由にならない（むしろ確証バイアスの発生源）。
- **既存記憶に「達成」「ゼロ」「完了」と断定がある領域ほど、Lv5は確認でなく反証から入る。** Agentに渡すプロンプトに「既存記憶を疑い、反例を全網羅grepで探せ」を明示する。

### Lv5の本来役割（今回の失敗を踏まえた再定義）
- Lv5は「本体と独立した前提」で検証して初めて価値を持つ。本体と同じ前提（worker＝課金主体／v4で達成済み）を共有したら、それは独立検証ではなく **同DNA共謀** で、盲点を消すどころか追認で増幅する。
- 今後Lv5に課金枠・禁止事項の検証を渡す時は、本体の結論文ではなく **「全コードをgrepした生の検索結果」** を根拠として要求する。結論の追認を禁止し、一次データ（grep出力・実コード行）での再検証を義務化。

### 関連既往パターン
- [feedback_user_indication_zero.md](../../../memory/feedback_user_indication_zero.md) — ユーザー指摘ゼロ運用ゴール（本件は違反事例）
- [feedback_no_claude_api_max_only.md](../../../memory/feedback_no_claude_api_max_only.md) — 課金経路禁止の上位原則
- [feedback_fleet_tui_v4_sdk_zero_achieved.md](../../../memory/feedback_fleet_tui_v4_sdk_zero_achieved.md) — 「SDKゼロ達成」記憶（worker限定・auditor未移行を訂正済）
- [feedback_grep_whole_repo_not_file_scope.md](../../../memory/feedback_grep_whole_repo_not_file_scope.md) — 本件から新設した方法論教訓
- [feedback_check_official_docs_first.md](../../../memory/feedback_check_official_docs_first.md) — 「推測で進めユーザー指摘まで気づけなかった」同型事故
