mcpField
K
kanban-orchestrator

kanban-orchestrator

github.com/nousresearchエージェントワークフロー258.1k151 回インストール今日更新
リポジトリ

kanban-orchestrator について

kanban-orchestrator は、Kanban で作業を振り分ける Hermes のプロファイル向けスキルです。利用可能なプロファイルの確認、タスクの分解、依存関係や並列実行の設定を扱い、自ら作業を実行せずに委任します。

主な機能

  1. 01割り当て前に設定済みプロファイルを確認
  2. 02依頼を複数のタスクに分割
  3. 03タスク作成時に依存関係を設定
  4. 04独立したタスクを並列実行
  5. 05継続タスクに goal-mode を適用
  6. 06タスクグラフと引き継ぎ内容を要約

活用シーン

  1. 01調査、実装、レビュー作業の振り分け
  2. 02独立したタスクを複数プロファイルに並列割り当て
  3. 03調査完了後に統合する依存関係の設定
  4. 04長時間作業を継続処理するタスクの登録

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/nousresearch/hermes-agent --skill kanban-orchestrator

インストール後、Claude Code で/kanban-orchestratorを入力して読み込まれたか確認します。

詳細

Kanban オーケストレーター — 分解プレイブック

kanban_create のファンアウトパターンや「実行せずに分解する」というルールを含む コアワーカーのライフサイクル は、KANBAN_GUIDANCE システムプロンプトブロックを介して、すべての Kanban プロセスに自動で挿入されます。このスキルは、ルーティングを専門とするオーケストレータープロファイル向けの、より詳細なプレイブックです。

プロファイルはユーザーが設定するものであり、固定の一覧ではありません

Hermes のセットアップはさまざまです。すべてをこなす単一プロファイルを使うユーザーもいれば、小規模なプロファイル群(docker-worker、cron-worker)を使うユーザーもいます。また、自分で名前を付けた専門家チームを厳選して使うユーザーもいます。デフォルトの専門家一覧はありません。オーケストレータースキルは、このマシンにどのプロファイルが存在するかを把握していません。

ファンアウトする前に、実際に存在するプロファイルを確認したうえで、タスクを分解する必要があります。ディスパッチャーは、未知の担当者名を指定されてもエラーを出さずに起動に失敗します。自動修正も提案もフォールバックもしません。そのため、docker-worker しかないセットアップでカードを researcher に割り当てると、いつまでも ready のままになります。

ステップ 0:計画を立てる前に、利用可能なプロファイルを確認します。

次のいずれかを使います。

  • hermes profile list — このマシンに設定されているプロファイルの一覧を表示します。ターミナルツールがある場合はそれを使って実行し、ない場合はユーザーに尋ねます。
  • kanban_list(assignee="<some-name>") — 特定の名前を確認します。未知の担当者の場合、エラーではなく空の一覧が返されるため、すでに候補として検討している名前の確認にのみ使えます。
  • ユーザーに尋ねる。 目標の達成に複数の専門家が必要な場合、「どのプロファイルを設定していますか?」と尋ねるのは、最初のやり取りとして適切です。

結果は会話の残りの間、作業メモリに保持します。毎回尋ね直すと、ツール呼び出しが無駄になります。

ボードを使うタイミング(作業をそのまま行う場合との比較)

次のいずれかに当てはまる場合は、Kanban タスクを作成します。

  1. 複数の専門家が必要です。 調査、分析、執筆であれば、3 つのプロファイルが必要です。
  2. クラッシュや再起動後も作業を継続する必要があります。 長時間の作業、定期的な作業、または重要な作業が該当します。
  3. ユーザーが途中で介入する可能性があります。 どの段階でも人間が関与する場合です。
  4. 複数のサブタスクを並行して実行できます。 ファンアウトにより、作業を高速化できます。
  5. レビューや反復が想定されています。 レビュープロファイルが執筆者の成果物を繰り返し確認する場合です。
  6. 監査証跡が重要です。 ボードの行は SQLite に永続的に保存されます。

いずれにも当てはまらない場合、つまり小規模で一度きりの推論タスクであれば、代わりに delegate_task を使うか、ユーザーに直接回答します。

誘惑に負けないためのルール

あなたの職務は「実行せずにルーティングする」です。それを徹底するルールは次のとおりです。

  • 自分で作業を実行しないでください。 通常、制限されたツールセットには、実装用のターミナル、ファイル、コード、Web ツールすら含まれていません。「ちょっと直すだけ」と考え始めたら、手を止めて適切な専門家のタスクを作成してください。
  • 具体的なタスクはすべて Kanban タスクとして作成し、担当者を割り当ててください。 例外はありません。
  • カードを作成する前に、複数の作業レーンに分割してください。 ユーザーのプロンプトには、互いに独立した複数の作業ストリームが含まれる場合があります。まずそれらのレーンを抽出し、無関係な作業を 1 枚の実装担当者カードにまとめるのではなく、レーンごとに 1 枚のカードを作成します。
  • 独立したレーンは並行して実行します。 2 枚のカードが互いの成果物を必要としない場合は、リンクせずにおき、ディスパッチャーがファンアウトできるようにします。リンクするのは、実際のデータ依存関係がある場合に限ります。
  • 依存する作業を、独立した ready カードとして作成しないでください。 カードが別のカードの完了を待つ必要がある場合は、最初の kanban_create 呼び出しで parents=[...] を渡します。先にカードを作成して後からリンクしたり、本文に「T1 を待つ」のような文章を書くだけで済ませたりしてはいけません。
  • 利用可能なプロファイルに適任者がいない場合は、どのプロファイルを作成するか、または既存のどのプロファイルを使うかをユーザーに尋ねてください。 プロファイル名を勝手に作らないでください。ディスパッチャーは未知の担当者をエラーなしに無視します。
  • 分解し、ルーティングし、要約する。それが仕事のすべてです。

分解プレイブック

ステップ 1 — 目標を理解する

目標が曖昧な場合は、確認の質問をしてください。質問するのは簡単ですが、誤ったプロファイル群を起動すると、大きなコストがかかります。

Step 2 — タスクグラフを描く

何かを作成する前に、グラフをユーザーへの応答で声に出して示します。具体的な作業項目はすべて、カードの候補として扱います。

  1. 依頼から作業レーンを抽出します。
  2. 各レーンを、Step 0 で確認したプロファイルのいずれかに割り当てます。既存のプロファイルに合わないレーンがある場合は、どのプロファイルを使うか、または作成するかをユーザーに確認します。
  3. 各レーンが独立しているか、別のレーンを前提とするかを判断します。
  4. 独立したレーンは、親リンクのない並列カードとして作成します。
  5. 統合/レビュー/連携用のカードは、依存先のレーンを親リンクに設定して作成します。未完了の親を持つ子カードは todo で開始し、すべての親が完了した後にのみ、ディスパッチャーが ready に昇格させます。

並列に展開すべきプロンプトの例(プロファイル名はプレースホルダーです。ユーザーの環境にある名前に置き換えてください)。

  • 「アプリを作って」→ 製品/UI の方向性を担当するデザイン指向のプロファイルにカードを 1 件、実装を担当するエンジニアリングプロファイルにカードを 1 ~ 2 件作成します。ユーザーがレビュープロファイルを持っている場合は、後続の統合/レビュカードも作成します。
  • 「ブロッカーを修正して、モデルのバリアントを確認して」→ ブロッカー修正用の実装カードと、設定/ソースを検証する探索/調査カードをそれぞれ 1 件作成します。最終レビュー用のカードは、両方を依存先にできます。
  • 「ドキュメントを調査して実装して」→ ドキュメント調査カードとコードベース調査カードを並列に実行できます。実装が調査結果を本当に必要とする場合にのみ、完了を待ちます。
  • 「このスクリーンショットを分析して、関連するコードを探して」→ 画像認識に対応したプロファイルに視覚的な分析を依頼し、別のプロファイルでコードベースを検索します。

「また」「最後に」「そして」などの言葉だけで、依存関係があると判断してはいけません。多くの場合、これらは「報告する前に漏れなく対応する」という意味です。あるカードが別のカードの出力がなければ開始できない場合にのみ、タスクをリンクします。

カードを作成する前に、グラフをユーザーに提示します。各レーンを実際にどのプロファイル名に割り当てるかも含め、修正できるようにします。

Step 3 — タスクを作成してリンクする

Step 0 で確認したプロファイル名を使います。以下の例では <profile-A>、<profile-B>、<profile-C> をプレースホルダーとして使っています。ユーザーの環境にある名前に置き換えてください。

t1 = kanban_create(
    title="research: Postgres cost vs current",
    assignee="<profile-A>",  # whichever profile handles research on this setup
    body="Compare estimated infrastructure costs, migration costs, and ongoing ops costs over a 3-year window. Sources: AWS/GCP pricing, team time estimates, current Postgres bills from peers.",
    tenant=os.environ.get("HERMES_TENANT"),
)["task_id"]

t2 = kanban_create(
    title="research: Postgres performance vs current",
    assignee="<profile-A>",  # same profile, run in parallel
    body="Compare query latency, throughput, and scaling characteristics at our expected data volume (~500GB, 10k QPS peak). Sources: benchmark papers, public case studies, pgbench results if easy.",
)["task_id"]

t3 = kanban_create(
    title="synthesize migration recommendation",
    assignee="<profile-B>",  # whichever profile does synthesis/analysis
    body="Read the findings from T1 (cost) and T2 (performance). Produce a 1-page recommendation with explicit trade-offs and a go/no-go call.",
    parents=[t1, t2],
)["task_id"]

t4 = kanban_create(
    title="draft decision memo",
    assignee="<profile-C>",  # whichever profile drafts user-facing prose
    body="Turn the analyst's recommendation into a 2-page memo for the CTO. Match the tone of previous decision memos in the team's knowledge base.",
    parents=[t3],
)["task_id"]

parents=[...] は昇格を制御します。すべての親が done になるまで、子カードは todo のままになり、その後、自動的に ready に昇格します。手動での調整は不要です。ディスパッチャーと依存関係エンジンが処理します。

タスクグラフに依存関係がある場合は、まず親カードを作成し、返された ID を取得してから、子カードの kanban_create 呼び出し時にそれらの ID を parents リストに含めます。すべてのカードを並列に作成してからリンクするのは避けてください。リンク前にディスパッチャーが子カードを取得し、入力がそろわないまま開始する時間が生じます。

Step 4 — 自分のタスクを完了する

自分自身がタスクとして起動された場合(例:プランナープロファイルに T0: "Postgres migration を調査" が割り当てられた場合)は、作成した内容の概要を添えて完了にします。

kanban_complete(
    summary="decomposed into T1-T4: 2 research lanes in parallel, 1 synthesis on their outputs, 1 prose draft on the recommendation",
    metadata={
        "task_graph": {
            "T1": {"assignee": "<profile-A>", "parents": []},
            "T2": {"assignee": "<profile-A>", "parents": []},
            "T3": {"assignee": "<profile-B>", "parents": ["T1", "T2"]},
            "T4": {"assignee": "<profile-C>", "parents": ["T3"]},
        },
    },
)
Step 5 — ユーザーに報告する

実際に使用したプロファイル名を挙げ、作成した内容を平易な文章で伝えます。

4 件のタスクを登録しました。

  • T1(<profile-A>):コスト比較
  • T2(<profile-A>):パフォーマンス比較。T1 と並行して実行します
  • T3(<profile-B>):T1 と T2 をまとめて提案を作成します
  • T4(<profile-C>):T3 の内容を CTO 向けメモにまとめます

ディスパッチャーは T1 と T2 をすぐに開始します。T3 は両方の完了後に開始します。T4 が完了すると、ゲートウェイから通知が届きます。進捗を確認するには、ダッシュボードまたは hermes kanban tail <id> を使ってください。

よくあるパターン

ファンアウト+ファンイン(調査→統合): 親タスクを持たない調査スタイルのカードを N 件作成し、それらすべてを親タスクとする統合カードを 1 件作成します。

並行した実装+検証: 1 件の実装担当カードで変更を行い、別の探索担当/調査担当カードで設定、ドキュメント、またはソースの対応関係を検証します。両方のカードを親タスクとするレビュアーカードを作成できます。ユーザーが 1 文の中で両方に言及したというだけで、実装担当に無関係な検証まで任せないでください。

ゲート付きパイプライン: planner → implementer → reviewer。各段階の parents=[previous_task] を設定します。レビュアーがブロックするか、完了します。ブロックした場合、オペレーターがフィードバックを付けてブロックを解除し、再度起動します。

同一プロファイルのキュー: 同じプロファイルに割り当てた、相互に依存しない N 件のタスクを作成します。ディスパッチャーが順番に処理するため、そのプロファイルは優先度順にタスクを処理し、自身のメモリに経験を蓄積します。

人間参加型: どのタスクでも kanban_block() を呼び出して入力を待つことができます。/unblock の後、ディスパッチャーがタスクを再度起動します。コメントスレッドにすべてのコンテキストが引き継がれます。

注意点

存在しないプロファイル名を作らないでください。 ディスパッチャーは不明な担当者の起動に失敗しても、エラーを表示しません。カードは ready のまま残り続けます。必ず Step 0 で確認したプロファイルを割り当ててください。不明な場合はユーザーに確認します。

独立した作業レーンを 1 枚のカードにまとめないでください。 ユーザーが独立した成果を 2 つ求めている場合は、カードを 2 枚作成します。例:「ブロッカーを修正し、モデルのバリエーションを確認する」は、1 件の修正タスクではありません。修正担当のエンジニアカードと、バリエーション確認を行う探索担当/調査担当カードを作成し、必要に応じて両方をレビューのゲートにします。

表現だけを理由に依存関係を付けすぎないでください。 「最後に X を確認する」とあっても、X が静的な設定、ドキュメント、またはソースの調査であれば、実装と並行して進められる場合があります。確認が実装結果に依存する場合にのみ、実装の後にリンクします。

依存関係のリンクを忘れないでください。 タスクグラフが research -> implement -> review なら、すべてのタスクを独立した ready カードとして作成しないでください。親タスクのリンクを設定し、実装やレビューが必要な入力を受け取る前に実行されないようにします。

再割り当てと新規タスクを区別してください。 レビュアーが「変更が必要」としてブロックした場合は、レビュアーのタスクからリンクした新しいタスクを作成してください。元のタスクを厳しい口調でもう一度実行しないでください。新しいタスクは、元の実装担当プロファイルに割り当てます。

リンクの引数の順序に注意してください。 kanban_link(parent_id=..., child_id=...) では、親が先です。順序を間違えると、誤ったタスクが todo に戻されます。

途中の調査結果によって形が変わるグラフ全体を、あらかじめ作成しないでください。 T3 の構成が T1 と T2 の調査結果によって変わる場合、T3 は「調査結果を統合する」タスクとして作成し、最初のステップで親タスクから引き継いだ情報を読み、以降の手順を計画するようにします。オーケストレーターが別のオーケストレーターを起動することもできます。

テナントの継承: 環境に HERMES_TENANT が設定されている場合は、子タスクが同じ名前空間にとどまるよう、すべての kanban_create 呼び出しで tenant=os.environ.get("HERMES_TENANT") を渡してください。

ゴールモードカード(永続ワーカー)

デフォルトでは、割り当てられたワーカーがカードに取り組めるのは1回限りです。作業を行い、kanban_complete/kanban_block を呼び出して終了します。1ターンではほとんど終わらない、範囲の広いカードでは、goal_mode=True を渡すと、そのワーカーを Ralph 形式のゴールループで動かせます。これは /goal スラッシュコマンドと同じエンジンです。

kanban_create(
    title="Translate the full docs site to French",
    body="Acceptance: every page translated, no English left, links intact.",
    assignee="<translator-profile>",
    goal_mode=True,        # judge re-checks the card after each turn
    goal_max_turns=15,     # optional budget (default 20)
)["task_id"]

動作の仕組み:

  • 各ワーカーターンの後、補助判定器がカードのタイトル+本文(受け入れ条件として扱われます)に照らして、ワーカーの応答を評価します。
  • 未完了で予算が残っている場合 → ワーカーは同じセッション内で作業を続けます(コンテキスト全体が保持され、新たに起動し直すわけではありません)。
  • ワーカー自身が kanban_complete/kanban_block を呼び出した場合 → ループは停止し、通常のライフサイクルに移行します。
  • 完了前に予算を使い切った場合 → カードは人によるレビューのためにブロックされます(その状態が維持され、何も通知せずに終了することはありません)。

使用する場面:長時間にわたる作業、複数ステップの作業、または「X が成立するまで続ける」カードです。使用しない場面:手間のかからない1回限りのカード(単一文字列の翻訳、簡単な検索など)です。判定器のオーバーヘッドに見合わず、一時的なワーカーの失敗にはディスパッチャーの既存の再試行/サーキットブレーカーで対処できます。

本文には明確な受け入れ条件を記述してください。判定の精度はゴールの記述に左右されます。「README を翻訳する」より、「README のすべてのセクションをフランス語に翻訳し、英語の文が残らないようにする」のほうが明確です。

停滞したワーカーの復旧

ワーカープロファイルがクラッシュを繰り返す、幻覚を起こす、または自身のミスによってブロックされる場合(通常はモデルの誤り、スキルの不足、認証情報の不備が原因です)、カンバンのダッシュボードはタスクに ⚠ バッジを表示し、ドロワーに復旧セクションを開きます。主な操作は3つあります。

  1. 回収(または hermes kanban reclaim <task_id>)— 実行中のワーカーをただちに中止し、タスクを ready にリセットします。既存のクレームの TTL は約15分です。すばやく復旧するにはこの方法を使います。
  2. 再割り当て(または hermes kanban reassign <task_id> <new-profile> --reclaim)— タスクを別のプロファイル(この環境に存在するもの)に切り替え、ディスパッチャーに新しいワーカーで処理させます。
  3. プロファイルのモデルを変更 — ダッシュボードに hermes -p <profile> model のコピー&ペースト用ヒントが表示されます。プロファイル設定はディスク上にあるため、ターミナルで編集してから「回収」を実行し、新しいモデルで再試行します。

幻覚に関する警告は、ワーカーの kanban_complete(created_cards=[...]) の申告に、存在しない、またはそのワーカープロファイルが作成していないカード ID が含まれていた場合(ゲートによって完了がブロックされます)、または自由形式の要約に解決できない t_<hex> ID が含まれていた場合(参考情報としての文章スキャンであり、ブロックはされません)に表示されます。いずれの場合も監査イベントが生成され、復旧操作後も保持されます。デバッグ用の履歴は残ります。

コメント