iop/agent-test/dev-corp/edge-smoke.md

18 KiB

test_env test_profile domain verification_type last_rule_updated_at
dev-corp edge-smoke edge smoke 2026-07-08

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://115.21.224.82:18085, dev-corp Edge runtime 기본 후보 115.21.224.82:18087; 172.24.63.178:18085/18087로 Edge를 배포하는 것은 기본 금지이며, 사용자가 172 Edge 경로를 명시 요청한 경우에만 사용한다.
  • model endpoint: dev-corp OpenAI-compatible base URL 기본 후보 http://115.21.224.82: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://115.21.224.82:18085
  • Edge OpenAI-compatible base URL 기본 후보: http://115.21.224.82:18086/v1
  • Edge-Node TCP transport 기본 후보: 115.21.224.82:18087
  • node-only/internal 후보: 172.24.63.178:18085/18086/18087은 기본 Edge 배포 후보가 아니다. 사용자가 172 Edge 경로를 명시 요청했거나 host별 reverse SSH tunnel이 필요한 경우에만 사용한다.
  • 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.24.0, PATH=/home/digitalcommerce_dgx_spark_01/vllm_env_0_24_0/bin:$PATH, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40, --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0, --enable-auto-tool-choice, --tool-call-parser gemma4, --chat-template /home/digitalcommerce_dgx_spark_01/tool_chat_template_gemma4.jinja, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}', 2026-07-08 startup log GPU KV cache 1,453,705 tokens / full-context concurrency 5.55x, 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, image vllm/vllm-openai:v0.24.0, vllm=0.24.0, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40, --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0, --enable-auto-tool-choice, --tool-call-parser gemma4, --chat-template /vllm-workspace/examples/tool_chat_template_gemma4.jinja, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}', 2026-07-08 startup log GPU KV cache 1,452,633 tokens / full-context concurrency 5.54x, 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 (provider catalog capacity; current runtime headroom --max-num-seqs 6)
    • runtime: vllm-mlx=0.4.0, start script /Users/dc_dev/iop-dev-corp-field/start_vllm_mlx_8004.sh, python /Users/dc_dev/vllm-env-0.4.0/bin/python, --continuous-batching, --max-num-seqs 6, --prefill-batch-size 6, --completion-batch-size 6, --chunked-prefill-tokens 1024, --disable-prefix-cache, --max-kv-size 786432, --max-request-tokens 262144, --enable-auto-tool-choice, --tool-call-parser gemma4, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'
    • 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 기준으로는 vllm=0.24.0, --max-num-seqs 4, --max-model-len 262144, --gpu-memory-utilization 0.40, --enforce-eager, text-only multimodal limits, --default-chat-template-kwargs '{"enable_thinking":true}', VLLM_MAX_TOKENS_PER_EXPERT_FP4_MOE=4194304 조합이며, 2026-07-08 startup log에서 GPU KV cache 1,453,705 tokens와 262144 tokens/request concurrency 5.55x를 확인했다.
  • DGX Spark 02 provider runtime은 capacity 4, context window 262144, requested KV 262144x2 이상의 기준으로 설정됐다. Docker vllm-gemma4는 host/container 8004, image vllm/vllm-openai:v0.24.0, text-only/eager, --default-chat-template-kwargs '{"enable_thinking":true}' 기준으로 동작하며 2026-07-08 startup log에서 GPU KV cache 1,452,633 tokens와 262144 tokens/request concurrency 5.54x를 확인했다.
  • DGX Spark 01은 0.24.0 venv의 toolchain을 사용하므로 start script에 PATH=/home/digitalcommerce_dgx_spark_01/vllm_env_0_24_0/bin:$PATH를 둔다.
  • Gemma4 agent/tool-call compatibility profile은 DGX Spark 01/02 vLLM에서 --enable-auto-tool-choice, --tool-call-parser gemma4, Gemma4 tool chat template, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}', --enforce-eager, --skip-mm-profiling, --limit-mm-per-prompt '{"image": 0, "video": 0}', --mm-processor-cache-gb 0을 함께 둔다. Mac Studio vLLM-MLX는 별도 chat template override 없이 --continuous-batching, --disable-prefix-cache, --enable-auto-tool-choice, --tool-call-parser gemma4, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'를 둔다. Qwen provider는 dev-runtime 문서의 Qwen 전용 parser/template 값을 따른다.
  • Mac Studio provider runtime은 vllm-mlx=0.4.0, provider catalog capacity 5, context window 262144, requested KV 262144x3 기준으로 --continuous-batching, runtime headroom --max-num-seqs 6, --prefill-batch-size 6, --completion-batch-size 6, --chunked-prefill-tokens 1024, --disable-prefix-cache, --max-request-tokens 262144, --max-kv-size 786432, --enable-auto-tool-choice, --tool-call-parser gemma4, --reasoning-parser gemma4, --default-chat-template-kwargs '{"enable_thinking":true}'를 적용했고 /health, /v1/models, 직접 API non-stream/stream auto tool-call, streaming multi-turn tool-result final answer, Pi -p tool-call, Pi TUI 초기 프롬프트 tool-call 로그 종료를 확인했다.
  • Mac Studio vLLM-MLX의 위 값은 2026-07-08 기준 구동 가능한 최종 체크포인트다. 잔여 이슈로 Gemma4 thought channel delimiter가 최종 content에 누수될 수 있으며, 이 경우 runtime option 미세 조정보다 vLLM-MLX Gemma provider 전용 Pi extension/provider adapter sanitizer를 우선 검토한다. 추가 튜닝은 Spark vLLM 설정과 분리된 별도 실험으로만 수행한다.
  • 2026-07-08 재확인 기준 DGX Spark 01은 mac-mini 내부 endpoint http://192.168.2.2:8002에서 /health 200과 /v1/models, 직접 API forced/auto/streaming tool-call smoke, 로컬 Pi TUI bash/git-push tool-call 흐름을 통과했다. DGX Spark 02는 mac-mini 내부 endpoint http://192.168.2.4:8004에서 /health 200과 /v1/models, 직접 API auto/streaming tool-call smoke를 통과했다. Edge OpenAI-compatible capacity smoke는 source ref c2437aaedefbac4312d69dfd10aa017c2739e187 재배포 후 /v1/responses, /v1/chat/completions 각각 15개 동시 요청으로 통과했다.
  • Gemma provider-pool gemma4:26bdefault_thinking_token_budget: 1024 기준으로 thinking을 기본 활성화한다. Edge strict output이 켜져 있어도 provider-pool catalog의 thinking policy가 우선하며, vLLM/vLLM-MLX adapter에는 chat_template_kwargs.enable_thinking=true로 전달되는지 확인한다.
  • Gemma provider를 Pi/Cline형 agent/tool-call 용도로 검증할 때는 일반 chat smoke와 별도로 forced tool call, auto tool call, streaming delta.tool_calls, multi-turn tool result 후 최종 답변을 확인한다. raw <|tool_call>/<|"|> marker나 thought channel text가 assistant content로 새면 provider parser/template profile 또는 Edge relay 경계 문제로 판정한다.
  • Gemma provider-pool의 IOP queue timeout은 두지 않는다. config 값은 queue_timeout_ms=0이며, caller context cancellation 또는 연결 종료로만 queued request를 중단한다. OpenAI run timeout과 backend request timeout은 long reasoning/long-context 요청을 위해 각각 openai.timeout_sec=1800, request_timeout_ms=1800000으로 둔다.

2026-07-08 dev-corp native runtime 상태

  • mac-mini checkout은 c2437aaedefbac4312d69dfd10aa017c2739e187 기준으로 clean sync/rebuild/redeploy되었고, 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:19005dev-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 표준: 15개 동시 요청, Control Plane provider_snapshots peak total in_flight=13, queued>=2, provider별 in_flight가 DGX01 4, DGX02 4, Mac Studio 5를 넘지 않고 완료 후 모두 in_flight=0, queued=0으로 회복해야 한다. 2026-07-08 검증에서는 15/15 성공, peak total in_flight=13, queued=6, provider별 max queued 2로 통과했다.
  • /v1/chat/completions capacity smoke 표준: 15개 동시 요청, Control Plane provider_snapshots peak total in_flight=13, queued>=2, provider별 in_flight가 DGX01 4, DGX02 4, Mac Studio 5를 넘지 않고 완료 후 모두 in_flight=0, queued=0으로 회복해야 한다. 2026-07-08 검증에서는 15/15 성공, peak total in_flight=13, queued=6, provider별 max queued 2로 통과했다.

명령

  • 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 각각에 15개 동시 요청을 보낸다. Edge config에서 기본 후보 capacity 4 + 4 + 5 = 13을 확정한 경우 Control Plane status의 provider_snapshots에서 총 in_flight=13, queued>=2 관측을 기준으로 한다.
  • capacity smoke 완료 후 대상 provider의 in_flight=0, queued=0 회복을 확인한다.
  • Gemma 계열 provider-pool smoke는 thinking enabled 기준이며 reasoning/tool-parser 관련 텍스트가 포함될 수 있다. exact-output match를 기본 판정으로 쓰지 않는다.

기준 출력 예시

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 성공을 선언하지 않는다.
  • 사용자가 명시적으로 요청하지 않았는데 172.24.63.178로 Edge를 배포하거나 172.24.63.178을 Edge public runtime 기본 후보로 사용하지 않는다.
  • field baseline 포트(18080, 18081, 19090, 19092)나 dev 포트(18082, 18083, 19003, 19101)를 dev-corp 전용 포트로 재사용하지 않는다.