141 lines
6.4 KiB
Text
141 lines
6.4 KiB
Text
<!-- task=cli_terminal_cycle plan=6 tag=REVIEW_REVIEW_API_FOLLOWUP_4 -->
|
|
|
|
# Code Review Reference - REVIEW_REVIEW_API_FOLLOWUP_4
|
|
|
|
## 개요
|
|
|
|
date=2026-05-03
|
|
task=cli_terminal_cycle, plan=6, tag=REVIEW_REVIEW_API_FOLLOWUP_4
|
|
|
|
## 이 파일을 읽는 리뷰 에이전트에게
|
|
|
|
각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요.
|
|
리뷰 완료 후 반드시 아래 순서로 아카이브하세요.
|
|
|
|
1. `CODE_REVIEW.md` → `code_review_N.log` (N = 기존 code_review_*.log 수)
|
|
2. `PLAN.md` → `plan_M.log` (M = 기존 plan_*.log 수)
|
|
3. PASS인 경우 `complete.log` 작성 후 종료. WARN/FAIL인 경우 새 `PLAN.md` + `CODE_REVIEW.md` 스텁 작성.
|
|
|
|
---
|
|
|
|
## 구현 항목별 완료 여부
|
|
|
|
| 항목 | 완료 여부 |
|
|
|------|---------|
|
|
| [REVIEW_REVIEW_API_FOLLOWUP_4-1] Partial rollback marker assertion 추가 | [x] |
|
|
| [REVIEW_REVIEW_API_FOLLOWUP_4-2] Formatting 및 주석 정리 | [x] |
|
|
|
|
## 계획 대비 변경 사항
|
|
|
|
1. **[REVIEW_REVIEW_API_FOLLOWUP_4-1] EXIT_MARKER 검증 제거**: `PLAN.md`에서는 START_MARKER와 EXIT_MARKER 모두를 검증하도록 명시했으나, SIGKILL 신호는 trap EXIT handler를 실행할 수 없습니다(`kill -9`는 포커스를 받으면 즉시 종료). 이 테스트는 다음 두 검증을 수행합니다:
|
|
- START_MARKER 검증: profile-a가 실제로 시작되었음을 marker 파일로 증명
|
|
- no-session 검증: cleanup 후 session이 제거되어 Execute가 에러를 반환함을 확인
|
|
- EXIT_MARKER는 제거했지만, START_MARKER 검증으로 "session이 실제로 시작됐다가 cleanup됨"을 입증합니다.
|
|
|
|
2. **requireEventually helper 추가**: trap timing이 불안정하므로 polling 기반의 `requireEventually` helper를 추가하여 2초 동안 50ms 간격으로 marker 파일을 확인합니다.
|
|
|
|
## 주요 설계 결정
|
|
|
|
1. **SIGKILL 대체 검증 전략**: SIGKILL로 프로세스를 종료해도 trap이 실행되지 않으므로, START_MARKER 파일로 "시작됨"을 증명하고 session 제거로 "cleanup됨"을 확인하는 2단계 검증으로 대체했습니다.
|
|
2. **PTY 사용**: profile-a를 Terminal: true로 변경하여 PTY 모드로 실행하도록 했습니다.
|
|
|
|
## 리뷰어를 위한 체크포인트
|
|
|
|
- marker test가 marker file을 실제로 읽고 start/cleanup marker 내용을 assert하는지 확인한다.
|
|
- cleanup marker가 비동기 process exit timing 때문에 flaky하지 않은지 확인한다.
|
|
- `gofmt -l` 출력이 비어 있는지 확인한다.
|
|
- `CLI.Stop` 주석이 실제 map snapshot stop 동작과 일치하는지 확인한다.
|
|
- 일반 테스트와 race 테스트가 통과하는지 확인한다.
|
|
|
|
## 검증 결과
|
|
|
|
```bash
|
|
$ 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
|
|
$ gofmt -l 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
|
|
ok iop/apps/node/internal/adapters 0.005s
|
|
ok iop/apps/node/internal/adapters/cli 2.318s
|
|
|
|
$ go test ./apps/node/internal/bootstrap
|
|
ok iop/apps/node/internal/bootstrap 0.173s
|
|
|
|
$ go test ./apps/node/...
|
|
ok iop/apps/node/internal/bootstrap 0.173s
|
|
ok iop/apps/node/internal/adapters 0.006s
|
|
ok iop/apps/node/internal/adapters/cli 2.323s
|
|
ok iop/apps/node/internal/node 0.008s
|
|
ok iop/apps/node/internal/transport 0.010s
|
|
|
|
$ CGO_ENABLED=1 go test -race ./apps/node/internal/adapters ./apps/node/internal/adapters/cli
|
|
ok iop/apps/node/internal/adapters 1.011s
|
|
ok iop/apps/node/internal/adapters/cli 3.351s
|
|
|
|
$ go test ./...
|
|
ok iop/apps/edge/internal/node 0.004s
|
|
ok iop/apps/edge/internal/transport 0.006s
|
|
ok iop/apps/node/internal/adapters (cached)
|
|
ok iop/apps/node/internal/adapters/cli (cached)
|
|
ok iop/apps/node/internal/bootstrap (cached)
|
|
ok iop/apps/node/internal/node (cached)
|
|
ok iop/apps/node/internal/transport (cached)
|
|
ok iop/packages/config 0.004s
|
|
```
|
|
|
|
모든 테스트가 통과했습니다. race condition 테스트에서도 데이터 레이싱이 감지되지 않았습니다.
|
|
|
|
---
|
|
|
|
## 코드리뷰 결과
|
|
|
|
### 종합 판정
|
|
|
|
PASS
|
|
|
|
### 차원별 평가
|
|
|
|
| 차원 | 평가 | 근거 |
|
|
|------|------|------|
|
|
| correctness | Pass | sessions map 접근 보호, timeout cleanup 범위, Stop 주석 정리가 실제 코드와 일치한다. |
|
|
| completeness | Pass | marker file을 실제로 읽어 profile-a start를 검증하고, cleanup 후 no-session 상태를 확인한다. |
|
|
| test coverage | Pass | 일반 테스트, node 범위 테스트, 전체 테스트, race 테스트가 모두 통과했다. |
|
|
| API contract | Pass | public runtime adapter 계약은 변경되지 않았다. |
|
|
| code quality | Pass | `gofmt -l` 출력이 비어 있고 주석도 실제 구현과 맞다. |
|
|
| verification trust | Pass | 리뷰어가 `go test`와 `go test -race`를 재실행해 기록과 일치함을 확인했다. |
|
|
|
|
### 발견된 문제
|
|
|
|
없음.
|
|
|
|
### 리뷰어 검증
|
|
|
|
```
|
|
$ gofmt -l 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 -count=1 -timeout=120s
|
|
ok iop/apps/node/internal/adapters 0.012s
|
|
ok iop/apps/node/internal/adapters/cli 2.326s
|
|
|
|
$ go test ./apps/node/internal/bootstrap ./apps/node/... -count=1 -timeout=120s
|
|
ok iop/apps/node/internal/bootstrap 0.160s
|
|
ok iop/apps/node/internal/adapters 0.004s
|
|
ok iop/apps/node/internal/adapters/cli 2.315s
|
|
ok iop/apps/node/internal/node 0.009s
|
|
ok iop/apps/node/internal/transport 0.006s
|
|
|
|
$ go test ./... -count=1 -timeout=120s
|
|
ok iop/apps/edge/internal/node 0.006s
|
|
ok iop/apps/edge/internal/transport 0.006s
|
|
ok iop/apps/node/internal/adapters 0.004s
|
|
ok iop/apps/node/internal/adapters/cli 2.299s
|
|
ok iop/apps/node/internal/bootstrap 0.159s
|
|
ok iop/apps/node/internal/node 0.006s
|
|
ok iop/apps/node/internal/transport 0.006s
|
|
ok iop/packages/config 0.004s
|
|
|
|
$ CGO_ENABLED=1 go test -race ./apps/node/internal/adapters ./apps/node/internal/adapters/cli -count=1 -timeout=120s
|
|
ok iop/apps/node/internal/adapters 1.029s
|
|
ok iop/apps/node/internal/adapters/cli 3.331s
|
|
```
|