# Flight Recorder (플라이트 레코더)

*실행마다 하나, 해시로 연결되며 읽은 것까지 담는 기록.*

> **Flight Recorder**는 실행마다 남기는, 추가만 가능하고 해시로 연결된 기록입니다. 실행이 읽은 것(읽기 매니페스트), 쓴 것, 허용되거나 거부된 것, 누가 무엇을 승인했는지를 담습니다. 데이터 곁에 놓여 하나의 질문에 답합니다. “무엇이 이 변경에 영향을 줬을 수 있는가?”

**AN-03** · 적합성 수준: L1 Authority · 그룹: 작업

## 해결하려는 문제

사후 분석을 하려 해도 로그는 흩어져 있고, “읽은 것”과 그 뒤에 이어진 동작 사이의 연결이 없으며, 로그는 같은 관리자나 심지어 같은 에이전트가 고칠 수 있습니다.

더 근본적으로는, 병합이나 메모리가 오염되었다고 의심될 때 “그 실행은 무엇을 읽었는가?”에 답할 방법이 없습니다.

## 동작 방식

- **두 종류의 내용.** *이벤트*는 하나씩 기록합니다. 커밋, 리스의 발급과 취소, 게이트 요청과 결정, 정책 거부, 파생, 망각. *읽기 매니페스트*는 실행 단위로 모아 둡니다. 어떤 path@commit, 어떤 범위, 어떤 콘텐츠 해시를 읽었는가. 읽기 호출마다 기록하지는 않으며 내용은 절대 기록하지 않습니다.
- **모든 커밋은 출처 메타데이터를 담습니다.** `principal`, `on_behalf_of`, `run`, `lease`, `purpose`, 그리고 읽기 매니페스트에 대한 참조.
- **해시 체인**(하루 단위). 선택적으로 서명과 외부 앵커링(두 번째 노드, 오브젝트 잠금이 있는 버킷)을 더합니다. 목표는 “변조가 불가능하다”가 아니라 “**변조를 탐지할 수 있다**”입니다.
- **내보내기:** OpenTelemetry GenAI 스팬, JSON Lines, 또는 SIEM으로.
- **프라이버시:** 기본적으로 메타데이터만 기록하고 내용은 기록하지 않습니다. 기록의 보존은 내용의 삭제와 독립적이며, 기록 자체에도 접근 통제가 걸립니다.
- **`explain(commit)`:** 그 커밋 뒤에 있는 실행, 리스, 게이트 결정, 읽기 매니페스트, 입력을 반환합니다.
- **먼저 기록하고, 그다음에 실행합니다.** 중대한 작업은 먼저 의도 기록을 남겨야 합니다.

## 작게 시작하기

- 추가만 가능한 SQLite 테이블과 일일 해시.
- 모든 커밋 메시지에 `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에 남아 리스와 라벨로 보호됩니다.

### 여기서 “변조 증거(tamper-evident)”란 무슨 뜻인가요?

**변조를 탐지할 수 있다**는 것만 약속합니다. 기록은 해시로 연결되어 있어 하나를 바꾸면 체인 검증이 깨집니다. 외부 앵커링(두 번째 노드나 오브젝트 잠금이 있는 버킷)이 있으면 root 권한을 가진 관리자에게도 견딥니다. 앵커링이 없으면 관리자는 여전히 로그 전체를 파괴할 수 있습니다.

### 왜 읽기를 기록하나요?

위험은 흔히 읽기에서 오기 때문입니다. 웹 페이지를 읽은 세션이 그 뒤에 오염된 노트를 쓸 수 있습니다. 읽기 매니페스트가 있으면 나중에 “무엇이 이 변경에 영향을 줬는가?”에 답할 수 있습니다.

## 관련 개념

- [Capability Lease (권한 리스)](https://agentnas.com/ko/concepts/capability-lease/): 한 번의 실행을 위한 좁은 인가. 만료 시점과 예산이 있고, 하위 리스는 더 좁아지기만 합니다.
- [Trust Labels (신뢰 라벨)](https://agentnas.com/ko/concepts/trust-labels/): 작은 라벨 두 개와 세션 오염으로 Rule of Two를 강제합니다.
- [Cascade Forget (연쇄 망각)](https://agentnas.com/ko/concepts/cascade-forget/): 계보를 따라 파생물을 삭제하고, 이력은 보존 등급으로 다루며, 하지 못한 일을 보고합니다.

---

표준 URL: https://agentnas.com/ko/concepts/flight-recorder/
최종 수정: 2026-11-11 · 명세 초안 v0.2 · CC BY 4.0
