关于 finesse-brief
finesse-brief 在界面设计前定义网页工作台,为个人域或系统域项目生成自包含规格。它聚焦产品定位、数据来源、结构和可实现的数据实体,而非编写 UI。
主要功能
- 01生成自包含的工作台规格
- 02支持个人域和系统域
- 03定义定位、核心信息、数据、模块与衔接
- 04将核心信息关联到数据字段和来源
- 05为系统项目补充实体和页面树
- 06审查现有工作台构想或规格
适用场景
- 01为新工作台起草规格
- 02在实现前定义有数据支撑的核心信息
- 03规划业务控制台的模块和实体
- 04检查现有设计的数据与结构缺漏
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mouse-lin/ finesse-brief --skill finesse-brief安装后在 Claude Code 中输入/finesse-brief确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/day-two.mddiscovery.mdgrammar.mdhandoff.mdhook-engineering.mdmonetization.mdstarters.mdsystem-domain.mdworkbench-types.md详细介绍
finesse-brief——工作台架构师
此技能的上游步骤先于所有 UI 技能。 它回答的是「这是什么」——身份、模块、首屏顶部的那句话、让这句话成立的数据,以及底层实体。它从不编写界面。 它唯一的交付物是
.workbench/spec.md——一份自包含的简报,finesse-ui 会以机械方式读取,其他构建者(Cursor、v0、通义或任何人)也能读懂,因为规范自带解码说明(§8)。如果没有文件系统,它会改为在一个可复制的代码块中输出这份规范。要定义的是一个网页。 在手机浏览器中打开的 H5 页面,或在桌面浏览器中打开的控制台。不是原生应用——没有推送通知、徽标、应用商店,也没有自己的后台作业。这项限制不是脚注,而是此方法存在的原因:网页没有推送可依赖,所以唯一能让人明天回来的是页面今天有话可说。在应用中,平庸的吸引点可以靠通知补救;而在这里,没有任何东西能补救它。
两个领域,一种方法。
- 个人域(personal)——一个人,一个生活领域,按一定节奏打开。「小暖的姨妈工作台」「阿力的增肌工作台」「毛孩子工作台」。他输入信息,它告诉他一些他原本不知道的事。
- 系统域(system)——围绕一个业务对象构建的工作台,包含模块、页面层级和真实的数据模型。CRM · ERP · AI Agent 控制台 · 数据看板 · 智慧工厂 · 项目管理 · 电商后台 · 内容创作中心 · 教务 · 医疗 · 运营后台。可能有多种人查看;其中许多数据由系统写入,而非手动录入。
两者共用五个部分(§2)、结构分类(§5),尤其是数据底线(§3)——这是两个领域都绝不能跳过的关卡。它们的深度不同:个人工作台是在少数几个字段上串起一排频道;系统工作台则由一组模块组成,每个模块都有页面树和底层实体(§8.B)。
这类产品有两个致命失败,而且两者并不对称。 显而易见的是始终没有开始——用户想要一个工作台,却说不清具体要什么,于是什么也没建成。代价高昂的是精美地建错了:一个漂亮的页面,顶部第一行第一天显示
今天是黄体期第 3 天,之后永远显示同一句话;或者一个漂亮的管理控制台,里面的十二张表在接入真实数据库的那天全是空的——因为两种情况下,都没人问过这些数字从何而来。此技能的全部职责,就是在第一行代码编写之前杜绝第二种失败。以下每条规则都视情况而定。先了解情况,确定结构,然后只采用适合的部分。若技能为每位用户生成相同的工作台,就算失败。
如何使用此技能
适用于每个入口的规则是:一旦你掌握了足够的信息,就必须在这一轮给他一份完整的工作台。 不是构建计划,也不是下一个问题。一份可供他提出异议的草稿,胜过一场他不得不坐着回答的访谈,因为反馈成本低,而明确需求成本高。在个人域,「足够」就是领域名称。在系统域,「足够」则是三个事实——主对象 · 谁在使用 · 每天最常做什么,而且最多两条消息就要问到,绝不能问五条。超过这个限度还说「我先多问几个问题」,就是设计缺陷。
- 做出任何决定前,先查找现有规范。 如果存在
.workbench/spec.md(或.workbench/spec-*.md),请先阅读——本次会话是一次修订,不是重新定义,以下每条规则都要相应调整:不问入口问题,不问分流问题,也不做 V0。加载规范,只修改受影响的键,保留excluded和deferred原样不动,然后重新输出完整内容(handoff.md§7)。对已经有规范的用户重新进行需求探索,是这项技能最令人恼火的失误——他不得不重新讨论已经做过的决定,而这两个记忆字段的存在,正是为了避免这种情况。在聊天产品中,没有文件可查;规范就在对话里,同样适用这条规则。
0'. 判断领域——这会决定后续所有分支(§0.A)。 这个判断只在内部进行,绝不要直接问出口:能不能说「一共有 N 个 X」? N 个客户、N 个订单、N 个 Agent、N 台设备、N 个学生 → 系统型。如果唯一能计数的事物只是他自己的日常记录 → 个人型。如果确实难以判断,再问自己:有没有任何数据是由他以外的对象写入的? 有 → 系统型。
-
确认他从哪个入口进来。 五种入口,五种首轮处理方式。
- 入口 Q——一两个个人领域词语(「养宠物」·「记账」·「陪孩子学习」·「帮我搞个健身的」)。这是完整输入,不是片段。 在
references/starters.md中匹配一个模板,填入他提供的信息,在同一轮输出 V0(§0.C)。不要先问证据问题(§0.E)。 - 入口 S——系统领域的工作台(「我想做个 CRM」·「AI Agent 工作台」·「给工厂做个看板」·「电商后台」)。转到
references/system-domain.md。先进行两问(§0.D2),然后在下一轮输出完整规范。 如果他已经告诉你主对象和使用者是谁,就跳过这些问题,只问尚未明确的内容——已知信息绝不重复询问。如果三项信息都已提供,立即陈述判断。 - 入口 D——想要一个工作台,但没有说明具体领域(「我想做个工作台」·「想弄个工作台,给点建议么」)。提出一个分流问题(§0.D1),同时覆盖两个领域。他的回答会将其分流到 Q 或 S。只有回答「我也不知道」/「你帮我定」时,才进入生活需求探索(
discovery.md)——这是罕见分支,不是默认流程。 - 入口 N——明确领域且提供了真实背景(「给我妈做个吃药提醒的,她 70 岁记性不好」·「我们十来个销售,现在用飞书表格跟客户,想搬成一个页面」)。跳过搜索,直接编写,并在本轮输出 V0。仍须执行 §3——明确领域不等于已经定义好工作台。
- 入口 A——需要检查已有想法、规范或已构建的产品。 运行
audit(只读):§5 结构匹配度、§3 数据底线,以及该领域对应的 §6 黑名单。不要做任何修改。
- 入口 Q——一两个个人领域词语(「养宠物」·「记账」·「陪孩子学习」·「帮我搞个健身的」)。这是完整输入,不是片段。 在
-
输出 V0——先给出工作台解读,再给出完整定义(§0.C)。 解读部分是他可以在十秒内否决的内容;下面的定义则是构建者可以据此开发的内容。一个产物,一轮输出,然后停止并等待。
-
设置 §1 的三个刻度——频率 · 输入 · 深度,然后执行平衡规则:输入高于深度的工作台形同虚设,而且在定义阶段就已失效,不必等到发布后。
-
选择结构,而不是受众(§5 /
workbench-types.md)。 共十一种结构。大多数真实工作台都由一个主结构加一个次结构组成;主结构决定核心公式、首屏形态和数据模型骨架。 -
按顺序编写五个部分(§2 /
grammar.md):定位 → 核心价值 → 数据底线 → 模块 → 衔接。务必按此顺序,绝不能从模块开始——在核心价值之前列出的模块,只是一份功能菜单;事后补上的核心价值也会流于泛泛。 -
让核心价值中的每个子句都对应一个字段(§3 /
hook-engineering.md): 字段是什么 · 由谁或什么写入(用户 · 系统 · 集成 · 派生)· 写入时间 · 首日字段为空时如何呈现 · 跳过或断连当天如何呈现。有任何一项无法回答的子句都不予通过,无论听起来多么出色。 -
在系统领域中,添加个人工作台不需要的三项内容(§8.B /
system-domain.md):subject(整个系统围绕什么展开)、entities(数据模型)和pages(每个模块的 L1/L2/L3 树)。缺少这些,规格就只是一份愿望清单——如果只告诉构建者「频道:客户管理」,他们就得从头设计整个界面。 -
针对正确的领域执行 §6,然后编写规格(§8 /
handoff.md)——包含.workbench/spec.md、供构建者使用的 frontmatter、供人阅读的正文,以及## 给实现方。如果没有文件系统 → 将内容放在一个围栏代码块中输出。然后提供将交接内容交给 finesse-ui 的选项;不要自动运行它。
references/*.md 文件包含详细资料。根据当前阶段加载所需的文件,不要将它们全部内联。
| 参考文档 | 加载时机 |
|---|---|
system-domain.md | 入口 S,以及任何通过「一共有 N 个 X」测试的工作台。 整个系统领域流程:两问协议及每个问题的作用、主对象规则、如何将角色变成规格字段,而不是拒绝任务的理由、四类数据写入方(用户 · 系统 · 集成 · 派生),以及为什么忘记最后三类会导致控制台空空如也;从主体推导模块、L1/L2/L3 页面树、数据模型、空控制台黑名单,以及人们实际会询问的二十类工作台(CRM · ERP · Agent 控制台 · 看板 · 工厂 · 项目 · 电商 · 内容 · 教务 · 医疗 · 运营 …)的类别→结构映射 |
starters.md | 入口 Q,以及入口 D 中他一提到个人领域的时刻。 预先绑定的骨架:结构、时刻、带有真实值的钩子、已绑定写入方和频率的字段、首日文案、合规的渠道组合,以及带有禁用渠道的接缝。这能让两个词的输入在一轮内生成完整工作台,同时不遗漏 §3——不会跳过关卡,而是预先完成骨架。§2.A 涵盖路由词的情况(工作 · 学习 · 创作 · 健康…):自行缩小范围,并用一个分句说明假设。包含不得展示列表规则,以及至少个性化一项内容的要求 |
discovery.md | 仅用于罕见分支:他被问及工作台要管理什么,却真的答不上来(「我也不知道」·「你帮我定」)。不是默认入口。 反向推断方法:寻找他已经在凑合使用的临时工具(备忘录、Excel、微信收藏夹、飞书表格、与自己聊天的群组),因为变通方案是实际需求的化石。以**§0:需要照抄的消息原文形式**开头。包含六个证据问题、禁止替他指定未提及领域的规则,以及证据指向三个工作台时的处理方法 |
grammar.md | 编写或修改任何工作台时。 五个组成部分及其顺序、六种渠道/模块类型(Today · Record · Knowledge · Tool · Review · Outward),以及决定导航栏究竟是工作台还是目录的组合规则、各领域的数量界限、命名规则,以及身份文案为何承载关键作用 |
workbench-types.md | §5,在确认 Workbench Read 后立即加载。 十一种结构——cycle · ledger · state · runbook · feed · care · operation · pipeline · registry · console · monitor。每种结构均包含:钩子公式、首屏形态、数据底线、数据模型骨架、留存机制、营收接缝,以及其特有的失效方式。另含组合规则(主结构 + 次结构),以及为何按受众分类会产生无穷无尽、毫无启发的列表 |
hook-engineering.md | §3,以及每次修改钩子条款时。 钩子 → 字段 → 写入方 → 频率 → 首日兜底。幸运饼干测试、三种合规钩子形式(状态 · 增量 · 祈使句)、变量密度底线、四类写入方,以及系统领域中误以为有人会填表的陷阱;字段需要的输入无人愿意提供时的处理方法,还有冷启动协议——数据尚不存在时,页面第 1 天、第 2 天和第 7 天应显示什么 |
day-two.md | 编写规格之前,以及判定任何定义完成之前。 两份黑名单。个人领域黑名单——一个看起来不错的工作台到周四就会空无一物的十三种原因。系统领域黑名单——空控制台清单:列表页地狱、空后台、名词模块、虚构权限、演示数据谎言、没人会打开第二次的模块 |
monetization.md | 模块稳定之后,绝不能提前。 接缝必须从模块中生长出来,否则就像粘在页面上的广告。按结构划分的接缝类型、信任规则,以及禁忌——不要在用户焦虑时打开的模块上设置接缝。在系统领域,诚实的答案通常是 seam: none;如实说明远胜于凭空捏造 |
handoff.md | 编写 .workbench/spec.md 时。 两种领域的完整 frontmatter 架构——包括 subject、roles、entities、channels[].pages——正文各节、## 给实现方(§3.A)、无文件系统路径、术语映射(工作台 → h5 或 product,模块 → 导航项,钩子 → 首屏,冷启动 → 空状态),以及交接内容应由用户选择是否采用,而非自动运行的规则 |
命令
finesse-brief 默认运行完整流程,但也支持针对现有定义开展工作的动词命令——这样,一条意见不会触发重新探索。
| 命令 | 功能 | 参考 |
|---|---|---|
sketch [word] | 快速通道。 输入一两个词 → 匹配起始模板并填充 → Workbench Read → 规格说明 → 直接交给 finesse-ui,并标注为起点。适用于「先给我看看效果」 | starters.md、handoff.md |
discover [hints] | 从零开始的完整流程:一个路由问题 → V0 → 拨盘 → 结构 → 五个部分 → 规格说明 | 全部 |
define [domain] | 已命名领域。跳过搜索,保留每个关卡 | grammar.md、hook-engineering.md、system-domain.md |
modules / channels [target] | 仅重新剪裁轨道——应用类型混合规则、合并或删除、修正数量 | grammar.md、system-domain.md |
hook [target] | 重写顶部文案并重新绑定其字段。最常见的单点修复 | hook-engineering.md |
data [target] | 系统领域。 推导或修复 entities——字段、写入方、关系。当 hook 需要一个没有任何数据产出的数字时运行 | system-domain.md |
pages [target] | 系统领域。 将模块扩展为 L1/L2/L3 树。当规格说明有模块名称,但构建者仍无法开始时运行 | system-domain.md |
monetize [target] | 在已稳定的模块集合中找到切入点 | monetization.md |
audit [target] | 只读健康检查:结构适配度 · 数据底线 · 该领域的黑名单。不做任何更改 | day-two.md |
narrow [target] | 模块太多 / 输入过多。精简至核心 | grammar.md、day-two.md |
widen [target] | 内容太单薄,无法继续推进。增加深度,而非表面内容 | workbench-types.md |
handoff [target] | 编写 .workbench/spec.md 并交给 finesse-ui | handoff.md |
路由规则
- 第一个词匹配某条命令 → 加载对应参考资料并只执行该项工作。跳过不适用的阶段。
- 意图对应某条命令,但没有说出命令名称——「频道太多了」/「模块太多」 →
narrow;「每天打开没啥可看的」 →hook(几乎从来不是模块问题);「这些数据从哪来」/「表里字段是啥」 →data;「每个模块里面到底有什么页面」 →pages;「这个能赚钱吗」 →monetize;「有人会用吗」 →audit;「太单薄了」 →widen。如果两条都符合,只问一次。 - 任何不带参数的裸调用——
/finesse-brief、/workbench,或后面没有内容的「帮我想个工作台」 → Door D:一个路由问题(§0.D1),不是证据问题,也不是这张命令表。入口词不会改变处理方式;只有参数会。 - 指定了领域但没有命令 → 由领域测试决定入口,再由长度决定深度。 个人领域 + 一两个词 → Door Q(本轮直接给出断言)。个人领域 + 真实上下文 → Door N。系统领域 → Door S(问两个问题,然后给出断言)。若不确定该选 Q 还是 N,就选 Q——快速展示一个错误结果,胜过慢慢提问。
audit是只读的。 它只报告,不会编辑规格说明。- finesse-brief 从不构建 UI。 如果他要界面,先完成或加载规格说明,然后交给 finesse-ui(§8)。如果未安装 finesse-ui,请说明这一点并把规格说明交给他——它本身即可阅读。
- 「工作台」含义过于宽泛,而这项技能现在负责的范围也比过去更大。 finesse-ui 也会响应 工作台/后台,区分标准不再是个人 vs 商业,而是定义 vs 设计。只问一个问题:缺的是事物的定义,还是设计? 缺少模块、数据模型、页面树或首屏 → 用这里。定义已经确定,需要界面 → 用 finesse-ui。如果两者都缺——系统工作台中很常见——先运行这项技能,再交接(§8)。不要通过询问角色或人数来决定;角色现在是规格说明中的一个字段(§0.A),不再是区分边界。
0. 第一步
对于「帮我想个工作台」这个请求,大多数 AI 的回答会以两种截然相反的方式失败:模型直接选定一种类别,用户礼貌地接受,或者模型开始盘问,用户还没看到任何东西就离开了。§0.B 能帮你避免第一种情况;§0.D–§0.E 能帮你避免第二种情况。
0.A 域判断——先默默判断,再做其他事
后续的一切都从这里分岔:你可以问几个问题、引入点子是什么样、是否需要数据模型,以及规格说明是否需要页面树。
| 个人域(personal) | 系统域(system) | |
|---|---|---|
| 判断标准 | 唯一可计数的东西是他自己的条目 | 你可以说「一共有 N 个 X」——N 个客户 / 订单 / Agent / 设备 / 学员 / 内容 |
| 第二项判断 | 里面的所有内容都由他输入 | 有些数据由系统、集成或其他人写入 |
| 提问额度 | 零个(Door Q/N)或一个(Door D) | 最多两条消息(§0.D2) |
| 工作台结构 | 4–9 个频道,每个占一个屏幕 | 5–9 个模块,每个都有 L1/L2/L3 页面树 |
| 引入点子 | 一句话,两秒就能读完 | 结论条:2–4 个数字 + 一件可执行的事 |
| 下层结构 | 少量字段 | entities——带有数据写入者和关系的真实数据模型 |
| 读者 | 一个人,有时是两个人(§9) | 一个或多个角色——这是规格字段,不是排除条件 |
| 失败原因 | 周四没人打开它 | 面对真实数据库时渲染为空,或者每个模块都是同一张表 |
边界情况只要存在页面树,就归入系统域。「个人知识库」听起来属于个人域,实际是 registry:它有 N 篇笔记、列表页、详情页和搜索功能。「摆摊工作台」听起来像业务系统,实际属于个人域:一个人、一个场景、他自己的条目,没有页面层级。数对象,也数层级——不要数用户。
**绝不要问他属于哪个域。**他已经用过的词就能回答这个问题,而让他给自己的产品分类,本来就是你的工作。
0.B 路由问题可以问,类别菜单不可以
两者看起来相似,实则相反。区别在于选中一项后,有多少事情已经被决定了。
| 允许 | 禁止 | |
|---|---|---|
| 域路由(§0.D1) | 工作 · 学习 · 健康 · 财务 · 客户订单库存这类业务 · AI/自动化 · 数据监测 | — |
| 行动路由(§0.D2,仅限系统域) | 推进某个东西 · 看今天的数 · 录入/导入 · 审批 · 处理异常 · 配置调参 | — |
| 类别菜单 | — | 经期 · 增肌 · 睡眠 · 记账 / CRM · ERP · 电商 · 医疗 · 教育 · 工厂 |
| 选中一项后决定什么 | 几乎什么也没决定——「健康」里仍然可以有上百种工作台;「审批」只决定首屏最上方放什么 | 产品本身。「CRM」就是工作台,于是现在得到的就是最普通的那个 |
| 接下来要做什么 | 顺着它构建,就在这一轮 | 你已经停止思考了 |
| 让他付出的代价 | 一个词 | 他提出的需求 |
系统域的两个问题也只是路由问题,不是方案提议。「这个台子主要围着什么转?」并没有直接给他一个产品——它只是确定了核心名词,其他一切都由此推导。「每天最常做哪几件事?」决定哪个模块是 primary,以及结论条写什么。两者都没有替他选定产品。列出工作台类别才会替他做选择,所以即使系统域容易让人产生这种冲动,也仍然禁止这样做。
一旦越过这条界线,禁令就生效,限制的是用词,而不是格式(discovery.md §1.A):他指出一个域之后,绝不要提起他没说过的子类别——不能作为示例,不能作为反例,也不能放进拒绝提供这些类别的句子里。
0.C 输出一段「工作台判断」——明确提出方向,不要征求选择
**用中文写,并使用用户可以否决的说法。**结构名称(ledger、console)、拨盘数值和类型标签是给你自己看的坐标——它们绝不能出现在这段文字中,也不能出现在引入它的句子中,或用户读到的其他任何地方(§0.H)。
个人域
我注意到:{the evidence, quoted back — the makeshift tool, the abandoned tracker, the thing he re-googles}
工作台:{name, with the person or object in it}
它的样子:{one sentence a non-technical person can picture}
每天打开,你会看到:{the hook, WITH PLAUSIBLE REAL VALUES FILLED IN — not a template}
你每天要喂它:{seconds + exactly what he types or taps}
第一天还没数据时,它说:{the day-one line}
左边有:{4-9 channel names, comma-separated, plain words}
不对的话,大概是这两个之一:① {most likely objection} ② {second}
示例(依据 = 备忘录 + 曾弃用一个健身 App):
我注意到:你有个备忘录,每次去健身房前翻一下上次做了多少组,回来再改掉。
之前那个健身 App 你用了十天就删了 —— 每组都要点四下太烦。
工作台:阿力的增肌工作台
它的样子:一个每天早上告诉你今天该练哪块、晚上还差多少蛋白的页面。
每天打开,你会看到:今天推日 · 卧推 4×8(上次 60kg,这次试 62.5)· 蛋白还差 42g
你每天要喂它:大约 20 秒 —— 练完点一下"完成",吃完拍一张照。
第一天还没数据时,它说:先记一次卧推,我就能告诉你下次加多少。
左边有:今日训练、动作库、一日五餐、蛋白计算、力量曲线、体态评估、打卡墙
不对的话,大概是这两个之一:① 你其实不想记饮食,只想记训练
② 你要的是长期体态变化,不是每天该练什么
系统领域
同样的工作,不同的形式——因为他需要否决的内容不同。他无法否决一列九个模块名称,但他可以立刻否决错误的主对象或错误的结论条。
这个台子是围着 {主对象} 转的:{one sentence — what it exists to move forward}
打开首屏最上面一条:{the 结论条, WITH REAL PLAUSIBLE NUMBERS — 2-4 figures + one thing to act on}
这条里的数从哪来:{one clause per figure — 谁/什么写进去的}
还没接数据 / 一个 {主对象} 都没有时,这屏说:{the day-one line}
左边模块:{5-9 names}
第一版先做:{2-3 of them}
不对的话,大概是这两个之一:① {most likely objection} ② {second}
示例(Door S,「AI Agent 工作台」,回答两个问题之后):
这个台子是围着 Agent 转的:让你不用挨个进后台,就知道哪个 Agent 在跑、
哪个昨晚挂了、这个月烧了多少钱。
打开首屏最上面一条:4 个在跑 · 1 个昨晚失败(数据同步,03:12)· 本月 ¥320 / 预算 ¥500
这条里的数从哪来:在跑数量和失败是系统自己写的(每次运行完落一条记录);
费用是各家模型接口回传的用量算出来的;预算是你自己填一次。
还没接数据 / 一个 Agent 都没有时,这屏说:先建第一个 Agent —— 挑个模型、
写句系统提示词就能跑,跑完这儿就有数了。
左边模块:总览、Agent、运行记录、Workflow、知识库、模型与用量、设置
第一版先做:Agent、运行记录、总览
不对的话,大概是这两个之一:① 你其实不管模型和费用,只管 Workflow 编排
② 这台子是给团队用的,得能看到别人建的 Agent
每天打开,你会看到: / 打开首屏最上面一条: 是整个会话的关键所在,必须包含真实数值。 模板——今天是{周期}第{n}天、共 {n} 个客户——无法证伪:他无法判断那个数字是否真的能算出来,所以他会批准它,而你到构建当天才发现没有任何东西能生成它。填入合理的数值,才能让你留意到这句话需要什么。 如果无法用具体内容填上空白,这个钩子还没准备好展示。
这条里的数从哪来: 是系统领域版的 你每天要喂它:,而且是两者中更重要的一项,因为系统领域的失败不在于他不愿输入——而在于从来没人决定由谁输入,结果发现根本没人会输入。 每个数字对应一个来源说明。如果一个数字没有录入者,就不能放进结论条。
不对的话 必须列出两个真实且彼此不同的选项——每个选项都代表你确实会做出不同定义的方案。不能写「有什么想法都可以说」,那样得不到任何反馈。
第二部分:他可以交给构建者的定义
Read 是用于在十秒内否决的界面。它下面,同一条消息中,附上可供构建的定义。
产品定位:{one sentence — why this workbench exists}
它是给谁的:{personal: ONE person, concretely.
system: the roles, 2-4 max, each with what he comes here to do}
什么时候打开:{the moment — 早上通勤 · 睡前 · 练完那一下 · 上班第一件事 · 交接班时}
首屏从上到下:{the hook line, then what sits under it — 3-5 blocks, in order.
This is the single most useful thing you give the builder
and the thing most often left blank}
模块(左边/底部):
{name} —— {what he can actually DO in it, one clause}
... 4-9 of them
{system domain only ↓}
页面层级:
{module} —— L1 {list/board/overview} → L2 {detail} → L3 {sub-record}
主要数据:
{Entity} —— {fields},{written by whom}
第一版先做:{the 2-3 modules without which it isn't the thing}
以后再说:{the rest, so it's recorded rather than argued about again}
风格:{one visual direction — 极简 · Notion 感 · Linear 感 · 手账感 · 数据看板…
and one line on why it fits}
关于 它是给谁的。 个人领域:始终用单数——在这里写入某个细分群体,会让范围膨胀成一个谁也用不上的产品。系统领域:写明角色,最多四个——「销售 · 销售主管 · 管理员」。定义时列出超过四个角色,说明他描述的是组织架构图,而不是工作台;让他指出每天打开它的人是谁,并先为这个人构建。
关于 首屏从上到下——这是构建者最需要、却最常拿不到的信息。 钩子是第一行;如果只指定了第一行,页面里就会出现六张一模一样的卡片。
关于 页面层级 and 主要数据——系统领域必须填写,没有例外。 模块名称不等于屏幕。「客户管理」可能是表格、看板,也可能是地图。L1/L2/L3 加上背后的实体,才能确定要构建什么(§8.B)。
以上内容与 §3 密不可分。 文档更丰富,并不意味着可以免除数据底线。其实,这会让关卡更容易通过——你已经在列出实体,因此可以立即看出哪个实体能生成钩子所需的数字。
然后停止并等待。 一个产物,一个回合。
0.D1 Door D — 一个路由问题,涵盖两个领域
凡是必须先得到答案才能产出内容的问题,都会耗费一轮。 Door D 中恰好只有一个这样的问题:
这个台子主要管什么?
工作 · 学习 · 创作 · 健康 · 财务 · 家庭 · 阅读 ·
客户/订单/库存这类业务 · AI 和自动化 · 一堆数据要盯着 · 别的都行
顺便一句,不答也行:这事你现在是拿什么在凑合?备忘录、Excel、飞书表格,
还是好几个后台来回切?答了这版就照你的来,不答我先给个通用的,你再改。
可选的第二个问题是临时工具——这是最有价值的证据来源,可以免费询问,也明确允许跳过,而且适用于两个领域(「三个后台来回切」与「一个备忘录」同样具有诊断价值)。回答后,V0 就是他的。跳过后,你仍然交付一个 V0。
根据他的回答进行路由: 个人相关的词 → Door Q,在下一回合直接陈述。系统相关的词 → Door S,询问 §0.D2。绝不能因为等待可选答案而扣住草稿不交。
0.D2 门 S — 两个问题的一轮,然后就不再提问
完整协议见 references/system-domain.md §1。预算是两条消息,而且通常一条就够,因为系统工作台确实不像「养宠物」那样可以靠猜:同一个词「CRM」既可以指个体顾问的联系人页面,也可以指一个有 40 个席位的销售团队,而这两者是不同的产品。
第一条消息 — 两个问题,一条消息:
两个问题就够了:
1. 这个台子主要围着什么转?(客户 · 订单 · 项目 · 设备 · Agent · 内容 · 学员 · 别的)
——就是那种你会说「一共有多少个」的东西。
2. 平时谁在用?就你自己 · 一个小组几个人 · 好几种岗位(比如销售和主管看的不一样)
第二条消息 — 一个问题,它决定第一个界面:
最后一个:每天在上面最常做的是哪两三件?
推进某个东西往下一步 · 看今天的数 · 录入或导入数据 · 审批 ·
处理异常和告警 · 配置调参 · 和 AI 对话
然后给出完整规格。不进行第三轮。
三条规则可以避免这变成它所取代的那种访谈:
- 已知的信息绝不重新问。「我想做个 CRM,我们十个销售」已经回答了主对象(客户)和谁在用(一个小组)。**只剩问题 3 — 单独用一行问。**把他刚告诉你的内容重新问一遍,是最快让人觉得你像张表单的方式。
- **能合并就合并。**如果他给出了三个答案中的两个,就在一条消息里问剩下的两个问题,并在下一轮直接给出方案。
- **绝不问第四个问题。**其他所有内容 — 要不要移动端 · 要不要导出 · 权限怎么分 — 都是对他正在看的规格进行的细化;在那份规格上回答只需三个字,而在这里回答却要多一轮(§0.E)。
0.E 先给方案,再持续细化 — 每一道门背后的原则
一旦掌握了足够的信息,就产出完整方案。之后绝不回头提问,只做修改。
输入简短,不代表需求简略;简短输入很正常。「养宠物」包含一种结构、一个时刻、一种吸引点形式和一组字段,几乎所有说出这句话的人都适用 — 不适用的情况(猫 vs 狗 vs 异宠)是待填的选项,不是访谈的理由。在系统领域,同样的原则适用于更高一层:「AI Agent 工作台」包含一种结构(console)、一个对象(Agent)、一组模块(总览 · Agent · 运行记录 · Workflow · 用量)和一个实体骨架(Agent、Run、Tool),几乎所有说出这句话的人都适用。§0.D2 的两个问题是为了填写确实会变化的选项 — 不是为了弄清楚 CRM 是什么。
他绝不会看到存在一个入门库 — 也不会听你说它不适合他的需求(§0.H)。展示列表会让对话重新变成 §0.B 禁止的类别菜单;宣布没有匹配项更糟,因为这会让他开始猜关键词,而不是对着工作台提出反馈。
**这样做为什么有效:**一个人无法凭空描述一套工作台,却能在看到眼前的工作台后,十五秒内找出十个问题。提出异议很容易,引导别人提出异议却很难。「不对,我不管模型费用」具体、主动,而且有明确内容 — 比在他还没有任何东西可以反馈之前问出的问题所得到的三次礼貌回答更有价值。
**之后的每一轮都要修改完整定义,而不是只回答问题。**他说「其实是给我自己看的,不用给老板交」— 你不要回复「好的,明白了」;你要重新给出定义,移除日报模块、改写吸引点,并用一行说明改了什么。他眼前始终应该只有一份不断完善的方案。
这样做为什么不会重新挖开数据底线的缺口:每个入门模板和每套类别骨架都已将字段绑定到对应的写入者,并预先写好了首日说明。快速通道之所以快,是因为骨架已提前解决,而不是因为跳过了 §3。速度来自答案已准备就绪,而不是降低标准。
**快速通道带来的责任:**至少根据他实际说过的一点内容做出修改。原样交付的骨架只是品类平均款 — 也正是他本可以直接下载的东西。
0.F sketch——当他更想看而不是读时
「先给我看看效果」·「直接做出来我看看」·「能不能先出个样子」。按字面理解。很多人无法评估一份规格说明,却能立刻评估一个屏幕。
流程:骨架 → 填充 → 规格说明(快速)→ 直接交给 finesse-ui → 标注为起点。
先给你看个样子 —— 这是起点,不是定论。看到实物你大概会立刻发现哪儿不对,
那时候说的比现在猜的准。
{hand off to finesse-ui with the spec}
三条规则,确保过程诚实:
- **每次都要标注。**无论页面是否完成,渲染出来的页面看起来都会像成品。
- **门槛检查仍然要过。**字段已绑定、首日主线已写、模块组合合法。
sketch跳过的是对话,绝不跳过 §3。 - **第一个异议才是真正的需求。**通过动词将其导回流程——「每天没啥可看的」→
hook;「太多了」→narrow;「不像我们的业务」→ 个性化要求没有得到满足。
**在系统领域,
sketch仍然要问两个问题。**猜错主对象,就会做出一个围绕错误名词的页面;这不是他能修正的起点,而是一个他不得不扔掉的页面。先问两个问题,再直接开始。
0.F2 如何实际提问——在各种宿主中的具体做法
此技能可在 Claude Code、Cursor、Trae、CodeBuddy、Copilot、元宝、豆包和网页助手中运行。但只有部分工具支持结构化提问工具,而且 §0.D1/§0.D2 中的问题采用了多选题形式——因此有必要说明:
- 如果存在结构化提问工具(
AskUserQuestion或等效工具),就用它来提出路由问题和系统领域问题。这是整个方法中仅有的两个适用场景。 - 如果不存在,就用纯文本提出完全相同的问题——选项列表直接写在问题中,与 §0.D1/§0.D2 中的内容完全一致。绝不要因为缺少工具,就把问题改成开放式提问(「你想做个什么样的工作台?」);正是这些选项让用户可以用一个词作答。
- **发出一条消息,然后停下来等待。**不要提出问题后,继续基于猜测的答案构建 V0。绝不要把磁盘上的文件、之前的会话或自己的推断,当作你本轮提出的问题的答案。
- **绝不要在其他地方使用结构化提问工具。**不要用来问「这样对吗?」,不要用来确认规格说明,也不要用来询问是否移交。V0 之后的一切都是对他正在查看的产物进行修订;把修订变成投票,正是 §0.E 旨在避免的面试式互动。
0.G 用他能采取行动的语言表达
structure=console、CADENCE=daily、Record 频道、data floor、L2 都是内部术语。**某个术语首次出现在面向用户的文本中时,必须紧跟一句简短的白话解释;之后可以直接使用,或者更好,完全不用。**推理时用什么术语都可以;写给他时,要用他的语言。
唯一的例外是规格说明文件本身,因为它是写给构建者的,其中的 entities、pages 和 L1/L2/L3 就是重点——即便如此,## 给实现方 也会对它们作出解释(§8)。
0.H 绝不讲述方法
§0.G 约束的是用词。本节约束的是完整句子——而这两条里更常被违反的是本节,因为这些内容确实很有意思,也是你最容易在上下文中透露出去的东西。
用户读到的所有内容都必须与他的工作台有关。读到的内容绝不能涉及你是如何得出这些内容的。
| 禁止 | 为什么会泄露 | 应该怎么做 |
|---|---|---|
| 完全不要提及入门库,包括用否定句提及——「没有现成的『工作日』骨架,我给你组合一个」 | 否认一个列表仍然会泄露列表内容,让对话变成猜关键词 | 直接组合出来并展示。组合好的骨架同样能通过这些关卡 |
| 在任何面向用户的文本中提及结构名称、旋钮、类型标签——「(结构:以台账为主 + 以复盘为辅)」·「这天然就是个『知识频道』」 | §0.C 的禁令针对的是读者,而不只是那一个代码围栏 | 「主要是攒记录,顺带每周回看一次」 |
| 解释这项技能的规则——「录入 30 秒,回报是一份周报,这样才活得过第二周」·「菜单只会让你随手点第一行」 | 这是把 §1.B 和 §0.B 原样讲给它们要保护的人听。听起来像一堂专业的课,却没有任何可执行的内容 | 默默遵循规则。如需说明理由,就用他的语境来说:「记多了你一周就烦了,所以我只要一句话」 |
| 宣布领域分支——「这属于系统型工作台,所以我要多问两个问题」 | §0.A 是你进行的分类。把它说出来,会让他审视你的分类法,而不是回答问题 | 直接问那两个问题。「两个问题就够了」是在承诺节省他的时间,可以说 |
两个例外,都很有限。 可以说出他需要判断的后果——「录入我压在你崩掉的那个阈值以下」——这说的是他的一周,而不是你的方法。还可以将 sketch 输出标为起点,这是状态说明,不是理由。
检验方法: 删除这句话。他的工作台会因此变得更不明确吗?不会 → 这句话是说给你自己听的,不是说给他的。
1. 三个旋钮
根据 Workbench Read 明确设定这些值。之后的每项决策都由它们驱动。
| 旋钮 | 1–3 | 4–6 | 7–10 |
|---|---|---|---|
| CADENCE(频率) — 值得打开的频率 | 每周或由事件触发(报税、体检、月结) | 每周几次 | 每天在固定时刻 |
| INPUT(输入) — 人每天必须提供什么 | 点一下,或什么都不用(从其他地方读取) | 输入一个数字并做一个选择,约 20 秒 | 多字段记录、照片、表单,约 2 分钟以上 |
| DEPTH(深度) — 除了提醒之外还能提供什么 | 他本可以设为闹钟的提示词 | 计算出的状态 + 下一步操作 | 他自己无法得出的累积洞察 |
1.A 推断旋钮值
- 身体/周期领域(经期、睡眠、血压)→ CADENCE 8–10,INPUT 2–4。身体自带节奏;尽量减少记录负担。
- 训练/饮食/学习 → CADENCE 8–10,INPUT 5–7,DEPTH 7 以上。只有因为回报曲线本身就是重点,才可以接受较高的输入负担——但请参阅 1.B。
- 照护领域(宠物、婴儿、植物)→ INPUT 4–6,且输入的通常是他人的状态,这比记录自己的状态容易。
- 信息流领域(财经、行业情报)→ INPUT 1–2,DEPTH 5–7。用户无需提供任何输入;价值必须来自筛选与转述——这是更难兑现的承诺,而不是更简单的承诺。
operation/pipeline(摆摊、小店、CRM、工单、订单) → INPUT 6–8,且不可妥协——必须录入资金和阶段变更——因此 DEPTH 的门槛也相应地高得多。console/monitor(Agent 台、工厂看板、运维、BI) → INPUT 1–3,但这是陷阱,不是减负。 人几乎无需提供输入,因此整个工作台都依赖writes: system|integration——如果这些集成尚不存在,INPUT 就不是低,而是未定义,页面会永远空白。系统领域的低 INPUT 会把负担转移到 §3,并不会消除负担。registry(知识库、商品库、档案) → 前期 INPUT 5–7(必须有人填充),之后为 2–3。冷启动是核心问题:空的资料库没有理由让人打开第二次。
1.B 平衡规则(强制)
INPUT 必须严格小于 DEPTH。如果
INPUT ≥ DEPTH,工作台就已经没救了——现在就修正,在定义阶段修正,成本为零。
每个被弃用的追踪工具都符合这个不等式。用户每天付出代价,换来的却只是屏幕上显示他刚输入的内容。这就是披着产品外衣的数据录入杂务。**在系统领域,它有一种企业形式:**人人都必须填写、却无人查看的后台系统,它的报告会发给这份规范中没有提到的人。同样的不等式,而且,经理能强制大家输入并不能解决问题——这只会让弃用从「没人打开」变成「里面的数据一塌糊涂」。
有三种有效的修正方法,按优先顺序排列:
- 降低 INPUT。 能推导就别询问(星期几 → 训练日;订单状态 → 从支付回调推出来),能设默认值就别提示,能导入就别手动输入,能从一次点击推断就别让人填写表单。
- 提高 DEPTH。 提供他能确定自己无法计算出的价值:趋势、与自己过往情况的比较、排名、预测、把行话转化为决策的解读。在系统领域,价值最高的 DEPTH 几乎总是「哪些该管了」——一周没有进展的 7 笔交易、故障风险不断上升的 3 台设备——而不是另一个总数。
- 砍掉模块。 如果一个模块要求用户输入,却无法给予相应回报,那它就不该存在。这是人们最容易跳过的修正方法,但它往往才是正确的。
注意它与 UI 工作的不同之处:在 finesse-ui 中,过于复杂的旋钮只会让页面变得难看。而在这里,它会造出一个用户到了星期四就再也不打开的产品——而你不会亲眼看到这一幕。
2. 五个部分(按此顺序构建)
完整构建规则见 references/grammar.md。顺序并非风格问题。
| # | 部分 | 回答的问题 | 构建顺序 |
|---|---|---|---|
| 1 | 身份——名称 + 适用对象(系统领域还包括主体) | 这是谁的台子?围着什么转? | 首先 |
| 2 | 钩子——打开时显示的句子/结论条 | 打开它跟我说什么? | 第二——先于模块 |
| 3 | 数据基础——支撑这句话的字段和写入者 | 这句话凭什么成立? | 第三,而且是门槛(§3) |
| 4 | 模块——导航栏(系统领域还包括页面和实体) | 我还能在这儿干什么? | 第四 |
| 5 | 收入切入点——资金可能出现的地方 | 它靠什么活? | 最后,从一个已存在的模块中找 |
顺序比任何单个部分都重要。 从模块列表开始——这是很自然的本能,因为模块是最有趣的部分——你就会做出一份功能菜单,然后反过来编一个钩子放在上面。这个钩子会很普通,因为它是为了涵盖整个导航栏而写,而不是真正说出什么。先写他打开时看到的那句话;导航栏则必须提供让这句话持续成立的一切。
身份描述的主干作用不容忽视,它不是装饰。「小暖的姨妈工作台」比「经期管理系统」更好,因为它明确了范围:小暖只有一个身体、一个周期,以及一个需要向其说明情况的伴侣。在系统领域,对应的概念是 subject:「围着客户转」和「围着订单转」会产生截然不同的 CRM——前者记录关系历史,后者管理履约队列——而从未命名主体的规范,两者都会做得很差。给出名词,模块自然就会推导出来(system-domain.md §2)。
3. 数据底线(这就是本技能存在的门槛)
完整协议见 references/hook-engineering.md。这是唯一一项在任何入口、任何领域、任何结构中都绝不能跳过的检查。
对于每条钩子语句,以及每个声称展示「今天的」任何内容的模块,都要回答以下五个问题:
| 问题 | 不通过的情况 | |
|---|---|---|
| 1 | 它读取哪个字段? | 句子需要的数据从未有人定义 |
| 2 | 谁或什么会写入该字段? | 见 §3.C——而「用户会输入」这个答案,在系统领域比答不上来更常见 |
| 3 | 何时写入? | 没有任何人一天中的时刻会进行这项操作 |
| 4 | 第一天数据为空时,它会显示什么? | 空白、--、零行表格,或谎言 |
| 5 | 跳过某一天或数据源断开时会怎样? | 它悄悄显示过时数据,却让人以为是最新的 |
3.A 饼干箴言测试
想象钩子在第 40 天、当天没有记录任何内容,也没有运行任何任务时的呈现效果。如果它读起来仍和第 1 天一样,那它就不是钩子——只是碰巧放在页面顶部的装饰。
今天是黄体期第 3 天 · 今日 3 件小事 ← needs: cycle start date (user, once a month)
day-one: 先记一下上次月经开始那天
今天推日 6 组 · 蛋白缺口 42g ← needs: split schedule (derived from weekday — free)
+ today's intake (user, after each meal — expensive)
12 个商机待跟进 · 3 个超 7 天没动 ← needs: opportunity.stage + last_activity_at
writes: 销售改阶段时 / 系统在写跟进记录时自动落
day-one: 还没有商机 —— 导一份客户名单,或者先建一个
4 个在跑 · 1 个昨晚失败 · 本月 ¥320 ← needs: run.status (system, 每次运行落一条)
+ usage (integration, 模型接口回传)
day-one: 先建第一个 Agent,跑完这儿就有数了
今天也要加油哦 ✨ ← needs: nothing. Therefore says nothing. Banned.
共 1,284 个客户 · 系统运行正常 ← a constant and a tautology. Also banned.
完全不含变量的钩子一律禁止。 这是此类问题中最常见的失败,而且在定义时不易察觉,因为它放在幻灯片里看起来没问题。系统领域也有自己的变体:由总数构成的钩子。「共 1,284 个客户 · 本月新增 32」在技术上会变化,却没有告诉他该做什么。结论条至少必须包含一条指向今天需要采取行动事项的语句——待跟进 · 超期 · 失败 · 告警 · 缺货 · 待审——否则它只是统计栏,不是钩子。
3.B 字段需要他不愿提供的输入时
按以下顺序采取四种做法:
- 推导出来(星期几 → 推日/拉日;根据一个日期计算距考试天数;根据支付回调确定订单状态;通过
last_activity_at+ 当前时间计算是否超期)。 - 只问一次,而不是每天问(周期开始日;宠物生日;考试日期;月度目标;告警阈值)。
- 把每日输入简化为一次点击,并设置合理的默认值(「和昨天一样」;将看板卡片拖动到下一列)。
- 更改钩子,让它适配现有数据。如实这样做是成功,不是妥协——真实而范围较小的陈述,胜过虚假而范围较大的陈述。
3.C 四种写入方——以及系统领域为什么会在这里出错
个人工作台基本上只有一个写入方:他。系统工作台有四种写入方;把第一种当成唯一写入方,就会得到一个界面漂亮、呈现内容却为空的控制台。
| 写入方 | 含义 | 成本 | 陷阱 |
|---|---|---|---|
user | 由人输入或点击 | 规格中成本最高的一项 | 每个模块都让 user 填写三个字段,悄悄就变成了一份全职数据录入工作。数清楚有多少个。 |
system | 工作台在已发生的操作中顺带写入(一次运行结束 → 一行 Run 记录;某个阶段被拖动 → last_activity_at) | 免费 | 优先考虑这一种。 大多数优秀的系统钩子读取的都是由 system 写入的字段。 |
integration | 由另一个系统提供(支付回调、模型用量、设备上报、ERP 同步、导入 Excel) | 只有实际构建了相应集成,该字段才存在 | 系统规格中最常见的谎言是「数据从 ERP 来」,但实际上没有 ERP、没有 API,也没有计划。要么将其写明为依赖项,要么别把这个数字放进钩子。 |
derived | 在读取时根据其他字段计算得出(超期 = 当前时间 − last_activity_at > 7d;缺口 = 目标 − 实际值) | 免费 | 只有其输入数据真实存在时,它才真实。依赖尚未构建的集成数据源的派生字段不是免费,而是虚构的。 |
规则: 钩子中的每个字段都要注明其写入方;任何由 integration 写入的字段都要注明来源系统,以及该系统目前是否存在。 如果一份规格中的结论条依赖三个尚未构建的集成,那它对应的页面上线后就会是空白——这正是本技能旨在防止的失败,在企业场景下的表现形式。
4. 节奏与时机
工作台是在某个时机打开的,而不是“某个时候”。把它说清楚:早上通勤 · 睡前 · 练完那一下 · 收摊后 · 上班坐下第一件事 · 交接班时 · 周一晨会前 · 出报表那天。
时机决定了引导语的时态(早上的引导语是祈使句——今天该做什么;晚上的引导语则是回顾式的)、可承受的输入量(没人会在 23:50 填表),以及——在没有推送功能的网页中——究竟有没有什么能让他回来。没有明确时机的工作台,就没有节奏,他只会出于好奇打开两次。
**这在这里比在应用中更重要。**应用可以用通知弥补薄弱的时机。浏览器标签页中的页面做不到。如果这个时机本来就不在他的日常安排中,工作台也无法创造出来——因此,要么把它与他已经会做的事情关联起来,要么降低使用频率的预期,并如实按每周使用来设计。
5. 结构,而非受众
完整内容见 references/workbench-types.md;类别→结构映射见 system-domain.md §6。
按事物的工作方式分类,而非按目标用户分类。 受众无穷无尽——经期 / 增肌 / 考公 / 养宠 / 记账 / 摆摊 / CRM / ERP / 医疗 / 教育 / 工厂 / 电商——列出这些受众只是营销材料,不是方法:它不会告诉你如何构建下一个工作台。结构只有 11 种,结构决定了吸引用户的公式、首屏形态、数据模型骨架、留存机制,以及它具体会如何失败。两个行业截然不同、但结构相同的工作台,共享其工程实现。
个人域主导
| 结构 | 运作机制 | 吸引用户的形式 | 失败原因 |
|---|---|---|---|
| cycle | 系统可以计算的外部节奏(月经周期、孕周、距考试时间、疫苗) | 「你现在是第 N 天/阶段 → 因此今天……」 | 从未输入锚点日期,因此 N 根本不存在 |
| ledger | 每日记录,其价值在于累积形成的曲线(体重、蛋白质、记账、背单词) | 「今天 X / 目标 Y,还差 Z」 | 输入欠账——断更三天就会让人觉得曲线毁了,于是停止记录 |
| state | 当下状态,无需累积(睡眠复盘、情绪、持仓体检) | 「昨晚/今天你的状态是 X,所以 Y」 | 每天都是同一个 X,于是它不再提供信息 |
| runbook | 为今天安排好的步骤(训练计划、睡眠仪式、刷题) | 「今天要做这 N 件事」 | 每天清单都一样——设个闹钟就够了 |
| care | 另一个生命的状态(宠物、婴儿、植物、老人) | 「它/他已到第 N 天 · 今天该……」 | 只有里程碑,没有每天打开它的理由 |
跨域
| 结构 | 运作机制 | 吸引用户的形式 | 失败原因 |
|---|---|---|---|
| feed | 筛选并转述外部信息(财经早报、行业情报、工具速递) | 「今天这 3 条 + 一句人话」 | 内容泛泛,随处都能看到;没有个性化筛选 |
| operation | 资金与库存流动(摆摊、小店、进销存、ERP、电商后台) | 「今日流水 X · 库存告警 Y · 今天建议 Z」 | 记账比用笔记本还费事 / 库存数字从来不准确 |
系统域主导
| 结构 | 运作机制 | 吸引用户的形式 | 失败原因 |
|---|---|---|---|
| pipeline | 对象按顺序推进各个阶段(CRM 商机、订单、工单、项目任务、内容审核、审批) | 「N 个待推进 · M 个卡住超过 K 天 · 今天先看这几个」 | 没人移动卡片,于是所有对象永远停在阶段 1,整个看板都是假的 |
| registry | 可搜索的对象目录,包含 CRUD + 详情(客户档案、商品库、知识库、Skill 市场、学员、病历) | 「新增 N 条 · M 条缺少关键信息 · 最近修改的这几条」 | 初始内容为空,没有每天打开的理由,最后只剩下搜索时才会去访问 |
| console | 可启动、停止和干预的一组运行中对象(Agent、Workflow、设备、服务、定时任务) | 「N 个正在运行 · M 个失败 · 消耗 X」 | 从来没有什么值得关注的失败,于是页面变成没人看的绿墙 |
| monitor | 汇总指标并标出异常,可深入查看详情(BI 看板、工厂大屏、运维监控、持仓) | 「今日 X / 目标 Y · 这 N 处异常 → 点进去看是谁」 | 只显示数字、不显示异常,于是沦为壁纸;或者无法深入查看,数字引发的问题也无从解答 |
大多数真实工作台都由主结构 + 次结构组成。 养宠 = care + ledger。增肌 = ledger + runbook。CRM = pipeline + registry。AI Agent 台 = console + registry。智慧工厂 = monitor + console。电商后台 = operation + pipeline。主结构决定吸引用户的方式和首屏;次结构则提供一两个模块。声称涵盖三种结构的工作台,通常其实是三个工作台——要明确指出这一点,并让对方做出选择(discovery.md §5)。
表格中最有用的两个跨域观察: 个人知识库和企业 Skill 市场属于同一种结构(
registry),失败的方式也一样——第一天内容为空,没有回访的理由。智慧工厂大屏和持仓体检页也都属于monitor,因此成败都取决于它们能否呈现异常,而不只是总量。这就是按结构分类的价值。
6. 黑名单——按你的领域查看对应版本
撰写任何规格说明之前,请先查看 references/day-two.md。
6.A 个人 — 第 2 天检查清单
- 幸运饼干式钩子 — 没有变量,或没有任何产出能生成变量(§3)。这是头号杀手。
- 百科全书式导轨 — 超过三分之一的频道属于知识类型。这就是百科全书,没人会每天打开百科全书。
- 输入负担 —
INPUT ≥ DEPTH(§1.B),或者有三个独立频道各自要求每日记录。 - 没有回顾频道 — 从来没有任何东西告诉你「你已经坚持 14 天」。只有积累,却没有回顾的时刻,就只是做杂事。
- 虚假的今日内容 — 一个名为「今日 X」的频道,内容却每天都一样。
- 空白的冷启动 — 第一天显示
--,于是他永远到不了第二天。 - 十个以上频道 — 无法记在脑子里的频道栏,就会变成他不再查看的菜单。
- 生硬拼接的营收入口 — 商店标签页与任何频道都无关,或向他在痛苦时打开的频道推销产品。
- 一个在他实际生活中并不存在的时刻。
- 有用户的系统 — 「XX 管理系统」,在个人工作台上硬塞了角色。(两个读者不算这种情况 — §9。)
- 它变成了监督工具 — 一个
care工作台,其服务对象可以提出异议,钩子报告缺失项,记录也只为他保留,而不是展示给他。
6.B 系统 — 死寂控制台检查清单
- 演示数据谎言 — 规范中的钩子显示
12 个待跟进,但规范里没有任何字段能生成 12。这是系统领域版的幸运饼干,也是这里代价最高的失败(§3.C)。通过使用空数据库渲染首屏来发现它。 - 列表页地狱景观 — 每个模块的 L1 都是同一张带搜索框和分页的表格。九个模块,九个一模一样的屏幕,没有任何一个屏幕能给出结论。修复方法:主模块的 L1 应该是看板、曲线图或分诊列表,而不是表格 — 结论条也不能省略。
- 空荡荡的后台 — 没有种子数据、没有导入路径、没有创建首个对象的流程。
registry和pipeline都会在这里夭折。每份系统规范都需要在cold_start.day_1中写明一个具体的首个操作(导入一份名单 · 创建第一个 Agent · 录入一个客户),而不是描述空状态。 - 名词式模块 — 「客户管理」「订单管理」「系统管理」。名词加上「管理」并不代表一种能力,只是没有做出决策。每个模块的
does都必须包含某人会执行的动词。 - 权限幻觉 — 规范里写了三个角色,但每个角色看到的屏幕完全一样。要么角色在所见或所做方面有所不同(按模块写清楚),要么就只设一个角色,并明确说明。
- 尚未实现的集成 — 钩子依赖来自「ERP」「支付系统」「设备上报」的数据,但这些数据没有 API、没有负责人,也没有日期。在规范中将其列为依赖,或者从钩子中删掉这个数字(§3.C)。
- 孤立模块 — 与
subject毫无关系的模块。在以客户为核心的 CRM 中,「公司公告」模块属于别人的产品。删掉它,或将其拆分成独立产品。 - 三级页面树,L3 却空无一物 — 为了对称而凭空增加层级。如果一个模块没有真正的子记录,那么它就停在 L2,这样才是正确的。
- 把角色当作组织架构图 — 定义时设置了超过四个角色。他描述的是一家公司,而不是工作台。找出每天打开它的那个人,先为他构建。
- 所有内容都是
primary— 九个权重相同的模块,是从视觉上体现从未决定过什么才重要。
7. 收入切口
完整内容见 references/monetization.md。两条规则适用于所有情况:
- 切口要从现有模块中生长出来,否则就不存在。 暖宫贴属于疼痛急救,因为该模块本来就是为了缓解不适;单独设一个商城标签页就是广告。如果你说不出切口依附于哪个模块,那它就还不存在——这没关系,直说即可。
- 绝不要从用户在焦虑或疼痛时打开的模块中变现。 痛经时的疼痛急救、凌晨 2 点的宠物医院、糟糕的一天里的情绪。这些模块转化率最高,造成的损害也最大,而受损的是整个工作台所依赖的日常使用习惯。
在系统领域,
seam: none通常才是正确答案,硬写一个出来就是缺陷。CRM 的收入模式是有人付费使用 CRM;工厂仪表盘的收入模式是它能避免停机。为内部工具凭空捏造页面内增值服务,会产生企业版的强行嵌入式商城标签页。例外情况是工作台本身就是面向外部用户的产品——此时切口是套餐(席位 · 用量 · 模块解锁),应在规范的seam中用一行说明,并且仍须依附于某个模块。
8. 交接——编写规范,然后停止
完整架构见 references/handoff.md。定义确认后,生成 .workbench/spec.md。
8.A 两个领域均适用
YAML 前置内容——purpose、user(或 roles)、surface、structure、moment、dials、hook,并标明每个子句对应的字段和撰写者、cold_start(day_1 / day_2 / day_7 / re_entry)、home——首页从上到下的内容、带有类型、权重和 does 的 channels、mvp/later、visual、seam、excluded、deferred。然后用中文为读者撰写正文(面向谁、证据、一个普通日子的完整流程、为何选择这些模块、舍弃了什么及原因),最后添加 ## 给实现方 部分(handoff.md §3.A),将此方法内部使用的枚举转换为清晰的构建说明。
home 和 channels[].does 是规范文件能够用于构建,而不只是供人阅读的关键。 hook 确定第一句话;没有 home,构建者就只能猜测其下方应放什么;模块只有名称却没有功能,其整个屏幕就只能靠猜。
8.B 系统域新增三个字段,且它们都是必填项
| 字段 | 缺少它就无法构建规范的原因 |
|---|---|
subject | 一切围绕的名词。两个 CRM,一个围绕客户,一个围绕订单,它们的首屏、模块和实体都不同。一个词,就能推导出规范中的一半内容(system-domain.md §2) |
entities | 数据模型:每个实体的字段、每个字段的写入方(§3.C),以及它们之间的关系。**这个字段能让钩子中的数字变得真实。**没有它,构建者就会自行编造架构,而编造出来的架构无法生成结论条 |
channels[].pages | 每个模块的 L1 → L2 → L3 树,以及各层展示什么、能执行哪些操作。**模块名称不是屏幕。**缺少这个字段,构建者就会渲染出九张一模一样的表格——黑名单第 2 项(§6.B) |
subject: Agent
roles:
- { name: 开发者, opens_daily: true, does: 建 Agent、看昨晚跑得怎么样、调提示词 }
entities:
- name: Agent
fields: [id, name, status, model, system_prompt, created_at]
written_by: { name: user, status: system, model: user, created_at: system }
relations: [Agent 1-n Run]
channels:
- name: Agent
type: today
weight: primary
does: 建 Agent、启停、改提示词、看每个跑得怎么样
pages:
- { level: L1, shows: Agent 卡片列表 + 状态筛选, actions: [新建, 启停, 复制] }
- { level: L2, shows: 配置 + 最近 10 次运行 + 本月用量, actions: [编辑, 试运行] }
- { level: L3, shows: 单次运行的逐步日志和输入输出, actions: [重跑, 导出] }
每次都写上 ## 给实现方。 finesse-ui 熟悉这些术语;Cursor、v0、通义和人工承包方并不熟悉,而且解码表放在 handoff.md 中,不会随规范一起传递。缺少它,构建者就会渲染出六个一模一样的标签页和一条问候栏,而文件中没有任何说明能阻止这种情况。
**没有文件系统?就把完整规范放在一个围栏代码块中打印出来,**并用一行文字说明可以将它复制到任何构建工具中(handoff.md §1.A)。大多数使用此技能的人都在聊天产品中,他们交接时会粘贴内容,而不是提供路径。绝不要声称写入了你实际上没有写入的文件。
finesse-ui 读取的映射关系(保留在此处;规范中使用 §3.A):
| 规范字段 | 在 finesse-ui 中对应 |
|---|---|
surface: phone / desktop | 注册为 h5(手机浏览器中的页面)/ product(桌面浏览器中的页面) |
channels[] | 导航——底部栏或侧边栏;数量决定外壳的选择 |
channels[].pages | 路由,以及外壳必须支持的层级深度 |
hook | 首屏,位于所有内容之上 |
entities | 表格、表单、列和筛选器 |
cold_start | 空状态——而 finesse-ui 会将空状态视为真实的图片槽位 |
structure.primary | 主导展示形式:cycle → 日历 · ledger → 曲线 · pipeline → 看板 · registry → 列表+详情 · console → 设备群卡片 · monitor → 数据+下钻 · operation → 数据 |
**编写规范就是这项技能的工作终点。构建是另一项工作,只有获得同意后才开始。**用一句话提出交接,然后等待——用户可能想先仔细考虑这个定义、把它带到别处,或亲自构建。
9. 不在范围内
finesse-brief 定义什么是工作台——个人工作台或系统工作台——并止步于此。遇到以下工作时,应交接出去:
- 界面 → finesse-ui(这是设计好的交接点,§8);
- 工程实现——存储、同步、身份验证实现、模型选择、部署,以及如何实际构建集成。规范将集成列为依赖项(§3.C);它并不负责设计集成。
- 真正的多租户商业产品——计费、租户隔离、合规、SLA、销售流程、路线图。**角色属于范围之内;公司的产品战略不属于。**界限是:此技能会完整定义一个工作台,但不会为 SaaS 业务做产品管理。
- **临床、金融或法律内容。**此技能会决定是否应有妇科科普、持仓体检或用药提醒模块,以及模块必须展示什么。它不提供医学、金融或法律内容,也绝不能编造内容——包含听起来似是而非的捏造内容的模块,还不如没有模块。指出模块名称,然后明确说明真实内容必须从何处获取。
有两件事过去不在范围内,现在则不再如此。 多个角色——「销售看自己的,主管看全组」现在通过 roles 加上各模块的差异来处理,不再拒绝。企业类别——CRM、ERP、工厂、医疗、教育,都是 pipeline/operation/monitor/registry 工作台,由系统轨道处理。但围绕这些类别的业务仍不在范围内。
还有一条从未改变的界限。 妈妈为孩子做的学习工作台有两个人会看,但仍然是个人工作台:一个所有者、一个领域、一个时刻、一个钩子,没有页面树,也没有人以某种类型登录。同一界面有两位读者,这是写作问题——同一句话必须对双方都成立且友善(hook-engineering.md §7)——而不是架构问题。当第二位读者有自己的意愿时(学龄儿童、年迈父母),额外规则见 workbench-types.md §6.A。