P41 41_协作篇_Kanban任务执行演示
P41 · 41_协作篇_Kanban任务执行演示(7:51)
课时概要
协作篇 · Kanban 任务执行演示。官方仓库实现:apps/desktop/src/plugins/kanban/(看板 UI + 编排 + 完成通知)。
本分P 没有逐P 的官方简介(视频简介只有资源链接)。以下「本节要点 / 关键概念 / 代码实操」均改写自 Hermes 官方文档(Delegation 页 / Kanban 页 / Kanban tutorial / Kanban worker lanes / Kanban multi-gateway / Delegation patterns 六页)与官方仓库原文并标注来源;「我的收获」里标 本机实测 的是在本机实跑/实读得到的真实状态。
视频:41_协作篇_Kanban任务执行演示 | 时长 7:51 | P41
本节要点
- 官方快速开始五步(谁是人的活、谁是模型的活,划得很清):① 你建板
hermes kanban init② 你启 gateway(它内含 dispatcher)hermes gateway start③ 你建任务hermes kanban create "research AI funding landscape" --assignee researcher④ 你实时看活动hermes kanban watch⑤ 你看板hermes kanban list/hermes kanban stats。 · ⭐ 官方特别点明一个反直觉细节:当 dispatcher 捡起任务并 spawn 出researcherprofile 时,那个 worker 的模型做的第一件事是调kanban_show()去读它的任务 —— 它不会去跑hermes kanban show t_abcd。 - dispatcher 内嵌在 gateway 里(默认形态):默认
kanban.dispatch_in_gateway: true—— 没有东西要安装,也没有独立服务要管;gateway 活着,ready 任务就会在下一个 tick(默认 60 秒)被捡起。可在运行时用HERMES_KANBAN_DISPATCH_IN_GATEWAY=0覆盖(调试用)。 · ⚠️ 没有运行中的 gateway 时,ready任务就待在那儿直到一个 gateway 起来 —— 而hermes kanban create会在创建时就警告这一点。 - worker 与 systemd cgroup:worker 是 fire-and-forget 进程、活得比 dispatcher 的 tick 还久,所以凡 dispatcher 跑在 systemd unit 里的场景,worker 会被启动在它自己的瞬态 scope 里(
systemd-run --user --scope --unit hermes-worker-kanban-<task>-run-<run>)→ 因此它挺得过那个 unit 的退出或重启。创建这个 scope 需要一个用户 systemd 会话。 - 仪表盘(GUI)是个 bundled 插件,不是核心功能、也不是独立服务(在
plugins/kanban/):hermes kanban init一次性建库 →hermes dashboard→ 导航里在 Skills 之后出现 Kanban 标签。 - 仪表盘的能力清单(官方逐条列了,P41 的「演示」部分主要看这个):
· 每个 status 一列:
triage/todo/ready/running/blocked/done(归档开开关时多archived)。队列列按派发顺序列卡(先优先级、再最老优先 —— 最上面那张就是下一个被 spawn 的);done列是历史、最新完成的在最上。 · 卡片上显示:任务 id、标题、优先级徽章、tenant 标签、被分配的 profile、评论/链接计数、进度胶囊(有依赖时显示N/M个子任务完成)、以及「created N ago 之前创建」。每卡一个复选框可多选。 · Running 列里的 per-profile 泳道:工具条上的复选框可切换按 assignee 分组。 · ⭐ WebSocket 实时更新:插件以很短的轮询 interval tail 那张 append-only 的task_events表 → 任何 profile(CLI、gateway、或另一个仪表盘标签)一动手,板就立刻反映出来;重载做了防抖,所以一串事件爆发只触发一次重新拉取。 · 拖放卡片在列间改 status —— 放下会发PATCH /api/plugins/kanban/tasks/:id,这条路走的是 CLI 用的同一个kanban_db代码 → ⭐ 三个界面永远不会漂移。移入破坏性状态(done/archived/blocked)会要求确认。触摸设备有基于指针的降级方案,所以平板也能用。 · 建任务对话框:点任意列头的+打开模态,字段有 标题、assignee、优先级、技能、工作区类型/路径(从板项目目录预填,可按任务覆盖)、目标模式,以及(可选)从所有既有任务的下拉里选一个父任务。Enter 建任务、Shift+Enter 在标题里换行、Escape 取消。⭐ 从 Triage 列创建会自动把新任务停在 triage。 · ⭐ 多选 + 批量操作:shift/ctrl 点卡或勾选复选框加入选择 → 顶部出现批量操作条,含批量状态转换、归档、以及按 profile 下拉重新分配(或「unassign」)。破坏性批次会先确认;per-id 的部分失败会被报告而不中止其余。 · 侧抽屉(点卡不开 shift/ctrl):可编辑标题(点标题改名)、可编辑 assignee/优先级、可编辑描述(默认 markdown 渲染,带「edit」按钮切换成 textarea)、依赖编辑器(父与子的 chip 列表,各带×解链,加下拉可加新父/子;⚠️ 环尝试会被服务端拒绝并给出清晰消息)、状态动作行(→ triage / → ready / → running / block / unblock / complete / archive,破坏性转换有确认)、结果区(同样 markdown 渲染)、评论线程(回车即提交)、最近 20 条事件。 · Triage 列的两颗 LLM 按钮(见 P42):⚗ Decompose 与 ✨ Specify —— 都能从 CLI(hermes kanban decompose <id>/specify <id>/--all)、任何 gateway 平台(/kanban decompose <id>)、以及 API(POST /api/plugins/kanban/tasks/:id/decompose与…/specify)触达。 · 工具条筛选:自由文本搜索、tenant 下拉(默认取config.yaml的dashboard.kanban.default_tenant)、assignee 下拉、「显示已归档」开关、「按 profile 分泳道」开关,以及 ⭐ 一个 Nudge dispatcher 按钮 —— 这样你不用等下一个 60 秒 tick。 - 仪表盘的架构(官方明确:它没有自己的领域逻辑):GUI 严格只是一个「通过 DB 读、通过
kanban_db写」的层,没有任何属于自己的领域逻辑 —— 所以 CLI / gateway / 仪表盘三个界面不可能漂移。 - ⭐ 官方教程给了四个递进的真实剧本(
kanban-tutorial,这就是「任务执行演示」的骨架): · Story 1 — 单打独斗的开发者交付一个特性(solo dev shipping a feature) · Story 2 — 舰队式农耕(fleet farming):一批同类任务分给多个 worker 并行干 · Story 3 — 带重试的角色流水线(role pipeline with retry):按角色串成流水线,失败可重试 · Story 4 — 熔断器与崩溃恢复:看起来永久性的失败(circuit breaker)与 worker 死在半途(crash recovery) · 教程另外两节很实用:「结构化交接 —— 为什么summary与metadata要紧」,以及 「在一张已 done 的卡上跟进 —— 通过父链接做 CI 补救」;还有一节是 「检视一个正在运行的任务」。 - 在卡上跟进(教程里的 CI 补救流程):当一张卡已经
done而下游 CI 又出问题时,官方给的模式是通过父链接做补救 —— 也就是再建一张卡并把已完成的卡当父,而不是去改那张已完成的卡(保持审计轨迹不被篡改)。
关键概念
- 五步快速开始:init 板 → 启 gateway(含 dispatcher)→ create 任务 → watch 实时 → list/stats 看板。
- worker 第一动作是
kanban_show(),不是 CLI。 - dispatcher 内嵌 gateway:
dispatch_in_gateway: true(默认),无独立服务。 - worker 瞬态 scope:systemd 下 worker 跑在自己的 scope 里,挺得过 unit 重启。
- 三界面同源:CLI / gateway / 仪表盘都走同一个
kanban_db,永不漂移。 - WebSocket 实时:tail
task_events表。 - 队列列顺序 = 派发顺序(优先级 → 最老优先);
done列最新在上。 - 批量操作:批量状态转换 / 归档 / 重新分配(per-id 部分失败不中止其余)。
- Triage 两颗 LLM 按钮:⚗ Decompose 与 ✨ Specify。
- Nudge dispatcher 按钮:跳过 60 秒等待。
- 教程四剧本:单打独斗 / 舰队农耕 / 角色流水线 / 熔断与崩溃恢复。
代码 / 实操
bash
# 官方快速开始(谁干什么写得很清楚)
hermes kanban init # 1. 建板(你)
hermes gateway start # 2. 启 gateway(内含 dispatcher)
hermes kanban create "research AI funding landscape" --assignee researcher
# 3. 建任务(你,或编排 agent 用 kanban_create)
hermes kanban watch # 4. 实时看活动(你)
hermes kanban list && hermes kanban stats # 5. 看板(你)bash
# 仪表盘
hermes kanban init # 一次性:没有 kanban.db 就建一个
hermes dashboard # 导航里 Skills 之后出现 Kanban 标签bash
# 运行期命令(本机实测过的)
hermes kanban tail <task_id> # 跟着 worker 日志实时看
hermes kanban runs <task_id> # 历史尝试列表
hermes kanban show <id> # 含 tip_scratch_workspace 之类事件
hermes kanban stats # 板级统计本机实测(2026-09-25,回看那次真实执行):
task t_5949ec9d 「修复project项目页的表达」 assignee=dev status=done
created 1781574692 → started 1781574719(27 秒后被认领)→ completed 1781574975
run outcome=completed changed_files: app/(site)/projects/page.tsx, app/globals.css
task t_68fc8bb8 「更新About页面:简历内容+技术栈展示」 assignee=dev status=done
created 1781574967 → started 1781574975(8 秒后认领)→ completed 1781575133
run outcome=completed changed_files: app/(site)/about/page.tsx, app/globals.css
task t_71f76b62 「research AI funding landscape」 assignee=researcher status=done
我的收获
用户此前已学过本模块;以下是本机实测状态(2026-09-25):
- ⭐⭐ 本机 kanban 库里存着一次完整真实执行的全程(三个任务、两个 run、20 条事件),而且时间线可以逐秒还原:
t_5949ec9d从创建到被认领 27 秒(1781574692 → 1781574719)、跑了约 256 秒完成;紧接着t_68fc8bb8创建于 1781574967、8 秒后被认领、跑了约 158 秒完成 → 两次的「创建 → 认领」延迟都在一个 60 秒 tick 之内,正好印证官方「gateway 活着,ready 任务在下一个 tick 被捡起」。 - ⭐ 本机三个 task 的
assignee分别是dev与researcher—— 也就是官方那套「按 profile 名匹配 worker」的模型在本机是真的这么用的(不是抽象概念):一个开发 profile 干实现活、一个研究 profile 干调研活。而researcher那个任务(research AI funding landscape)的 run 没有出现在task_runs里(只有 2 行)→ 说明它建了卡但没被派发执行(本机当时只有dev在工作,或它被手动标了 done)。 - 📌 本机那两条 run 的改动落点极其具体:run 1 改了
app/(site)/projects/page.tsx+app/globals.css、run 2 改了app/(site)/about/page.tsx+app/globals.css—— 两份globals.css都被动过,说明这两个任务是同一条视觉一致性工作流的两半(改 projects 页布局 → 再改 about 页)。这正好能对上官方教程 Story 1「单打独斗的开发者交付一个特性」 的形态:同一批 UI 改动被拆成两张卡、由同一个devprofile 顺序做完。 - ⚠️ 本机那次执行没有一个任务走 review 阶段:事件表里 没有
review_requested/changes_requested,两个 run 都直接completed。而官方默认kanban.review_dispatch: true(会用 bundledsdlc-review技能拉起评审方)—— 也就是说本机用的是**「实现完直接 complete」的路径**,没启用同卡评审。原因看得到:那个任务的人类操作者已经在评论里把上下文和期望讲清楚了(cto那条评论指定了本地路径、要求直接在本地目录开发)。 - 📌 本机
done列的排序语义(官方说done是最新完成在上)在本机可验证:两个 run 的ended_at分别是 1781574975 与 1781575133,所以按官方顺序后完成的那张(更新 About 页)会排在前面 —— 与官方hermes kanban list --status done --sort completed-desc给的口径一致。 - 💡 本轮最实用的一条:官方给的
hermes kanban tail <task_id>(跟着 worker 实时看)与hermes kanban runs <task_id>(历史尝试列表) 正是本机现在就能用的命令 —— 那两份 20 KB / 18 KB 的 worker 日志就是它们的数据源,下次要复盘「那次到底谁改的、改了什么」不用翻会话,直接查板。
(个人感想部分待补写。)
待深入
(待填:没听懂、想回头查的。)