DuDuClaw アーキテクチャ概要
アーキテクチャ概要(v1.67.0 時点で照合済み)
Section titled “アーキテクチャ概要(v1.67.0 時点で照合済み)”DuDuClawはマルチランタイム AI エージェントプラットフォーム(Multi-Runtime AI Agent Platform)であり、統一された AgentRuntime トレイトを通じてClaude Code / Codex / Antigravity / Grok CLI(および OpenAI 互換 API)をAIバックエンドとしてサポートし(Gemini CLI バックエンドは削除済みで、Antigravity は引き続きサポート)、自動検出とエージェントごとの設定に対応しています。DuDuClawは単体のLLM製品ではなく、1つ(または複数)のAI CLIを、チャネルルーティング・セッション記憶・自己進化・マルチアカウントローテーション・ローカルLLM推論・ブラウザ自動化・IDE統合を備えた長時間稼働エージェントへと変える配管層です。
主要なアーキテクチャ上の決定
Section titled “主要なアーキテクチャ上の決定”ランタイムとトランスポート
Section titled “ランタイムとトランスポート”- Multi-Runtime(
AgentRuntimeトレイト)—runtime_catalog.rsに 12 個のランタイムidがあります。11 個の CLI バックエンド(Claude、Codex、Antigravity(agy)、Grok、Qwen Code、Kimi Code、GitHub Copilot CLI、Kiro、Cursor、Mistral Vibe、OpenCode)と OpenAI-compat HTTP です。4 つの CLI と OpenAI-compat はそれぞれ専用モジュールを持ち、残り 7 つの CLI は汎用の print モードランタイム 1 つを共有します。RuntimeRegistryによる自動検出、エージェントごとの設定はagent.toml [runtime] providerに記述。 - ランタイム間フェイルオーバー時のモデル置換(
failover.rs):[runtime] fallbackが別の provider に呼び出しを回す場合、フォールバック先ランタイムはプライマリのモデルidを引き継がなくなりました(以前は codex エージェントのgpt-5.4が Claude ランタイムに対して spawn されていました)。モデルは次の4つの分岐を順に評価して決まります。①agent.toml [model] fallbacksのうち、モデルファミリーが確実にフォールバック先ランタイムのものである最初のエントリ(provider/model形式の修飾は外します)、② そのランタイムが要求されたモデルをすでに扱える場合は要求モデルを維持(モデルファミリーを宣言しないopenai_compatが任意のidをプロキシし続けられるのはこの分岐によります)、③ ランタイムカタログがそのバックエンドに載せている最初のモデル、④ いずれにも当てはまらなければspawn を拒否し、no model configured for fallback runtime <P>を報告して失敗した試行として記録します。置換のたびにagent/from_runtime/to_runtime/from_model/to_modelを含むwarn!を出力します。 - MCP Server(stdio)(
duduclaw mcp-server)— stdin/stdout上のJSON-RPC 2.0を通じて、チャネル・メモリ・エージェント・skill・task・共有wiki・autopilotの各ツールをAI Runtimeに公開します。登録はエージェントレベルの<agent>/.mcp.json(v1.8.5でv1.8.4のグローバル登録を取り消しました。Claude CLIの-p --dangerously-skip-permissionsはプロジェクトレベルの.mcp.jsonしか読み込まないため)。Gateway起動時に全エージェントの.mcp.jsonを自動作成・修復します。 - MCP Server(HTTP/SSE)(
duduclaw http-server --bind 127.0.0.1:8765、v1.9.4)— Bearer認証のPOST /mcp/v1/call(単発のJSON-RPCツール呼び出し)、GET /mcp/v1/stream(長時間接続のSSEイベントストリーム、Bearerまたは?api_key=)、POST /mcp/v1/stream/call(非同期+SSE結果プッシュ)、GET /healthz(認証不要)。トークンバケット方式のレート制限(60 req/min)。mcp_sse_store.rsがbroadcastチャネルでSSE接続を管理します。外部HTTPクライアント向けにstdioを補完します。 - ACP と A2A—
duduclaw acp(=duduclaw acp client)は Zed / JetBrains / Neovim のエージェントパネル向けに、stdio 上で Agent Client Protocol v1 を実装します。duduclaw acp server(旧名acp-server、v1.69.0 で削除)は A2A を提供します。message/sendはbus_queue.jsonlに追記し、tasks/getは bus の観測結果を A2A の状態に対応づけ、Agent Card は/.well-known/agent-card.json(旧/agent.jsonエイリアスあり)にあります。 - エージェントディレクトリはClaude Codeと互換性があります。各ディレクトリには
.claude/、.mcp.json、SOUL.md、CLAUDE.md、CONTRACT.toml、agent.toml、wiki/、SKILLS/、memory/、tasks/、state/が含まれます。
チャネル(11種類)
Section titled “チャネル(11種類)”- Telegram(ロングポーリング)— ファイル/写真/スタンプ/音声、フォーラム/トピック、メンション限定、OpenAI Whisper API による音声文字起こし。
- LINE(webhook)— HMAC-SHA256署名、スタンプカタログ、チャットごとの設定。
- Discord(Gateway WebSocket)—
tokio::select!によるハートビート、スラッシュコマンド、自動スレッド。ボイスチャンネル(Songbird)はデフォルト無効のdiscord-voicefeature を有効にしたビルドでのみ使え、リリースバイナリには含まれません。v1.9.2で強化:本物のop 6 RESUME(session_id+resume_gateway_url+ シーケンス番号を永続化)、スタール監視(ハートビート間隔の2倍を超えて通信がなければ切断)、ハートビートチャネルの容量を1→16にしtry_sendへ変更、op 9に1〜5秒のジッターを追加、RESUMEDディスパッチの処理、backoff上限を60秒に短縮。 - Slack(Socket Mode)、WhatsApp(Cloud API webhook、署名検証は fail-closed)、Feishu(Open Platform v2)、Google Chat(webhook、JWT 検証)、Microsoft Teams(Azure Bot / Connector v3、JWT 検証)、WeCom(HMAC-SHA1 + AES-256-CBC)、DingTalk(HMAC-SHA256 + 時間窓)、WebChat(
/ws/chat+ Reactフロントエンド)。 - 汎用の
POST /webhook/{agent_id}エンドポイントは一度もマウントされたことがなく、v1.66 で削除されました。受信 webhook は個々のチャネルと Odoo(POST /webhook/odoo)に属します。 - チャネルのホットスタート/ストップ:Dashboardの
channels.add/channels.removeでgatewayを再起動せずにチャネルタスクを起動/中断できます。 - メディアパイプライン:画像の自動リサイズ(最大1568px)+ MIME検出 + Vision統合。
サブエージェントオーケストレーション
Section titled “サブエージェントオーケストレーション”create_agent/spawn_agent/list_agentsMCPツール、reports_to階層と連動。- System promptが「## Your Team」サブエージェント名簿を自動注入します。
- 構造化ハンドオフ:
DelegationEnvelope(context / constraints / task_chain / expected_output)、失敗時はRaw形式にフォールバック。 - TaskSpecワークフロー:依存関係を考慮したスケジューリング、自動リトライ(3回)、リプラン(2回)、永続化を備えた多段階タスク計画。
- 長文レスポンスの分割:チャネルのバイト予算を超えるサブエージェントの返信は
channel_format::split_textで分割され、📨 **agent** 的回報 (1/N)/(續 2/N)ラベルが付与されます(Discord 1900 / Telegram 4000 / LINE 4900 / Slack 3900)。 - 孤立レスポンスの復旧:
reconcile_orphan_responsesが、クラッシュ/Ctrl+C/ホットスワップで取り残されたbus_queue.jsonlのエントリをアトミックに再生します。
セッション記憶スタック
Section titled “セッション記憶スタック”- ネイティブなマルチターン:Claude CLIの
--resume <session-id>(SHA-256による決定的なセッションID付き)。--resumeが失敗した場合(古いハンドル、アカウントローテーション、未知のstream-jsonエラー)は履歴をプロンプトに埋め込む方式に自動フォールバックします。 - ターントリミング(800文字超 → 先頭300 + 末尾200 +
[trimmed N chars]、CJK対応)。 - Direct APIのpromptキャッシュ(“system_and_3” ブレークポイント戦略。測定済みのヒット率は公表していません)。
- 圧縮サマリーは50kトークンの閾値でsystem prompt(会話ターンではなく)に注入されます。
- Instruction Pinning(v1.8.6 P0)— ユーザーの最初のターン → 非同期でHaikuがコアタスクを抽出 →
sessions.pinned_instructionsに保存 → system promptの末尾に注入(U字型の注意分布を利用)。明確化の回答は蓄積されます(≤1000文字)。 - Snowball Recap(v1.8.6 P0)— 各ターンでユーザーメッセージの前に
<task_recap>を付加。LLMコストはゼロ。 - P2 Key-Fact Accumulator(v1.8.6)— 実質的な内容のあるターンごとに、Haikuが2〜4件の重要事実を抽出 → FTS5付きの
key_factsテーブルに保存 → 最も関連性の高い上位3件をsystem promptに注入。約100〜150トークンで、MemGPTの6,500トークン(−87%)と比較して大幅に削減。 - CLI軽量パス—
call_claude_cli_lightweight()に--effort medium --max-turns 1 --no-session-persistence --tools ""を付与し、メタデータタスクに使用。コストを25〜40%削減。 - 安定化フラグ—
--strict-mcp-config(MCP分離)+--exclude-dynamic-system-prompt-sections(ターンをまたいだprompt安定性、トークンを10〜15%削減)。--bareはv1.8.11で削除されました(OSキーチェーンの認証情報検索を壊していたため)。
- 予測駆動エンジン:Active Inference + Dual Process Theory。設計上、ほとんどの会話は LLM 呼び出しなしで終わります(測定済みの割合は公表していません)。中程度の誤差はエピソード記憶として保存され、有意な誤差は AEE の進化ラウンドを開始し、重大な誤差(または有意な誤差が3回連続)は緊急ラウンドを開始します。無視できる誤差のうち少数の探索枠(ε、下限 5%)もラウンドを開始します。
- MetaCognition:100回の予測ごとに誤差閾値を自己校正。
- MistakeNotebook:ループを横断するエラー記憶で退行を防止。エントリには決定的な
TrajectoryEvidence(どのツール/アサーションが失敗したか)が付与され、リフレクションの統合が未検証の自己申告診断を鵜呑みにしなくなりました(Evolution v3)。 SOUL.mdはエージェントに対して読み取り専用です(Evolution v3 WP1.1、オペレーター/ダッシュボードのみ書き込み可)。旧来のGenerator→Verifier→Updater書き換え経路、SOUL.mdバージョン管理、24時間の観察ウィンドウ、自動ロールバックは 2026-09-29(S11)に削除されました:エージェントに代わってこのファイルを書ける経路がもう存在しない以上、それらが守っていた対象自体がありません。- AEE(Agentic Evolution Engine、唯一の進化エンジン):進化の対象は
SOUL.mdではなくplaybookです。カテゴリ/シグナル/eval caseに紐づく、小さく個別に廃止可能な遺伝子状のエントリの集合で、Gate(決定的、拒否権を保持)とMeasure(スコアリング、拒否権なし)の分離、champion+現状維持か改善のみ許可するコミットゲート(matches-or-improves)、そしてファイル全体ではなくエントリ単位の観察期間を通じて進化します。詳細はevolution-engine.md第12章とdocs/features/38-aee-playbook-evolution.mdを参照。 - Agent-as-Evaluator:独立したEvaluator Agent(コスト管理のためHaikuを使用)が、構造化されたJSON判定によるアドバーサリアル検証を行います。
- ConversationOutcome:LLMコストゼロで会話結果を検出(TaskType / Satisfaction / Completion)、zh-TW + en の両言語に対応。
- 外部要因:ユーザーフィードバック、セキュリティイベント、チャネル指標、Odooのビジネスコンテキスト、他エージェントからのシグナルが予測エンジンと進化ラウンドに反映されます。
Wikiナレッジレイヤー(v1.8.9)
Section titled “Wikiナレッジレイヤー(v1.8.9)”- 4層アーキテクチャ(Vault-for-LLMに着想):L0 Identity / L1 Core / L2 Context / L3 Deep。
- 信頼度重み付け(frontmatterの
trust、0.0〜1.0)— 検索結果は信頼度加重スコアで順位付けされます。 - 自動注入:
build_system_prompt()がL0+L1ページを自動的にWIKI_CONTEXTへ注入します。CLI/チャネル返信/dispatcherの各パスに対応し、Claude / Codex / Antigravity / Grok / OpenAI-compat の各ランタイム(および非推奨の Gemini ランタイム)で統一されています。 - FTS5インデックス(
unicode61トークナイザー)— 書き込み/削除のたびに自動同期、wiki_rebuild_ftsで手動再構築も可能。 - ナレッジグラフ:
wiki_graphMCPツールがBFS深度を制限したMermaid図をエクスポート。ノードの形状はレイヤーごとに異なります。 - 重複検出:
wiki_dedupはタイトル一致+タグのJaccard類似度(≥0.8)で重複ページを検出します。 - 逆引きbacklinkインデックス:
relatedfrontmatterと本文中のmarkdownリンクをスキャンし、双方向のマッピングを構築します。 - 検索フィルター:
wiki_search(どちらの scope でも)はmin_trust、layer、expand(1ホップのbacklink展開)に対応。 - Shared Wiki:
~/.duduclaw/shared/wiki/にエージェント横断のSOP・ポリシー・製品仕様を格納。可視性はwiki_visible_tocapabilityで制御。
メモリシステム
Section titled “メモリシステム”- 認知メモリ(オプション):
SqliteMemoryEngine、エピソード記憶と意味記憶を分離し、Generative Agentsの3軸重み付け検索(Recency × Importance × Relevance)を採用。 - メモリ減衰の日次スケジューラー:バックグラウンドタスクが24時間ごとに
duduclaw_memory::decay::run_decayを実行。重要度が低く30日経過 → アーカイブ。アーカイブ済みで90日経過 → 完全削除。 - 認知メモリMCPツール:
memory_search_by_layer(エピソード/意味フィルター)、memory_successful_conversations、memory_episodic_pressure、memory_consolidation_status。 - MemGPT 3層システム(Core Memory、Recall Memory、Archival Bridge、Budget Manager、Consolidation Pipeline、MCPツール6個)はv1.8.1で削除されました(−1,985行)。このプロンプト注入方式はプロンプトごとに6,500トークンも肥大化させ、「lost in the middle」による注意力の劣化を引き起こしていました。
ローカル推論
Section titled “ローカル推論”- 統一
InferenceBackendトレイト(duduclaw-inferencecrate):OpenAI互換HTTP(llama-server/Ollama/vLLM/SGLang/llamafile)。プロセス内の llama.cpp、mistral.rs、MLX バックエンドは 2026-09 に削除されました。どのリリースバイナリもこれらをコンパイルしていませんでした。代わりにローカルの OpenAI 互換サーバーを動かしてください。 - Confidence Router:LocalFast / LocalStrong / CloudAPIの3段階ルーティング、CJKを考慮したトークン推定。
- InferenceManager:自動切り替えのステートマシン:llamafile → Direct backend → OpenAI-compat → Cloud API。
- llamafile manager:サブプロセスのライフサイクル管理、ヘルスモニタリング、localhostでOpenAI互換APIを提供。
- MCPツール:
model_list、model_load、model_unload、inference_status、hardware_info、route_query、inference_mode、llamafile_start/stop/list。
トークン圧縮
Section titled “トークン圧縮”- 返信経路の予算パイプライン(
gateway/prompt_compression.rs):TurnTrim → DropOldestToolEchoes → BisectAndSummarize。コスト圧力を考慮し、CJK 安全なトークン推定を使います。直近のキャッシュ効率が 50% を超え、予算超過が 15% 未満のときはスキップします。 - 以前の Meta-Token(LTSC)/ LLMLingua-2 / StreamingLLM 圧縮器と、その
compress_text/decompress_textツールは v1.33 で削除されました。
音声パイプライン
Section titled “音声パイプライン”- HTTP エンドポイント:
POST /api/stt(OpenAI 互換の文字起こし API またはローカルのコマンドテンプレート。STT provider が未設定なら 501)、POST /api/tts(Piper(ローカル)/ Edge TTS / MiniMax T2A / OpenAI TTS)。 - Telegram の音声:OpenAI Whisper API による文字起こしと Edge TTS による返信で、どちらもハードコードされています。ダッシュボードの音声設定はこの経路には反映されません。
- リリースバイナリに含まれないもの:プロセス内 Whisper(
whisperfeature)、ONNX 埋め込み(onnxfeature)、Discord ボイス(discord-voicefeature)。 - SenseVoice、Deepgram、Silero VAD、
symphoniaによるデコード、LiveKit の音声ルームは以前ここに記載されていましたが、いずれもコードが存在しません。docs/features/ja-JP/14-voice-pipeline.mdを参照。
セキュリティ
Section titled “セキュリティ”- Claude Code PreToolUse hooks(
agent_hook_installerがエージェントごとに<agent_dir>/.claude/settings.jsonへ導入):duduclaw hook agent-file-guard(Rust サブコマンド、matcherWrite|Edit|MultiEdit|NotebookEdit|Bash、コマンドは--agentと--homeを持つ。正規ツリー外のエージェント構造ファイル、自分の SOUL.md/CONTRACT.toml への書き込み、他エージェントへの書き込みをブロックし、社員の呼び出し元には DuDuClaw ホーム内で自分のエージェントディレクトリとattachments/以外への書き込みを、シンボリックリンク解決後の実際のパスで判定して拒否する。reports_to/department/name/[capabilities]/[delegation]/[acp]に対するorg_field_guardのフィールド単位凍結と、社員自身のagent.tomlのうち編集可能リスト外のすべてのセクションの凍結を含む。Bash 側は減速帯で、Readは対象外。ルールと制約は05-security-defense.mdを参照)とduduclaw hook data-file-guard(RFC-23 §14.4、matcherRead|Bash、匿名化が有効なときだけ武装。サンドボックスではなくBashのファイル名ヒューリスティック。H10 2026-09 が Windows で無効だったシェルスクリプトを置き換え)。2026-04 の3段階シェルスクリプト防御と GREEN/YELLOW/RED の脅威レベルステートマシンはba015a48で削除済みです。docs/features/ja-JP/05-security-defense.mdを参照。 - SOUL.mdドリフト検出(SHA-256フィンガープリント、
.soul_history/に最大10世代のバックアップ)。 - Prompt injectionスキャナー(
input_guard、11種類のルールカテゴリ、ブロック閾値60、NFKC正規化、英語+zh-TW パターン、XML区切り文字による保護)。 - 機密情報漏洩スキャナー— 19 種類の機密パターン(Anthropic / OpenAI / AWS / GitHub / GitLab / Slack / Stripe / Google / SendGrid / JWT / PEM 鍵、および鍵やパスワードの代入)と高エントロピー検査。skill セキュリティスキャナーが使用します。
- CONTRACT.toml—
must_not/must_alwaysの境界ルール、system promptに自動注入。duduclaw testレッドチームCLI(組み込み9シナリオ)。 - 統一マルチソース監査ログ:
audit.unified_logがsecurity_audit.jsonl/tool_calls.jsonl/channel_failures.jsonl/feedback.jsonlを共通のエンベロープ(timestamp / source / event_type / agent_id / severity / summary / details)にマージし、Logsページのフィルターチップで絞り込めます。 - 保存時はAES-256-GCM— エージェントごとに鍵を分離。
- ダッシュボード/WebSocket 認証:JWT アカウントログイン(パスワードは Argon2id でハッシュ化して
users.dbに保存)、または gateway の管理者トークンです。以前の Ed25519 challenge-response の経路は gateway から削除されました。どの設定からも有効にできないものでした。Ed25519 はライセンス署名、更新の検証、relay のデバイスプロトコルで引き続き使われます。 - コンテナサンドボックス:独立した 2 つのパスがあります。エージェント単位のタスクサンドボックス(
agent.toml [container] sandbox_enabled)は、委任されたタスクの AI CLI を読み取り専用・非 root・リソース制限付きの Docker コンテナで実行します(Docker のみ、network_access = trueが必要、実行できないときは fail-closed。タスクサンドボックスガイドを参照)。PTCexecute_programとsecauditの PoC ステップが使うスクリプトサンドボックスは Docker 上(Windows ではまず WSL2)で動き、--network=none、読み取り専用ルートで、マウントは読み取り専用の専用スクリプトディレクトリだけです。使えないとき PTC はスクリプトを実行せず([container.sandbox] script_when_unavailable = "run_unsandboxed"の場合を除く)、PoC はホスト上で実行されません。 - ブラウザ自動化と Computer Use:エージェントが選ぶ取得ツール 2 つと任意のブラウザサーバーがあり、自動ルーターはありません。L1
web_fetch_cached(SSRF ゲート付きキャッシュ HTTP)、L2web_extract(CSS セレクタスクレイプ)。L5 Computer Use はcomputer_use_orchestratorが起動するコンテナ内で動き(イメージghcr.io/zhixuli0406/duduclaw-computer-use:v<version>、自動 pull なし、アクションはxdotool)、エージェントが 8 つのcomputer_*MCP ツールで駆動します(duduclaw mcp-serverプロセスが署名付き loopback ルートPOST /api/internal/computer-use、computer_use_sessions/を通じて gateway 所有のセッションに転送。ネットワークはセッション開始時にピン留めされた、エージェントごとのallowed_domainsのホストにのみ)。チャットで起動するループとnativeのホストデスクトップモードは削除されました。L3 ヘッドレスはエージェントごとの任意の Playwright/Browserbase MCP サーバー(.mcp.json)。CapabilitiesConfig(computer_use/browser_via_bash/allowed_tools/denied_tools)によりデフォルト拒否。死コードだったbrowser_router.rsの5層ルーターとその「L4 Sandbox Browser」層は 2026-09 に削除。 - CJK安全なバイトスライス:
duduclaw_core::truncate_bytes/truncate_charsが31箇所の安全でないs[..s.len().min(N)]を置き換え(v1.8.11のマルチバイトコードポイントpanicを修正)。
アカウントとコスト
Section titled “アカウントとコスト”- エージェントごとのモデルルーティング(SDKファースト):
agent.toml [model]—preferred(Claude SDKモデル)、local.model、local.use_router、api_mode(cli/direct/auto)、account_pool(後述)。 - マルチOAuthアカウントローテーション:OAuthセッション(Claude Pro/Team/Max、
claude auth status経由。setup-tokenアカウントはCLAUDE_CODE_OAUTH_TOKEN)+ APIキー。4種類の戦略(Priority/LeastCost/Failover/RoundRobin)。レート制限クールダウン(2分)、課金枯渇クールダウン(24時間)、予算強制、トークン有効期限追跡(30日/7日前の警告)。 - エージェントごとのアカウントプール(
agent.toml [model] account_pool):そのエージェントが使用できるローテーション対象アカウントを制限します。適用対象は候補集合(provider/health/cooldown/budgetのフィルターの後、戦略実行の前)なので、4つの戦略はすべて絞り込んだ集合上でも意味論をそのまま保ちます。エントリはアカウントのidまたはdashboardのlabel(完全一致、トリム済み、ASCII大文字小文字を区別しない。部分一致は不可)と照合されます。Fail-open:プールが利用可能なアカウントに一件も一致しない場合(idが古い、全アカウントがクールダウン中など)はwarnを記録し、フルセットにフォールバックします。古くなったプールがエージェントをアカウントなしの状態にすることは絶対にありません。未設定/空 ⇒ ローテーションの挙動は変わりません。エントリポイント:AccountRotator::select_with_pool/select_for_provider_with_pool。 - 二重ディスパッチパス:サブエージェントディスパッチャー(
claude_runner::call_with_rotation)とユーザー向けチャネル返信(channel_reply::call_claude_cli_rotated→rotate_cli_spawn_with_pool)の両方がrotatorを経由し、それぞれ応答するエージェントのaccount_poolを引き継ぎます。 FailureReason分類— RateLimited / Billing / Timeout / BinaryMissing / SpawnError / EmptyResponse / NoAccounts / Unknown。カテゴリごとに専用のzh-TWユーザー向けメッセージを表示し、channel_failures.jsonlに監査記録を残します。- バイナリ検出:
which_claude()/which_claude_in_home()がHomebrew(Intel + Apple Silicon)、Bun、Volta、npm-global、.claude/bin、.local/bin、asdf shims、NVMバージョンディレクトリを探索します。PATHが空の状態でlaunchdから起動されたgatewayがバイナリを発見できない問題を修正。 - CostTelemetry:SQLiteベースのトークン使用量トラッキングとキャッシュ効率分析(
cache_read / (input + cache_read + cache_creation))、200Kの価格崖警告、適応的ルーティング(キャッシュ効率<30% → ローカルへ)。MCPツール:cost_summary、cost_agents、cost_recent。 - モデル別コスト集計(
CostTelemetry::summary_by_model):token_usageには最初のスキーマからmodel列がありましたが、集計はすべて agent / user / day 単位で、「どのモデルにお金が使われているか」には答えられませんでした。summary_by_model(agent_id: Option<&str>, since_unix)はモデル別にグループ化し(コストの高い順。モデルidが記録されていない行は推測せず"(unknown)"にまとめます)、requests/input_tokens/output_tokens/cache_read_tokens/cache_creation_tokens/cost_millicents+cost_usd/cache_efficiencyを返します。コストは各行に保存済みのcost_millicentsの合計で、他の集計と同じ単一の価格計算経路(cost_for、記録時に1回だけ適用)を使い、再計算はしません。cost_usdは単位換算のみです。公開は追加的に行います。MCP のcost_summaryとcost_agentsのレスポンスに同じ期間のby_model配列が加わり(cost_agentsの agent 行は、トップレベルのJSON配列には名前付きの兄弟フィールドを持たせられないためagentsキーの下に移ります)、ダッシュボードRPCcost.by_model(パラメータagent_id?、days?、デフォルト7、1〜365に制限)は他のcost.*と同じ admin ゲートの下で集計を返します。cost_summary/cost_agents内で集計に失敗した場合は、呼び出し側が実際に行った呼び出しを失敗させず、空のby_modelに縮退します。 - Direct APIクライアント(
direct_api.rs):純粋なチャットではClaude CLIを迂回し、system promptにcache_control: ephemeralを付与します(測定済みのヒット率は公表していません)。単一のreqwest::Client(タイムアウト120秒)を使用。全OAuthアカウントがクールダウン中のフォールバックとして利用。
スケジューリング
Section titled “スケジューリング”- HeartbeatScheduler:エージェントごとの統一スケジューリング。busポーリング + GVUサイレンスブレーカー + cron、
max_concurrent_runsセマフォで制御。 - CronScheduler:
cron_tasks.jsonl(v1.8.12以降はcron_tasks.dbも)を読み込み、cron式に従ってタスクを発火します。list_cron_tasksは全タスクを返します(v1.8.3以降、default_agentによる絞り込みは行いません)。スケジュールはtasks_create+scheduleで作成します。旧来のschedule_taskMCPツールは v1.69.0 で削除されました。 - ReminderScheduler:一回限りのリマインダー(相対時間
5m/2h/1dまたはISO 8601)、direct静的メッセージまたはagent_callbackウェイクアップモード。
Skillエコシステム
Section titled “Skillエコシステム”- 6段階のライフサイクル:Activation → Compression(3層の段階的ロード)→ Extraction → Distillation → Diagnosis → Gap Analysis。以前の Reconstruction 段階は呼び出し元がなく、2026-09 に削除されました。
- GitHubライブインデックス— Search API + 24時間のローカルキャッシュ + 加重検索。
- Skill自動合成(Phase 3-4):gap accumulatorが繰り返し発生するドメインギャップを検出 → エピソード記憶からskillを合成(Voyagerに着想)→ TTL付きサンドボックス試行 → エージェント横断の卒業判定。デフォルトは無効(
agent.toml [evolution] skill_synthesis_enabled)。MCPツール:skill_security_scan、skill_graduate、skill_synthesis_status。 - Rustネイティブ Skillセキュリティスキャナー(
skill_lifecycle::security_scanner)— Pythonサブプロセス不要。dashboardの審査、MCPのskill_security_scanツール、サンドボックス試行ゲートを支えます。
タスクとナレッジ
Section titled “タスクとナレッジ”- Task Board:SQLiteベースのタスク管理(状態/優先度/割り当てを追跡)+ リアルタイムActivity Feed WebSocket。ダッシュボード RPC:
tasks.list/create/update/remove/assign、activity.list。エージェント向け MCP ツール:tasks_list、tasks_create、tasks_update、tasks_claim、tasks_complete、tasks_block、activity_list、activity_post。AI 社員が自分のものでないタスク(担当者・取得者・作成者のいずれでもない。complete と block は担当者と取得者のみ)を変更するには担当者との委譲関係が必要で、制御用タグoutcome:…、grant:…、auto-researchの追加・削除・並べ替えはできない。goal タスクのtitle、description、acceptance_criteriaは AI 社員に対して凍結。 - 共有ナレッジベース:
~/.duduclaw/shared/wiki/、Wikiの対象分類(agent/shared/both)に対応。MCPツール:scope="shared"を付けたwiki_ls/read/write/search/stats/lint(6 つのshared_wiki_*表記は v1.69.0 で削除)、およびshared_wiki_deleteとwiki_share。 - Autopilotルールエンジン:委任/通知/skill実行の自動化。新しいルールが使えるトリガー(12種類):
task_created、task_updated、task_status_changed、activity_new、channel_message、agent_idle、run_at_risk、os_file、os_frontmost、tick、security_event、odoo_event。cron_tickは送出されず、v1.67.1 から作成時に拒否(23-autopilot-engine)。
インテグレーション
Section titled “インテグレーション”- Odoo ERPブリッジ(
duduclaw-odoocrate):CE/EEに対応するJSON-RPCミドルウェア、17個のMCPツール(CRM/Sales/Inventory/Accounting)、EditionGate自動検出、イベントポーリング +POST /webhook/odoo(どちらもデフォルト無効)がodoo_eventの autopilot ルールに流れます。OdooConnectorPoolによるエージェントごとの認証情報分離(RFC-21 §2、v1.11.0)。Dashboardの保存前テスト:odoo.testRPCがインラインパラメータを受け付け(v1.13.1)、認証情報を省略すると保存済みシークレットにフォールバック。odoo.configureと同じSSRF/HTTPS/DB名バリデーターを使用。scrub_odoo_error()が接続エラーを240文字に切り詰め、HTML/URLの漏洩を防ぎます。 - Prometheusメトリクス:gateway HTTPの
GET /metrics。フェイルオーバー、wiki の信頼度、意思決定の継続性、プロンプト圧縮、常駐センシング(tick_*)、goal loop、ライブフォークのカウンター。リクエスト/トークン/所要時間/セッション/チャネル/予算の系列は一度もインクリメントされておらず、v1.66 で削除されました。 - RLトラジェクトリコレクター:チャネルとのやり取り中、エージェントごとの軌跡を
~/.duduclaw/rl_trajectories.jsonlに書き込みます。これをエクスポートしていたduduclaw rlCLI は 2026-09 に削除されました。 - BroadcastLayer tracing layerがリアルタイムログをWebSocket購読者にストリーミングします。
- Dashboard WebSocketハートビート:サーバーは30秒ごとにPingを送信し、Pongが60秒間なければアイドルソケットを切断します。クライアント側は25秒ごとにアプリケーションレベルの
pingRPCを送信します(ブラウザは制御フレームを送出できないため)。
信頼性とガバナンス(v1.9.4)
Section titled “信頼性とガバナンス(v1.9.4)”duduclaw-durabilitycrate(🗑️ 2026-07-04 のコミットb0639b96で削除)— このcrateは5本柱の耐久性フレームワーク(idempotency、retry、circuit_breaker、checkpoint、dlq)を含んでいました。本体コードベース全体で呼び出し元がないことが確認されたため、削除されました。gatewayのLLM fallbackチェーンは他のメカニズムを使用しています(gateway/failover.rsを参照)。チェックポイント保存/巻き戻し/フォークに関する過去の記述は、現在のコードベースでは利用できません。duduclaw-governancecrate(🗑️b0639b96で削除)— rate / permission / quota / lifecycle の各ポリシーには強制する側が存在せず、ダッシュボードの Governance ページとその RPC は v1.66 で削除されました。レート制限、委任ポリシー + MCP scope、ライセンスのクォータはそれぞれ別の仕組みで強制されます。- LLM fallbackチェーン(
gateway/failover.rs、モジュールfailover::model)— 3層フェイルオーバー(アカウント → モデル → ランタイム、2026-09-29 より同一モジュールツリー)の第2層:プライマリのタイムアウト/503/429/overloadedで、より軽いフォールバックモデルへ自動的に切り替えます(課金エラーでは発動しません)。is_llm_fallback_error/should_attempt_model_fallbackはユニットテスト付きの純粋関数で、FailoverManager::model_fallback_forはすべてのディスパッチ経路が呼ぶ統合判定です。char_indicesによるUTF-8安全な切り詰め。 - Evolution Eventsシステム(
gateway/evolution_events/)— 30種類以上のイベントスキーマ、非同期バッチ+リトライのエミッター、クエリインターフェース、信頼性の保証。gateway上でHTTPエンドポイントとして公開され、WebのReliabilityPageに表示されます。
メモリ評価(v1.9.4 / W21)
Section titled “メモリ評価(v1.9.4 / W21)”- LOCOMO評価(
python/duduclaw/memory_eval/)—retrieval_accuracy、retention_rate、locomo_integrity_check。cron_runnerは手動の CLI エントリポイント(python -m memory_eval.cron_runner smoke_test|weekly_kpis|monthly_locomo)で、リポジトリ内にこれをスケジュール実行するものはありません。5分間のsmoke_testP0が基本的なメモリ機能を検証。build_golden_qa.pyがゴールドQAセットを構築し、data/golden_qa_set.jsonlに最初の200件を収録。duduclaw-memoryエンジンに評価用のバッチクエリAPIを追加。 - Python
agents/+mcp/モジュール—agents/capabilities/(manifest + matcher)、agents/routing/(router + resolution + memory_resolver)。mcp/auth/(キーマスキング付きAPI Key)、mcp/tools/memory/(store / read / search / namespace / quota、execute()の入口で厳格なscope強制。v1.9.3の認証ギャップ(有効なAPI Keyであればscope制限を回避できていた問題)を修正)。
Webダッシュボード
Section titled “Webダッシュボード”- 技術スタック:React 19 + TypeScript + Tailwind CSS 4 + Base UI + 共有の
mdsコンポーネントライブラリ。 - リアルタイムログストリーミング(BroadcastLayer → WebSocket)。
- OrgChart(D3.jsによるインタラクティブなエージェント階層図)。
- Memoryページ:Key Insightsタブ(access_countバッジ付き
key_factsカード)+ 自己進化タブ(停滞の警告、却下の統計、playbook ルールカード)。 - Logsページ:ソースフィルターチップ + severityドロップダウン + severityで色分けした左ボーダー + JSON詳細展開。
- Toast通知システム(モジュールスコープのevent bus、最大5件キュー、暖色系バリアント)。
- Skill Market 3タブ(Marketplace / Shared Skills / My Skills)。
- Autopilot設定 + Session Replay + WikiGraph。
- Reliability ページ— evolution イベントの照会とエージェントごとの信頼性サマリー(
audit.evolutionQuery、audit.reliabilitySummary)。 - i18n:zh-TW / en / ja-JP(600+ 翻訳キー)。
- Dark/Lightテーマ(システム追従 + 手動切り替え)。