<!-- task=cli_runtime_closeout/03_history_event_boundary plan=0 tag=REFACTOR -->

# Plan - History And Event Boundary

## 이 파일을 읽는 구현 에이전트에게

`CODE_REVIEW-local-G05.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이 필수다. 구현 후 검증 명령을 실행하고 실제 stdout/stderr를 붙여 넣은 뒤, active 파일은 그대로 두고 review ready로 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용이다.

## 배경

활성 Milestone에는 Node local execution history와 Edge event aggregation의 책임 경계 확인이 남아 있다. 코드상 Node는 SQLite `runs` 테이블에 local run 상태를 저장하고, Edge는 bounded in-process event fanout/replay를 제공한다. 이 작업은 schema나 event persistence를 바꾸지 않고 문서에서 현재 경계를 명시해 후속 Control Plane/Portal 작업이 Node DB를 직접 소유하는 방향으로 새지 않게 한다.

## 분석 결과

### 읽은 파일

- `agent-ops/rules/project/rules.md`
- `agent-ops/rules/project/domain/node/rules.md`
- `agent-ops/rules/project/domain/edge/rules.md`
- `apps/node/internal/store/store.go`
- `apps/node/internal/store/store_test.go`
- `apps/edge/internal/events/bus.go`
- `apps/edge/internal/events/bus_test.go`
- `apps/node/README.md`
- `apps/edge/README.md`
- `docs/architecture.md`
- `agent-ops/roadmap/milestones/cli-automation-runtime-stabilization.md`

### 테스트 커버리지 공백

- Node local history: `store_test.go` covers session/background fields, defaults, migration. No new code behavior is planned.
- Edge event aggregation: `bus_test.go` covers publish, drop counters, bounded replay. No new code behavior is planned.
- Documentation boundary: no test currently checks wording. Use deterministic `rg --sort path` verification.

### 심볼 참조

- renamed/removed symbols: none.

### 분할 판단

분할 정책을 먼저 평가했다. This subtask is docs-only boundary confirmation and does not depend on `01` or `02`; it is separate because code contract/smoke verification have different risk and review criteria. The final Milestone checkbox update is deferred to `04+01,02,03_milestone_closeout`.

### 범위 결정 근거

Do not change `apps/node/internal/store/store.go`, `apps/edge/internal/events/bus.go`, schema, replay capacity, A2A `TaskStore`, OpenAI/A2A input behavior, or proto contracts. The current task is to document the boundary evidenced by source and tests.

### 빌드 등급

build=`local-G05`, review=`local-G05`. Docs-only cross-domain boundary clarification with deterministic text verification and no runtime behavior change.

## 구현 체크리스트

- [ ] [REFACTOR-1] Node README에 local execution history의 현재 책임과 한계를 명시한다.
- [ ] [REFACTOR-2] Edge README에 event aggregation/fanout/replay의 현재 책임과 비영속성을 명시한다.
- [ ] [REFACTOR-3] Architecture 문서의 Node/Edge history-event boundary를 source-backed 문구로 정리한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 `CODE_REVIEW-local-G05.md`에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR-1] Node Local History Boundary

#### 문제

[apps/node/README.md](/config/workspace/iop/apps/node/README.md:21)는 `store`를 SQLite 실행 이력으로만 짧게 설명한다. [apps/node/internal/store/store.go](/config/workspace/iop/apps/node/internal/store/store.go:14)는 `runs` table이 run status 중심 local record임을 보여주지만, README에는 Edge aggregation과의 경계가 없다.

#### 해결 방법

Add a short section after [apps/node/README.md](/config/workspace/iop/apps/node/README.md:107).

Before:

```markdown
즉 CLI에 메시지를 보내는 요청 파이프라인과 이벤트 파이프라인은 논리적으로 분리되어 있고, 물리 transport만 공유한다.

## Logical Session (transport 1개 · session 여러 개)
```

After:

```markdown
즉 CLI에 메시지를 보내는 요청 파이프라인과 이벤트 파이프라인은 논리적으로 분리되어 있고, 물리 transport만 공유한다.

## Local Execution History

Node local SQLite store는 node가 직접 수행한 run의 최소 상태(`run_id`, `adapter`, `target`, `session_id`, `background`, `status`, timestamps, error)를 보관한다. 이 DB는 현재 node-local 복구/진단용 실행 이력이며 Edge event aggregation이나 Control Plane 전역 이력 저장소가 아니다. Edge와 상위 운영면은 실행 stream/event를 Edge 경유로 관찰하고, Node DB를 직접 읽는 구조를 전제로 하지 않는다.

## Logical Session (transport 1개 · session 여러 개)
```

#### 수정 파일 및 체크리스트

- [ ] `apps/node/README.md`: add `Local Execution History` section.

#### 테스트 작성

Docs-only. No Go test. Verify with deterministic `rg`.

#### 중간 검증

```bash
rg --sort path -n 'Local Execution History|Node local SQLite store|Edge event aggregation' apps/node/README.md
```

Expected: new section and boundary language are present.

### [REFACTOR-2] Edge Event Aggregation Boundary

#### 문제

[apps/edge/README.md](/config/workspace/iop/apps/edge/README.md:22)는 `internal/events`를 fanout으로 설명하지만, [apps/edge/internal/events/bus.go](/config/workspace/iop/apps/edge/internal/events/bus.go:20)의 bounded replay/non-durable nature가 README에 분명하지 않다.

#### 해결 방법

Add a short paragraph after [apps/edge/README.md](/config/workspace/iop/apps/edge/README.md:25).

Before:

```markdown
실행 요청과 이벤트는 같은 TCP 연결을 공유하지만, 메시지 타입과 내부 파이프라인은 분리한다. `RunRequest`, `CancelRequest`, `NodeCommandRequest`는 edge가 node에 보내는 command/request 계열이고, `RunEvent`, `EdgeNodeEvent`는 node와 edge 내부에서 발생한 event 계열이다.

## 원격 CLI adapter bin shell 사용자 흐름 검증
```

After:

```markdown
실행 요청과 이벤트는 같은 TCP 연결을 공유하지만, 메시지 타입과 내부 파이프라인은 분리한다. `RunRequest`, `CancelRequest`, `NodeCommandRequest`는 edge가 node에 보내는 command/request 계열이고, `RunEvent`, `EdgeNodeEvent`는 node와 edge 내부에서 발생한 event 계열이다.

`internal/events.Bus`는 Edge 안의 in-process fanout과 bounded replay를 담당한다. 현재 replay는 늦게 붙은 console/API handler를 위한 최근 이벤트 버퍼이지 durable history가 아니며, Node local SQLite 실행 이력과 다른 책임이다. 전역 이력 저장, audit, query API는 후속 Control Plane/Portal 경계에서 별도 설계한다.

## 원격 CLI adapter bin shell 사용자 흐름 검증
```

#### 수정 파일 및 체크리스트

- [ ] `apps/edge/README.md`: add event bus boundary paragraph.

#### 테스트 작성

Docs-only. No Go test. Verify with deterministic `rg`.

#### 중간 검증

```bash
rg --sort path -n 'internal/events\.Bus|bounded replay|durable history|Node local SQLite' apps/edge/README.md
```

Expected: event aggregation boundary wording is present.

### [REFACTOR-3] Architecture Boundary

#### 문제

[docs/architecture.md](/config/workspace/iop/docs/architecture.md:63)는 "로드맵에 따라 정리"라고 남겨 현재 확인된 경계를 마무리하지 않는다. Milestone closeout에는 이 문구를 현재 코드 기준으로 확정해야 한다.

#### 해결 방법

Before [docs/architecture.md](/config/workspace/iop/docs/architecture.md:63):

```markdown
현재 실행 이력은 Node의 local SQLite store에서 검증 중이다. Edge 단위 이력 집계와 로컬 실행 그룹 상태 소유권은 로드맵에 따라 정리한다.
```

After:

```markdown
현재 실행 이력의 최소 영속 저장은 Node local SQLite store가 맡는다. 저장 범위는 node가 직접 수행한 run의 상태와 완료/error 정보이며, Edge event aggregation의 durable backend가 아니다. Edge는 `internal/events.Bus`로 `RunEvent`와 `EdgeNodeEvent`를 in-process fanout하고 bounded replay를 제공한다. 이 replay는 운영 표면의 최근 이벤트 관찰용이며 전역 이력/audit 저장소는 후속 Control Plane/Portal 경계에서 별도 설계한다.
```

#### 수정 파일 및 체크리스트

- [ ] `docs/architecture.md`: replace stale roadmap-placeholder sentence with current boundary.

#### 테스트 작성

Docs-only. No Go test. Verify with deterministic `rg`.

#### 중간 검증

```bash
rg --sort path -n 'Node local SQLite store|Edge event aggregation|bounded replay|Control Plane/Portal' docs/architecture.md
```

Expected: architecture doc states current boundary and future scope.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `apps/node/README.md` | REFACTOR-1 |
| `apps/edge/README.md` | REFACTOR-2 |
| `docs/architecture.md` | REFACTOR-3 |

## 최종 검증

```bash
rg --sort path -n 'Local Execution History|Node local SQLite store|internal/events\.Bus|bounded replay|durable history|Control Plane/Portal' apps/node/README.md apps/edge/README.md docs/architecture.md
```

Expected: each touched doc contains the intended boundary language. Go tests are not required for this docs-only subtask; if code is changed despite the plan, run the affected package tests and record the deviation.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
