# Code review stub: runner registration legacy iop boundary split

## Review target

- Plan: `PLAN-cloud-G06.md`
- Status: pending implementation

## Reviewer focus

- Confirm default runner production imports are OTO Server only.
- Confirm legacy iop compatibility remains explicit and opt-in.
- Confirm type aliases or transitional names do not preserve the same dependency leak.
- Confirm tests still cover registration, job claim, reporting, cancellation, status, and self-update behavior.

## Required checks

- `cd apps/runner && dart analyze`
- `cd apps/runner && dart test`

## Notes

This item is a boundary cleanup, not a protocol rewrite.

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Pass
  - completeness: Fail
  - test coverage: Pass
  - API contract: Fail
  - code quality: Pass
  - plan deviation: Fail
  - verification trust: Fail
- 발견된 문제:
  - Required: `apps/runner/lib/oto/agent/agent_runner.dart:23`에서 `DefaultAgentRunner`의 주입 콜백 타입이 여전히 `EdgeAgentSession`이고, `apps/runner/lib/oto/agent/agent_runner.dart:41`에서도 기본 runner 세션 타입을 `EdgeAgentSession`으로 선언합니다. 계획은 default runner가 neutral `AgentSession` 경계에 의존해야 한다고 요구했으므로 production path의 public/internal 타입 표면에 legacy Edge 명칭이 남아 있습니다. `runJobs` 콜백, 로컬 변수, 테스트 fake 타입을 `AgentSession` 기준으로 바꾸고, job loop 판별은 기존처럼 `OtoServerJobSession`으로 좁히세요.
  - Required: `apps/runner/lib/oto/agent/registration_client.dart:16`과 `apps/runner/lib/oto/agent/registration_client.dart:126`에서 neutral 파일이 legacy `EdgeEndpoint`와 `EdgeAgentSession` alias를 직접 소유합니다. 그 결과 default runner가 import하는 neutral module 자체가 legacy Edge 개념을 계속 노출합니다. `EdgeEndpoint`와 legacy alias는 `edge_registration_client.dart` 쪽으로 이동하거나 legacy 파일에서만 export하고, `registration_client.dart`는 `AgentSession`, `RegistrationClient`, `RegistrationResult`, `OtoServerRegistrationClient`, `OtoServerJobSession` 같은 OTO Server/neutral 경계만 노출하도록 정리하세요.
  - Required: `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/CODE_REVIEW-cloud-G06.md:1`이 구현 완료 스텁이 아니라 `Status: pending implementation` 상태로 남아 있고, 구현 체크리스트, 계획 대비 변경 사항, 주요 설계 결정, 실제 검증 stdout/stderr가 없습니다. 리뷰어가 로컬에서 `dart analyze`와 `dart test`를 재실행해 통과를 확인했지만, loop 계약상 구현 에이전트 소유 증거가 기록되지 않았으므로 verification trust를 PASS로 둘 수 없습니다. 후속 구현은 active review stub의 구현 소유 섹션을 실제 내용과 명령 출력으로 채워야 합니다.
- 검증 참고:
  - `cd apps/runner && dart analyze` 통과 (`No issues found!`)
  - `cd apps/runner && dart test test/oto_agent_registration_test.dart test/oto_agent_migration_plan_test.dart test/oto_server_connection_smoke_test.dart` 통과 (`All tests passed!`)
  - `cd apps/runner && dart test` 통과 (`All tests passed!`, legacy iop smoke 1건은 opt-in skip)
- 다음 단계: user-review gate는 트리거하지 않습니다. `PLAN-cloud-G06.md`와 `CODE_REVIEW-cloud-G06.md` 후속 루프를 작성해 위 Required 항목만 좁게 수정하고 검증 출력까지 기록합니다.

## 코드리뷰 전용 체크리스트

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-cloud-G06.md`를 `code_review_cloud_G06_0.log`로 아카이브한다.
- [x] active `PLAN-cloud-G06.md`를 `plan_cloud_G06_0.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [ ] PASS이면 active task 디렉터리 `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/`를 archive로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다.
- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/control_plane_phase_exit_followups/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G06.md`와 `CODE_REVIEW-cloud-G06.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.

적용 결과:

- archived review: `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/code_review_cloud_G06_0.log`
- archived plan: `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/plan_cloud_G06_0.log`
- follow-up plan: `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/PLAN-cloud-G06.md`
- follow-up review: `agent-task/control_plane_phase_exit_followups/02_legacy_iop_boundary/CODE_REVIEW-cloud-G06.md`
- `git check-ignore -q -- <artifact>` 결과: 위 네 artifact 모두 exit code 1로 ignore되지 않음.
