feat(w05): 数据齐了也叫人一次 —— S1 改派只读的验收工单,件同一份、编辑钮收起

用户:「就算数据是足的也进入这个数据工单,就派发一个验收工单,界面和数据要和现在的
第一个数据工单一致,只不过把芯片卡片上的编辑按钮去掉,只展示不能编辑,然后把标题旁边的
数据工单改成验收工单」。

病根在引擎拍首那道 doneWhen 扫描:输入本来就齐的单,S1 的 doneWhen 第一拍就为真,
配方一笔都还没跑,这一步当场被收掉 —— 卡永远发不出去,人一眼没看过就进了 S2。
治法:CMMN 给 S1 标 manualActivation,那道扫描多一个门槛(worldTouched),次序变成
「配方发卡 → 人答 → 下一拍 doneWhen 为真才收」;doneWhen 仍是真门,只是不抢在人前面。

平台:执行工单第三副面孔 variant:'accept'(件只读、人只确认「确认无误」)——
与 mode:'acceptance'(submit 抬起来的收口验收,带打回重做)分清;三副面孔的判断
抽成纯函数 order-face.ts(有测),chat-bubbles 只摆。
活动:S1 两笔互斥的 card(carded 幂等保证一步只发一张)+ 案卷粘着的旗 order_kind;
一张件两副面孔 —— 题头/标题/页脚三处名字与卡角编辑钮按 v-data / v-accept 由样式表挑
(藏的是容器 .fabs,逐枚去盖打不完)。

测:引擎测钉死那一对(标了人工激活 → 卡发得出去、步不收;没标 → 步当场被收、卡发不出);
auto-runner variant 透传;order-face 4 条;包内 2 条(两笔卡 + 粘旗)、view 1 条;
两处变异验证。e2e w05 5/5 released、被拒 0、模型调用恰 1 次 —— 都在库那例摆的正是验收工单。
2558 测、四门禁绿;2.15.0 装库核过。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
xcs
2026-08-31 22:44:00 +08:00
co-authored by Claude Fable 5
parent e47ce92702
commit ce72da77eb
21 changed files with 492 additions and 66 deletions
+6 -2
View File
@@ -128,7 +128,11 @@ export type AutoAction =
readonly kind: 'card';
readonly when?: string | undefined;
readonly as: 'execution' | 'decide';
readonly variant?: ('data' | 'review') | undefined;
/**
* 卡的面孔:`data` 数据工单 / `accept` 验收工单(都是执行工单的变体)· `review` 审核卡(决策卡的)。
* 不写就是普通执行工单 / 普通决策卡。
*/
readonly variant?: ('data' | 'review' | 'accept') | undefined;
readonly title: AutoExpr;
/** 决策卡问的那句话 */
readonly ask?: AutoExpr | undefined;
@@ -177,7 +181,7 @@ export const autoActionSchema: z.ZodType<AutoAction> = z.discriminatedUnion('kin
kind: z.literal('card'),
when: z.string().min(1).optional(),
as: z.enum(['execution', 'decide']),
variant: z.enum(['data', 'review']).optional(),
variant: z.enum(['data', 'review', 'accept']).optional(),
title: autoExprSchema,
ask: autoExprSchema.optional(),
guide: z.array(z.string().min(1)).optional(),
+7 -1
View File
@@ -344,8 +344,14 @@ export const executionWorkOrderSchema = z.object({
* 区别只在**它要人办的是「把一张主数据表建齐」**(件上的表就是要建的记录,确认即入库),
* 所以对话区要长成自己的样子(色/图标/「数据工单」四字/「确认写入」),不能再顶着「执行工单」的牌子。
* 活动在卡骨架上写 `"variant":"data"`,归一层原样带下来;不写就是普通执行工单。
*
* **`accept` = 验收工单**(2026-08-31 用户定:「就算数据是足的也进入这个数据工单,就派发一个
* 验收工单…把芯片卡片上的编辑按钮去掉,只展示不能编辑」)—— 同样是执行工单的变体:件上没有
* 要填的格子,人只核对、确认无误。**与 `mode: 'acceptance'` 不是一回事**:那个是 `submit`
* 抬起来的**收口验收**(签下去就 releaseWrite、发口、落终态,带打回重做那一路);
* 这个只是「这一步的活干完了,请你过目」,回传即办结,一步都不放行。
*/
variant: z.enum(['data']).optional(),
variant: z.enum(['data', 'accept']).optional(),
ask: z.string(),
standard: z.string().optional(),
steps: z.array(z.string()).optional(),