diff --git a/agent-ops/rules/project/domain/testing/rules.md b/agent-ops/rules/project/domain/testing/rules.md index 7e1ab6f..9dca4bd 100644 --- a/agent-ops/rules/project/domain/testing/rules.md +++ b/agent-ops/rules/project/domain/testing/rules.md @@ -20,20 +20,22 @@ - 대상 패키지 테스트 — 변경한 패키지와 인접한 패키지의 빠른 회귀 검증이다. - `go test ./...` — 저장소 전체 Go 테스트 회귀 검증이다. -- `bin/edge.sh` + `bin/node.sh` E2E smoke — 사용자가 실행하는 entrypoint를 통해 edge-node 등록, console 입력, adapter 실행, event/message 출력을 확인하는 검증이다. -- real CLI opt-in 검증 — `claude`, `gemini`, `codex`, `opencode`, `cline`처럼 외부 CLI 설치와 계정/환경이 필요한 검증이다. +- `bin/edge.sh` + `bin/node.sh` E2E smoke — 사용자가 실행하는 entrypoint를 통해 edge-node 등록, console 입력, adapter 실행, event/message 출력을 빠르게 확인하는 검증이다. +- full-cycle 실제 구동 — 비효율적이어도 관련 사용자 명령과 실행 cycle을 한 번씩 실제 entrypoint로 통과시키는 검증이다. +- 실제 외부 CLI 검증 — `claude`, `gemini`, `codex`, `opencode`처럼 외부 CLI 설치와 계정/환경이 필요한 기준 profile을 실제 호출하는 검증이다. ## 유지할 패턴 - 테스트는 테스트 파일 변경 여부가 아니라 작업 영향 범위로 결정한다. -- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 일반 Go 테스트와 `bin/edge.sh` + `bin/node.sh` 기반 E2E smoke 흐름을 반드시 검증한다. +- 사용자 실행 파이프라인에 닿는 작업을 한 경우, 작업 완료 후 일반 Go 테스트, `bin/edge.sh` + `bin/node.sh` 기반 E2E smoke, full-cycle 실제 구동 흐름을 반드시 검증한다. - 사용자 실행 파이프라인에는 `bin/**`, `apps/*/cmd/**`, `apps/*/internal/bootstrap/**`, edge-node transport/service/registry, adapter 실행/stream/cancel/status 경로, `configs/**`, `packages/config/**`, 관련 protobuf 계약 변경이 포함된다. - 기본 E2E smoke는 mock adapter와 임시 설정/포트를 사용해 외부 CLI 의존성 없이 수행한다. - E2E smoke에서는 최소한 node 등록, `/nodes` 확인, console 메시지 전송, delta/message 출력, complete event를 확인한다. +- full-cycle 실제 구동에서는 startup/register, foreground run, session 변경, background run, terminate-session, status, 관련 routing/cancel/timeout/persistent session cycle을 실제 entrypoint로 한 번씩 통과시킨다. - 상세 수행 절차와 기능별 체크리스트는 `agent-ops/skills/project/e2e-smoke/SKILL.md`를 따른다. - `make test-e2e` 같은 고정 명령이 생기면 그 명령을 우선 사용한다. 아직 고정 명령이 없으면 동일한 내용을 수동 smoke 절차로 검증하거나, 실행하지 못한 이유를 최종 보고에 명시한다. -- 실제 외부 CLI profile 검증은 사용자가 명시했거나 환경이 준비된 경우에만 opt-in으로 수행한다. -- 작업 최종 보고에는 실행한 테스트 명령과 E2E smoke 수행 여부를 명시한다. 수행하지 못한 필수 검증은 이유와 남은 위험을 함께 적는다. +- 풀테스트에서는 실제 외부 CLI profile 검증을 필수로 수행한다. 환경, 계정, provider, 원격 endpoint 문제로 호출할 수 없거나 실패한 profile은 누락하지 말고 profile별 실패 또는 blocker로 보고한다. +- 작업 최종 보고에는 실행한 테스트 명령, E2E smoke 수행 여부, full-cycle 실제 구동 수행 여부를 명시한다. 수행하지 못한 필수 검증은 이유와 남은 위험을 함께 적는다. ## 다른 도메인과의 경계 @@ -44,6 +46,7 @@ ## 금지 사항 - 사용자 실행 파이프라인에 닿는 변경을 하고 유닛/패키지 테스트만으로 완료 처리하지 않는다. +- 관련 작업 후 full-cycle 실제 구동을 비용이 크다는 이유만으로 생략하지 않는다. - 기본 E2E smoke를 외부 CLI 설치, 로그인, 네트워크 계정 상태에 의존하게 만들지 않는다. - E2E smoke를 위해 기본 `configs/*.yaml`을 임시값으로 오염시키지 않는다. 임시 설정 파일이나 환경 변수 override를 사용한다. - 필수 검증을 실행하지 못했는데 조용히 생략하지 않는다. diff --git a/agent-ops/rules/project/rules.md b/agent-ops/rules/project/rules.md index 57da18a..c25079a 100644 --- a/agent-ops/rules/project/rules.md +++ b/agent-ops/rules/project/rules.md @@ -76,5 +76,5 @@ ## 스킬 라우팅 -- 사용자 실행 파이프라인 검증, E2E smoke, `bin/edge.sh`/`bin/node.sh` 통합 테스트: `agent-ops/skills/project/e2e-smoke/SKILL.md` +- 사용자 실행 파이프라인 검증, E2E smoke, full-cycle 실제 구동, `bin/edge.sh`/`bin/node.sh` 통합 테스트: `agent-ops/skills/project/e2e-smoke/SKILL.md` - 반복 작업이 확인되면 `agent-ops/skills/project//SKILL.md`를 생성하고 이 표에 등록한다. diff --git a/agent-ops/skills/project/e2e-smoke/SKILL.md b/agent-ops/skills/project/e2e-smoke/SKILL.md index c07a6e6..8a8238a 100644 --- a/agent-ops/skills/project/e2e-smoke/SKILL.md +++ b/agent-ops/skills/project/e2e-smoke/SKILL.md @@ -1,14 +1,14 @@ --- name: e2e-smoke version: 1.0.0 -description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 E2E smoke 및 CLI opt-in 통합 검증 절차 +description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 E2E smoke, full-cycle 실제 구동, 실제 외부 CLI 통합 검증 절차 --- # e2e-smoke ## 목적 -사용자 실행 방식에 가까운 `bin/edge.sh` + `bin/node.sh` 경로로 edge-node 실행 파이프라인을 검증한다. 기본 검증은 mock adapter 기반으로 외부 CLI 의존성 없이 수행하고, 실제 CLI profile 검증은 opt-in으로 분리한다. +사용자 실행 방식에 가까운 `bin/edge.sh` + `bin/node.sh` 경로로 edge-node 실행 파이프라인을 검증한다. 빠른 mock smoke로 최소 생존을 확인하고, 관련 작업 후에는 비효율적이어도 실제 구동 full-cycle과 실제 외부 CLI profile 호출을 한 번씩 통과시킨다. 실제 외부 CLI profile 검증은 풀테스트의 필수 항목이며, 불가능하거나 실패하면 완료로 숨기지 않고 profile별 blocker 또는 실패로 명시한다. ## 언제 호출할지 @@ -20,8 +20,8 @@ description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 ## 입력 - `scope`: 검증할 변경 범위와 영향을 받은 도메인 (필수) -- `mode`: `mock` 또는 `real-cli` 또는 `both` (선택, 기본값: `mock`) -- `profiles`: opt-in으로 검증할 CLI profile 목록. 예: `claude`, `gemini`, `codex`, `opencode`, `cline-dgx` (선택) +- `mode`: `mock-smoke`, `full-cycle`, `real-cli`, `all` 중 하나 (선택, 기본값: `full-cycle`) +- `profiles`: 검증할 실제 외부 CLI profile 목록. 지정하지 않으면 기준 profile인 `claude`, `gemini`, `codex`, `opencode`를 대상으로 한다. (선택) - `config_strategy`: 임시 config 파일 또는 환경 변수 override 방식 (선택) ## 먼저 확인할 것 @@ -30,14 +30,16 @@ description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 - [ ] `bin/edge.sh`와 `bin/node.sh`가 현재 사용자 실행 entrypoint인지 확인한다. - [ ] `make test-e2e` 같은 고정 명령이 이미 있으면 그 명령을 우선 사용한다. - [ ] 고정 명령이 없으면 임시 config와 랜덤 포트로 수동 smoke 절차를 구성한다. -- [ ] real CLI 검증을 할 경우 실제 command 경로, 로그인/계정 상태, provider 설정, workspace 권한이 준비되어 있는지 확인한다. +- [ ] 관련 작업 후에는 빠른 smoke만으로 완료 처리하지 말고 full-cycle 실제 구동 항목을 한 번씩 수행할 수 있는지 확인한다. +- [ ] 실제 외부 CLI command 경로, 로그인/계정 상태, provider 설정, workspace 권한이 준비되어 있는지 확인한다. ## 실행 절차 1. **검증 범위 결정** - 변경 파일이 사용자 실행 파이프라인에 닿는지 확인한다. - - 필수 검증은 `go test ./...` 또는 대상 패키지 테스트와 mock E2E smoke이다. - - real CLI 검증은 사용자가 명시했거나 환경이 준비된 경우에만 opt-in으로 추가한다. + - 필수 검증은 `go test ./...` 또는 대상 패키지 테스트, mock smoke, full-cycle 실제 구동이다. + - 풀테스트에서는 실제 외부 CLI profile 검증을 full-cycle에 포함한다. + - real CLI 환경이 준비되지 않았거나 호출이 실패하면 완료로 숨기지 말고 profile별 blocker 또는 실패로 보고한다. 2. **기본 E2E smoke 준비** - 기본 `configs/*.yaml`을 오염시키지 말고 임시 edge/node config 또는 환경 변수 override를 사용한다. @@ -55,45 +57,60 @@ description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 - `/terminate-session` 명령이 성공 출력 또는 mock adapter의 명확한 unsupported/error 출력을 내는지 확인한다. - foreground mock smoke에서는 `` message line이 없어야 하고, foreground complete 출력 수가 전송한 run 수를 초과하지 않는지 확인한다. -4. **edge console / transport 항목 확인** +4. **full-cycle 실제 구동** + - smoke와 같은 임시 config/포트 방식으로 실제 `bin/edge.sh`와 `bin/node.sh`를 유지한 채 아래 사용자 명령 사이클을 한 번씩 통과시킨다. + - 명령을 한꺼번에 stdin에 밀어 넣지 말고, 각 cycle의 기대 출력이 로그에 나타난 뒤 다음 명령을 보낸다. 특히 background run은 async start/message/complete를 확인한 뒤 `/background off`나 `quit`로 넘어간다. + - startup/register cycle: edge 기동, node edge 대기, register, `/nodes`, node disconnect lifecycle 출력까지 확인한다. + - foreground run cycle: 같은 session에서 메시지를 최소 2회 전송하고 각 run의 sent/start/message/complete를 확인한다. + - session cycle: `/session `로 session을 바꾼 뒤 메시지를 보내고 출력의 session 값과 run 흐름을 확인한다. + - background cycle: `/background on` 후 메시지를 보내 async start/message/complete가 출력되는지 확인하고, `/background off`로 되돌린다. + - terminate cycle: `/terminate-session`을 실행하고 성공 출력 또는 명확한 unsupported/error 출력을 확인한다. + - status cycle: 현재 target에서 `/status`를 실행한다. 지원 profile이면 status 출력 내용을 확인하고, 미지원 profile이면 명확한 unsupported error를 확인한다. + - multi-node/routing을 바꾼 작업에서는 node 2대를 실제로 붙여 ambiguous error와 `/node ` 선택 후 라우팅을 한 번씩 확인한다. + - cancel/timeout/persistent session을 바꾼 작업에서는 해당 cycle도 실제 구동으로 한 번씩 확인한다. + +5. **edge console / transport 항목 확인** - node 연결/해제 lifecycle event가 run event와 분리되어 출력되는지 확인한다. - `RunEvent`의 `start`, `delta`, `complete`, `error`, `cancelled`가 console 출력 형식에 맞게 라우팅되는지 확인한다. - node가 1대일 때는 node 선택 없이 single-node fallback으로 실행되는지 확인한다. - node가 2대 이상인 smoke를 수행한다면 `/node ` 선택 없이는 ambiguous error가 출력되는지 확인한다. - `/node ` 선택 후 선택된 node로 run request가 전달되고 출력 prefix가 해당 node label을 사용하는지 확인한다. -5. **CLI profile opt-in 검증** - - real CLI 환경이 준비된 경우에만 수행한다. - - `claude`, `gemini`, `codex`, `opencode`, `cline-dgx` 또는 `cline-m1` 중 요청된 profile을 대상으로 같은 session 메시지를 최소 2회 주고받는다. +6. **CLI profile 실제 구동 검증** + - 풀테스트에서는 기준 실제 외부 CLI profile을 한 번씩 실제 구동한다. + - `claude`, `gemini`, `codex`, `opencode`를 대상으로 같은 session 메시지를 최소 2회 주고받는다. - 각 profile에서 start, delta-or-message, complete 출력이 모두 생기는지 확인한다. - - `opencode`는 SSE 기반 delta/message와 complete 출력이 생기는지 확인한다. - - `cline` 계열은 JSON stream delta/message와 complete 출력이 생기는지 확인한다. + - `opencode`는 로컬 모델 대표 profile로 보고 SSE 기반 delta/message와 complete 출력이 생기는지 확인한다. + - command, 로그인, provider, workspace 권한, 원격 endpoint 문제로 실행할 수 없거나 실패한 profile은 누락이 아니라 실패/blocker로 profile별 보고한다. -6. **usage status opt-in 검증** +7. **usage status 실제 구동 검증** - `/status`로 `codex`, `claude`, `gemini` 사용량을 조회한다. - `[edge] sent command=status`와 `[node-*-status]`가 출력되는지 확인한다. - `codex`와 `claude`는 daily/weekly limit 또는 raw fallback 출력이 표시되는지 확인한다. - `gemini`는 quota metadata 또는 model usage 출력이 표시되는지 확인한다. - - `opencode`와 `cline`처럼 status checker가 아직 없는 profile은 조용히 실패하지 않고 명확한 unsupported error를 출력하는지 확인한다. + - `opencode`처럼 status checker가 아직 없는 profile은 조용히 실패하지 않고 명확한 unsupported error를 출력하는지 확인한다. - parsed limit이 있으면 label/reset 정보를 포함하고, parsed limit이 없으면 raw output 일부를 보여주는지 확인한다. -7. **cancel / session lifecycle 검증** +8. **cancel / session lifecycle 검증** - 변경 범위가 cancel, timeout, persistent session에 닿는 경우 수행한다. - foreground run 중 cancel 요청이 전달되면 cancelled event가 출력되고 node store 상태가 cancelled로 마감되는지 확인한다. - persistent CLI session에서 `/terminate-session` 후 같은 session 재사용 시 새 worker 생성 또는 `REQUIRE_EXISTING` 실패가 의도대로 동작하는지 확인한다. - timeout 발생 시 timeout message와 error/cancelled 상태가 사용자 출력에 드러나는지 확인한다. -8. **결과 보고** +9. **결과 보고** - 실행한 Go 테스트 명령과 결과를 적는다. - - 실행한 E2E smoke 방식, 사용한 config 전략, 검증한 profile을 적는다. + - 실행한 E2E smoke와 full-cycle 실제 구동 방식, 사용한 config 전략, 검증한 profile을 적는다. + - full-cycle에서 돌린 cycle 목록과 돌리지 못한 cycle 목록을 구분해 적는다. - 필수 검증을 실행하지 못했다면 이유와 남은 위험을 명시한다. ## 실행 결과 검증 - [ ] 일반 Go 테스트 또는 대상 패키지 테스트 결과가 보고되었는가 - [ ] 사용자 실행 파이프라인 변경 시 mock E2E smoke 수행 여부가 보고되었는가 +- [ ] 사용자 실행 파이프라인 변경 시 full-cycle 실제 구동 항목을 한 번씩 수행했는가 - [ ] node register, `/nodes`, 메시지 최소 2회, event/message/complete 출력 확인 여부가 보고되었는가 -- [ ] real CLI opt-in을 수행했다면 profile별 메시지 왕복과 `/status` 결과가 보고되었는가 +- [ ] session, background, terminate, status 등 관련 사용자 명령 cycle 수행 여부가 보고되었는가 +- [ ] 풀테스트에서 실제 외부 CLI profile별 메시지 왕복과 `/status` 결과가 보고되었는가 - 검증 실패 시: 실패한 항목, 관련 로그/출력 요약, 남은 위험을 최종 보고에 포함한다. ## 출력 형식 @@ -102,14 +119,16 @@ description: bin/edge.sh와 bin/node.sh 기반 사용자 실행 파이프라인 검증 결과 - Go 테스트: <명령> — <통과|실패|미실행 사유> - E2E smoke: — <통과|실패|미실행 사유> -- 확인 항목: node register, /nodes, message x2, event/message/complete, <추가 항목> -- Real CLI profile: +- Full-cycle 실제 구동: <통과|실패|미실행 사유> +- 확인 항목: node register, /nodes, message x2, session, background, terminate, status, event/message/complete, <추가 항목> +- Real CLI profile: - 남은 위험: <없음 또는 내용> ``` ## 금지 사항 - 사용자 실행 파이프라인에 닿는 변경을 하고 유닛/패키지 테스트만으로 완료 처리하지 않는다. +- 관련 작업 후 full-cycle 실제 구동을 smoke보다 비용이 크다는 이유만으로 생략하지 않는다. - 기본 E2E smoke를 외부 CLI 설치, 로그인, 네트워크 계정 상태에 의존하게 만들지 않는다. - E2E smoke를 위해 기본 `configs/*.yaml`을 임시값으로 오염시키지 않는다. - 필수 검증을 실행하지 못했는데 조용히 생략하지 않는다.