事故记录与事后复盘链接 Schema¶
这页描述了智能体系统中事故评审的最小契约层:事故记录应该包含哪些字段,它如何与追踪、审批、发布和生命周期工件相连,以及哪些数据必须在遏制阶段之后仍然保留下来。
它也直接连接到书里的 Evidence Spine:从请求到发布判断,因为事故评审正是这条受治理链路必须保持完整的关键场景之一。
如果 智能体系统事故响应手册 回答的是“前几分钟和后续复盘该怎么做”,那么这页回答的是“这些内容应该以什么形式被固定下来”。
1. 为什么需要单独的事故记录¶
如果没有专门的事故工件,复盘通常会裂成几块彼此脱节的材料:
- 追踪在可观测性系统里;
- 审批历史在审计轨迹里;
- 回滚决策在聊天记录里;
- 事后复盘在文档里;
- 变更链接只能靠记忆回溯。
这种方式偶尔可以工作,但对重复事故、审计、回归更新和生命周期修正都很脆弱。
2. 核心实体¶
这套最小模式通常围绕两个实体展开:
incident_recordincident_postmortem_link
这已经足够把运营响应与生命周期修正连接起来。
3. 事故记录¶
incident_record 用来记录发生了什么、影响半径有多大,以及事件发生时哪些工件正在生效。
kind: incident_record
incident_id: inc-2026-04-09-001
title: "Unauthorized ticket_write path during onboarding run"
severity: sev2
status: contained
category: unauthorized_side_effect
detected_at: 2026-04-09T09:14:00Z
detected_by: automated_detection
agent_id: support-triage-ref
trace_id: trace-2026-04-09-001
session_id: session-2026-04-09-001
bundle_id: bundle-2026-04-07-a
change_id: chg-2026-04-07-001
rollout_wave: canary
tool_principal: svc-ticket-writer
approval_id: apr-2026-04-09-001
idempotency_key: ticket-req-2026-04-09-001
affected_surfaces:
- approval_path
- tool_gateway
- rollout_gate
containment_actions:
- force_mandatory_approval
- disable_ticket_write_v1
owner: platform-operations
这里最关键的字段是:
category,它把事故与分诊分类、评测更新连接起来;bundle_id、change_id与rollout_wave,它们把事故与发布纪律连接起来;tool_principal、approval_id与idempotency_key,它们能更快定位真实副作用,并说明重试是否可以安全匹配已经创建的对象;affected_surfaces,它提醒团队不要把问题缩减成单纯的模型输出。
重复工单线索的事故记录
在支持分流(support-triage)事故里,记录必须把 idempotency_key 和 trace_id、session_id、approval_id、tool_principal、bundle_id、rollout_wave 放在一起。否则,复盘就无法可靠地区分一次状态未知的写入和第二次真实的 create_ticket 副作用,也无法把事故转成评测/更新门禁。
规范事故案例(Canonical incident cases)
事故记录(incident record)应该为三个规范案例(canonical cases)留下不同的纠正路径(corrective paths)。支持分流(Support triage) 记录结果未知的写入(unknown write)、idempotency_key、重复工单恢复(duplicate-ticket recovery)和评测/更新门禁(eval/update gate)。内部知识助手(Internal knowledge assistant) 记录陈旧检索(stale retrieval)、来源归因缺口(source attribution gaps)、记忆污染(memory contamination)、访问控制违规(access control breach)和知识来源修复(knowledge provenance repair)。事件协调(Incident coordination) 记录升级延迟(escalation delay)、通知副作用(notification side effects)、响应归属缺口(response ownership gap)、交接失败(handoff failure)和事件后学习更新(post-incident learning update)。
漏洞审核路径扩展¶
这个参考 Anthropic CVD 的建议契约仅在确有事件时将 finding_id 关联到 incident_id:并非每个候选项都是事件。这是文档模式扩展,不是参考运行时已实现的字段。
| 字段 | 含义 |
|---|---|
finding_id, duplicate_of, discovered_at | 稳定的发现项、重复关系及队列起点 |
review_requested_at, review_events[] | 进入审核队列;审核者、独立性、时间、代码版本、结论和受保护的证据链接 |
disclosure_events[] | 接收者、时间、报告链接及发送时的 route_at_send: independently_reviewed / direct_unreviewed |
maintainer_response | 回复时间和内容,与有效性判断分开 |
severity_assessments[] | 级别、评估者、时间和适用范围 |
remediation | unknown / pending / patched / wont_fix、补丁版本或提交、时间及证据;风险接受需责任人与理由 |
deployment_verification | 受影响资源、已安装版本、时间和回归结果;未知资源不视为已修复 |
as_of, evidence_access_policy | 数据时效及访问、披露限制 |
null 表示缺少信息,不代表否定结论。保留迟到和相互矛盾的评估;发送报告、收到回复或分配 CVE 都不能证明独立审核。一项发现可对应多个公告。
以下是建议的检查场景,本次未执行:
- 直接报告并收到维护者回复,但无独立审核:该记录不进入独立审核分母;后续审核增加事件,不改写发送历史。
- 未收到回复但补丁已发布:有证据即可记录上游修复,但在验证部署前不得关闭本地风险。
- 一个缺陷同时有 CVE、GHSA、重复报告且安装情况未知:指标按唯一发现项计数;发布不能变成安装证明。
建议扩展:证据包与负面结果¶
灵感来自 Cloudflare Managed Defense;以下字段由本书建议,不是供应商 API 或已实现的运行时模式。
evidence_package_id、package_version、package_digest、investigation_id、tenant_id、subject、scope、window_start、window_end、collected_at、policy_version固定快照边界。每个来源记录 API/查询版本、参数、观察时间、原始产出物引用和coverage_gaps。check_id、claim_id、query_ref、execution_status(completed | timeout | unavailable | denied)、match_count、coverage_ref和evidence_refs描述具体检查。match_count: 0只能用于已完成查询,不能替代错误;截断结果必须明确标记不完整。negative_evidence_state:not_checked | checked_no_match | absence_supported。仅用于相应的负面或未知结果;正向发现单独保存。absence_supported需要可验证的断言与范围/窗口绑定及充分覆盖证据,而不仅是零计数。citation_validation与claim_support_review分开;后者记录复核者/方法、结果和理由。其他租户、案件或证据包版本中的有效引用仍然不合法,无论文本多么可信。模型接收内容前先检查权限;允许的跨租户聚合需要单独的准入策略。recommendation_status(supported | insufficient_evidence | needs_review)及不作建议的原因不能替代事故状态。证据不足既不表示误报,也不授予行动权限。
重新获取数据应创建与旧版本明确关联的新证据包版本,而不是改变旧结论的输入。按访问、最小化和保留政策保存产出物;摘要不授予权限,也不保证真实性。重放还需记录模型、提示和复核者版本。四个建议场景见事故协调案例。
4. 事故事后复盘链接¶
incident_postmortem_link 把某个具体事故与纠正动作、生命周期工件连接起来。
kind: incident_postmortem_link
incident_id: inc-2026-04-09-001
postmortem_id: pm-2026-04-09-001
corrective_actions:
- change_id: chg-2026-04-09-003
- bundle_id: bundle-2026-04-09-b
- eval_dataset_update: eval-set-2026-04-09
- retirement_plan: retire-ticket-write-v1
owners:
- platform-safety
- platform-runtime
status: open
这一层的价值在于:它迫使事故评审以具体的生命周期更新结束,而不只是停留在文字总结里。
5. 它与追踪模式的关系¶
事故记录几乎总是依赖 追踪模式与事件目录:
trace_id与session_id把事故连到运行历史;- 策略事件说明什么被允许了;
- 审批事件说明是否存在人工门禁;
- 工具事件说明真实的副作用;
- 会话摘要帮助判断这是一次性运行还是更大的模式,也能看出像
failure_reason这样的失败运行导出证据是否仍然完整。
6. 它与审批和策略包的关系¶
当团队需要快速恢复这些信息时,事故记录尤其重要:
- 当时激活的是哪条审批路径;
- 做出的决策是什么;
- 哪个策略包正在生效;
- 到底是哪一个主体执行了动作。
因此事故记录模式应该紧挨着:
7. 它与变更管理和发布的关系¶
事故评审很少止步于遏制。
团队通常还要判断:
- 哪个
change_id引入了高风险路径; - 哪个
rollout_gate_record放行了它; - 哪些检查没有拦住它;
- 是否需要回滚、受限模式或退役。
这就是为什么事故记录应该和 变更评审与发布门禁模式 以及 生命周期工件模式 相连。
8. 与参考包的关系¶
agent_runtime_ref 已经具备几类能让这套模型落地的基础构件:
- 追踪与会话摘要;
- 审批队列;
- 生命周期工件;
- 发布检查;
- 策略与控制链接。
即使包目前还没有存储完整的 incident_record,书里也已经可以明确这种记录至少应包含哪些字段。
9. 最小不变量¶
成熟的事故层通常有这些不变量:
- 每个事故都有稳定的
incident_id; trace_id与session_id会立刻被保留下来;bundle_id、change_id与rollout_wave可以在不靠猜测的情况下恢复;- 遏制动作会被明确记录;
- 事故会连接到纠正动作;
- 事后复盘会推动生命周期工件、评测或策略包的更新。
10. 最常见的失败模式¶
常见问题通常包括:
- 事故工单根本不知道追踪和会话;
- 副作用看得见,但主体不清楚;
- 变更链接只能靠回忆拼出来;
- 事后复盘没有对应的纠正工件;
- 事故从不进入评测数据集或发布标准;
- 名义上已关闭的事故之后,已退役路径仍然活着。
11. 现在就该做什么¶
先过一遍这份短清单,把所有回答为“否”的地方单独记下来:
- 事故有稳定的
incident_id吗? - 团队能否快速恢复
trace_id、session_id、bundle_id和change_id? - 能看出是哪一个主体和审批路径参与了事件吗?
- 遏制动作是否被记录?
- 是否存在清晰的事故→事后复盘→纠正动作链路?
- 事故会回流到评测、发布门禁与生命周期更新吗?