Skip to main content

openclaw audit

查询 Gateway 仅包含元数据的活动账本,发现共享运行关联的执行,或检查某个确切代理执行的不可变身份上下文。 运行和工具活动记录默认启用。执行身份在全新安装和升级中默认单独禁用。请显式启用:
身份收集要求 logging.audit.enabled 保持启用状态。 消息记录也默认单独禁用;将 logging.audit.messages 设置为 directall,并重启 Gateway 以记录消息。现有记录在过期前(30 天内)仍可查询。 直接本地命令使用与 Gateway 相同的有界写入器生命周期。 openclaw agent exec 默认会删除其临时状态目录,因此其审计证据会与该隔离运行的其余内容一同被有意丢弃。 当运行状态必须保留时,请使用 agent exec --state-dir <dir>,并通过使用同一状态目录的 Gateway 对其进行检查。 该账本与会话记录不同:它记录身份、顺序、来源、操作、状态以及规范化的结果代码,但从不存储内容,而消息标识符仅以安装本地的带密钥伪名出现。审计历史负责完整的数据模型、隐私语义、存储/保留边界和覆盖范围限制;本页介绍命令界面。

过滤器

  • --agent <id>:精确的 agent id
  • --session <key>:精确的 session key
  • --run <id>:精确的 run id;除非同时设置了 --explain,否则筛选 activity
  • --execution <id>:精确的 execution id;需要使用 --explain
  • --kind <kind>agent_runtool_actionmessage
  • --status <status>startedsucceededfailedcancelledtimed_outblockedunknown
  • --direction <direction>:消息方向,inboundoutbound
  • --channel <channel>:精确的消息 channel
  • --after <timestamp> / --before <timestamp>:包含边界的 ISO 时间戳或 Unix 毫秒时间戳
  • --limit <count>:activity 页面大小,范围为 1 到 500(默认为 100);decision 页面大小范围为 1 到 100;使用 --explain 时,模糊 execution 候选页面大小范围为 1 到 50(默认为 50
  • --cursor <sequence>:继续获取 activity、decision 或模糊 execution 候选页面
  • --explain:检查不可变的 execution identity 和 run-admission reasoning; 需要且只能指定 --run--execution 其中之一,并且仅接受 --limit--cursor--json
  • --json:以 JSON 格式输出分页结果
CLI 会查询带版本的 activity RPC,因此一个命令就能显示完整的 已配置 ledger。文本输出会显示时间、kind、direction、channel、status、 agent、run 和 action。缺失的 message provenance 会显示为 -;OpenClaw 不会虚构 agent 或 run ids。Tool actions 也会显示工具名称。JSON 输出在存在下一页时包含 nextCursor。将该值传给 --cursor,即可在分页过程中继续而不会重新排序新到达的记录。 这些导出即使没有消息正文和原始消息标识字段,仍然属于敏感的运维元数据。Agent、session 和 run ids、时间信息、 channels、结果以及稳定的 HMAC 引用都可能关联活动。请像对待其他操作员记录一样,使用相同的访问控制和保留实践来保护它们。 Gateway 会有意向其操作员域中拥有 operator.read 权限的每个客户端公开保留的 execution identity 诊断信息。该范围是受信任的只读边界,而不是面向恶意多租户的隔离机制。当操作员之间不应共享审计身份数据时,请使用独立的 Gateway 信任域。

发现并解释执行

每个获准的外部回合都会获得一个不透明的 executionIdcontextId 标识其不可变的证据记录;现有的 runId 仍可能是共享的会话、路由或恢复关联标识。使用 --run <id> --explain 来发现保留的执行,而不是查询尽力而为的活动列表。一个匹配项会直接解析。多个匹配项会返回 ambiguous,列出最多 50 个候选项,并要求你明确选择其中一个:
OpenClaw 绝不会静默选择第一个或最新的执行。精确文本视图会呈现以下部分:
  1. 身份:信任域、调用方、入口、代理主体、代理定义、运行时实例、所代表的主体以及发起方
  2. 权限:适用的授权和保证证据
  3. 谱系:父上下文,或明确的缺失、未知或不支持状态
  4. 决策:有界的运行准入和权威操作决策回执,包括终止的操作员批准
  5. 缺失证据后续步骤
每个字段都包含 presentabsentunknownunsupported;CLI 不会根据会话密钥、设备 ID、显示名称或共享凭据推断用户。直接本地运行当前会显示权威的 local-cli 入口、缺失的调用方,以及 unattributed 覆盖范围。其准入回执显示为 not-applicable,因为没有证明存在基于身份的策略或授权评估。 对于 Gateway 运行,已解析的经过身份验证的配置文件可以使调用方显示为 present,覆盖范围显示为 attribution-only。配对设备和共享凭据无法证明某个具体人员:没有持久配置文件时,调用方保持为 absent;如果经过身份验证的用户证据承诺存在某个配置文件但无法解析,则调用方保持为 unknown。会话创建会保留当前规范的持久配置文件 id,因此配置文件关联不会使所有权失去归属;而运行检查使用的是连接时不可变的审计事实。普通会话来源信息不会存储显示标签。只有在明确启用该审计存储后,执行身份中才可以保留可选的、有界且已去除机密信息的标签。 终止批准回执会显示 alloweddenied、其稳定的原因代码、强制执行状态、权威来源边界、策略和授权引用、所使用的上下文字段以及修复措施。过期和已取消的批准属于被拒绝的非操作,并具有不同的原因代码。只有当批准所有者记录了终止状态时,no-route 才是强制执行的拒绝。损坏的批准为 unknown。文本视图将 operator_approvals 标记为由所有者原生维护的 SQLite 记录,保留 30 天;JSON 会保留相同的来源所有者和记录引用,不进行有损重格式化。 enforced 要求批准的不可变所有者本地绑定与所选上下文、执行和运行完全匹配。缺失、格式错误或不匹配的绑定会分别报告 operator_approval_execution_link_missingoperator_approval_execution_link_malformedoperator_approval_execution_link_mismatch,覆盖范围为 unknown,且不包含授权引用。检查器绝不会根据 runId、会话元数据、时间戳或保留执行的数量重建该绑定。 JSON 输出是未经有损重格式化的 Gateway 结果。精确结果包含一个有界的 V1 上下文(最大 16 KiB)、最多 100 个决策回执、覆盖范围和缺失证据代码,以及可选的 nextDecisionCursor。模糊运行结果则包含最多 50 个执行候选项和可选的 nextExecutionCursor。敏感的域、运行时、调用方、保证、入口来源和授权引用均为安装本地的 HMAC 投影。已配置的代理 id 和精确的运行 id 仍然可见,上下文和执行 id 也同样可见,因此重定向的输出仍属于私有操作员数据。 较旧的 Gateway 会产生带有 gateway_upgrade_required 的明确 unsupported 结果,并给出升级后重新运行的后续步骤。CLI 绝不会从旧版审计行重建身份。当前的 Gateway 会区分未知运行、功能尚不可用、已禁用或上下文写入失败、上下文已过期,以及上下文损坏等情况;不会声称缺失的尽力而为活动证明执行从未发生。新近获准的运行也可能暂时不可用,因为其有界身份信封正在等待进入审计写入器队列;请在运行结束后或正常进程关闭后重试检查。准入过程绝不会等待写入器就绪、架构或 HMAC 密钥初始化、SQLite 或持久化完成。 一旦上下文超过 30 天,CLI 不会返回其中的任何字段或关联决策。在有界清理待处理期间,结果为 unsupported,并提供过期后重新运行的后续步骤。清理完成后,如果没有单独保留的活动,结果可能变为 unknown;这种缺失不证明运行未发生。启动时和每小时的维护任务每次最多清理 1,024 个身份上下文,并且即使收集功能已禁用也会继续执行。队列饱和、工作器/存储故障、清理失败或进程意外终止都可能丢失尽力而为的证据,但绝不会阻塞或中止代理运行。只要其写入器生命周期允许,正常的 Gateway 和直接本地 CLI 关闭都会刷新已接受的工作。

记录的事件

网关将受信任的生命周期流投影为六种动作:
  • agent.run.started
  • agent.run.finished
  • tool.action.started
  • tool.action.finished
  • message.inbound.processed
  • message.outbound.finished
每条返回记录都具有稳定的事件 id、单调递增的账本 sequence、生命周期时间戳、actor、action、status、 schemaVersion: 1 标记、源 sequence 以及 redaction: "metadata_only"。 仅当受信任来源提供时,才会包含 Agent/session/run 来源信息和事件特定字段。消息记录会有意省略 sessionKeysessionId,因此 --session 只会筛选 run 和 tool 记录。 终止态的 run 和 tool 记录通过已闭合状态和错误代码来区分成功、失败、取消、 超时和策略阻止。unknown 是一种显式的非成功结果,用于上游运行时未暴露权威终止结果的情况。工具调用 id 仅作为稳定指纹导出。工具名称必须匹配紧凑的、面向模型的名称 契约;其他值将变为 unknown 消息记录会补充方向、通道、会话类型、结果,以及可选的投递类型、失败阶段、持续时间、结果数量、标准化原因代码和带键的 account/conversation/message/target 伪名。当前的 inbound 边界涵盖到达核心分发的已接受消息, 包括核心重复处理和终止处理结果。outbound 边界会为每个到达共享持久投递的原始逻辑回复负载写入一条终止行; 分块和适配器扇出会在 resultCount 中聚合。排队重试或含糊不清的发送,仅在确认、死信或对账使结果终止后才会记录。绕过这些共享边界的插件本地和直接发送路径尚未覆盖;没有记录并不证明不存在消息。 审计账本并不取代 transcripts、task history、cron run history 或 logs。它提供了一个小型的跨运行索引,便于运维人员提问,而不会把会话内容复制到另一个存储中。 对于 inbound 行,durationMs 衡量核心分发,resultCount 统计已最终确定的排队 tool、block 和 reply 负载。对于 outbound 行, durationMs 包括直到其终止状态的投递所有权(因此也包括排队等待时间),而 resultCount 统计已识别的物理平台发送次数。deliveryKind 在存在时,描述的是钩子处理后、渲染后的有效负载;被抑制和崩溃歧义的行会省略它。

网关 RPC

audit.activity.list 需要 operator.read,并接受相同的筛选条件。它 返回命名的 V1 活动事件联合类型,包括 run、tool、inbound-message 和 outbound-message 记录。
结果为 { "events": AuditActivityEventV1[], "nextCursor"?: string }。 结果按最新优先排序,并且每次请求限制为 500 条记录。 audit.run.inspect 同样需要 operator.read
其结果为 { "schemaVersion": 1, "run": ..., "identity": ..., "decisions": ..., "coverage": ..., "nextDecisionCursor"?: ..., "nextExecutionCursor"?: ... }。 闭合请求必须且只能指定 executionIdrunId 其中之一。 decisionLimit 的范围为 1–100,decisionCursor 为可选项。运行发现还接受范围为 1–50 的 executionLimit 和可选的 executionCursor。具有多个保留执行的运行会返回类型化的 ambiguous 身份状态,在调用方选择 execution id 之前不会返回身份上下文或决策。对于选定的单个上下文,回执分页会先从准入开始,然后读取所有者原生的终止批准,最后读取没有原生持久记录的边界所对应的通用事实。批准检查绝不会写入重复的通用记录。通用事实写入和投影同样要求完整的上下文、执行和运行元组与不可变执行上下文匹配。 活动账本仍然是尽力而为的。相比之下,返回的批准回执来自权威的先回答者获胜批准行,返回的通用回执来自附加式不可变决策事实表。三个表面都使用 30 天保留期,但活动账本中缺少记录不能证明批准或操作没有发生。在有界工作器写入持久化该行之前,通用事实的交付同样是尽力而为的;所有者原生的批准持久化不使用该队列。 为兼容旧版运行/工具客户端,已发布的 audit.list RPC 保持不变。当 较旧的 Gateway 不支持 audit.activity.list 时,CLI 仅在所请求的每个筛选条件 都受该旧方法支持的情况下重试 audit.list。在较旧的 Gateway 上,--kind message--direction--channel 会提示升级,而不会被静默丢弃。

相关