{
  "$schema": "https://hermes-kanban-guide.pages.dev/schema/guide.schema.json",
  "name": "Hermes Kanban Guide",
  "description": "A guide to Hermes Kanban: the durable queue that Hermes Agent profiles work out of.",
  "license": "Documentation text quoted from the hermes-agent repository.",
  "source": "https://github.com/NousResearch/hermes-agent",
  "disclaimer": "An independent guide to Hermes Agent, a product of Nous Research. Not published or endorsed by them.",
  "generatedFrom": "src/content/*.yaml",
  "screens": [
    {
      "id": "what",
      "order": 1,
      "title": "Hermes Kanban",
      "url": "https://hermes-kanban-guide.pages.dev/",
      "lede": "A durable queue your profiles work out of. You create cards; the dispatcher claims them and spawns the assigned profile as a real process. You already run Hermes. This is the part of it that behaves differently.",
      "description": "Hermes Kanban is a durable queue your agent profiles work out of. How the dispatcher claims cards and spawns workers, and how it differs from delegate_task."
    },
    {
      "id": "board",
      "order": 2,
      "title": "The board",
      "url": "https://hermes-kanban-guide.pages.dev/board",
      "lede": "Six columns. A card moves right as work happens. Swipe sideways. Open a card to read it. Nudge dispatcher runs one pass now.",
      "description": "Step a simulated Hermes Kanban board one dispatcher tick at a time. Watch a card get claimed, spawned, completed, and promote its dependents."
    },
    {
      "id": "first-board",
      "order": 3,
      "title": "Your first board",
      "url": "https://hermes-kanban-guide.pages.dev/first-board",
      "lede": "You know these commands. The order is what matters, and two steps are where boards get stuck.",
      "description": "Four commands, in order, to get a Hermes Kanban card running on your own machine, with the two steps that most often leave a board silent."
    },
    {
      "id": "situations",
      "order": 4,
      "title": "Common situations",
      "url": "https://hermes-kanban-guide.pages.dev/situations",
      "lede": "Ten shapes of real work. Find the one that looks like yours, take the command, and read the part that says when not to bother.",
      "description": "Ten shapes of real work on a Hermes Kanban board: fan out, chain, decompose, long runs, review gates, boards, lanes, and when to skip the board."
    },
    {
      "id": "practices",
      "order": 5,
      "title": "Best practices",
      "url": "https://hermes-kanban-guide.pages.dev/practices",
      "lede": "Every rule names the failure it prevents. A rule with no consequence attached is an opinion, and you can ignore those.",
      "description": "Rules for writing Hermes Kanban cards, wiring dependencies, running a board and knowing when to stop, each naming the failure it prevents."
    },
    {
      "id": "troubleshooting",
      "order": 6,
      "title": "When it breaks",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting",
      "lede": "Start from the symptom, not the topic. Nine things you might be looking at, each with one cause and one command.",
      "description": "Nine Hermes Kanban failure symptoms with their cause and the one command that diagnoses each, plus the five reasons a board sits completely still."
    },
    {
      "id": "reference",
      "order": 7,
      "title": "Reference",
      "url": "https://hermes-kanban-guide.pages.dev/reference",
      "lede": "Quoted from the repository, for when you are looking something up rather than learning it.",
      "description": "Hermes Kanban reference: the columns, the agent toolset, the CLI commands, the config defaults under kanban:, and where the board files live on disk."
    }
  ],
  "vocabulary": [
    {
      "id": "tick",
      "term": "Tick",
      "definition": "One pass of the dispatcher. Default 60 seconds. Nudge dispatcher forces one now instead of waiting for the timer.",
      "inHermes": "kanban dispatch · 60 s",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-tick"
    },
    {
      "id": "claim",
      "term": "Claim",
      "definition": "The atomic step that moves a card to running and pins it to one worker. Two dispatchers cannot claim the same card.",
      "inHermes": "claimed event",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-claim"
    },
    {
      "id": "worker",
      "term": "Worker",
      "definition": "A full OS process running the assigned profile, spawned for one card. Not a subagent: its own identity, its own memory, its own tools.",
      "inHermes": "HERMES_KANBAN_BOARD pinned in the child env",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-worker"
    },
    {
      "id": "run",
      "term": "Run",
      "definition": "One attempt. Outcome, summary, metadata, error. Retry history is the primary representation, not a latest-state field on the card.",
      "inHermes": "task_runs",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-run"
    },
    {
      "id": "worker-context",
      "term": "Worker context",
      "definition": "What the worker is handed when it calls kanban_show: the card, its own prior attempts, each parent's most recent completed summary and metadata, the comment thread, attachment paths.",
      "inHermes": "build_worker_context",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-worker-context"
    },
    {
      "id": "link",
      "term": "Link",
      "definition": "A parent to child dependency. The dispatcher promotes todo to ready once every parent is done. You do not move it yourself.",
      "inHermes": "task_links",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-link"
    },
    {
      "id": "triage",
      "term": "Triage",
      "definition": "Where a one-line idea lands. With auto-decompose on, the decomposer splits it into assigned children, at most 3 cards per tick.",
      "inHermes": "kanban.auto_decompose_per_tick: 3",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-triage"
    },
    {
      "id": "workspace",
      "term": "Workspace",
      "definition": "Where the worker works. scratch is deleted on completion; dir: must be an absolute path and is preserved; worktree is preserved.",
      "inHermes": "~/.hermes/kanban/workspaces/<id>/",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-workspace"
    },
    {
      "id": "artifacts",
      "term": "Artifacts",
      "definition": "Files the worker declares when it completes. They are copied into per-task attachment storage before the scratch directory is removed.",
      "inHermes": "kanban_complete(artifacts=[...])",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-artifacts"
    },
    {
      "id": "heartbeat",
      "term": "Heartbeat",
      "definition": "A long-running worker reporting in, so the dispatcher does not reclaim its card as a stale claim.",
      "inHermes": "dispatch_stale_timeout_seconds · 4 h",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-heartbeat"
    },
    {
      "id": "tenant",
      "term": "Tenant",
      "definition": "A soft label inside one board. Boards are the hard boundary. A worker cannot see another board, and links across boards are refused.",
      "inHermes": "--tenant auth-project",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-tenant"
    },
    {
      "id": "comment",
      "term": "Comment",
      "definition": "The inter-agent protocol. A re-spawned worker reads the whole thread as part of its context, so notes you leave are instructions.",
      "inHermes": "kanban_comment",
      "url": "https://hermes-kanban-guide.pages.dev/board#term-comment"
    }
  ],
  "situations": [
    {
      "id": "fanout",
      "shape": "Fan out · independent cards",
      "problem": "Five of the same job, and you do not want to sit through them",
      "command": "hermes kanban create \"transcribe call 4\" --assignee transcriber",
      "why": "Nothing depends on anything, so the dispatcher claims all of them as fast as your concurrency allows. Each runs in its own process. One failing does not touch the other four, and each keeps its own run history.",
      "whenToSkip": "If the five are really one job cut into five, write one card. Five cards rebuild the same context five times and you pay for it five times.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-fanout"
    },
    {
      "id": "chain",
      "shape": "Chain · parents and children",
      "problem": "Each step needs the answer from the step before it",
      "command": "hermes kanban create \"write the tests\" --assignee qa-dev --parents t_23f6",
      "why": "The child waits in Todo. When the parent completes, the dependency engine promotes it to Ready on its own, and the child worker is handed the parent summary before it starts. It does not re-derive a decision that was already made.",
      "whenToSkip": "Do not chain steps that do not truly depend on each other. A false chain turns work that could have run at once into a queue.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-chain"
    },
    {
      "id": "vague",
      "shape": "Triage · decompose",
      "problem": "You know what you want but cannot yet name the tasks",
      "command": "hermes kanban decompose t_abcd",
      "why": "A card in Triage is read by the decomposer, which writes child cards and routes each one to the closest profile you actually have. Three per pass by default, so a vague card cannot flood the board.",
      "whenToSkip": "If you can already name the tasks, name them yourself. Decomposition spends a model call to invent structure you would have written better.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-vague"
    },
    {
      "id": "long",
      "shape": "Long run · heartbeat",
      "problem": "The job runs for hours and you want to walk away",
      "command": "hermes kanban runs t_abcd",
      "why": "A worker is a real process, not a chat turn, so it can run far longer than a session. It must call kanban_heartbeat at least hourly. If it stops, the dispatcher treats the card as stale and gives it to a fresh worker rather than leaving it stuck forever.",
      "whenToSkip": "The machine has to stay awake. A sleeping laptop is the single most common reason a long card comes back as crashed.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-long"
    },
    {
      "id": "hitl",
      "shape": "Human in the loop · review",
      "problem": "Nothing ships until you have looked at it",
      "command": "hermes kanban list --status review",
      "why": "A worker that needs a decision calls kanban_block with its reason and stops. It does not guess. You read the reason, fix or answer it, and unblock. Work that needs sign-off lands in Review instead of Done.",
      "whenToSkip": "Do not gate everything. A board where every card waits for you is a to-do list with extra steps.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-hitl"
    },
    {
      "id": "recurring",
      "shape": "Scheduled · recurring",
      "problem": "The same sweep every morning that you keep forgetting",
      "command": "hermes kanban list --status scheduled",
      "why": "Scheduled is its own column, not a flavour of Todo, so waiting work is visible instead of buried. Pair it with a cron job that writes the card and the sweep stops depending on you remembering.",
      "whenToSkip": "If the sweep produces nothing you read, deleting the habit beats automating it.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-recurring"
    },
    {
      "id": "clients",
      "shape": "Boards · hard boundary",
      "problem": "Two clients whose work must never mix",
      "command": "hermes kanban boards create client-b",
      "why": "A board is a separate file, and a worker spawned on one board cannot list, read or touch a card on another. That is a boundary in the process environment, not a filter in the interface.",
      "whenToSkip": "For work that is merely different, use --tenant on one board. Tenants filter; boards isolate. Reach for the heavier tool only when a leak would actually matter.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-clients"
    },
    {
      "id": "repo",
      "shape": "Lanes · one workspace each",
      "problem": "Two agents editing the same repository",
      "command": "hermes kanban show t_abcd --json",
      "why": "Every card gets its own workspace directory, so two workers are not writing the same file at the same time. Give each lane its own git worktree and the merge is a merge, not a rescue.",
      "whenToSkip": "One agent and one branch is fine. Parallel edits to one repo need a plan for merging, and the plan is your job.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-repo"
    },
    {
      "id": "overnight",
      "shape": "Queue · notify on endings",
      "problem": "Fill the board at night, read it with coffee",
      "command": "hermes kanban notify-subscribe --kinds completed,gave_up",
      "why": "This is the pattern that turns into a habit, because the cue is stable: you already open the board in the morning. Endings arrive on Telegram, Discord or Slack, so you check a message instead of watching a screen.",
      "whenToSkip": "Subscribe to endings only. Subscribe to every event and you will mute the channel within a day, which is worse than no notifications.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-overnight"
    },
    {
      "id": "dont",
      "shape": "The honest one",
      "problem": "When not to use the board at all",
      "command": "hermes chat",
      "why": "One task, well specified, that you can check in a single pass, does not need a board. Just run it. Benchmarks keep finding a single agent matching or beating multi-agent setups on most tasks, at a fraction of the cost, and coordination overhead is real money.",
      "whenToSkip": "The board earns its keep when work is genuinely parallel, genuinely dependent, or genuinely long. Not before.",
      "url": "https://hermes-kanban-guide.pages.dev/situations#situation-dont"
    }
  ],
  "practices": [
    {
      "id": "writing",
      "group": "Writing a card",
      "rules": [
        {
          "rule": "One card, one outcome you can check.",
          "preventsFailure": "Prevents the worker declaring success on the easy half. Delegation works on tasks that are easy to verify; ambiguity is where people pull work back."
        },
        {
          "rule": "Put the acceptance test in the body.",
          "preventsFailure": "Prevents a summary that says done and gives you nothing to check it against."
        },
        {
          "rule": "Always name the assignee.",
          "preventsFailure": "A card with no assignee, or one naming a profile that does not exist, sits in Todo silently. This is the most common beginner failure on this board."
        },
        {
          "rule": "Write the boundary into the card.",
          "preventsFailure": "Prevents scope drift. Say which files, which directory, which service, and say what is out of bounds."
        },
        {
          "rule": "Summarise, do not paste.",
          "preventsFailure": "A pasted transcript is context you pay for on every step. The handoff is a summary for a reason."
        }
      ],
      "url": "https://hermes-kanban-guide.pages.dev/practices#practice-writing"
    },
    {
      "id": "wiring",
      "group": "Wiring work together",
      "rules": [
        {
          "rule": "Express order with --parents, never in prose.",
          "preventsFailure": "A sentence saying do this after the other one is invisible to the dispatcher. A parent link is enforced."
        },
        {
          "rule": "Let the engine promote cards.",
          "preventsFailure": "Moving a card out of Todo by hand can start it before its parent is done."
        },
        {
          "rule": "Keep fan-out narrow.",
          "preventsFailure": "auto_decompose_per_tick is 3. The cap exists because one vague card can otherwise fill a board with work nobody asked for."
        },
        {
          "rule": "One board per project.",
          "preventsFailure": "Cross-project cards on one board make the run history unreadable exactly when you need it."
        }
      ],
      "url": "https://hermes-kanban-guide.pages.dev/practices#practice-wiring"
    },
    {
      "id": "running",
      "group": "Running the board",
      "rules": [
        {
          "rule": "Read the runs, not the card.",
          "preventsFailure": "The card shows where work is. The run shows what happened, including the error text of every attempt."
        },
        {
          "rule": "Do not raise --max-retries to paper over an error.",
          "preventsFailure": "Two spawn_failed rows with the same message are an environment fault. Retrying a missing key three times gives you three identical failures."
        },
        {
          "rule": "Subscribe to endings only.",
          "preventsFailure": "completed, gave_up, timed_out. Everything else is a stream you will mute."
        },
        {
          "rule": "Archive finished work.",
          "preventsFailure": "Done is a record. Archived keeps the record and gives you back the screen."
        },
        {
          "rule": "Watch what it costs.",
          "preventsFailure": "Every card is a real model call in a real process. A board is a spending decision as much as a scheduling one."
        }
      ],
      "url": "https://hermes-kanban-guide.pages.dev/practices#practice-running"
    },
    {
      "id": "stopping",
      "group": "Knowing when to stop",
      "rules": [
        {
          "rule": "Try one agent first.",
          "preventsFailure": "Add a second only when the first cannot do the job. Coordination is not free and often buys very little accuracy."
        },
        {
          "rule": "Delegate what you can verify.",
          "preventsFailure": "Developers report using AI across most of their work while fully handing over only a small slice of it. Verifiability is the line, not ambition."
        },
        {
          "rule": "Keep a human on anything irreversible.",
          "preventsFailure": "Deploys, deletions, payments, anything that sends mail. Route them through Review by default."
        },
        {
          "rule": "Delete cards that stopped mattering.",
          "preventsFailure": "A board full of stale intentions stops being something you trust, and an untrusted board gets ignored."
        }
      ],
      "url": "https://hermes-kanban-guide.pages.dev/practices#practice-stopping"
    }
  ],
  "symptoms": [
    {
      "id": "nothing-moves",
      "event": "no events",
      "symptom": "Nothing moves at all",
      "cause": "The gateway is not running, so no dispatcher is sweeping the board.",
      "diagnoseWith": "hermes gateway start",
      "remedy": "Check the gateway before anything else. No gateway means no ticks, and the board looks identical to a board with no work.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-nothing-moves"
    },
    {
      "id": "stuck-in-todo",
      "event": "no runs",
      "symptom": "One card sits in Todo forever",
      "cause": "It is waiting on a parent, or its assignee is not a profile that exists.",
      "diagnoseWith": "hermes profile list",
      "remedy": "Compare the assignee on the card with that list. A typo here is silent by design.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-stuck-in-todo"
    },
    {
      "id": "gave-up",
      "event": "gave_up",
      "symptom": "Two failed attempts, then it stopped",
      "cause": "The circuit breaker tripped after failure_limit attempts, which is 2 by default.",
      "diagnoseWith": "hermes kanban runs t_abcd",
      "remedy": "Read the error on the attempts. Identical messages mean the environment is wrong, not the work.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-gave-up"
    },
    {
      "id": "crashed",
      "event": "crashed",
      "symptom": "The worker vanished mid-job",
      "cause": "The process died: out of memory, killed, or the machine slept.",
      "diagnoseWith": "hermes kanban runs t_abcd",
      "remedy": "The dispatcher reclaims the card and a fresh worker gets it, which can read why the last one died.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-crashed"
    },
    {
      "id": "stale",
      "event": "stale",
      "symptom": "A card came back after hours of silence",
      "cause": "It missed its heartbeat, so the dispatcher stopped believing the worker was alive.",
      "diagnoseWith": "hermes kanban show t_abcd",
      "remedy": "Long jobs must heartbeat at least hourly. The stale timeout is 4 hours.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-stale"
    },
    {
      "id": "blocked",
      "event": "blocked",
      "symptom": "It stopped and asked me something",
      "cause": "A worker called kanban_block on purpose rather than guessing.",
      "diagnoseWith": "hermes kanban unblock t_abcd",
      "remedy": "Answer or fix the thing it names, then unblock. It returns to Ready and a fresh worker picks it up.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-blocked"
    },
    {
      "id": "block-loop",
      "event": "block_loop_detected",
      "symptom": "It keeps blocking on the same thing",
      "cause": "The same card blocked for the same reason twice, so the board stopped the loop.",
      "diagnoseWith": "hermes kanban show t_abcd",
      "remedy": "Two identical blocks mean the card is unanswerable as written. Rewrite the card, do not unblock it again.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-block-loop"
    },
    {
      "id": "protocol-violation",
      "event": "protocol_violation",
      "symptom": "The worker did something malformed",
      "cause": "The agent produced output the board could not accept, three times.",
      "diagnoseWith": "hermes kanban runs t_abcd",
      "remedy": "Usually a profile without the kanban tools, or a model too small to follow the contract. Change the profile, not the card.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-protocol-violation"
    },
    {
      "id": "timed-out",
      "event": "timed_out",
      "symptom": "It ran out of time",
      "cause": "The card exceeded its allowed run time and was cut off.",
      "diagnoseWith": "hermes kanban runs t_abcd",
      "remedy": "Either the card is too big for one worker, or it needed to be several cards with parents.",
      "url": "https://hermes-kanban-guide.pages.dev/troubleshooting#symptom-timed-out"
    }
  ],
  "quickstart": {
    "url": "https://hermes-kanban-guide.pages.dev/first-board",
    "steps": [
      {
        "order": 0,
        "label": "You know what a tick does",
        "command": null,
        "notes": [
          "Ticks itself once you have stepped the simulated board at least once. Opening the screen does not count, and nothing here is pre-filled to flatter you."
        ]
      },
      {
        "order": 1,
        "label": "Create the board file",
        "command": "hermes kanban init",
        "notes": [
          "Creates the board's file at ~/.hermes/kanban.db. Optional, because the first kanban command you run does it for you."
        ]
      },
      {
        "order": 2,
        "label": "Open the Kanban tab",
        "command": "hermes dashboard",
        "notes": [
          "Serves http://127.0.0.1:9119. Click Kanban in the left nav. Six empty columns."
        ]
      },
      {
        "order": 3,
        "label": "Create one card",
        "command": "hermes kanban create \"summarise my inbox\" --assignee researcher",
        "notes": [
          "Use a profile name that exists. hermes profile list shows yours. A card addressed to a name that does not exist never runs, and nothing tells you why.",
          "The + button at the top of any dashboard column does the same thing."
        ]
      },
      {
        "order": 4,
        "label": "Give the dispatcher a home",
        "command": "hermes gateway start",
        "notes": [
          "The dispatcher lives inside the gateway and sweeps every 60 seconds. No gateway, no movement."
        ]
      },
      {
        "order": 5,
        "label": "Step it by hand",
        "command": null,
        "notes": [
          "Press Nudge dispatcher instead of waiting. The card goes Ready, In progress, Done. Open it to read what the agent wrote.",
          "Nothing moved? Read When it breaks. Five causes, all quick."
        ]
      }
    ],
    "allCommands": [
      "hermes kanban init",
      "hermes dashboard",
      "hermes kanban create \"summarise my inbox\" --assignee researcher",
      "hermes gateway start"
    ]
  },
  "reference": {
    "columns": {
      "heading": "Columns · who moves the card",
      "url": "https://hermes-kanban-guide.pages.dev/reference#ref-columns",
      "entries": [
        {
          "term": "triage",
          "description": "Raw ideas. In Auto mode the decomposer splits the card into child cards routed to specialist profiles, capped at 3 cards per pass."
        },
        {
          "term": "todo",
          "description": "Created, but waiting on a parent card or not assigned yet."
        },
        {
          "term": "scheduled",
          "description": "Waiting for a time-based follow-up. A first-class waiting column, not a variant of todo."
        },
        {
          "term": "ready",
          "description": "Assigned and waiting for the dispatcher to claim it."
        },
        {
          "term": "running",
          "description": "Claimed by a worker, in flight. With lanes on, this column groups by profile."
        },
        {
          "term": "blocked",
          "description": "A worker asked for human input, or the circuit breaker tripped."
        },
        {
          "term": "review",
          "description": "Waiting on a check before it counts as finished."
        },
        {
          "term": "done",
          "description": "Completed. archived exists too, behind the Show archived toggle."
        }
      ]
    },
    "tools": {
      "heading": "What the agent calls · not commands you type",
      "url": "https://hermes-kanban-guide.pages.dev/reference#ref-tools",
      "entries": [
        {
          "term": "kanban_show",
          "description": "Read my card: title, body, prior attempts, parent handoffs, comments."
        },
        {
          "term": "kanban_heartbeat",
          "description": "Still alive. Long jobs must call this at least hourly or the card is reclaimed."
        },
        {
          "term": "kanban_complete",
          "description": "Done, with a summary and structured metadata the next agent will read."
        },
        {
          "term": "kanban_block",
          "description": "Stuck, and here is why. Dependency blocks wait quietly; the rest surface to you."
        },
        {
          "term": "kanban_comment",
          "description": "Leave a durable note on the card's thread."
        },
        {
          "term": "kanban_create · kanban_link · kanban_unblock · kanban_list",
          "description": "Orchestrator side: fan work out into child cards, wire dependencies, route."
        }
      ]
    },
    "commands": {
      "heading": "Commands you type",
      "url": "https://hermes-kanban-guide.pages.dev/reference#ref-commands",
      "entries": [
        {
          "term": "hermes kanban list · show · runs · stats",
          "description": "Look at the board from a terminal. runs is the attempt history."
        },
        {
          "term": "hermes kanban watch",
          "description": "Live stream of events. Add --kinds completed,gave_up,timed_out for the endings only."
        },
        {
          "term": "hermes kanban unblock · block · complete · archive",
          "description": "Move cards by hand. Several ids at once is allowed."
        },
        {
          "term": "hermes kanban decompose · specify",
          "description": "Split a triage card into a graph of child cards, or rewrite one card into a proper spec."
        },
        {
          "term": "hermes kanban boards list · create · switch · show",
          "description": "One board per project. Workers on one board cannot see another."
        },
        {
          "term": "hermes kanban notify-subscribe",
          "description": "Get a message on Telegram, Discord or Slack when a card finishes."
        }
      ]
    },
    "config": {
      "heading": "Settings · under kanban: in config.yaml",
      "url": "https://hermes-kanban-guide.pages.dev/reference#ref-config",
      "entries": [
        {
          "term": "dispatch_in_gateway",
          "description": "true. Exactly one gateway may keep this on, or two dispatchers fight over the same claims."
        },
        {
          "term": "failure_limit",
          "description": "2. Consecutive spawn failures before the circuit breaker blocks the card."
        },
        {
          "term": "auto_decompose",
          "description": "true. Whether Triage cards are split automatically."
        },
        {
          "term": "auto_decompose_per_tick",
          "description": "3. The cap that stops one vague card flooding the board."
        },
        {
          "term": "dispatch_stale_timeout_seconds",
          "description": "4 h. How long a claim survives without a heartbeat."
        },
        {
          "term": "orchestrator_profile · default_assignee",
          "description": "unset. Both are opt-in."
        }
      ]
    },
    "paths": {
      "heading": "Where things live",
      "url": "https://hermes-kanban-guide.pages.dev/reference#ref-paths",
      "entries": [
        {
          "term": "~/.hermes/kanban.db",
          "description": "The default board. One SQLite file."
        },
        {
          "term": "~/.hermes/kanban/boards/<slug>/kanban.db",
          "description": "Any board you create later."
        },
        {
          "term": "~/.hermes/kanban/workspaces/<id>/",
          "description": "Scratch space for one card. Deleted when the card completes, except files the agent declared as artifacts."
        }
      ]
    }
  },
  "exampleBoard": [
    {
      "id": "t_0040",
      "column": "ready",
      "title": "Generate product description: SKU-1004",
      "assignee": "copywriter",
      "tenant": "content-ops",
      "priority": null,
      "dependsOn": null,
      "body": "Independent card in the same content queue.",
      "teaches": "Three profiles pulling from one board in parallel is the simplest way to use this.",
      "runs": []
    },
    {
      "id": "t_0f5a",
      "column": "todo",
      "title": "Write auth integration tests",
      "assignee": "qa-dev",
      "tenant": "auth-project",
      "priority": null,
      "dependsOn": "t_23f6",
      "body": "Cover happy path, wrong password, expired token, concurrent refresh.",
      "teaches": "Waiting on the API card. The dependency engine promotes it to Ready by itself once the parent is done. Nobody has to remember.",
      "runs": []
    },
    {
      "id": "t_23f6",
      "column": "running",
      "title": "Implement auth API endpoints",
      "assignee": "backend-dev",
      "tenant": "auth-project",
      "priority": "P2",
      "dependsOn": null,
      "body": "POST /register, POST /login, POST /refresh, POST /logout.",
      "teaches": "In flight. The attempt row exists already with no end time. If the process dies, the row is closed as crashed rather than vanishing.",
      "runs": [
        {
          "n": "1",
          "outcome": "active",
          "who": "backend-dev",
          "note": "Started, no end time yet."
        }
      ]
    },
    {
      "id": "t_28a3",
      "column": "ready",
      "title": "Review password reset PR",
      "assignee": "reviewer",
      "tenant": "auth-project",
      "priority": null,
      "dependsOn": null,
      "body": "Review the implementation of the password reset flow.",
      "teaches": "When the reviewer's agent starts, it is handed the implementer's summary and changed-file list before it looks at any code.",
      "runs": []
    },
    {
      "id": "t_5a39",
      "column": "done",
      "title": "Translate homepage to Spanish",
      "assignee": "translator",
      "tenant": "content-ops",
      "priority": null,
      "dependsOn": null,
      "body": "Translate the marketing homepage.",
      "teaches": "Finished cards keep their summary forever, which is what makes the board searchable after the fact.",
      "runs": [
        {
          "n": "1",
          "outcome": "completed",
          "who": "translator",
          "note": "translated 4 pages, style matched existing marketing voice"
        }
      ]
    },
    {
      "id": "t_6f4e",
      "column": "ready",
      "title": "Transcribe Q3 customer call #4",
      "assignee": "transcriber",
      "tenant": "content-ops",
      "priority": null,
      "dependsOn": null,
      "body": "One of five independent transcription cards for the same profile.",
      "teaches": "Assigned, nothing depends on it, so it only waits for the next pass of the dispatcher.",
      "runs": []
    },
    {
      "id": "t_9b21",
      "column": "triage",
      "title": "Write the Q4 recap post",
      "assignee": "unassigned",
      "tenant": "content-ops",
      "priority": null,
      "dependsOn": null,
      "body": "One line, no spec yet. Nobody has decided what the pieces are.",
      "teaches": "A one-line idea with no assignee. With orchestration on, the decomposer reads it, writes child cards, and routes each to the closest profile you actually have. Turn orchestration off and it sits here until you split it yourself.",
      "runs": []
    },
    {
      "id": "t_d460",
      "column": "done",
      "title": "Design auth schema",
      "assignee": "backend-dev",
      "tenant": "auth-project",
      "priority": "P2",
      "dependsOn": null,
      "body": "Design the user/session/token schema for the auth module.",
      "teaches": "This is the handoff in action. The next agent reads this summary instead of re-reading a design document.",
      "runs": [
        {
          "n": "1",
          "outcome": "completed",
          "who": "backend-dev",
          "note": "users(id, email, pw_hash), sessions(id, user_id, jti, expires_at); refresh tokens stored as sessions with type='refresh'"
        }
      ]
    },
    {
      "id": "t_ef5d",
      "column": "blocked",
      "title": "Deploy to staging (missing creds)",
      "assignee": "deploy-bot",
      "tenant": "ops",
      "priority": null,
      "dependsOn": null,
      "body": "Deploy the current build to staging.",
      "teaches": "The circuit breaker tripped. The agent never started, so there is nothing to debug in the work itself. The environment is wrong.",
      "runs": [
        {
          "n": "1",
          "outcome": "spawn_failed",
          "who": "deploy-bot",
          "note": "AWS_ACCESS_KEY_ID not set in deploy-bot env"
        },
        {
          "n": "2",
          "outcome": "spawn_failed",
          "who": "deploy-bot",
          "note": "AWS_ACCESS_KEY_ID not set in deploy-bot env"
        },
        {
          "n": "3",
          "outcome": "gave_up",
          "who": "deploy-bot",
          "note": "AWS_ACCESS_KEY_ID not set in deploy-bot env"
        }
      ]
    }
  ]
}