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

## Review Scope

- `apps/client/lib/control_plane_status_client.dart`
- `apps/client/lib/control_plane_status_widgets.dart`
- `apps/client/lib/main.dart`
- `apps/client/test/widget_test.dart`

## 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]`

## Dependency Check

- [x] `agent-task/archive/2026/06/m-multi-edge-operations/03+01,02_control_plane_fleet_api/complete.log` 확인

## Reviewer Checklist

- [ ] Client 모델이 Control Plane view만 표현하고 Edge 원본 저장 모델을 암시하지 않는다.
- [ ] OTO/build-deploy 정보는 summary/status 수준으로 표시된다.
- [ ] multi-edge 상태와 command status가 사용자가 스캔하기 쉽게 표시된다.
- [ ] API failure/degraded/unknown state가 UI에서 명확하다.
- [ ] mobile/desktop에서 overflow와 overlap이 없다.
- [ ] 기존 Edges/Nodes/Execution Logs 회귀 테스트가 유지된다.

## Verification Result

- [ ] `cd apps/client && flutter test`
- [ ] `cd apps/client && flutter analyze --no-fatal-infos`
- [ ] 원격 runner 사용 시 동기화/실행 로그 첨부

## User Review

검토 기본값: 이 리뷰는 사용자가 명시적으로 보류하지 않으면 구현자가 자체 검증 후 완료 처리한다.

## 코드리뷰 결과

- 종합 판정: FAIL
- 차원별 평가:
  - correctness: Fail
  - completeness: Fail
  - test coverage: Fail
  - API contract: Fail
  - code quality: Pass
  - plan deviation: Fail
  - verification trust: Warn
- 발견된 문제:
  - Required: `apps/client/lib/control_plane_status_widgets.dart:1141`에서 domain agent별 버튼이 `${agent.agentKind}.sync` operation을 임의로 만들어 `sendEdgeCommand`로 전송합니다. 현재 Edge command contract는 `health.check`, `agent.status`, `agent.command` 계열만 처리하며, `oto-agent.sync`/`build-deploy.sync`는 `unsupported` 응답이 됩니다. summary-only API 범위에서는 버튼을 제거하거나, 실제 지원되는 operation/target/parameters가 API에 명시된 경우에만 그 계약으로 전송하도록 고쳐야 합니다.
  - Required: `apps/client/lib/control_plane_status_widgets.dart:889`와 `apps/client/test/widget_test.dart:236` 주변의 command 처리/fixture가 HTTP 202 또는 fake accepted 응답만 검증해서 `EdgeCommandResponseView.status == "unsupported"` 또는 `error`가 있는 응답을 성공 배너로 표시할 수 있습니다. command 응답 status/error를 판정해 실패/unsupported를 명확히 표시하고, widget test에 unsupported/error 응답 회귀를 추가해야 합니다.
- 다음 단계: FAIL 후속으로 `PLAN-cloud-G05.md`와 `CODE_REVIEW-cloud-G05.md`를 다시 작성해 command contract/UI 표시 문제를 수정한다.

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

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-cloud-G05.md`를 `code_review_cloud_G05_0.log`로 아카이브한다.
- [x] active `PLAN-cloud-G05.md`를 `plan_cloud_G05_0.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] WARN/FAIL이고 user-review gate가 트리거되지 않았으므로 다음 active `PLAN-cloud-G05.md`와 `CODE_REVIEW-cloud-G05.md`를 작성하고 `complete.log`를 남기지 않는다.
