<!-- task=m-node-provider-first-config-surface/06+04,05_full_cycle_smoke plan=0 tag=SMOKE -->

# Plan - SMOKE

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

이 작업은 field/dev-runtime evidence 수집 plan이다. `CODE_REVIEW-cloud-G07.md`에 실제 preflight, command output, blocker를 남기는 것까지가 구현이다. secret/token 원문은 기록하지 않는다.

## 배경

SDD S07은 provider-first config로 dev-runtime provider pool에서 3 connected nodes, 3 provider candidates, total capacity 10 smoke가 유지되는 증거를 요구한다. 이 검증은 원격 runner와 long-running runtime 상태에 의존하므로 cloud lane으로 라우팅한다.

## 사용자 리뷰 요청 흐름

원격 host, port, secret, stale artifact 문제는 사용자 리뷰가 아니라 검증 blocker다. Milestone lock 결정이 아니면 review stub의 `검증 결과`와 `계획 대비 변경 사항`에 기록한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/node-provider-first-config-surface.md`
- Task ids:
  - `full-cycle-smoke`: dev-runtime provider-first provider pool full-cycle smoke
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-roadmap/sdd/operational-observability-provider-management/node-provider-first-config-surface/SDD.md`
- `agent-test/local/rules.md`
- `agent-test/local/edge-smoke.md`
- `agent-test/local/node-smoke.md`
- `agent-test/local/testing-smoke.md`
- `docs/edge-local-dev-guide.md`

### SDD 기준

대상 Acceptance Scenario는 S07이다. Evidence Map은 dev-runtime config check, refresh/restart evidence, `/v1/models`, `/v1/responses`, `/v1/chat/completions`, capacity accounting evidence를 요구한다.

### 테스트 환경 규칙

`test_env=local`, 원격 runner 사용. `edge-smoke.md`의 dev-runtime provider pool 기준을 따른다.

테스트 환경 프리플라이트:

- runner: `ssh toki@toki-labs.com`
- repo root/workdir: `/Users/toki/agent-work/iop-dev`
- branch/HEAD/dirty: `git status --branch --short`, `git log --oneline -1`
- source sync: local 변경분이 원격 checkout과 동기화되어야 함. 불일치하면 clean workdir/rebuild step을 먼저 수행하거나 blocker로 기록.
- binary/artifact: `test -x build/dev-runtime/bin/edge`, `build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config --help`, `... config refresh --help`
- config path: `build/dev-runtime/edge.yaml`
- runtime identity/ports: Control Plane status `edge-toki-labs-dev`, ports `18001`, `18083`, `18084`, refresh `19093`
- external hosts: dev-runtime provider nodes and provider endpoints from `edge-smoke.md`; secret 원문 금지.

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

local unit tests로는 actual 3-node provider pool capacity 10을 증명할 수 없다. 원격 runtime과 provider endpoints가 필요하다.

### 심볼 참조

rename/remove 없음.

### 분할 판단

remote full-cycle evidence는 code/docs implementation과 다른 risk profile이므로 별도 sibling task로 둔다. `06+04,05_full_cycle_smoke`는 routing/status/refresh와 docs가 완료된 뒤 실행하며, 실제 실행 시점에는 01-05 결과가 원격 checkout에 반영되어 있어야 한다.

### 범위 결정 근거

새 provider 구현, provider performance benchmark, DGX Spark container 재구성은 제외한다. 필요한 경우 blocker/follow-up으로 남긴다.

### 빌드 등급

`cloud-G07`: 원격 runner, long-running runtime, OpenAI-compatible capacity smoke, source sync preflight가 중심이다.

## 의존 관계 및 구현 순서

이 subtask는 디렉터리명 `06+04,05_full_cycle_smoke`에 따라 같은 task group의 `04+02,03_routing_status_refresh`와 `05+01_dev_runtime_docs`가 각각 `complete.log`를 만든 뒤 구현한다.

## 구현 체크리스트

- [ ] 원격 preflight를 실행하고 checkout/binary/config/runtime identity/port 상태를 review stub에 기록한다.
- [ ] provider-first dev-runtime config가 3 nodes, candidates `gx10-vllm`, `onexplayer-lemonade`, `mac-mlx-vllm`, total capacity 10을 담는지 확인한다.
- [ ] `config check`, refresh dry-run/apply 또는 restart-required 판정을 실행하고 Edge process 유지/재시작 필요 evidence를 남긴다.
- [ ] `/healthz`, `/v1/models`, `/v1/responses`, `/v1/chat/completions` capacity smoke를 실행한다.
- [ ] Control Plane status provider snapshot에서 `in_flight=10`, `queued>=1` 관측과 완료 후 `in_flight=0`, `queued=0` 회복 evidence를 남긴다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [SMOKE-1] Dev-Runtime Provider Pool Evidence

#### 문제

SDD S07은 remote dev-runtime evidence가 필요하다. local checkout만으로는 3 connected nodes, 3 provider candidates, total capacity 10을 검증할 수 없다.

#### 해결 방법

`agent-test/local/edge-smoke.md`의 dev-runtime preflight와 검증 순서를 그대로 실행한다. 원격 checkout이 stale/dirty/divergent이면 기존 workdir을 reset하지 말고 clean workdir/rebuild 또는 blocker로 기록한다.

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

- [ ] 코드 파일 수정 없음이 원칙. evidence 실행 결과만 review stub에 기록한다.
- [ ] 필요 시 provider-first config 동기화/빌드 준비 step을 `계획 대비 변경 사항`에 기록한다.

#### 테스트 작성

테스트 파일은 작성하지 않는다. 이 task의 산출물은 실행 evidence다.

#### 중간 검증

```bash
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git status --branch --short && git log --oneline -1 && test -x build/dev-runtime/bin/edge && build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config --help >/tmp/iop-edge-config-help.txt && build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config refresh --help >/tmp/iop-edge-config-refresh-help.txt && grep -n "^refresh:" build/dev-runtime/edge.yaml'
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| 없음 | SMOKE-1 |

## 최종 검증

```bash
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config check'
```

```bash
ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config refresh --mode dry-run --addr 127.0.0.1:19093'
```

```bash
ssh toki@toki-labs.com 'curl -fsS http://toki-labs.com:18083/healthz && curl -fsS http://toki-labs.com:18083/v1/models'
```

`/v1/responses`와 `/v1/chat/completions` capacity smoke는 secret 원문을 출력하지 않는 script 또는 redacted command로 실행하고, saved output path와 exact command shape를 review stub에 기록한다. Go test cache is not relevant. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
