Repository navigation
Description
Status
Requirements settled, technical design in draft. The PRD was finalized on 2026-11-06; the technical design is waiting for maintainer review. Both live in docs/features/kanban/ on the feat/kanban branch (not pushed yet). No code.
Summary
Sessions can already start each other and exchange messages (#239). Once a long task is spread over several sessions, though, the tasks, owners, dependencies and progress live only in chat transcripts. Nobody can see the state of the project without asking each session, and it is lost when sessions stop or the app restarts.
This RFC adds a persistent project board that people and agent sessions share: a fixed project PM, an optional Task Lead for complex work, plus Workers and Reviewers. The board records what to do, who owns it, how far it got and what came out. Clarifying, planning, implementing and verifying stay inside the sessions; the board is not a workflow engine.
Scope
Four capabilities:
- A persistent board. Cards can be created, split into sub-cards, linked by "must finish first" dependencies and moved between states. It survives sessions stopping and app restarts. Every branch and worktree of a project sees the same board.
- Hierarchical delegation. Each project has one fixed PM session, set only by the human. A complex card can get a Lead, who may split it further and delegate to Workers, Reviewers, or a lower Lead (default limit: two levels of Leads). Assignments take effect only after the human confirms them.
- Scoped access. The PM sees the whole project, a Lead its subtree, a Worker its own cards, a Reviewer the cards it reviews. The server enforces this.
- Agents drive progress. Agents update progress, report blockers and submit results through tools. The human views, adjusts and accepts.
Each card has three identities:
| Identity | Who |
|---|---|
| Owner | The card's Worker or Lead, at most one |
| Supervisor | The Lead of the nearest ancestor card that has one, else the PM |
| Acceptor | The human when the supervisor is the PM, otherwise the supervisor. The human can always step in |
The owner and the acceptor of a card are never the same session, and a Reviewer is never the owner. Reports go to the supervisor, not to the session's parent.
States: Backlog, Todo, In Progress, Blocked, Review, Done, Cancelled. A light permission table decides who may make each transition; starting a card also requires an effective assignment and all dependencies done. An agent submitting a result never marks a card Done. Agent suggestions for new work are Backlog cards with a "suggestion" flag, accepted or rejected by the supervisor or the human.
Non-goals
- A separate spec or requirements state machine, versioned approvals, or multi-stage review, acceptance and merge.
- Creating card worktrees or branches, integration branches, automatic merges or PRs. Branches and PRs are recorded on a card as links.
- Predicting file overlap, scheduling ready tasks, worker pools, leases, retries.
- Cost per card, a cross-project board, scheduled cards, auto-approved assignments, multiple users, cloud sync.
Proposed design
- Storage: one append-only event log per board,
~/.dreamcoder/boards/<sanitized repo root>/events.jsonl, replayed into memory by a pure reducer on first access. This matches how session metadata is already persisted as transcript entries (sessionService.ts), and the log doubles as the card history. No SQLite: nothing in the repo usesbun:sqlite, and the data fits in memory. - One board per repository. The board key is the canonical git root from
findCanonicalGitRoot(src/utils/git.ts), which resolves any worktree to its main repository. It is the same rule that gives sessions theirprojectRoot, so the sidebar's project groups and the boards line up. - The entry point decides the actor. REST calls from the app act as the human. Agent tools send control requests over their own session's SDK connection, as
StartSessiondoes, so the server knows which session is acting; the request body cannot claim an identity. - Four CLI tools:
KanbanList,KanbanGet,KanbanCreate,KanbanUpdate, backed bykanban_queryandkanban_commandcontrol requests. The server checks every command against the permission table and the invariants in one pure function. - Notifications reuse
deliverUserTurn. An effective assignment, a revoked assignment, a human comment, a submitted result and a blocker each become a user message with a neworigin.kind = 'kanban'. A stopped session is resumed to receive it; a new session gets it as its first message. Like cross-session messages, it is wrapped and marked as carrying no user authority. - UI: a board page per project, opened from the project group in the sidebar, with a card detail and a "needs me" list. It polls with
since=<version>instead of adding a WebSocket channel. Desktop and H5 share it; drag and drop is desktop only.
Open questions
- Can sub-agents call the write tools? Leaning yes: the actor is still the session.
- Should a session created for an assignment appear under its supervisor in the sidebar (a new
parent.kind = 'assigned')? Leaning yes. - Who may edit a card's title, description and dependencies? The PRD does not say. Leaning owner, supervisor and human.
- What counts as a "blocker that involves the human" and a "pending suggestion" in the "needs me" list.
Related
- feat: sessions start and message each other #239: sessions start and message each other; the board is built on it.
- RFC: Agent teams in DreamCoder #162: agent teams.
- RFC: Isolated workspaces for agent team members #166: isolated workspaces for team members.
Activity
GoDiao commentedon Nov 6, 2026
@AIR-Xie Could you take a look before we start building? The original PRD (in Chinese) is below. Two questions:
PRD:项目看板(2026-11-06 定稿)
项目看板 PRD
日期:2026-11-06,定稿。以维护者给出的精简版为骨架,补充了身份规则、状态权限、分配通知、评论和空缺的处理。补充的规则已经维护者确认。
本文是产品需求,不规定存储结构和 agent 运行时的实现,这些留给技术设计。
一、产品定位
为 DreamCoder 已有的会话协作能力,加一块持久的项目看板,让人和 agent 围绕同一份任务状态协作。
看板记录做什么、由谁负责、进展如何、结果是什么。需求澄清、规划、实现、验证和协作,由 agent 自己在会话里完成。看板不把 agent 的工作过程改造成一套强制的工作流。
一句话:固定的项目 PM,按需委派的任务 Lead,加上 Worker 和 Reviewer,共用一块持久的看板。
二、要解决的问题
DreamCoder 的会话已经能新开其他会话、互相发消息、向上级汇报。但是一件长期任务分给多个会话以后:
本功能的价值:把长期的项目事实从对话里提取出来,并持续维护。它不重新实现一套 agent 执行环境。
三、角色与协作
角色
约定
每张卡的三种身份
四、核心概念
不规定存储结构,产品上只需要这些概念:
项目卡片是长期任务的唯一可信来源。会话内部的待办清单(现有的 TaskCreate、TaskUpdate 等)仍然可以用来记录 agent 自己的执行步骤,不需要和项目卡片一一对应。
五、工作流程
A. 简单任务:PM → Worker
B. 复杂任务:PM → Lead → Worker / Reviewer
需求澄清本身是工作过程的一部分:Lead 可以在 "进行中" 的状态下不断完善卡片内容,不需要单独的需求状态、版本审批和重开流程。重要的需求变更要写成一条更新记录,并通知受影响的执行负责人。
C. agent 发现额外工作
agent 可以提出新任务或子任务的建议,并写明原因。建议的卡放在 Backlog,带 "建议" 标记。被接受之前,这张卡不能分配,也不能开始。
不新增 "提议" 状态,也不另建提议记录。
六、状态与权限
状态
谁能做哪些转换
服务端只校验最基本的身份和操作权限,不做多阶段的工作流引擎。
人在看板上拖拽卡片,可以做表中的任何操作。agent 只能通过看板工具操作,并受这张表约束。
七、首版功能需求
7.1 持久的项目看板
7.2 分层委派与权限
7.3 agent 的进度与协作
7.4 人的操作与轻量验收
八、页面与交互
首版只做一块看板、一张卡片详情和一个 "待我处理" 入口,不做完整的项目管理套件。
九、非目标
首版不做:
这些能力以后可以作为独立的增强。现有会话和 Git 能力已经产生的结果,看板只做关联,不重复实现。
十、验收标准
产品是否可用,以完整的用户旅程来验证,不看实现了多少配置项。
十一、留给技术设计
产品层面的问题都已确认。以下留给技术设计决定:
AIR-Xie commentedon Nov 8, 2026
我看了一下,觉得这个方向很有用。多个 agent 可以通过同一个看板了解任务分配、进度和结果,人也能更方便地跟进。
第一版我建议先把基本流程做好:创建任务、人确认分配、agent 执行、提交结果,然后由负责人验收。自动分配任务和自动合并代码可以先放到后续。
另外有几个地方可以再确认一下:
还有一个细节:任务的负责人不一定是创建当前 session 的 agent。提交结果时,建议按看板上的任务关系找到实际负责人,而不是只按 session 的创建关系发送。
整体上,我觉得先把分配、进度、通知和验收做稳定,会比第一版加入更多自动化功能更重要。
GoDiao commentedon Nov 8, 2026
谢谢 @AIR-Xie 的仔细阅读,这几个问题都问到了点上。
先说明一下:你看的是较早的一版 PRD。之后我们按测试里的体验又改了几轮,最大的变化是去掉了 PM、Lead 和上下级,回到普通的任务和子任务。每张卡只记三种身份:负责人(做)、审核人(审,可以没有)、创建者(建这张卡的人或会话)。权限和通知只看这三种身份,不再沿卡片树往上找上级。最新的 PRD 放在本条评论末尾。
第一版先把基本流程做稳,这一点我们完全同意。现在的范围就是建任务、分配、执行、提交、审核验收,自动调度和自动合并都不在第一版里。
逐条回答:
1. 分配后、通知送出前程序关闭。 现在重启后不会补发。分配会先写进看板,再给会话发通知,中间关掉应用的话,这条通知会丢失。这个窗口只有唤醒会话的那几秒,我们先记作已知限制,有人遇到再补:重启时把还没有送达结果的通知重新发出。送达失败的通知已经会记在卡上,人可以手动重发。
2. 换了负责人后,原来的会话再提交。 不会被当成新负责人的交付。权限只看卡上还有效的分配,被撤下的会话再提交、再更新这张卡都会被拒绝,换人时它也会收到撤销通知。
3. 任务挪到别的父任务下。 负责人、审核人、创建者都记在卡片自己身上,和父任务是谁无关,所以父任务换人或换位置都不会改动子任务的这些关系。第一版也没有提供改父任务的操作。
4. agent 能不能跳过人的确认。 这一点我们有意改了。旧版要求所有分配都经人确认,但测试里会话拆完子任务后,每次分配都要停下来等人点,流程很碎。现在是这样:
想严格把关时,不开跳过确认的模式就行。
5. 解除阻塞后回到哪,依赖的任务被取消怎么办。
6. 按看板上的任务关系找负责人,不按会话的创建关系。 已经是这样了:提交结果时通知卡上记的审核人和创建者,阻塞时通知创建者,和会话是谁开的无关。
最新 PRD(2026-11-08)
项目看板 PRD
日期:2026-11-06,定稿。以维护者给出的精简版为骨架,补充了身份规则、状态权限、分配通知、评论和空缺的处理。补充的规则已经维护者确认。
2026-11-07 修订: 去掉 PM 和上下级,回到项目管理里任务和子任务的关系。谁做、谁审、谁建都记在卡片本身上,不再沿卡片树推出上级。验收由审核人做,没有审核人时由人验收。会话在别处建卡要经人同意,这个确认跟着会话的权限模式走。
同日第二次修订: 会话做的分配也改成在会话里弹确认卡片,跟着权限模式走,不再进 "待我处理" 等人去看板确认。会话开新会话来做一张卡时,确认开会话就同时确认了它当负责人。会话为自己申请角色并入同一种分配,不再总是询问。看板上不再有待确认的分配。
2026-11-08 补: 会话把卡分配给自己开出来的子会话时不再确认,开这个会话时人已经同意过。负责人可以直接从 Backlog 开始。起因是测试里模型开新会话时没带卡,开完再分配,两个会话确认了四次;子会话又因为卡在 Backlog 开始不了,只能回头找创建者挪卡。
同日再补:审核人有自己的工作。 指定审核人时带一段审核说明,写清怎么审(比如按某份规范审代码,或者协助人做验收);没写就用默认说明。开新会话时可以直接让它当审核人。审核人接受时要写审核报告,负责人和创建者都会收到。任务处于 Review 时,看板上显示的是审核人。
同日再补:取消由创建者决定。 一张卡不需要了,由创建者判断,人可以替它决定。负责人觉得不需要时,标阻塞写明原因,由创建者处理。创建者是会话时,取消要人在会话里确认。取消时如果还有卡依赖它,或它还有没完成的子卡,系统列出这些卡,由取消的一方当场处理。
本文是产品需求,不规定存储结构和 agent 运行时的实现,这些留给技术设计。
用语(2026-11-07 补): 界面上把卡片统一叫 "任务"(英文 Task),侧栏入口叫 "项目看板"。本文中的 "卡"、"卡片"、"子卡" 在界面上分别显示为 "任务"、"任务"、"子任务",含义不变。
一、产品定位
为 DreamCoder 已有的会话协作能力,加一块持久的项目看板,让人和 agent 围绕同一份任务状态协作。
看板记录做什么、由谁负责、进展如何、结果是什么。需求澄清、规划、实现、验证和协作,由 agent 自己在会话里完成。看板不把 agent 的工作过程改造成一套强制的工作流。
一句话:一棵任务和子任务组成的树,每张卡记着负责人、审核人和创建者,人和会话共用这块持久的看板。
二、要解决的问题
DreamCoder 的会话已经能新开其他会话、互相发消息、向父会话汇报。但是一件长期任务分给多个会话以后:
本功能的价值:把长期的项目事实从对话里提取出来,并持续维护。它不重新实现一套 agent 执行环境。
三、角色与协作
角色
同一个项目里的会话都能看到整块看板。
约定
(2026-11-07 修订:去掉 PM 和上下级,原来的 Lead 和 Worker 也已合并为 "负责人"。)
每张卡的三种身份
四、核心概念
不规定存储结构,产品上只需要这些概念:
项目卡片是长期任务的唯一可信来源。会话内部的待办清单(现有的 TaskCreate、TaskUpdate 等)仍然可以用来记录 agent 自己的执行步骤,不需要和项目卡片一一对应。
五、工作流程
A. 简单任务
B. 复杂任务:负责人拆分
需求澄清本身是工作过程的一部分:负责人可以在 "进行中" 的状态下不断完善卡片内容,不需要单独的需求状态、版本审批和重开流程。重要的需求变更要写成一条更新记录,并通知受影响的子卡负责人。
C. agent 发现额外工作
agent 在自己负责或自己建的卡下面,可以直接建子卡。在别处建卡(顶层的卡,或者别人的卡下面)算作建议:会话里弹出确认卡片,显示标题和描述。
这个确认跟着会话的权限模式走:跳过确认的模式下直接建出,人也可以在卡片上选择 "本会话都允许"。建出来的卡没有负责人就不能开始,所以谁来做仍然由人决定。
不新增 "提议" 状态,看板上也不保留待决定的建议。会话做的分配也一样:在会话里确认,看板上不留待确认的分配。
六、状态与权限
状态
谁能做哪些转换
服务端只校验最基本的身份和操作权限,不做多阶段的工作流引擎。
人在看板上拖拽卡片,可以做表中的任何操作。agent 只能通过看板工具操作,并受这张表约束。会话做的分配在会话里弹确认卡片,跟着会话的权限模式走;分配给自己开出来的子会话时不弹。
七、首版功能需求
7.1 持久的项目看板
7.2 分配与权限
7.3 agent 的进度与协作
7.4 人的操作与轻量验收
八、页面与交互
首版只做一块看板、一张卡片详情和一个 "待我处理" 入口,不做完整的项目管理套件。
九、非目标
首版不做:
这些能力以后可以作为独立的增强。现有会话和 Git 能力已经产生的结果,看板只做关联,不重复实现。
十、验收标准
产品是否可用,以完整的用户旅程来验证,不看实现了多少配置项。
十一、留给技术设计
产品层面的问题都已确认。以下留给技术设计决定: