# resource_guard — Mac PCクラッシュ物理防止デーモン

## 目的

2026-05-04に同日2回のPCクラッシュ事故（whisper-cli 26プロセス多重起動によるWindowServer応答停止・ハードリセット）を受けて実装。Claude/Jarvis側の自制だけでは止められない物理層の暴走を、ローカル常駐プロセスで物理的に止める。

**トークン消費: 0**（Claude API・Anthropic一切不使用。完全ローカル動作）

## 監視項目と閾値

| 項目 | 警告 | 強制停止 |
|---|---|---|
| メモリ使用率 | 85% | 92%（通知のみ・自動kill無し） |
| CPU使用率 | 90% × 25秒継続 | — |
| whisper-cli同時起動数 | 3プロセス | 5プロセス（古いものからkill） |
| whisper-cli稼働時間 | — | 60秒超（即kill） |

閾値は `resource_guard.py` 上部の定数で変更可。

## インストール

```bash
cd /Users/rk/Library/CloudStorage/GoogleDrive-ritsuha1021@gmail.com/マイドライブ/起業フォルダー/clone-jarvis/jarvis/safety
chmod +x install.sh uninstall.sh test.sh
./install.sh
```

初回実行時に通知許可ダイアログが出たら「許可」を選択。

## 停止（一時）

```bash
launchctl unload ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
```

再開:
```bash
launchctl load ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
```

## 完全アンインストール

```bash
./uninstall.sh          # ログは ~/jarvis_safety/ に残す
./uninstall.sh --purge  # ログも削除
```

## 閾値変更方法

1. `resource_guard.py` 上部の定数を編集
2. launchd再起動:
   ```bash
   launchctl unload ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
   launchctl load  ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
   ```

## ログ確認

```bash
tail -f ~/jarvis_safety/resource_log.jsonl
```

各行は `{ts, type, level, detail, action_taken}` のJSON。

## ソース変更後の反映

```bash
./sync.sh
```

`resource_guard.py` を編集した後、ローカル実行版に同期してデーモンを再起動する。

## 動作確認

```bash
./test.sh
```

## アーキテクチャ：なぜ実行ファイルをローカルにコピーするか

OS再起動直後はGoogle Driveのマウントが遅延するため、launchdがGDrive上のPythonスクリプトを参照すると起動失敗する（守護神不在の窓が生じる）。

- **ソース（編集用）：** 起業フォルダー/clone-jarvis/jarvis/safety/resource_guard.py（GDrive・git管理）
- **実行実体（launchd用）：** ~/jarvis_safety/bin/resource_guard.py（ローカルディスク・GDrive非依存）
- ソース編集後は `./sync.sh` でローカル版に反映する

## トラブルシューティング

**psutilインストール失敗:**
```bash
pip3 install --user psutil
# または
/usr/bin/python3 -m pip install --user psutil
```

**通知が出ない:**
システム環境設定 → 通知 → `Script Editor` または `Terminal` の通知を「許可」に変更。

**デーモンが起動しない:**
```bash
cat ~/jarvis_safety/stderr.log
```
でエラーを確認。python3パスの確認: `which python3`

**launchctl load エラー "already loaded":**
```bash
launchctl unload ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
launchctl load   ~/Library/LaunchAgents/com.jarvis.resourceguard.plist
```
