## 让高影响外部动作可控地执行

<!-- slot: 目标 -->
### 本章目标

读取信息与修改外部系统，是两类不同的工作。
发送邮件、变更生产权限或更新合同状态，都可能立即产生外部影响。
高影响动作要在行动前固定边界，行动后取得证据，并为结果不明准备恢复路线。

学完本章，你将能够：

- 判断哪些外部动作必须先展示行动卡并由人确认。
- 为一次写入选择稳定的业务身份，避免把同一意图重复执行。
- 没有明确回执时先读权威状态，并区分重试、补偿与人工接管。
- 用结果卡保存确认、执行、核验和后续责任。

<!-- slot: 边界 -->
### 适用边界

- **覆盖**：会改变外部系统、产生外部通知、影响权限或形成业务承诺的高影响动作。
- **不覆盖**：假设所有提供方都支持同一种幂等键、事务回滚或撤销接口。
- **假设**：Workspace 已安装并授权相应 App，Agent 的当前 Extension Catalog 中确实存在所需动作，而且业务 Owner 已说明哪些变化需要人工确认。

Workflow 没有 HTTP 节点或 Extension 节点。
它通过 `send_message` 和 callback 委托已授权 Agent；`request_approval` 只保存人工通过或驳回，不执行外部动作。
外部活动也不是 Trigger；调用来源只有 `manual` 和 `schedule`，需要运行时由具备权限的人或 Agent 另行明确发起手动调用。

<!-- slot: 流程 -->
### 从行动卡到可核验结果

![高影响外部动作安全主路径：AI 读取权威状态并展示行动卡，人确认后 Agent 只提交一次；权威成功进入结果卡，明确未执行且不会再生效时修正并生成新行动卡重新确认，结果不明时先按完整意图身份核验，证据不足则人工接管，不盲目重放](../../media/chapters/fig-21-01-safe-external-action.svg){#fig-21-safe-external-action width=96%}

行动前按以下顺序处理：

1. **确认能力**：只使用当前 Catalog 中可见且已授权的动作。
2. **读取现状**：只读取得目标对象、当前版本或业务状态。
3. **固定意图**：把对象、来源批准版本或业务事件、期望变化、权限、影响和恢复责任写进行动卡。
4. **等待确认**：由指定的人确认这张精确行动卡；对象、范围或前置状态变化后，旧确认失效。
5. **只提交一次**：Agent 按确认内容执行，不因响应变慢追加写入。
6. **按证据收口**：分为权威成功、明确未执行和结果不明三路；结果不明先核验。

完整意图身份由“对象 + 来源批准版本或业务事件 + 期望变更”组成。
例如“客户 `C-1042` 的合同版本 `V7` 由待确认变为已生效”；更换聊天消息、Run 或请求编号不会产生新意图。

<!-- slot: 提示词 -->
### 复制这段安全执行提示词

把方括号替换为真实信息。
如果当前 Catalog 没有满足要求的动作，让 AI 停在需求卡，不要让它临时改用不明接口：

```text
请帮助我准备并执行下面这项高影响外部动作。
在我确认行动卡之前，只能读取当前状态，不能写入。

业务目标：[为什么要做]
外部对象：[系统、资源类型与可唯一核验的对象]
期望变化：[从什么状态变成什么状态]
完整意图身份：[对象 + 来源批准版本或业务事件 + 期望变更]
允许使用的身份与最小权限：[授权身份与范围]
必须确认的人：[业务 Owner 或指定审批人]
结果通知位置：[Loop 频道、Thread 或 Task]
失败后的责任人：[核验、补偿与人工接管 Owner]

请按下面规则处理：
1. 先检查你当前实际可见的 Extension Catalog。没有所需动作或授权时立即停止，不要猜动作名，不要索要 token。
2. 先读取权威状态，生成行动卡：对象、动作、当前值、期望值、完整意图身份、授权身份、影响、补偿责任、确认人和证据位置。
3. 如果对象、当前值、权限或影响范围与本提示不一致，停止并说明差异，不要自动修正目标。
4. 等我对这张精确行动卡明确确认。确认后若任何关键字段变化，重新生成行动卡并再次确认。
5. 只提交一次。不要因为响应慢、连接中断或没有立即看到结果而重复写入。
6. 有权威成功回执时，返回对象标识、实际结果、回执或可核验位置和时间。
7. 有权威证据证明原请求未执行且不会再生效时，返回原因并生成新行动卡；修正后必须重新确认。
8. 其余情况标记“结果不明”，按完整意图身份核验。只有同时满足上一条证据门槛，且动作契约明确保证同一意图可安全重放时，才可有界重试；否则人工接管。
9. 需要补偿时，先把补偿作为一项新的高影响动作展示，说明它不能抹去原动作已经造成的通知、审计或下游影响，再等我确认。
10. 最后返回结果卡，并列出本次真实执行过的读取、写入、核验和补偿动作；未执行的不要写成已执行。
```

提示词不能替代平台授权，只让真实能力、精确意图和证据边界变得可见。

### AI、人和系统分别做什么

| 角色 | 负责什么 | 不应替谁决定 |
| --- | --- | --- |
| 业务 Owner | 决定目的、风险和是否批准补偿 | 不判断提供方响应是否代表技术成功 |
| 确认人 | 核对精确行动卡并通过或驳回 | 不用一次确认覆盖后来变化的对象或范围 |
| AI 助手 | 组织行动卡、解释证据、在结果不明时先安排权威核验 | 不从响应速度猜成功或失败 |
| 获授权 Agent | 只用当前 Catalog 中允许的动作，按确认内容提交一次并保存回执 | 不自行扩大权限、换目标或重复写入 |
| 外部系统 | 保存权威状态并返回可用证据 | 不替 Loop 决定业务批准权 |
| 恢复 Owner | 处理长期无法核验、补偿和人工接管 | 不把“停止 Run”当成已经撤销外部影响 |

<!-- slot: 配置 -->
### 行动前固定九项内容

行动卡至少包含：

1. **业务目标**：为什么必须写入，而不是只读或人工处理。
2. **精确对象**：系统、资源类型、对象标识和当前版本。
3. **期望变化**：从什么值变成什么值，以及明确不应改变什么。
4. **完整意图身份**：对象、来源批准版本或业务事件、期望变更。
5. **执行身份**：使用哪个已授权 App/Extension，以及最小权限范围。
6. **影响范围**：接收人、下游处理和业务承诺。
7. **确认范围**：谁确认了哪一版行动卡；哪些变化会使确认失效。
8. **恢复路线**：怎样读回权威状态、谁决定补偿、何时转人工。
9. **证据位置**：确认、回执、外部对象链接和结果卡保存在哪里。

不要假设通用 Extension 自动提供业务幂等、请求编号或可重放回执。
真实契约证明不了时，应由实现者补齐或留给人工。

<!-- slot: 审批 -->
### 确认不是一张永久通行证

确认只覆盖精确对象、动作、当前与期望状态、权限和影响范围。
对象版本、权限、接收人或发布性质变化后，旧确认失效。

在 Workflow 内使用 `request_approval` 时，通过和驳回是两条明确路线；审批没有创作期自动响应时限。
团队若规定响应时限，应把提醒和人工接管写进运营约定，不能把等待解释成默认通过。

审批通过后，外部写入仍由后续 `send_message` 交给 Agent。
如果 Agent 已执行但 callback 内容不符合约定字段，修正的是回调内容，不是再执行一次外部写入。

<!-- slot: 异常 -->
### 结果不明时怎样恢复

| 现象 | 当前能下的结论 | 安全处置 |
| --- | --- | --- |
| Catalog 中没有所需动作 | 当前 Agent 不能执行 | 停止，回到第 20 章补需求卡或请管理员配置 |
| 行动卡生成后对象版本变化 | 原确认不再覆盖当前对象 | 丢弃旧行动卡，读取新状态并重新确认 |
| 提供方明确拒绝，且权威证据证明未执行、不会再生效 | 本次未产生目标副作用 | 修正输入或权限，生成新行动卡并重新确认；契约不保证同一意图安全重放时仍交人工 |
| 请求没有明确响应 | 可能成功、排队或未执行 | 标记结果不明；按完整意图身份读取权威状态 |
| 权威状态已是期望值 | 不需要再次写入 | 保存对象和回执证据，记录为已核验成功 |
| 权威状态仍是原值，但无法证明请求未被排队 | 仍不能安全重放 | 保持停止，交恢复 Owner 或提供方核验 |
| 受到限流或暂时不可用 | 只能说明当前无法取得结果 | 只读查询可有界退避；写入仍执行“未执行且不会生效 + 契约允许”的门槛 |
| Run 已停止，但外部通知或变更已发生 | 停止没有撤销外部结果 | 保留既有结果；需要恢复时另建补偿行动卡 |

补偿不是数据库回滚。
撤回邮件仍可能被看到，恢复权限也不会删除既有审计。
因此补偿是新的业务动作，有自己的对象、风险、意图身份、确认和证据。

### AI 应该返回哪些可见结果

| 结果卡项目 | 应显示什么 |
| --- | --- |
| 已确认意图 | 行动卡版本、确认人、时间和完整意图身份 |
| 实际执行 | 本次 Catalog 显示的精确 Extension 名称、动作、对象与提交次数 |
| 权威证据 | 提供方回执、外部对象标识或读取到的最终状态；没有就写“未取得” |
| 结果判断 | 已核验成功、明确未执行，或结果不明；不要用 AI 自述替代证据 |
| 外部影响 | 已发送通知、已改变权限或已触发的下游处理 |
| 后续责任 | 是否需要继续核验、补偿或人工接管，以及具体 Owner |
| Workflow 边界 | 若由 Run 发起，说明停止 Run 不会撤销已经发生的外部结果 |

<!-- slot: 外部系统 -->
### 外部系统

提供方凭据由 App 连接保管，不进入提示词、Workflow 输入或卡片。
Agent 使用本次 Catalog 显示的精确 Extension 名称；读者不填写 token，也不能让 AI 猜目录之外的动作。

各提供方对版本、幂等、回执、查询一致性和补偿的支持不同。
只有当前 Catalog 与动作契约明确提供并经验证的能力，才能写进行动卡。

### 业务收益怎样衡量

选择一类真实高影响动作，连续观察至少四周或累计二十次人工确认：

- 未经精确行动卡确认就执行的次数，目标为 0。
- 因结果不明而直接重复写入的次数，目标为 0。
- 结果不明后能够在团队约定时间内找到权威状态和恢复 Owner 的比例。
- 每次动作能关联到确认、完整意图身份和外部证据的比例。

样本不足时只记录事实，不宣称达到目标；指标也不代表外部系统不会故障。

<!-- slot: 验收 -->
### 如何判断这套方法可以投入日常使用

- [ ] 高影响动作执行前会展示对象、变化、稳定身份、权限、影响和恢复责任。
- [ ] 对象版本、权限或影响范围变化后，旧确认会失效并重新确认。
- [ ] 意图身份包含对象、来源批准版本或业务事件、期望变更，换请求编号不会形成新意图。
- [ ] 没有明确回执时会标记结果不明，并先读取权威状态。
- [ ] 只有证明原请求未执行、不会再生效且动作契约保证安全重放时才可有界重试，否则人工接管。
- [ ] 补偿被当成新的高影响动作，而不是自动回滚或抹除历史。
- [ ] 结果卡能关联确认、执行、权威证据、外部影响和后续 Owner。
- [ ] 团队明白停止 Run 不会召回消息、撤销权限变化或取消已发生的外部结果。

<!-- slot: 媒体槽位 -->
### 媒体槽位

<!-- media: fig-21-01-safe-external-action.svg -->
图 21-1 高影响外部动作三路结果：成功留证；明确未执行生成新行动卡并重新确认；结果不明先核验，证据不足则人工接管。

### 小结

高影响动作依靠精确行动卡、完整意图身份、单次提交和权威证据。
没有回执先核验；补偿是新动作；停止 Run 不撤销外部影响。
这样团队才能保留决定权、恢复路径和审计责任。

下一篇将进入 80 个企业案例。
你会看到这些原则怎样被组合成研发、销售、客服、人力、财务和安全等真实场景中的完整 Workflow。
