想让数字员工把流程跑通,又不接受它直接改数据、给客户发消息然后撤不回来,通常不是把自动化关掉,而是按每个动作能不能撤回做分级:可逆的放开自动执行,不可逆的在流程里停下来等人确认,确认结果写进任务记录。StaffDeck 刚上线这个阶段,建议先只放开只读查询和可撤销的写入,把删除、覆盖、对外发送、发起审批或付款、改权限这类动作一律挂人工确认,等确认点和记录在实际任务里跑顺了,再按具体情况收窄或放宽。
StaffDeck 上线初期值得守的一条线:自动执行的范围由动作可逆性决定,不由动作出现频率决定。只读查询和带明确反向操作的可撤销写入可以自动跑;一旦动作生效后无法自行还原、或已经对外可见,就必须在流程里插入人工确认,并默认超时即拒绝。确认人、时间、动作对象和结果要落到任务记录里,能被检索出来。边界是否真生效,用一次撤回演练验证,而不是凭配置页上写了什么。
把数字员工能做的动作按可逆性分成三档
先有分级标准,才谈得上哪些能自动、哪些要拦。判断一个动作属于哪一档,建议看三件事:动作生效后能不能由系统自己恢复原状;恢复时是否需要外部配合,例如对方已经把消息读走、下游已经把数据消费掉;恢复的时间成本是否可接受。三条里只要有一条不满足,就不要往自动执行里放。
| 档位 | 判断标准 | 典型动作 | 上线阶段处理 |
|---|---|---|---|
| 只读查询 | 不改变任何状态,重复执行无副作用 | 查订单、拉报表、看库存、检索知识库、读配置 | 放开自动执行 |
| 可撤销的写入 | 有明确的反向操作,反向操作本身不需要外部配合,且在被消费前能撤回 | 写内部草稿、打标签、写入暂存表、修改尚未被下游引用的字段 | 可自动执行,但要留快照和反向操作入口 |
| 不可撤销的写入 | 生效后无法自行还原,或已经对外可见、已经触发后续流程 | 删除或覆盖生产数据、给客户发消息、提交审批、发起付款、改权限、改路由规则 | 强制人工确认,默认拒绝自动放行 |
容易误判的是“技术上能改回来”不等于“可撤销”。比如一个字段能被改回原值,但下游任务已经按新值跑过一轮,撤回的只是表面状态,副作用还在。这类动作按不可撤销处理更稳妥。分级结果建议直接写进 StaffDeck 的动作配置里,用白名单放行只读和低风险写入,其余默认走确认,而不是反过来列黑名单——漏配一个动作,代价比多拦一次大。
为不可逆动作设置人工确认的前置条件
确认点要放在动作真正执行之前,让流程在那一格停下来等人,而不是执行完了再通知。触发条件建议按下面几类组合,任何一条命中就走确认:
- 动作本身被分级为不可撤销写入;
- 影响范围超出阈值,例如改动行数、涉及金额、收件人数量、涉及的主键数量超过设定值;
- 目标对象带生产环境标识,或不在允许自动执行的对象清单里;
- 同一任务在短时间内重复触发同一个不可逆动作,可能是重试或逻辑打转。
下面是一段通用的配置骨架,字段名按 StaffDeck 实际提供的配置项替换,用来说明要拦什么、要展示什么、超时怎么处理,不是可直接粘贴的官方配置:
action_policy:
action: "notification.send" # 具体动作标识,按平台实际命名替换
tier: "irreversible" # read_only | reversible | irreversible
require_confirm: true
confirm_items: # 确认页需要展示的信息项
- initiator # 发起人 / 发起任务
- target_summary # 动作对象摘要:库表 + 主键范围,或消息目标
- diff # 变更前后值对比
- impact_count # 影响对象数量
- executed_at # 计划执行时间
- rollback_hint # 是否可回滚,回滚需要做什么
on_timeout: "reject" # 超时未确认默认拒绝,不放行
timeout_minutes: 30
notify: ["task_owner", "oncall_channel"]
确认页上要让人能看懂“改什么、改多少、改完能不能退”。只写一句“是否允许执行”等于把判断成本推给确认人。超时未确认的处理方式建议统一成拒绝并挂起任务,标记为待处理,同时通知任务负责人;不要设计成超时自动继续,也不要在超时后由系统代为确认。如果业务上必须继续,让人重新发起一次,比默认放行更容易追溯。
把确认过程和结果写回任务记录
出问题时最先要回答的是:谁在什么时候确认了什么、当时看到的对象是什么、结果是通过还是拒绝。任务记录里至少要落到下面这些字段,缺一项,回溯就会断在关键处:
- 任务 ID 与步骤 ID,能把确认动作定位到具体流程节点;
- 动作类型,例如删除、发送、提交、授权;
- 动作对象,写明库表与主键范围、消息目标、账号或资源标识,不要只写“相关数据”;
- 变更前后值摘要,字段多时记摘要和数量,必要时附快照引用;
- 确认人、确认时间、确认渠道(页面、审批流、接口回调);
- 确认结果,取值建议固定为通过 / 拒绝 / 超时拒绝,避免自由文本;
- 实际执行时间与执行结果,确认通过不等于执行成功,两件事分开记。
查看位置通常有两处:任务详情页的步骤日志,用来回答“这一单卡在哪、谁批的”;审计日志或操作记录页,用来按动作对象、确认人、时间范围反查。上线前建议先手动跑一条任务,确认这两处都能查到同一次确认,且任务 ID 能互相跳转。如果确认记录只存在于聊天工具的通知里,不算写回任务记录。
用一次撤回演练检验边界是否真的生效
分级和确认点写在配置里不等于生效,建议上线前在测试对象上走一遍撤回演练,专门验证“该拦的拦住了、该记的记下了”。步骤可以这样安排:
- 准备一条不可撤销动作的用例,目标指向测试库或测试账号,不要指向生产数据;
- 让数字员工按正常流程触发该动作,观察任务是否停在待确认状态;
- 此时用查询核对目标对象,确认没有被改动或没有真的发出;
- 拒绝一次,看任务是否终止、目标对象是否保持原样;
- 再通过一次,看执行结果和确认记录是否都落到任务详情与审计日志;
- 最后故意不确认,等到超时,看是否按默认拒绝处理并产生通知。
期望被拦下的动作至少包括:直接删除或覆盖生产表数据、向真实客户发送消息、批量修改权限、发起付款或提交只有人工才能撤回的审批。观察点不在页面提示,而在三个可核验的地方:任务状态是否确实停在待确认、目标对象在确认前是否真的没变、记录里是否同时有确认人和动作对象。判断标准可以设得朴素一些——任何一步出现“动作已经执行但记录里查不到确认”“超时后自动继续”,就说明边界还没生效,先把自动执行收回来再排查。演练结束后把用例保留下来,后续调整分级时重跑一遍。