# Flutter-first Portal 마이그레이션

## 목표

IOP Portal의 장기 UI source of truth를 Flutter 앱으로 정하고, TypeScript/Next.js Web Portal scaffold를 제품 경로에서 삭제한다.
모바일/데스크톱 앱은 필수 표면으로 두며, 필요한 웹 표면은 Flutter Web과 proto-socket WebSocket/WSS 경로로 출력한다.

## 단계

Control Plane과 Portal 운영

## 상태

완료

## 구현 잠금

- 상태: 해제
- 결정 필요: 없음

## 범위

- Flutter 앱을 IOP Portal의 기준 구현으로 선언
- TypeScript/Next.js 기반 `apps/web` scaffold, npm 의존성, Next.js standalone 배포 흐름 제거
- Flutter Web 산출물을 기존 Web Portal 배포 단위로 서빙하는 Docker 흐름 정리
- Portal-Control Plane 통신을 proto-socket WebSocket/WSS 기준으로 정리
- Flutter mobile/desktop과 Flutter Web이 같은 Portal client 경계를 공유하도록 정리
- Flutter Web 브라우저 타깃을 위한 Dart proto-socket browser WebSocket transport 또는 조건부 transport 구현
- `bin/web.sh`, `docker-compose.yml`, Portal 검증 entrypoint를 Flutter-first 기준으로 갱신

## 필수 기능

- [x] [ui-source] Flutter 앱을 IOP Portal UI source of truth로 선언하고 Next.js를 기준 구현에서 제외한다.
- [x] [next-retire] `apps/web`의 TypeScript/Next.js scaffold와 npm 기반 제품 UI 경로를 삭제한다.
- [x] [proto-ws] Portal-Control Plane wire 경계는 proto-socket WebSocket/WSS를 기본으로 둔다.
- [x] [dart-web-transport] Flutter Web 브라우저 타깃에서 사용할 proto-socket Dart browser WebSocket transport 기준을 마련한다.
- [x] [entrypoints] `bin/web.sh`, compose web service, Portal 검증 명령이 Flutter-first 구조와 충돌하지 않게 정리한다.
- [x] [docker-flutter-web] 기존 Next.js Docker 배포를 Flutter Web build 산출물 서빙 흐름으로 교체한다.
- [x] [contract-gen] IOP protobuf 계약을 Flutter/Dart client가 소비할 생성물과 parser map 기준으로 정리한다.

## 완료 기준

- [x] 로드맵과 Portal 관련 문서에서 Next.js가 장기 제품 UI 기준 구현으로 설명되지 않는다.
- [x] Flutter 앱이 모바일/데스크톱/웹 Portal의 기준 클라이언트로 설명된다.
- [x] proto-socket WS/WSS가 Portal-Control Plane 통신의 기본 transport로 문서화된다.
- [x] Flutter Web 브라우저 타깃에서 `dart:io` 의존 없이 WebSocket binary frame을 쓰는 경로가 정해져 있다.
- [x] `apps/web`에 TypeScript/Next.js 제품 UI 코드와 npm 기반 배포 경로가 남아 있지 않다.
- [x] Docker compose의 `web` 서비스가 Flutter Web 산출물을 빌드/서빙하는 흐름으로 동작한다.

## 범위 제외

- 전체 Portal 화면 구현
- Control Plane의 모든 Edge 운영 API 구현
- 권한, 정책, 감사, 이력 저장의 세부 구현
- App Store, Play Store 배포와 심사 대응
- TypeScript/Next.js 화면을 Flutter 앱 내부 WebView로 감싸는 구조

## 작업 컨텍스트

- 관련 경로: `apps/portal/`, `apps/control-plane/`, `bin/web.sh`, `docker-compose.yml`, `apps/portal/Dockerfile`, `proto/iop/`, `../proto-socket/dart/`, `../proto-socket/go/`
- 표준선(선택): 앱은 필수 제품 표면이므로 Flutter를 Portal UI source of truth로 둔다. Next.js는 제품 UI 기준 구현으로 키우지 않는다.
- 표준선(선택): proto-socket은 TCP뿐 아니라 WebSocket/WSS를 지원한다. Go 구현에는 `NewWsServer`, `DialWs`, `NewWsServerTLS`, `DialWss`가 있고 Dart 구현에는 `WsProtobufClient`, `WsProtobufServer`가 있다.
- 표준선(선택): 현재 Dart proto-socket WebSocket 구현은 `dart:io` 기반이므로 mobile/desktop/server에는 맞지만 Flutter Web 브라우저 타깃에는 조건부 browser WebSocket transport가 필요하다.
- 선행 작업: Specialized Agent proto-socket 연결 기반
- 후속 작업: Control Plane과 Portal, 정책/이력/감사
- 검증: `go test ./apps/control-plane/...`, `flutter test`, `make portal-build-web`
- 확인 필요: 없음
