# SPEC_v3.md — MARK Ⅶ 能動型 Jarvis 仕様書

> 中期目標「アイアンマンJarvis本物化＝能力の延長線」の Phase 2。
> 全権委任モード（feedback_full_delegation_mode.md）第1回適用。
> 仕様確定：2026-05-06。

---

## 🔴 ゴール（映画のJ.A.R.V.I.S 本体に最接近）

「**呼ばれてなくても、必要なときに自分から喋ってくる相棒**」

具体的に：
- マイク音声を**ストリームで**常時テキスト化（chunkファイル方式は撤退）
- Jarvis が **「言うべきか／黙るべきか」を自律判断**
- 言うべき時はテキスト＋音声で即介入
- 4モード切替（静か / 観察(デフォルト) / 積極 / 即答）

---

## 🔴 v2 (chunk方式) からの設計変更点

| 項目 | v2（撤退済） | v3（新方式） |
|---|---|---|
| 録音 | ffmpeg で30秒chunk作成 | **whisper-stream が直接マイクからストリーム取得** |
| 文字起こし | chunk完成後にwhisper-cli起動 | **whisper-stream が連続出力** |
| ファイル管理 | raw/ split/ processed/ 三層 | **不要**（メモリストリーム＋テキスト追記のみ） |
| 反応速度 | 発話→応答 60秒 | **5〜10秒**（whisper-stream `--step 500 --length 5000`） |
| 介入 | 呼名検出のみ（受動型） | **自律介入＋呼名検出（能動型）** |
| 出力 | dashboard カードのみ | dashboard + **音声出力**（macOS say） |
| 自己増殖バグリスク | あり（v2で経験済） | **構造的にゼロ**（中間ファイル不要） |

---

## 🔴 アーキテクチャ

```
┌────────────────────────────────────────────────────────────┐
│ stream_transcriber.py                                       │
│   whisper-stream を subprocess.Popen 起動                   │
│   stdout を 1行ずつ読み取り → live_transcript.txt 末尾追記 │
│   形式: [HH:MM:SS] テキスト                                  │
└────────────────────────────────────────────────────────────┘
                          ↓ append-only
┌────────────────────────────────────────────────────────────┐
│ live_transcript.txt（追記専用・常時膨らむテキスト）         │
└────────────────────────────────────────────────────────────┘
                          ↓ tail-f 監視
┌────────────────────────────────────────────────────────────┐
│ jarvis_active_daemon.py（能動型 daemon）                    │
│   1秒ごとにファイル末尾を tail                              │
│   直近60秒のテキストをバッファに保持                        │
│                                                             │
│   ── 5秒間隔で軽量フィルタ評価 ──                          │
│   intervention_filter.py:                                   │
│     A. 呼名検出（最優先・絶対通す）                          │
│     B. 疑問・迷い検出 (?・どうしよう・迷う等)                │
│     C. モード切替コマンド検出                                │
│     D. 沈黙検出（観察モードで2分超）                         │
│     E. 誤事実シグナル                                        │
│                                                             │
│   ── ヒット時のみ本格判定 ──                                │
│   ↓                                                         │
└────────────────────────────────────────────────────────────┘
                          ↓ subprocess
┌────────────────────────────────────────────────────────────┐
│ claude -p "プロンプト"                                       │
│   入力: DNA核心 + 直近60秒transcript + 過去Jarvis介入5件   │
│   タスク: intervene yes/no を判断、yes なら介入文生成       │
│   想定 1fire 約3〜5k tok                                    │
└────────────────────────────────────────────────────────────┘
                          ↓ intervene=yes
┌────────────────────────────────────────────────────────────┐
│ output_dispatcher.py                                        │
│   ① dashboard カード書込（live_meeting_YYYY-MM-DD.md）      │
│   ② 音声出力（mode_state により ON/OFF）                    │
│      voice_output.py: macOS say -v Kyoko                    │
│   ③ action_log.jsonl 記録                                   │
│   ④ mirror_to_dashboard.sh 即実行                           │
└────────────────────────────────────────────────────────────┘
```

---

## 🔴 モード設計

| モード | 介入頻度 | 軽量フィルタ閾値 | 起動方法 |
|---|---|---|---|
| 🔇 **静か** | 呼名のみ | A のみ通す | 「ジャービス静かに」「黙って」 |
| 👁 **観察**（デフォルト） | 重要時のみ | A+B+C+D 通す | 起動時デフォルト・「観察に戻して」 |
| 💬 **積極** | 気付き全部 | A+B+C+D+E 通す | 「ジャービス積極的に」「参加して」 |
| ⚡ **即答** | 呼ばれたら即（音声出力ON） | A 即実行・他は無視 | 「ジャービスどう思う？」型（一時的・1応答後 観察に戻る） |

モード状態：`v3/mode_state.json`（現状＋切替時刻＋自動降格時刻）

---

## 🔴 コスト対策（最重要）

**目標：MARK Ⅶ稼働で Max 20x プラン枠の20%以内**

### 計算根拠

- 軽量フィルタ：**ローカル判定・claude呼ばない・トークン消費0**
- 本格判定：claude -p で約3〜5k tok（入力2〜3k＋出力1〜2k）
- 観察モードでの介入率想定：5%（5秒×17280回判定/24h × 5% = 約860回 fire/日）
- 1日あたり：860 × 4k = **約340万 tok/日**
- Max 20x プラン日次相当：約 **2000万tok相当**
- 使用率：**約17%** → 目標20%以内クリア見込み

### 安全装置

- 1日上限：観察=200万tok・積極=500万tok・即答制限なし
- 1時間上限：観察=20万tok・積極=50万tok
- 上限到達で自動「静か」モード降格＋dashboard通知
- 「ジャービスうるさい」発話で即「静か」モード化（対話中の暴走停止）

---

## 🔴 ファイル配置

```
clone-jarvis/jarvis/live_session/v3/
├── SPEC_v3.md                       # この仕様書
├── stream_transcriber.py            # whisper-stream subprocess起動・stdout→txt追記
├── jarvis_active_daemon.py          # tail-f監視＋介入判定ループ
├── intervention_filter.py           # 軽量フィルタ（A〜E判定）
├── intervention_judge.py            # 本格判定（claude -p ラッパー）
├── mode_controller.py               # 4モード状態管理＋切替検出
├── voice_output.py                  # macOS say + ElevenLabs フック
├── output_dispatcher.py             # dashboard書込・音声出力・log記録
├── live_run_v3.sh                   # 統合起動
├── stop_v3.sh                       # 停止
├── README.md                        # 使い方
├── live_transcript.txt              # ストリーム文字起こし（追記専用）
├── intervention_log.jsonl           # 介入履歴
├── mode_state.json                  # 現在モード
└── tokens.jsonl                     # トークン消費記録
```

v2 は legacy として残す（会議丸ごとアーカイブ用に活用可）。

---

## 🔴 全権委任モードでの実装手順

ユーザー報告は **動作実証完了後の1回のみ**。

### Step 1: 技術検証（並列4Agent・完了済）
- whisper-stream 動作確認 ✅
- SFSpeechRecognizer 調査
- 軽量フィルタ設計＆疑似実装
- 音声出力検証

### Step 2: 本実装（並列）
- stream_transcriber.py
- jarvis_active_daemon.py
- intervention_filter.py / intervention_judge.py
- mode_controller.py
- voice_output.py
- output_dispatcher.py
- live_run_v3.sh

### Step 3: 統合・自己テスト
- 各モジュール dry-run
- 統合 dry-run
- 短時間実走（30秒喋る → 介入が出るか確認）

### Step 4: 自己レビュー
- 全モジュールに対して feedback_self_review_before_output.md の5項目チェック
- 失敗あれば自分で修正＋再テスト

### Step 5: dashboard 拡張
- mode_badge カード（現在モード表示）
- intervention_log カード（介入履歴）
- mark_badge.js の Mk Ⅶ要件 done フラグ更新

### Step 6: 暦会議シミュレーション自己テスト
- 「暦と会話してる」想定の独白音声を3分流す
- 「ジャービス」呼名・「迷う」など自然発話・モード切替を含める
- 介入が想定通り出るか確認
- 失敗あれば修正

### Step 7: ユーザー報告
- 全テスト通過した段階で初めて報告
- 「動かない」「うまくいってない」が来ない状態にしてから提出

---

## 🔴 確定事項サマリ

| 項目 | 確定値 |
|---|---|
| 文字起こし | whisper-stream（`--step 500 --length 5000`） |
| 監視方式 | tail-f（1秒間隔ポーリング） |
| 軽量フィルタ間隔 | 5秒 |
| 軽量フィルタ判定 | A〜E（モード別に通す範囲を変える） |
| 本格判定 | claude -p（subprocess） |
| 1fire 想定tok | 3〜5k tok |
| 1日上限 | 観察200万 / 積極500万 / 静か30万 |
| 介入率想定 | 観察5% / 積極20% |
| 音声出力 Stage 1 | macOS say -v Kyoko |
| 音声出力 Stage 2 | ElevenLabs（任意・key設定で有効化） |
| 音声出力 Stage 3 | 君の声クローン（MARK Ⅷ以降） |
| モード4種 | 🔇静か / 👁観察(default) / 💬積極 / ⚡即答 |
| モード切替 | 発話検出 + dashboardボタン |
| 自動降格 | 即答→観察 / 積極→観察（3時間）/ 上限到達→静か |
| 出力先 | dashboard live_meeting_YYYY-MM-DD.md + macOS say |
| 暴走停止語 | 「ジャービスうるさい」「黙って」即静か化 |

---

## 🔴 過去事故からの設計反映

- **自己増殖バグ**（v2 chunk方式の根本原因）：v3 はファイル中間生成しないので構造的にゼロ
- **MARK Ⅵ早期昇格**：v3 では「動作疎通」と「実用速度」「コスト要件」を全部通してから昇格
- **stop時の取りこぼし**：v3 はストリームなので途中切断でもバッファ書き込み済み分は失われない
- **多重起動チェック誤検知**：v3 の各モジュールは ps 厳格判定方式を継承

---

## 🔴 関連

- DNA 第11Aサイクル（MARK Ⅶ再定義）
- DNA 第11Bサイクル（全権委任モード）
- memory/feedback_full_delegation_mode.md
- memory/feedback_self_review_before_output.md
- memory/feedback_autonomous_decision.md
- memory/feedback_self_increment_bug_lesson.md
- v2 SPEC.md（撤退済・参照のみ）

---

*作成：2026-05-06 メインJarvis*
*次のステップ：Step 2 本実装（並列Agent投入）*
