# 跨产品工作流

单产品内的操作由钉钉官方技能覆盖，**跨两个以上产品的编排**才走这里。

官方执行契约明确把两件事留给外层：

> 定时调度由**外层工作流**负责。
> 无界任务**需要宿主管理进程并持续读取 stdout**。

## 通用纪律

### 先探可用性再编排

编排最怕跑到一半发现某个产品没权限，留下半成品。每个 recipe 开始前先用只读命令探一次依赖的产品，缺了就提前告诉你「这个 recipe 缺 X，要么跳过这步、要么换做法」。

### Ledger 是强制的

多步编排里任何一步失败都不会静默跳过，最后如实汇报：

```
步骤              状态        说明
今日日程          ok          3 条
我的待办          ok          4 条
待我审批          skipped     响应缺少集合，无法确认是「没有」还是「不可用」
未读邮件          ok          12 封
```

**不会把 skipped 写成 0，不会把不确定写成确定。**

### 写步骤逐条确认

读步骤可以连续跑；**写步骤（建待办、发消息、写文档、排日程）必须先把要写什么完整列出来等你确认**。批量写不超过 30 条。

## Recipe

### 1 · 晨间简报

**跨产品**：calendar + todo + oa + mail　**性质**：纯只读，可安全自动执行

按「今天必须处理的」排序：已过期待办 > 今日会议 > 待审批 > 未读邮件。

已知失败态：`oa +list-pending` 可能返回 `missing_collection`——这**不是空结果**，ledger 记 `skipped` 并说明「审批项无法确认」。

### 2 · 会议闭环

**跨产品**：minutes → todo + doc + calendar　**性质**：读 + 写，每个写步骤都确认

1. 定位听记 → 2. 取**官方已抽取的**行动项（不自己从逐字稿"理解"）→ 3. 列给你确认 → 4. 建待办并按姓名指派 → 5. 可选写纪要文档 → 6. 可选排跟进会

**回滚语义**：步骤 4 建到一半失败时**不自动回滚已建的待办**（你可能已经看到通知）。改为在 ledger 里列出「已建 N 条 / 失败 M 条」，把失败原因和参数给你，由你决定重试还是手工补。

### 3 · 逾期待办巡检并通知

**跨产品**：todo + aisearch/contact + chat 或 ding　**风险最高**

1. 取与我相关的全部待办 → 2. 本地筛逾期 → 3. 解析负责人（多候选必须问）→ 4. **完整列出要给谁发什么** → 5. 确认后逐个发送

**红线**：对外发消息不可逆，没有明确确认绝不发；不群发，逐个列出；`ding` 是强打扰（响铃/短信/电话），除非你说「紧急」否则默认用 `chat`；一次不超过 30 人。

### 4 · 周报生成

**跨产品**：report + todo + calendar + minutes

1. 找可用日志模板（模板名各组织不同，**不猜**）→ 2. 本周完成的待办 → 3. 本周会议 → 4. 可选补听记结论 → 5. 按模板字段组织并**完整展示确认** → 6. 提交

⚠️ 日志模板字段是组织自定义的，**必须先读模板结构再填**。时间参数是 ISO-8601，跨度 ≤180 天（与 `oa` 的 epoch 毫秒不同）。

### 5 · 产物归档

**跨产品**：doc/minutes → drive → wiki

定位产物 → 确认或创建归档目录 → 移动/复制 → 可选挂到知识库。

边界提醒：**文档正文**编辑导出走 `doc`；**文件存储管理**走 `drive`；**知识库空间与节点组织**走 `wiki`。

## 定时与事件驱动

recipe 只描述**做什么**，**什么时候做**交给 DesireCore：

- 固定时间（如每天早上的简报）→ DesireCore 调度
- 事件触发（如收到审批就提醒）→ `dws event consume` 长连接

⚠️ **禁止用轮询模拟事件驱动。** 官方契约明文禁止轮询消息历史或审批列表。
