jpskill.com
💼 ビジネス コミュニティ 🔴 エンジニア向け 👤 エンジニア・AI開発者

💼 Kanban Worker

kanban-worker

Hermes Kanbanワーカーのライフサイクルに関する詳細なガイダンスを提供し、具体的なシナリオでの落とし穴やエッジケースを解説するSkill。

⏱ 営業メール作成 15分/通 → 1分/通

📺 まず動画で見る(YouTube)

▶ 【自動化】AIガチ勢の最新活用術6選がこれ1本で丸分かり!【ClaudeCode・AIエージェント・AI経営・Skills・MCP】 ↗

※ jpskill.com 編集部が参考用に選んだ動画です。動画の内容と Skill の挙動は厳密には一致しないことがあります。

📜 元の英語説明(参考)

Pitfalls, examples, and edge cases for Hermes Kanban workers. The lifecycle itself is auto-injected into every worker's system prompt as KANBAN_GUIDANCE (from agent/prompt_builder.py); this skill is what you load when you want deeper detail on specific scenarios.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Hermes Kanbanワーカーのライフサイクルに関する詳細なガイダンスを提供し、具体的なシナリオでの落とし穴やエッジケースを解説するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o kanban-worker.zip https://jpskill.com/download/1199.zip && unzip -o kanban-worker.zip && rm kanban-worker.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/1199.zip -OutFile "$d\kanban-worker.zip"; Expand-Archive "$d\kanban-worker.zip" -DestinationPath $d -Force; ri "$d\kanban-worker.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して kanban-worker.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → kanban-worker フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-17
取得日時
2026-05-17
同梱ファイル
1

💬 こう話しかけるだけ — サンプルプロンプト

  • Kanban Worker を使って、最小構成のサンプルコードを示して
  • Kanban Worker の主な使い方と注意点を教えて
  • Kanban Worker を既存プロジェクトに組み込む方法を教えて

これをClaude Code に貼るだけで、このSkillが自動発動します。

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Kanban Worker — 落とし穴と例

このスキルが表示されているのは、Hermes Kanban ディスパッチャーが --skills kanban-worker を指定してあなたをワーカーとして生成したためです。これは、ディスパッチされたすべてのワーカーに対して自動的にロードされます。ライフサイクル (6 ステップ: orient → work → heartbeat → block/complete) も、システムプロンプトに自動的に挿入される KANBAN_GUIDANCE ブロックに記述されています。このスキルは、より詳細な情報、つまり適切なハンドオフの形式、リトライの診断、エッジケースについて説明しています。

ワークスペースの取り扱い

ワークスペースの種類によって、$HERMES_KANBAN_WORKSPACE 内での動作が決まります。

種類 内容 作業方法
scratch 新しい一時ディレクトリ、あなた専用 自由に読み書きできます。タスクがアーカイブされると GC されます。
dir:<path> 共有永続ディレクトリ 他の実行があなたの書き込みを読み取ります。長寿命の状態として扱ってください。パスは絶対パスであることが保証されています (カーネルは相対パスを拒否します)。
worktree 解決されたパスにある Git ワークツリー .git が存在しない場合、まずメインリポジトリから git worktree add <path> <branch> を実行し、その後 cd して通常どおり作業します。ここで作業をコミットします。

テナント分離

$HERMES_TENANT が設定されている場合、タスクはテナント名前空間に属します。永続メモリを読み書きする際は、テナント間でコンテキストが漏洩しないように、メモリのエントリにテナントをプレフィックスとして付けてください。

  • 良い例: business-a: Acme is our biggest customer
  • 悪い例 (漏洩): Acme is our biggest customer

適切なサマリーとメタデータの形式

kanban_complete(summary=..., metadata=...) ハンドオフは、ダウンストリームのワーカーがあなたの作業内容を読み取る方法です。機能するパターンは次のとおりです。

コーディングタスク:

kanban_complete(
    summary="shipped rate limiter — token bucket, keys on user_id with IP fallback, 14 tests pass",
    metadata={
        "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
        "tests_run": 14,
        "tests_passed": 14,
        "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
    },
)

人間によるレビューが必要なコーディングタスク (review-required):

ほとんどのコード変更タスクでは、人間のレビュー担当者が目を通すまで、作業は真に「完了」したとは言えません。kanban_complete の代わりに kanban_block を使用し、reasonreview-required: をプレフィックスとして付けることで、ダッシュボードに行がレビューを必要としていることを表示します。kanban_block は人間が読める理由しか伝えないため、構造化されたメタデータ (変更されたファイル、テスト数、差分/PR の URL) はまずコメントにドロップしてください。コメントは永続的な注釈チャネルです。レビュー担当者は、承認して hermes kanban unblock <id> を実行するか (これにより、フォローアップのためにコメントスレッドとともにあなたが再生成されます)、別のコメントを介して変更を要求します。

import json

kanban_comment(
    body="review-required handoff:\n" + json.dumps({
        "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
        "tests_run": 14,
        "tests_passed": 14,
        "diff_path": "/path/to/worktree",  # or PR url if pushed
        "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
    }, indent=2),
)
kanban_block(
    reason="review-required: rate limiter shipped, 14/14 tests pass — needs eyes on the user_id/IP fallback choice before merging",
)

kanban_complete は、タスクが本当に最終的なものである場合にのみ使用してください。例えば、1行のタイプミス修正、機能的な影響のないドキュメント変更、または成果物自体が記述である調査タスクなどです。

調査タスク:

kanban_complete(
    summary="3 competing libraries reviewed; vLLM wins on throughput, SGLang on latency, Tensorrt-LLM on memory efficiency",
    metadata={
        "sources_read": 12,
        "recommendation": "vLLM",
        "benchmarks": {"vllm": 1.0, "sglang": 0.87, "trtllm": 0.72},
    },
)

レビュータスク:

kanban_complete(
    summary="reviewed PR #123; 2 blocking issues found (SQL injection in /search, missing CSRF on /settings)",
    metadata={
        "pr_number": 123,
        "findings": [
            {"severity": "critical", "file": "api/search.py", "line": 42, "issue": "raw SQL concat"},
            {"severity": "high", "file": "api/settings.py", "issue": "missing CSRF middleware"},
        ],
        "approved": False,
    },
)

ダウンストリームのパーサー (レビュー担当者、アグリゲーター、スケジューラー) があなたの散文を再読することなく使用できるように、metadata を整形してください。

実際に作成したカードの主張

実行によって新しい kanban タスクが生成された場合 (kanban_create 経由)、kanban_completecreated_cards に ID を渡してください。カーネルは各 ID が存在し、あなたのプロファイルによって作成されたことを検証します。存在しない ID は、何が問題だったかをリストしたエラーとともに完了をブロックし、拒否された試行はタスクのイベントログに永続的に記録されます。成功した kanban_create の戻り値から取得した ID のみをリストしてください。散文から ID を作成したり、以前の実行から ID を貼り付けたり、他のワーカーが作成したカードを主張したりしないでください。

# GOOD — 戻り値をキャプチャし、それらを主張します。
c1 = kanban_create(title="remediate SQL injection", assignee="security-worker")
c2 = kanban_create(title="fix CSRF middleware", assignee="web-worker")

kanban_complete(
    summary="Review done; spawned remediations for both findings.",
    metadata={"pr_number": 123, "approved": False},
    created_cards=[c1["task_id"], c2["task_id"]],
)
# BAD — キャプチャされた戻り値がない ID を主張します。
kanban_complete(
    summary="Created remediation cards t_a1b2c3d4, t_deadbeef",  # hallucinated
    created_cards=["t_a1b2c3d4", "t_deadbeef"],                   # → gate rejects
)

kanban_create 呼び出しが失敗した場合 (例外、toolerror)、カードは作成されていません。そのための存在しない ID を含めないでください。作成を再試行するか、ID を省略してサマリーで失敗に言及してください。散文スキャンパスは、自由形式のサマリー内の `t<hex>` 参照で解決されないものも検出します。これらは完了をブロックしませんが、ダッシュボードのタスクに助言的な警告として表示されます。

すぐに回答されるブロック理由

悪い例: "stuck" — 人間にはコンテキストがありません。

良い例: 1文で具体的な内容を記述

(原文がここで切り詰められています)

📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Kanban Worker — Pitfalls and Examples

You're seeing this skill because the Hermes Kanban dispatcher spawned you as a worker with --skills kanban-worker — it's loaded automatically for every dispatched worker. The lifecycle (6 steps: orient → work → heartbeat → block/complete) also lives in the KANBAN_GUIDANCE block that's auto-injected into your system prompt. This skill is the deeper detail: good handoff shapes, retry diagnostics, edge cases.

Workspace handling

Your workspace kind determines how you should behave inside $HERMES_KANBAN_WORKSPACE:

Kind What it is How to work
scratch Fresh tmp dir, yours alone Read/write freely; it gets GC'd when the task is archived.
dir:<path> Shared persistent directory Other runs will read what you write. Treat it like long-lived state. Path is guaranteed absolute (the kernel rejects relative paths).
worktree Git worktree at the resolved path If .git doesn't exist, run git worktree add <path> <branch> from the main repo first, then cd and work normally. Commit work here.

Tenant isolation

If $HERMES_TENANT is set, the task belongs to a tenant namespace. When reading or writing persistent memory, prefix memory entries with the tenant so context doesn't leak across tenants:

  • Good: business-a: Acme is our biggest customer
  • Bad (leaks): Acme is our biggest customer

Good summary + metadata shapes

The kanban_complete(summary=..., metadata=...) handoff is how downstream workers read what you did. Patterns that work:

Coding task:

kanban_complete(
    summary="shipped rate limiter — token bucket, keys on user_id with IP fallback, 14 tests pass",
    metadata={
        "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
        "tests_run": 14,
        "tests_passed": 14,
        "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
    },
)

Coding task that needs human review (review-required):

For most code-changing tasks, the work isn't truly done until a human reviewer has eyes on it. Block instead of complete, with reason prefixed review-required: so the dashboard surfaces the row as needing review. Drop the structured metadata (changed files, test counts, diff/PR url) into a comment first, since kanban_block only carries the human-readable reason — comments are the durable annotation channel. Reviewer either approves and runs hermes kanban unblock <id> (which re-spawns you with the comment thread for any follow-ups) or asks for changes via another comment.

import json

kanban_comment(
    body="review-required handoff:\n" + json.dumps({
        "changed_files": ["rate_limiter.py", "tests/test_rate_limiter.py"],
        "tests_run": 14,
        "tests_passed": 14,
        "diff_path": "/path/to/worktree",  # or PR url if pushed
        "decisions": ["user_id primary, IP fallback for unauthenticated requests"],
    }, indent=2),
)
kanban_block(
    reason="review-required: rate limiter shipped, 14/14 tests pass — needs eyes on the user_id/IP fallback choice before merging",
)

Use kanban_complete only when the task is genuinely terminal — e.g. a one-line typo fix, a docs change with no functional consequences, or a research task where the artifact IS the writeup itself.

Research task:

kanban_complete(
    summary="3 competing libraries reviewed; vLLM wins on throughput, SGLang on latency, Tensorrt-LLM on memory efficiency",
    metadata={
        "sources_read": 12,
        "recommendation": "vLLM",
        "benchmarks": {"vllm": 1.0, "sglang": 0.87, "trtllm": 0.72},
    },
)

Review task:

kanban_complete(
    summary="reviewed PR #123; 2 blocking issues found (SQL injection in /search, missing CSRF on /settings)",
    metadata={
        "pr_number": 123,
        "findings": [
            {"severity": "critical", "file": "api/search.py", "line": 42, "issue": "raw SQL concat"},
            {"severity": "high", "file": "api/settings.py", "issue": "missing CSRF middleware"},
        ],
        "approved": False,
    },
)

Shape metadata so downstream parsers (reviewers, aggregators, schedulers) can use it without re-reading your prose.

Claiming cards you actually created

If your run produced new kanban tasks (via kanban_create), pass the ids in created_cards on kanban_complete. The kernel verifies each id exists and was created by your profile; any phantom id blocks the completion with an error listing what went wrong, and the rejected attempt is permanently recorded on the task's event log. Only list ids you captured from a successful kanban_create return value — never invent ids from prose, never paste ids from earlier runs, never claim cards another worker created.

# GOOD — capture return values, then claim them.
c1 = kanban_create(title="remediate SQL injection", assignee="security-worker")
c2 = kanban_create(title="fix CSRF middleware", assignee="web-worker")

kanban_complete(
    summary="Review done; spawned remediations for both findings.",
    metadata={"pr_number": 123, "approved": False},
    created_cards=[c1["task_id"], c2["task_id"]],
)
# BAD — claiming ids you don't have captured return values for.
kanban_complete(
    summary="Created remediation cards t_a1b2c3d4, t_deadbeef",  # hallucinated
    created_cards=["t_a1b2c3d4", "t_deadbeef"],                   # → gate rejects
)

If a kanban_create call fails (exception, toolerror), the card was NOT created — do not include a phantom id for it. Retry the create, or omit the id and mention the failure in your summary. The prose-scan pass also catches `t<hex>` references in your free-form summary that don't resolve; these don't block the completion but show up as advisory warnings on the task in the dashboard.

Block reasons that get answered fast

Bad: "stuck" — the human has no context.

Good: one sentence naming the specific decision you need. Leave longer context as a comment instead.

kanban_comment(
    task_id=os.environ["HERMES_KANBAN_TASK"],
    body="Full context: I have user IPs from Cloudflare headers but some users are behind NATs with thousands of peers. Keying on IP alone causes false positives.",
)
kanban_block(reason="Rate limit key choice: IP (simple, NAT-unsafe) or user_id (requires auth, skips anonymous endpoints)?")

The block message is what appears in the dashboard / gateway notifier. The comment is the deeper context a human reads when they open the task.

Heartbeats worth sending

Good heartbeats name progress: "epoch 12/50, loss 0.31", "scanned 1.2M/2.4M rows", "uploaded 47/120 videos".

Bad heartbeats: "still working", empty notes, sub-second intervals. Every few minutes max; skip entirely for tasks under ~2 minutes.

Retry scenarios

If you open the task and kanban_show returns runs: [...] with one or more closed runs, you're a retry. The prior runs' outcome / summary / error tell you what didn't work. Don't repeat that path. Typical retry diagnostics:

  • outcome: "timed_out" — the previous attempt hit max_runtime_seconds. You may need to chunk the work or shorten it.
  • outcome: "crashed" — OOM or segfault. Reduce memory footprint.
  • outcome: "spawn_failed" + error: "..." — usually a profile config issue (missing credential, bad PATH). Ask the human via kanban_block instead of retrying blindly.
  • outcome: "reclaimed" + summary: "task archived..." — operator archived the task out from under the previous run; you probably shouldn't be running at all, check status carefully.
  • outcome: "blocked" — a previous attempt blocked; the unblock comment should be in the thread by now.

Do NOT

  • Call delegate_task as a substitute for kanban_create. delegate_task is for short reasoning subtasks inside YOUR run; kanban_create is for cross-agent handoffs that outlive one API loop.
  • Modify files outside $HERMES_KANBAN_WORKSPACE unless the task body says to.
  • Create follow-up tasks assigned to yourself — assign to the right specialist.
  • Complete a task you didn't actually finish. Block it instead.

Pitfalls

Task state can change between dispatch and your startup. Between when the dispatcher claimed and when your process actually booted, the task may have been blocked, reassigned, or archived. Always kanban_show first. If it reports blocked or archived, stop — you shouldn't be running.

Workspace may have stale artifacts. Especially dir: and worktree workspaces can have files from previous runs. Read the comment thread — it usually explains why you're running again and what state the workspace is in.

Don't rely on the CLI when the guidance is available. The kanban_* tools work across all terminal backends (Docker, Modal, SSH). hermes kanban <verb> from your terminal tool will fail in containerized backends because the CLI isn't installed there. When in doubt, use the tool.

CLI fallback (for scripting)

Every tool has a CLI equivalent for human operators and scripts:

  • kanban_showhermes kanban show <id> --json
  • kanban_completehermes kanban complete <id> --summary "..." --metadata '{...}'
  • kanban_blockhermes kanban block <id> "reason"
  • kanban_createhermes kanban create "title" --assignee <profile> [--parent <id>]
  • etc.

Use the tools from inside an agent; the CLI exists for the human at the terminal.