<!-- task=06_run_event_node_label plan=0 tag=RNL -->

# 06 Run Event Node Label Plan - RNL

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

**필수: 구현 마지막에는 반드시 `CODE_REVIEW-*-G??.md`의 모든 섹션을 실제 구현 내용과 명령 출력으로 채운다.**
이 task는 RunEvent의 node 표시 정보 enrich를 다룬다.

## 배경

Console과 future HTTP/SSE는 run event를 표시할 때 node alias가 필요하다. 현재 `RunEvent`에는 `node_id`만 있고 console이 registry를 다시 조회한다.

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/rules/project/domain/edge/rules.md`
- `agent-ops/rules/project/domain/node/rules.md`
- `agent-ops/rules/project/domain/platform-common/rules.md`
- `proto/iop/runtime.proto`
- `apps/node/internal/node/node.go`
- `apps/node/internal/node/sink_test.go`
- `apps/edge/internal/transport/server.go`
- `apps/edge/internal/transport/server_test.go`
- `apps/edge/cmd/edge/console_events.go`
- `apps/edge/cmd/edge/console_test.go`

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

- Edge가 RunEvent를 fanout 전 alias로 enrich하는 테스트가 없다.
- Renderer가 event alias를 우선하는 테스트가 없다.

### 심볼 참조

- `RunEvent.node_id`: `runtime.proto:48`, set `node.go:299`, consumed `console_events.go:94`.
- `consoleEventRouter.nodeLabel`: `console_events.go:94`.

### 범위 결정 근거

- Node는 alias를 모르는 구조를 유지한다.
- Node가 Edge registry를 조회하는 경로는 추가하지 않는다.
- generated pb는 `make proto`로만 갱신한다.

### 빌드 등급

- Build `cloud-G08`: protobuf schema/generated code와 edge/node tests 영향.
- Review `cloud-G08`: schema compatibility와 generated code 검증 필요.

### [RNL-1] RunEvent alias/display field 추가

#### 문제

`RunEvent` schema가 display label을 담지 못한다.

#### 해결 방법

- `proto/iop/runtime.proto`에 `string node_alias = 12`를 추가한다.
- `make proto`로 generated code를 갱신한다.
- Node sink는 node_id만 계속 보낸다.

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

- [ ] `proto/iop/runtime.proto`
- [ ] `proto/gen/iop/runtime.pb.go`

#### 테스트 작성

- Parser tests가 generated type 변경 후 통과하는지 확인.

#### 중간 검증

```bash
command -v protoc
command -v protoc-gen-go
make proto
go test -count=1 ./apps/node/internal/transport ./apps/edge/internal/transport
```

### [RNL-2] Edge fanout 전 alias enrich

#### 문제

Console이 매번 registry lookup으로 label을 계산한다.

#### 해결 방법

- Edge transport server가 RunEvent 수신 시 registry에서 node alias를 찾아 `NodeAlias`를 채운 뒤 publish한다.
- Renderer는 `event.GetNodeAlias()`를 우선하고, 없으면 registry/node_id fallback을 사용한다.

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

- [ ] `apps/edge/internal/transport/server.go`
- [ ] `apps/edge/internal/transport/server_test.go`
- [ ] `apps/edge/internal/opsconsole/events.go` 또는 `console_events.go`
- [ ] `apps/edge/internal/opsconsole/events_test.go` 또는 `console_test.go`

#### 테스트 작성

- `TestServerEnrichesRunEventNodeAlias`
- `TestConsoleEventRouterPrefersRunEventAlias`

#### 중간 검증

```bash
go test -count=1 ./apps/edge/internal/transport ./apps/edge/internal/opsconsole ./apps/edge/cmd/edge
```

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `proto/iop/runtime.proto` | RNL-1 |
| `proto/gen/iop/runtime.pb.go` | RNL-1 |
| `apps/edge/internal/transport/server.go` | RNL-2 |
| `apps/edge/internal/transport/server_test.go` | RNL-2 |
| `apps/edge/internal/opsconsole/events.go` | RNL-2 |
| `apps/edge/cmd/edge/console_events.go` | RNL-2 |
| `apps/edge/cmd/edge/console_test.go` | RNL-2 |

## 최종 검증

```bash
make proto
go test -count=1 ./apps/edge/internal/transport ./apps/node/internal/transport ./apps/node/internal/node ./apps/edge/internal/opsconsole ./apps/edge/cmd/edge
go test -count=1 ./...
```

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