# Flight Recorder (フライトレコーダー)

*実行ごとに、ハッシュでつながれた記録を残します。実行が何を読んだかも含みます。*

> **Flight Recorder** は、実行ごとに残す、追記のみでハッシュがつながった記録です。実行が読んだもの（読み取りマニフェスト）、書いたもの、許可または拒否されたこと、誰が何を承認したかが入っています。データのそばにあって、ひとつの問いに答えます。「この変更には、何が影響した可能性があるか。」

**AN-03** · 準拠レベル: L1 Authority · グループ: 作業

## 解決する課題

事後検証のとき、ログは散らばっています。「読んだこと」と、その後の行動の間には何のつながりもなく、ログは同じ管理者、ひどい場合には同じエージェントによって書き換えられてしまいます。

もっと根本的なこともあります。あるマージや記憶が汚染された疑いがあるとき、「その実行は何を読んだのか」に答える手段がありません。

## 仕組み

- **内容は 2 種類。** *イベント* は 1 件ずつ記録します。コミット、リースの発行と失効、ゲートの要求と判断、ポリシーによる拒否、導出、忘却などです。*読み取りマニフェスト* は実行ごとにまとめます。どの パス@コミット を、どの範囲で、どの内容ハッシュで読んだかです。読み取りの呼び出しを 1 回ずつ記録することはなく、内容も記録しません。
- **すべてのコミットが出どころのメタデータを持ちます。** `principal`、`on_behalf_of`、`run`、`lease`、`purpose`、そして読み取りマニフェストへの参照です。
- **ハッシュチェーン**（日単位）。任意で、署名と外部へのアンカー（2 台目のノードや、オブジェクトロックつきのバケット）を加えられます。目標は「改ざんは不可能」ではなく、「**改ざんを検知できる**」ことです。
- **エクスポート：** OpenTelemetry GenAI のスパン、JSON Lines、または SIEM へ。
- **プライバシー：** 既定ではメタデータだけで、内容は記録しません。記録の保持は、内容の削除とは独立しています。記録そのものにもアクセス制御がかかります。
- **`explain(commit)`：** そのコミットの背後にある実行、リース、ゲートの判断、読み取りマニフェスト、入力を返します。
- **先に記録し、それから実行する：** 影響の大きい操作は、まず意図の記録を書かなければなりません。

## 小さく始める

- 追記のみの SQLite テーブルと、1 日 1 回のハッシュ。
- すべてのコミットメッセージに、`Run:` や `Lease:` などの Git トレーラーを付ける。
- すでにある可観測性の基盤に、OpenTelemetry のスパンをエクスポートする。

## インターフェースのスケッチ

説明用の例です。フィールド名は仕様 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 に残り、リースとラベルによって守られます。

### ここでの「改ざんを検知できる」とは、どういう意味ですか？

約束するのは、**改ざんを検知できる** ことだけです。記録はハッシュでつながれているので、1 件を書き換えるとチェーンの検証が壊れます。外部へのアンカー（2 台目のノードや、オブジェクトロックつきのバケット）があれば、root 権限を持つ管理者に対しても成り立ちます。アンカーがなければ、管理者はログ全体を壊せます。

### なぜ読み取りを記録するのですか？

リスクはしばしば読み取りから生じるからです。ウェブページを読んだセッションが、そのあと汚染されたノートを書くことがあります。読み取りマニフェストがあれば、あとから「この変更には何が影響したのか」に答えられます。

## 関連するコンセプト

- [Capability Lease (ケイパビリティ・リース)](https://agentnas.com/ja/concepts/capability-lease/): 1 回の実行のための、期限と予算つきの狭い認可。子リースは、より狭くしかできません。
- [Trust Labels (トラスト・ラベル)](https://agentnas.com/ja/concepts/trust-labels/): 2 つの小さなラベルとセッション汚染で、Rule of Two を実現します。
- [Cascade Forget (カスケード忘却)](https://agentnas.com/ja/concepts/cascade-forget/): 系譜に沿って派生物を削除し、履歴は保持クラスで扱い、できなかったことを報告します。

---

正規 URL: https://agentnas.com/ja/concepts/flight-recorder/
更新日: 2026-11-11 · 仕様ドラフト v0.2 · CC BY 4.0
