iop/agent-task/03+service_source_metadata/plan_local_G04_0.log
toki 6e2a1fc2f2 feat: edge runtime, opsconsole, CLI target terminology, and e2e validation updates
- Add edge runtime config and opsconsole package
- Refactor edge console to use new runtime config
- Add service source metadata support
- Update CLI adapter with target terminology
- Add edge operation contract and event bus replay
- Update node label and command ops surface
- Add E2E smoke tests and full validation
- Update proto runtime definitions
- Update documentation and agent-ops rules
2026-05-17 14:57:49 +09:00

118 lines
3.5 KiB
Text

<!-- task=03_service_source_metadata plan=0 tag=SSM -->
# 03 Service Source Metadata Plan - SSM
## 이 파일을 읽는 구현 에이전트에게
**필수: 구현 마지막에는 반드시 `CODE_REVIEW-*-G??.md`의 모든 섹션을 실제 구현 내용과 명령 출력으로 채운다.**
이 task는 service의 caller-neutral metadata 정책만 다룬다.
## 배경
향후 HTTP/API와 ops console이 같은 edge service를 호출해야 한다. 그런데 현재 `BuildRunRequest`가 모든 request source를 `edge-console`로 강제한다.
## 분석 결과
### 읽은 파일
- `agent-ops/skills/common/plan/SKILL.md`
- `agent-ops/rules/project/domain/edge/rules.md`
- `apps/edge/internal/service/service.go`
- `apps/edge/internal/service/service_test.go`
- `apps/edge/cmd/edge/console.go`
- `apps/edge/cmd/edge/console_test.go`
- `packages/events/events.go`
### 테스트 커버리지 공백
- service가 source metadata를 주입하지 않는다는 테스트가 없다.
- caller metadata merge 우선순위 테스트가 부족하다.
### 심볼 참조
- `BuildRunRequest`: `service.go:244`, calls `service.go:84`, `service_test.go:12`, `console_test.go:17`.
- `SubmitRunRequest.Metadata`: `service.go:48`, merge `service.go:253`.
### 범위 결정 근거
- opsconsole package 이동은 `02_edge_opsconsole_package`에서 처리한다.
- HTTP API 구현은 제외한다.
### 빌드 등급
- Build `local-G04`: 좁은 service behavior change와 tests.
- Review `local-G04`: metadata regression 확인 중심.
### [SSM-1] service의 source hardcode 제거
#### 문제
```go
// apps/edge/internal/service/service.go:253
metadata := map[string]string{"source": "edge-console"}
```
#### 해결 방법
- `BuildRunRequest`는 `req.Metadata`를 nil-safe copy만 한다.
- metadata가 nil이면 빈 map 또는 nil 중 하나를 명시적으로 선택한다. Prefer: 빈 map.
#### 수정 파일 및 체크리스트
- [x] `apps/edge/internal/service/service.go`
- [x] `apps/edge/internal/service/service_test.go`
#### 테스트 작성
- `TestBuildRunRequestDoesNotInjectConsoleSource`
- `TestBuildRunRequestCopiesMetadata`
#### 중간 검증
```bash
go test -count=1 ./apps/edge/internal/service
```
### [SSM-2] ops console caller가 source metadata 명시
#### 문제
source가 service에서 사라지면 console caller가 source를 명시해야 한다.
#### 해결 방법
- console/opsconsole `SubmitRunRequest` 생성 시 `Metadata: map[string]string{"source": "edge-ops-console"}`를 넣는다.
- 기존 `edge-console` 문자열 호환이 필요하면 문서화하고 그대로 유지한다.
#### 수정 파일 및 체크리스트
- [x] `apps/edge/cmd/edge/console.go` 또는 `apps/edge/internal/opsconsole/console.go`
- [x] 관련 console test
#### 테스트 작성
- console submit helper test에서 metadata source 확인.
#### 중간 검증
```bash
go test -count=1 ./apps/edge/internal/service ./apps/edge/cmd/edge ./apps/edge/internal/opsconsole
```
## 수정 파일 요약
| 파일 | 항목 |
|---|---|
| `apps/edge/internal/service/service.go` | SSM-1 |
| `apps/edge/internal/service/service_test.go` | SSM-1 |
| `apps/edge/cmd/edge/console.go` | SSM-2 |
| `apps/edge/internal/opsconsole/console.go` | SSM-2 |
## 최종 검증
```bash
go test -count=1 ./apps/edge/internal/service ./apps/edge/cmd/edge ./apps/edge/internal/opsconsole
go test -count=1 ./...
```
모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 전체 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.