---
test_env: dev
test_profile: testing-smoke
domain: testing
verification_type: smoke
last_rule_updated_at: 2026-06-12
---

# testing-smoke dev 테스트

## 읽기 조건

- `Makefile`, `scripts/dev/**`, `scripts/e2e-*.sh`, bootstrap pack, 테스트/검증 절차, dev compose/profile 변경 판단이 필요한 경우

## 적용 범위

- `Makefile`
- `scripts/dev/edge.sh`
- `scripts/dev/node.sh`
- `scripts/e2e-smoke.sh`
- `scripts/e2e-openai-ollama.sh`
- `iop-edge bootstrap pack`
- `docker-compose.yml`
- `.env.dev.example`
- `agent-test/dev/**`

## 분류

- domain: testing
- verification_type: smoke
- scope: 테스트 도구, 보조 smoke, full-cycle 실제 구동 기준

## 환경

- host: local checkout. Flutter client 포함 검증, Docker compose, field/bootstrap, artifact server, external CLI profile evidence가 필요하면 원격 runner를 사용한다.
- port: web/dev preview `13001`, artifact/bootstrap HTTP 후보 `18082`, Edge OpenAI-compatible HTTP 후보 `18083`, Portal/Control Plane wire test endpoint `19001`, CP-Edge wire `19002`, Edge-Node TCP transport `19003`, Edge metrics 후보 `19101`, Control Plane metrics `19103`, Prometheus `19111`, Grafana `19121`.
- runtime: Go `1.24`
- package manager: Go modules / Makefile
- docker: quick check는 Docker를 요구하지 않는다. 현재 작업 컨테이너에서는 Docker-in-Docker를 사용하지 않으며, Docker compose 검증은 원격 runner 또는 code-server 환경에서 수행한다.
- external service: dev Control Plane HTTP `http://toki-labs.com:18001`, dev Client wire `ws://toki-labs.com:19001/client`, dev Edge runtime 후보 `toki-labs.com:19003`
- model endpoint: dev OpenAI-compatible base URL 후보 `http://toki-labs.com:18083/v1`
- operator notice: 기존 테스트 사용자 URL은 변경하지 않는다. Grafana `127.0.0.1:19121`, Prometheus `127.0.0.1:19111`은 원격 runner 내부 또는 SSH 터널로 접근하는 운영/검증자용 신규 관측 endpoint다.
- credential: token/secret 원문은 문서에 기록하지 않는다.

## 명령

- setup:
- lint:
- unit: `make test`
- smoke: `./scripts/e2e-smoke.sh`
- compose-smoke: `IOP_EDGE_NODE_TOKEN=<token> docker compose --env-file .env.dev.example up -d postgres redis control-plane web prometheus grafana`
- compose-health: `curl -fsS http://127.0.0.1:18001/healthz`
- e2e: `make test-e2e`
- model: `./scripts/e2e-openai-ollama.sh`
- full-cycle: `make pack-node-target`, repo 내부 edge-node 진단, field bootstrap UX, 실제 외부 CLI profile 검증

## 필수 검증

- 테스트 도구 자체를 바꾼 경우 해당 도구를 직접 실행해 성공/실패 판정을 확인한다.
- 사용자 실행 파이프라인에 닿는 변경은 일반 Go 테스트와 변경 범위에 맞는 full-cycle 실제 구동을 함께 검증한다.
- dev compose/profile 변경 시 `docker compose --env-file .env.dev.example config`로 렌더링된 host publish 포트와 network name을 확인한다.
- `iop-edge bootstrap pack`, `make pack-edge`, 내장 artifact server 변경 시 현재 host target build와 artifact/checksum/bootstrap script를 확인한다.
- field/bootstrap/deploy 작업은 one-line bootstrap UX 기준을 적용한다.
- 사용자에게 전달하는 Node bootstrap 명령은 완성된 URL과 token positional value 하나만 포함한다.

## 보조 검증

- `make test-e2e`, `./scripts/e2e-smoke.sh`, `./scripts/e2e-openai-ollama.sh`는 보조 smoke다.
- 보조 smoke는 full-cycle 실제 구동이나 field bootstrap 검증을 대체하지 않는다.

## 판정 기준

- dev compose는 `COMPOSE_PROJECT_NAME=iop-dev-agent`, `IOP_COMPOSE_NETWORK=iop-dev-agent-net`, `IOP_COMPOSE_SUBNET=10.89.1.0/24`를 사용한다.
- dev compose가 local/test 포트 `13000`, `18000`, `19080`, `19081`, `15400`, `16300`을 점유하지 않는다.
- dev Control Plane 관측 그룹은 `control-plane`, `web`, `postgres`, `redis`, `prometheus`, `grafana`를 한 compose project로 묶고, Edge는 연결 검증이 필요할 때 같은 compose의 인접 service로 붙인다.
- dev 관측 세팅은 기존 Edge/OpenAI-compatible 후보 `18083` 또는 기존 사용자-facing URL을 바꾸지 않는다.
- Prometheus는 dev native Edge metrics `host.docker.internal:19101`을 scrape해 사용자별 OpenAI-compatible token usage metric을 수집한다.
- edge console에서 메시지 2회가 각각 기대 payload를 포함한 `[node-*-message]`로 표시되고, command 결과가 edge 화면에 도착한다.
- node 로컬 `[node-message]` payload 라인 목록과 edge `[node-*-message]` payload 라인 목록이 run별로 내용/순서까지 동일해야 한다.
- Node bootstrap UX는 `curl -fsSL <완성된-bootstrap-url> | bash -s <token>` 형태를 유지한다.

## 기준 출력 예시

```text
docker compose --env-file .env.dev.example config
curl -fsS http://127.0.0.1:18001/healthz
```

## 차단 기준

- dev host 접근, 지정 port, 외부 CLI 설치/계정/provider 상태가 없어 필수 검증을 수행할 수 없다.
- 사용자가 명시하지 않았는데 code-server 컨테이너 재시작이 필요한 상황이다.
- dev 포트가 이미 사용 중이라 local/test stack과 공존할 수 없다.

## 보고 항목

- 실행한 명령:
- 성공한 검증:
- 실패/차단된 검증:
- 생략 사유:
- 남은 위험:

## 금지 사항

- 보조 E2E smoke 통과만으로 완료 처리하지 않는다.
- 사용자 기본 경로에서 `IOP_ARTIFACT_BASE_URL=...`, `IOP_EDGE_ADDR=...`, `IOP_NODE_TOKEN=...` 같은 named environment parameter를 요구하지 않는다.
- 사용자가 명시하지 않으면 code-server 컨테이너를 재시작하지 않는다.
- 환경값을 사람용 docs나 roadmap에 복사하지 않는다.
- secret, token, 개인 endpoint 원문은 tracked 파일에 기록하지 않는다.
