nexo/agent-task/m-client-validation/03+01,02_android_native_validation/PLAN-cloud-G07.md
toki 7d291aa90c feat: client-validation task and update READMEs
- Add m-client-validation task directory
- Update apps/flutter-test/README.md
- Update packages/messaging_flutter/README.md
- Update packages/messaging_flutter/docs/android-test-environment.md
2026-05-28 20:08:15 +09:00

11 KiB

Plan - ANDROID

이 파일을 읽는 구현 에이전트에게

CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션 작성은 필수다. 구현 후 검증을 실행하고 실제 변경 내용, 명령 출력, 계획 대비 변경 사항을 채운 뒤 active 파일을 그대로 둔 채 리뷰 준비 상태로 보고한다. 최종 판정, 로그 rename, complete.log, archive 이동은 code-review 스킬 전용이다. 사용자만 결정할 수 있는 사항, 외부 환경 준비, 범위 충돌로 막히면 review stub의 사용자 리뷰 요청 섹션에 정확한 결정 필요 사항과 근거를 채우고 멈춘다.

배경

Milestone은 Android native unit test와 remote Android verification path를 기준선으로 요구한다. 현재 local 환경은 Android SDK가 없어 ./gradlew testDebugUnitTestSDK location not found로 실패하고, integration test도 Android device/emulator가 없어 실패한다. 이 subtask는 native test 내용을 템플릿성 확인에서 실제 plugin contract로 키우고, local/remote verification을 정직하게 기록한다.

사용자 리뷰 요청 흐름

구현 중 blocker는 active CODE_REVIEW-*-G??.md사용자 리뷰 요청 섹션에 기록한다. 섹션 형식은 agent-ops/skills/common/_templates/implementation-user-review-request-section.md와 같으며, code-review가 검증 후 실제 USER_REVIEW.md 작성 여부를 결정한다.

분석 결과

읽은 파일

  • apps/flutter-test/android/local.properties
  • apps/flutter-test/android/settings.gradle.kts
  • apps/flutter-test/android/build.gradle.kts
  • apps/flutter-test/android/app/build.gradle.kts
  • apps/flutter-test/android/app/src/main/AndroidManifest.xml
  • packages/messaging_flutter/android/build.gradle.kts
  • packages/messaging_flutter/android/src/main/AndroidManifest.xml
  • packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.kt
  • packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/PushNotificationEvents.kt
  • packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/LaunchIntentHelper.kt
  • packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoFirebaseMessagingService.kt
  • packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt
  • packages/messaging_flutter/docs/android-test-environment.md
  • apps/flutter-test/README.md
  • packages/messaging_flutter/README.md

테스트 커버리지 공백

  • NexoMessagingPlugin.onMethodCall: current native test only checks getPlatformVersion; invalid argument paths and debug event method are not covered.
  • intentPayload: no native unit test currently verifies extras -> opened/userInteraction payload mapping.
  • Local Android verification: blocked because local apps/flutter-test/android/local.properties has flutter.sdk=/sdk/flutter but no sdk.dir, and ANDROID_HOME is unavailable.
  • Remote Android verification: documented but not executed in this local session.

심볼 참조

  • 변경/삭제할 심볼 없음.
  • Relevant references checked with rg --sort path -n "debugSendNativeEvent|intentPayload|testDebugUnitTest|ANDROID_HOME|sdk.dir" apps/flutter-test packages/messaging_flutter.

분할 판단

  • split decision policy를 plan 파일 선택 전에 평가했다.
  • shared task group: agent-task/m-client-validation.
  • predecessor dependencies from directory name: 01_docs_boundary and 02+01_flutter_contract_tests.
  • this subtask: 03+01,02_android_native_validation, waits for both because it relies on finalized doc language and Flutter contract tests.

범위 결정 근거

  • No remote credentials or host-specific tokens are added to tracked docs.
  • No Android SDK is installed into the repository.
  • No public package rename, manifest identifier rename, or generated Flutter platform file regeneration is allowed.
  • FCM real delivery remains manual smoke; this subtask may document/run it only when external infrastructure is already prepared.

빌드 등급

  • build=cloud-G07, review=cloud-G07. Success depends on terminal/Gradle workflow, environment diagnosis, Android SDK/device availability, and possibly remote execution.

의존 관계 및 구현 순서

  • Wait for agent-task/m-client-validation/01_docs_boundary/complete.log.
  • Wait for agent-task/m-client-validation/02+01_flutter_contract_tests/complete.log.
  • Do not add dependencies beyond the 03+01,02_... directory name.

구현 체크리스트

  • [ANDROID-1] packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt를 plugin method-call/intent payload 계약 중심으로 보강한다.
  • [ANDROID-2] local Android preflight를 실행하고 ./gradlew testDebugUnitTest의 실제 통과 또는 SDK blocker 출력을 기록한다.
  • [ANDROID-3] remote Android guide를 사용 가능한 경우 integration/native checks를 실행하고, 불가능하면 review stub의 사용자 리뷰 요청에 필요한 외부 준비 사항을 정확히 남긴다.
  • flutter doctor -vcommand -v adb/command -v emulator/command -v sdkmanager 결과를 기록한다.
  • ./gradlew testDebugUnitTestapps/flutter-test/android에서 실행하고 실제 stdout/stderr를 기록한다.
  • CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

[ANDROID-1] Native unit test 계약 보강

문제

packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt는 template comment와 getPlatformVersion 단일 테스트만 갖고 있다. packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.ktdebugSendNativeEvent invalid argument path와 packages/messaging_flutter/android/src/main/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPlugin.ktintentPayload mapping은 native test로 고정되어 있지 않다.

Before:

16 internal class NexoMessagingPluginTest {
17     @Test
18     fun onMethodCall_getPlatformVersion_returnsExpectedValue() {

해결 방법

기존 template comment를 제거하고, 최소한 다음 native tests를 추가한다.

  • onMethodCall_debugSendNativeEvent_withInvalidPayload_returnsInvalidArg
  • onMethodCall_saveDeviceToken_withoutToken_returnsInvalidArg
  • 가능하면 Android SDK/Robolectric 없이 가능한 범위에서 intentPayload mapping test. 필요하면 implementation blocker로 남기고 문서화한다.

새 dependency는 추가하지 않는 것을 기본으로 한다. Robolectric이 꼭 필요하면 packages/messaging_flutter/android/build.gradle.ktstestImplementation 추가 여부와 이유를 review stub에 기록한다.

수정 파일 및 체크리스트

  • packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt
  • 필요 시 packages/messaging_flutter/android/build.gradle.kts

테스트 작성

Native unit test를 직접 추가한다.

중간 검증

cd apps/flutter-test/android && ./gradlew testDebugUnitTest

[ANDROID-2] Local Android preflight 기록

문제

현재 local ./gradlew testDebugUnitTest는 Android SDK path가 없어 실패했다. apps/flutter-test/android/local.propertiesflutter.sdk만 갖고 있고 sdk.dir이 없다.

Observed:

SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file

해결 방법

구현자는 local 환경을 repo에 설치하지 않는다. command -v adb, command -v emulator, command -v sdkmanager, flutter doctor -v, ./gradlew testDebugUnitTest를 실행하고 실제 출력을 review stub에 기록한다. ANDROID_HOME이 준비되어 있으면 Gradle test를 통과시킨다.

수정 파일 및 체크리스트

  • 소스 파일 변경 없음. 검증 결과 기록만 수행한다.

테스트 작성

테스트 작성 없음. 환경 preflight다.

중간 검증

command -v adb
command -v emulator
command -v sdkmanager
flutter doctor -v
cd apps/flutter-test/android && ./gradlew testDebugUnitTest

[ANDROID-3] Remote/device verification handoff

문제

packages/messaging_flutter/docs/android-test-environment.md는 remote check path를 제공하지만 실제 실행은 외부 SSH/device 조건이 필요하다.

Before:

73 ## Run The Checks
77 cd "$HOME/tmp/nexo-codex-test/packages/messaging_flutter"

해결 방법

remote host 접근이 가능하면 guide의 sync/emulator/check commands를 그대로 실행한다. 접근이 불가능하면 사용자 리뷰 요청에 필요한 준비 사항을 남긴다: Android SDK 또는 remote SSH availability, emulator/device, Firebase config 여부.

수정 파일 및 체크리스트

  • 필요 시 packages/messaging_flutter/docs/android-test-environment.md의 command drift만 수정한다.

테스트 작성

새 테스트 없음. 외부 환경 검증이다.

중간 검증

cd apps/flutter-test && flutter test integration_test -d emulator-5554
cd apps/flutter-test/android && ./gradlew testDebugUnitTest

수정 파일 요약

파일 항목
packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt ANDROID-1
packages/messaging_flutter/android/build.gradle.kts ANDROID-1, only if a test dependency is justified
packages/messaging_flutter/docs/android-test-environment.md ANDROID-3, only if command drift is found

최종 검증

command -v adb
command -v emulator
command -v sdkmanager
flutter doctor -v
cd apps/flutter-test/android && ./gradlew testDebugUnitTest
cd apps/flutter-test && flutter test integration_test -d emulator-5554
git diff --check -- packages/messaging_flutter/android/src/test/kotlin/com/tokilabs/nexo/messaging/NexoMessagingPluginTest.kt packages/messaging_flutter/android/build.gradle.kts packages/messaging_flutter/docs/android-test-environment.md

Local Android SDK/device 부재는 PASS가 아니라 environment blocker다. blocker가 남으면 사용자 리뷰 요청을 채우고 code-review가 stop 여부를 판단하게 한다.

모든 코드 변경 완료 후 반드시 CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.