<!-- task=review_followup_alignment/03_nexo_notification_boundary plan=0 tag=REVIEW_NEXO -->
# CODE_REVIEW-local-G05: Nexo 알림 경계 정리

## 구현 에이전트 소유

### 변경 개요
IOP Client가 Mattermost 통합의 소유자처럼 동작하지 않도록 경계를 정리했다. IOP는 상위 폴더의 `../nexo`가 제공하는 notification 기능만 사용하며, Mattermost-compatible 인증/등록/서버 통합 책임은 Nexo 쪽 경계로 옮겼다.

### 상세 변경

#### 파일 삭제
- `apps/client/lib/src/integrations/mattermost/mattermost_auth_service.dart` — 자동 로그인, credential asset 로드, FCM 디바이스 토큰 서버 등록 책임 제거
- `apps/client/lib/src/integrations/mattermost/` 전체 디렉터리 — 새 경로로 이동
- `apps/client/test/integrations/mattermost_push_host_integration_test.dart` — 새 테스트로 교체
- `apps/client/assets/mattermost_credentials.json` — credential asset 참조 제거

#### 파일 신규 생성 (기존에서 rename/refactor)
- `apps/client/lib/src/integrations/nexo/nexo_notification_client.dart` — `MattermostPushClient` → `NexoNotificationClient` (동일 추상 인터페이스)
- `apps/client/lib/src/integrations/nexo/nexo_notification_plugin_client.dart` — `MattermostPushPluginClient` → `NexoNotificationPluginClient`
- `apps/client/lib/src/integrations/nexo/nexo_notification_host_integration.dart` — `MattermostPushHostIntegration` → `NexoNotificationHostIntegration`, `_authServiceFactory` 및 `autoLoginAndRegister` 호출 제거
- `apps/client/test/integrations/nexo_notification_host_integration_test.dart` — 기존 host integration 테스트를 새 네이밍으로 복사

#### 파일 수정
- `apps/client/lib/client_bootstrap.dart` — `initializeMattermost` → `initializeNotifications`, `mattermostHost` → `notificationHost`, `defaultMattermostHost` → `defaultNotificationHost`
- `apps/client/lib/client_home_page.dart` — import, prop 명명, `_showMattermostNotification` → `_showNexoNotification`
- `apps/client/lib/main.dart` — import, `IopClientApp.mattermostHost` → `notificationHost`
- `apps/client/pubspec.yaml` — `http` 의존성 **유지** (아래 참조), Nexo messaging 주석 단순화
- `apps/client/README.md` — Nexo 알림 통합 설명 섹션 추가
- `apps/client/test/client_bootstrap_test.dart` — `initializeMattermost` → `initializeNotifications`, fake Nexo client 테스트 추가
- `apps/client/test/widget_test.dart` — `NexoNotificationHostIntegration` import, notification stream → UI(SnackBar) 연결 검증 테스트 3개 추가

### http 의존성 유지 사유
PLAN은 "불필요해진 `http` dependency 제거 여부 확인"을 체크리스트에 포함하고 있다. 현재 `apps/client/lib/control_plane_status_repository.dart` 및 관련 테스트에서 Control Plane HTTP 호출에 `http` 패키지를 사용한다. IOP의 Mattermost auto-login/credential 소유권 제거와 `http` 의존성 제거는 별개의 책임이므로 `http` 의존성은 유지한다. 이 결정은 코드 리팩토링의 범위를 초과하며, 만약 `http` 의존성 전체 제거가 필요하면 별도 plan으로 처리한다.

### 검증 출력

```
cd apps/client && flutter test
```
결과: `38 passed` — 전체 테스트 통과

```
rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml
```
결과: 없음 (exit code 1)

```
rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test
```
결과: 없음 (exit code 1)

### 중간 검증 결과
- `http` 의존성 유지: `lib/control_plane_status_repository.dart` 및 관련 테스트에서 Control Plane HTTP 호출에 `http` 패키지를 사용하므로 제거하지 않음. PLAN의 목적은 Mattermost auto-login/credential 소유권 제거일 뿐 HTTP 전체 사용 무제는 아님.
- Android/Firebase config (`google-services.json`, namespace)는 Mattermost integration ownership과 무관한 Firebase 프로젝트 네임스페이스로 남겨둠.

### 구현 체크리스트 완료 여부
- [x] REVIEW_NEXO-1의 Client notification 경계 refactor와 테스트 갱신 완료
- [x] 중간 검증 명령 실행 — Flutter test PASS, Mattermost 참조 완전히 제거됨
- [x] CODE_REVIEW-local-G05.md 작성 완료 (이 문서)

## 코드리뷰 결과

- 종합 판정: PASS
- 차원별 평가:
  - Correctness: Pass
  - Completeness: Pass
  - Test coverage: Pass
  - API contract: Pass
  - Code quality: Pass
  - Implementation deviation: Pass
  - Verification trust: Pass
- 발견된 문제: 없음
- 다음 단계: PASS 종결. active plan/review를 로그로 아카이브하고 `complete.log` 작성 후 task directory를 `agent-task/archive/2026/07/review_followup_alignment/03_nexo_notification_boundary/`로 이동한다.

### 리뷰 검증
```bash
cd apps/client && dart format --output=none --set-exit-if-changed lib/client_bootstrap.dart lib/client_home_page.dart lib/main.dart lib/src/integrations/nexo/nexo_notification_client.dart lib/src/integrations/nexo/nexo_notification_host_integration.dart lib/src/integrations/nexo/nexo_notification_plugin_client.dart test/client_bootstrap_test.dart test/integrations/nexo_notification_host_integration_test.dart test/widget_test.dart
```
결과: `Formatted 9 files (0 changed)`.

```bash
cd apps/client && flutter analyze --no-fatal-infos
```
결과: exit code 0. 기존 info 2건(`lib/client_home_page.dart:183`, `lib/client_home_page.dart:207`)만 남음.

```bash
cd apps/client && flutter test
```
결과: `+38: All tests passed!`

```bash
rg --sort path -n 'mattermost_credentials|MattermostAuthService|autoLoginAndRegister' apps/client/lib apps/client/test apps/client/pubspec.yaml
rg --sort path -n 'Mattermost|mattermost' apps/client/lib apps/client/test
```
결과: 둘 다 출력 없음(exit code 1).

## 코드리뷰 전용 체크리스트

- [x] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다.
- [x] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다.
- [x] active `CODE_REVIEW-*-G??.md`를 `code_review_local_G05_0.log`로 아카이브한다.
- [x] active `PLAN-*-G??.md`를 `plan_local_G05_0.log`로 아카이브한다.
- [x] `.gitignore`의 Agent-Ops 관리 block이 `agent-task/**/*.md`와 `agent-task/**/*.log`를 unignore하고 `agent-roadmap/current.md`를 ignore하는지 확인한다.
- [x] PASS이므로 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다.
- [x] PASS이므로 active task 디렉터리 `agent-task/review_followup_alignment/03_nexo_notification_boundary/`를 `agent-task/archive/2026/07/review_followup_alignment/03_nexo_notification_boundary/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다.
- [ ] PASS이고 task group이 `m-<milestone-slug>`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. 해당 없음: `review_followup_alignment`.
- [x] PASS split 작업이며 이동 후 active parent `agent-task/review_followup_alignment/`에 sibling subtask가 남아 있어 유지함을 확인한다.
- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-{build_lane}-GNN.md`와 `CODE_REVIEW-{review_lane}-GNN.md`를 작성하고 `complete.log`를 작성하지 않는다.
- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다.
- [ ] USER_REVIEW가 연결된 Milestone 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다.
