<!-- task=m-multi-edge-operations/02+01_history_agent_client plan=1 tag=REVIEW_API -->

# Plan - Runtime Panel Edge Switch Test Hardening

## 이 파일을 읽는 구현 에이전트에게

구현 완료는 active `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션까지 실제 구현 내용과 검증 출력으로 채운 뒤에만 성립한다. 검증 명령을 실행하고 실제 stdout/stderr를 review stub에 붙인다. active 파일은 그대로 두고 리뷰 준비 상태를 보고하며, `complete.log` 작성, `.log` rename, archive 이동은 code-review 스킬 전용이다. 구현 중 사용자 결정, 사용자 소유 외부 환경/secret/서비스 준비, 또는 계획 범위 충돌로 막히면 review stub의 `사용자 리뷰 요청`에 정확한 근거를 남기고 멈춘다. 후속 에이전트가 명령 재실행이나 산출물 수집으로 해소할 수 있는 증거 공백은 사용자 리뷰 요청이 아니다.

## 배경

첫 구현 루프는 Runtime panel의 Edge별 domain agent와 operations fixture를 분리하고 `flutter test test/widget_test.dart`를 통과했다. 그러나 리뷰에서 widget test가 빠른 fake response의 최종 상태만 확인해, 새 Edge 로딩 중 이전 Edge operation이 남는 회귀와 alpha-only command summary가 계속 보이는 회귀를 잡지 못하는 것이 확인됐다. 이 후속 작업은 구현 코드를 넓히지 않고 해당 검증 공백을 닫는다.

## 사용자 리뷰 요청 흐름

구현 중 blocker는 active review stub의 `사용자 리뷰 요청` 섹션에 기록한다. 해당 섹션은 `agent-ops/skills/common/_templates/implementation-user-review-request-section.md` 기준이며, 실제 `USER_REVIEW.md` 작성 여부 판단은 code-review가 소유한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-portal-ops/milestones/multi-edge-operations.md`
- Task ids:
  - `history-agent-state`: Edge별 실행/명령 결과와 domain agent capability/status/command summary가 운영 화면에서 구분된다.
- Completion mode: check-on-pass

## 리뷰 결과 요약

- Required: Edge Beta 전환 테스트가 빠른 fake response 최종 상태만 확인해서 fetch-start clear 회귀를 잡지 못한다.
- Required: Edge 전환 후 alpha-only active command/operation text가 사라지는지 검증하지 않는다.

## 범위 결정 근거

- 포함: `apps/client/test/widget_test.dart`.
- 포함 가능: stale-loading assertion을 통과시키기 위해 꼭 필요한 경우에만 `apps/client/lib/control_plane_status_widgets.dart`.
- 제외: backend contract, proto, Control Plane/Edge Go 코드, roadmap 문서 수정.
- 후속은 검증 공백 보강이 목적이므로 UI 구조 변경이나 새 feature를 추가하지 않는다.

## 빌드 등급

- build lane/grade: `local-G07`. 실패 원인은 명시적이고 deterministic한 widget test coverage 공백이며, bounded Flutter test로 검증 가능하다.

## 구현 체크리스트

- [ ] Fake repository에 Edge별 operations 응답을 지연/completer로 제어할 수 있는 테스트 helper를 추가한다.
- [ ] Runtime panel widget test가 Edge Beta operations 응답 완료 전 alpha operation text가 사라지는지 검증한다.
- [ ] Runtime panel widget test가 Edge 전환 전/후 alpha-only와 beta-only active command summary 및 operations text의 presence/absence를 모두 검증한다.
- [ ] `cd apps/client && flutter test test/widget_test.dart -r expanded --plain-name 'Client App opens Operations & Domain Agents panel and verifies agents, operations history, and command triggering'`를 실행한다.
- [ ] `cd apps/client && flutter test test/widget_test.dart`를 실행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_API-1] Delayed Operations Fetch Assertion

문제: `apps/client/test/widget_test.dart`의 Runtime panel test는 Edge Beta 선택 뒤 `pumpAndSettle()`로 최종 상태만 본다. fake `fetchEdgeOperations('edge-b')`가 즉시 완료되므로 `_fetchOperations()`의 `_operations = null`이 제거되어도 테스트가 통과할 수 있다.

해결 방법: `FakeControlPlaneStatusRepository`에 edge-b operations future를 test에서 지연시킬 수 있는 helper를 둔다. 예를 들어 `Completer<EdgeOperationsResponseView>? delayedEdgeBOperations` 또는 edgeId별 delay map을 사용한다. 테스트에서는 Edge Beta 선택 직후 beta operations future를 완료하기 전에 한 프레임을 pump하고, alpha operation인 `oto-agent.sync`와 `Synced 5 models`가 `findsNothing`인지 확인한다. 그 뒤 beta future를 완료하고 beta operation이 표시되는지 확인한다.

수정 파일 및 체크리스트:

- [ ] `apps/client/test/widget_test.dart`: edge-b operations fetch를 지연 제어하는 fixture helper 추가.
- [ ] `apps/client/test/widget_test.dart`: Edge Beta 선택 직후 alpha operation absence assertion 추가.

중간 검증:

```bash
cd apps/client && flutter test test/widget_test.dart -r expanded --plain-name 'Client App opens Operations & Domain Agents panel and verifies agents, operations history, and command triggering'
```

### [REVIEW_API-2] Edge-Specific Command Summary Negative Assertions

문제: 현재 test는 Edge Beta 전환 후 `BUSY`, `READY`, `build-deploy.deploy`가 보이는지만 확인한다. `Active Command: cmd-alpha-active`, `oto-agent.sync`, `Synced 5 models`가 남아 있어도 테스트가 명확히 실패하지 않는다.

해결 방법: Edge Alpha 상태에서 `Active Command: cmd-alpha-active`, `oto-agent.sync`, `Synced 5 models`가 표시되는지 먼저 확인한다. Edge Beta 전환 후에는 `Active Command: cmd-beta-active`, `build-deploy.deploy`, `Deploy queued for edge beta`가 표시되고, alpha-only texts인 `Active Command: cmd-alpha-active`, `oto-agent.sync`, `Synced 5 models`가 모두 `findsNothing`인지 확인한다.

수정 파일 및 체크리스트:

- [ ] `apps/client/test/widget_test.dart`: alpha active command summary presence assertion 추가.
- [ ] `apps/client/test/widget_test.dart`: beta active command summary presence assertion 추가.
- [ ] `apps/client/test/widget_test.dart`: alpha-only active command/operation absence assertion 추가.

중간 검증:

```bash
cd apps/client && flutter test test/widget_test.dart -r expanded --plain-name 'Client App opens Operations & Domain Agents panel and verifies agents, operations history, and command triggering'
```

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/client/test/widget_test.dart` | REVIEW_API-1, REVIEW_API-2 |
| `apps/client/lib/control_plane_status_widgets.dart` | REVIEW_API-1 only if assertion exposes an implementation gap |

## 최종 검증

```bash
cd apps/client && flutter test test/widget_test.dart
```

기대 결과: all tests passed. 검증 결과에는 실제 stdout/stderr를 기록한다.
