记录、历史与撤销
Action Log 把每次成功的提交变成对象;编辑历史给出改前改后;撤销的条件,以及在 AIDC 里怎样纠错。

本课目标
读完这一课,你将能够
- 说出 Action Log、编辑历史和指标各回答什么问题
- 用命令查出一次修改是谁做的、改前改后是什么
- 说出撤销的条件与限制,在 AIDC 里选对纠错办法
三个问题,三种记录
上一节说的副作用在事务之外。这一节看事务之内留下的东西。改完数据之后,人们会问三类不同的问题,答案在三个不同的地方:
动作记录(Action Log)
做了什么决定:谁、什么时候、带着什么参数、改了哪些对象。每次成功提交生成一个日志对象。
编辑历史
这个对象每一次是怎么变的:改前是什么、改后是什么、哪次操作改的。
指标
这个 Action 成功了多少次、失败了多少次、慢不慢。
还有两个问题:怎么撤销,以及失败变多时怎么知道。它们放在最后一节。
Action Log:把决定变成对象
写了 actionLog: true 的 Action,每次成功提交,都会在同一个事务里多写一个日志对象,类型名是 log. 加 Action 名。它和别的对象一样:能查、能统计、能放进看板。属性有操作 id(也是它的主键)、Action 类型 id 与版本、时间、执行人、改了哪些对象的主键、一句话摘要,还有这个 Action 的参数值。
参数值也进日志,这一点很有用。hold-work-order 的 reason 没有写进任何工单属性,但它在 log.hold-work-order 里,事后能查到「为什么暂停」。
aidc semantic objects log.hold-work-order --order-by timestamp:desc --page-size 5
aidc semantic aggregate log.confirm-order --select '{"$count":"unordered"}' --group-by '{"userId":"exact"}'
第一条列出最近五次暂停;第二条按执行人统计确认过多少订单。要记住三条边界:日志只记成功的提交,失败的不记;不经过 Action 的改动,比如开发者直接写数据,不产生 Action Log;开启日志之前发生的 Action 不会补记。
编辑历史:一个对象的履历
Action Log 按 Action 记,编辑历史按对象记。要看一张工单是怎么一步步变成现在这样的:
aidc semantic edits-history workOrder --pk WO-2001 --previous --json
每条记录带着操作 id、执行人、时间和这次改了什么;加上 --previous,用 --json 输出时还会带出改前的属性值。操作 id 和 Action Log 里的操作 id 对得上:先从日志看「这次决定是什么」,再从编辑历史看「对象具体怎么变了」。在 /semantic 的对象视图里,「编辑历史」就是同一份数据:谁、什么时候、从什么改成什么、通过哪个 Action。
撤销与指标
通用做法里的撤销很窄:
- 「撤销」只出现在执行成功后的那条提示里,只有执行人本人能点。
- 只有这次 Action 是该对象最近一次编辑时才能撤销,之后哪怕改了别的属性也不行。
- 只退回对象上的编辑,通知和 Webhook 不会被撤销。
- 删除类 Action 错过那条提示,就没有简单的补救办法,所以删除要格外小心。
指标回答的是另一类问题:最近 30 天成功了多少次、失败了多少次、耗时的第 95 百分位是多少。失败分几类:参数不合格、超出规模上限、没通过提交条件、副作用失败、Function 失败、并发冲突。监控规则在耗时或失败次数超过阈值时发出告警。
有一个坑要提前想到:提交条件也会挡住纠错。report-output 要求累计合格数不能少于已报的数,报成 1200 想改回 120,就被拦下。所以在设计时就要留一条纠错通道:单独的纠错 Action,只给 editor 用,条件放宽,但必须写原因。
最后一节讲事务:批量、并发和上限,以及规则表达不了时该怎么办。
要点
- Action Log 记「做了什么决定」,编辑历史记「对象怎么变的」,指标记「成功和失败了多少」。
- 日志对象叫
log.加 Action 名,参数值也在里面,能查、能统计;只记成功的提交。 - 编辑历史用
aidc semantic edits-history查,加--previous并用--json输出,就带出改前的值。 - AIDC 目前没有撤销按钮和单独的 Action 指标页。纠错优先用反向 Action;
--revert只适用于开放直接编辑的类型。外部系统另行纠错。
练一练
查一次修改,设计一条纠错通道
前两个任务在你有权限的组织里做,只读,不会改任何数据。
找一个开了 actionLog 的 Action,运行 aidc semantic objects 查它的日志对象(把上面的 log.confirm-order 换成你自己的 Action 名),按 timestamp 倒序取三条,读 userId 与 summary。
任选日志里的一条,记下它的操作 id,再对它涉及的对象运行 aidc semantic edits-history,加 --previous 与 --json。在结果里找到同一个操作 id,比较改前改后。
为 report-output 设计一条纠错通道:谁可以用、放宽哪条提交条件、要不要必填「原因」参数、日志里要能看出这是一次纠错。写成一页设计说明。
小测
选一个答案,马上看解析。
Q1想知道「上周谁把哪些工单暂停了、为什么」,最直接的是哪一个?
Action Log 按决定记录,带执行人、时间和参数值,还能统计。编辑历史按对象记,指标只有次数与耗时。
Q2一次 Action 因为提交条件不满足被拒绝,Action Log 里会有一条记录吗?
日志与修改同一个事务,被拒绝的请求根本没有修改,也就没有日志。
Q3工单累计合格数被误报成 1200,report-output 的提交条件挡住了改小。在 AIDC 里合适的做法是?
新 Object Type 缺省只能经 Action 改。--revert 需要类型开放直接编辑。writeback 可改外部系统,但语义层纠错不会自动撤销外部改动。