Skip to content
cccskills
FreePublished on 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>` を打鍵したときも使う。

The English summary is being prepared. Showing the original description.

Works withAWS
See how to install

Files included (2)

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

SKILL.md (original)

Review the instructions the agent will receive before you install.

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 後に再開する設計だが、現サイクルは継続)

Reviews

No reviews yet. Tell others what you thought.

Comments

No login needed. Share how it worked for you, ask a question, or note where it did not run.

No comments yet. Be the first to write one.

Comments are published right away. Do not include personal information such as email addresses or phone numbers. Up to 2 URLs.

0 / 1,000 characters

This form is protected by reCAPTCHA, and the Google Privacy Policy and Terms of Service apply.

More skills from this repository

/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 ではない(ワーカー・窓口は生きている前提。キュレーターは常駐しない)。

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

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

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

組織の生きているペイン(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) には発動しない。

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

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 はしない(明示起動推奨ポリシー)。

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

`/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 落として」等で発動。

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

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

The English summary is being prepared. Showing the original description.

suisya-systems/claude-org-ja5Updated Oct 19, 2026

See all skills by suisya-systems

Report a problem with this skill