# Phase: Control Plane 제품 표면 완성

## 상태

[진행중]

## 목표

현재 분리된 OTO Core API 서버, Flutter client, runner bootstrap 경계를 실제 사용자가 조작할 수 있는 Control Plane 제품 표면으로 끌어올린다.
먼저 OTO Core bootstrap 흐름이 Linux, macOS, Windows 대상 `oto` binary 설치와 runner/node 연결까지 이어지도록 고정하고, 그 실제 연결 상태를 바탕으로 Flutter UI 스켈레톤을 만든다.

## Milestone 흐름

완료된 Milestone은 archive 경로를 가리키고, 검토중, 진행중, 계획, 스케치 또는 보류 Milestone은 이 Phase 하위 `milestones/` 경로를 가리킨다.
완료, 검토중, 진행중, 계획, 스케치 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다.
스케치 Milestone은 아직 구현 가능한 계획이 아니므로 계획 Milestone보다 아래에 둔다.

- [완료] Runner bootstrap, OTO binary, 노드 연결
  - 경로: `agent-roadmap/archive/phase/control-plane-product-surface/milestones/cross-os-runner-bootstrap.md`
  - 요약: OTO Core bootstrap command와 bootstrap asset이 Linux, macOS, Windows에서 `oto` binary를 내려받고 runner/node로 Core에 연결할 수 있도록 확장한다.
- [완료] Flutter 콘솔 스켈레톤
  - 경로: `agent-roadmap/archive/phase/control-plane-product-surface/milestones/flutter-console-skeleton.md`
  - 요약: bootstrap과 runner/node 연결 기준을 바탕으로 `apps/client`와 `packages/flutter/oto_console`에 Control Plane 주요 화면, 상태 표시, 빈 상태를 갖춘 UI 스켈레톤을 만든다.
- [계획] Control Plane API 데이터 바인딩
  - 경로: `agent-roadmap/phase/control-plane-product-surface/milestones/control-plane-api-data-binding.md`
  - 요약: UI 스켈레톤에 기존 OTO Core runner/job/execution/log/artifact API의 read path를 연결하고, 실제 데이터가 비어 있거나 실패할 때의 상태 표현을 검증한다.

## Phase 경계

- 이 Phase는 기존 `services/core`, `apps/client`, `packages/flutter/oto_console`, `apps/runner` 경계를 유지하면서 제품 표면과 bootstrap 실행성을 보강한다.
- Jenkins 전체 기능, 장기 권한/감사 모델, durable artifact storage 운영 정책은 이 Phase의 기본 범위가 아니다.
- iop Edge 직접 연결 경로는 복원하지 않는다. OTO Core와 OTO runner의 독립 Control Plane 경로를 기준으로 한다.
- private release host, enrollment token, credential 원문은 tracked 문서에 남기지 않는다.
