<!-- task=cli_terminal_cycle plan=3 tag=REVIEW_REVIEW_API_FOLLOWUP -->

# Persistent CLI cancel/stop cleanup follow-up

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

각 항목의 체크리스트를 완료하면 즉시 체크 표시한다. 중간/최종 검증 명령을 실제로 실행하고 출력을 `CODE_REVIEW.md`의 검증 결과 섹션에 붙여 넣는다. 계획과 다르게 구현해야 하는 부분이 생기면 이유를 `CODE_REVIEW.md`의 `계획 대비 변경 사항`에 남긴다.

## 배경

`REVIEW_REVIEW_API` 후속 구현은 partial lifecycle start rollback을 보강했다. 리뷰 결과, timeout/cancel 이후 persistent CLI 출력이 다음 run으로 섞일 수 있는 문제와 `Registry.Stop`의 stop error 처리 문제가 남았다.

---

### [REVIEW_REVIEW_API_FOLLOWUP-1] Persistent CLI timeout/cancel 후 session 오염 방지

#### 문제

`apps/node/internal/adapters/cli/cli.go`의 persistent 실행은 prompt를 쓴 뒤 `ctx.Done()`이 오면 바로 `ctx.Err()`를 반환한다. process는 계속 살아 있고, 늦게 나온 출력은 shared `sess.output`에 남아 다음 run의 delta로 emit될 수 있다.

#### 해결 후보

- 보수적 수정: `ctx.Done()` 경로에서 해당 persistent session을 close/kill하고 `c.sessions`에서 제거한다. 다음 run은 명시적인 no-session error를 반환하거나 lifecycle restart 정책이 생길 때까지 node 재시작을 요구한다.
- 복구형 수정: `ctx.Done()` 경로에서 session을 kill한 뒤 같은 profile로 새 session을 시작해 `c.sessions`에 교체한다. 실패하면 no-session 상태로 둔다.

불확실하면 보수적 수정을 우선한다. 출력 경계를 신뢰할 수 없는 상태에서 drain만 하는 방식은 피한다.

#### 체크리스트

- [ ] `apps/node/internal/adapters/cli/cli.go` - persistent `ctx.Done()` 경로에서 session을 무효화하거나 재시작해 늦은 출력이 다음 run에 섞이지 않게 한다.
- [ ] `apps/node/internal/adapters/cli/cli.go` - `c.sessions` 접근이 Stop/Execute와 충돌하지 않도록 필요한 최소 locking을 추가한다.
- [ ] `apps/node/internal/adapters/cli/cli_test.go` - 첫 run timeout 후 늦은 출력이 두 번째 run delta에 섞이지 않는 회귀 테스트를 추가한다.

---

### [REVIEW_REVIEW_API_FOLLOWUP-2] Registry.Stop은 모든 lifecycle adapter stop을 시도

#### 문제

`Registry.Stop`은 첫 `Stop` error에서 반환하므로, 남은 lifecycle adapter가 정리되지 않을 수 있다.

#### 체크리스트

- [ ] `apps/node/internal/adapters/registry.go` - reverse order stop을 끝까지 수행하고 error는 `errors.Join` 또는 first error로 반환한다.
- [ ] `apps/node/internal/adapters/registry_test.go` - 뒤쪽 adapter stop 실패 후에도 앞쪽 adapter stop이 호출되는 테스트를 추가한다.

---

### [REVIEW_REVIEW_API_FOLLOWUP-3] CLI partial profile rollback 테스트 강화

#### 문제

현재 rollback 테스트는 map iteration 순서 때문에 이미 시작된 profile이 없는 경로로도 통과할 수 있고, 실제 process 종료 marker를 확인하지 않는다.

#### 체크리스트

- [ ] `apps/node/internal/adapters/cli/cli.go` - 필요하면 persistent profile start 순서를 deterministic하게 정한다.
- [ ] `apps/node/internal/adapters/cli/cli_test.go` - 시작 marker와 exit marker로 partial-start cleanup을 검증한다.

## 최종 검증

```bash
go test ./apps/node/internal/adapters ./apps/node/internal/adapters/cli
go test ./apps/node/internal/bootstrap ./apps/node/...
go test ./...
```
