<!-- task=m-agent-registration-capability-boundary/03+01,02_registration_wiring plan=0 tag=REFACTOR -->

# Code Review Reference - REFACTOR

## 개요

date=2026-06-10
task=m-agent-registration-capability-boundary/03+01,02_registration_wiring, plan=0, tag=REFACTOR

## Roadmap Targets

- Milestone: `agent-roadmap/phase/message-based-build-agent/milestones/agent-registration-capability-boundary.md`
- Task ids:
  - `registration`: 기존 registration payload 의미를 유지하면서 agent registration client가 adapter 계약만 소비하도록 바꾼다.
  - `rule-evidence`: 변경 후 agent domain rule 위반 import가 남아 있지 않은지 확인한다.
- Completion mode: check-on-pass

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REFACTOR-1] Registration Wiring | [x] |

## 구현 체크리스트

- [x] 선행 `01_agent_port`, `02+01_command_adapter` complete evidence를 확인한다.
  - `apps/runner/lib/oto/agent/runner_capability_provider.dart` 존재 (`01_agent_port` 완료 증거)
  - `apps/runner/lib/oto/commands/runner_command_capability_provider.dart` 존재 (`02+01_command_adapter` 완료 증거)
- [x] `OtoServerRegistrationClient`에서 command domain imports와 `_defaultCommandTypes()`를 제거한다.
  - `import 'package:oto/oto/commands/command.dart'` 제거
  - `import 'package:oto/oto/commands/command_registry.dart'` 제거
  - `_defaultCommandTypes()` static 메서드 제거
  - `_DefaultRunnerCapabilityProvider` 클래스 제거
  - 생성자 fallback: `_StaticRunnerCapabilityProvider(commandTypes ?? const [])`로 교체
- [x] default production 생성 경로에서 command adapter provider를 주입하되 기존 `commandTypes:` call site 호환을 유지한다.
  - `agent_runner.dart`에 `runner_command_capability_provider.dart` import 추가
  - `DefaultAgentRunner` 기본 생성: `OtoServerRegistrationClient(capabilityProvider: const CommandCatalogRunnerCapabilityProvider())`
  - 기존 `commandTypes:` 파라미터는 `_StaticRunnerCapabilityProvider`로 그대로 동작
- [x] provider default path request build test와 HTTP payload test를 추가/갱신한다.
  - `'builds registration request using CommandCatalogRunnerCapabilityProvider'` 추가
  - `'posts registration payload using CommandCatalogRunnerCapabilityProvider'` 추가
- [x] `rg --sort path "package:oto/oto/commands/" apps/runner/lib/oto/agent` 결과가 의도된 예외 없이 비어 있는지 확인한다.
  - `registration_client.dart`에 command import 없음 ✓
  - `agent_runner.dart` 1건: PLAN에서 명시한 wiring 지점의 의도된 결과
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다.

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

- [x] PASS/WARN/FAIL 판정을 append한다.
- [x] active plan/review 파일을 `.log`로 아카이브한다.
- [x] PASS이면 `complete.log` 작성 후 archive로 이동한다.

## 계획 대비 변경 사항

- `_DefaultRunnerCapabilityProvider` 제거 후 null 케이스 처리: PLAN은 `_DefaultRunnerCapabilityProvider` 제거만 명시했으나, 생성자에서 `commandTypes == null`인 경우 fallback이 필요했다. `_StaticRunnerCapabilityProvider(commandTypes ?? const [])` 단일 경로로 정리해 `_DefaultRunnerCapabilityProvider` 클래스 자체를 제거했다. production path는 `agent_runner.dart`가 항상 명시적 provider를 주입하므로 empty fallback은 직접 사용되지 않는다.

## 주요 설계 결정

- `agent_runner.dart`가 command domain import를 갖는 것은 의도된 설계: `registration_client.dart`는 `RunnerCapabilityProvider` 인터페이스만 소비하고, command 도메인 구체 타입은 `agent_runner.dart` 한 곳에서만 wiring한다. `rg` 결과에 `agent_runner.dart` 1건이 남는 것은 PLAN REFACTOR-1의 "wiring 지점" 설계 그대로다.

## 사용자 리뷰 요청

- 상태: 없음
- 사유 유형: 없음
- 결정 필요: 없음
- 차단 근거: 없음
- 실행한 검증/명령: 없음
- 자동 후속 불가 이유: 없음
- 재개 조건: 없음

## 리뷰어를 위한 체크포인트

- `registration_client.dart`가 command domain import를 더 이상 갖지 않는지 확인
- 기존 explicit `commandTypes:` call site가 깨지지 않는지 확인
- server connection smoke가 registration payload 의미를 유지하는지 확인

## 검증 결과

### REFACTOR-1 중간 검증

```text
$ rg --sort path "package:oto/oto/commands/" apps/runner/lib/oto/agent
apps/runner/lib/oto/agent/agent_runner.dart:import 'package:oto/oto/commands/runner_command_capability_provider.dart';

$ cd apps/runner && dart test test/oto_agent_registration_test.dart
00:01 +38: All tests passed!
```

### 최종 검증

```text
$ cd apps/runner && dart analyze
Analyzing runner...
No issues found!

$ cd apps/runner && dart test test/oto_agent_registration_test.dart test/oto_command_catalog_test.dart
00:01 +59: All tests passed!

$ rg --sort path "package:oto/oto/commands/" apps/runner/lib/oto/agent
apps/runner/lib/oto/agent/agent_runner.dart:import 'package:oto/oto/commands/runner_command_capability_provider.dart';
```

- `registration_client.dart`에 command import 없음 ✓
- `agent_runner.dart` 1건은 PLAN 명시 wiring 지점 (의도된 예외)

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Pass
- 발견된 문제: 없음
- 리뷰어 검증:
  - `cd apps/runner && dart analyze` - PASS; `No issues found!`
  - `cd apps/runner && dart test test/oto_agent_registration_test.dart test/oto_command_catalog_test.dart test/oto_server_connection_smoke_test.dart` - PASS; `+68: All tests passed!`
  - `cd apps/runner && dart format --output=none --set-exit-if-changed lib/oto/agent/registration_client.dart lib/oto/agent/agent_runner.dart lib/oto/commands/runner_command_capability_provider.dart test/oto_agent_registration_test.dart test/oto_command_catalog_test.dart` - PASS; `Formatted 5 files (0 changed)`
  - `rg --sort path "package:oto/oto/commands/" apps/runner/lib/oto/agent` - PASS; `agent_runner.dart`의 `runner_command_capability_provider.dart` import 1건은 PLAN REFACTOR-1에서 요구한 production wiring 지점이며, `registration_client.dart`에는 command domain import가 남아 있지 않다.
- 리뷰 중 정리:
  - `dart format`으로 `registration_client.dart`, `agent_runner.dart`, `oto_agent_registration_test.dart`의 포맷 drift를 정리했다.
- 다음 단계: PASS이므로 active plan/review를 `.log`로 아카이브하고 `complete.log` 작성 후 task directory를 archive로 이동한다.
