Issue #139 Architecture 2026-03-24

M層セッションアーキテクチャ & プロジェクトフロー設計書

組織再設計の一環。M層のセッション管理方式の比較分析 + プロジェクトフロー全体のスイムレーン図を再設計する

常駐 vs 非常駐 — 何を得て、何を失うか

前提の整理
「能動ループ」(M層が自発的に次のタスクを考え続ける能力)はCLI/SDKの機能ではない。
bot.py側が「次に何をトリガーするか」を判断・指示する設計問題であり、常駐でも都度起動でもbot.pyがトリガーしなければM層は動かない
したがって「常駐 = 能動」「非常駐 = 受動」ではない。

常駐で得られるもの / 失われるもの

得られるもの

  • 即応性: 起動待ち不要。stdin経由で即座に処理開始
  • 文脈の自然蓄積: 会話履歴がメモリ上に残り、前回のタスクの判断を覚えている
  • セッション間の連続性: 「さっき言った通り」が通じる。コンテキストスイッチ不要

失われるもの / リスク

  • クラッシュ耐性: stdinパイプ切断で全セッション状態を失う可能性
  • コンパクション品質: 長時間稼働で要約の要約が繰り返されると判断品質が劣化する(未検証領域)
  • リソース占有: アイドル時もプロセスが常駐。6ディビジョン×1プロセス = 常時6プロセス
  • 運用複雑性: stdin/stdout管理、プロセス監視(launchd/watchdog)の実装が必要

非常駐(トリガー起動 + resume)で得られるもの / 失われるもの

得られるもの

  • 障害耐性: タスク単位で独立。クラッシュしても他に影響しない
  • リソース効率: アイドル時の消費ゼロ。必要な時だけ起動
  • 現行アーキテクチャとの親和性: subprocess方式の延長。改修量が少ない
  • 文脈復元: --resume でセッション履歴を引き継げる。ゼロからにはならない

失われるもの / リスク

  • 起動レイテンシ: 毎回数秒〜十数秒。CLAUDE.md読み込み + モデル初期化が発生
  • resume時の制約: cwdが変わると失敗。ツール権限が復元されない(再承認が必要)
  • セッションファイル肥大化: 長期間の蓄積でresumeが遅くなる可能性

コスト比較

観点 常駐 都度起動 + resume ハイブリッド(推奨)
起動コスト 初回のみ 毎回 数秒〜十数秒 引き継ぎ時のみ(1日1〜2回)
メモリ消費 常時(×6ディビジョン) タスク実行時のみ 稼働時間中のみ
トークン消費 アクティブ時のみ
(アイドル時は消費なし)
同左 + resume時の履歴読み込み 同左(引き継ぎ時にresume分の上乗せ)
実装コスト 中(stdin pipe管理) 低(現行の延長) 中(引き継ぎオーケストレーション)
障害復旧コスト 高(セッション再構築) 低(タスク単位で再実行) 中(直近の引き継ぎ点から復旧)

アーキテクチャ選択肢と推奨

次善 案A: 完全常駐(stdin pipe)
--input-format stream-json で1プロセスを維持し続ける。即応性は最高だが、stdinパイプ管理が複雑で障害耐性が低い。6プロセス常駐はリソース負荷が大きい。
安全 案B: 完全都度起動 + resume
タスクごとに claude -p --resume <id> で起動。現行アーキテクチャの自然な延長。障害耐性が高い反面、毎回の起動レイテンシが発生する。
推奨 案C: 期間引き継ぎハイブリッド
稼働時間中はstdin pipeで常駐。一定期間(半日〜1日)または一定条件でセッションを保存し、新プロセスに引き継ぐ。 常駐の即応性と、定期リフレッシュによるコンパクション劣化回避を両立する。
将来 案D: Claude Code SDK (TS)
@anthropic-ai/claude-agent-sdk でプログラム的に制御。Max Planでは使用不可(APIキー認証が必須)。API課金に移行した場合の将来候補。

4案比較サマリー

観点A. 完全常駐B. 完全都度起動C. ハイブリッドD. SDK
レイテンシ即座数秒〜十数秒稼働中は即座即座
文脈保持自然蓄積resume依存蓄積 + 引き継ぎSDK管理
障害耐性低い高い中(引き継ぎ点あり)高い
実装コスト低い非常に高い
Max Plan対応不可
推奨: 案C(期間引き継ぎハイブリッド)
選定理由:
  1. CEOの「常駐させたい」と「期間で引き継ぐ設計にしてもいい」の両方を満たす
  2. コンパクション品質劣化(未知数)を定期リフレッシュで安全側に倒せる
  3. クラッシュ時も直近の引き継ぎ点から --resume で復旧可能
  4. Phase 0(都度起動+resume)→ Phase 1(常駐化)→ Phase 2(引き継ぎ)と段階的に移行可能

セッションライフサイクル

起動
トリガー受信
実行
タスク処理
コンパクション
自動圧縮
実行継続
要約後も処理
引き継ぎ
セッション保存
終了
プロセス停止

引き継ぎ後、新プロセスが --resume で起動 → ライフサイクルの先頭に戻る

コンテキスト維持戦略

仕組み保持されるもの失われるもの対策
コンパクション
(自動)
CLAUDE.md(ディスクから再読み込み)
会話の要旨(サマリー)
直近のやり取り
古いツール出力の詳細
途中の判断過程の一部
重要な判断はCLAUDE.mdまたはメモリファイルに書き出す。
SDKの PreCompact フックで状態退避する(将来)
セッション引き継ぎ
(定期)
--resume でセッション全体を復元 起動時にレイテンシが発生
ツール権限が再承認必要
引き継ぎ頻度を最小限に(12時間 or アイドル2時間)。
--allowedTools で権限を事前付与
CLAUDE.md
(永続)
組織ルール・ワークフロー・設計方針の全量 なし(ディスク上に常に存在) 重要な設計判断・メモリはCLAUDE.mdに集約。コンパクション後もルールが消えない

引き継ぎトリガー条件

トリガー条件理由
時間経過起動から12時間コンパクション蓄積による品質劣化の予防
コンパクション回数自動コンパクション N回目
(初期値: 5回。運用で調整)
要約の要約の繰り返しを制限
アイドル時間2時間以上タスクなしリソース解放。次タスク時に新プロセスで起動
エラー検知異常応答・タイムアウトセッション劣化の兆候として新プロセスに切り替え
不確実な点
「コンパクションを何十回も繰り返しても品質が維持されるか」は公式に保証されていない。引き継ぎ回数のしきい値は実運用で品質劣化が観察されるポイントを見極めてチューニングする必要がある。初期値は保守的に設定する。

セッションID管理

項目設計
保存先data/m_sessions.json(bot.py再起動でも保持)
構造ディビジョン名 → セッションID のマッピング
更新タイミングM層プロセス起動時にセッションIDを記録。引き継ぎ時に新IDで上書き
cwd固定--resume はcwd不一致で失敗する。各M層のcwdを固定(例: agents/managers/vdu/

移行パス

フェーズ内容変更箇所
Phase 0
現状維持+resume
都度起動(subprocess)のまま、--resume でセッション引き継ぎを追加 bot/claude_runner.py にセッションID管理を追加
Phase 1
常駐化
M層を --input-format stream-json で常駐化。stdin経由でタスク投入 bot/claude_runner.py の起動・通信ロジック。プロセス監視追加
Phase 2
引き継ぎ
定期引き継ぎロジック追加。12時間/アイドル2時間でリフレッシュ セッション保存→新プロセス起動→resumeのオーケストレーション
将来
SDK移行
API課金に移行した場合、Claude Code SDK (TS) に置き換え bot.py → TypeScript化(または別サービス)
W層は変更不要
W層は従来通り都度起動(subprocess)のまま。常駐化はM層のみ。W層はタスク単位で起動→完了→消滅するため、セッション管理は不要。

トリガー設計 — 何がM層を起動するか

全M層共通の原則
会議アジェンダは特定のM層だけが主体ではない。日次経営会議・定例トリガーは全M層に当てはまる共通の仕組みとして設計する。
トリガー種別 起動条件 対象M層 bot.pyの動き
SlackCEOからの指示 Slackメッセージ受信 IF層が判断して適切なM層にルーティング Slackイベント → IF層起動 → IF層がM層を指名 → bot.pyがM層を起動(or stdin投入)
定時日次経営会議 毎日定時(例: 9:00) 全M層(VDU, BA, H&A, PMO, OA, SA) cron/scheduler → bot.pyが全M層にアジェンダを投入。各M層が担当領域の報告を準備。IF層が取りまとめ
定時時間トリガー 月末/月初/特定日 該当M層(例: BA=月末経費締め、PMO=週次棚卸) cron/scheduler → bot.pyが対象M層を起動
イベント外部イベント GitHub Issue作成、PRマージ、エラー検知等 該当M層(Issue→PMO, PR→OA, エラー→SA) Webhook/ポーリング → bot.pyがイベントを検知 → 対象M層を起動
連携M層間連携 (REROUTE) あるM層の完了が別M層を起動 起動元M層が指名(例: VDU完了→OA監査) M層が STATUS: REROUTE を返却 → bot.pyが指名先M層を起動
継続自律ループ (CONTINUE) M層が自身の次タスクを宣言 宣言したM層自身 M層が STATUS: CONTINUE を返却 → bot.pyが同M層に次タスクを投入

日次経営会議フロー

全M層共通の定常アジェンダ
  1. 前日振り返り — 各ディビジョンの実績報告
  2. 組織進捗 — ディビジョン健全性チェック
  3. PJ進捗 — 各PJの状況・ブロッカー報告
  4. リソース計画 — トークン消費実績・配分計画
持ち込みアジェンダ: 課題棚卸、ルール設計提案、新規PJ起案、CEOからの相談
ステップ実行者内容
1 招集bot.py (cron)定時に全M層へアジェンダを配信
2 報告準備各M層担当領域の実績・課題・提案を整理
3 集約IF層全M層の報告を受領し、CEO向けサマリーを作成
4 CEO確認CEO報告を確認。優先順位・リソース配分を決定
5 指示反映IF層 → 各M層CEOの決定を各M層に伝達。タスク着手

PJフロー: CEOタスク指示 → M層実行 → 結果返却

CEOがSlackで指示 → IF層がルーティング → M層がフェーズ分解・W層実行 → レビュー → IF層が結果整形 → CEO確認。
全M層共通のフロー。VDU/BA/H&A/PMO/OA/SAのいずれにも当てはまる。

CEO
bot.py
IF層
M層(任意Div)
W層
NG 差し戻し OK
Slackでタスク指示
Slack受信
→ IF層に転送
ドメイン判断
→ M層(Div)を指名
セッション起動 or resume
常駐中なら即応答
タスク受領
フェーズ分解
W層実行
researcher/architect/
coder/tester等
(subprocess実行中)
成果物受領
成果物返却
M層
レビュー
NG → 修正指示で
W層に差し戻し
↓ OK — STATUS判断
STATUS
判定
CONTINUE → 次フェーズ
REROUTE → 他Div起動
APPROVAL → CEO待ち
結果受領
CEO向け報告整形
DONE: 結果報告
結果をSlackに投稿
結果を確認

凡例

指示・委譲(下流へ)
結果返却(上流へ)
NG差し戻しループ
判断ノード
セッション管理ノード

STATUS判定: DONE(完了報告)/ CONTINUE(次フェーズ実行)/ REROUTE(他Div連携)/ APPROVAL_NEEDED(CEO承認待ち)/ CONSULT(CEOに相談)

PJフロー: 日次経営会議(全M層共通)

毎日定時にbot.pyが全M層を招集。各M層が報告を準備 → IF層が集約 → CEOに報告 → 決定を反映。
特定のM層だけの仕組みではなく、全ディビジョンに共通のプロセス

CEO
bot.py (cron)
IF層
全M層
VDU/BA/H&A/PMO/OA/SA
W層(必要時)
定時経営会議
トリガー発火
アジェンダ作成
→ 全M層に配信
各M層セッション
起動 or resume
担当領域の
実績・課題を整理
データ収集
(必要に応じて)
データ受領
報告書作成
実績・課題・提案
全M層の報告を集約
CEO向けサマリー作成
報告提出
サマリーを
Slackに投稿
報告確認
優先順位・配分を決定
決定事項を送信
CEO決定を
IF層に転送
決定事項を分配
→ 各M層に指示
指示受領
タスク着手

凡例

指示・配信(下流へ)
報告・返却(上流へ)
任意(必要時のみ)
定時cron/schedulerトリガー

※ 全6ディビジョンが同一フローで参加する。M層レーンは全Divを代表。
※ CEO不在時はIF層がサマリーをSlackに投稿し、CEOは後で非同期確認。

PJフロー: M層自律ループ(CONTINUE)

M層がタスク完了後に自らSTATUS: CONTINUEを返却し、次のタスクに連続着手するフロー。
CEO不在時でも自律的に進行。APPROVAL_NEEDEDな操作はCEO待ちで一時停止。

CEO
bot.py
IF層
M層(任意Div)
W層
CONTINUE
(不在 or 就寝中)
自律W層に委譲
W層実行
成果物レビュー
成果物返却
レビュー
OK?
NG → W層に差し戻し
STATUS
判定
CONTINUE
→ 次タスクへ(右側ループ)
↓ APPROVAL_NEEDED の場合
承認リクエスト受領
CEO向けに整形
APPROVAL_NEEDED
CEO承認待ち
承認リクエストを
Slackに投稿
承認 or 却下
承認 → M層に反映
承認受領
次フェーズ着手

凡例

指示(下流へ)
結果返却(上流へ)
CONTINUE ループ
自律M層が自発的に開始

※ CONTINUEループはbot.pyが仲介する。M層のSTATUS:CONTINUEを受けてbot.pyが同M層に次タスクを投入。
※ APPROVAL_NEEDED(コスト発生・外部送信・破壊的操作)はCEO承認まで一時停止。CEOは非同期で確認可能。

PJフロー: ディビジョン間連携(REROUTE)

あるM層の完了が別のM層を起動するフロー。例: VDU実装完了 → OA品質監査、SA異常検知 → VDU修正。
M層がSTATUS: REROUTEを返却し、bot.pyが指名先のM層を起動する。

bot.py
IF層
M層A(起動元)
例: VDU
M層B(連携先)
例: OA
REROUTE
STATUS: REROUTE
→ OAに品質監査依頼
REROUTE受領
→ IF層に転送
連携先Divを判断
→ M層Bに委譲
M層Bセッション
起動 or resume
タスク受領
監査・検証を実行
W層起動・レビュー
(通常の実行フロー)
連携結果を受領
CEO向け整形
結果報告
結果をSlackに投稿
or CEO承認待ち

凡例

指示(下流へ)
結果返却(上流へ)
Div間連携(REROUTE)
REROUTEM層間の連携トリガー

※ REROUTE先のM層B内部は通常の実行フロー(フェーズ分解→W層→レビュー)と同じ。
※ 典型例: VDU→OA(品質監査)、SA→VDU(異常修正)、VDU→BA(コスト見積)

REROUTE連携の典型パターン

起動元連携先トリガー条件
VDU(実装完了)OA(品質監査)mainブランチへのPRマージ後
SA(異常検知)VDU(修正実装)セキュリティ脆弱性・障害検知時
VDU(新機能設計)BA(コスト見積)外部API利用・インフラ増設が必要な場合
BA(契約レビュー完了)VDU(実装着手)外部サービス契約締結後の統合実装
PMO(PJ起案)VDU/BA(実行)新規PJの実行フェーズ移行
OA(監査NG)VDU(修正実装)品質基準未達の場合