<!-- task=m-runner-output-boundary/03+01,02_core_cli_adapter plan=1 tag=REVIEW_REFACTOR -->

# Plan - REVIEW_REFACTOR

## Roadmap Targets

- Milestone: `agent-roadmap/phase/independent-control-plane/milestones/runner-output-boundary.md`
- Task ids:
  - `core`: data composition 경로의 printer/color 의존을 output port 또는 domain-neutral 계약으로 정리한다.
  - `cli-adapter`: 기존 CLI 출력 의미를 유지하는 adapter를 연결한다. 검증: CLI smoke 출력이 회귀하지 않는다.
- Completion mode: check-on-pass

## 배경

1차 리뷰는 output port 연결 자체와 검증 명령은 통과했지만, 최종 성공 배너의 기존 색상 의미가 보존되지 않아 FAIL로 종료했다.

- Archived plan: `agent-task/m-runner-output-boundary/03+01,02_core_cli_adapter/plan_cloud_G07_0.log`
- Archived review: `agent-task/m-runner-output-boundary/03+01,02_core_cli_adapter/code_review_cloud_G07_0.log`
- Required finding: `apps/runner/lib/oto/application.dart:187`의 `Build Successfully Complete` 배너가 기존 `Color.cyan`에서 adapter 기본 `RunnerOutputStyle.success -> Color.green`으로 바뀌었다.

## 구현 에이전트 지시

- 사용자에게 직접 질문하거나 선택지를 제시하지 않는다.
- 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 변경이 필요하면 active `CODE_REVIEW-local-G06.md`의 `사용자 리뷰 요청` 섹션을 채우고 중단한다.
- 검증 증거 부족은 사용자 리뷰 요청 사유가 아니다. 명령을 재실행해 실제 stdout/stderr를 기록한다.
- 범위는 최종 성공 배너의 기존 cyan 의미 복원과 테스트 보강으로 제한한다. DataComposer, pipeline, agent, scheduler 동작은 재설계하지 않는다.

## 구현 체크리스트

- [ ] 최종 `Build Successfully Complete` build step이 기존 `Color.cyan` 의미를 보존하도록 `RunnerOutputStyle` 사용 또는 adapter mapping을 수정한다.
- [ ] 성공 배너 style/color 회귀를 잡는 테스트를 추가하거나 기존 output-port 테스트를 보강한다.
- [ ] core/CLI 관련 검증과 no-match `rg` 검증을 실행한다.
- [ ] CODE_REVIEW-local-G06.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/runner/lib/oto/application.dart` | REVIEW_REFACTOR-1 |
| `apps/runner/lib/oto/core/output_port.dart` | REVIEW_REFACTOR-1, 필요 시 |
| `apps/runner/lib/cli/runner_output_adapter.dart` | REVIEW_REFACTOR-1, 필요 시 |
| `apps/runner/test/oto_application_test.dart` | REVIEW_REFACTOR-1 |

## [REVIEW_REFACTOR-1] Final Success Banner Cyan Preservation

### 문제

기존 구현은 최종 성공 배너를 cyan으로 출력했다.

```dart
await printBuildStep('Build Successfully Complete', Color.cyan);
```

현재 구현은 style을 명시하지 않아 `RunnerOutputStyle.success` 기본값을 사용하고, `CliRunnerOutputPort`는 이를 `Color.green`으로 매핑한다.

```dart
await printBuildStep('Build Successfully Complete');
```

이는 1차 계획의 “기존 CLI 출력 의미 보존” 항목과 맞지 않는다.

### 해결 방법

최종 성공 배너만 기존 cyan 의미를 유지하도록 명시한다. 선택지는 둘 중 하나다.

- 좁은 변경: 기존 `RunnerOutputStyle.progress`가 cyan으로 매핑되어 있으므로 성공 배너 호출에서 해당 style을 명시한다.
- 명확한 계약 변경: `RunnerOutputStyle.complete` 같은 style을 추가하고 `CliRunnerOutputPort`에서 `Color.cyan`으로 매핑한 뒤 성공 배너에서 사용한다.

선택한 방식은 테스트에서 style 또는 adapter color까지 확인해야 한다.

### 수정 파일 및 체크리스트

- [ ] `Application.build`의 최종 성공 배너가 cyan 의미를 보존하게 수정
- [ ] 테스트 recording output이 style을 기록하도록 보강하거나 adapter 주입 테스트로 `Color.cyan` 매핑을 검증
- [ ] 기존 build data, failure, phase start 출력 의미가 바뀌지 않았는지 확인

### 테스트 작성

- 작성/보강: `apps/runner/test/oto_application_test.dart`
- 목표: 성공 build 완료 시 `Build Successfully Complete` 이벤트가 기존 cyan에 해당하는 style로 emit되는지 검증한다.

### 중간 검증

```bash
cd apps/runner && dart analyze
cd apps/runner && dart test test/oto_application_test.dart
```

## 최종 검증

```bash
cd apps/runner && dart analyze
cd apps/runner && dart test test/oto_application_test.dart test/oto_context_test.dart test/oto_core_test.dart test/oto_system_runtime_test.dart
cd apps/runner && dart test test/oto_cli_runtime_test.dart test/oto_catalog_cli_test.dart test/oto_validate_cli_test.dart
cd apps/runner && dart run bin/main.dart --help
! rg --sort path -n "package:oto/cli|CLI\\.|Color\\." apps/runner/lib/oto/pipeline apps/runner/lib/oto/core/data_composer.dart
```

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-local-G06.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
