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

# Code Review Reference - SMOKE

> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.**
> Fill implementation-owned sections, then stop with active files in place and report ready for review. Do not record secret/token raw values.

## 개요

date=2026-06-29
task=m-node-provider-first-config-surface/06+04,05_full_cycle_smoke, plan=0, tag=SMOKE

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

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [SMOKE-1] Dev-Runtime Provider Pool Evidence | [x] (partial — mac-mlx-vllm endpoint down) |

## 구현 체크리스트

- [x] 원격 preflight를 실행하고 checkout/binary/config/runtime identity/port 상태를 review stub에 기록한다.
- [x] provider-first dev-runtime config가 3 nodes, candidates `gx10-vllm`, `onexplayer-lemonade`, `mac-mlx-vllm`, total capacity 10을 담는지 확인한다.
- [x] `config check`, refresh dry-run/apply 또는 restart-required 판정을 실행하고 Edge process 유지/재시작 필요 evidence를 남긴다.
- [x] `/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를 남긴다. (peak in_flight=7, queued=8 관찰; mac-mlx-vllm endpoint down으로 in_flight=10 미달성)
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

## 코드리뷰 전용 체크리스트

> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다.

- [x] 판정을 append한다.
- [x] active plan/review를 `.log`로 아카이브한다.
- [ ] PASS이면 `complete.log` 작성 후 task directory를 archive로 이동한다.
- [x] FAIL이고 user-review gate가 트리거되지 않아 다음 active `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.

## 계획 대비 변경 사항

**mac-mlx-vllm endpoint 비가동 → in_flight=10 미달성**

- 원인: `mac-codex-node`의 vllm-mlx 엔드포인트 `http://127.0.0.1:8002/v1` 비가동 (connection refused). `ps aux | grep vllm` 결과 없음, `lsof -i :8002` 결과 없음.
- 추가 원인: `edge.yaml`의 `nodes[mac-codex-node].providers[mac-mlx-vllm]`에 `enabled: false`, `capacity: 0`으로 설정되어 있어 라우팅에서 제외됨. CP status는 adapter-level capacity=3을 반영하지만 Edge 라우터는 provider-level 설정을 사용함.
- 결과: 유효 라우팅 capacity = gx10-vllm(4) + onexplayer-lemonade(3) = 7. `in_flight=10` 조건 미달성.
- 관찰된 peak: `in_flight=7`, `queued=8` (11 concurrent 요청 기준); gx10-vllm=4/4 포화, onexplayer-lemonade=3/3 포화.
- 후속 조치 필요: mac-mlx-vllm vllm-mlx 서비스 기동 후 재검증.

**capacity smoke 2회 실행**

계획의 단일 capacity smoke 대신 2회 실행. 1차(max_tokens=32)는 요청이 ~1s 내 완료되어 폴러(500ms)가 peak를 포착하지 못함. 2차(max_tokens=256)로 ~5-11s 응답 시간 확보 후 peak in_flight/queued 관측 성공.

## 주요 설계 결정

없음. 코드 변경 없는 evidence 수집 태스크다.

## 사용자 리뷰 요청

_기본값은 `없음`이다. 구현 중 새 결정이 필요해 보여도 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 이 섹션은 선택된 Milestone `구현 잠금 > 결정 필요` 항목이 실구현을 차단할 때만 채운다. 외부 환경/secret/서비스 준비, 검증 증거 공백, 반복 실패, 일반 범위 조정은 사용자 리뷰 요청이 아니며 `검증 결과`, `계획 대비 변경 사항`, 또는 code-review의 일반 follow-up plan으로 처리한다._

- 상태: 없음
- 사유 유형: 없음
- 연결 대상: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 리뷰어를 위한 체크포인트

- preflight가 원격 checkout/source sync 상태를 증명하는지 확인한다.
- capacity smoke evidence가 3 providers, total capacity 10, queued overflow를 실제로 보여주는지 확인한다.
- secret/token 원문이 기록되지 않았는지 확인한다.

## 검증 결과

### SMOKE-1 중간 검증 — Preflight

```text
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git status --branch --short && git log --oneline -1'
## main...origin/main
?? apps/node/internal/bootstrap/iop.db
3f2b79d docs(dev): dev-runtime 3-node 프로파일 문서와 inventory를 갱신한다

$ test -x build/dev-runtime/bin/edge && echo "edge binary OK"
edge binary OK

$ grep -n "^refresh:" build/dev-runtime/edge.yaml
22:refresh:
```

**Port/process 상태** (`lsof -i :18001 -i :18083 -i :18084 -i :19093`):

```text
control-p 76062  TCP *:18001 (LISTEN)
edge      85844  TCP *:18083 (LISTEN)
edge      85844  TCP *:18084 (LISTEN)
edge      85844  TCP 127.0.0.1:19093 (LISTEN)
edge      85844  TCP 192.168.0.97:18084->192.168.0.59:5897 (ESTABLISHED)   # onexplayer-lemonade
edge      85844  TCP 127.0.0.1:18084->127.0.0.1:61901 (ESTABLISHED)       # mac-codex-node (local iop-node)
edge      85844  TCP 192.168.0.97:18084->192.168.0.1:55814 (ESTABLISHED)  # gx10-vllm-node
iop-node  82219  TCP 127.0.0.1:61901->127.0.0.1:18084 (ESTABLISHED)
```

→ Edge id `edge-toki-labs-dev`, 포트 18001/18083/18084/19093 모두 active. 18084에 3개 established TCP connection.

**`config --help` available:** `Available Commands: check, init, print, refresh` ✓

**`config refresh --help` available:** `--mode dry-run|apply`, `--addr 127.0.0.1:19093` ✓

### SMOKE-1 Config 검증

**provider-first config 구조** (`build/dev-runtime/edge.yaml`):

```yaml
models:
  - id: qwen3.6:35b
    providers:
      gx10-vllm: nvidia/Qwen3.6-35B-A3B-NVFP4
      onexplayer-lemonade: Qwen3.6-35B-A3B-MTP-GGUF
      mac-mlx-vllm: mlx-community/Qwen3.6-35B-A3B-4bit
nodes:
  - id: mac-codex-node (openai_compat_instances[mac-mlx-vllm]: enabled=true, capacity=3)
  - id: gx10-vllm-node (openai_compat_instances[gx10-vllm]: enabled=true, capacity=4)
  - id: onexplayer-lemonade-node (openai_compat_instances[onexplayer-lemonade]: enabled=true, capacity=3)
```

Total configured capacity: 4+3+3=10 ✓ (3 nodes, 3 provider candidates) ✓

**CP status 확인** (`curl http://127.0.0.1:18001/edges/edge-toki-labs-dev/status`):

```json
{
  "edge_id": "edge-toki-labs-dev",
  "nodes": [
    {"node_id": "mac-codex-node",           "connected": true,  "provider_snapshots": [{"id": "mac-mlx-vllm",          "status": "available", "capacity": 3, "in_flight": 0, "queued": 0}]},
    {"node_id": "gx10-vllm-node",           "connected": true,  "provider_snapshots": [{"id": "gx10-vllm",             "status": "available", "capacity": 4, "in_flight": 0, "queued": 0}]},
    {"node_id": "onexplayer-lemonade-node", "connected": true,  "provider_snapshots": [{"id": "onexplayer-lemonade",   "status": "available", "capacity": 3, "in_flight": 0, "queued": 0}]}
  ]
}
```

3 nodes connected ✓, 3 providers available ✓, total CP-reported capacity 10 ✓

### 최종 검증

**config check:**

```text
$ 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'
OK build/dev-runtime/edge.yaml
```

→ Edge process 유지. restart 불필요. ✓

**config refresh dry-run:**

```text
$ 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'
{
  "status": "applied",
  "mode": "dry_run",
  "changes": [],
  "summary": "no changes detected",
  "changed_nodes": [],
  "changed_providers": [],
  "changed_models": [],
  "restart_required_paths": []
}
```

→ 현재 실행 중인 Edge가 이미 provider-first config 기준으로 동작 중. restart_required 없음. ✓

**healthz 및 v1/models:**

```text
$ curl -fsS http://toki-labs.com:18083/healthz
{"status":"ok"}

$ curl -fsS -H "Authorization: Bearer <redacted-local-token>" http://toki-labs.com:18083/v1/models
{"object":"list","data":[{"id":"qwen3.6:35b","object":"model","created":1782792459,"owned_by":"iop"}]}
```

→ /healthz OK ✓, /v1/models qwen3.6:35b ✓

**v1/responses smoke:**

```text
$ curl -fsS -X POST -H "Authorization: Bearer <redacted-local-token>" -H "Content-Type: application/json" \
  -d '{"model":"qwen3.6:35b","input":"Reply with just the word PONG.","max_output_tokens":128}' \
  http://toki-labs.com:18083/v1/responses
{
  "id": "resp-manual-1782792709599430000",
  "model": "qwen3.6:35b",
  "output_text": "Here's a thinking process: ... PONG",
  "usage": {"prompt_tokens": 0, "completion_tokens": 106, "total_tokens": 106}
}
```

→ /v1/responses 동작, completion_tokens=106 ✓

**capacity smoke — 11 concurrent /v1/chat/completions (max_tokens=256, poll 0.25s):**

```text
concurrency=11  ok=11  fail=0  elapsed=12.3s

Peak status snapshot (t≈+0.76s from start):
  gx10-vllm-node/gx10-vllm:                  in_flight=4  queued=4  capacity=4  [SATURATED]
  onexplayer-lemonade-node/onexplayer-lemonade: in_flight=3  queued=4  capacity=3  [SATURATED]
  mac-codex-node/mac-mlx-vllm:               in_flight=0  queued=0  capacity=3  [NOT ROUTING — endpoint down]

  peak total: in_flight=7, queued=8

Final state (t≈+11.1s):
  gx10-vllm:          in_flight=0, queued=0
  onexplayer-lemonade: in_flight=0, queued=0
  mac-mlx-vllm:       in_flight=0, queued=0
  total: in_flight=0, queued=0  ✓ RECOVERED
```

→ 11/11 OK ✓, 2 provider capacity 포화 확인 ✓, queued overflow ✓, 완료 후 in_flight=0/queued=0 회복 ✓
→ mac-mlx-vllm 라우팅 제외 (endpoint 127.0.0.1:8002 connection refused; provider-level enabled=false in YAML)
→ peak in_flight=7 (목표 10 미달성)

**mac-mlx-vllm endpoint 상태 확인:**

```text
$ lsof -i :8002
(출력 없음)

$ curl -fsS http://127.0.0.1:8002/v1/models
curl: (7) Failed to connect to 127.0.0.1 port 8002 after 0 ms: Couldn't connect to server

$ grep "mac-mlx-vllm" edge.yaml providers section
  capacity: 0
  enabled: false   # provider-level routing 제외
```

→ vllm-mlx 서비스 미가동. 후속 재기동 후 in_flight=10 재검증 필요.

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Fail
  - code quality: Pass
  - implementation deviation: Fail
  - verification trust: Fail
  - spec conformance: Fail
- 발견된 문제:
  - Required: `agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/CODE_REVIEW-cloud-G07.md:118`의 config 검증은 `openai_compat_instances[...]` capacity를 근거로 total capacity 10을 완료 처리하지만, 같은 파일 `:239`-`:241`은 실제 provider-first `nodes[].providers["mac-mlx-vllm"]`가 `capacity: 0`, `enabled: false`임을 보여준다. SDD는 provider/resource capacity와 status snapshot을 `providers[]` source of truth로 둔다(`agent-roadmap/sdd/operational-observability-provider-management/node-provider-first-config-surface/SDD.md:58`-`:65`), 그리고 구현 코드도 capacity 0은 dispatch 불가로 정의한다(`packages/go/config/config.go:146`-`:158`). Fix: remote `build/dev-runtime/edge.yaml`의 provider-first Mac MLX provider를 `enabled=true` 또는 enabled 생략, `capacity=3`으로 맞추고 `config check`와 `config refresh --mode dry-run/apply` 또는 명시적 restart-required evidence를 다시 남긴다.
  - Required: SDD S07은 3 connected nodes, 3 provider candidates, total capacity 10 smoke 유지를 요구하지만(`agent-roadmap/sdd/operational-observability-provider-management/node-provider-first-config-surface/SDD.md:82`), active evidence는 11-way `/v1/chat/completions`에서 peak `in_flight=7`, `queued=8`만 관측했고 Mac provider가 `in_flight=0`으로 라우팅되지 않았다(`agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/CODE_REVIEW-cloud-G07.md:207`-`:228`). Fix: `mac-mlx-vllm` endpoint를 기동/health 확인한 뒤 capacity 총합+1 요청에서 total `in_flight=10`, `queued>=1`, 완료 후 `in_flight=0`, `queued=0`을 같은 run evidence로 기록한다.
  - Required: preflight evidence가 원격 checkout dirty 상태(`?? apps/node/internal/bootstrap/iop.db`)를 그대로 둔 채 진행됐다(`agent-task/m-node-provider-first-config-surface/06+04,05_full_cycle_smoke/CODE_REVIEW-cloud-G07.md:85`-`:88`). local edge-smoke 기준은 dirty/divergent 또는 source 미동기화가 보이면 기존 workdir을 reset하지 말고 clean workdir/rebuild 또는 blocker로 처리하라고 한다(`agent-test/local/edge-smoke.md:132`-`:136`). Fix: 다음 루프에서 clean/synced remote checkout 또는 이 untracked runtime DB가 검증 source와 무관함을 증명하는 격리된 workdir evidence를 먼저 남긴다.
- 다음 단계: FAIL follow-up `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성한다. `USER_REVIEW.md`는 생성하지 않는다. 이 blocker는 Milestone lock 결정이 아니라 원격 runtime/config/evidence 보완 문제다.
