본문으로 건너뛰기
cccskills
무료GitHub에 공개

dispatcher-handover

ディスパッチャーのコンテキストを圧迫したまま session を続けるのを避けるため、 monitoring 状態(active workers / 直近 polling cursor / pending escalations)を handover ファイルに書き出し、secretary の指示で /clear → /dispatcher-resume の 流れで新しいディスパッチャー session を開始する準備をする。

Secretary から DISPATCHER_HANDOVER peer message を受領したとき、または ディスパッチャー自身が context が長くなったと判断したときに使う。context-handover watcher が `/dispatcher-handover auto op=<OP>` を打鍵したときも使う。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

연동 도구AWS

실행 점수 미검증

설치 방법 보기

포함된 파일(2)

  • SKILL.md17.0 KB
  • SKILL.md.in11.4 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

dispatcher-handover: ディスパッチャーの引き継ぎ

ディスパッチャー session を長期化させずに、現在の monitoring 状態と組織員としての 立ち位置を次 session へ受け渡すための handover ファイルを作る。書き出した後、 secretary に「ack を受けたら send_keys で /clear → /dispatcher-resume を打って ほしい」と通知する。

輸送層(transport)両系 — 既定 broker / opt-in renga: 本ファイル(および各スキル)の peer message・pane 操作は mcp__org-broker__* で書いてあり、ORG_TRANSPORT 無設定=既定 broker ではそのまま従えばよい。ORG_TRANSPORT=renga(opt-in、切戻し可)では MCP サーバー名が renga-peers になり、完全修飾名が mcp__org-broker__* → mcp__renga-peers__* に機械置換される(引数形・セマンティクスは同一なので操作の論理は変わらない)。輸送依存で手順が変わる差は次の 3 点:

  • 受信モデル(既定 = push 一次 = claude/channel / pull フォールバック): 既定 broker は push 一次に設計されている(runtime push-first 0.1.24+、設計 SoT は transport-lab docs/design/broker-native-roles.md §9): 各ペイン同居の channel sidecar(server:org-broker-channel)が broker キューを ~1 秒間隔で claim→push し、notifications/claude/channel で本文を idle セッションへ注入する(「受けたら即応答」契機が生まれる)。ワーカー ack(to_id="worker-{task_id}")・retro gate ack(to_id="dispatcher")・ディスパッチャー handover 経路の send_message / check_messages / send_keys / inspect_pane は同じツール名(mcp__org-broker__*)で動く。pull はフォールバック層: sidecar 不在 / unhealthy(heartbeat timeout で delivery_mode=PULL)/ channel 非対応ペイン(codex pull-peer)/ claude.ai login 不在時は、各役割が自身の cadence で能動的に check_messages する(役割別 cadence: worker=ターン境界 / 完了後 bounded /loop・dispatcher=/loop 3m・secretary=ターン冒頭。「ナッジを見たら check_messages」prose は撤回せずこの fallback cadence として読む)。ORG_TRANSPORT=renga(opt-in)では、ワーカー報告・ディスパッチャー応答が <channel source="renga-peers" …> として in-band で push される(renga の in-band push と broker push 一次は同じ即応契機)。契約面は Surface 8 + push-primary amendment で push 一次が ratified 済み(2026-06-15、S3。pull は fallback として retain・renga 不変)。
  • spawn 儀式(既定 = folder-trust 承認 + dev-channel sidecar 承認の 2 段): 子ペイン起動時、既定 broker は --mcp-config <broker> を注入し Claude Code の folder-trust プロンプトを画面判定で機械承認するのに加えて、push 一次のため channel sidecar を --dangerously-load-development-channels server:org-broker-channel で load し dev-channel 承認プロンプト(spawn-flow 3-3b)を画面判定で機械承認する(folder-trust + dev-channel の 2 段承認。詳細は .dispatcher/references/spawn-flow.md 3-2 / 3-3b、設計は broker-native-roles.md §9.5)。ORG_TRANSPORT=renga(opt-in)では --dangerously-load-development-channels server:renga-peers を注入し「Load development channel?」を画面判定で承認する 1 段。注: attention watcher は transport 非依存の CLI ペインであり、folder-trust / dev-channel いずれの 2 段承認の対象外(spawn 儀式の反転に巻き込まない)。 画面判定 = inspect_pane → claude-org-runtime dispatcher spawn-prompt-step が返した 1 手だけを send_keys する反復(runtime 0.1.43+)。盲目 Enter は禁止(folder-trust の初期カーソルは「No, exit」で、Enter 一発はワーカーを終了させる)。手順は spawn-flow 3-3b。
  • エラー分岐(既定 = broker 拡張コード込み): 既定 broker は shared codes(pane_not_found / last_pane / invalid-params、Surface 6)に加え broker 固有 [token_invalid] / [session_invalid] / [tool_not_authorized] / [no_backend](= adapter_unavailable)/ [nudge_failed] / [peer_not_found] / [name_taken] / [unknown_tool] を返しうる(未知コードは default-branch で escalate)。ORG_TRANSPORT=renga 時は broker 固有コードは発生せず shared codes + renga 固有コードのみ。

契約面の正本は docs/contracts/backend-interface-contract.md Surface 8(broker auth & delivery、ratified 2026-06-14)+ 末尾「Ratified amendment (2026-06-15): push-primary delivery」(S3。broker push 一次が既定の契約、pull は structural fallback として retain)、設計 SoT は transport-lab docs/design/broker-native-roles.md §9(push 一次)/ docs/design/ja-migration-plan.md §5・§8。opt-in renga は削除せず常時有効な fallback として維持する(切戻しの安全装置)。broker 実走(dogfood)は Epic #6 Issue G スコープであり、本ファイルの既定運用経路ではない(既定の二フレーム注記(Refs #604): ここでの「既定 broker」はコード既定フレーム — tools/transport.py: DEFAULT_TRANSPORT が runtime 0.1.28 (Epic #586) で broker にフリップ済みで、ja 生成器・transport.resolve() はこのコードフレームで render するため生成面はこう表示する。別に運用既定フレームがあり、broker 実走 dogfood が Epic #6 Issue G まで未活性のため運用上の既定経路は renga。両フレームは指す対象(コード定数 vs 運用経路)が異なり矛盾しない。総説は root CLAUDE.md「輸送層(transport)両系」節。)

重要な前提:

  • 本 skill は ディスパッチャー自身(.dispatcher/ cwd)が実行する。 secretary から直接呼ぶものではない。
  • ワーカー / 窓口 / キュレーターのペインは生かしたまま残す。/clear は ディスパッチャー Claude のコンテキストだけをリセットするので、state.db と handover ファイルから復帰できれば monitoring は途切れない。
  • ディスパッチャーペイン (name=dispatcher) も生かしたまま残す。ペイン自体を 閉じると pane_id / peer_id が変わり、/loop 3m の hook 再登録が必要になる。 secretary は mcp__org-broker__send_keys(target="dispatcher", ...) で /clear と /dispatcher-resume を打鍵するだけで pane を維持する canonical 経路を取る。
  • state DB (.state/state.db) は唯一の SoT。pane/peer identity は handover に 参考値として書くが、resume 時の真値は list_panes / list_peers の現観測。
  • 監視ループに gap を生まないために、以下のファイルは 絶対に削除・編集しない:
    • .state/dispatcher-event-cursor.txt(次サイクルの poll_events cursor。backend session に束縛されており、resume 後の 1 サイクル目が束縛を照合してから使う)
    • .state/dispatcher/worker-idle-state.json(stall 検出の idle streak)
    • .state/dispatcher/curate-inflight.json(オンデマンド curate の開始記録。存在する場合のみ)
    • .state/pending_decisions.json(判断仰ぎ register)
    • .state/workers/worker-*.md(各ワーカー run state) handover ファイルは上記の 追加コンテキスト(人間とのやり取りの温度感は無いが、 進行中の派遣事情・直近の anomaly 観測)に絞る。

Step 1: handover 対象を整理する

書き出す前に、ディスパッチャー自身の context から以下を抽出する:

  1. 直近の派遣事情
    • DELEGATE 受信 → spawn 成否、escalate 経路に乗ったタスクの ID
  2. 進行中のワーカー監視
    • .state/workers/worker-*.md の Status が active なペイン名と最新の Progress Log 抜粋
    • state.db で in_use / review の run のうち、上の監視対象に入れなかったもの(Step 2 の active_runs[] と突き合わせる)は、mcp__org-broker__list_panes で worker-<task_id> の有無を確かめ、 「監視外」として 1 件ずつ書く(Step 3 の ## 監視外の run)。state.db に run が残ったまま ペインが閉じた記録のずれがここに出る。watcher は live な run の task_id が本文に全部 あることを検査するので、監視外の run も落とさない
  3. 直近 anomaly 観測の要約
    • 過去 1 サイクル分で journal_append した anomaly_observed / notify_sent のうち 未解消のもの
  4. 未配送 / 失敗した送信
    • [pane_not_found] / [split_refused] 等で secretary に escalate 済み or 再試行待ちのもの
  5. 次のアクション(ディスパッチャー視点)
    • 次サイクルで優先的に確認すべき worker / 中継待ちの判断

Step 2: state.db から構造化情報を取得する

handover に参考情報として埋め込む。書き出し先は sandbox で write 可能な $TMPDIR (未設定なら /tmp フォールバック)に置く。ディスパッチャーの cwd は .dispatcher/ なので 相対パスは 1 階層上に解決する:

python3 -c "
import sys, os
sys.path.insert(0, os.path.abspath('..'))
from tools.state_db import connect
from tools.state_db.queries import get_org_state_summary
import json
conn = connect('../.state/state.db')
out_path = os.path.join(os.environ.get('TMPDIR', '/tmp'), 'dispatcher-handover-state.json')
with open(out_path, 'w') as f:
    json.dump(get_org_state_summary(conn), f, ensure_ascii=False, indent=2, default=str)
print(out_path)
"

ここから以下を取り出す:

  • session.dispatcher_pane_id / session.dispatcher_peer_id(現在の identity)
  • active_runs[](進行中タスク)
  • active_worker_dirs[](生きているワーカーディレクトリ)
  • 直近の recent_events のうち worker_spawned / worker_reported / worker_escalation 上位 5 件程度

Step 3: handover ファイルを書き出す

書き出し先: .state/dispatcher-handover.md(リポジトリルート起点。ディスパッチャー cwd .dispatcher/ からは ../.state/dispatcher-handover.md)。

既存ファイルがあれば .prev.md にバックアップしてから上書きする:

[ -f ../.state/dispatcher-handover.md ] && \
  cp ../.state/dispatcher-handover.md ../.state/dispatcher-handover.prev.md

フォーマット(YAML frontmatter + markdown):

---
created_at: <date -u +%Y-%m-%dT%H:%M:%SZ の出力。決定的 UTC、JST-as-Z 禁止>
dispatcher_pane: <pane_id> / peer=<peer_id>
active_worker_count: <int>
event_cursor_present: <true | false>
idle_state_present: <true | false>
pending_decisions_count: <int>
---

# Dispatcher Handover

## 監視対象のワーカー
- worker-<task_id> (<worker_dir>): Status=<active|...>、直近 Progress Log 1 行抜粋
- ...

## 監視外の run
- 監視外: <task_id>(ペインなし)  ← `list_panes` に worker-<task_id> が無い。state.db の run だけが残っている
- 監視外: <task_id>(ペインあり・未監視)  ← ペインはあるが監視対象に入れなかった理由を添える
(無ければ「なし」と明記する)

## 直近 anomaly / notify_sent サマリー
- worker-<task_id>: kind=<approval_blocked|stall_suspected|relay_gap_suspected> ...
(無ければ「なし」と明記する)

## 未配送 / 失敗した送信
- ...
(無ければ「なし」)

## 次のアクション(ディスパッチャー視点)
- 次サイクルで再確認: worker-<task_id> の <理由>
- ...

## 監視 gap を埋める参照ファイル(read-only、本 skill は触らない)
- `.state/dispatcher-event-cursor.txt`: poll_events 次 cursor(`session_key` と対で保存されており、resume 後の 1 サイクル目が現 backend session と照合してから使う。不一致なら監視ループが破棄して張り直し `EVENT_CURSOR_RESET` を窓口へ報告する)
- `.state/dispatcher/worker-idle-state.json`: stall 検出の idle streak
- `.state/dispatcher/curate-inflight.json`: オンデマンド curate の開始記録(存在する場合のみ。resume 後の Step 5.3 timeout 管理が `started_at` 起点で継続する)
- `.state/pending_decisions.json`: 判断仰ぎ register
- `.state/workers/worker-*.md`: 各ワーカー run state

## 参考: state.db スナップショット
(Step 2 で取得した session / active_runs / recent_events を簡潔に転記)

書き方の注意:

  • 「過去ログ」ではなく「次の自分への申し送り」として書く。
  • created_at は date -u +%Y-%m-%dT%H:%M:%SZ(PowerShell 環境は (Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"))の出力をそのまま埋める。 local(JST)時刻を手書きして Z を付けない(JST-as-Z 禁止)。/dispatcher-resume はこの created_at を 7 日鮮度窓(cold-start vs resume 分岐)で now - created_at 評価するため、 未来時刻が混入すると判定がぶれる。dispatcher 状態ファイルの時刻を一律 UTC に揃える方針 (.dispatcher/references/worker-monitoring.md 冒頭の時刻規約)と整合させる。
  • 機密情報・トークン・パスワードは絶対に書かない。
  • ファイルは secretary / 人間も読むことを想定する。

Step 4: イベントを記録する

ディスパッチャーの cwd は .dispatcher/ なので 1 階層上を呼ぶ:

bash ../tools/journal_append.sh dispatcher_handover \
    active_workers=<int> pending_decisions=<int> \
    note=context_compaction

自動引き継ぎ(引数 auto op=<OP> 付きで呼ばれたとき)は同じ行に op=<OP> を足す。

Step 5(自動引き継ぎ): auto op=<OP> のとき

/dispatcher-handover auto op=<OP> は context-handover watcher (tools/context_handover_watch.py)が打鍵する。 このときは下の Step 5 を行わず、secretary へ次の 1 通だけ送って終える(ack は待たない)。 /clear と /dispatcher-resume auto op=<OP> は watcher が打つので、窓口に打鍵を頼まない:

DISPATCHER_AUTO_HANDOVER: 自動引き継ぎ中(op=<OP>)。/clear と /dispatcher-resume の打鍵は watcher が行います。窓口からは打鍵しないでください。

Step 5: secretary に通知する

mcp__org-broker__send_message(to_id="secretary", message=...) で以下を伝える:

DISPATCHER_HANDOVER_READY: ../.state/dispatcher-handover.md に書き出しました。
ack を返したら mcp__org-broker__send_keys(target="dispatcher") で
/clear → /dispatcher-resume を順に打鍵してください。
ペインは閉じないでください(pane_id 維持で監視 gap を最小化)。
active workers: <count>, pending decisions: <count>。

secretary はこの message を受領して、人間にエスカレーションせず(routine handover は判断仰ぎではない)、send_keys で /clear と /dispatcher-resume を打鍵する。 ack が secretary から戻った後、本 skill は完了。次に何もしない(/clear で context がリセットされる前提)。

ディスパッチャーがやってはいけないこと:

  • /clear を自分で打とうとしない(外部から send_keys で受ける側)
  • ワーカーやキュレーターに SHUTDOWN を送らない(pane は生かしたまま)
  • /loop 3m を自分で停止しない(resume 後に再開する設計だが、現サイクルは継続)

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

/dispatcher-handover で書き出した handover ファイルを読み込み、 ディスパッチャーを新しい session で復帰させる。/clear 直後の最初のターンで使う。 state.db の dispatcher_pane_id / dispatcher_peer_id を atomic に更新し、 worker monitoring の /loop 3m を再開する。 secretary が /clear の後にディスパッチャーペインへ /dispatcher-resume を打鍵したときに使う。 context-handover watcher が `/dispatcher-resume auto op=<OP>` を打鍵したときも使う。 /org-start ではない(ワーカー・窓口は生きている前提。キュレーターは常駐しない)。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

プロジェクトのゴール台帳(registry/goals/<owner>/<repo>.md)を人間と対話して新規作成・改訂する。 README と open Issue からゴール候補を推定して提示し、「何を目指すか」「何が起きていたら未達か」を 短く質問して条項を固め、書式検証(tools/work_discovery_goals.py validate)を通してから保存する。 「ゴール台帳を書きたい」「ゴールを設定して」「ゴール未設定と出た」「台帳エラーを直して」 「このプロジェクトの目標を決めたい」等や、/work-discovery の「ゴール未設定」「ゴール台帳エラー」案内を 受けて窓口が起動する。候補の提示そのものは /work-discovery の役目で本スキルではない。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

組織の生きているペイン(secretary / dispatcher / worker)へ tmux で**直接入る** ための **コマンドを出力するだけ** の read-only スキル。`mcp__org-broker__list_panes`(論理ペイン) と `/usr/bin/tmux -L claude-org-broker list-panes -a`(pane_id ↔ session マッピング)を pane_id(%N)で突き合わせ、各ペインに role + name(task_id) ラベル付きの attach コマンドを 生成する(既定は読取書込 = `-r` 無し / 読取専用 `-r` はオプション / デタッチは `Ctrl-b d`)。 外側が tmux のときに今の tmux を分割してワーカー(と dispatcher)を並べる `split-window` コマンドも出す。 特定のペインの画面を直接見たい・入りたい・並べて見たい、attach コマンドを知りたいという依頼で発動。 自分で attach / split はせず・ペインも一切変更しない(コマンド文字列とペイン一覧表を表示するのみ)。 作業委譲(org-delegate)・ダッシュボードで状況一覧(org-dashboard)・watcher 停止(org-attention-stop) には発動しない。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

attention notification watcher(承認待ち / 判断待ち / CI 失敗等を OS 通知 + 音で能動通知)を dispatcher ペインの右側に split で常駐起動する。`.state/attention.json` が未配置なら ja 既定テンプレートを `tools/templates/attention.example.json` から自動コピーする。 起動後のペイン id は `.state/attention_pane.json` に記録し、`/org-attention-stop` から参照する。 「attention 起動」「通知監視を始めて」「watcher を立てて」等で発動。 `/org-start` からの auto-start はしない(明示起動推奨ポリシー)。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

`/org-attention-start` で起動した attention watcher ペインを停止する。 `.state/attention_pane.json` に記録された pane_id を `list_panes` の name/role で identity 確認し、いまも attention watcher を指している場合だけ `close_pane`(pane 破棄)で 破棄する(pane_id が別ペインへ再割当て済みなら close せず stale sidecar として削除)。 「attention 止めて」「通知監視を停止」「watcher 落として」等で発動。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

人間が承認したスコープの内側で triage → worker 派遣 → verify → push → PR 作成 → CI 監視 を完了駆動で自走し、PR ごとに merge gate で停止する窓口用のベルトコンベア。 「この範囲は自走してよい」「triage 上位の S 級バグを空き pane 分まで流して」等、 人間がスコープ承認を明示して複数候補を順に流したいときに窓口が起動する。

한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.

suisya-systems/claude-org-ja52026년 10월 22일 업데이트

suisya-systems의 스킬 모두 보기

이 스킬의 문제 신고