Blog

Multi-Repo Agent Orchestrator

複数リポで別々に走る Claude/Codex セッションを横断で束ねる "上位 AI assistant (Orchestrator)" のアーキテクチャ解説. 5 層構成, repo-initiated 通信, 全 markdown 設計, 知識層の RAG 的運用, 耐障害ルーティングを構成図中心に説明し, Inflection Pi / Nous Hermes Agent と位置づけを比較する.

近頃皆さんやっていることだが, PC上のあらゆる作業にAI Agentを介入させるように仕事の再構築を進めている. 構築を進める中で, 複数のプロジェクトが同時進行する中で, CLAUDE.md/AGENT.md, skills の仕様判断, その他規約,コンテキストの設定を共有・自動化したいという欲求が出てきた.

複数Agentの並行管理自体は, Remote Controlcmux などの導入で軽くなってきたが, それぞれのrepoで独立していると初期設定,知識層の反映で手間がかかる. どのrepoで起動しても作業目標毎に知識,規約の引き継ぎの手間がボトルネックとなってきた.

そのために, 複数リポで別々に走らせている十数個の Claude/Codex セッションを, 横断で監視, 記録, タスク配分, 知識集約する上位レイヤ(Agent Orchestrator)を自作した. 各リポの Agent は賢いが, それらを束ねる視点 (誰が何を進行中か, 知見の横断再利用, タスクの配分) は別レイヤの問題で, そこを担うのがこの Orchestrator である.

このような用途としてはわざわざ車輪の再発明をしなくても既存 AI Assistant tool として有名なものに Pi (Inflection) や Hermes Agent (Nous Research) とがあり,わざわざこんなことをしなくても既存アーキテクチャを採用することで類似の効果は得られる.

Pi は製品 / UX 層, Hermes Agent はモデル + 単一 agent 層に当たる. どちらも記憶や知識の集約・反映の仕組みを持ち (Hermes Agent は永続メモリ + skills, Pi は会話文脈), 私の理解では orchestrator 的な役割もある程度こなす一般ツールである.

Inflection Pi Hermes Agent (Nous) 本 Orchestrator
位置づけ 個人向け会話コンパニオン 単一の自律エージェント基盤 複数 agent を束ねる上位レイヤ
モデル 自社 Inflection 2.5 (閉) 自社 Hermes (開 weights) モデル非依存 (Claude/Codex を使う)
エージェント数 1 (話し相手) 1 (記憶 + skills + 自動化) N (リポごとの coding agent を協調)
メモリ 会話文脈 永続メモリ vault (RAG 知識 + 規約 + タスク) を横断共有
実行 クラウド ローカル可 (Ollama 等) ローカル (launchd), 他リポ FS は触らない
主眼 共感 / 対話 一個の強い agent 横断 routing / 知識 curation / 規約

それでも自作したのは, 次の二点を得たかったところによる.

あと単純に自分で弄れる範囲が大きい方が楽しい. ので普通はHermes Agentを入れておけば殆ど事足りると思われる.

なお,以下の構成は最終的には,ネットワーク上の常時稼働Agentに引き継ぐが現在は試験的に,全てローカルで完結させている.

全体構成: 5 層

Orchestrator は管理対象リポの上位に立ち, launchd で毎時巡回するバッチと対話セッションの二面で動く. 処理は 5 層に分かれ, 各リポの Agent とは共有キュー (inbox/outbox) だけで接続する.

各リポの Agent (Claude / Codex) - 十数 repos research / grant / personal / lecture / tooling / chores (作業レイヤ) push Stop hook + MCP pull context-pack Orchestrator (launchd 毎時 + 対話セッション) 1. inbox 2. routing 3. vault 4. MCP 5. 通知 vault (全 markdown): projects / tasks / knowledge / agent_ops 司令塔兼書記. 判断と記録に徹し, 実作業は各リポの Agent が担う 他リポの FS は直接触らない (repo-initiated) Discord (通知) Todoist (タスク)

ポイントは, Orchestrator 自身は判断と記録に徹し, 各リポでの実作業はそのリポの Agent が担うこと. Orchestrator は司令塔兼書記であって, 現場では手を動かさない.

管理対象: 複数リポをカテゴリで束ねる

以下は匿名化したリポの構造を表している. 各リポは runtime (claude / codex), cadence (毎時 / 日次 / 週次), category, techs をメタデータに持ち, これが後段の routing と知識索引のキーになる. 設定は 1 枚の YAML に集約し, パーサも 1 本に統一している.

構造は二段に分かれる. Orchestrator が作業レイヤの頂点に立ち, 十数リポを束ねる. そして その Orchestrator を頂点とする系全体を, さらに外側から評価するのが existential (Vault) である.

existential (Vault) - 系全体をメタ評価 now.md = 思想 / 現状 / 価値観の single source. 「そもそもこの方向で良いか」を外側から問う メタ評価 Orchestrator (assistant) 横断の監視 / routing / 知識 curation / タスク配分 管理 (routing / 知識配信 / タスク配分) 作業レイヤ - 十数 repos (category / techs を持つ) research Research A / B / C 論文 / ライブラリ / 原稿 grant Grant A 申請書 (審査待ちが常態) personal Personal 私生活の意思決定 (非公開) lecture Lecture A / B 講義資料 tooling Tooling A / B タスク運用基盤 chores Chores その他の雑用 paper 論文文献管理 PDF 原典 md 抽出 / 要約 bib 引用 DB 各リポは runtime (claude / codex) / cadence (毎時 / 日次 / 週次) / category / techs をメタデータに持つ 設定は 1 枚の YAML に集約し, パーサも 1 本に統一. これが routing と知識索引のキーになる

二段構成のポイントは, Orchestrator と existential (Vault) の役割が違う層にあることだ. Orchestrator は作業レイヤの頂点として, 十数リポの routing / 知識 / タスクを束ねる司令塔である. これに対し existential は, その Orchestrator を頂点とする系全体をさらに外側からメタ的に評価する. ここには now.md をはじめ思想 / 現状 / 価値観の single source があり, 個々の作業や routing が自分の価値観・現状と整合しているかを問う. Orchestrator が “何を / どう進めるか” の司令塔なら, existential は “そもそもその方向で良いか” を問うメタ評価レイヤにあたる. now.md 自体は Orchestrator 経由で必要な agent にも配信されるが (思想 context の routing), existential の主たる役割は系全体のメタ評価である.

各リポもOrchesratorを通じて連携できるようにしている. 例えば, 最近開発を進めている paper 層は, 文献管理に特化したパイプラインを持つ. 論文 PDF を原典として取り込み, それを md に抽出・要約 (図表や式の扱いも含む) してから, 引用情報を bib (引用データベース) に落とす. この PDF → md → bib の流れが research 層の執筆へ供給され, 「読んだ論文がそのまま引用可能な形で原稿に届く」状態が構築されている.

通信モデル: repo-initiated

一番大事な制約として, Orchestrator は管理対象リポの FS を直接書き換えないことがある. 通信はすべて repo 側から共有キューへの push / pull に固定する.

各リポの Agent Stop hook + MCP state/inbox/<repo> append-only state/outbox/<repo> 最新状態 / タスク Orchestrator 読む / 書く push pull

境界を push/pull のキューに固定すると, どちらが何を書いたかが常に明確になり, 片方が壊れてももう片方は動き続ける. 上位が下位のコードを勝手に上書きしない, という規律でもある.

データ表現: (今のところ)すべて markdown

状態, タスク, 知識, 規約 - Orchestrator が扱うデータは全部 Obsidian による markdown + frontmatter で持つ. DB も独自フォーマットも使わない. 狙いは移行容易性で, 別マシン (常時起動の Mac mini を想定) へ移すとき, データ表現が markdown のままなら差し替えるのは通信層だけで済む.

\text{Phase 1 (file)} \;\longrightarrow\; \text{Phase 2 (MCP)} \;\longrightarrow\; \text{Phase 3 (LAN MCP)}

通信は進化させても vault の中身は不変. でそのまま人間が読める利点も大きい.

markdown / Obsidian を選んだ主な理由は, もともと個人の知識管理を Obsidian で行っていたことにある. 設計として一から選んだというより, 既存資産 (過去の日記やメモ) をそのまま agent に読ませられる連続性が大きく, 実際 existential (Vault) では過去の日記・メモを文脈として読ませている. したがって 人間が文章を読む面は当面 Obsidian 固定で行く予定だ. 一方, 人間が読まない orchestrator 層の内部表現 (state や中間データ) は markdown に縛る必然はなく, より効率的な手段があれば置き換える予定でいる. markdown は “人間も読む層” の共通項として残し, 機械専用の層は最適な表現へ寄せていきたい.

知識層 = 自前 RAG

このプロジェクトで一番効いている知識層は, 実質 RAG (Retrieval-Augmented Generation) の自前運用である. ただし主眼は “貯める” ことより “腐らせない” ことにある.

ingestion Agent がタグ付き報告 _staging tag + メタデータ索引 curation promote / decay retrieval pull / search 本フォルダ (昇格) _stale (減衰 / 撤回) usage signal が次の curation を駆動

\mathrm{score}(n) \;=\; w_c\,[\,c_n = c_q\,] \;+\; w_t\,\lvert T_n \cap T_q \rvert \;+\; w_r\,\mathrm{recency}(n) \;+\; w_u\,\mathrm{usage}(n)

タスク管理層: Todoist

知識層と並ぶもう一つの管理層がタスクで, ここは Todoist を hub にしている. 人間と agent が同じタスクを同じ場所で見るための層である.

vault/tasks git 追跡 (source of truth) Todoist repo ごとの project 各リポの Agent pull_my_tasks sync (push) pull 完了状態 人間はここで全 repo のタスクを横断俯瞰 / 完了操作

設計は単純で, source of truth は git 追跡の vault/tasks 側に置く. sync_tasks がそれを各リポの Todoist project に push し, agent は pull_my_tasks で自分宛てを取得する. どの project に置くかで担当 repo が決まる (置き場所で routing するので, ラベル付けは最小限). フィールド単位で真の側を分けており, 本文 / 詳細 / リンクは vault が真, 完了状態 / 期限は Todoist が真 (モバイルで完了する運用が多いため). 人間から見ると, Todoist が全リポのタスクを横断で俯瞰し操作する一枚の窓になる.

耐障害ルーティング

Agent のセッションで MCP server が一時的に繋がらないと, Agent は submit 系ツールを呼べず共有 inbox に素のファイルでフォールバックしてくる. これを要約に溶かさず, 種別ごとに振り分ける.

inbox fallback ファイル 種別判定 event_type で分岐 ユーザ判断 → user_requests 対話で AskUserQuestion 作業依頼 → vault/tasks 同期で Todoist へ

ツールが落ちても依頼の種別に応じて確実に拾われる. 賢いコンポーネントほど壊れ方に対する設計が効く, という一例である.

という感じで色々やってみているが, なんとなく機能してきたのでまとめました記事でした. 毎日変わっているのであくまで暫定版ですが.

ce0f13b2-4a83-4c1c-b2b9-b6d18f4ee6d2