iop/agent-test/dev-corp/rules.md

115 lines
12 KiB
Markdown

---
test_env: dev-corp
last_rule_updated_at: 2026-07-08
---
# dev-corp 테스트 규칙
**현재 문서를 반드시 끝까지 정독하고 작업한다. 다 읽지 않고 즉각 작업은 금지한다.**
**dev-corp 테스트 환경은 회사망 내부 mac-mini Edge host와 내부 provider nodes를 기준으로 하며, local/dev stack과 공존하도록 host publish 포트와 runtime profile을 분리한다.**
## 공통 규칙
- dev-corp 테스트/검증은 이 파일을 기준으로 판단한다.
- 작업 완료 검증은 변경 범위 기준으로 선택한다.
- 필수 검증을 실행하지 못하면 차단 사유로 보고한다.
- 최종 보고에는 실행 명령, 결과, 생략 사유, 남은 위험을 남긴다.
- 환경값, secret, 개인 endpoint는 tracked docs/roadmap에 쓰지 않는다.
- token/secret/API key 원문은 원격 환경에서 주입하고, shell stdout/stderr와 최종 보고에 출력하지 않는다.
- private IP와 SSH user는 테스트 접속에 필요한 환경값으로 기록할 수 있으나, token/secret 원문은 기록하지 않는다.
- 테스트용 Docker 환경을 작성/수정할 때는 Docker Compose `networks`, IPAM subnet, static IPv4, `extra_hosts`, host publish 문서 어디에도 회사 LAN/VPN과 충돌하는 대역을 사용하지 않는다.
## 기본 배포 통로
- dev-corp 기본 외부 배포/검증 통로는 `115.21.224.82`이다. Control Plane public 후보, Client WS public 후보, artifact/bootstrap public 후보, Edge OpenAI-compatible public 후보는 이 경로를 우선한다.
- `172.24.63.178`은 mac-mini SSH runner와 node-only/internal Edge-Node 경로로만 본다. 사용자가 172 경로를 명시적으로 요청하지 않으면 기본 dev-corp 배포 방향이나 OpenAI-compatible smoke 대상에 사용하지 않는다.
- `172.24.63.178`로 Edge를 배포하는 것은 기본 금지다. 사용자가 “172로 Edge 배포” 또는 같은 의미의 명시 요청을 한 경우에만 172 Edge 배포/검증을 진행한다.
- provider direct 확인은 기존처럼 mac-mini에서 내부 provider endpoint `192.168.2.2:8002`, `192.168.2.4:8004`, `192.168.2.3:8004`를 확인한다.
## 기본 환경
- host: Edge runner 후보는 `ssh fe@172.24.63.178` mac-mini이다.
- repo root: 목표 checkout은 `/Users/fe/agent-work/iop-dev-corp`이다. 2026-07-02 기준 해당 checkout과 `build/dev-corp-runtime` runtime이 배포되어 있으며, `/Users/fe/iop-field`는 unrelated legacy field state로 본다.
- sync 기준: dev-corp 배포 전 mac-mini checkout은 배포 기준 ref로 clean sync하고 dirty 변경은 보존 대상으로 보지 않는다.
- env file: compose stack을 만들면 `.env.dev-corp.example`로 분리한다. 파일 생성 전에는 native/provider-pool profile만 기준으로 삼는다.
- compose identity: `COMPOSE_PROJECT_NAME=iop-dev-corp-agent`, `IOP_COMPOSE_NETWORK=iop-dev-corp-agent-net`.
- port: web/dev preview `13002`, Control Plane HTTP `18002`, Client WS `19004`, CP-Edge wire `19005`, compose Edge-Node TCP `19006`, native Edge-Node TCP 후보 `18087`, Edge admin 후보 `19094`.
- optional field ports: artifact/bootstrap HTTP `18085`, Edge OpenAI-compatible HTTP `18086`, Edge metrics `19102`.
- runtime: Go quick check는 local toolchain을 우선한다. Docker/Flutter/client/field/bootstrap/provider-pool evidence는 mac-mini와 내부 provider nodes를 사용한다.
- package manager: Go modules / Makefile / Flutter pub
- docker: 현재 작업 컨테이너에서는 Docker-in-Docker를 사용하지 않는다. Docker compose 검증은 mac-mini checkout에서 수행한다.
- external service: dev-corp Control Plane 후보는 mac-mini local 기준 `http://127.0.0.1:18002`, 기본 외부 후보 `http://115.21.224.82:18002`이다. Client wire 후보는 mac-mini local 기준 `ws://127.0.0.1:19004/client`, 기본 외부 후보 `ws://115.21.224.82:19004/client`이다.
- model endpoint: Edge 배포 후 기본 외부 후보 `http://115.21.224.82:18086/v1`; 직접 provider 확인은 `agent-test/dev-corp/inventory.yaml`의 provider endpoint를 따른다.
- credential: secret/token/API key 원문은 문서에 기록하지 않는다.
## 포트 매핑
| 용도 | local/test | dev | dev-corp |
|---|---:|---:|---:|
| Web preview | `13000` | `13001` | `13002` |
| Control Plane HTTP | `18000` | `18001` | `18002` |
| CP Client WS | `19080` | `19001` | `19004` |
| CP-Edge wire | `19081` | `19002` | `19005` |
| Edge-Node TCP | `19090` | `19003` | `19006` |
| Edge artifact/bootstrap | `18080` | `18082` | `18085` |
| Edge OpenAI-compatible | `18081` | `18083` | `18086` |
| Edge metrics | `19092` | `19101` | `19102` |
| PostgreSQL host publish | `15400` | `15401` | `15402` |
| Redis host publish | `16300` | `16301` | `16302` |
dev-corp native/provider-pool profile은 compose Edge-Node TCP `19006`이 아니라 native Edge listen 후보 `18087`을 사용한다. DGX Spark 01/02처럼 직접 접근이 막힌 host는 mac-mini reverse SSH tunnel의 `127.0.0.1:28087`을 Node Edge addr로 사용할 수 있다. 세부 provider endpoint와 Node 접속 기준은 `agent-test/dev-corp/inventory.yaml`, `agent-test/dev-corp/edge-smoke.md`, `agent-test/dev-corp/node-smoke.md`를 따른다.
## 런타임 프로필
- local quick check: 현재 checkout에서 Go quick check를 우선 실행한다.
- remote runner: dev-corp runtime evidence, Flutter client, Docker compose, field/bootstrap, provider-pool evidence는 `ssh fe@172.24.63.178``/Users/fe/agent-work/iop-dev-corp` 기준으로 수행한다.
- compose dev-corp stack: `.env.dev-corp.example`, `COMPOSE_PROJECT_NAME=iop-dev-corp-agent`, `IOP_COMPOSE_NETWORK=iop-dev-corp-agent-net`, Edge-Node TCP `19006`을 사용한다.
- Edge direct dev-corp profile: artifact/bootstrap `18085`, OpenAI-compatible `18086`, metrics `19102`, admin `19094`를 사용한다.
- dev-corp provider pool: `/Users/fe/agent-work/iop-dev-corp/build/dev-corp-runtime/edge.yaml`과 기본 public Edge-Node TCP `115.21.224.82:18087`을 기준으로 한다. `172.24.63.178:18087`은 Edge 배포 대상이 아니라 node-only/internal 경로 또는 host별 reverse SSH tunnel이 필요한 경우에만 사용한다. 172 Edge 배포는 사용자 명시 요청 전까지 진행하지 않는다. 3-node/provider 세부는 `agent-test/dev-corp/edge-smoke.md``agent-test/dev-corp/node-smoke.md`를 따른다.
- current native Control Plane: 2026-07-02 기준 provider-pool runtime에서 `build/dev-corp-runtime/bin/control-plane``18002/19004/19005`를 listen하고, Edge id `dev-corp-edge``127.0.0.1:19005`로 연결된다. provider snapshot status 기준은 `http://127.0.0.1:18002/edges/dev-corp-edge/status`다.
- external provider field: DGX Spark 01/02와 Mac Studio는 mac-mini에서 내부 SSH로 접속한다. 직접 접속 경로와 provider endpoint는 `agent-test/dev-corp/inventory.yaml`을 따른다.
## 프리플라이트
- plan 작성 시 필수 검증이 현재 checkout을 벗어나 mac-mini runner, field/bootstrap, 외부 provider, Docker/code-server, emulator/device, 공유 장기 runtime을 사용하면 먼저 테스트 환경 프리플라이트를 계획에 기록한다.
- 테스트 환경 프리플라이트에는 runner, repo root/workdir, branch/HEAD/dirty 상태, local 변경과 원격 source 동기화 여부, binary/artifact 경로와 필요한 help/version 출력, config path, runtime identity, port/process 상태, 외부 host, OS/arch 가정을 포함한다.
- mac-mini에 `/Users/fe/agent-work/iop-dev-corp` checkout이 없으면 배포/검증을 시작하지 말고 checkout 생성과 source sync를 setup blocker로 보고한다.
- provider pool 검증 전 mac-mini에서 `192.168.2.2:8002`, `192.168.2.4:8004`, `192.168.2.3:8004``/health``/v1/models`를 먼저 확인한다.
- `gemma4:26b` alias와 총 capacity `13``agent-test/dev-corp/inventory.yaml`의 최신 검증 상태를 기준으로 판단한다. 새 배포에서 Edge config 반영과 capacity smoke가 통과하기 전에는 새 결과를 확정값으로 보고하지 않는다.
- 프리플라이트에서 dirty/divergent checkout 또는 stale artifact가 확인되면 dev-corp 배포에서는 먼저 원격 checkout을 clean sync하고 dev-corp runtime 바이너리를 rebuild한다. 잘못된 identity, missing command, closed port, host OS 불일치, source 미동기화가 확인되면 plan은 setup/sync/rebuild 단계를 만들거나 blocker로 보고한다.
## 노드/Provider 인벤토리 위치
- dev-corp provider pool machine-readable 기준: `agent-test/dev-corp/inventory.yaml`
- dev-corp provider pool과 Edge/OpenAI-compatible 입력 표면 상세 기준: `agent-test/dev-corp/edge-smoke.md`
- dev-corp Node 접속과 bootstrap 상세 기준: `agent-test/dev-corp/node-smoke.md`
- 공통 provider config 계약 기준: `agent-test/dev-corp/platform-common-smoke.md`
- compose stack 기준: `agent-test/dev-corp/control-plane-smoke.md`, `agent-test/dev-corp/client-smoke.md`, `agent-test/dev-corp/testing-smoke.md`
## Field/bootstrap 반복 테스트 기준
- field/bootstrap 검증은 mac-mini runner의 `/Users/fe/agent-work/iop-dev-corp` checkout과 dev-corp runtime artifact를 기준으로 수행한다.
- compose dev-corp stack은 Edge-Node TCP `19006`을 사용하고, dev-corp provider pool은 native Edge listen `18087`을 사용한다. 두 프로필을 섞어서 판정하지 않는다.
- Node bootstrap은 Edge의 `node register`가 출력한 OS별 완성 명령을 그대로 사용한다. 사용자에게 안내하는 명령에는 임의 placeholder, 수동 token 치환, `IOP_*=` named environment parameter를 넣지 않는다.
- token, API key, private credential 원문은 tracked docs, roadmap, 테스트 규칙에 기록하지 않는다. 실행 증거에는 token을 마스킹하거나 명령 생성 사실만 남긴다.
- Linux/macOS Node는 생성된 `curl | bash` 계열 명령을 사용한다. Windows Node는 dev-corp provider pool의 기본 대상이 아니다.
- dev-corp runtime 배포는 clean sync 후 `build/dev-corp-runtime/bin/control-plane`, `build/dev-corp-runtime/bin/iop-edge`, mac node, Linux ARM64 node binary를 같은 source 기준으로 rebuild한다.
- provider capacity, model/provider mapping은 `config check``config refresh --mode dry-run`을 통과한 뒤 `config refresh --mode apply`로 반영한다. refresh subcommand 또는 `19094` admin port가 없으면 바이너리 rebuild 누락으로 보고 먼저 rebuild한다.
- Edge process restart 또는 일시 단절 후에는 Node reconnect 정책을 검증한다. retry 한계를 넘겨 Node process가 종료된 경우에만 해당 Node host에서 새 bootstrap 실행이 필요하다.
## 라우팅
- node / smoke / node 실행 파이프라인 baseline: `agent-test/dev-corp/node-smoke.md`
- edge / smoke / edge 실행 그룹과 입력 표면 baseline: `agent-test/dev-corp/edge-smoke.md`
- dev-corp provider pool, 3-node 연결, DGX Spark vLLM, Mac Studio vLLM-MLX 점검: `agent-test/dev-corp/edge-smoke.md`, `agent-test/dev-corp/node-smoke.md`
- control-plane / smoke / control-plane health와 wire baseline: `agent-test/dev-corp/control-plane-smoke.md`
- client / smoke / Flutter client와 IOP console package baseline: `agent-test/dev-corp/client-smoke.md`
- platform-common / smoke / 공통 설정과 protobuf 계약 baseline: `agent-test/dev-corp/platform-common-smoke.md`
- testing / smoke / 테스트 도구와 full-cycle 검증 baseline: `agent-test/dev-corp/testing-smoke.md`
## 라우팅 규칙
- 여러 항목이 맞으면 모두 읽는다.
- 도메인 매핑이나 domain rule이 있으면 각 도메인의 `<domain>-smoke` 문서를 기본 baseline으로 둔다.
- 도메인이 아직 없을 때만 project-smoke를 fallback baseline으로 둔다.
- 도메인/검증 시나리오별 문서는 다른 테스트 문서로 라우팅하지 않는다.