iop/agent-task/cli_terminal_cycle/PLAN.md
toki 4bece3fb2d fix(cli): mutex unlock and session cleanup for persistent Execute (REVIEW_REVIEW_API_FOLLOWUP_2)
- [2-1] executePersistent: add defer sess.mu.Unlock() so all return paths
  release the session mutex. Remove explicit unlock calls.
- [2-2] Protect c.sessions map access in Execute with c.mu. Replace
  c.Stop() in timeout/cancel path with per-session close/kill/delete so
  only the affected profile session is cleaned up.
- [2-3] Add TestCLIExecutePersistentConsecutiveExecutes to verify the
  same persistent profile can be executed consecutively without blocking.
  Apply gofmt to all adapter files.
2026-05-03 15:01:57 +09:00

3 KiB

Persistent CLI mutex/session cleanup follow-up

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

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

배경

REVIEW_REVIEW_API_FOLLOWUP 구현은 timeout cleanup과 registry stop continuation을 시도했지만, persistent session mutex unlock 누락과 sessions map locking 불일치가 남았다. persistent terminal은 같은 profile에 여러 입력을 반복 전달해야 하므로 반복 실행 경로를 우선 복구한다.


[REVIEW_REVIEW_API_FOLLOWUP_2-1] Persistent Execute 모든 반환 경로에서 session mutex 해제

체크리스트

  • apps/node/internal/adapters/cli/cli.go - executePersistent에서 sess.mudefer 또는 명확한 helper로 모든 반환 경로에서 unlock한다.
  • apps/node/internal/adapters/cli/cli.go - timeout/cancel 경로에서도 double unlock이나 locked 상태 반환이 없게 정리한다.
  • apps/node/internal/adapters/cli/cli_test.go - 같은 persistent profile에 대해 Execute를 두 번 연속 호출하고 두 번째 응답까지 complete되는 테스트를 추가한다.

[REVIEW_REVIEW_API_FOLLOWUP_2-2] Timeout/cancel cleanup 범위와 sessions map locking 정리

체크리스트

  • apps/node/internal/adapters/cli/cli.go - c.sessions lookup/insert/delete/reset을 c.mu로 일관되게 보호한다.
  • apps/node/internal/adapters/cli/cli.go - 한 run timeout/cancel 시 해당 profile session만 close/kill/remove하거나, 전체 adapter invalidation을 명시적으로 구현하고 테스트한다.
  • apps/node/internal/adapters/cli/cli_test.go - 한 profile timeout이 다른 persistent profile session을 불필요하게 종료하지 않는지 또는 의도한 fail-fast 동작을 검증한다.

[REVIEW_REVIEW_API_FOLLOWUP_2-3] Partial rollback 테스트와 formatting 정리

체크리스트

  • 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을 검증한다.
  • apps/node/internal/adapters/registry.go, apps/node/internal/adapters/*_test.go - gofmt를 적용한다.
  • apps/node/internal/adapters/registry.go - Registry.Stop 주석과 실제 error 반환 정책을 일치시킨다.

최종 검증

gofmt -w apps/node/internal/adapters/cli/cli.go apps/node/internal/adapters/cli/cli_test.go apps/node/internal/adapters/registry.go apps/node/internal/adapters/registry_test.go
go test ./apps/node/internal/adapters ./apps/node/internal/adapters/cli
go test ./apps/node/internal/bootstrap ./apps/node/...
go test ./...