三面拆分⑬:触发确认链路 + 运营中心「工作流」区 —— 设计只管设计,运营管细节

**触发确认链路**(用户口述五步的第 4/5 步):
  接收邮件 → 分类识别 → 命中 RFQ 事件 → ④(可选,运营勾)系统消息到指定人
  工作台(带邮件内容)→ ⑤ 工作台点「确认起单」,流程才起。
  · 命中不等于必起:勾了「需人工确认」,装配好的入参存成待确认单
    (sys.trigger_pending,migration 0019),ConfirmDesk 端口把带来件内容的
    系统消息送指定人(eventRef 挂票号,消息列表就地贴确认状态与那枚钮)。
  · 先认领后起单:consumed_at 空才认得到 —— 两人同时点、一人点两次,都只起一条流;
    起单失败退回认领,不留死票。确认人记进 source.by,留痕可查。
  · 登记触发不走确认(登记那一下本身就是人在确认);勾了没指定人 = 配置错误入死信。
  · 4 条单测 + 全链实测:投信 → triggersHit=1 且零直起 → AI 工作台收到确认消息
    → 确认起单 → 二次确认幂等回同一流号 → source.by = AI。

**运营中心重排**(区名即运行时:工作流是流程包的运行时,任务是活动的运行时):
  · 新「工作流」区:在途看板(从任务区迁入)+ 运行配置 —— 每包的触发器
    起单开关 / 确认打勾 / 确认人,和节点负责人(sys.node_owner)。
  · 负责人三层:显式指派 > 运营配置 > 轮值 —— 合并点在 process.start,
    复用既有派发链一行不改。
  · 任务区瘦身成活动运行时(任务/审批/需处置);知识库区改名「数据」
    (与设计中心的知识库解开同名);系统区只剩通道实例。
  · 设计中心触发器详情页摘掉启停按钮 —— 设计只管设计,启停/确认全在运营。
  · 旧深链有改嫁:tasks/board → runs/board,tasks/trg → runs/conf。

reset-runs 补 sys.trigger_pending(待确认单是运行痕 —— 和上回漏 trace_span 同类洞)。
邮件分类 Agent(第 ② 步)现由抽键正则 + S-FEEL 代位,升级路径记进 debt.md。
产品设计.md 运营章、trigger/process 两份 CONTRACT.md 同步。

五闸绿;契约快照随本提交入库。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
This commit is contained in:
2026-07-29 13:09:16 +08:00
co-authored by Claude Opus 5
parent 70b261d067
commit f9b2c07731
45 changed files with 1176 additions and 115 deletions
+32
View File
@@ -0,0 +1,32 @@
-- 触发确认链路(2026-07-30):命中不等于必起 —— 触发器可勾「需人工确认」,
-- 命中后先发系统消息到指定人工作台,他点「确认起单」流程才起。
-- 这两列是**运营配置**:设计面的 upsert 不写它们,只有运营口(setConfirm)动。
alter table sys.trigger add column confirm_required boolean not null default false;
alter table sys.trigger add column confirm_staff_id text;
-- 待确认单:命中但等人点头的那一票。装配好的调用入参存在这里 ——
-- 确认那一刻直接起单,不重新装配(事件早已过去,重抽可能抽不到了)。
create table sys.trigger_pending (
id text primary key,
trigger_id text not null,
package_id text not null,
-- 确认人快照:发消息那一刻的指定人;确认路由按它认门
staff_id text not null,
subject text not null,
data jsonb not null,
source jsonb not null,
-- 来件预览(from/subject/body 节选)—— 消息上带内容,人不用回头翻邮箱
preview jsonb not null default '{}'::jsonb,
created_at timestamptz not null default now(),
consumed_at timestamptz,
workflow_id text
);
create index trigger_pending_open_idx on sys.trigger_pending (trigger_id) where consumed_at is null;
-- 节点负责人(运营配置):流程包的哪个节点归谁 —— 起单时垫在显式指派之下、轮值之上。
create table sys.node_owner (
package_id text not null,
node_id text not null,
staff_id text not null,
primary key (package_id, node_id)
);
+7
View File
@@ -134,6 +134,13 @@
"when": 1785130113173,
"tag": "0018_tool_display_name",
"breakpoints": true
},
{
"idx": 19,
"version": "7",
"when": 1785130114173,
"tag": "0019_trigger_confirm",
"breakpoints": true
}
]
}