事项契约卡 · 这张卡是什么
依据:docs/92 §〇(用户四次纠正原话)· docs/90 · docs/90-r0-tech-spec · 本仓 grep 实测

一句话:这是讨论聊通之后的结论卡,不是派活前的合约。

它服务的读者是三周后回来的你——不是当下要派活的 GM。所以它的正面放的是 「这件事是什么 / 我们议定了什么 / 现在到哪 / 等我做什么」, 而不是子事项表和审核门。派活明细整体退到折叠区。

这份稿子回答七个问题:是什么、解决什么、怎么运转(五步)、confirm 前后两种形态、 为什么长成现在这样、今天有多少是真的、以及为什么还没开工。

事实层部分核过17 个真实字段有出处(带 file:line);但界面上要显示的字段里有 67 个系统里根本不存在,卡本体是 0 行代码
需求层来自需求文档docs/90 / docs/92 逐条可查,含用户四次纠正的原话
设计层就是这一页单栏阅读稿。可点走查的那份是另一份稿子 design/mockups/card-schema/,本页不重复它
验收层无层间对照矩阵矩阵在 card-schema/ 那份里(22 行);本稿的待澄清 = 那 54 条,不另起一套
① 定义

这张卡是什么

是讨论收敛之后落下来的一张结论卡。 它不是派活前的合约——这两者装的东西几乎一样,但正面顺序完全不同,读者也不同。

它是

  • 结论的唯一落点:拍板结论只写进卡,文档 / 飞书 / 记忆降为镜像或指针
  • 看板上的一张卡:不是独立页面,点开是字段详情面板
  • 能追踪的排期卡:confirm 之后状态是 待进行 / 进行中
  • 写给三周后的你:换人、换引擎、隔三周,读到的是同一份东西

它不是

  • 不是派活合约:docs/90 原来的重心是「派活前的拆解合约」,用户 2026-08-17 指出重心错了
  • 不是第二个真相源:卡上没有任何自由 notes / log / transcript 字段,超长一律拒写
  • 不是进度看板:执行态永不落卡,进度读时从 run 派生
  • 不是对话里的一段文本:对话里只留一个入口,卡片本体是点开后的一整屏
一句话差异(docs/92 开头那张对照表): 读者从「要派活的 GM」换成了「三周后回来的用户」——这一个改动, 把正面从「子事项表 + 分级门 + session 判定」换成了「意图 / 议定 / 战线 / 产出 / 我的动作」。
② 动机

它解决什么真痛点

今天没有任何东西能回答「事项 X 到哪一环了」。下面四条是用户点名的用途, 每条后面是它今天卡在哪(全部出自 docs/90 §Context 的实测,不是设想)。

新 agent 接手,先读它 今天靠 GM 记忆串。换人换引擎即断——实测一条会话的 31 个 run 跨 4 个不同原生 id, 换引擎必然开新原生会话,那侧记忆从零开始。
回看这件事怎么走到今天 事项与执行完全断链:backlog 9 条 / run 98 条 / session 200 条,而 linked_run_id 有值 0 条,run 上没有 backlog_id 字段。
搜「当时怎么定的」 决策散在 9–12 个互不连通的载体,无一以事项为主键。同一决策(引擎锁)记在 5 处、 对「落地没有」给出 3 种矛盾答案;OQ-1 这个编号在 10 份文档里含义各不相同。
看钱和时间花在哪 没有任何按事项聚合查询的能力。而且终态 run 超 7 天整行删除、事件流超 2 小时清空—— 关联只存在 run 上必然蒸发。
所以卡必须持冻结快照。 这不是设计偏好,是被保留策略逼出来的:services/orchestrator/storage.mjs:425-426RUN_RETENTION_MS = 7dEVENT_RETENTION_MS = 2h。 卡上留一份定长的 outcome 快照,run 行被清掉之后仍答得出「做了什么、产物在哪」。
③ 怎么运转

权威五步流程

下面这段是用户原话,逐字照录。全稿只有这一段不许改写—— 之前两次误读都是从「转述一下」开始的。

「这个卡片在我们的对话框里并不重要。只要我说这个任务完成了,并且你也确认所有信息都齐全了, 我们再生成这个卡片。到时候,你可以在对话框里生成一个卡片入口,提供一个超链接(link)或 按钮(button)。我点开后是一个整体的大卡片,就像飞书的单个事项一样。 这个大卡片(事项)应该包含以下内容:1. 事项的名字和背景;2. 你的分配计划:每个 agent 具体做什么,以及各自的交付产物是什么;3. 比如 dev agent 准备创建多少个 session,其中哪些 是新的,哪些是老的。当我确认这些信息并点击 confirm 之后,这个卡片就相当于是我们的排期卡片, 状态可能是"待进行"或"进行中",用来追踪任务的整体进度。」

出处:docs/92-conclusion-card-redesign.md §〇.4(用户 2026-08-17 第四次说明,原文照录)。 逐字未改;标点按中文全角排版——真源那几行用的是半角逗号,那是该文件全篇的书写风格,不是原话的一部分。
步 1 · 你 说「这个任务完成了」 步 2 · GM 信息齐全吗? 步 3 · GM 生成卡片(建卡 skill) 对话里放一个入口 步 4 · 你 点入口 → 整屏大卡片 草案态:分配计划待你确认 步 5 · 你 点 confirm 排期卡 待进行 / 进行中 追踪整体进度 草案 → 排期卡 不齐 · GM 继续问 → 回到对话 卡在步 3 就已经存在(草案态);步 5 那一下不是「创建」,是把草案翻成排期卡。 全流程零程序校验 —— 今天这五步没有任何一步有代码在跑(见 ⑥)。
这张图回答:信息不齐的时候会回到哪一步——这条回边是文字里没有的。 文字天然线性,写到第 5 步就停了,不会回头说「不齐要退回去继续聊」。 另一条只有图能表达的是状态跃迁:卡在步 3 就已经存在,步 5 的 confirm 不是创建。
你做的 GM(agent)做的 判断 · 有回路 终态
配色是项目 Micro 语义色板(--marker-* / --brand), 不是 drawio 默认三色;颜色回答的是「这一步谁在跑」。
步 1 · 你说「这个任务(讨论)完成了」
步 2 · GM确认信息齐全(事项名 / 背景 / 分配计划 / session 计划都有了),不齐就继续问
步 3 · GM生成卡片(建卡 skill),并在对话里放一个入口(超链接或按钮)——对话里不铺开卡
步 4 · 你点入口 → 看整体大卡片(飞书单个事项的样子)
步 5 · 你confirm → 卡变成排期卡,状态 待进行 / 进行中,追踪整体进度
④ 两种形态

confirm 前后是同一张卡的两个态

不是两张卡。内容一格没少,变的是顶部状态、动作条,和「你现在该看哪一块」。

confirm 前 · 分配计划待你确认

  • ① 事项名与背景intent(≤800,确认时冻结)
  • ② 分配计划:每个 agent 做什么 + 各自交付产物
  • ③ session 计划:开几条、哪些新建哪些复用,附理由与分数
  • 动作条只有两个:confirm / 打回拆解

confirm 后 · 排期卡(正面六区)

  • 1 卡头:编号 · 状态 · 一句「现在到哪」
  • 2 这件事是什么:用户原话优先
  • 3 我们议定了什么 ← 主角,open 的高亮成待办
  • 4 现在到哪:按战线汇总,每条一行
  • 5 产出:可点 chip;run 被清理时显示「记录已按保留策略清理,结论见快照」
  • 6 等我做什么:只放球在你手里的
第一屏不出现任何 id / run / session / gate。 派活明细(role / session / gate / impact / run / outcome)整体退到折叠 A, 时间线 / 消耗 / 判定分数退到折叠 B。信息一格没少,顺序全变。
⑤ 设计史

为什么长成现在这样

解释稿里「为什么这样定」比「是什么」更值钱。 这张卡的现在形态是被用户三次纠正 + 两次误读更正逼出来的,逐条如下。

纠正一 · 不做确认控件 原设计的「GM 吐 card_draft → 渲染确认卡 → 用户点建卡」三段作废。 实际形态是:我们在对话里聊通 → 你说一句「建卡」→ GM 就建。对话本身就是确认, 不做 <question-form> 确认卡、不做按钮。GM 可以主动问「要不要建卡」,但那是一句话,不是一个控件。 理由与 docs/76 A3-3「执行意图走对话,不走开关」一致——原设计违反了它。
纠正二 · 卡必须无缝对接项目看板 卡不是独立页面,它就是看板上的一张卡;点开是字段详情面板。 样式参考飞书多维表格(看板视图 + 记录详情侧栏)。 对接点是现有任务中心:看板态三列 + 详情态同抽屉 drill-in (apps/web/index.html:2880-2889,门禁 cc:test:task-center)。
纠正三 · 建卡做成一个 skill,不值得设计交互 用户原话:「我甚至觉得建卡是一个 skill,我们确认后创建、弹出窗口就好了。 重要的是卡在项目管理里的样式和字段,以及后续怎么维护。」 于是设计重心收敛为两件:A 字段与样式(看板卡露哪几个字段、详情面板怎么排)、 B 维护模型(卡建好之后靠什么保持与现实一致)。卡的「诞生」从设计议题降级为一个 skill 的实现细节。

GM 误读一(已更正)

  • 把「不需要确认控件」读成了「不要确认」
  • 实际是:不要在对话框里做确认卡;confirm 在大卡片上点—— 那一下正是「草案 → 排期卡」的状态跃迁。

GM 误读二(已更正)

  • 把重心放在了「卡在对话里怎么呈现」
  • 实际是:对话里只留一个入口(link / button),卡片本体是点开后的一整屏。
为什么把纠正史写进稿子: 这三条纠正每一条都推翻过一份已经画完的设计。不写下来,下一轮(换人或换引擎) 会照着被否掉的方向再画一遍——docs/92 的 §一「诞生三段」现在还留在文件里, 标着「已被〇.1/〇.4 作废,保留备查」,就是这个用途。
⑥ 事实层

这张卡今天有多少是真的

这张卡目前是 0 行代码的设计,不是能开发的东西。 下面每个数字都能自己 grep 复现,不是估的。

事实
实测
contract_cards(卡本体)
全仓 0 个文件命中
card_draft(草案解析通道)
全仓 0 个文件命中
tracks[](分组)
全仓 0 个文件命中
界面上要显示、系统里根本不存在的字段
67 个
已核过的真实字段(可复用地基)
17 个
待澄清
54 条
复现方式:grep -rl "contract_cards" services packages workers scripts apps → 0;card_draft / tracks 同为 0。 67 / 17 / 54 这三个数出自 design/mockups/card-schema/data.jsfacts_absent / facts / questions 三个数组,可逐条点开看。
T1 · 卡六态只有数量,没有落库枚举 方案只写了「status(六态)」,没给六个键。徽章文案、状态机迁移、 wb:card show 的输出、测试断言四处要用同一套字符串——现在没有唯一答案。
T2 · items[].state 与「执行态永不落卡」正面冲突 它被限定为读视图派生字段,落库就违反纪律;但方案没有给出它的类型、值数或值名。
T3 · 主键缺 project 短名规则与并发方案 卡编号是 <project>_<seq>(例 workbench_1), 但短名从哪来、序号怎么原子递增、撞号怎么办都没定。主键不可变,起错了改不了。
这一页存在的理由: 同类稿子的第一版看着完整,实际含 14 类虚构字段(排队位置、单步耗时、上传百分比、部署状态…全是编的), 被判 RETURN TO DESIGN,前后 13 轮才收干净。 如果当时顶部就写着「事实层未验证」,它根本不会被当成能开发的东西交出去。
⑦ 进度

为什么还没开工

不是拖着,是先做证伪:同构的机制已经死过一次, 所以这次要求先用一天证明「GM 真的会提议建卡、用户真的会点」,再谈写代码。

出处:docs/93-contract-card-d-plan.md(已批准,D0/D1/D2 的唯一真源)。 注意 docs/90另一份方案(2026-08-16 批准的数据模型 / session 规则 / 分级门),两者不互相替代。
一句诚实注记:本节方案 2026-08-26 才落盘docs/93); 在此之前它只存在于不入 git 的 plan 文件里(~/.claude/plans/mellow-rolling-pond.md)—— 这正是 D0「抢救正在流失的记忆」说的那件事,方案自己就是自己的第一个例子。
D0 · 已做 抢救正在流失的记忆 docs/91 已落地 D1 · 一天 证伪实验 后端零改,只观察 四个判杀阈值 任一触发? 改路 或不建卡 六条前提(全满足才放行) P1 落点 P2 废 loops P3 合实体 P4 门+UI P5 走对话 P6 容量 这六条是 D2 的前置门,不是并列建议 —— 缺一条就不放行 D2 · 才谈建卡 写代码从这里开始 今天还没到这一步 否(全不触发) 我们今天卡在 D1 之前 —— D0 已完成,D1 还没跑。 出处:docs/93-contract-card-d-plan.md(2026-08-26 落盘,已批准)。
这张图回答:什么情况下这件事会被判死——那条红色退出边是文字里没有的。 文字读下来像「D0→D1→D2 三步走完就开工」,图上才看得出 D1 有一条通向「改路 / 不建卡」的退出边,而且 六条前提是 D2 的门(框中框),不是并列建议
已完成 要跑的实验 判断 · 有退出边 前置门 判死 · 终止
D1 的四个判杀阈值(任一触发就改路或不建卡) ① GM 主动提议建卡 0 次 ② 用户点建卡 <50% ③ 用户点「还没聊完」>30% ④ 漏报数 > 提议数。 设这四条的意义是:让实验能证伪,而不是跑完之后由人来解释「其实还行」。
D1 的第二半:回溯填充率(纸上作业,零改动) 拿过去 4 天三个真实主题手工填卡,量三个数:字段填充率(<60% 即停)、 多少内容撞长度红线(≥3 处塞不下就要重做容量设计)、 按真实速率多久撞顶(<14 天就要先重做容量)。
D2 的六条前提 P1 先给「GM 需要写自由文本」一个受管落点(卡上放 freeform_ref 指针),而不是禁止它 · P2 gm_loops 明确废弃或宣告为被重写对象,不许并存 · P3 orchestration_statebacklog 至少合并掉一个 (否则 6 个重叠实体谁都不是权威)· P4 门与批准 UI 同轮上线,并先去掉 server.mjs:148 的 worker→operator token 回退 · P5 确认走对话,不做独立控件 · P6 容量按 6.6 派发/天重算,并先定义归档 / 降级策略。
所以现在明确「不做什么」 不现在建 contract_cards 集合(两路独立 agent 一致反对); 不动飞书;不做全量回填;不新增面板。——这也是 §⑥ 那个「0 行代码」的直接原因: 不是没来得及写,是现在故意不写。

改变结论的事之一:同构机制死过

  • 同构的 gm_loops 建过,活了 5 天就被删
  • 所以 D1 不是走过场——「机制建好了但没人用」在这个仓里是已发生过的事,不是假想风险。

改变结论的事之二:容量撑不住

  • 按实测 6.6 派发/天最活跃的卡 5–8 天就撞容量顶
  • 所以 P6 要求「容量按 6.6 派发/天重算」——现有红线(单卡 32KB / items ≤30 / timeline ≤100)是按更低频率定的。
名词

名词解释

每条讲三句:是什么物理东西 / 起什么作用 / 不要它会怎样。 技术黑话不解释就等于没写。

结论卡 是一行数据(计划中的 contract_cards 集合里的一条),不是一份文档、也不是一段对话。 作用:把「这件事是什么 / 议定了什么 / 产出在哪」收在一个地方,换人换引擎都读同一份。 不要它:结论散在 9–12 个互不连通的载体里,同一件事能给出 3 种矛盾答案。
排期卡 就是同一行数据在 confirm 之后的样子,状态字段变成 待进行 / 进行中 作用:让这件事进入可追踪状态,你回来时能一眼看到「现在到哪」。 不要它:卡只是一次性的确认弹窗,点完就没有下文。
分配计划 卡里的一张表:每个 agent 做什么(role / agent_id / title)+ 各自交付什么(deliverables[])。 作用:confirm 之前你看的就是它——你要确认的是「谁干什么、交什么」。 不要它:你只能在对话里逐条追问,而对话三周后没人再读。
session 计划(新建 / 复用) 服务端算出来的一段结论:这一步该开新会话还是接着老会话,附逐项理由与分数 作用:你只审结果、不背规则。例:同事项 +50 · 需历史 +25 · 主题污染 −25 · 工作区落后 main 37 提交 −20 → 30 分(阈值 40)→ 改判新建。 不要它:要么每次人肉判断,要么闷头新建——前者靠记忆,后者丢上下文。
层间对照矩阵 一张表,每行一个功能点,四列分别是:事实依据 / 需求出处 / 设计落点 / 状态。 作用:让「哪一层缺」一眼看得出,尤其是「需求要显示但系统里没这个字段」和「设计自己加的戏」。 不要它:稿子看着完整,实际含虚构字段——这已经发生过一次,13 轮才收干净。
待澄清 一份编号清单,每条是一个「不回答就没法往下做」的问题,并标明它挡住哪一轮。 作用:把拿不准的东西显式挂起,而不是设计者自己假设一个答案继续画。 不要它:假设会以「已确认需求」的样子进入实现,错到很后面才发现。
事实层 四层里的地基:每个界面元素的数据来源写到字段名,并明确列出哪些字段根本不存在 作用:挡住编造。稿子上出现系统给不出的数字,实现照做即错。 不要它:就是本页 §⑥ 那个「67 个字段不存在」被忽略的世界——照着画就照着错。
判杀阈值 实验开始之前就写死的四个数(见 §⑦),任一触发就停或改路。 作用:让实验能证伪。阈值必须先定,否则跑完之后总能解释成「其实还行」。 不要它:实验变成走过场,结论由谁嗓门大决定。
六条前提 D2(开始写建卡代码)之前必须全部满足的六个条件(P1–P6)。 作用:它是不是清单——缺一条就不放行,图上画成框中框正是这个意思。 不要它:会在地基没铺好时先盖楼,重复 gm_loops「建好 5 天就删」那条路。
验收层

做不到的,单列出来

把做不了的划掉,比把能做的说满更有用。

不能在这一页走查界面(可点的在 card-schema/ 不能证明这张卡好用 —— D1 实验还没跑 不能给出卡六态的六个键(T1 未定) 不能给出卡编号的项目短名规则(T3 未定) 不能保证「确认只属用户」—— 今天是纪律不是技术保证 本页三档视口横向溢出:未跑,请 GM 复核
卡本体代码量
0 行(contract_cards 全仓 0 文件命中)
不存在的字段
67 个(card-schema/data.js: facts_absent)
已核真实字段
17 个(card-schema/data.js: facts,带 file:line)
待澄清
54 条(card-schema/data.js: questions)
D0/D1/D2 的出处
docs/93(2026-08-26 落盘,此前只在不入 git 的 plan 里)
保留策略
storage.mjs:425-426(run 7 天 / event 2 小时)
右下角可以点「批注」,指着任意一段提意见——导出的 Markdown 带精确定位。