<!-- task=mattermost_push_plugin_extraction/04+02_risk_hardening plan=1 tag=REVIEW_REFACTOR -->

# Push Plugin Risk Hardening Follow-up Plan

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

이 계획은 `code_review_cloud_G08_0.log`의 FAIL 판정에서 나온 Required 항목만 닫는다. 구현을 끝내기 전 `CODE_REVIEW-cloud-G08.md`의 구현 에이전트 소유 섹션을 반드시 채운다. 검증 명령을 실제로 실행하고 stdout/stderr를 붙여 넣은 뒤 active 파일을 그대로 둔 채 review ready를 보고한다. 최종 판정, log rename, `complete.log`, archive 이동은 code-review-skill 전용이다.

## 배경

리스크 하드닝 구현은 DB singleton close 제거와 DAO stub 해소 방향은 대부분 맞지만, 새 `SystemEntity` 사용이 import되지 않아 Android native compile이 깨질 수 있다. 또한 원 계획의 필수 Android build 검증이 SDK 부재로 실패했고, active review에는 대체 `flutter analyze` 출력과 출력 없는 원본 command stub이 함께 남아 검증 신뢰가 회복되지 않았다.

## 분석 결과

### 읽은 파일

- `agent-task/mattermost_push_plugin_extraction/04+02_risk_hardening/code_review_cloud_G08_0.log`
- `agent-task/mattermost_push_plugin_extraction/04+02_risk_hardening/plan_cloud_G08_0.log`
- `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/PushNotificationDataHelper.kt`
- `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/db/ServerEntities.kt`
- `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/db/MattermostDatabase.kt`
- `../mattermost-push-plugin/android/src/main/AndroidManifest.xml`
- `../mattermost-push-plugin/README.md`

### 실패 근거

- `PushNotificationDataHelper.kt` imports only `MattermostDatabase` from `helpers.db`, but line 175 calls `SystemEntity(...)`.
- `plan_cloud_G08_0.log` requires `cd /config/workspace/mattermost-push-plugin/example && flutter build apk --debug` as final verification.
- The archived review log records Android SDK absence and substitutes `flutter analyze`; it also retains blank verification command stubs.
- Review rerun result: `flutter analyze` passed, `flutter test` passed, but `flutter build apk --debug` failed with `[!] No Android SDK found. Try setting the ANDROID_HOME environment variable.`

### 범위 결정 근거

- Do not refactor DAO schemas beyond the missing import/qualification unless Android build exposes a directly related compile error.
- Do not edit host app consumer files in this follow-up.
- Do not change manifest ownership unless Android build or static search exposes an additional collision error.

### 빌드 등급

- Build lane: `cloud-G08`; review lane: `cloud-G08`. The follow-up touches Android native compile and verification trust for a storage/FCM plugin boundary.

## 구현 체크리스트

- [ ] [REVIEW_REFACTOR-1] `SystemEntity` unresolved reference 위험을 import 또는 fully-qualified call로 닫는다.
- [ ] [REVIEW_REFACTOR-2] 필수 Android build 검증을 실제 성공 stdout/stderr로 회복하고 review 파일의 빈 검증 stub을 남기지 않는다.
- [ ] 중간 검증과 최종 검증 명령을 모두 실행하고 실제 출력을 `CODE_REVIEW-cloud-G08.md`에 붙여 넣는다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

## 의존 관계 및 구현 순서

1. `REVIEW_REFACTOR-1`을 먼저 적용한다.
2. Android build를 포함한 `REVIEW_REFACTOR-2` 검증을 수행한다.
3. 검증 출력은 새 `CODE_REVIEW-cloud-G08.md`에만 정리한다. 이전 archived log를 수정하지 않는다.

### [REVIEW_REFACTOR-1] SystemEntity Reference Fix

#### 문제

`PushNotificationDataHelper.kt`에서 `SystemEntity("pendingNotification_$channelId", json.toString())`를 호출하지만 `SystemEntity`가 같은 package에 있지 않고 import도 없다.

Before:

```kotlin
import com.tokilabs.mattermost_push_plugin.helpers.db.MattermostDatabase

db.systemDao().upsert(SystemEntity("pendingNotification_$channelId", json.toString()))
```

After:

```kotlin
import com.tokilabs.mattermost_push_plugin.helpers.db.MattermostDatabase
import com.tokilabs.mattermost_push_plugin.helpers.db.SystemEntity

db.systemDao().upsert(SystemEntity("pendingNotification_$channelId", json.toString()))
```

Fully-qualified call is acceptable if it follows the local style better.

#### 수정 파일 및 체크리스트

- [ ] `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/PushNotificationDataHelper.kt` imports or qualifies `SystemEntity`
- [ ] No unrelated DAO schema or notification behavior changes are included

#### 테스트 작성

No new unit test required; this is a compile fix. Android build is required in final verification.

#### 중간 검증

```bash
cd /config/workspace/nomadcode && rg --sort path -n "SystemEntity" ../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/PushNotificationDataHelper.kt ../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/db/ServerEntities.kt
```

Expected: `PushNotificationDataHelper.kt` shows an import or fully-qualified use plus the `upsert(SystemEntity(...))` call, and `ServerEntities.kt` shows the entity definition.

### [REVIEW_REFACTOR-2] Verification Trust Recovery

#### 문제

The previous review-ready file did not satisfy the fixed verification contract. `flutter analyze` is useful, but it does not compile Android Kotlin/Java/Room code and cannot prove the new native DAO code builds.

#### 해결 방법

Run the required verification commands after `REVIEW_REFACTOR-1`. If Android SDK is still unavailable, do not mark this item complete; record the exact failure output and leave the task review-ready only after a real Android build succeeds in an environment with SDK configured.

#### 수정 파일 및 체크리스트

- [ ] `CODE_REVIEW-cloud-G08.md` contains actual stdout/stderr for every command below
- [ ] `CODE_REVIEW-cloud-G08.md` does not retain duplicate blank command stubs
- [ ] Final Android build output is a successful build, not a substituted `flutter analyze`

#### 테스트 작성

No new test file required. Reuse existing Dart tests and Android build.

#### 중간 검증

```bash
cd /config/workspace/mattermost-push-plugin && flutter analyze
cd /config/workspace/mattermost-push-plugin && flutter test
```

Expected: both commands pass.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/PushNotificationDataHelper.kt` | REVIEW_REFACTOR-1 |
| `agent-task/mattermost_push_plugin_extraction/04+02_risk_hardening/CODE_REVIEW-cloud-G08.md` | REVIEW_REFACTOR-2 |

## 최종 검증

```bash
cd /config/workspace/nomadcode && rg --sort path -n "SystemEntity" ../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/PushNotificationDataHelper.kt ../mattermost-push-plugin/android/src/main/kotlin/com/tokilabs/mattermost_push_plugin/helpers/db/ServerEntities.kt
cd /config/workspace/nomadcode && ! rg --sort path "db\\??\\.close\\(" ../mattermost-push-plugin/android/src/main
cd /config/workspace/nomadcode && ! rg --sort path "Room DAO 구현 필요|TODO: db\\.|TODO: Room DB" ../mattermost-push-plugin/android/src/main
cd /config/workspace/mattermost-push-plugin && flutter analyze
cd /config/workspace/mattermost-push-plugin && flutter test
cd /config/workspace/mattermost-push-plugin/example && flutter build apk --debug
```

Expected: static searches match the intended import/entity and no old DB close/TODO patterns. Dart analysis and tests pass. Android debug build succeeds and proves Kotlin/Java/Room code compiles.
