# Milestone: Mattermost Nexo Messaging Alignment

## 위치

- Roadmap: `agent-roadmap/ROADMAP.md`
- Phase: `agent-roadmap/phase/external-integration/PHASE.md`

## 목표

현재 workflow/core 작업을 계속 확장하기 전에 Mattermost 메시지/알림 경계를 `../nexo/packages/messaging_flutter` 기준으로 먼저 고정한다. NomadCode core는 Mattermost REST 메시지 발송과 task notification 발행을 담당하고, nexo messaging package는 client-side FCM 수신, signature 검증, ACK, notification display, opened-routing, inline reply, dismiss를 담당한다는 선을 구현과 검증 문서에 맞춘다.

## 상태

[완료]

## 구현 잠금

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

## 범위

- NomadCode host의 `MattermostPushClient` 경계를 현재 `nexo_messaging` public API와 맞춘다.
- ignored Mattermost credential asset에서 optional server identifier를 전달할 수 있게 한다.
- server-generated signed push smoke 절차와 External Integration 검증 기준 nexo 구조에 맞춰 유지한다.
- Android native push 처리 로직이 `apps/client/android`로 되돌아오지 않도록 책임 경계를 문서화한다.

## 기능

### Epic: [nexo-boundary] Mattermost host and nexo package alignment

현재 작업보다 먼저 Mattermost messaging/notification 경계를 nexo-owned package 기준으로 정렬한다.

- [x] [host-identifier] NomadCode host가 optional Mattermost server identifier를 `MattermostPushClient`와 `nexo_messaging`의 `setAuthToken(..., identifier:)` 경계로 전달한다. 검증: `cd apps/client && flutter test`.
- [x] [docs-boundary] `agent-test/local/mattermost-server-generated-push-smoke.md`, `apps/client/push-notification-todo.md`, contracts note, External Integration context가 nexo package의 Android-first/stub-platform 상태와 server-generated signed push smoke 기준을 일관되게 설명한다. 검증: 문서에서 raw token/password/signing key/FCM token 값을 기록하지 않는다.
- [x] [signed-smoke-refresh] 실제 Android runner에서 server-generated signed push smoke를 재실행해 FCM receipt, valid signature, ACK, notification display, opened event, inline reply, dismiss evidence를 redaction 상태로 남긴다. 검증: `agent-test/local/mattermost-server-generated-push-smoke.md`의 Evidence Checklist가 PASS/PARTIAL/BLOCKED로 기록된다.

## 완료 리뷰

- 상태: 승인됨
- 요청일: 2026-05-30
- 완료 근거: Android remote runner에서 Mattermost REST server-generated DM -> FCM -> `nexo_messaging` 수신, signature 처리, ACK, notification display, opened/channel navigation, inline reply, dismiss/clear, device token prefix evidence를 redaction 상태로 확인했다. `agent-test/local/mattermost-server-generated-push-smoke.md` Evidence Checklist 11개 항목은 PASS 또는 N/A로 기록됐고, signed smoke task는 `agent-task/archive/2026/05/m-mattermost-nexo-messaging-alignment/02+01_signed_smoke/complete.log`로 PASS 완료됐다.
- 리뷰 필요:
  - [x] 사용자가 완료 결과를 확인했다
  - [x] archive 이동을 승인했다
- 리뷰 코멘트: 사용자가 메시지/푸시 정상 수신 확인 후 "마일스톤 업데이트하고 다음단계로 넘겨 현지점도 업데이트"를 요청했다.

## 범위 제외

- Plane/Jira adapter 확장
- Agent Integrator 또는 A2A 도입 결정
- core Mattermost REST 메시지 발송 adapter의 전체 구현
- iOS/macOS native push runtime 구현
- Mattermost 제품 UX 또는 채널 화면 구현

## 작업 컨텍스트

- 관련 경로: `apps/client/lib/src/integrations/mattermost/`, `apps/client/push-notification-todo.md`, `agent-test/local/mattermost-server-generated-push-smoke.md`, `packages/contracts/notes/flutter-core-api-candidates.md`, `../nexo/packages/messaging_flutter`
- 표준선(선택): `../nexo/packages/messaging_flutter`는 Android-first client-side messaging/notification SDK이고, NomadCode host는 Firebase 설정, credential handoff, signing key, optional server identifier, navigation callback만 전달한다.
- 선행 작업: Mattermost Messaging Android Smoke
- 후속 작업: Workflow Core 재개, External Integration의 `[mattermost-adapter]` 구현
- 확인 필요: signed push smoke 재실행 시 private input은 `agent-test/local/rules.md`와 `agent-test/local/mattermost-server-generated-push-smoke.md`가 라우팅하는 ignored secret 파일에서만 읽는다.
