跳到主要内容

你的看板,为什么显示不出你在意的东西

· 阅读需 10 分钟
Creator of UnDercontrol

周一早上打开看板,你想知道的是哪些事情要炸了:已经逾期的、这周要交的。看板只会告诉你哪些在进行中。

你还有一堆看不到的东西。你想按客户看、按 sprint 看、按文档类型看,没有这个选项。你想把没人认领的活挑出来单独放一列,也没有。你想一列盯逾期的、一列盯本周紧急的、一列就单纯放最近动过的,混着排,做不到。真正能改的只有列的名字和顺序。

于是看板显示的是工具眼里你的工作,不是你的。你在意的那些维度,它一个都装不下。

左边是每个工具都给你的三列看板,装不下你在意的维度;右边是你一句话描述、Agent 建出来的贴合需求的看板

为什么大部分工具都这样

这不是哪一个工具的问题。你换一个,多半还是待办、进行中、已完成那三列。大部分工具长一个样,是因为它们的底层假设一致:列不是你定义的东西,它就是状态本身,写死的。 你能拖动的是一个枚举值,不是一个你说了算的视角。

工具这么做也有它的理由。灵活通常是要收学费的。一个允许列可以是任何东西的工具,往往会顺手塞给你一套查询语法、一个文档站,和一个周末。大多数人不想付这个学费,这很合理,所以工具替你做了决定:就三列,别多想。

UnDercontrol 走的是另一条路。它是一个任务和知识管理工具,日常操作可以交给终端里的 AI Agent 和一套命令行来做。放到看板上,这意味着列不再等于状态,而是一个条件:什么样的任务该出现在这儿。状态只是众多条件里的一种,它没有任何特权。你想按到期时间分、按人分、按标签分、按你自己的字段分,都行,因为对系统来说这些是同一件事。

至于那笔学费,后面会讲它是怎么免掉的。

连开箱的默认看板都不老实

这话听起来像在画饼。但你新建一个看板,默认那六列里就有两列不是状态:

这一列装什么
To Do待办的
In Progress进行中的
Done完成的
Archive归档的
Recent Created最近建的,不管什么状态
Recent Updated最近动过的,不管什么状态

最后两列没有任何筛选条件,它们只是按时间倒着排。它们不属于任何状态,它们就是一个视角。

在一个列就等于状态的工具里,这样两列很难出现。而在这里它们平平无奇,就是默认配置的一部分。

默认看板的六列,最右边的 Recent Created 和 Recent Updated 两列只按时间排序,不属于任何状态

那学费呢?

这么自由,是不是意味着我得先学一套语法,才能把想要的看板拼出来。

不用。你只要把想要的说出来。

你:给我建个看板盯截止日期,逾期的、这周的、下周的、还没定期限的,四列。

就这样。Claude Code、Codex、OpenCode,或者任何跑在终端里的 Agent,接下来的事它办。字段叫什么、条件怎么写、YAML 长什么样、命令怎么敲,这些全是它的事。

查询语法确实存在,而且很完整,但它不是你的作业。它是 Agent 的工作语言。你请人装修,不需要自己会砌墙。

好奇的话,这是它替你写的东西,你一个字都没敲过:

kind: Board
spec:
name: Deadline Radar
columns:
- name: Overdue
query: "deadline < now AND status != 'done'"
- name: This Week
query: "deadline BETWEEN now AND +7d"

看得懂当然好,看不懂也完全不影响你用。这正是重点。

而且你也不用教 Agent

通常你想让 Agent 用某个工具,得先给它写一大段说明书:怎么调、字段叫啥、格式咋样。教一遍,工具一升级,说明书就过期了,Agent 开始胡说。

UnDercontrol 的命令行自带一套配方目录。Agent 不用读源码,也不用你喂文档,它自己问一句 ud cook board,工具就把怎么建看板连同能直接跑的完整示例告诉它。它的学习过程就是敲一条命令。工具自己知道怎么用自己,所以你既不用学,也不用教。

拖一张卡进去,看板让它成真

自由度还有另一半:这些列该怎么响应拖拽,没有人需要配置它。

道理很直白。一列说了我装的是进行中的任务,那你把一张卡拖进来,意思无非是让这句话变成真的,所以状态自动就改成进行中了。另一列说我装带 blog 标签的,拖进来自动打上标签,拖出去自动摘掉。

你只说了每列装什么,怎么做是系统自己推出来的。这还带来一个不太显眼的好处:列的说明和它的行为不可能对不上,因为后者就是从前者推出来的,没有第二份配置可以走偏。

它知道什么时候不该动手

假设有一列是已经逾期的。你把一张卡拖进去,系统该把截止日期改成昨天吗?

那是瞎猜。你想要的多半根本不是这个,你可能只是随手拖错了。

所以它什么都不做。凡是没法用一次诚实的写入来满足的条件,比如时间范围、排序、模糊匹配,系统一律不编造动作。这些列于是成了纯粹用来看的视角,你拖不坏它们。

下面是真实跑出来的结果,四列的一个截止日期雷达:

  Columns:
1. Overdue
query: deadline < now AND status != 'done'
2. This Week
query: deadline BETWEEN now AND +7d
3. Recently Touched
query: ORDER BY updated_at DESC
4. Urgent
query: tags CONTAINS 'urgent'
on enter: ADD tags 'urgent' (auto)
on exit: REMOVE tags 'urgent' (auto)

前三列逾期、本周、最近动过,一个动作都没有,它们是只读的视角。第四列紧急是靠标签定义的,一次写入就能满足,所以拖进来自动打标签,拖出去自动摘掉,全是 (auto),没人配过。

系统不会编造它讲不出理由的写入。这份克制不是能力不足,恰恰是列可以是任何东西这件事能安全交到你手上的原因。

在东西真的存在之前,你先看见它

把建看板交给 Agent,最自然的担心是它理解错了怎么办,会不会把工作区搞得一团糟。

不会,因为中间有一道闸门。Agent 会先跑一次预演:系统把看板完整渲染成它将会被创建的样子,每一列装什么、拖拽会发生什么,全都摆出来,然后什么都不存。

Dry run — board would be created (nothing persisted):
Name: Blog Pipeline
Type: shared (a group "Board: Blog Pipeline" would be created for sharing)
Default tags: blog
Columns:
1. Idea
query: status = 'todo' AND tags CONTAINS 'blog'
on enter: SET status = 'todo' (auto)
on enter: ADD tags 'blog' (auto)
on exit: REMOVE tags 'blog' (auto)
2. Drafting
query: status = 'in-progress' AND tags CONTAINS 'blog'
on enter: SET status = 'in-progress' (auto)
...

注意那句 nothing persisted。这时候什么都还没发生。

于是整件事变成:你描述,Agent 预演,你看真东西,不对就说审阅那列改成待确认,它改完再演一遍,你点头,落地。

关键在于你审阅的是系统给出的结果,不是 Agent 复述它的计划。Agent 可以说错话,但它没法伪造这一步的输出。所以这件事的可信不是建立在相信 Agent 不会出错上,而是它出错也没关系,因为你先看得见。

由 Agent 建出来的截止日期雷达看板,逾期、本周、下周三列按时间窗口分组,卡片带截止日期和负责人

典型场景

讲了这么多机制,不如看看它实际长在什么地方。

周一早上的截止日期雷达

你手上同时压着七八个事情,周一早上想知道的只有一件:哪些要炸了。

跟 Agent 说一句建个看板盯截止日期,逾期、本周、下周、还没定期限,四列就位。以后每周一打开它,逾期的那列有没有东西,一眼的事。

这个看板还有个让人安心的地方:那几列都是按时间算的,拖不坏。你手滑把卡片拖进逾期,系统不会自作主张把你的截止日期改成昨天,它什么都不会做。这种列天生就是拿来看的。

团队负载视图

带团队的人都有过这个疑问:谁手上压着活,谁其实已经空了。

一个每列是一个队友的看板就解决了,末尾再加一列没人认领。站会时打开,谁的列堆成山、哪些活还悬着,不用问,看得见。

这类看板是用来看的,它把散在各处的分工摊平在一个屏幕上。真要调整谁做什么,回到任务本身去改。

内容流水线

写博客、做视频、发通告,本质上都是同一条流水线:选题、撰写、审阅、已发布。

这种看板就是拿来拖的。卡片从撰写拖到审阅,状态自动跟着变,标签自动补上,因为每列都说清楚了自己装什么,剩下的系统自己推。你只管拖,它负责让你说的话成真。

需求变了,就再说一句

用了两周,你发现少了个已归档的去处。跟 Agent 说一句加一列归档的,它拿到看板的当前完整状态,改完先演一遍给你看,你点头才落地。

在别的工具里,改看板意味着重新点一遍。在这里它就是一句话,而且改错了也不要紧,因为你在它生效之前就看见了。

建完了也还是你的

上面那句加一列归档的之所以成立,是因为看板不是一堆点击留下的痕迹,它是一份可以整个拿出来的东西。

导出、改、放回去,都行。这也是 Agent 每次改它都不用猜的原因:它拿到的是完整的当前状态,不是从界面上反推。

顺带的好处是看板能进 git、能传给同事、能复制到另一个项目。它是你的资产,不是锁在某个界面里的配置。

你的看板,你的设计,不用做作业

看板长得都一样,是因为工具替你做了那个取舍:要么简单但笨,要么强大但得学。

UnDercontrol 的答案是你负责想要什么,Agent 负责怎么做到,系统负责别让它做错。

于是那四列的截止日期雷达、按人分栏的团队视图、按你自己业务维度切分的看板,这些都不是谁提前设计好的功能,它们只是你说了一句话的结果。

想试的话,把想要的看板描述给你的 Agent 听就行。剩下的它知道怎么办。