Rei-Automator Phase 0/1 実装 spec chat-Claude 回答

2026-08-16 · chat-Claude 「全部入り設計書」 Phase 0/1 実装 spec archival · Rei stack aware 展開 7 例目 (実装 spec level 到達) · 6 open questions 全 answer + 判断層 interface + kill switch 3 段階 + audit log hash chain

本 page の 目的: chat-Claude 2026-08-16 local session で 生成された Rei-Automator Phase 0/1 実装 spec の bit-for-bit archival。 raw markdown (16 KB) + rendered HTML summary の 2 形式で 保存、 chat-Claude 側 WebFetch + 人間 review 両対応。

関連 artifact:

1. inventory を受けての 全体判断 (chat-Claude 引用)

「送られてきた 5層マッピングを見て、 当初の想定より 状況は 良いです。 (1) 実行層 が すでに厚い (系統A 14 + 系統B 12 kinds)、 (2) 安全層 に 土台がある (3-stage lifecycle / whitelist / DANGEROUS_PATTERNS / dryRun default)、 (3) 判断層 の ギャップが 正確に 特定されている。 したがって Phase 1 は 「全面書き換え」 ではなく 判断層 に interface を 1 枚差し込み、 安全層 に 3 つ足す という 限定作業 に なります。 想定より 軽い。 但し 順序だけは 譲れません: 判断層 interface → 安全層 → その他。」

2. 6 open questions への回答

Qchat-Claude 回答核 rationale
Q1 dormant bridgeretain-as-archive + 依存グラフから外す (`archive/` 移動)境界確定前に直すと 二重投資、 Phase 1 完了後 再訪
Q2 daily.ts 位置実行層 tool「daily = 時間トリガー」 判断でない、 Phase 3 常駐化で スケジューラプラグイン 昇格
Q3 plugin API 境界二層 (対外 MCP + 対内 EventBus)、 hypervisor+RuntimeBus 非公開MCP = 業界標準 + 学習コスト 0、 内部固定 = 自殺行為、 MCP 別プロセス = plugin=派生でない 主張の 技術的裏付け (Q5 と噛み合う)
Q4 provider scope4 minimum (Claude + GPT + Gemini + local Ollama)、 数より interface 完全性2 で 足りて 3 で 破綻 4 で 境界正しくなる、 local Ollama が 抽象化の穴を 暴く 4 番目 最重要
Q5 LicenseAGPL + Commercial dual 統一 + 「plugin=派生でない」 明文AGPL 単体は plugin 作者恐怖でエコシステム殺、 Linux kernel syscall exception 参照、 MCP 別プロセス が 技術的裏付け
Q6 配布 scope現状維持、 Phase 2 プラグイン API 公開 と 同時に 拡大Phase 0-1 の 破壊的変更を 外部 user に 晒さない、 「まだ 固まっていない API」 依存者 発生 防止
★ 私 (session A) の handoff で 見えていなかった cross-Q insight: Q3-Q5 の 噛み合い (「MCP 別プロセス = plugin=派生でない 主張の 技術的裏付け」) は 6 個 独立 Q として 扱った 私 の handoff より 上位 synthesis。 chat-Claude が Rei-aware 前提で cross-Q 相互作用 を 見つけた evidence。

3. 最重要 gap: 判断層 モデル抽象化 interface (superset + capability flags)

設計方針: 最小公倍数方式 でなく superset + capability flags (全 provider 機能の 和集合 + 各 provider 「自分に 何ができるか」 宣言)。 最小公倍数だと vision + tool calling 使えず Rei-Automator 中核 死ぬ。

3.1 TypeScript interface 定義 (系統 A 想定)

export interface ModelCapabilities {
  toolCalling: boolean;
  parallelToolCalls: boolean;
  vision: boolean;
  structuredOutput: boolean;      // JSON schema ネイティブ強制
  streaming: boolean;
  maxContextTokens: number;
  maxOutputTokens: number;
}

export type ContentBlock =
  | { type: 'text';        text: string }
  | { type: 'image';       mimeType: string; data: string }   // base64
  | { type: 'tool_use';    id: string; name: string; input: unknown }
  | { type: 'tool_result'; toolUseId: string; content: string; isError?: boolean };

export interface Message {
  role: 'user' | 'assistant';
  content: ContentBlock[];
}

export interface ToolSpec {
  name: string;
  description: string;
  inputSchema: object;            // JSON Schema
}

export interface ReasoningRequest {
  system?: string;
  messages: Message[];
  tools?: ToolSpec[];
  maxOutputTokens?: number;
  temperature?: number;
  responseSchema?: object;
  signal: AbortSignal;            // ★必須。 kill switch 実効性 依存
}

export interface ReasoningResponse {
  content: ContentBlock[];
  stopReason: 'end' | 'tool_use' | 'max_tokens' | 'aborted' | 'refusal';
  usage: { inputTokens: number; outputTokens: number };
  raw?: unknown;                  // 脱出ハッチ。 カーネル 絶対に読まない
}

export interface ReasoningProvider {
  readonly id: string;            // 'anthropic' | 'openai' | 'google' | 'local'
  readonly capabilities: ModelCapabilities;
  complete(req: ReasoningRequest): Promise<ReasoningResponse>;
  stream?(req: ReasoningRequest): AsyncIterable<StreamEvent>;
  countTokens?(req: ReasoningRequest): Promise<number>;
}

3.2 破ってはいけない 3 規則

  1. カーネルは raw を 絶対に読まない — 読んだ瞬間 抽象化 死ぬ、 lint ルールで 機械的禁止 が 確実
  2. capability が false の 機能を 暗黙 fallback しない — カーネル側で 明示 emulation か 明示 error、 暗黙 fallback は 再現不能バグの 温床
  3. signal は 必須引数 — optional にすると 渡し忘れで abort 効かない

3.3 Phase 1 完了条件

同一タスクを 4 provider で 実行し、 raw を除いた 出力の 「形」 が 完全に一致すること。

具体: スクリーンショット 1 枚 + tool 1 個 呼ぶ タスクで、 4 provider の content ブロック構成 + stopReason + usage 型 が 揃うことを 自動 test で 確認。 通らない箇所 = 抽象化の 穴。

4. 安全層: Phase 0 in-scope の 3 件

4.1 Kill switch (最優先、 3 段階)

段階動作用途
pause現ステップ完了後に停止通常中断、 状態が 綺麗に残る
abort進行中操作を AbortSignal で中断誤動作 気づいた時
haltプロセス即時終了 + 未完了操作を記録暴走時の 最終手段

実装 要点:

★ Rei stack 既存の 再利用: 既存 DANGEROUS_PATTERNS + Theory#196 判定 ロジックは、 そのまま 「abort 不可区間の 入口 マーカー」 として 再利用可能。 新規 危険操作リスト 作る必要なし。

4.2 dryRun 明示 API

4.3 audit log 独立 store (append-only JSONL + hash chain)

execution-logaudit log
目的デバッグ説明責任
消去してよいしてはいけない
形式任意追記専用
{"ts":"...","actor":"...","action":"file_delete","target":"...","approved_by":"...","prev":"sha256:..."}

Phase 4 で 法人向け 出す時 後から遡って 作れない 種類 の データ。 今から 溜め始める 価値あり。

5. 残り 3 層への 指示 (Phase 1 では 着手しない)

指示
認識層DOM / event stream 統一 正規化は Phase 2。 判断層 interface 確定後、 ContentBlock に 合わせる 設計 で 手戻りなし
実行層現状 最も 厚い、 Phase 1 では 触らない。 macro record/replay + plugin sandbox は Phase 2
記憶層長期メモリは Phase 3。 但し Phase 1 内 に 「保存先 dir 構造」 だけ 決めておく (markdown 保持 = OpenClaw pattern 踏襲)

6. Week 1 作業順 7 step

  1. ReiAutomatorBridgearchive/ へ移動、 build 対象から 除外 (Q1)
  2. LLM 呼び出し箇所 を 全て 洗い出し、 list 化
  3. 上記 interface を 型定義 file として 先に 置く (実装なし、 型だけ)
  4. 既存 呼び出しを 1 つだけ interface 経由に 置き換え、 動作確認
  5. kill switch AbortController を カーネル root に 設置、 上記 1 箇所に signal 通す
  6. 「abort 不可区間」 を DANGEROUS_PATTERNS から extract、 list 化
  7. ライセンス方針 を 1 ページ で 文書化 (Q5)
★ 3 と 4 の 順序が 重要: 型を 全部 置いてから 実装を 1 つ通す ことで、 interface の 穴が 最速で 露出。 型 なしで 実装 先行 = 後から interface 修正で 全 呼び出し変更 = 二重投資。

7. chat-Claude 側の 未受領事項 (★ 本 site 反映で 解決可能)

chat-Claude Section 6 が 「C:\Users\user\Downloads\rei-automator-inventory-for-chat-claude.md (15.2 KB / 200 行 / 9 section) は 未受領」 と 明示、 「chat 側に 直接添付 いただければ、 実ファイル・実関数単位 での 仕分けと 既存 LLM 呼び出し箇所 の 具体的な 置換パッチまで 踏み込めます」 と request。

★ 解決: 前 turn の 藤本さん judgment overturn で 私 (session A) が site 反映済。 chat-Claude は WebFetch で 直接 取得可能: 藤本さん が chat-Claude に URL を 伝えるだけで、 実 200 行 全 access → 実ファイル・実関数単位 の 仕分け 可能に なります。

8. Honest scope (譲れない線)

  1. 本 page は chat-Claude 生成 spec の bit-for-bit archival、 内容 は chat-Claude 帰属、 Rei stack contribution は archival + Rei-aware 展開 pattern record のみ
  2. chat-Claude は Rei-aware 展開 7 例目 で 実装 spec level 到達 = inventory handoff の 直接 downstream、 独立到達 signal ではない (brief 後 aware 展開)
  3. Phase 1 実装 は 藤本さん judgment 待ち、 本 site 反映 は spec permanent record + inventory URL bridge 通知 の 2 目的のみ
  4. chat-Claude 提案 interface + kill switch + audit log は 実装 前 段階、 実 Rei stack 適用時の adaptation は 実装 phase で 発生
  5. 「AGPL + Commercial dual + plugin=派生でない 明文 + Linux syscall exception」 は 藤本さん 弁護士 confirm 推奨 (chat-Claude 自身 明示 「私は弁護士ではないので」)
  6. 本 spec の Week 1 作業順 7 step は 現状 未実行、 藤本さん が 別 GO で Phase 1 実装 選択可能