<!-- task=m-embeddable-iop-console-workbench/02+01_client_integration plan=1 tag=REVIEW_API -->

# Plan - API Integration Follow-up

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

`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 채우는 것이 구현의 마지막 단계다. 구현 후 검증을 실행하고 실제 출력, 계획 대비 변경 사항, 주요 설계 결정을 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 사용자 결정, 사용자 소유 외부 환경, scope 충돌 없이는 안전하게 진행할 수 없을 때만 review stub의 `사용자 리뷰 요청`을 근거와 함께 채우고 멈춘다. 명령 재실행이나 산출물 수집으로 해소 가능한 evidence 공백은 사용자 리뷰 요청이 아니다.

## 배경

이 후속 plan은 `code_review_cloud_G06_0.log`의 FAIL Required 2건만 다룬다. 앱이 package overview/config/capability API를 사용하는 구조는 유지하되, `Disconnected` 상태가 연결로 잘못 표시되는 버그를 고치고 analyzer 검증 출력의 신뢰를 회복한다.

## Roadmap Targets

- Milestone: `agent-roadmap/phase/control-plane-portal-ops/milestones/embeddable-iop-console-workbench.md`
- Task ids:
  - `overview-boundary`: Control Plane wire status overview boundary
  - `execution-logs`: Execution/Logs display route
  - `iop-capabilities`: IOP-scoped agent capabilities
  - `capability-api`: public capability pack API
  - `config-injection`: host config/theme/navigation injection
- Completion mode: check-on-pass

## 구현 체크리스트

- [ ] `IopConsoleOverview`의 connected 판정이 `Disconnected`를 연결 상태로 오인하지 않도록 수정한다.
- [ ] package 또는 client widget test에 `Disconnected` 상태가 `OFFLINE`으로 표시되는 회귀 테스트를 추가한다.
- [ ] `cd packages/flutter/iop_console && flutter test`와 `cd apps/client && flutter test`를 실행한다.
- [ ] `cd apps/client && flutter analyze --no-fatal-infos`를 재실행하고 실제 stdout/stderr를 그대로 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## [REVIEW_API-1] Disconnected Status Regression

### 문제

`packages/flutter/iop_console/lib/src/iop_console_overview.dart:44`의 `_isConnected`가 `widget.statusText.toLowerCase().contains('connected')`를 사용해 `Disconnected`도 연결 상태로 판정한다. `apps/client/lib/main.dart`의 disconnect listener는 `_wireStatus = 'Disconnected'`를 전달하므로, 연결 종료 후 overview가 `ACTIVE WIRE`로 잘못 보일 수 있다.

### 해결 방법

상태 문자열을 normalize한 뒤 정확히 `connected`인 경우만 연결로 본다. 필요하면 helper getter를 유지하되 `trim().toLowerCase() == 'connected'`처럼 명시적으로 비교한다. `Connecting`, `Error`, `Disconnected`는 모두 비연결 상태로 보여야 한다.

### 수정 파일 및 체크리스트

- [ ] `packages/flutter/iop_console/lib/src/iop_console_overview.dart`의 `_isConnected` 비교를 정확한 상태 비교로 변경.
- [ ] `packages/flutter/iop_console/test/iop_console_shell_test.dart` 또는 `apps/client/test/widget_test.dart`에 `Disconnected`가 `OFFLINE`으로 렌더링되는 assertion 추가.

### 테스트 작성

`IopConsoleOverview` 단위에 가까운 package widget test를 우선한다. 테스트는 `statusText: 'Disconnected'`를 주고 `DISCONNECTED`와 `OFFLINE`이 표시되는지 확인한다.

### 중간 검증

```bash
cd packages/flutter/iop_console && flutter test
```

기대: package test가 통과하고 disconnected 회귀 테스트가 실패 없이 실행된다.

## [REVIEW_API-2] Verification Evidence Recovery

### 문제

이전 review stub은 `cd apps/client && flutter analyze --no-fatal-infos` 결과를 `No issues found!`로 기록했지만, 리뷰 재실행 결과는 기존 Mattermost auth service의 `avoid_print` info 13건이 출력됐다. 기능 실패는 아니더라도 기록된 stdout/stderr가 실제 명령과 다르다.

### 해결 방법

필수 검증 명령을 재실행하고 `CODE_REVIEW-cloud-G07.md`의 `검증 결과`에 실제 stdout/stderr를 그대로 붙인다. Analyzer info가 이번 변경에서 새로 생긴 것이 아니라면 `계획 대비 변경 사항` 또는 검증 결과 설명에 기존 info임을 명시하되, 출력 자체를 축약하거나 “No issues found”로 바꾸지 않는다.

### 수정 파일 및 체크리스트

- [ ] `cd apps/client && flutter analyze --no-fatal-infos`를 재실행.
- [ ] 실제 analyzer stdout/stderr와 exit 결과를 `CODE_REVIEW-cloud-G07.md`에 기록.
- [ ] 이번 후속 변경으로 새 analyzer warning/error가 생기지 않았는지 확인.

### 테스트 작성

새 테스트는 필요 없다. 이 항목은 검증 증거 회복이 목적이다.

### 중간 검증

```bash
cd apps/client && flutter analyze --no-fatal-infos
```

기대: fatal analyzer issue 없이 종료한다. 기존 non-fatal info가 출력되면 실제 출력과 기존 범위를 기록한다.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `packages/flutter/iop_console/lib/src/iop_console_overview.dart` | REVIEW_API-1 |
| `packages/flutter/iop_console/test/iop_console_shell_test.dart` | REVIEW_API-1 |
| `agent-task/m-embeddable-iop-console-workbench/02+01_client_integration/CODE_REVIEW-cloud-G07.md` | REVIEW_API-2 |

## 최종 검증

```bash
cd packages/flutter/iop_console && flutter test
cd apps/client && flutter test
cd apps/client && flutter analyze --no-fatal-infos
```

기대: package/client tests pass, analyzer has no fatal issues, and review stub records the actual stdout/stderr.
