# Milestone: runner 출력 경계 분리

## 상태

[완료]

## 목표

pipeline/core 실행 로직이 CLI 출력 구현에 직접 의존하지 않도록 output/progress port를 도입하고, CLI는 해당 port의 adapter로만 연결한다.

## 범위

- pipeline 실행 코드에서 `CLI.println`과 `Application.instance.printBuildStep` 직접 호출을 분리한다.
- core data composition 경로가 CLI color/printer 구현에 묶이지 않도록 출력 계약을 정리한다.
- 기존 CLI 사용자 출력은 adapter를 통해 동일한 의미로 유지한다.

## 범위 제외

- 로그 포맷 전면 개편
- OTO Server remote log streaming 재설계
- YAML pipeline 문법 변경

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 작업 컨텍스트

- `apps/runner/lib/oto/pipeline/pipeline_exe.dart`와 `pipeline_foreach.dart`는 CLI 출력 계층을 직접 import한다.
- `apps/runner/lib/oto/core/data_composer.dart`는 CLI color/printer 형태를 core 동작으로 노출한다.
- 표준선: domain 실행 로직은 출력 port를 호출하고, CLI/UI/server는 port adapter를 제공한다.
- 현재 작업 현황:
  - `01_output_port_contract`는 PASS 완료되어 `[port]` Task가 완료 상태다.
  - `02+01_pipeline_output_port`는 PASS 완료되어 `[pipeline]` Task가 완료 상태다.
  - `03+01,02_core_cli_adapter`는 2회 리뷰 끝에 PASS 완료되어 `[core]`, `[cli-adapter]` Task가 완료 상태다.
  - active `agent-task/m-runner-output-boundary/**` 작업은 남아 있지 않고, 완료 산출물은 `agent-task/archive/2026/06/m-runner-output-boundary/**`에 있다.

## 기능

### Epic: [output] output port boundary

- [x] [port] runner 실행 progress와 일반 출력에 필요한 최소 output port 계약을 정의한다.
- [x] [pipeline] pipeline domain이 CLI 구현체 대신 output port를 사용하도록 분리한다. 검증: runner analyze와 pipeline 관련 테스트가 통과한다.
- [x] [core] data composition 경로의 printer/color 의존을 output port 또는 domain-neutral 계약으로 정리한다.
- [x] [cli-adapter] 기존 CLI 출력 의미를 유지하는 adapter를 연결한다. 검증: CLI smoke 출력이 회귀하지 않는다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-06-07
- 완료 근거:
  - `port`, `pipeline`, `core`, `cli-adapter` Task가 각각 `agent-task/archive/2026/06/m-runner-output-boundary/**/complete.log`의 Roadmap Completion 근거와 함께 PASS 완료됐다.
  - `apps/runner/lib/oto/pipeline/**`와 `apps/runner/lib/oto/core/data_composer.dart`에서 CLI/Color 직접 의존이 제거됐고, `CliRunnerOutputPort` adapter가 기존 CLI 출력 의미를 보존한다.
  - 최종 검증으로 `dart analyze`, core/CLI 테스트 묶음, CLI help smoke, data_composer/pipeline no-match `rg` 검증이 통과했다.
- 사용자 최종 확인 항목:
  - 2026-06-07 사용자 요청으로 완료 승인 및 archive 이동을 진행했다.
- 리뷰 코멘트: 완료 후보로 보이며, legacy iop smoke 제외 판단은 `02+01_pipeline_output_port` USER_REVIEW에서 사용자가 승인한 범위 판단을 따른다.
