<!-- task=m-bridge-boundary-hardening/02_terminal_core_boundary plan=1 tag=REVIEW_REFACTOR -->

# Plan - REVIEW_REFACTOR

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

이 작업은 리뷰에서 발견된 검증 증거 공백을 닫는 follow-up이다. 구현 후 active 파일을 유지하고, 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 검증 내용과 stdout/stderr로 채운 뒤 리뷰 준비 상태로 멈춘다. 구현 중 사용자 결정, 사용자 소유 외부 환경, 또는 계획 범위 충돌 없이는 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거를 남기고 중단한다. 구현 중 사용자에게 직접 질문하거나 `USER_REVIEW.md`, `complete.log`, archive log를 만들지 않는다. 증거 공백은 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있으면 사용자 리뷰 요청이 아니다.

## 배경

첫 리뷰에서 terminal core 분리 코드와 Go 패키지 테스트는 통과했다. 그러나 사용자 실행 파이프라인에 닿는 CLI adapter execution/session 변경인데, 구현 증거는 보조 `./scripts/e2e-smoke.sh`를 완료 근거처럼 기록했고 full-cycle 실제 구동 또는 실행 불가 사유를 남기지 않았다. 이 follow-up은 코드 범위를 넓히지 않고 필수 검증 증거를 회수한다.

## 사용자 리뷰 요청 흐름

구현 중 차단은 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 직접 사용자 프롬프트는 금지하며, code-review가 요청 타당성을 검증하고 실제 `USER_REVIEW.md` 생성을 소유한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/bridge-boundary-hardening.md`
- Task ids:
  - `terminal-core-boundary`: persistent PTY 기반 `terminalSessionCore`를 CLI provider 내부 세부가 아니라 remote terminal transport가 재사용할 수 있는 Node terminal boundary로 분리하거나 명시 interface로 고정한다.
- Completion mode: check-on-pass

## 분석 결과

### 읽은 파일

- `agent-task/m-bridge-boundary-hardening/02_terminal_core_boundary/plan_cloud_G07_0.log`
- `agent-task/m-bridge-boundary-hardening/02_terminal_core_boundary/code_review_cloud_G07_0.log`
- `agent-ops/rules/project/domain/node/rules.md`
- `agent-ops/rules/project/domain/testing/rules.md`
- `agent-test/local/rules.md`
- `agent-test/local/node-smoke.md`
- `agent-test/local/testing-smoke.md`
- `agent-ops/skills/project/e2e-smoke/SKILL.md`
- `scripts/e2e-smoke.sh`
- `scripts/dev/edge.sh`
- `scripts/dev/node.sh`
- `apps/node/internal/terminal/session.go`
- `apps/node/internal/terminal/session_test.go`
- `apps/node/internal/adapters/cli/cli.go`
- `apps/node/internal/adapters/cli/persistent.go`
- `apps/node/internal/adapters/cli/persistent_execute_blackbox_test.go`
- `apps/node/internal/adapters/cli/status/tail_buffer.go`
- `apps/node/internal/runtime/types.go`

### 테스트 환경 규칙

- test_env: `local`.
- `agent-test/local/rules.md`, `node-smoke`, `testing-smoke`를 읽었다.
- 적용 규칙: 사용자 실행 파이프라인에 닿는 adapter execution/session 변경은 Go 테스트와 full-cycle 실제 구동을 함께 검증한다.
- 보조 `./scripts/e2e-smoke.sh`는 실행 가능하면 별도 보조 증거로만 기록한다. `scripts/e2e-smoke.sh` 자체도 completion에는 `scripts/dev/edge.sh` + `scripts/dev/node.sh` user-flow verification이 필요하다고 출력한다.
- 적용 명령/절차: Go 테스트 2개, 보조 smoke 1개, repo 내부 edge-node 진단(`scripts/dev/edge.sh`, `scripts/dev/node.sh`, 임시 config, 메시지 2회, `/nodes`, `/capabilities`, `/transport`, `/sessions`, `/terminate-session`).

### 테스트 커버리지 공백

- 코드 단위/blackbox: reviewer rerun 기준 `go test -count=1 ./apps/node/internal/terminal ./apps/node/internal/adapters/cli` 및 `go test -count=1 ./apps/node/internal/adapters/cli ./apps/node/internal/...`는 통과했다.
- 남은 공백: full-cycle 실제 구동 결과가 없고, 보조 smoke 출력은 `...`로 축약되어 실제 stdout/stderr 계약을 만족하지 않는다.

### 심볼 참조

- 기존 제거/이동 심볼 `terminalSessionCore`, `terminalSessionOptions`, `startTerminalSessionCore`, `status.Snapshot`은 stale reference 검색에서 남아 있지 않았다.
- 새 boundary call site는 `apps/node/internal/adapters/cli/cli.go`, `apps/node/internal/adapters/cli/persistent.go`, `apps/node/internal/terminal/session.go`, `apps/node/internal/terminal/session_test.go`다.

### 분할 판단

- 기존 split subtask `02_terminal_core_boundary`의 follow-up이며 새 subtask를 만들지 않는다.
- sibling `01_edge_run_surface`, `03_adapter_config_typed`와 독립이다. 선행 `complete.log` 확인은 필요하지 않다.

### 범위 결정 근거

- source refactor를 다시 설계하지 않는다.
- remote terminal bridge protocol, 외부 provider-specific parsing 변경, config/proto 변경은 범위 밖이다.
- full-cycle 진단 실패가 현 변경의 repo-owned regression임을 보여줄 때만 해당 최소 코드 수정과 검증을 포함한다. 외부 환경/secret/provider 문제는 review stub의 `사용자 리뷰 요청`에 증거로 기록한다.

### 빌드 등급

- `cloud-G07`: terminal/CLI process control 작업의 검증 신뢰 회수이며, full-cycle stdout/stderr와 edge/node payload 비교가 핵심이다.

## 구현 체크리스트

- [ ] `scripts/dev/edge.sh`와 `scripts/dev/node.sh`를 임시 config로 각각 실행해 repo 내부 edge-node full-cycle 진단을 수행하고, node 등록, `/nodes`, 같은 session foreground 메시지 2회, node-local payload와 edge-rendered payload의 내용/순서 동일성, `/capabilities`, `/transport`, `/sessions`, `/terminate-session` 결과를 검증 결과에 기록한다.
- [ ] `./scripts/e2e-smoke.sh`를 보조 smoke로만 재실행하거나 기존 reviewer rerun을 대체할 실제 stdout/stderr를 붙이고, 이 smoke가 full-cycle을 대체하지 않는다는 경고를 검증 결과에 명시한다.
- [ ] Go 검증 명령 `go test -count=1 ./apps/node/internal/terminal ./apps/node/internal/adapters/cli`와 `go test -count=1 ./apps/node/internal/adapters/cli ./apps/node/internal/...`를 재실행하고 실제 stdout/stderr를 검증 결과에 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REFACTOR-1] Recover Required Full-Cycle Verification Evidence

문제: `code_review_cloud_G07_0.log`의 `검증 결과`는 보조 `./scripts/e2e-smoke.sh`를 "전수 검증" 근거처럼 기록했지만, `scripts/e2e-smoke.sh:7` 및 `scripts/e2e-smoke.sh:724`는 이 smoke가 auxiliary only라고 명시한다. `agent-ops/rules/project/domain/testing/rules.md:51`과 `agent-test/local/testing-smoke.md:54`는 사용자 실행 파이프라인 변경에 full-cycle 실제 구동을 요구한다.

해결 방법: 기본 `configs/*.yaml`을 수정하지 말고 임시 config와 deterministic CLI profile을 사용한다. `scripts/dev/edge.sh`와 `scripts/dev/node.sh`를 별도 프로세스로 띄우고 edge console 명령을 한 줄씩 보내 startup/register, foreground 메시지 2회, command 응답, terminate-session을 확인한다. node 로컬 `[node-message]` payload와 edge `[node-*-msg]` payload가 run별로 내용/순서까지 동일한지 기록한다. 보조 smoke는 auxiliary evidence로만 따로 기록한다.

수정 파일 및 체크리스트:

- [ ] `agent-task/m-bridge-boundary-hardening/02_terminal_core_boundary/CODE_REVIEW-cloud-G07.md`: full-cycle 진단 stdout/stderr, payload 비교, 보조 smoke classification, Go test output을 기록한다.
- [ ] Source file 변경은 기본적으로 하지 않는다. full-cycle 실패가 repo-owned regression을 보여줄 때만 최소 파일을 수정하고 수정 사유와 추가 검증을 기록한다.

테스트 작성: 새 테스트 파일은 작성하지 않는다. 이 follow-up은 필수 검증 증거 회수다.

중간 검증:

```bash
go test -count=1 ./apps/node/internal/terminal ./apps/node/internal/adapters/cli
```

```bash
./scripts/e2e-smoke.sh
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `agent-task/m-bridge-boundary-hardening/02_terminal_core_boundary/CODE_REVIEW-cloud-G07.md` | REVIEW_REFACTOR-1 |

## 최종 검증

```bash
go test -count=1 ./apps/node/internal/adapters/cli ./apps/node/internal/...
```

Repo 내부 edge-node full-cycle 진단:

```bash
IOP_EDGE_CONFIG=<tmp-edge-yaml> ./scripts/dev/edge.sh
IOP_NODE_CONFIG=<tmp-node-yaml> ./scripts/dev/node.sh
```

Edge console에서 순서대로 `/nodes`, 메시지 2회, `/capabilities`, `/transport`, `/sessions`, `/terminate-session`, `/exit`를 입력한다. 기대 결과는 node register, 각 foreground run의 sent/start/message/complete 순서, node-local payload와 edge-rendered payload의 run별 동일성, command 응답 표시, terminate-session 성공이다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
