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

# Plan - REVIEW_SMOKE

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

이 작업은 이전 smoke evidence의 FAIL 후속 루프다. 직접 사용자에게 질문하지 않는다. 원격 host, port, secret, stale artifact, provider endpoint 상태는 사용자 리뷰가 아니라 검증 blocker 또는 follow-up evidence로 기록한다. secret/token/API key 원문은 어떤 tracked 파일에도 기록하지 말고, 실행 command shape는 redacted 형태로 남긴다.

## 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

## Archive Evidence Snapshot

- Archived plan: `agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/plan_cloud_G07_0.log`
- Archived review: `agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/code_review_cloud_G07_0.log`
- Verdict: FAIL
- Required summary:
  - R1: Previous config evidence completed total capacity 10 using `openai_compat_instances`, but the provider-first `nodes[].providers["mac-mlx-vllm"]` evidence showed `capacity: 0` and `enabled: false`.
  - R2: S07 capacity smoke did not satisfy total `in_flight=10`; the recorded peak was `in_flight=7`, `queued=8`, with `mac-mlx-vllm` not routing.
  - R3: Remote preflight showed dirty checkout evidence: `?? apps/node/internal/bootstrap/iop.db`.
- Affected runtime/files:
  - Remote runner: `ssh toki@toki-labs.com`, workdir `/Users/toki/agent-work/iop-dev`.
  - Remote runtime config: `build/dev-runtime/edge.yaml`.
  - Provider endpoint: `mac-mlx-vllm` on `127.0.0.1:8002/v1`.
  - Test baseline: `agent-test/local/edge-smoke.md` dev-runtime provider pool, SDD S07.
- Verification evidence from failed loop:
  - `config check` PASS and refresh dry-run no changes.
  - Control Plane idle status listed 3 connected nodes and CP-reported total capacity 10.
  - Capacity smoke: `concurrency=11 ok=11 fail=0`, peak `gx10=4`, `onexplayer=3`, `mac=0`, total `in_flight=7`, `queued=8`, final recovered to `0/0`.
  - `lsof -i :8002` had no listener and direct `curl http://127.0.0.1:8002/v1/models` failed connection refused.
- Narrow archive reread allowed:
  - `agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/plan_cloud_G07_0.log`
  - `agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/code_review_cloud_G07_0.log`

## 분석 결과

SDD S07과 `agent-test/local/edge-smoke.md`는 dev-runtime provider pool에서 `gx10-vllm=4`, `onexplayer-lemonade=3`, `mac-mlx-vllm=3`을 기준으로 capacity 총합+1 동시 요청을 보내고, Control Plane status에서 total `in_flight=10`, `queued>=1`, 완료 후 `in_flight=0`, `queued=0` 회복을 요구한다. 이전 루프는 두 provider만 포화되어 S07을 만족하지 못했다.

`USER_REVIEW.md`는 만들지 않는다. Milestone lock 결정이 없고, blocker는 원격 runtime/config/endpoint evidence 보완으로 해소 가능한 상태다.

## 구현 체크리스트

- [x] 원격 preflight를 clean/synced 상태로 재확인하고 dirty/untracked 상태가 남으면 clean workdir/rebuild 또는 격리 근거를 review stub에 기록한다.
- [x] remote provider-first config에서 `mac-mlx-vllm` `nodes[].providers[]` entry가 dispatchable 상태(`enabled=true` 또는 enabled 생략, `capacity=3`)인지 확인하고, 불일치하면 config update와 `config check`, refresh dry-run/apply 또는 restart-required evidence를 기록한다.
- [x] Mac MLX `vllm-mlx` endpoint `127.0.0.1:8002/v1`를 기동/health 확인하고 provider token/header 원문 없이 readiness evidence를 기록한다.
- [x] `/healthz`, `/v1/models`, `/v1/responses`, `/v1/chat/completions` capacity smoke를 rerun하고, total `in_flight=10`, `queued>=1`, 완료 후 `in_flight=0`, `queued=0` evidence를 남긴다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_SMOKE-1] Clean Remote Preflight And Source Trust

#### 문제

이전 evidence는 원격 checkout에 `?? apps/node/internal/bootstrap/iop.db`가 남아 있는 상태에서 수집됐다. local smoke rule은 dirty/divergent 또는 source 미동기화가 있으면 clean workdir/rebuild 또는 blocker 처리를 요구한다.

#### 해결 방법

기존 workdir을 reset하지 않는다. 같은 workdir에서 이 untracked DB가 검증 source와 무관함을 명확히 격리하거나, 별도 clean workdir과 dev-runtime artifact를 준비한 뒤 preflight를 다시 남긴다. 어떤 경로를 선택했는지 `계획 대비 변경 사항`에 기록한다.

#### 중간 검증

```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'
```

### [REVIEW_SMOKE-2] Dispatchable Mac MLX Provider Config And Endpoint

#### 문제

이전 evidence는 provider-first `mac-mlx-vllm` entry가 `enabled=false`, `capacity=0`이고 endpoint listener도 없는 상태를 보여줬다. 이 상태에서는 provider-first source of truth 기준 capacity 10 dispatch가 불가능하다.

#### 해결 방법

Mac MLX `vllm-mlx` endpoint를 `127.0.0.1:8002/v1`에서 기동하고, remote `build/dev-runtime/edge.yaml`의 provider-first `nodes[].providers[]` entry를 dispatchable capacity 3으로 맞춘다. 변경 후 `config check`, `config refresh --mode dry-run`, 필요 시 `--mode apply`를 실행한다. apply가 불가능하고 restart-required가 맞다면 restart-required 경로와 Edge/Node reconnect evidence를 남긴다.

#### 중간 검증

```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 && 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 'lsof -nP -iTCP:8002 -sTCP:LISTEN && curl -fsS -H "Authorization: Bearer <redacted-provider-token>" http://127.0.0.1:8002/v1/models'
```

### [REVIEW_SMOKE-3] S07 Capacity Smoke Rerun

#### 문제

이전 `/v1/chat/completions` capacity smoke는 total `in_flight=7`까지만 관측해 SDD S07과 local edge-smoke 기준을 충족하지 못했다.

#### 해결 방법

`qwen3.6:35b`에 대해 `/v1/responses`와 `/v1/chat/completions`를 다시 실행한다. capacity smoke는 total capacity 10 기준 `11` concurrent 이상으로 실행하고, 같은 run 안에서 Control Plane status snapshot의 peak와 final recovery를 저장한다. auth header/API key 원문은 review stub에 남기지 않는다.

#### 최종 검증

```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 -H "Authorization: Bearer <redacted-edge-token>" 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에 기록한다. 최종 smoke evidence는 최소 `concurrency`, `ok/fail`, per-provider peak `in_flight/queued/capacity`, peak total `in_flight=10`, `queued>=1`, final total `in_flight=0`, `queued=0`을 포함해야 한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| 원격 runtime config/evidence | REVIEW_SMOKE-1, REVIEW_SMOKE-2, REVIEW_SMOKE-3 |
