# Handoff: client-validation / FCM ACK Smoke Date: 2026-05-29 ## Active Route - Milestone: `agent-roadmap/phase/product-foundation/milestones/client-validation.md` - Task: `agent-task/m-client-validation/04+03_fcm_ack_smoke/` - Plan: `agent-task/m-client-validation/04+03_fcm_ack_smoke/PLAN-cloud-G07.md` - Review stub: `agent-task/m-client-validation/04+03_fcm_ack_smoke/CODE_REVIEW-cloud-G07.md` - State: incomplete, blocked on valid signed push payload or scope decision. Do not record raw FCM tokens, auth tokens, signing keys, private endpoint values, screenshots with secrets, or unredacted logs in tracked files. ## Completed In This Loop - `agent-ops/skills/common/plan/SKILL.md` and `agent-ops/skills/common/code-review/SKILL.md` now resolve split predecessor completion from both active task paths and `agent-task/archive/**`. - Archived predecessor is valid: `agent-task/archive/2026/05/m-client-validation/03_smoke_preflight/complete.log`. - `apps/flutter-test` now initializes Firebase and `NexoMessagingPlugin` at app startup, after callbacks are registered. - Widget/integration tests can construct `MyApp(initializePlugin: false)` so deterministic tests are not tied to Firebase/FCM runtime setup. - `apps/flutter-test` has direct `firebase_core` dependency. - Local `cd apps/flutter-test && flutter analyze` passed. - Local `cd apps/flutter-test && flutter test` passed. - Remote `cd apps/flutter-test && flutter pub get && flutter analyze && flutter test` passed. - Remote app run with `ORG_GRADLE_PROJECT_nexoSmokeApplicationId=com.tokilabs.mattermost` initialized Firebase/plugin and saved an FCM token. - Remote push-proxy direct sends returned `{"status":"OK"}`. - Device logcat confirmed FCM receipt and ACK request: - `NexoFCM : >>> onMessageReceived ENTER` - `NexoFCM : onMessageReceived type=message ... ackId=...` - `ReceiptDelivery: Send ACK=...` - `NomadNetwork: POST https://mattermost.toki-labs.com/api/v4/notifications/ack` - Placeholder and unsigned payloads were rejected with `Notification skipped: signature verification failed`, which is expected. ## Current Blocker Notification display and downstream behavior are still blocked because the smoke does not yet have a valid server-generated signed push payload. Confirmed PASS: - Archived preflight dependency. - Remote readiness. - Firebase/plugin initialization. - Device token save, without recording raw token. - FCM receipt. - ACK POST request evidence. - Invalid/unsigned signature rejection. Still BLOCKED: - Valid signature pass. - System notification display. - Notification tap/opened event. - Channel/thread routing. - Inline reply. - Dismiss action. Remote integration note: `flutter test integration_test -d emulator-5554` built and installed the app, then produced no runner output for more than 40 seconds. The local ssh wrapper was killed. Treat this as inconclusive, not PASS. ## Continue From Here 1. Keep active files in place. Do not write `complete.log` or move the task to archive until code-review flow decides it. 2. Decide whether to provide a valid signed push trigger or split the remaining notification UI checks into a follow-up task. 3. If continuing the smoke, use the remote environment from `agent-ops/rules/private/testing-env.md`. 4. Continue with device `emulator-5554` and: `ORG_GRADLE_PROJECT_nexoSmokeApplicationId=com.tokilabs.mattermost`. 5. Do not print the raw token. Keep it only in the remote shell env used for the push request. 6. Re-run push with a valid signature, then collect redacted evidence for display/opened/routing/reply/dismiss. 7. Update `CODE_REVIEW-cloud-G07.md` first. User-review or final archive decisions remain code-review responsibilities. Useful remote evidence paths already referenced in the review stub: - `/tmp/nexo-flutter-test-run-after-init.log` - `/tmp/nexo-token-logcat-after-init.txt` - `/tmp/nexo-smoke-screen-after-init.png` - `/tmp/nexo-send-response.json` - `/tmp/nexo-after-send-logcat.txt` - `/tmp/nexo-send-response-nosig.json` - `/tmp/nexo-after-send-logcat-nosig.txt` ## Source Files Touched - `agent-ops/skills/common/plan/SKILL.md` - `agent-ops/skills/common/code-review/SKILL.md` - `agent-roadmap/phase/product-foundation/milestones/client-validation.md` - `agent-task/m-client-validation/04+03_fcm_ack_smoke/PLAN-cloud-G07.md` - `agent-task/m-client-validation/04+03_fcm_ack_smoke/CODE_REVIEW-cloud-G07.md` - `apps/flutter-test/lib/main.dart` - `apps/flutter-test/pubspec.yaml` - `apps/flutter-test/pubspec.lock` - `apps/flutter-test/test/widget_test.dart` - `apps/flutter-test/integration_test/plugin_integration_test.dart`