<!-- task=m-architecture-refactor-foundation/05+04_terminal_core plan=1 tag=REVIEW_REFACTOR -->

# Plan - REVIEW_REFACTOR Terminal Session Close Follow-up

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

구현 완료의 마지막 단계는 active `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것이다. 검증을 실행하고, 실제 stdout/stderr를 기록하고, active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용이다.

구현 중 사용자만 결정할 수 있는 선택, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌이 있으면 active review stub의 `사용자 리뷰 요청` 섹션에 정확한 증거를 기록하고 멈춘다. 구현 에이전트는 사용자에게 직접 질문하거나 선택지를 제시하거나 `request_user_input`을 호출하지 않는다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 검증 증거 공백만으로는 사용자 리뷰 요청을 작성하지 않는다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/automation-runtime-bridge/milestones/architecture-refactor-foundation.md`
- Task ids:
  - `terminal-core`: persistent PTY/screen/rendering/resize/input/signal/close terminal session core split
- Completion mode: check-on-pass

## 이전 리뷰 요약

- `code_review_cloud_G08_0.log` 판정: FAIL.
- Required 1: `./scripts/e2e-smoke.sh` 재실행에서 node OnStop이 `adapter "cli" stop: cli adapter: close session "fake-cli"/"default": close |1: file already closed`로 실패했다. 스크립트 exit code는 0이지만 clean shutdown 증거가 깨졌고, 구현 기록의 OnStop 성공 출력과 불일치한다.
- Required 2: 보조 smoke만 기록되어 있고 repo 내부 `scripts/dev/edge.sh` + `scripts/dev/node.sh` user-flow/full-cycle 진단 결과 또는 명확한 미실행 사유/남은 위험이 없다.

## 범위 결정 근거

- 범위는 CLI persistent session close idempotence와 검증 증거 회복으로 제한한다.
- Edge/proto command surface, remote terminal bridge transport, adapter executor 구조 재설계는 하지 않는다.
- `terminalSessionCore.Close()`에만 있는 already-closed 무시 로직이 pipe fallback session에도 적용되도록 shared close boundary를 정리한다.

## 구현 체크리스트

- [ ] `closeProfileSession` 또는 shared close helper가 PTY core와 pipe fallback session 모두에서 already-closed close 오류를 idempotent close로 처리한다.
- [ ] pipe fallback `Stop`/`TerminateSession` close idempotence 회귀 테스트를 추가하거나 보강하고, terminal core close tests도 계속 통과시킨다.
- [ ] `go test -count=1 ./apps/node/internal/adapters/cli`, `go test -count=1 ./apps/node/...`, `./scripts/e2e-smoke.sh`, `git diff --check`를 재실행하고 실제 stdout/stderr를 기록한다. smoke 출력에는 node OnStop stop error가 없어야 한다.
- [ ] repo 내부 `scripts/dev/edge.sh` + `scripts/dev/node.sh` user-flow 진단을 deterministic CLI profile로 실행해 같은 session 메시지 2회, `/capabilities`, `/transport`, `/sessions`, `/terminate-session` 결과를 기록한다. 실행할 수 없으면 `사용자 리뷰 요청`에 정확한 차단 근거와 남은 위험을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_REFACTOR-1] Make Persistent Session Close Idempotent

#### 문제

`apps/node/internal/adapters/cli/cli.go:426`의 `closeProfileSession`은 `closeFn()` 오류를 그대로 반환한다. 리뷰 재실행에서 non-terminal persistent fake CLI session stop이 이미 닫힌 pipe 오류를 반환했고, `persistentExecutor.Stop()`이 이를 adapter stop 실패로 전파했다.

#### 해결 방법

- 이미 닫힌 file/pipe close 오류를 idempotent close로 취급하는 helper를 shared path에 둔다.
- `terminalSessionCore.Close()`와 `closeProfileSession`이 같은 판단을 쓰도록 중복 문자열 비교를 줄인다.
- `closeProfileSession`은 close idempotence를 처리하되 process kill 자체의 기존 best-effort semantics는 유지한다.

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

- [ ] `apps/node/internal/adapters/cli/cli.go`: `closeProfileSession`에서 already-closed close 오류를 nil로 취급.
- [ ] `apps/node/internal/adapters/cli/terminal_session.go`: terminal core close의 duplicate already-closed 판정이 있으면 shared helper로 정리.
- [ ] `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go` 또는 `apps/node/internal/adapters/cli/cli_internal_test.go`: pipe fallback close idempotence 회귀 테스트 추가.

#### 중간 검증

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

### [REVIEW_REFACTOR-2] Recover User-Flow Verification Evidence

#### 문제

현재 review stub의 최종 검증은 보조 `./scripts/e2e-smoke.sh` 출력만 포함한다. 테스트 도메인 규칙상 사용자 실행 파이프라인 변경은 repo 내부 edge-node user-flow/full-cycle 진단 결과까지 필요하며, 보조 smoke 통과만으로 완료 처리할 수 없다.

#### 해결 방법

- close fix 후 보조 smoke를 재실행해 clean OnStop을 확인한다.
- `agent-ops/skills/project/e2e-smoke/SKILL.md` 기준으로 `scripts/dev/edge.sh`와 `scripts/dev/node.sh`를 각각 실행한 repo 내부 진단을 수행한다.
- edge 화면의 메시지 2회 왕복, node local payload와 edge rendered payload 일치, `/capabilities`, `/transport`, `/sessions`, `/terminate-session` 결과를 review stub에 기록한다.

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

- [ ] `agent-task/m-architecture-refactor-foundation/05+04_terminal_core/CODE_REVIEW-cloud-G08.md`: 검증 결과에 실제 stdout/stderr와 user-flow 진단 요약 기록.
- [ ] 소스 변경이 추가로 필요하면 `apps/node/internal/adapters/cli/**` 범위로 제한.

#### 중간 검증

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

## 최종 검증

```bash
go test -count=1 ./apps/node/internal/adapters/cli
go test -count=1 ./apps/node/...
./scripts/e2e-smoke.sh
git diff --check
```

예상 결과: 모든 명령 exit code 0이고, `./scripts/e2e-smoke.sh` 출력에서 node OnStop stop error가 없어야 한다. 추가로 repo 내부 `scripts/dev/edge.sh` + `scripts/dev/node.sh` user-flow 진단 결과를 review stub에 기록한다.
