这份文档只讲一件事:
knowledge-sweet 里的任务是怎么从“写入队列”变成“被分发执行”的。
分发链路可以理解成 4 步:
- 有人或某个 agent 生成任务
- 任务被写入
DISPATCH_QUEUE.jsonl dispatch-daemon.mjs读取队列- 合法任务被投递,并在共享层留下痕迹
也就是说:
enqueue-dispatch.mjs负责“写任务”dispatch-daemon.mjs负责“读任务并投递”
作用:
- 存待处理任务
规则:
- 一行一个 JSON
- 不能写 Markdown 代码块
- 不能在 JSON 后面追加解释文字
作用:
- 记录哪些任务处理过
- 避免重复分发
作用:
- 记录谁把什么任务交给了谁
作用:
- 指定默认群
- 指定默认来源 agent
- 指定轮询间隔
最小可用任务至少应包含:
{
"id": "dispatch-001",
"createdAt": "2026-03-15T10:00:00+08:00",
"sourceAgentId": "main",
"title": "知识库归档任务",
"tasks": [
{
"agentId": "main",
"brief": "整理这段内容并写入正确目录"
}
]
}其中最关键的是:
idcreatedAtsourceAgentIdtitletasks
而 tasks 里至少要有:
agentIdbrief
一条任务会被分发,通常要满足:
- JSON 结构合法
- 不是重复任务
- 不是草稿状态
- 有可识别的
agentId - 目标群可确定
如果 groupId 没写,dispatcher 会回退到:
DISPATCHER_CONFIG.json.defaultGroupId
下面这些情况应视为“不应自动投递”:
approved: falsestatus: "draft"status: "waiting-approval"- 缺少核心字段
- 目标 agent 不存在
因为这两层解决的是不同问题。
关注的是:
- 任务被标准化
- 任务能留痕
- 任务可以排队
关注的是:
- 后台守护运行
- 自动轮询
- 防止重复投递
- 记录状态
如果把这两层混在一起,后面排错会很困难。
knowledge-sweet 的分发规则,不是让每个 agent 直接互读私有记忆。
而是要求它们把协作痕迹写到共享层。
最小共享层建议包括:
TEAM_CONTEXT.mdACTIVE_CONTEXT.jsonHANDOFF_LOG.mdDECISIONS.md
也就是说:
- 分发负责把任务送出去
- 共享层负责让后续处理者接得上
最小规则版可直接按下面执行:
- 只允许结构化任务入队
- 只允许合法 JSONL
- 只允许存在的
agentId - 默认回退到
defaultGroupId - 分发后必须留
HANDOFF_LOG.md - 不允许直接把别的 agent 的私有记忆当共享上下文
错误原因:
- dispatcher 读的是 JSONL,不是聊天记录
错误现象:
- 队列里有任务
- 但没有任何实际分发
错误现象:
- 任务会跑到错误的群,或者根本不投递
正确理解是:
- 文件存在不代表进程存在
dispatch-daemon.mjs真跑起来才算生效
如使用 AI 代做,建议加入以下约束:
- 不要把自然语言直接写进
DISPATCH_QUEUE.jsonl - 要先生成
DISPATCHER_CONFIG.json - 要验证 dispatcher 进程是否真的启动
- 要验证
HANDOFF_LOG.md或DISPATCH_STATE.json是否变化
这样既能把文件摆上去,也能理解这套分发为什么能跑。