# 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 ./... ```