# Flight Recorder (飞行记录仪)

*以运行为单位、哈希链接的记录，包括这次运行读过什么。*

> **Flight Recorder（飞行记录仪）** 是以运行为单位、只追加、哈希链接的记录：这次运行读了什么（读清单）、写了什么、被允许或拒绝了什么、谁批准了什么。它存放在数据旁边，用来回答“这个改动可能受到了什么影响”。

**AN-03** · 符合性等级: L1 Authority · 概念簇: 工作

## 要解决的问题

事故复盘时，日志散落各处；“读取”与随后的动作之间没有关联；日志可以被同一位管理员，甚至同一个智能体修改。

更根本的是：当一次合并或一条记忆被怀疑受到污染时，没有办法回答“那次运行读过什么”。

## 工作方式

- **两类内容。** *事件*逐条记录：提交、租约签发与撤销、闸门请求与决定、策略拒绝、派生、遗忘。*读清单*（read manifest）按运行聚合：读过哪些路径@提交、哪些范围、内容哈希；不记每一次读取调用，也不记内容。
- **每个提交带来源元数据：** `principal`、`on_behalf_of`、`run`、`lease`、`purpose` 和读清单引用。
- **哈希链**（按天），可选签名与外部锚定（第二个节点、带对象锁的桶）。目标是“**篡改可以被发现**”，而不是“无法篡改”。
- **导出：** OpenTelemetry GenAI spans、JSON Lines，或接入 SIEM。
- **隐私：** 默认只记元数据，不记内容；记录的保留与内容的删除互相独立；记录本身受访问控制。
- **`explain(commit)`：** 返回这次提交对应的运行、租约、闸门决定、读清单与输入。
- **先记录，后生效：** 有后果的操作必须先写入意图记录。

## 从小处开始

- 一张追加写的 SQLite 表，加上每日哈希。
- 在每个提交信息里写 `Run:`、`Lease:` 之类的 Git trailer。
- 导出 OpenTelemetry spans，接入你已有的观测栈。

## 接口草图

仅作示意。字段名在规范 v0.3 之前可能调整。

*record.json*

```json
{
  "seq": 18211,
  "time": "2026-11-12T09:14:22Z",
  "kind": "commit",
  "run": "run_91ab",
  "principal": "agt_cleo",
  "on_behalf_of": "usr_wei",
  "lease": "lse_7Qk3",
  "purpose": "Draft the Q4 release notes",
  "subject": { "path": "/shared/launch/notes.md", "commit": "91ce3a7" },
  "read_manifest": "rm_5d2e",
  "decision": { "effect": "allow", "rule": "r-17" },
  "taint": { "external": true, "sensitivity": "private" },
  "prev_hash": "sha256:b3a0..."
}
```

## 规范的要求

- 有后果的操作**必须**在生效之前写入意图记录；写入失败时，操作**必须**失败。
- 每次运行**必须**有读清单，记录读过的路径、提交与范围（不含内容）。
- 记录**必须**哈希链接，并且**必须**能用公开的命令校验。
- `explain(commit)` **必须**返回运行、租约、闸门决定与读清单引用。
- 记录的保留**必须**独立于内容的删除。

## 借鉴与区别

下面这些都是现成的零件。**真正新的部分是读清单：** 把“读”变成一个可追溯的输入集合，使“被污染的合并”和“被投毒的记忆”可以复盘。

- [OpenTelemetry GenAI conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/)
- [Certificate Transparency](https://certificate.transparency.dev)
- [Sigstore Rekor](https://docs.sigstore.dev/logging/overview/)
- [Git trailers](https://git-scm.com/docs/git-interpret-trailers)

## 坦诚的局限

- 没有外部锚定时，拥有 root 的管理员仍然可以毁掉日志。
- 记录本身含有敏感的元数据，必须受控。
- 读清单的粒度是存储成本与可追溯性之间的折中。

## 开放问题

- 高吞吐下读清单的存储成本如何控制？
- 跨节点的记录如何合并与校验？

## 常见问题

### 它会记录智能体读到的内容吗？

默认不会。记录里只有路径、提交、范围与内容哈希，足以指回原始数据，又不会把敏感内容复制进日志。内容仍然在 Store 里，受租约与标签保护。

### “防篡改”是什么意思？

我们只承诺**篡改可以被发现**：记录是哈希链接的，改一条就会让链校验失败；配合外部锚定（第二个节点或带对象锁的桶），可以抵御拥有 root 的管理员。没有锚定时，管理员仍可整体销毁日志。

### 为什么要记“读”？

因为风险常常来自读取：一次读了网页的会话，随后写进的笔记就可能被污染。读清单让你事后能回答“这个改动受到了什么影响”。

## 相关概念

- [Capability Lease (能力租约)](https://agentnas.com/zh-cn/concepts/capability-lease/): 发给一次运行的、有期限与预算的窄域授权；子租约只能更窄。
- [Trust Labels (信任标签)](https://agentnas.com/zh-cn/concepts/trust-labels/): 来源与敏感度两个小标签，加上会话污点，强制执行 Rule of Two。
- [Cascade Forget (级联遗忘)](https://agentnas.com/zh-cn/concepts/cascade-forget/): 沿血缘删除派生物，按保留类处理历史，并如实报告做不到的部分。

---

规范网址: https://agentnas.com/zh-cn/concepts/flight-recorder/
更新于: 2026-11-11 · 规范草案 v0.2 · CC BY 4.0
