並列セッション共有アーキテクチャ

2026-04-24 作成 / 複数 Claude Code セッション間で作業状況をリアルタイム共有する仕組み

一言で説明すると

共有黒板モデル

ファミレスの厨房に 全員が見える一枚の黒板 がある。
各コック(=各 Claude Code セッション)が、自分の注文を受けたとき・作業中・完成したときに黒板にチョークで書き足す。
他のコックは黒板を見れば「今誰が何を作っているか」「さっき誰が何を作り終えたか」が分かる。
黒板のたとえ実体
黒板tmp/sessions/ フォルダ
チョーク(書き込みツール)scripts/session/session_lib.py
黒板を写真に撮って壁に貼る部署/調査分析部/output/session_board.html
写真を撮る人(3分毎に壁紙を更新)cron SessionBoard_3min

物理的な構造

セッションA(秘書モード) セッションB(別の作業) │ │ │ register "作業タイトル" │ register "別作業" ▼ ▼ ┌─────────────────────────────────────────────────┐ │ F:\claude-work\tmp\sessions\ │ │ ├─ active\ │ │ │ ├─ 20260424_130842_fe5c6240.json │◀─ A 本人が書き込む │ │ └─ 20260424_150000_abcd1234.json │◀─ B 本人が書き込む │ ├─ work_log\ │ │ │ ├─ 20260424_130842_fe5c6240.jsonl │◀─ A の作業履歴(追記) │ │ └─ 20260424_150000_abcd1234.jsonl │◀─ B の作業履歴(追記) │ └─ done\ ← 終わったら移動 │ └─────────────────────────────────────────────────┘ ▲ ▲ │ list で他セッションを読み取る │ list で他セッションを読み取る │ │ セッションA セッションB
衝突しない理由: 各セッションは 自分の JSON にしか書き込まない。お互いの JSON は 読むだけ。ダッシュボード.md を複数セッションが同時編集していた時代の「最終更新」上書き合戦を構造的に回避している。

3種類のファイルと役割

ファイル役割書き込みタイミング
active/<session_id>.json 今走っているセッションの 現在状態(title・現在作業・最終活動時刻) register / log / task するたびに上書き
work_log/<session_id>.jsonl そのセッションの 履歴全件(append-only・1行=1イベント) log するたびに 1 行追加
done/<session_id>.json 終了セッションのアーカイブ close または 60分無活動で自動移動

共有の流れ(具体例)

14:00
セッションA で「ad_full_audit 完了」とログを書き込む
active/A.json の last_activity_at 更新
work_log/A.jsonl に 1 行追加
14:03
cron(SessionBoard_3min) が発火、全 JSON をスキャン
session_board.html を再生成
→ A の最新状態が HTML に反映される
14:05
セッションB が起動
→ SessionStart hook が session_start_hook.py を発火
→ B 自身を active/ に登録
→ B 自身に additionalContext として「並列アクティブ: A」を注入
→ B の AI は「A が動いてるんだな」と認識して作業開始
14:06
セッションB で内川様が「A で今何やってる?」と聞く
→ B の AI は active/A.jsonwork_log/A.jsonl を読む
→ 「A は ad_full_audit を 14:00 に完了しました」と答える

なぜこの構造なのか(設計意図)

  1. 同時編集の衝突回避: 各セッションが別ファイルにしか書かないので、ロック不要
  2. 永続化: ファイルシステムなので、セッション間・PC 再起動後でも保持
  3. 可視化の外出し: ボード HTML は別 cron が作るので、セッション側は書き込むだけでよい(責務分離)
  4. 失敗してもハング無し: hook が落ちても exit 0 を返す設計なので、Claude Code 本体の起動を止めない
  5. ヒューマンリーダブル: JSON/JSONL はテキストなので、エディタで直接読める・git で差分追跡できる

主要コマンド(AI が手動で叩く場合)

# 新セッション登録(session_id が stdout に出る)
py -3 scripts/session/session_lib.py register "作業タイトル"

# 進捗ログ(大きな完了・判断転換点ごとに)
py -3 scripts/session/session_lib.py log <sid> completed "概要" [ref1] [ref2]...

# 現在の作業を更新
py -3 scripts/session/session_lib.py task <sid> "現在の作業"

# 他セッション一覧(並列状況を把握したい時)
py -3 scripts/session/session_lib.py list

# セッション終了
py -3 scripts/session/session_lib.py close <sid> "最終サマリ"

# 60分無活動のセッションを done/ に移動
py -3 scripts/session/session_lib.py cleanup 60

SessionStart hook に session_start_hook.py が登録されているため、新しい Claude Code セッション起動時には register が自動で発火する。AI は手動コマンドを叩かなくても登録される。

Google Docs と何が違うのか

共有 Google Docs の file-system 版

複数人が同じドキュメントに直接書くのではなく、
…という構造。衝突しない・中央サーバーいらない・永続化される・人間も AI も読める。

関連ファイル一覧

ファイル役割
scripts/session/session_lib.pyCLI ツール(register / log / task / close / list / cleanup)
scripts/session/session_board.pyHTML ボード生成スクリプト
scripts/session/session_start_hook.pySessionStart hook 本体(新セッション自動登録)
scripts/cron/session_board.batcron 経由の HTML 再生成 wrapper
scripts/cron/tasks.yamlSessionBoard_3min cron タスク定義
.claude/settings.local.jsonSessionStart hook 登録(2件・inject_session_context + session_start_hook)
.claude/.current_session_id現セッションの ID(hook が書き込み・AI が読む)
部署/調査分析部/output/session_board.htmlボード本体(3分毎更新)
tmp/sessions/active/アクティブセッションメタの置き場
tmp/sessions/work_log/作業履歴ログの置き場
tmp/sessions/done/終了セッションアーカイブの置き場
memory/feedback_session_board_manual_ops.mdAI の行動ルール
CLAUDE.md §セッション開始・終了プロトコルAI 必読のプロトコル