<!-- task=10_bin_e2e_smoke plan=2 tag=REVIEW_REVIEW_BES -->

# 10 Bin E2E Smoke Follow-up Plan - REVIEW_REVIEW_BES

## 이 파일을 읽는 구현 에이전트에게

이 plan은 plan=1 리뷰에서 남은 Required 이슈만 좁혀 수정한다. 핵심 목표는 real profile/extended command 경로가 node-side command failure를 `PASSED`로 숨기지 않게 만드는 것이다.

구현 마지막에는 반드시 `CODE_REVIEW-cloud-G07.md`의 모든 구현 소유 섹션을 실제 구현 내용과 명령 출력으로 채운다. 검증 출력에는 `...`를 쓰지 않는다.

## 배경

plan=1 구현으로 `IOP_E2E_PROFILE`은 실제 `configs/edge.yaml` profile block을 사용하게 되었고 mock smoke에서는 unsupported command를 보내지 않게 되었다. 하지만 recorded real profile output에는 `cancel error`가 남았고, script는 이를 실패로 처리하지 않아 `Real profile (gemini) status: PASSED`와 `Smoke test PASSED`를 출력했다.

## 구현 체크리스트

- [ ] [REVIEW_REVIEW_BES-1] real profile smoke가 node/console command failure marker를 실패 또는 blocker로 처리한다.
- [ ] [REVIEW_REVIEW_BES-2] `/terminate-session` 검증을 지원되는 session profile로 제한하거나 성공 가능한 deterministic path로 분리한다.
- [ ] [REVIEW_REVIEW_BES-3] 검증 결과를 실제 stdout/stderr로 갱신한다.
- [ ] [REVIEW_REVIEW_BES-FINAL] `CODE_REVIEW-cloud-G07.md`의 구현 소유 섹션을 모두 채운다.

## [REVIEW_REVIEW_BES-1] failure marker 검출 복구

### 문제

`scripts/e2e-smoke.sh`의 `check_fail_markers`는 `panic`, `unexpected`, `startup failed`만 검출한다. 이전 plan은 `cancel error`, `node reported error`, `does not support` 등을 숨기지 말라고 했지만, 실제 real profile output의 `cancel error`가 PASS로 통과했다.

### 해결 방법

- `EDGE_OUT`과 `NODE_OUT`에서 node/console failure marker를 명시적으로 검출한다.
- 최소한 다음 marker는 실패 또는 blocker로 분류한다: `cancel error`, `node reported error`, `does not support`, `adapter .* not found`, `no session`, `startup failed`.
- 외부 CLI 로그인/권한/command missing처럼 환경성 실패는 `REAL_PROFILE_STATUS=BLOCKED (...)`로 출력하되, 전체 smoke 결과가 조용히 PASS가 되지 않게 한다.
- 모델 출력의 일반 텍스트와 시스템 failure marker가 충돌하지 않도록, 가능하면 edge/node log prefix나 console `error:` prefix 중심으로 검사한다.

### 수정 파일 및 체크리스트

- [ ] `scripts/e2e-smoke.sh`

### 테스트 결정

기록된 `cancel error` 형태가 다시 나오면 `make test-e2e` 또는 `IOP_E2E_PROFILE=... make test-e2e`가 PASS하지 않아야 한다.

### 중간 검증

```bash
IOP_E2E_PROFILE=gemini make test-e2e
```

## [REVIEW_REVIEW_BES-2] terminate-session 성공 조건 정리

### 문제

현재 script는 모든 non-mock profile에 `/terminate-session`을 보낸다. `gemini`처럼 one-shot CLI profile은 `session2` persistent session이 없어서 node-side `no session` cancel error가 정상적으로 발생할 수 있다. 이 상태를 full-cycle 성공으로 볼 수 없다.

### 해결 방법

- `/terminate-session`은 session termination을 지원하는 profile에서만 보내도록 profile capability를 분기한다.
- 또는 script 내부에서 deterministic fake persistent CLI profile을 console target으로 실제 사용해 `/terminate-session` 성공 경로를 검증하고, real external profile smoke에서는 `/terminate-session`을 제외한다.
- 어떤 방식을 선택하든 `/terminate-session`을 보냈다면 node-side `cancel error`나 `no session`이 없어야 PASS다.

### 수정 파일 및 체크리스트

- [ ] `scripts/e2e-smoke.sh`

### 테스트 결정

mock smoke와 real profile smoke가 서로 다른 command scope를 갖더라도 출력에서 어떤 범위를 검증했는지 명확히 보여야 한다.

### 중간 검증

```bash
make test-e2e
```

## [REVIEW_REVIEW_BES-3] 검증 기록 갱신

### 문제

plan=1 review reference는 `cancel error`가 포함된 real profile 출력에도 PASS로 기록했다. 후속 구현은 이 불일치를 제거해야 한다.

### 해결 방법

- `make test-e2e`를 실행한다.
- 가능하면 `IOP_E2E_PROFILE=gemini make test-e2e`를 실행한다.
- real external profile이 환경 문제로 막히면 `BLOCKED` 출력과 실제 stdout/stderr를 기록한다.
- `CODE_REVIEW-cloud-G07.md`에 실제 stdout/stderr를 생략 없이 붙인다.

### 수정 파일 및 체크리스트

- [ ] `agent-task/10_bin_e2e_smoke/CODE_REVIEW-cloud-G07.md`

### 테스트 결정

검증 명령 자체가 review trust 회복 기준이다.

### 중간 검증

```bash
go test -count=1 ./...
make test-e2e
```

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `scripts/e2e-smoke.sh` | REVIEW_REVIEW_BES-1, REVIEW_REVIEW_BES-2 |
| `agent-task/10_bin_e2e_smoke/CODE_REVIEW-cloud-G07.md` | REVIEW_REVIEW_BES-3, REVIEW_REVIEW_BES-FINAL |

## 최종 검증

```bash
go test -count=1 ./...
make test-e2e
```

가능한 경우:

```bash
IOP_E2E_PROFILE=gemini make test-e2e
```

모든 결과는 PASS/FAILED/BLOCKED를 실제 stdout/stderr와 함께 기록한다.
