--- test_env: dev-corp test_profile: edge-smoke domain: edge verification_type: smoke last_rule_updated_at: 2026-07-02 --- # edge-smoke dev-corp 테스트 ## 읽기 조건 - `apps/edge/**` 변경 또는 dev-corp Edge registry, transport, service, OpenAI-compatible/A2A 입력 표면 검증 판단이 필요한 경우 ## 적용 범위 - `apps/edge/cmd/edge/**` - `apps/edge/internal/bootstrap/**` - `apps/edge/internal/transport/**` - `apps/edge/internal/service/**` - `apps/edge/internal/events/**` - `apps/edge/internal/input/**` - `apps/edge/internal/openai/**` - `apps/edge/internal/opsconsole/**` - `apps/edge/internal/node/**` - dev-corp Edge host, provider pool config, OpenAI-compatible model alias routing ## 분류 - domain: edge - verification_type: smoke - scope: dev-corp Edge 실행 그룹, provider pool, input surface baseline ## 환경 - host: local checkout. dev-corp runtime, provider pool, shared port evidence가 필요하면 mac-mini `ssh fe@172.24.63.178`의 `/Users/fe/agent-work/iop-dev-corp` checkout을 사용한다. - port: compose Edge-Node TCP transport `19006`; native provider-pool Edge-Node TCP 후보 `18087`; artifact/bootstrap HTTP 후보 `18085`; Edge OpenAI-compatible HTTP 후보 `18086`; Edge metrics 후보 `19102`; admin 후보 `19094`. - runtime: Go `1.24` - package manager: Go modules / Makefile - docker: unit/smoke quick check는 Docker를 요구하지 않는다. compose dev-corp 검증은 mac-mini에서 `.env.dev-corp.example` 기준으로 수행한다. - external service: dev-corp artifact/base URL 후보 `http://172.24.63.178:18085`, dev-corp Edge runtime 후보 `172.24.63.178:18087` - model endpoint: dev-corp OpenAI-compatible base URL 후보 `http://172.24.63.178:18086/v1` - credential: token/secret/API key 원문은 문서에 기록하지 않는다. ## dev-corp provider pool 인벤토리 dev-corp provider pool과 3-node 연결 상태를 점검할 때는 `agent-test/dev-corp/inventory.yaml`의 machine-readable 값을 우선하고, mac-mini `ssh fe@172.24.63.178`의 `/Users/fe/agent-work/iop-dev-corp` checkout을 기준으로 한다. - Edge host: `Mac-mini.local`, `fe@172.24.63.178`, Apple M2 Pro / 16GB - Edge config: `build/dev-corp-runtime/edge.yaml` - Edge id: `dev-corp-edge` - Control Plane HTTP/status 후보: `http://127.0.0.1:18002`, `http://127.0.0.1:18002/edges/dev-corp-edge/status` - Control Plane-Edge wire 후보: `127.0.0.1:19005` - bootstrap HTTP 후보: `http://172.24.63.178:18085` - Edge OpenAI-compatible base URL 후보: `http://172.24.63.178:18086/v1` - Edge-Node TCP transport 후보: `172.24.63.178:18087` - model alias 후보: `gemma4:26b` 노드 후보: - DGX Spark 01 vLLM node: `corp-dgx-spark-01-vllm-node` / `corp-dgx-spark-01-vllm` - SSH/user: mac-mini에서 `ssh digitalcommerce_dgx_spark_01@192.168.2.2` - provider endpoint: `http://192.168.2.2:8002/v1` - Edge adapter endpoint: node-local `http://127.0.0.1:8002/v1` - Edge connectivity: current native runtime uses mac-mini reverse SSH tunnel `127.0.0.1:28085/28087`; tunnel pid file is `build/dev-corp-runtime/node01-tunnel.pid`. - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - runtime: tmux `vllm_server_8002`, start script `/home/digitalcommerce_dgx_spark_01/start_vllm_8002.sh`, `vllm=0.23.0`, `PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, 2026-07-02 startup log GPU KV cache `834,507` tokens / full-context concurrency `3.18x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - DGX Spark 02 vLLM node: `corp-dgx-spark-02-vllm-node` / `corp-dgx-spark-02-vllm` - SSH/user: mac-mini에서 `ssh dplab@192.168.2.4` - provider endpoint: `http://192.168.2.4:8004/v1` - Edge adapter endpoint: node-local `http://127.0.0.1:8004/v1` - Edge connectivity: node02는 mac-mini `172.24.63.178:18085/18086/18087` 직접 접근이 timeout이므로 mac-mini의 reverse SSH tunnel `127.0.0.1:28085/28087`을 사용한다. - served model: `gemma-4-26B-A4B-it-NVFP4` - capacity baseline 후보: `4` - runtime: Docker container `vllm-gemma4`, start script `/home/dplab/start_vllm_gemma4_8004.sh`, host `8004` -> container `8004`, `vllm=0.23.0`, `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, startup log GPU KV cache `860,222` tokens / full-context concurrency `3.28x`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` - Mac Studio vLLM-MLX node: `corp-mac-studio-mlx-vllm-node` / `corp-mac-studio-mlx-vllm` - SSH/user: mac-mini에서 `ssh dc_dev@192.168.2.3` - provider endpoint: `http://192.168.2.3:8004/v1` - Edge adapter endpoint: node-local `http://127.0.0.1:8004/v1` - Edge provider catalog type: `openai_compat`; provider runtime type remains `vllm-mlx`. - served model: `mlx-community/gemma-4-26b-a4b-it-nvfp4` - capacity baseline 후보: `5` (`--max-num-seqs 5` 기준) - runtime: `vllm-mlx=0.3.0`, start script `/Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh`, `--max-num-seqs 5`, `--max-kv-size 786432`, `--max-request-tokens 262144` - process manager: 2026-06-25 기준 detached `screen` session `vllm_mlx_8004`; `DYLD_LIBRARY_PATH=/opt/homebrew/opt/expat/lib` 필요 Mac Studio의 `http://192.168.2.3:8005/v1` mlx-vlm DiffusionGemma endpoint는 확인된 secondary provider 후보지만, 기본 provider pool에는 넣지 않는다. 별도 alias와 capacity policy가 결정된 뒤 추가한다. ## provider runtime 설정/검증 상태 - DGX Spark 01 provider runtime은 capacity `4`, context window `262144`, requested KV `262144x2` 이상의 기준으로 재설정했다. dev-corp DGX01 vLLM 기준으로는 `--max-num-seqs 4`, `--max-model-len 262144`, `--gpu-memory-utilization 0.40`, `VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304` 조합이며, 2026-07-02 startup log에서 GPU KV cache `834,507` tokens와 `262144` tokens/request concurrency `3.18x`를 확인했다. - DGX Spark 02 provider runtime은 capacity `4`, context window `262144`, requested KV `262144x2` 이상의 기준으로 설정됐다. Docker `vllm-gemma4`는 host/container `8004` 기준으로 동작하며 startup log에서 GPU KV cache `860,222` tokens와 `262144` tokens/request concurrency `3.28x`를 확인했다. - DGX Spark 01은 FlashInfer FP4 JIT가 `ninja`를 PATH에서 호출하므로 start script에 `PATH=/home/digitalcommerce_dgx_spark_01/vllm_env/bin:$PATH`를 둔다. - Mac Studio provider runtime은 capacity `5`, context window `262144`, requested KV `262144x3` 기준으로 `--continuous-batching`, `--max-num-seqs 5`, `--prefill-batch-size 5`, `--completion-batch-size 5`, `--chunked-prefill-tokens 1024`, `--max-request-tokens 262144`, `--max-kv-size 786432`, `--reasoning-parser gemma4`을 적용했고 `/health`, `/v1/models`, 직접 동시성 `1..5` chat completion benchmark 통과를 확인했다. - 2026-07-02 재확인 기준 DGX Spark 01은 mac-mini 내부 endpoint `http://192.168.2.2:8002`에서 `/health` 200과 `/v1/models`를 통과했다. DGX Spark 02는 mac-mini에서 SSH, provider `/health`, `/v1/models`가 회복됐고 직접 provider benchmark를 통과했다. Edge OpenAI-compatible capacity smoke는 Control Plane status snapshot 기준으로 재검증 완료됐다. ## 2026-07-02 dev-corp native runtime 상태 - mac-mini checkout은 `5b1255a` 기준으로 clean sync/rebuild되었고, runtime 경로는 `/Users/fe/agent-work/iop-dev-corp/build/dev-corp-runtime`이다. - Control Plane native runtime이 활성화되어 `18002` HTTP, `19004` Client WS, `19005` CP-Edge wire를 listen한다. Edge config의 `control_plane.enabled=true`, `wire_addr=127.0.0.1:19005`로 `dev-corp-edge`가 connected 상태다. - Edge native runtime은 `18085` bootstrap, `18086` OpenAI-compatible, `18087` Edge-Node TCP, `19094` refresh admin을 listen한다. - Mac Studio provider catalog `type`은 최신 config validator 기준으로 `openai_compat`를 사용한다. 실제 provider runtime은 vLLM-MLX이고 `runtime_type: vllm-mlx`로 추적한다. - `/v1/responses` capacity smoke: 14개 동시 요청 14/14 성공, Control Plane `provider_snapshots` peak `in_flight=13`, `queued=3`, provider별 peak DGX01 `4/1`, DGX02 `4/1`, Mac Studio `5/1`, 완료 후 모두 `in_flight=0`, `queued=0`. - `/v1/chat/completions` capacity smoke: 14개 동시 요청 14/14 성공, Control Plane `provider_snapshots` peak `in_flight=13`, `queued=3`, provider별 peak DGX01 `4/1`, DGX02 `4/1`, Mac Studio `5/1`, 완료 후 모두 `in_flight=0`, `queued=0`. ## 명령 - setup: - lint: - unit: `go test ./apps/edge/...` - smoke: `./scripts/e2e-smoke.sh`는 기본 포트 임시 설정을 쓰는 보조 smoke이므로 dev-corp 포트 override 필요 여부를 먼저 확인한다. - e2e: `make test-e2e`는 보조 smoke이며 full-cycle 실제 구동을 대체하지 않는다. - model: dev-corp OpenAI-compatible profile을 띄운 경우 `OPENAI_API_KEY=$(cat build/dev-corp-runtime/.secrets/openai_api_key) iop-edge smoke openai --model gemma4:26b --base-url http://127.0.0.1:18086` - direct-provider: mac-mini에서 `curl -fsS http://192.168.2.2:8002/v1/models`, `curl -fsS http://192.168.2.4:8004/v1/models`, `curl -fsS http://192.168.2.3:8004/v1/models` - full-cycle: repo 내부 edge-node 진단, `iop-edge smoke openai`, OpenAI-compatible 입력 표면 수동 검증 ## 필수 검증 - 변경한 edge 패키지 또는 `go test ./apps/edge/...`를 실행한다. - registry, service, transport, console, HTTP/A2A 입력 표면을 바꾼 경우 edge-node 메시지 2회 왕복과 command 응답을 확인한다. - OpenAI-compatible 경계를 바꾼 경우 dev-corp `18086` 기준 `iop-edge smoke openai` 또는 동등한 `/healthz`, `/v1/models`, `/v1/responses` 확인으로 edge service와 node adapter 경로 수렴을 확인한다. - provider pool config 변경 전 mac-mini에서 세 기본 provider endpoint의 `/health`와 `/v1/models`가 성공하는지 확인한다. - DGX Spark 02가 provider port down과 SSH banner exchange timeout을 동시에 보이면 provider runtime 추가 조작을 보류하고, SSH 회복 후 process/log, `/health`, `/v1/models`, Edge OpenAI-compatible smoke를 순서대로 재검증한다. - bootstrap/artifact 경계를 바꾼 경우 dev-corp artifact/base URL 후보 `18085`가 local/test/dev field baseline을 덮어쓰지 않는지 확인한다. ## 보조 검증 - `./scripts/e2e-smoke.sh`는 edge-node 최소 생존 확인에 사용한다. - `./scripts/e2e-openai-ollama.sh`는 OpenAI-compatible 입력 표면 보조 확인에 사용할 수 있으나 provider pool capacity 검증을 대체하지 않는다. ## 판정 기준 - node 등록, `/nodes`, console 메시지 전송, 기대 payload를 포함한 `[node-*-message]` 출력, 같은 run의 complete event가 확인된다. - node 로컬 `[node-message]` payload 라인 목록과 edge `[node-*-message]` payload 라인 목록이 run별로 내용/순서까지 동일해야 한다. - edge complete는 같은 run의 마지막 `[node-*-message]` 이후에만 정상이다. - OpenAI-compatible smoke에서 `/healthz`, `/v1/models`, `/v1/responses`가 기대 상태로 응답한다. - dev-corp capacity smoke는 `/v1/responses`와 `/v1/chat/completions` 각각에 provider capacity 총합 + 1개 동시 요청을 보낸다. Edge config에서 기본 후보 capacity `4 + 4 + 5 = 13`을 확정한 경우 Control Plane status의 `provider_snapshots`에서 총 `in_flight=13`, `queued>=1` 관측을 기준으로 한다. - capacity smoke 완료 후 대상 provider의 `in_flight=0`, `queued=0` 회복을 확인한다. - Gemma 계열 provider-pool smoke는 reasoning/tool-parser 관련 텍스트가 포함될 수 있다. exact-output match를 기본 판정으로 쓰지 않는다. ## 기준 출력 예시 ```text curl -fsS http://192.168.2.2:8002/v1/models curl -fsS http://192.168.2.4:8004/v1/models curl -fsS http://192.168.2.3:8004/v1/models ``` ## 차단 기준 - mac-mini host 또는 Edge-Node TCP 후보 port 접근이 불가능하다. - mac-mini에 `/Users/fe/agent-work/iop-dev-corp` checkout이 없어 dev-corp runtime artifact를 만들 수 없다. - provider endpoint `192.168.2.2:8002`, `192.168.2.4:8004`, `192.168.2.3:8004` 중 필수 endpoint가 닫혀 있다. - 외부 CLI profile 검증에 필요한 CLI 설치, 계정, provider 상태가 없다. - dev-corp 포트가 local/test/dev baseline과 충돌한다. ## 보고 항목 - 실행한 명령: - 성공한 검증: - 실패/차단된 검증: - 생략 사유: - 남은 위험: ## 금지 사항 - secret, token, API key 원문은 tracked 파일에 기록하지 않는다. - mac-mini에서 다시 도달 가능한 provider endpoint를 확인하지 않고 Edge provider config 성공을 선언하지 않는다. - field baseline 포트(`18080`, `18081`, `19090`, `19092`)나 dev 포트(`18082`, `18083`, `19003`, `19101`)를 dev-corp 전용 포트로 재사용하지 않는다.