# User Review Resolved - m-mattermost-messaging-android-smoke/02+01_runtime_notification_smoke

## 요청 일시

2026-05-26

## 상태

RESOLVED

## 사유

- 유형: environment-blocked
- 현재 리뷰 회차: 1
- 최종 판정: RESOLVED
- 요약: Mattermost notification arrival smoke를 막던 외부 env와 credential 조건을 준비했고, 원격 Android runner에서 build, runtime smoke, FCM 수신, Android system notification, Mattermost 웹 채널 메시지 도착까지 확인했다.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `agent-task/archive/2026/05/m-mattermost-messaging-android-smoke/02+01_runtime_notification_smoke/plan_cloud_G08_0.log` | `agent-task/archive/2026/05/m-mattermost-messaging-android-smoke/02+01_runtime_notification_smoke/code_review_cloud_G08_0.log` | FAIL | Mattermost trigger env/credentials 부재로 Android notification arrival를 검증하지 못했고, FCM token redaction 및 검증 재현성 문제가 함께 발견됨 |
| manual follow-up | user-confirmed smoke | RESOLVED | secret/env 준비, 원격 Android runner 환경 설정, `NexoMessagingPlugin` 등록 보정, Android notification arrival, Mattermost 웹 채널 도착 확인으로 차단 해소 |

## 차단 근거

- 문제: `MATTERMOST_BASE_URL`, `MATTERMOST_TOKEN`, `MATTERMOST_TEST_CHANNEL_ID`, `assets/mattermost_credentials.json`이 없어 Mattermost post trigger와 Android system notification/callback 관찰을 수행할 수 없다.
- 현재 archive plan: `agent-task/archive/2026/05/m-mattermost-messaging-android-smoke/02+01_runtime_notification_smoke/plan_cloud_G08_0.log`
- 현재 archive review: `agent-task/archive/2026/05/m-mattermost-messaging-android-smoke/02+01_runtime_notification_smoke/code_review_cloud_G08_0.log`
- 검증 명령: `ssh -o BatchMode=yes -o ConnectTimeout=10 toki@toki-labs.com 'bash -lc '\''set -euo pipefail; cd ~/jenkins/workspace/nomadcode/apps/client; for n in MATTERMOST_BASE_URL MATTERMOST_TOKEN MATTERMOST_TEST_CHANNEL_ID; do if [ -n "${!n:-}" ]; then printf "%s=set\n" "$n"; else printf "%s=missing\n" "$n"; fi; done; if [ -f assets/mattermost_credentials.json ]; then printf "assets/mattermost_credentials.json=present\n"; else printf "assets/mattermost_credentials.json=missing\n"; fi'\'''`
- 실제 출력:

```text
MATTERMOST_BASE_URL=missing
MATTERMOST_TOKEN=missing
MATTERMOST_TEST_CHANNEL_ID=missing
assets/mattermost_credentials.json=missing
```

- 환경 판단 근거: 필수 Mattermost API token과 test channel, host credential asset은 repo에 커밋하면 안 되는 외부 secret/config이며, 현재 repository 내부 수정만으로는 실제 push trigger와 알림 도착 관찰을 만들 수 없다.

## 사용자 결정 처리

- [ ] 자동 follow-up plan/review를 계속 진행한다. (선택하지 않음)
- [ ] 계획을 재작성한다. (선택하지 않음)
- [x] 테스트 환경, secret, 외부 서비스, SDK, 장비 조건을 준비한 뒤 재시도한다.
- [ ] 작업 범위를 줄이거나 보류/폐기한다. (선택하지 않음)

## 재개 조건

- 충족됨: 원격 runner에서 Mattermost trigger env와 앱 auth handoff credential을 값 노출 없이 준비했다.
- 충족됨: FCM/device token redaction, 재현 가능한 Flutter command 경로, 현재 worktree의 mobile 변경 범위를 정리하고 smoke evidence를 남겼다.

## 다음 실행 힌트

- 닫힘: Milestone은 `[완료]`로 승인되어 roadmap archive로 이동했다. 후속 작업은 `External Integration` Milestone에서 adapter 구현 범위를 결정한 뒤 이어간다.

## 후속 업데이트

- 2026-05-26: Mattermost server/push-proxy 설정을 확인했다. public URL은 `https://mattermost.toki-labs.com`, server-side push target은 `http://mattermost-push-proxy:8066`, push notification은 enabled 상태다.
- 2026-05-26: `nomadcode` 채널 ID와 post trigger용 PAT 동작을 확인했고, 토큰 값은 기록하지 않고 로컬 및 원격 runner의 ignored `.env.mattermost.local`에 저장했다.
- 2026-05-26: post trigger env 차단은 해소됐지만 앱 수신자 credential 차단은 남아 있다. 현재 앱은 `apps/client/assets/mattermost_credentials.json`의 `serverUrl/loginId/password`로 로그인한 뒤 FCM device token을 등록한다.
- 2026-05-27: 앱 수신자 인증은 ignored `apps/client/assets/mattermost_credentials.json` 방식으로 준비하기로 결정했다. 로컬과 원격 runner에 credential asset과 `.env.mattermost.local`을 `0600` 권한으로 준비했고, 값 노출 없이 `MATTERMOST_*` env set 여부, 발신자 token의 user/channel API 접근, 수신자 login/token header를 확인했다.
- 2026-05-27: notification smoke 발신자는 앱 수신자와 분리된 테스트용 PAT를 사용한다. self-notification 회피를 위해 발신자와 수신자는 분리된 계정으로 유지한다.
- 2026-05-27: `apps/client/macos/Flutter/GeneratedPluginRegistrant.swift`와 `apps/client/push-notification-todo.md` 변경은 `nexo_messaging` / `NexoFirebaseMessagingService` rename에 맞춘 정정으로 확인했으며, 이번 smoke 범위에 포함한다.
- 2026-05-27: 원격 Android runner의 `~/.nomadcode-env.sh`에 Flutter/Android SDK 환경 변수를 설정하고 bash/zsh login shell에서 로드되도록 했다. 이후 `flutter pub get`, `flutter build apk --debug`, Android emulator runtime smoke, Mattermost post trigger, FCM 수신, Android notification record 생성을 secret 없이 확인했다.
- 2026-05-27: 원격 `../nexo/packages/messaging_flutter` 테스트 copy가 stale `MattermostPushPlugin` metadata를 사용해 method channel이 빠진 문제를 확인했고, 최신 package copy로 동기화해 `NexoMessagingPlugin` 등록 후 smoke를 통과시켰다.
- 2026-05-27: 사용자가 Mattermost 내 tester 메시지 도착과 `nomadcode` 웹 채널 메시지 도착을 확인했다. `Mattermost Messaging Android Smoke` Milestone은 `[완료]`로 승인되어 roadmap archive로 이동했다.

## 사용자가 다음에 결정할 일

- [x] 앱 수신자 인증을 ignored `apps/client/assets/mattermost_credentials.json`으로 준비할지, 앱 credential loader에 token 기반 smoke credential 지원을 좁게 추가할지 결정한다.
- [x] notification smoke 발신자를 기존 `build` bot token으로 둘지, 사용자 PAT로 둘지 결정한다. self-notification 회피를 위해 발신자와 앱 수신자는 분리하는 것을 기본 후보로 둔다.
- [x] 현재 worktree의 `apps/client/macos/Flutter/GeneratedPluginRegistrant.swift`, `apps/client/push-notification-todo.md` 변경을 이번 smoke 범위에 포함할지 별도 정리할지 결정한다.
