<!-- task=m-multi-edge-operations/04+03_client_fleet_ui plan=0 tag=API -->
# Plan - Client Fleet UI

## 작업 지시

Client portal에 multi-edge fleet status, Edge별 command 상태, OTO/build-deploy domain agent summary를 표시한다. 이 plan은 Control Plane fleet API 완료 뒤에 실행한다.

## Roadmap Targets

- `agent-roadmap/phase/control-plane-portal-ops/milestones/multi-edge-operations.md` `[edge-status-view]`
- `agent-roadmap/phase/control-plane-portal-ops/milestones/multi-edge-operations.md` `[history-agent-state]`
- 완료 방식: 선행 plan 검증과 이 UI 검증이 모두 통과하면 두 target을 완료 처리한다.

## 선행 의존성

- 필요: `agent-task/m-multi-edge-operations/03+01,02_control_plane_fleet_api/complete.log`
- 현재 상태: missing. 구현 시작 전 선행 plan 완료 로그를 확인한다.

## 분석 결과

Client repository는 `/edges`, `/edges/{id}/status`, `/edges/{id}/events`만 읽는다.

```dart
// apps/client/lib/control_plane_status_client.dart:175
class ControlPlaneStatusRepository {
  ControlPlaneStatusRepository({
```

현재 UI는 Edges, Nodes, Execution Logs 패널로 구성되어 있다.

```dart
// apps/client/lib/control_plane_status_widgets.dart:4
class EdgesPanel extends StatelessWidget {
```

Widget test는 두 Edge와 node/event 표시 회귀를 검증한다.

```dart
// apps/client/test/widget_test.dart:1
import 'dart:async';
```

## 구현 체크리스트

1. Control Plane fleet API 응답 모델을 Dart client에 추가한다.
2. Edge별 capability/status/domain agent summary 모델을 추가한다.
3. UI에 fleet health와 Edge별 command 상태를 표시한다.
4. OTO/build-deploy domain agent summary를 별도 패널 또는 Nodes 패널의 안정적인 섹션으로 표시한다.
5. command 실행 버튼은 검증된 API 범위가 있을 때만 추가한다. API가 summary-only이면 실행 버튼 없이 상태/결과 표시만 구현한다.
6. mobile/desktop에서 텍스트 overflow와 panel overlap을 확인한다.
7. existing widget tests를 확장해 두 Edge, domain agent summary, command 상태를 검증한다.

## 세부 설계

### Data Model

- `EdgeCapabilityStatus`
- `EdgeDomainAgentStatus`
- `EdgeOperationStatus`
- `FleetStatus`

모델은 Control Plane API view에 맞추되, Edge config/runtime original detail을 표현하는 필드는 추가하지 않는다.

### UI

- Edges panel은 연결/health와 capability summary를 함께 보여준다.
- Nodes panel은 Edge-owned node summary만 보여준다.
- 새 Operation/Agent panel은 `ready`, `busy`, `error`, `unknown` 같은 짧은 상태 중심으로 구성한다.
- 실행 로그 패널은 command event relay를 보여주되 artifact/log 원본 뷰어로 확장하지 않는다.

### Tests

- fake repository에 fleet status와 domain agent summary fixture를 추가한다.
- UI가 두 Edge의 capability/status를 표시하는지 검증한다.
- OTO/build-deploy summary가 표시되는지 검증한다.
- API failure는 degraded/unknown state로 표시된다.
- 버튼/라벨 텍스트가 작은 화면에서 overflow하지 않도록 golden 또는 widget-level layout 검증을 추가한다.

## 검증

- `cd apps/client && flutter test`
- `cd apps/client && flutter analyze --no-fatal-infos`
- 원격 Flutter runner가 필요한 환경이면 runner 동기화 후 같은 명령을 실행한다.

## 완료 조건

- Client에서 multi-edge connection/health, command status, OTO/build-deploy summary가 확인된다.
- UI는 Control Plane을 Edge data owner로 보이게 만들지 않는다.
- `[edge-status-view]`, `[history-agent-state]` 완료 근거를 milestone에 남길 수 있다.
