<!-- task=flutter_first_portal_migration/01_flutter_portal_scaffold plan=1 tag=REVIEW_FLUTTER_PORTAL -->

# Plan - REVIEW_FLUTTER_PORTAL

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

이 plan은 `code_review_cloud_G07_0.log`의 FAIL Required 이슈만 해결한다. 구현 마지막 단계에서 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 반드시 실제 변경 내용과 검증 출력으로 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일은 그대로 두고 리뷰 준비 상태만 보고한다. `complete.log` 작성, `.md` 파일 로그화, archive 이동은 code-review-skill 전용이다.

## 배경

1차 Flutter Portal scaffold는 `make portal-test`, `make portal-build-web` 기준으로 동작하지만, 리뷰에서 두 가지 차단 이슈가 발견되었다. 위젯 테스트가 endpoint 값 자체를 검증하지 않아 계획의 테스트 의도를 충분히 만족하지 못했고, `flutter analyze`가 deprecated `Color.withOpacity` 사용으로 실패한다.

## 분석 결과

### 읽은 파일

- `agent-task/flutter_first_portal_migration/01_flutter_portal_scaffold/code_review_cloud_G07_0.log`
- `agent-task/flutter_first_portal_migration/01_flutter_portal_scaffold/plan_cloud_G07_0.log`
- `apps/portal/lib/main.dart`
- `apps/portal/lib/portal_config.dart`
- `apps/portal/test/widget_test.dart`
- `apps/portal/test/portal_config_test.dart`
- `apps/portal/analysis_options.yaml`
- `Makefile`

### 테스트 커버리지 공백

- `apps/portal/test/widget_test.dart`는 `Control Plane`, `Wire` 라벨만 확인한다. 실제 endpoint URL 텍스트가 화면에서 빠져도 통과할 수 있으므로 `PortalConfig` 기본값이 렌더링되는지 직접 단언해야 한다.
- `flutter analyze`는 현재 계획의 최종 검증에는 없었지만, `apps/portal/analysis_options.yaml`이 Flutter lint를 활성화한 상태에서 non-zero 종료한다. 후속 검증에는 analyzer를 포함해 품질 신뢰도를 회복한다.

### 심볼 참조

- `PortalConfig.controlPlaneHttpUrl`
- `PortalConfig.controlPlaneWireUrl`
- `Color.withOpacity`

### 빌드 등급

Build lane `cloud-G07`, review lane `cloud-G07`을 유지한다. 실패 원인은 deterministic test/assertion 및 Flutter analyzer cleanup이라 기존 cloud-G07 경로로 충분하다.

## 구현 체크리스트

- [ ] [REVIEW_FLUTTER_PORTAL-1] 위젯 테스트가 화면에 표시되는 endpoint URL 자체를 검증하도록 보강한다.
- [ ] [REVIEW_FLUTTER_PORTAL-2] Flutter analyzer deprecation을 제거해 `flutter analyze`가 통과하게 한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_FLUTTER_PORTAL-1] endpoint URL 렌더링 테스트 보강

문제: `apps/portal/test/widget_test.dart:13`은 `Control Plane`, `Wire` 라벨만 확인한다. 실제 URL 값이 화면에서 사라져도 테스트가 통과하므로, 계획의 “endpoint 표시” 검증으로 충분하지 않다.

해결 방법: `apps/portal/test/widget_test.dart`에서 `package:iop_portal/portal_config.dart`를 import하고, `PortalConfig.controlPlaneHttpUrl`, `PortalConfig.controlPlaneWireUrl`이 렌더링되는지 단언한다. `SelectableText` 렌더링 구조 때문에 필요하면 `find.text(..., findRichText: true)` 또는 동등하게 실제 URL 텍스트를 잡는 matcher를 사용한다.

Before:

```dart
expect(find.textContaining('Control Plane'), findsWidgets);
expect(find.textContaining('Wire'), findsWidgets);
```

After:

```dart
expect(find.text(PortalConfig.controlPlaneHttpUrl, findRichText: true), findsOneWidget);
expect(find.text(PortalConfig.controlPlaneWireUrl, findRichText: true), findsOneWidget);
```

수정 파일 및 체크리스트:

- [ ] `apps/portal/test/widget_test.dart`: 실제 HTTP/Wire URL 렌더링 assertion을 추가한다.
- [ ] 기존 title, label, health 상태 검증은 유지한다.

테스트 작성: 기존 widget test를 보강한다.

중간 검증:

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

기대 결과: widget test가 통과하고 실제 endpoint URL assertion이 포함되어 있다.

### [REVIEW_FLUTTER_PORTAL-2] analyzer deprecation 제거

문제: `apps/portal/lib/main.dart`의 `Color.withOpacity` 사용으로 `cd apps/portal && flutter analyze`가 deprecated member 5건을 보고하며 실패한다.

해결 방법: 아래 호출들을 Flutter 최신 API인 `withValues(alpha: ...)`로 교체한다. 동적 pulse alpha 계산은 유지한다.

Before:

```dart
color: const Color(0xFF10B981).withOpacity(0.15 * _pulseAnimation.value),
```

After:

```dart
color: const Color(0xFF10B981).withValues(alpha: 0.15 * _pulseAnimation.value),
```

수정 파일 및 체크리스트:

- [ ] `apps/portal/lib/main.dart`: line 114, 117, 206, 209, 225 부근의 `withOpacity` 호출을 `withValues(alpha: ...)`로 바꾼다.
- [ ] alpha 값과 pulse 동작 의미가 바뀌지 않게 유지한다.

테스트 작성: 새 테스트는 추가하지 않는다. analyzer와 기존 widget/unit/build 검증으로 충분하다.

중간 검증:

```bash
cd apps/portal && flutter analyze
```

기대 결과: `No issues found!`

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/portal/test/widget_test.dart` | REVIEW_FLUTTER_PORTAL-1 |
| `apps/portal/lib/main.dart` | REVIEW_FLUTTER_PORTAL-2 |

## 최종 검증

```bash
cd apps/portal && flutter test test/widget_test.dart
cd apps/portal && flutter analyze
make portal-test
make portal-build-web
git diff --check
```

기대 결과: endpoint URL widget assertion이 포함된 테스트가 통과하고, analyzer가 clean하게 통과하며, Portal test/build와 whitespace 검증도 통과한다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 채운다.
