--- test_env: dev test_profile: edge-smoke domain: edge verification_type: smoke last_rule_updated_at: 2026-06-24 --- # edge-smoke dev 테스트 ## 읽기 조건 - `apps/edge/**` 변경 또는 edge registry, transport, service, console, OpenAI-compatible/A2A 입력 표면 dev 검증 판단이 필요한 경우 ## 적용 범위 - `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/**` ## 분류 - domain: edge - verification_type: smoke - scope: edge 실행 그룹, node registry, input surface baseline ## 환경 - host: local checkout. dev runtime, external CLI, shared port evidence가 필요하면 원격 runner를 사용한다. - port: compose Edge-Node TCP transport `19003`; dev artifact/bootstrap HTTP 후보 `18082`, dev Edge OpenAI-compatible HTTP 후보 `18083`, dev Edge metrics 후보 `19101`. - runtime: Go `1.24` - package manager: Go modules / Makefile - docker: unit/smoke quick check는 Docker를 요구하지 않는다. compose dev 검증은 `docker compose --env-file .env.dev.example ...`로 수행한다. - external service: dev artifact/base URL 후보 `http://toki-labs.com:18082`, dev Edge runtime 주소 후보 `toki-labs.com:19003` - model endpoint: dev OpenAI-compatible base URL 후보 `http://toki-labs.com:18083/v1` - credential: token/secret 원문은 문서에 기록하지 않는다. ## dev-runtime provider pool 인벤토리 dev-runtime provider pool과 3-node 연결 상태를 점검할 때는 `agent-test/dev/inventory.yaml`의 machine-readable 값을 우선하고, 원격 runner `ssh toki@toki-labs.com`의 `/Users/toki/agent-work/iop-dev` checkout을 기준으로 한다. - Edge config: `build/dev-runtime/edge.yaml` - Edge id: `edge-toki-labs-dev` - Control Plane HTTP: `http://127.0.0.1:18001` - bootstrap HTTP: `http://toki-labs.com:18082` - Edge OpenAI-compatible base URL: `http://toki-labs.com:18083/v1` - Edge-Node TCP transport: `toki-labs.com:18084` - model alias: `qwen3.6:35b` 노드 후보: - mac CLI node: `mac-codex-node` / `mac-codex` - SSH/user: `ssh toki@toki-labs.com` - 목적: `cli` adapter, `codex app-server` - workspace: `/Users/toki/agent-work/iop-workspace/nomadcode` - GX10 vLLM node: `gx10-vllm-node` / `gx10-vllm` - SSH/user: `ssh toki@192.168.0.91` - provider endpoint: `http://192.168.0.91:8001/v1` - served model: `nvidia/Qwen3.6-35B-A3B-NVFP4` - capacity baseline: `4` - workspace: `/home/toki/iop-gx10-vllm` - OneXPlayer Lemonade node: `onexplayer-lemonade-node` / `onexplayer-lemonade` - SSH/user: `ssh r0bin@192.168.0.59` - 접속 기준: 현재 작업 호스트에서 직접 SSH - provider endpoint: `http://192.168.0.59:13305/v1` - served model: `Qwen3.6-35B-A3B-MTP-GGUF` - capacity baseline: `3` - workspace: `C:/Users/r0bin/iop-field` OneXPlayer Lemonade Node는 원격 runner나 Edge host에서 다시 SSH하거나 proxy process로 띄우지 않는다. 현재 작업 호스트에서 OneXPlayer Windows host에 `ssh r0bin@192.168.0.59`로 직접 접속한 뒤 generated PowerShell bootstrap을 실행한다. ## 명령 - setup: - lint: - unit: `go test ./apps/edge/...` - smoke: `./scripts/e2e-smoke.sh`는 기본 포트 임시 설정을 쓰는 보조 smoke이므로 dev 포트 override 필요 여부를 먼저 확인한다. - e2e: `make test-e2e`는 보조 smoke이며 full-cycle 실제 구동을 대체하지 않는다. - model: dev OpenAI-compatible profile을 띄운 경우 `iop-edge smoke openai --base-url http://127.0.0.1:18083` - 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 `18083` 기준 `iop-edge smoke openai` 또는 동등한 `/healthz`, `/v1/models`, `/v1/responses` 확인으로 edge service와 node adapter 경로 수렴을 확인한다. - bootstrap/artifact 경계를 바꾼 경우 dev artifact/base URL 후보 `18082`가 local/test `18080` field baseline을 덮어쓰지 않는지 확인한다. ## 보조 검증 - `./scripts/e2e-smoke.sh`는 edge-node 최소 생존 확인에 사용한다. - `./scripts/e2e-openai-ollama.sh`는 OpenAI-compatible Ollama 입력 표면 보조 확인에 사용한다. ## 판정 기준 - 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-runtime capacity smoke는 `/v1/responses`와 `/v1/chat/completions` 각각에 provider capacity 총합 + 1개 동시 요청을 보내고, Control Plane status의 `provider_snapshots`에서 총 `in_flight`가 capacity 총합에 도달하며 `queued`가 1 이상 잡히는지 확인한다. 현재 `gx10-vllm=4`, `onexplayer-lemonade=3`이면 endpoint별 8개 동시 요청에서 총 `in_flight=7`, `queued>=1` 관측을 기준으로 한다. - capacity smoke 완료 후 대상 provider의 `in_flight=0`, `queued=0` 회복을 확인한다. - Qwen 계열 provider-pool smoke는 thinking/reasoning 텍스트가 포함될 수 있다. 추론 출력 자체를 실패로 보지 말고 HTTP 성공, model alias, final marker 포함 여부, provider node log/run count 증가로 판정한다. 응답 전체가 특정 token과 정확히 같은지 비교하는 strict exact-match는 이 profile의 기본 판정으로 쓰지 않는다. - bootstrap 사용자 명령은 완성된 URL과 positional token 하나만 포함한다. ## 기준 출력 예시 ```text edge> /nodes [edge] sent run_id=... [node-*-message] IOP_EXPECTED_REPLY [node-*-event] complete ``` ## 차단 기준 - dev host 또는 Edge-Node TCP port 접근이 불가능하다. - 외부 CLI profile 검증에 필요한 CLI 설치, 계정, provider 상태가 없다. - dev artifact/model/metrics 포트가 기존 field baseline과 충돌한다. ## 보고 항목 - 실행한 명령: - 성공한 검증: - 실패/차단된 검증: - 생략 사유: - 남은 위험: ## 금지 사항 - secret, token, 개인 endpoint 원문은 tracked 파일에 기록하지 않는다. - field baseline 포트(`18080`, `18081`, `19090`, `19092`)를 dev 전용 포트로 재사용하지 않는다.