Issue #176 · 関連: #139 組織設計, #146 Codex CLI統合, #169 Division再編 · v1.1(2026-04-02更新)
Steve Yegge氏が開発した、複数AIエージェントをtmux + Dolt DB + git worktreeで並行管理するオーケストレーションシステム。GitHub Issueを入力にし、複数のワーカー(Polecat)がそれぞれ独立したworktreeで同時に作業し、Refinery(マージキュー)で安全に統合する。
GasTownの仕組みからMNMLエージェントに有効な部分だけを取り入れる設計を行う。特に以下を重視:
| GasTown概念 | 役割 | MNML現行 | 方針 |
|---|---|---|---|
| Town | 全体の器(~/gt/) | agents/ ディレクトリ |
現行維持 |
| Rig | プロジェクト単位の作業空間 | VDU(Division) | 概念拡張 |
| Mayor | Rig内の最上位コーディネーター | M層マネージャー | 現行維持 |
| Polecat | ワーカーエージェント | W層ワーカー | 現行維持 |
| Crew | 人間作業領域 | CEO(Slack UI) | 現行維持 |
| Scheduler | 容量制御・dispatch管理 | セマフォ(8) / claude_runner.py | 強化 |
| Sling | タスクコンテキスト管理 | <<DELEGATE>>タグ |
拡張 |
| マルチアカウント | 複数Claude契約の並列活用 | 未対応(単一トークン) | 新規導入 |
| Hook(worktree) | ワーカーごとの独立作業空間 | 計画のみ(未実装) | 新規導入 |
| Witness | Rig内監視エージェント | AI Ops monitor | 統合強化 |
| Deacon | クロスRig監視デーモン | なし | 新規導入 |
| Dogs | メンテナンスエージェント | なし | 後回し |
| Seance | セッション復元・継続 | --resume + sessions.json |
強化 |
| Refinery | マージキュー(Bors方式) | なし | 条件付き導入 |
| Beads/Dolt DB | タスク・状態の永続化DB | tasks.json(JSONファイル) | 不採用 |
| マルチプロバイダー | Claude以外のAI併用 | Codex CLI設計のみ(#146) | Issue #146で対応 |
GasTownをそのまま導入し、MNMLのBotから呼び出す。
GasTownのアイデアだけ参考にし、全てPythonで独自実装。
一部コンポーネント(worktree管理スクリプト等)はGasTownのコードを移植し、制御層はPython。
効果(並行処理能力の向上幅)と導入コスト(変更範囲の大きさ)のバランスで優先順位を決定。
| Phase | 内容 | GasTown由来 | 効果 | コスト | VDU適用 |
|---|---|---|---|---|---|
| Phase 0 | マルチアカウントプール | Sling / マルチアカウント | 並行数が2〜3倍に | 中 | 全VDU |
| Phase 1 | Scheduler強化 | PlanDispatch / BatchSize | リソース配分の最適化 | 中 | 全VDU |
| Phase 2 | worktree導入 | Hook | coder並行時のファイル衝突解消 | 中 | 開発VDUのみ |
| Phase 3 | 監視強化 | Witness / Deacon | 障害検知・自動復旧 | 小 | 全VDU |
| Phase 4 | Seance強化 | Seance / fork-session | セッション復元の信頼性向上 | 小 | 全VDU |
| Phase 5 | Refinery相当 | Refinery | マージ品質の自動保証 | 大 | 開発VDUのみ |
GasTownはCLAUDE_CONFIG_DIR=~/.claude-accounts/<handle>でCLI起動時に認証を切り替える。gt account switch <handle>コマンドで~/.claudeをシンボリックリンクに差し替える仕組み。
# 設定ファイル: .env に追加
CLAUDE_ACCOUNTS=account1,account2,account3
# アカウント別の認証情報ディレクトリ
~/.claude-accounts/
├── account1/ # Max Plan契約 #1
│ ├── .credentials.json
│ └── settings.json
├── account2/ # Max Plan契約 #2
│ └── ...
└── account3/ # Max Plan契約 #3
└── ...
| 項目 | 現行 | 変更後 |
|---|---|---|
| セマフォ | グローバル1つ(上限8) | アカウントごとに1つ(各上限を設定で管理) |
| アカウント選択 | なし(単一トークン) | ラウンドロビンで空きのあるアカウントを選択 |
| レート制限 | グローバルクールダウン | アカウント別クールダウン(他アカウントは影響なし) |
| CLI起動 | claude --resume ... |
CLAUDE_CONFIG_DIR=... claude --resume ... |
# AccountPool: アカウント管理(claude_runner.py内)
class AccountSlot:
name: str # "account1"
config_dir: Path # ~/.claude-accounts/account1
semaphore: asyncio.Semaphore # アカウント別上限
rate_limit_until: float # レート制限解除時刻
active_count: int # 現在の使用中プロセス数
class AccountPool:
slots: list[AccountSlot]
async def acquire() -> AccountSlot:
"""空きのあるアカウントをラウンドロビンで取得。
全アカウントが満杯なら最初に空くまで待機。"""
async def release(slot: AccountSlot) -> None:
"""アカウントを返却。"""
def mark_rate_limited(slot: AccountSlot, until: float) -> None:
"""特定アカウントにレート制限を設定。"""
AccountPool.acquire()で空きアカウントを取得config_dirを環境変数に設定してCLI起動release()でアカウントを返却CLAUDE_CONFIG_DIR環境変数によるCLI認証分離は、GasTownで検証・実装済み。macOSキーチェーンとの連携でアカウント分離が安全に機能することが確認されている(詳細は第12章)。MNMLで追加検証する必要はない。
PlanDispatch純粋関数でmin(availableCapacity, batchSize, len(ready))件を選択。SpawnDelayでDB競合を防止。各RigにMaxPolecats上限を設定。
# settings.py に追加
class SchedulerConfig:
max_concurrent_total: int = 16 # 全体の同時実行上限
max_concurrent_per_vdu: dict[str, int] = {
"dev": 8, # 開発VDU: 最大8並行
"bo": 4, # 経理VDU: 最大4並行
"legal": 2, # 法務VDU: 最大2並行
"sales": 2, # 営業VDU: 最大2並行
}
batch_size: int = 3 # 1回のdispatchで最大3タスク
spawn_delay_sec: float = 2.0 # dispatch間の待機(秒)
| VDU | 特性 | 推奨上限 | 理由 |
|---|---|---|---|
| 開発(dev) | 長時間・高リソース | 8 | coder/researcher等が長時間占有。最も並行化の恩恵が大きい |
| 経理(bo) | 定期バッチ・短時間 | 4 | 月次処理が集中する時期あり。ただし個々のタスクは短い |
| 法務(legal) | 不定期・中時間 | 2 | 契約書レビュー等は発生頻度が低い |
| 営業(sales) | 不定期・短時間 | 2 | メール作成・提案書等。頻度は低い |
※ 上限は設定で変更可能。VDUの実運用を見ながら調整する前提。
全アカウントが満杯の場合、GasTownと同様にタスクをキューに入れて待機させる。
pending_queueに入れ、枠が空いた時点でFIFO(先入れ先出し)でdispatchbare repo(.repo.git)を作成し、そこからmayor/refinery/witness/各polecat用のworktreeを分離。各ワーカーが独立したブランチで作業し、ファイル競合を完全排除。
| 対象 | worktree | 理由 |
|---|---|---|
| coder(開発VDU) | 必要 | 同一リポジトリで複数coderが並行作業する場合にファイル衝突が発生する |
| researcher / architect | 不要 | 読み取り中心。output/への書き込みはファイル名で衝突回避可能 |
| reviewer / tester | 不要 | 既存コードの読み取り+テスト実行。mainブランチで十分 |
| 非開発VDU全般 | 不要 | git操作をしない |
worktree_manager.create(task_id)で専用worktreeを作成wt/{task_id}ブランチを自動作成(例: wt/task-abc123)# 現行
~/Dev/mnml/agents/ # 単一の作業ディレクトリ
# 変更後
~/Dev/mnml/agents/ # mainブランチ(Bot/M層/非coder W層)
~/Dev/mnml/agents/.worktrees/
├── wt-task-abc123/ # coder #1 の作業用
├── wt-task-def456/ # coder #2 の作業用
└── wt-task-ghi789/ # coder #3 の作業用
※ GasTownのようにbare repoに変換する方式もあるが、MNMLでは既存のBotプロセスがmainブランチで常駐しているため、通常リポジトリ+git worktree add方式が安全。
class WorktreeManager:
base_dir: Path # ~/Dev/mnml/agents/.worktrees/
def create(task_id: str, base_branch: str = "main") -> Path:
"""worktreeを作成し、パスを返す。"""
def remove(task_id: str) -> None:
"""worktreeとブランチを削除。"""
def list_active() -> list[dict]:
"""アクティブなworktree一覧を返す。"""
def cleanup_stale(max_age_hours: int = 24) -> int:
"""24時間以上放置されたworktreeを削除。"""
現行のAI Ops monitorに以下を追加:
| 機能 | 現行 | 追加 |
|---|---|---|
| タスク監視 | tasks.json読み取り | VDU別の健全性レポート |
| 自動スキップ | なし | 同一タスク3回失敗 → 自動スキップ+CEO通知(Mountain-Eater相当) |
| ヘルプルーティング | なし | W層の「判断できない」をM層またはCEOに自動エスカレーション |
現行のAI Ops monitorはVDU横断のプロセスとして動いているため、Deacon相当の機能は同じプロセスに追加する(別プロセスを立てるほどの規模ではない)。
events.jsonlからsession_startイベントを収集し、claude --fork-session --resume <id>で前セッションのコンテキストを完全ロード。マルチアカウント間でもセッション共有可能。
sessions.jsonでスレッドごとにセッションIDを保持し、--resumeで復元している| 機能 | 説明 | 優先度 |
|---|---|---|
| fork-session活用 | M層→W層の委譲時、M層のセッションをforkしてW層に渡す。W層は文脈を持った状態で作業開始 | 高 |
| セッションIDの永続化強化 | sessions.jsonに加え、タスクごとのセッションIDも保持。タスク再開時に復元可能に | 中 |
| アカウント間セッション共有 | 異なるアカウントのCLI間でfork-sessionが可能か検証し、可能なら活用 | 低(検証結果次第) |
Bors方式のバッチマージ。ワーカーは直接mainにpushせず、merge-requestを作成。Refineryがバッチでrebase→テスト→成功ならfast-forward。失敗ならbisectで原因特定。
| coder並行数 | マージ方式 | 理由 |
|---|---|---|
| 1〜2 | M層が手動でマージ判断(現行通り) | 衝突頻度が低く、自動化のメリットが薄い |
| 3〜4 | 簡易マージキュー(FIFO順にrebase→テスト→マージ) | 衝突が増えるが、bisectは不要な規模 |
| 5以上 | Bors方式(バッチマージ+bisect) | GasTown Refineryの全機能が必要になる |
class MergeQueue:
queue: list[MergeRequest] # FIFO
async def enqueue(task_id: str, branch: str) -> None:
"""worktreeブランチをマージキューに追加。"""
async def process() -> None:
"""キュー先頭からrebase→テスト→マージを逐次実行。
失敗したらそのMRをスキップし、次を処理。"""
| GasTown機能 | 開発 (dev) |
経理 (bo) |
法務 (legal) |
営業 (sales) |
|---|---|---|---|---|
| マルチアカウント(Phase 0) | ● | ● | ● | ● |
| Scheduler VDU別配分(Phase 1) | ● | ● | ● | ● |
| worktree(Phase 2) | ● | — | — | — |
| 監視強化(Phase 3) | ● | ● | ● | ● |
| Seance強化(Phase 4) | ● | ● | ● | ● |
| Refinery(Phase 5) | △ | — | — | — |
● = 適用 / △ = 条件付き / — = 不要
現行のm-devをそのままVDU化。GasTown機能のフル適用対象。
月次業務(経費・請求書・報告書)の自動化が主。git操作は不要。
契約書レビュー・法的チェックが主。頻度は低いが正確性が重要。
提案書作成・メール下書き等。短時間タスクが中心。
| GasTown Rig | MNML VDU | 差異 |
|---|---|---|
| 1 Rig = 1 gitリポジトリ | 1 VDU = 1 業務領域 | VDUはgitリポジトリに紐づかない。経理VDUは複数のops/パイプラインをまたぐ |
| Rig内にmayor 1人 | VDU内にM層マネージャー 1人 | 同じ。m-dev, m-bo, m-legal等 |
| Rig内にpolecat複数 | VDU内にW層ワーカー複数 | 同じ。ただしVDUごとにワーカーの種類が異なる |
| MaxPolecats per Rig | max_concurrent_per_vdu | 同じ概念。設定ファイルで管理 |
Rig作成 = gt add |
VDU作成 = M層マネージャー + CLAUDE.md追加 | MNMLはコード変更で対応。CLIコマンドは不要 |
rotate.go 7.4KB、rotate_test.go 24.7KB)で以下が確認されている。テストコードが実装コードの3倍以上あり、十分な検証がなされている。MNMLで改めて検証する必要はない。
| 技術要素 | GasTownの実装 | 状態 |
|---|---|---|
| CLAUDE_CONFIG_DIRによるアカウント分離 | CLAUDE_CONFIG_DIR + macOSキーチェーンで各アカウントの認証情報を完全分離。CLI起動時に環境変数を切り替えるだけで別アカウントとして動作する |
採用確定 |
| レート制限の検出 | tmux出力をスキャンしてレート制限メッセージを検出。CLIの標準出力/標準エラーを監視する方式 | 採用確定 |
| アカウントローテーション | LRU(最も長く使われていないアカウントを優先)戦略で複数アカウントをローテーション。レート制限に達したアカウントは自動的にスキップされる | 採用確定 |
| 複数プロセスの並行起動 | 異なるCLAUDE_CONFIG_DIRで複数CLIプロセスを同時起動しても干渉しないことが実証済み |
採用確定 |
| # | 検証項目 | 確認方法 | 失敗時の代替案 |
|---|---|---|---|
| 1 | Max Planのレート制限がアカウント別に完全分離されるか | 2アカウントで同時にCLIを実行し、一方がレート制限に達した時に他方が影響を受けないか確認 | 分離されない場合、マルチアカウントの主要メリットが消失。別プロバイダー併用(Issue #146)に方針転換 |
| 2 | 異なるアカウント間で--fork-sessionが動作するか | アカウントAのセッションIDをアカウントBの--fork-sessionに渡して起動 |
動作しない場合、セッション共有はコンテキストのファイル受け渡し(現行の<<DELEGATE>>方式)で代替 |
※ 旧v1.0の検証項目 #1(CLAUDE_CONFIG_DIR認証分離)と #4(複数プロセス干渉)はGasTown実装で確認済みのため削除。
| Phase | 内容 | 前提条件 | 変更対象ファイル |
|---|---|---|---|
| 0 | マルチアカウントプール | 検証項目 #1 通過(#1旧版の認証分離・並行起動はGasTown実証済み) |
bot/claude_runner.py(AccountPool追加)bot/settings.py(アカウント設定).env(アカウント一覧)
|
| 1 | Scheduler強化 | Phase 0 完了 |
bot/claude_runner.py(VDU別セマフォ)bot/settings.py(SchedulerConfig追加)bot/router.py(dispatch制御変更)
|
| 2 | worktree導入 | Phase 1 完了, coder並行化の需要 |
bot/worktree_manager.py(新規)bot/delegation.py(worktree連携)agents/managers/dev/CLAUDE.md(worktree運用ルール)
|
| 3 | 監視強化 | Phase 1 完了 |
agents/ai-ops/monitor/(VDU別監視追加)bot/settings.py(監視設定)
|
| 4 | Seance強化 | 検証項目 #2 通過 |
bot/claude_runner.py(fork-session対応)bot/delegation.py(セッションID引き継ぎ)bot/sessions.json(スキーマ拡張)
|
| 5 | Refinery相当 | Phase 2 完了, coder並行数3以上 |
bot/merge_queue.py(新規)bot/worktree_manager.py(マージ連携)
|
Phase 0(マルチアカウント)
├──→ Phase 1(Scheduler強化)
│ ├──→ Phase 2(worktree)──→ Phase 5(Refinery)
│ └──→ Phase 3(監視強化)
└──→ Phase 4(Seance強化)※検証項目#3に依存
Phase 2とPhase 3は並行して進められる。Phase 5はPhase 2の実績を見てから判断する。
| GasTown機能 | 不採用理由 |
|---|---|
| Dolt DB(Beads) | tasks.jsonで十分。Dolt DBはGo依存であり、SQLベースの状態管理はMNMLの規模では過剰。将来的にSQLiteへの移行は検討余地あるが、Doltである必要はない |
| Dogs(メンテナンスエージェント) | 現規模ではAI Ops monitorが兼務できる。専用のメンテナンスエージェントを常駐させるほどの作業量がない |
| tmuxベースのプロセス管理 | MNMLはasyncio + subprocessで管理しており、tmuxに移行するメリットがない。GasTownのtmuxは人間がターミナルを直接操作する前提だが、MNMLはSlack UI経由 |
| bisectBatch(障害MR二分探索) | coderが5人以上並行する段階まで不要。それまでは単純なFIFOマージキューで十分 |
GasTownを検討した動機は「完成されたオーケストレーションツールを使って、VDUをクイックに立ち上げる」こと。つまり、ゼロから作るより既製品を活用して時間を節約したかった。
しかし、前章(第3章)の結論は「案B: フルカスタム実装」であり、GasTownのコードは使わず「考え方だけ取り入れる」方針になっている。ここで問い直すべきは、設計思想を取り入れるために設計コストをかけること自体が、クイック立ち上げの目的と矛盾しないかという点。
| 論点 | 具体的な根拠 |
|---|---|
| 検証済み実装パターンの再利用 | CLAUDE_CONFIG_DIR + macOSキーチェーンによるアカウント分離は、GasTownが24.7KBのテストコードで検証済み。MNMLが独自に試行錯誤する時間を省ける |
| アカウントプールが即使える | LRUローテーション・レート制限検出の設計パターンが明確。Phase 0はGasTownの設計をほぼそのまま踏襲できる |
| リソース管理の考え方が汎用的 | 「容量制御」「クールダウン」「ローテーション」はCLIエージェント全般に共通する課題。開発VDU以外にも適用できる |
| 失敗パターンを先に学べる | GasTownが試して捨てた方式(Dolt DB、bisectBatch等)を知ることで、MNMLが同じ失敗を回避できる |
| 論点 | 具体的な根拠 |
|---|---|
| GasTownは開発行為に特化している | worktree・マージキュー・bisectBatchなどGasTownの中核機能はソフトウェア開発(コード→ブランチ→マージ)に最適化されている。MNMLのVDUは経理・法務・営業など非開発業務が主体であり、これらの機能は適用対象外 |
| 使える部分が限定的 | 実際に取り入れられるのはPhase 0(アカウントプール)のみ。Phase 2以降は開発VDU専用であり、全6フェーズのうち汎用的に効くのは2つ(Phase 0, 1)だけ |
| 設計コスト自体がクイック立ち上げと矛盾 | GasTownの概念をMNMLに翻訳する作業(本設計書がまさにそれ)に時間を使っている。部分導入の判断・適合性の見極め・カスタム設計が必要な時点で「既製品でクイックに」という当初の目的は達成できていない |
| 設計思想を取り入れる≠コードを使う | 「アカウントプール」「レート制限対策」「容量制御」は、GasTown固有のアイデアではなく一般的な並行処理パターン。GasTownを参照しなくても同じ設計にたどり着ける |
| GasTown自体がアルファ段階 | 追従コストが発生する。設計が変わるたびにMNMLの設計書も更新が必要になる |
| 評価軸 | GasTown採用 | GasTown不採用(独自設計) |
|---|---|---|
| 立ち上げ速度 | Phase 0はやや速い(設計パターンを踏襲)。ただし翻訳コストあり | Phase 0の設計は自力でも1〜2日。差は小さい |
| 非開発VDUへの適合性 | 低い。開発特化の概念を無理に翻訳する必要あり | 高い。MNMLの業務に合わせて自由に設計できる |
| 長期保守コスト | GasTownの更新追従 + MNML独自部分の二重管理 | MNML単体で完結。依存関係なし |
| 設計の一貫性 | GasTownの概念体系とMNMLの概念体系が混在するリスク | MNML既存アーキテクチャとの一貫性を保てる |
| 得られる知見 | 大きい。先行事例から失敗パターンと成功パターンの両方を学べる | 限定的。自力で試行錯誤する必要あり |
CLAUDE_CONFIG_DIR + LRUローテーションの実装パターンを参考にして、MNMLのPython基盤上に独自実装する。「GasTownを採用する」のではなく「GasTownが検証した技術的事実を活用する」Issue #176 · GasTown概念のMNMLエージェント適用設計書 v1.1(2026-04-02更新)
v1.1変更点: 第12章の検証項目をGasTown実証結果で更新、第14章「採用判断の再考察」追加
関連: GasTown · Issue #139(組織設計)· Issue #146(Codex CLI統合)· Issue #169(Division再編)