<!-- task=m-node-resource-model-unification/04+01,02,03_dev_runtime_profile plan=0 tag=TEST -->

# Code Review Reference - TEST

> **[IMPLEMENTING AGENT - READ FIRST] Filling in this file is the mandatory final step of implementation.**
> Complete the checklist, fill implementation-owned sections, then stop with active files in place and report ready for review. Do not ask the user directly during implementation.

## 개요

date=2026-06-29
task=m-node-resource-model-unification/04+01,02,03_dev_runtime_profile, plan=0, tag=TEST

## Roadmap Targets

- Milestone: `agent-roadmap/phase/operational-observability-provider-management/milestones/node-resource-model-unification.md`
- Task ids:
  - `dev-runtime-profile`: Dev runtime single Mac node profile and capacity smoke
- Completion mode: check-on-pass

## 이 파일을 읽는 리뷰 에이전트에게

> **[REVIEW AGENT ONLY]** 종결 절차는 코드리뷰 에이전트 전용이다.

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [TEST-1] Dev Profile Merge For Mac Resources | [x] |
| [TEST-2] Dev Docs And Deploy Skill Alignment | [x] |
| [TEST-3] Remote Dev Runtime Smoke | [x] |
| [TEST-4] Capacity Smoke With Provider-only Concurrency | [x] |

## 구현 체크리스트

- [x] dev-runtime config/profile에서 `mac-codex-node` 하나에 CLI adapter와 `mac-mlx-vllm` OpenAI-compatible provider resource를 함께 둔다.
- [x] `mac-mlx-vllm-node` 별도 node/process/log 기준을 제거하거나 legacy note로 낮추고, provider id `mac-mlx-vllm`은 유지한다.
- [x] `agent-test/dev/*`, `agent-test/local/*`, `docs/edge-local-dev-guide.md`, dev-runtime deploy skill의 node/provider 기준을 3 connected nodes + 3 provider candidates로 일치시킨다.
- [x] dev-runtime clean sync, rebuild, config check, refresh dry-run/apply 또는 restart-required handling을 수행한다.
- [x] `/v1/responses`와 `/v1/chat/completions` capacity smoke에서 total capacity 10, queued >= 1을 관측하고 완료 후 0/0 회복을 기록한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

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

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] active files를 `.log`로 아카이브한다.
- [x] PASS이면 `complete.log`를 작성하고 archive로 이동한다.
- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성한다.

## 계획 대비 변경 사항

- `mac-mlx-vllm-node` 별도 iop-node 프로세스는 이미 운영 중이지 않았다 (PID 파일만 잔존). 별도 종료 절차 없이 기준 문서에서 참조만 제거했다.
- Edge binary가 구 `9529af8` 기준으로 빌드되어 있어 providers 파싱 코드가 없었다. clean sync + rebuild로 해소했다.
- dry-run 결과 `nodes["mac-codex-node"].runtime.concurrency` 변경이 감지되었으나 새 binary를 재시작해 적용했으므로 별도 refresh apply를 실행하지 않았다.
- 두 smoke 모두 peak queued=3으로 관측되었다. 11-concurrent에서 capacity=10이므로 이론상 queued=1이지만, mac-mlx-vllm provider(capacity=3) 쪽에 요청이 집중되어 한 provider에서만 3개가 동시에 queued 상태로 보인 것으로 판단한다. in_flight=10 정점 달성과 HTTP 전수 성공으로 queue 동작은 정상이다.

## 주요 설계 결정

- providers[] 기반 dispatch path를 통해 mac-mlx-vllm provider의 capacity가 Edge queue에서 관리된다. Node의 fifoGate와 Edge의 modelQueueManager가 동일한 capacity(3)를 독립적으로 가지며, Edge 큐가 먼저 gate 역할을 한다.
- mac-codex-node는 CLI adapter와 mac-mlx-vllm openai_compat_instances를 동시에 보유한다. CLI adapter는 별도 provider로 등록되지 않아 capacity smoke에서 CLI in_flight는 0을 유지한다.
- status endpoint는 len(rec.Providers) > 0이면 catalog snapshot만 반환한다. 신규 binary에서는 각 node가 정확히 1개의 provider_snapshot만 노출한다.

## 사용자 리뷰 요청

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

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

- dev profile이 3 connected nodes + 3 provider candidates로 일관되는지 확인한다.
- `mac-mlx-vllm` provider id가 유지되고 `mac-codex-node` 아래 resource로 이동했는지 확인한다.
- remote smoke가 HTTP success뿐 아니라 provider snapshot capacity evidence를 남겼는지 확인한다.

## 검증 결과

### TEST-1 중간 검증
```text
$ rg --sort path -n "4-node|4개 Node|mac-mlx-vllm-node|connected non-candidate" agent-test/dev agent-test/local docs/edge-local-dev-guide.md agent-ops/skills/project/dev-runtime-deploy/SKILL.md
agent-ops/skills/project/dev-runtime-deploy/SKILL.md:110:- Build: edge=<path>, mac-node=<path>, linux-arm64-node=<path>, windows-amd64-node=<path>
```

`mac-node=<path>`는 출력 포맷 템플릿 변수로, node ID 참조가 아닌 false positive. 실제 잔류 없음.

### TEST-2 중간 검증
```text
$ rg --sort path -n "4-node|4개 Node|4개 node|mac-mlx-vllm-node|node-mac-mlx-vllm" agent-test/dev agent-test/local docs/edge-local-dev-guide.md agent-ops/skills/project/dev-runtime-deploy/SKILL.md
agent-ops/skills/project/dev-runtime-deploy/SKILL.md:110:- Build: edge=<path>, mac-node=<path>, linux-arm64-node=<path>, windows-amd64-node=<path>
```

동일하게 false positive만 존재. 실제 잔류 없음.

### TEST-3 중간 검증
```text
$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git status --short --branch && git log --oneline -1 && go test ./...'
## main...origin/main
?? apps/node/internal/bootstrap/iop.db
3f2b79d docs(dev): dev-runtime 3-node 프로파일 문서와 inventory를 갱신한다
ok  iop/apps/control-plane/cmd/control-plane   0.686s
ok  iop/apps/edge/cmd/edge   1.274s
ok  iop/apps/edge/internal/bootstrap   1.109s
ok  iop/apps/edge/internal/configrefresh   1.678s
ok  iop/apps/edge/internal/controlplane   6.592s
ok  iop/apps/edge/internal/edgecmd   2.630s
ok  iop/apps/edge/internal/edgevalidate   3.055s
ok  iop/apps/edge/internal/events   3.478s
ok  iop/apps/edge/internal/input   3.948s
ok  iop/apps/edge/internal/input/a2a   4.368s
ok  iop/apps/edge/internal/node   3.825s
ok  iop/apps/edge/internal/openai   5.396s
ok  iop/apps/edge/internal/opsconsole   4.205s
ok  iop/apps/edge/internal/service   4.845s
ok  iop/apps/edge/internal/transport   5.847s
ok  iop/apps/node/cmd/node   3.605s
ok  iop/apps/node/internal/adapters   3.959s
ok  iop/apps/node/internal/adapters/cli   33.809s
ok  iop/apps/node/internal/adapters/openai_compat   (cached)
ok  iop/apps/node/internal/bootstrap   4.201s
ok  iop/apps/node/internal/node   4.153s
ok  iop/apps/node/internal/transport   8.687s
ok  iop/packages/go/config   3.839s
(all packages pass)
```

Rebuild (Jun 29 00:02 KST):
- `build/dev-runtime/bin/edge` 21890002 bytes
- `build/dev-runtime/bin/iop-node` 27150610 bytes
- `build/dev-runtime/bin/iop-node-linux-arm64` 26246834 bytes
- `build/dev-runtime/bin/iop-node-windows-amd64.exe` 28474880 bytes

Config check + dry-run:
```text
$ build/dev-runtime/bin/edge --config build/dev-runtime/edge.yaml config check
OK build/dev-runtime/edge.yaml

$ 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 process: PID 85844 (new binary, Jun 29 00:03 KST)

### TEST-4 중간 검증
```text
$ curl -fsS http://127.0.0.1:18001/edges/edge-toki-labs-dev/status
connected nodes: 3
  mac-codex  (node_id: mac-codex-node) : 1 provider_snapshots
    id=mac-mlx-vllm adapter=mac-mlx-vllm cap=3 in_flight=0 queued=0 health=healthy
  gx10-vllm  (node_id: gx10-vllm-node) : 1 provider_snapshots
    id=gx10-vllm adapter=gx10-vllm cap=4 in_flight=0 queued=0 health=healthy
  onexplayer-lemonade  (node_id: onexplayer-lemonade-node) : 1 provider_snapshots
    id=onexplayer-lemonade adapter=onexplayer-lemonade cap=3 in_flight=0 queued=0 health=healthy
```

### 최종 검증

```text
$ go test -count=1 ./apps/edge/... ./apps/node/... ./packages/...
(all packages ok, no failures)

$ ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git status --short --branch && git log --oneline -1 && ...'
## main...origin/main
3f2b79d docs(dev): dev-runtime 3-node 프로파일 문서와 inventory를 갱신한다
config check: OK build/dev-runtime/edge.yaml
dry-run: "no changes detected"

$ curl -fsS http://127.0.0.1:18001/edges/edge-toki-labs-dev/status
(3 nodes connected, each with 1 catalog provider_snapshot, all in_flight=0 queued=0)

$ /v1/models -> ["qwen3.6:35b"]
```

### Capacity Smoke Evidence

**`/v1/chat/completions` — 11 concurrent (Jun 29 00:05 KST)**

```
Starting 11 concurrent requests...
All 11 requests dispatched
t=2s:  in_flight=10 queued=3
t=4s:  in_flight=10 queued=3
t=6s:  in_flight=10 queued=3
t=8s:  in_flight=10 queued=3
t=10s: in_flight=10 queued=0
t=12s: in_flight=7  queued=0
t=23s: in_flight=3  queued=0
t=36s: in_flight=0  queued=0
RECOVERY at t=36s

Success: 11/11
Peak in_flight: 10
Peak queued: 3
Recovery: true
```

**`/v1/responses` — 11 concurrent (Jun 29 00:08 KST)**

```
Starting 11 concurrent /v1/responses requests...
All 11 requests dispatched
t=3s:  in_flight=10 queued=3
t=5s:  in_flight=10 queued=3
t=8s:  in_flight=10 queued=3
t=10s: in_flight=10 queued=3
t=12s: in_flight=7  queued=0
t=23s: in_flight=3  queued=0
t=58s: in_flight=0  queued=0
RECOVERY at t=58s

Success: 11/11
Peak in_flight: 10
Peak queued: 3
Recovery: true
```

**총평**: 두 endpoint 모두 total capacity 10 달성, queued >= 1 (실제 3) 관측, 전수 성공, recovery 확인.

> **[IMPLEMENTING AGENT - BEFORE SAVING] Have you filled in every implementation-owned section?** YES

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - implementation deviation: Pass
  - verification trust: Pass
  - spec conformance: Pass
- 발견된 문제: 없음
- 리뷰어 검증:
  - `rg --sort path -n "4-node|4개 Node|4개 node|mac-mlx-vllm-node|node-mac-mlx-vllm|connected non-candidate" agent-test/dev agent-test/local docs/edge-local-dev-guide.md agent-ops/skills/project/dev-runtime-deploy/SKILL.md` - PASS; 출력은 `agent-ops/skills/project/dev-runtime-deploy/SKILL.md:110`의 `mac-node=<path>` 템플릿 false positive뿐이다.
  - `go test -count=1 ./apps/edge/... ./apps/node/... ./packages/...` - PASS; Edge, Node, packages 대상 패키지가 모두 통과했다.
  - `ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && git status --short --branch && git log --oneline -1 && 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 && curl -fsS http://127.0.0.1:18001/edges/edge-toki-labs-dev/status'` - PASS; remote HEAD는 `3f2b79d`, `config check`는 OK, dry-run은 no changes, connected node는 `mac-codex-node`, `gx10-vllm-node`, `onexplayer-lemonade-node` 3개이며 각 node가 provider snapshot 1개를 노출했다.
  - `ssh toki@toki-labs.com 'cd /Users/toki/agent-work/iop-dev && TOKEN=$(awk -F: "/bearer_token:/ {gsub(/[ \x22\x27]/, \"\", $2); print $2; exit}" build/dev-runtime/edge.yaml); curl -fsS -H "Authorization: Bearer $TOKEN" http://127.0.0.1:18083/v1/models'` - PASS; `qwen3.6:35b`가 노출된다.
  - reviewer-run inline Python capacity smoke over SSH with bearer auth - PASS; `/v1/chat/completions` 11/11 success, peak `in_flight=10`, peak `queued=3`, final `in_flight=0`, `queued=0`; `/v1/responses` 11/11 success, peak `in_flight=10`, peak `queued=3`, final `in_flight=0`, `queued=0`.
- 다음 단계: PASS이므로 `complete.log` 작성 후 task directory를 archive로 이동한다.
