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

# Code Review Reference - REFACTOR

## 개요

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

## Roadmap Targets

- Milestone: `agent-roadmap/phase/message-based-build-agent/milestones/agent-registration-capability-boundary.md`
- Task ids:
  - `command-adapter`: command catalog 조회와 `registerAllCommands()` 호출을 command domain adapter 뒤로 이동한다.
- Completion mode: check-on-pass

## 구현 항목별 완료 여부

| 항목 | 완료 여부 |
|------|---------|
| [REFACTOR-1] Command Adapter | [x] |

## 구현 체크리스트

- [x] 선행 `agent-task/m-agent-registration-capability-boundary/01_agent_port/**/complete.log` 존재를 확인한다.
- [x] command domain에 agent port 구현 adapter를 추가한다.
- [x] adapter가 `registerAllCommands()` 호출 후 `Command.catalogRows`에서 type만 안정적으로 산출하게 한다.
- [x] command catalog test에 adapter command type parity test를 추가한다.
- [x] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

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

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

## 계획 대비 변경 사항

- production default wiring은 계획 범위 밖인 `03` 작업으로 남기고 변경하지 않았다.
- adapter의 기본 name/version은 command domain 파일에서 literal default로 보유하되, 테스트에서 `OtoServerRegistrationClient`의 현재 public constants와 일치하는지 검증했다. command adapter가 registration client 구현 파일에 직접 의존하지 않게 하기 위한 선택이다.

## 주요 설계 결정

- `CommandCatalogRunnerCapabilityProvider`를 `apps/runner/lib/oto/commands/runner_command_capability_provider.dart`에 추가해 command domain이 `RunnerCapabilityProvider` port를 구현하게 했다.
- `snapshot()` 호출 시 `registerAllCommands()`를 먼저 실행하고, `Command.catalogRows.map((row) => row['type']!)`를 `RunnerCapabilitySnapshot.commandTypes`로 전달한다.
- command catalog test에 adapter parity test를 추가해 adapter command type 목록이 catalog type 목록과 동일하고 capability name/version이 등록 client constants와 일치하는지 검증했다.

## 사용자 리뷰 요청

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

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

- adapter가 command 도메인에 있고 agent implementation 파일에 command import를 추가하지 않았는지 확인
- `registerAllCommands()` 호출이 adapter 뒤로 이동했는지 확인
- test가 command catalog와 adapter parity를 검증하는지 확인

## 검증 결과

### REFACTOR-1 중간 검증

```text
$ cd apps/runner && dart test test/oto_command_catalog_test.dart
+21: All tests passed!
```

### 최종 검증

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

$ cd apps/runner && dart test test/oto_command_catalog_test.dart test/oto_command_runtime_test.dart
+48: All tests passed!
```

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - correctness: Pass
  - completeness: Pass
  - test coverage: Pass
  - API contract: Pass
  - code quality: Pass
  - plan deviation: Pass
  - verification trust: Pass
- 발견된 문제: 없음
- 리뷰 중 정리:
  - `dart format apps/runner/lib/oto/commands/runner_command_capability_provider.dart apps/runner/test/oto_command_catalog_test.dart`로 포맷 drift를 정리했다.
- 검증:
  - `cd apps/runner && dart analyze` - PASS; `No issues found!`
  - `cd apps/runner && dart test test/oto_command_catalog_test.dart test/oto_command_runtime_test.dart` - PASS; `+48: All tests passed!`
  - `dart format --output=none --set-exit-if-changed apps/runner/lib/oto/commands/runner_command_capability_provider.dart apps/runner/test/oto_command_catalog_test.dart` - PASS; `Formatted 2 files (0 changed)`
- 다음 단계: PASS이므로 `complete.log` 작성 후 active task 디렉터리를 archive로 이동한다.
