# agent-test 환경 확장 기준

이 디렉터리는 테스트 환경별 실행 기준과 도메인/검증 시나리오별 profile을 둔다.
새 환경(`qa`, `staging`, `dev-gpu`, `dev-team-a` 등)을 추가할 때는 기존 환경을 임의로 복사하지 말고 이 기준과 `_templates/`를 먼저 따른다.

## 환경 선택 기본값

- 사용자가 테스트 환경을 별도로 지정하지 않으면 기본 테스트/검증 환경은 `dev`다.
- `dev-corp`는 fallback, 자동 탐색 경로, 접근 가능한 대체 runtime이 아니다. 사용자가 `dev-corp`, 회사망 dev-corp, public `iop.ai.kr` Edge, 또는 동등하게 명시한 경우에만 `agent-test/dev-corp/**`를 읽고 접근한다.
- 사용자가 단순히 `dev`, 테스트 환경, 배포, rollout, runtime 검증이라고 말한 경우에는 `agent-test/dev/**` 기준을 사용하고 `dev-corp` host, runner, port에는 접근하지 않는다.

## 환경 디렉터리

- 환경 디렉터리는 `agent-test/<env>/` 형식을 사용한다.
- `<env>`는 소문자 영문, 숫자, 하이픈만 사용한다.
- 각 환경에는 반드시 `agent-test/<env>/rules.md`를 둔다.
- 도메인/검증 시나리오별 문서는 `agent-test/<env>/<test-profile>.md` 형식을 사용한다.
- 기본 도메인 smoke profile은 기존 도메인 이름을 유지해 `node-smoke.md`, `edge-smoke.md`, `control-plane-smoke.md`, `client-smoke.md`, `platform-common-smoke.md`, `testing-smoke.md`처럼 둔다.

## rules.md 표준 섹션

새 `rules.md`는 아래 섹션 순서를 유지한다.

1. `공통 규칙`
2. `기본 환경`
3. `포트 매핑`
4. `런타임 프로필`
5. `프리플라이트`
6. `노드/Provider 인벤토리 위치`
7. `Field/bootstrap 반복 테스트 기준`
8. `라우팅`
9. `라우팅 규칙`

섹션이 해당 환경에 직접 필요하지 않더라도 삭제하지 말고 `없음`, `해당 없음`, 또는 대상 profile 링크를 남긴다.

## 확장 원칙

- 환경 공통값은 `rules.md`에 둔다.
- 공통 인벤토리 routing과 환경 선택/secret 정책은 `agent-test/inventory.yaml`에 두고, Claude/Codex/Pi/agy 같은 에이전트별 host profile은 `agent-test/inventory-agent.yaml`에 둔다. 실제 노드, provider, bootstrap, model endpoint, workspace, SSH user/IP 같은 환경별 상세 인벤토리는 `agent-test/inventory-<env>.yaml`에 둔다. 에이전트 인벤토리는 가능한 경우 `node_ref`로 환경별 노드를 참조하며, provider runtime의 source of truth는 환경별 인벤토리에 유지한다. Pi처럼 에이전트 동작 확인에 필요한 provider 호환성 관측값은 에이전트 인벤토리에 둘 수 있다. 사람용 설명과 도메인별 판정 기준은 해당 환경의 domain profile에 둔다.
- 상위 `rules.md`에는 상세값을 복제하지 말고 `노드/Provider 인벤토리 위치`와 `라우팅`으로 연결한다.
- 실제 노드, provider, model, endpoint 상세는 환경별 inventory 전체를 읽지 말고 먼저 `go build -o /tmp/iop-inventory-query ./scripts/inventory-query` 로 binary를 빌드한 뒤, `/tmp/iop-inventory-query --env <env> [selector]` 로 bounded 결과를 조회한다. 조회 도구는 `agent-test/inventory.yaml` manifest에서 환경별 파일을 resolve한다. selector는 `--model`, `--node`, `--provider` 중 최대 하나만 허용한다. selector 없이 실행하면 `inventory_id`, `common_inventory`, `test_env`, `profile`, `last_updated_at`, `source`, `edge`, `build` top-level key만 포함한 env projection을 반환하고 `model`, `nodes` 전체는 제외한다. selector 결과는 `{"env","kind","selector","matches":[{"path","value"}]}`이고 `path`는 오름차순으로 정렬한다. exit code는 성공 0, zero match 1, flag/YAML/schema 오류 2를 사용한다. substring/정규식/대소문자 접기는 하지 않고 YAML path로 중복 제거한다.
- compose, native Edge, dev-runtime provider pool처럼 같은 환경 안의 실행 모드는 `런타임 프로필`에서 분리한다.
- 같은 포트 이름은 모든 환경에서 같은 행 이름을 쓴다. 값이 없으면 `해당 없음` 또는 `후보 <port>`로 둔다.
- shared remote runner를 쓰는 환경은 `repo root`, `sync 기준`, `프리플라이트`를 반드시 명시한다.
- secret, token, API key, private credential 원문은 `agent-test/`, `docs/`, `agent-roadmap/`에 기록하지 않는다.
- private IP와 SSH user는 테스트 접속에 필요한 환경값이면 기록할 수 있다. 단, 잘못된 user가 발견되면 해당 env rules/profile과 사람용 guide를 함께 정정한다.
- `agent-test/local/`은 local/private 기준이라 git 추적 제외될 수 있다. 추적 여부와 상관없이 현재 workspace의 운영 기준으로는 같은 구조를 유지한다.

## 새 환경 추가 절차

1. `_templates/env-rules-template.md`를 `agent-test/<env>/rules.md`로 복사한다.
2. `<env>`, 날짜, runner, repo root, 포트, runtime profile을 채운다.
3. agent가 반복해서 읽어야 하는 host/node/provider 값이 있으면 `_templates/inventory-template.yaml`을 사용해 `agent-test/inventory-<env>.yaml`을 만든다.
4. 기존 도메인 smoke profile이 필요하면 `_templates/test-profile-template.md`를 사용해 `agent-test/<env>/<domain>-smoke.md`를 만든다.
5. `agent-test/inventory.yaml`의 `environments`에 `inventory_id`와 환경별 inventory 경로를 등록한다.
6. `rules.md`의 `노드/Provider 인벤토리 위치`와 `라우팅`에 생성한 inventory와 profile을 연결한다.
7. remote runner나 external provider를 쓰면 `프리플라이트`에 확인할 항목을 구체화한다.
8. local/test/dev 등 기존 환경과 공존해야 하면 `포트 매핑`에 충돌하지 않는 값을 기록한다.
9. `rg --no-ignore`로 잘못된 SSH user, workspace, port 재사용, secret 원문이 없는지 확인한다.

## 현재 표준 구현

- `agent-test/local/rules.md`
- `agent-test/dev/rules.md`
- `agent-test/dev-corp/rules.md`
