<!-- task=m-multi-edge-operations/04+03_client_fleet_ui plan=2 tag=REVIEW_REVIEW_API -->
# Plan - REVIEW_REVIEW_API

## 작업 지시

Client Fleet UI 후속 리뷰에서 발견된 command contract와 검증 증거 문제만 보완한다. 범위는 `Agent Status` command gating, 관련 widget test 신뢰도, `packages/flutter/iop_console` 변경 검증 증거 복구로 제한한다.

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

## 실패 원인

- `apps/client/lib/control_plane_status_widgets.dart:1158`의 `Agent Status` 버튼이 `target_selector` 없이 `agent.status`를 전송한다. Edge service는 `apps/edge/internal/service/service.go:697`에서 `agent.status`에 non-empty `target_selector`를 요구하므로 현재 버튼은 contract-invalid command를 만든다.
- `packages/flutter/iop_console/lib/src/iop_console_overview.dart`에 실제 변경이 남아 있는데 이전 `CODE_REVIEW-cloud-G05.md`는 `cd packages/flutter/iop_console && flutter test`를 `Not applicable`로 기록했다. 변경을 유지하면 package test 증거가 필요하고, 변경을 제거하면 제거 근거가 필요하다.

## 범위 결정 근거

- `Trigger Sync` 제거, unsupported/error banner 처리, domain agent summary 표시는 이미 구현되어 있으므로 이번 후속에서 다시 확장하지 않는다.
- Control Plane/Edge command API 자체는 이번 subtask의 변경 대상이 아니다. Client는 현재 Edge contract에 맞춰 operation과 필수 입력을 게이트한다.
- local 테스트 규칙상 Flutter client/package 검증은 원격 runner의 동기화된 checkout 기준으로 기록한다. 원격 checkout이 동기화되지 않았으면 검증 성공으로 기록하지 말고, 정확한 차단 사유를 남긴다.

## 구현 항목

### REVIEW_REVIEW_API-1 Agent Status command gating

- 문제: UI가 `agent.status`를 지원 operation으로 노출하지만 필수 `target_selector` 입력을 받지 않아 실제 Edge contract와 맞지 않는다.
- 해결:
  - Before: `Agent Status` 버튼이 `_sendCommand('agent.status')`를 직접 호출한다.
  - After: `agent.status`도 non-empty selector를 받은 뒤 `targetSelector`와 함께 보내거나, selector/capability metadata가 없으면 버튼을 제거 또는 비활성화한다.
- 테스트 결정: widget test fake repository가 마지막 command의 `operation`, `targetSelector`, `parameters`를 기록하게 하고, `agent.status`와 `agent.command`가 필수 입력 없이 전송되지 않음을 검증한다.
- 중간 검증: `cd apps/client && flutter test`

### REVIEW_REVIEW_API-2 iop_console 검증 증거 복구

- 문제: `packages/flutter/iop_console` 변경이 남아 있는데 package test를 생략한 검증 결과가 기록되어 있다.
- 해결:
  - Before: `Not applicable. We did not modify any files in packages/flutter/iop_console.`
  - After: 변경을 유지하면 `cd packages/flutter/iop_console && flutter test`의 실제 stdout/stderr를 기록한다. 변경이 불필요하면 package diff를 제거하고 생략 근거를 기록한다.
- 테스트 결정: 변경 유지 시 package-unit 검증을 필수로 실행한다. 변경 제거 시 `git diff --name-only -- packages/flutter/iop_console`로 package diff가 없음을 기록한다.
- 중간 검증: `cd packages/flutter/iop_console && flutter test`

## 구현 체크리스트

1. [ ] `Agent Status` command action은 non-empty target selector를 받은 뒤 `agent.status`를 전송하거나, selector/capability metadata가 없으면 제거/비활성화한다.
2. [ ] `sendEdgeCommand` fake/test가 `operation`, `targetSelector`, `parameters`를 기록하고, `agent.status`/`agent.command`가 contract-required input 없이 전송되지 않음을 검증한다.
3. [ ] prior follow-up의 `Trigger Sync` absence와 unsupported/error banner 회귀 검증을 유지한다.
4. [ ] `packages/flutter/iop_console` 변경을 유지하면 `cd packages/flutter/iop_console && flutter test`를 원격 runner의 동기화된 checkout에서 실행하고 실제 출력으로 기록한다. 변경을 제거하면 package diff 제거 근거와 확인 명령을 기록한다.
5. [ ] `cd apps/client && flutter test`와 `cd apps/client && flutter analyze --no-fatal-infos`를 원격 runner의 동기화된 checkout에서 실행하거나, 동기화 불가 시 정확한 명령과 차단 사유를 기록한다.
6. [ ] `CODE_REVIEW-cloud-G05.md`의 구현 항목별 완료 여부, 구현 체크리스트, 계획 대비 변경 사항, 주요 설계 결정, 검증 결과를 실제 내용으로 채운다.

## 검증

- `cd apps/client && flutter test`
- `cd packages/flutter/iop_console && flutter test`
- `cd apps/client && flutter analyze --no-fatal-infos`
- 원격 runner가 로컬 변경분과 동기화되어 있지 않으면 위 명령을 성공으로 기록하지 말고, 동기화 불가 사유와 현재 checkout 차이를 `검증 결과`에 기록한다.

## 완료 조건

- Client UI가 `agent.status` 또는 `agent.command`를 필수 입력 없이 전송할 수 없다.
- summary-only domain agent 카드에는 임의 operation 버튼이 다시 생기지 않는다.
- command response의 unsupported/error는 성공 배너로 표시되지 않는다.
- `packages/flutter/iop_console` 변경 유지 여부와 그에 맞는 검증 증거가 일치한다.
