diff --git a/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md b/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md index 12411f17..5fdbed66 100644 --- a/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +++ b/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md @@ -12,7 +12,7 @@ ## 상태 -[계획] +[진행중] ## 승격 조건 @@ -49,10 +49,10 @@ Mattermost server/webapp과 push-proxy를 원격 Mac에서 재현 가능하게 받는 image 배포 단위로 전환한다. -- [ ] [image-registry] `toki-labs.com:5050` registry 기준으로 nexo-owned image naming, immutable tag, `latest` stable promotion, rollback, digest evidence, 실제 push/pull evidence를 정리한다. -- [ ] [core-image] Mattermost server/webapp runtime image를 현재 source snapshot 또는 upstream 기준선에서 `linux/arm64`로 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag, digest, architecture를 확인한다. -- [ ] [push-proxy-image] mattermost-push-proxy image를 `services/push-proxy` 기준선에서 `linux/arm64`로 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag, digest, architecture를 확인한다. -- [ ] [remote-compose] 원격 `~/docker/services/nexo/compose`가 nexo-owned core/push-proxy image를 사용하도록 전환한다. 검증: remote compose up 후 core ping, Mattermost app HEAD, db readiness, push-proxy smoke가 성공한다. +- [x] [image-registry] `toki-labs.com:5050` registry 기준으로 nexo-owned image naming, immutable tag, `latest` stable promotion, rollback, digest evidence, 실제 push/pull evidence를 정리한다. +- [x] [core-image] Mattermost server/webapp runtime image를 현재 source snapshot 또는 upstream 기준선에서 `linux/arm64`로 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag, digest, architecture를 확인한다. +- [x] [push-proxy-image] mattermost-push-proxy image를 `services/push-proxy` 기준선에서 `linux/arm64`로 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag, digest, architecture를 확인한다. +- [x] [remote-compose] 원격 `~/docker/services/nexo/compose`가 nexo-owned core/push-proxy image를 사용하도록 전환한다. 검증: remote compose up 후 core ping, Mattermost app HEAD, db readiness, push-proxy smoke가 성공한다. ### Epic: [repo-smoke] Current repo smoke/e2e @@ -97,6 +97,7 @@ Mattermost server/webapp과 push-proxy를 원격 Mac에서 재현 가능하게 - architecture 표준선: 원격 Mac 전용 `linux/arm64` image만 빌드, 배포, 검증한다. multi-arch manifest와 amd64 image는 이번 Milestone에서 만들지 않는다. - registry 기준선: `toki-labs.com:5050`은 HTTPS registry proxy로 `/v2/`와 `/v2/_catalog`가 `200 OK`를 반환했다. `192.168.0.97:5051`은 registry 컨테이너 직결 HTTP API이며, `192.168.0.97`의 80/443은 WordPress/nginx 사이트로 응답한다. - 원격 Docker 기준선: `ssh toki@toki-labs.com` 접속 후 `/usr/local/bin/docker version`이 `client=27.4.0 server=27.4.0`으로 확인되었고, 기존 registry image `toki-labs.com:5050/registry:latest` manifest 조회가 성공했다. +- image/runtime 완료 근거: `docs/runtime-image-validation.md`에 registry manifest digest, remote `docker image inspect` architecture, remote compose parity/config/pull/up/smoke evidence를 기록했다. 2026-05-28 재확인에서도 registry manifest HEAD와 remote compose smoke가 성공했다. - 선행 작업: 운영 기준선 - 후속 작업: 클라이언트 검증 기준선, 업스트림 런타임 운영화, 메시징 런타임 표준화 -- 확인 필요: 실제 nexo-owned core/push-proxy image push/pull evidence, remote compose 전환 smoke evidence +- 확인 필요: `apps/mattermost` smoke/e2e, `apps/flutter-test` device/emulator integration과 실제 FCM/ACK smoke, `../nomadcode`, `../iop`, `../alt` consumer setup/smoke/e2e evidence matrix 보완 diff --git a/agent-task/m-runtime-image-validation/01_repo_app_validation/USER_REVIEW.md b/agent-task/m-runtime-image-validation/01_repo_app_validation/USER_REVIEW.md new file mode 100644 index 00000000..27e9c497 --- /dev/null +++ b/agent-task/m-runtime-image-validation/01_repo_app_validation/USER_REVIEW.md @@ -0,0 +1,56 @@ +# User Review Required - m-runtime-image-validation/01_repo_app_validation + +## 요청 일시 + +2026-05-28 + +## 상태 + +USER_REVIEW + +## 사유 + +- 유형: environment-blocked +- 현재 리뷰 회차: 2 +- 최종 판정: FAIL +- 요약: 원격 Android/Flutter 검증은 PASS로 회복됐지만, Mattermost `check-test`는 Korean locale snapshot 2건 실패가 남았고 Detox Android는 Firebase debug `google-services.json` 누락으로 빌드가 차단됐다. 자동 follow-up을 계속할지, 외부 config를 준비할지, 또는 현 evidence를 milestone 범위에서 어떻게 볼지 사용자 결정이 필요하다. + +## 루프 이력 + +| Plan | Review | Verdict | 메모 | +|------|--------|---------|------| +| `agent-task/m-runtime-image-validation/01_repo_app_validation/plan_cloud_G07_0.log` | `agent-task/m-runtime-image-validation/01_repo_app_validation/code_review_cloud_G07_0.log` | FAIL | local container 기준 Android SDK/device/Node prerequisites 미충족 및 scope-excluded 판단 필요 | +| `agent-task/m-runtime-image-validation/01_repo_app_validation/plan_cloud_G07_1.log` | `agent-task/m-runtime-image-validation/01_repo_app_validation/code_review_cloud_G07_1.log` | FAIL | remote 재검증 후 Flutter는 PASS, Mattermost snapshot FAIL 및 Detox Firebase config BLOCKED | + +## 차단 근거 + +- 문제: `docs/runtime-image-validation.md`의 repo app matrix에서 Flutter Android/Integration rows는 PASS로 갱신됐지만, Mattermost app check와 Detox e2e가 아직 완료 기준에 도달하지 못했다. +- 현재 archive plan: `agent-task/m-runtime-image-validation/01_repo_app_validation/plan_cloud_G07_1.log` +- 현재 archive review: `agent-task/m-runtime-image-validation/01_repo_app_validation/code_review_cloud_G07_1.log` +- 검증 명령: `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/mattermost && npm ci && npm run check-test'`, `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/mattermost && npm run e2e:android'` +- 실제 출력: `npm run check-test` 결과 `Test Suites: 1 failed, 2 skipped, 611 passed`; `Tests: 2 failed, 7 skipped, 8160 passed`; `Snapshots: 2 failed, 301 passed`. 실패는 `app/components/formatted_date/index.test.tsx`의 Korean locale snapshot `AM` vs `오전` 차이다. `npm run e2e:android`는 `:app:processDebugGoogleServices FAILED` 및 `File google-services.json is missing`으로 Android build가 중단됐다. +- 차단 판단 근거: snapshot 갱신/locale pinning은 upstream Mattermost test expectation을 바꾸는 결정이고, Detox Android는 tracked repo에 없는 Firebase debug config 또는 config-less test build 조정이 필요하다. 둘 다 사용자의 범위 결정이나 외부 config 준비 없이 자동으로 완료 처리하기 어렵다. + +## 사용자 결정 필요 + +- [ ] 자동 follow-up plan/review를 계속 진행한다. 예: Mattermost Korean locale snapshot을 현재 host 기준으로 업데이트/핀 처리하고, Detox가 Firebase config 없이 빌드되도록 test build path를 만든다. +- [ ] 계획을 재작성한다. 예: Mattermost upstream app 전체 check/e2e는 별도 subtask로 분리하고 현재 repo runtime image validation은 Flutter/runtime evidence 중심으로 닫는다. +- [ ] 테스트 환경, secret, 외부 서비스, SDK, 장비 조건을 준비한 뒤 재시도한다. 예: 원격 Mattermost Android debug build용 `google-services.json`을 안전한 위치에 제공하고 동일 명령을 재실행한다. +- [ ] 작업 범위를 줄이거나 보류/폐기한다. + +## 재개 조건 + +- Mattermost snapshot 2건을 수정/핀/known failure 중 어느 방식으로 처리할지 결정되어야 한다. +- Detox Android debug build가 사용할 Firebase config가 원격에 준비되거나, config 없이 빌드 가능한 Gradle/test path를 만드는 방향이 승인되어야 한다. +- 재개 시 비밀번호와 Firebase config 내용은 tracked docs, review logs, shell output에 남기지 않는다. + +## 다음 실행 힌트 + +- config 제공 후 재시도: `ssh toki@toki-labs.com 'zsh -lc "cd ~/works/nexo/apps/mattermost && npm run check-test && npm run e2e:android"'` +- 새 구현이 필요하면 plan 스킬로 이 `USER_REVIEW.md`를 `user_review_1.log`로 아카이브한 뒤 같은 task path에 follow-up `PLAN-*-G??.md` / `CODE_REVIEW-*-G??.md`를 생성한다. +- 완료로 인정하려면 사용자가 Mattermost FAIL/BLOCKED rows의 milestone 처리 방식을 명시해야 한다. + +## 종료 규칙 + +- 사용자가 이 stop state를 완료/PASS로 해소하면 `USER_REVIEW.md`를 해소 상태로 갱신하고, `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다. +- 새 구현이 필요하면 `plan` 스킬이 `USER_REVIEW.md`를 `user_review_N.log`로 아카이브한 뒤 새 `PLAN-*-G??.md` / `CODE_REVIEW-*-G??.md`를 작성한다. diff --git a/agent-task/m-runtime-image-validation/02_consumer_project_validation/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-image-validation/02_consumer_project_validation/CODE_REVIEW-cloud-G07.md new file mode 100644 index 00000000..81b3ee37 --- /dev/null +++ b/agent-task/m-runtime-image-validation/02_consumer_project_validation/CODE_REVIEW-cloud-G07.md @@ -0,0 +1,116 @@ + + +# Code Review Reference - VALIDATION + +> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.** +> The task is NOT complete until every implementation-owned section below is filled in. +> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving. +> Fill implementation-owned sections, then stop with active files in place and report ready for review. +> If implementation is blocked by a user-only decision, external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. +> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume. +> Follow the ownership table at the bottom of this file for which sections you own. + +## 개요 + +date=2026-05-28 +task=m-runtime-image-validation/02_consumer_project_validation, plan=0, tag=VALIDATION + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [VALIDATION-1] NomadCode verification | [ ] | +| [VALIDATION-2] IOP minimal consumer smoke | [ ] | +| [VALIDATION-3] ALT minimal consumer smoke | [ ] | +| [VALIDATION-4] Consumer matrix update | [ ] | + +## 구현 체크리스트 + +- [ ] [VALIDATION-1] `../nomadcode`의 existing `nexo_messaging` integration을 재검증하고 smoke/e2e evidence를 갱신한다. +- [ ] [VALIDATION-2] `../iop`에 최소 `nexo_messaging` dependency/test smoke를 추가하거나 protobuf blocker를 정확히 기록한다. +- [ ] [VALIDATION-3] `../alt`에 최소 `nexo_messaging` dependency/test smoke를 추가하거나 routing 결정 blocker를 정확히 기록한다. +- [ ] [VALIDATION-4] 세 consumer 프로젝트의 smoke/e2e 결과를 `docs/runtime-image-validation.md`에 반영한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_0.log`로 아카이브한다. +- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G07_0.log`로 아카이브한다. +- [ ] PASS이면 `complete.log` 작성 후 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/02_consumer_project_validation/`로 이동한다. +- [ ] PASS이고 task group이 `m-runtime-image-validation`이면 런타임 완료 이벤트 메타데이터를 보고한다. +- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성한다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 사용자 리뷰 요청 + +_기본값은 `없음`이다. 구현 중 사용자 결정, 외부 환경 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. code-review가 이 내용을 검증해 `USER_REVIEW.md`를 작성한다._ + +- 상태: 없음 +- 사유 유형: 없음 +- 결정 필요: 없음 +- 차단 근거: 없음 +- 실행한 검증/명령: 없음 +- 재개 조건: 없음 + +## 리뷰어를 위한 체크포인트 + +- sibling repo rules를 읽고 변경했는가 +- `iop`/`alt`에 제품 routing을 임의로 만들지 않았는가 +- docs evidence가 실제 command output과 일치하는가 + +## 검증 결과 + +### VALIDATION-1 중간 검증 +```sh +$ ../nomadcode/bin/test +$ rg --sort path -n "nexo_messaging|messaging_flutter" ../nomadcode/apps/client +(output) +``` + +### VALIDATION-2 중간 검증 +```sh +$ cd ../iop/apps/portal && flutter pub get && flutter test +(output) +``` + +### VALIDATION-3 중간 검증 +```sh +$ ../alt/bin/test +$ rg --sort path -n "nexo_messaging|messaging_flutter" ../alt/apps/client +(output) +``` + +### VALIDATION-4 중간 검증 +```sh +$ rg --sort path -n "../nomadcode|../iop|../alt|SKIP|BLOCKED|PASS" docs/runtime-image-validation.md +(output) +``` + +### 최종 검증 +```sh +$ ../nomadcode/bin/test +$ cd ../iop/apps/portal && flutter test +$ ../alt/bin/test +$ bin/test +$ bin/lint +(output) +``` diff --git a/agent-task/m-runtime-image-validation/02_consumer_project_validation/PLAN-cloud-G07.md b/agent-task/m-runtime-image-validation/02_consumer_project_validation/PLAN-cloud-G07.md new file mode 100644 index 00000000..def1e967 --- /dev/null +++ b/agent-task/m-runtime-image-validation/02_consumer_project_validation/PLAN-cloud-G07.md @@ -0,0 +1,172 @@ + + +# Plan - Consumer Project Runtime Validation + +## 이 파일을 읽는 구현 에이전트에게 + +이 task는 sibling repo를 건드릴 수 있다. 각 sibling repo에 들어가기 전에 해당 repo의 진입 규칙을 읽고, 제품 UI/business logic으로 확장하지 않는다. 구현 후 `CODE_REVIEW-cloud-G07.md`에 실제 변경, 검증 출력, blocker 여부를 채운다. + +## 배경 + +Milestone은 `../nomadcode`, `../iop`, `../alt`가 같은 runtime/image 기준을 소비할 수 있는지 확인해야 한다. 현재 `nomadcode`는 `nexo_messaging` path dependency가 있지만 `iop`와 `alt`에는 dependency가 없고, `iop`는 protobuf mismatch로 test가 skip되었다. + +## 사용자 리뷰 요청 흐름 + +consumer 프로젝트의 제품 routing 결정, credential, device, 또는 sibling roadmap lock이 필요하면 review stub의 `사용자 리뷰 요청`에 기록하고 멈춘다. + +## 분석 결과 + +### 읽은 파일 + +- `docs/runtime-image-validation.md` +- `../nomadcode/apps/client/pubspec.yaml` +- `../nomadcode/apps/client/lib/src/integrations/mattermost/mattermost_push_client.dart` +- `../nomadcode/apps/client/lib/src/integrations/mattermost/mattermost_push_plugin_client.dart` +- `../nomadcode/apps/client/lib/src/integrations/mattermost/mattermost_push_host_integration.dart` +- `../nomadcode/apps/client/test/integrations/mattermost_push_host_integration_test.dart` +- `../iop/apps/portal/pubspec.yaml` +- `../iop/apps/portal/lib/main.dart` +- `../iop/apps/portal/lib/portal_config.dart` +- `../iop/apps/portal/test/widget_test.dart` +- `../iop/apps/portal/test/portal_config_test.dart` +- `../alt/apps/client/pubspec.yaml` +- `../alt/apps/client/lib/main.dart` +- `../alt/apps/client/lib/src/app/app.dart` +- `../alt/apps/client/lib/src/app/router.dart` +- `../alt/apps/client/test/widget_test.dart` + +### 테스트 커버리지 공백 + +- `../nomadcode/apps/client/pubspec.yaml:43` already maps `nexo_messaging`, and host integration tests cover the adapter boundary. +- `../iop/apps/portal/pubspec.yaml:38` has protobuf/proto_socket but no `nexo_messaging`. +- `../alt/apps/client/pubspec.yaml:37` has Riverpod/router/proto_socket but no `nexo_messaging`. +- `docs/runtime-image-validation.md:122` records `iop` as `SKIP`; `:123` records `alt` clean baseline but no nexo integration. + +### 심볼 참조 + +- none. New test-only imports may be added; no rename/remove is planned. + +### 분할 판단 + +- Split policy 평가 결과, consumer validation is independent from repo app validation but final evidence closeout depends on both. +- Shared task group: `agent-task/m-runtime-image-validation` +- This subtask: `02_consumer_project_validation`, no predecessor. +- `03+01,02_evidence_matrix_closeout` depends on this task and `01_repo_app_validation`. + +### 범위 결정 근거 + +- `nomadcode`는 existing dependency and host boundary를 verify only. +- `iop`와 `alt`는 최소 path dependency plus test-only smoke를 우선한다. 제품 routing, navigation, notification UX는 각 프로젝트 결정이 필요하면 blocker로 남긴다. +- 각 sibling repo의 roadmap 상태 전환은 이 task 범위가 아니다. + +### 빌드 등급 + +- build=`cloud-G07`, review=`cloud-G07`: cross-repo edits, Flutter dependency resolution, protobuf mismatch, external runtime smoke가 포함된다. + +## 구현 체크리스트 + +- [ ] [VALIDATION-1] `../nomadcode`의 existing `nexo_messaging` integration을 재검증하고 smoke/e2e evidence를 갱신한다. +- [ ] [VALIDATION-2] `../iop`에 최소 `nexo_messaging` dependency/test smoke를 추가하거나 protobuf blocker를 정확히 기록한다. +- [ ] [VALIDATION-3] `../alt`에 최소 `nexo_messaging` dependency/test smoke를 추가하거나 routing 결정 blocker를 정확히 기록한다. +- [ ] [VALIDATION-4] 세 consumer 프로젝트의 smoke/e2e 결과를 `docs/runtime-image-validation.md`에 반영한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +### [VALIDATION-1] NomadCode Verification + +문제: `nomadcode`는 dependency가 있지만 current evidence는 과거 Android smoke archive에 의존한다. + +해결 방법: `../nomadcode/bin/test`와 `nexo_messaging` reference scan을 재실행하고, remote Android/FCM smoke가 재현 불가하면 blocker 또는 retained historical evidence로 분류한다. + +수정 파일 및 체크리스트: + +- [ ] `docs/runtime-image-validation.md` consumer matrix 갱신 + +테스트 작성: skip. Existing tests를 재실행한다. + +중간 검증: + +```sh +../nomadcode/bin/test +rg --sort path -n "nexo_messaging|messaging_flutter" ../nomadcode/apps/client +``` + +### [VALIDATION-2] IOP Minimal Consumer Smoke + +문제: `../iop/apps/portal/pubspec.yaml:38`에는 `nexo_messaging`가 없고, prior evidence는 protobuf mismatch로 `SKIP`다. + +해결 방법: sibling rules를 확인한 뒤 `nexo_messaging` path dependency와 compile-only/test-only smoke를 추가한다. protobuf mismatch가 먼저 막으면 해당 failure를 user-review blocker로 기록한다. + +수정 파일 및 체크리스트: + +- [ ] `../iop/apps/portal/pubspec.yaml` +- [ ] `../iop/apps/portal/test/messaging_plugin_dependency_test.dart` 또는 동일 목적의 existing test +- [ ] `docs/runtime-image-validation.md` + +테스트 작성: required. `NexoMessagingPlugin.notificationChannelName` 또는 singleton access를 검증하는 compile smoke를 추가한다. + +중간 검증: + +```sh +cd ../iop/apps/portal && flutter pub get && flutter test +``` + +### [VALIDATION-3] ALT Minimal Consumer Smoke + +문제: `../alt/apps/client/pubspec.yaml:37` 이후 dependency set에는 `nexo_messaging`가 없고 current evidence는 clean baseline only다. + +해결 방법: sibling rules를 확인한 뒤 `nexo_messaging` path dependency와 compile-only/test-only smoke를 추가한다. 실제 routing destination은 ALT product decision이 필요하면 blocker로 둔다. + +수정 파일 및 체크리스트: + +- [ ] `../alt/apps/client/pubspec.yaml` +- [ ] `../alt/apps/client/test/messaging_plugin_dependency_test.dart` 또는 동일 목적의 existing test +- [ ] `docs/runtime-image-validation.md` + +테스트 작성: required. Plugin dependency compile and singleton/channel constant smoke를 추가한다. + +중간 검증: + +```sh +../alt/bin/test +rg --sort path -n "nexo_messaging|messaging_flutter" ../alt/apps/client +``` + +### [VALIDATION-4] Consumer Matrix Update + +문제: consumer matrix가 `SKIP`와 no-integration baseline을 포함해 Milestone 완료 근거가 부족하다. + +해결 방법: `nomadcode`, `iop`, `alt` row를 setup, smoke, e2e/deferred decision으로 분리하고 PASS/BLOCKED를 실제 evidence와 연결한다. + +수정 파일 및 체크리스트: + +- [ ] `docs/runtime-image-validation.md` + +테스트 작성: skip. Evidence documentation update다. + +중간 검증: + +```sh +rg --sort path -n "../nomadcode|../iop|../alt|SKIP|BLOCKED|PASS" docs/runtime-image-validation.md +``` + +## 수정 파일 요약 + +| 파일 | 항목 | +|---|---| +| `../iop/apps/portal/pubspec.yaml` | VALIDATION-2 | +| `../iop/apps/portal/test/messaging_plugin_dependency_test.dart` | VALIDATION-2 | +| `../alt/apps/client/pubspec.yaml` | VALIDATION-3 | +| `../alt/apps/client/test/messaging_plugin_dependency_test.dart` | VALIDATION-3 | +| `docs/runtime-image-validation.md` | VALIDATION-1..4 | + +## 최종 검증 + +```sh +../nomadcode/bin/test +cd ../iop/apps/portal && flutter test +../alt/bin/test +bin/test +bin/lint +``` + +모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/CODE_REVIEW-cloud-G07.md new file mode 100644 index 00000000..81873460 --- /dev/null +++ b/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/CODE_REVIEW-cloud-G07.md @@ -0,0 +1,115 @@ + + +# Code Review Reference - VALIDATION + +> **[IMPLEMENTING AGENT — READ FIRST] Filling in this file is the mandatory final step of implementation.** +> The task is NOT complete until every implementation-owned section below is filled in. +> Complete the `구현 체크리스트`; the final checklist item is mandatory before saving. +> Fill implementation-owned sections, then stop with active files in place and report ready for review. +> If implementation is blocked by a user-only decision, external environment prerequisite, or scope conflict, fill `사용자 리뷰 요청` with evidence and stop with active files in place; code-review decides whether to write `USER_REVIEW.md`. +> Finalization (`코드리뷰 결과`, log rename, `complete.log`, archive moves, `코드리뷰 전용 체크리스트`) is review-agent-only, even after compaction/resume. +> Follow the ownership table at the bottom of this file for which sections you own. + +## 개요 + +date=2026-05-28 +task=m-runtime-image-validation/03+01,02_evidence_matrix_closeout, plan=0, tag=VALIDATION + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [VALIDATION-1] Predecessor evidence gate | [ ] | +| [VALIDATION-2] Evidence matrix normalize | [ ] | +| [VALIDATION-3] Roadmap completion update | [ ] | +| [VALIDATION-4] Roadmap/lock verification | [ ] | + +## 구현 체크리스트 + +- [ ] [VALIDATION-1] predecessor `complete.log`와 docs evidence를 확인해 app/consumer tasks 완료 여부를 판정한다. +- [ ] [VALIDATION-2] `docs/runtime-image-validation.md` matrix에서 의도치 않은 `SKIP`/`BLOCKED`가 없는지 정리한다. +- [ ] [VALIDATION-3] Milestone 기능 체크박스를 evidence 기준으로 갱신하고, 모두 충족되면 `[검토중]`과 완료 리뷰 요청을 남긴다. +- [ ] [VALIDATION-4] roadmap/current/phase path와 workspace lock 상태를 검증한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_0.log`로 아카이브한다. +- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G07_0.log`로 아카이브한다. +- [ ] PASS이면 `complete.log` 작성 후 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/`로 이동한다. +- [ ] PASS이고 task group이 `m-runtime-image-validation`이면 런타임 완료 이벤트 메타데이터를 보고한다. +- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성한다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 사용자 리뷰 요청 + +_기본값은 `없음`이다. 구현 중 사용자 결정, 외부 환경 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. code-review가 이 내용을 검증해 `USER_REVIEW.md`를 작성한다._ + +- 상태: 없음 +- 사유 유형: 없음 +- 결정 필요: 없음 +- 차단 근거: 없음 +- 실행한 검증/명령: 없음 +- 재개 조건: 없음 + +## 리뷰어를 위한 체크포인트 + +- predecessor complete logs 없이 closeout을 진행하지 않았는가 +- 모든 roadmap checkbox가 docs evidence 또는 accepted blocker resolution과 연결되는가 +- `[검토중]` 전환 시 archive 이동을 하지 않았는가 + +## 검증 결과 + +### VALIDATION-1 중간 검증 +```sh +$ find agent-task/archive -path '*/m-runtime-image-validation/01_repo_app_validation/complete.log' -o -path '*/m-runtime-image-validation/02_consumer_project_validation/complete.log' | sort +(output) +``` + +### VALIDATION-2 중간 검증 +```sh +$ rg --sort path -n "SKIP|BLOCKED|TODO|Follow-up" docs/runtime-image-validation.md +(output) +``` + +### VALIDATION-3 중간 검증 +```sh +$ rg --sort path -n "^- \\[[ x]\\] \\[[^]]+\\]|^\\[검토중\\]|완료 리뷰|상태:" agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +(output) +``` + +### VALIDATION-4 중간 검증 +```sh +$ test -f agent-roadmap/current.md +$ test -f agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +$ agent-ops/bin/roadmap-dependency-checker.sh --find-milestone "nexo:agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md" both ../.agent-roadmap-sync/locks.yaml +$ git diff --check +(output) +``` + +### 최종 검증 +```sh +$ bin/test +$ bin/lint +$ git diff --check +(output) +``` diff --git a/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/PLAN-cloud-G07.md b/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/PLAN-cloud-G07.md new file mode 100644 index 00000000..b27724e0 --- /dev/null +++ b/agent-task/m-runtime-image-validation/03+01,02_evidence_matrix_closeout/PLAN-cloud-G07.md @@ -0,0 +1,152 @@ + + +# Plan - Evidence Matrix Closeout + +## 이 파일을 읽는 구현 에이전트에게 + +이 subtask는 `01_repo_app_validation`과 `02_consumer_project_validation`이 PASS되어 `complete.log`를 남긴 뒤 시작한다. 완료 evidence가 부족하면 roadmap을 `[검토중]`으로 올리지 말고 blocker를 review stub에 기록한다. + +## 배경 + +Milestone closeout은 evidence matrix와 roadmap 체크박스가 같은 사실을 말해야 한다. 현재 image/runtime tasks만 `[x]`이고 app/consumer/evidence tasks는 아직 열려 있다. + +## 사용자 리뷰 요청 흐름 + +남은 `SKIP`/`BLOCKED`가 Milestone 범위 제외인지 사용자 결정이 필요하면 `사용자 리뷰 요청`에 남긴다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` +- `docs/runtime-image-validation.md` +- `agent-roadmap/current.md` +- `agent-roadmap/phase/product-foundation/PHASE.md` +- `agent-ops/rules/common/rules-roadmap.md` + +### 테스트 커버리지 공백 + +- closeout 자체는 문서/roadmap consistency 작업이다. +- app/consumer verification output은 predecessor task의 `complete.log`와 updated docs를 source of truth로 삼는다. + +### 심볼 참조 + +- none. 문서/roadmap update only. + +### 분할 판단 + +- This subtask is dependent: `03+01,02_evidence_matrix_closeout` waits for `01_repo_app_validation` and `02_consumer_project_validation`. +- It is separated because roadmap status transition should happen only after both evidence-producing subtasks complete. + +### 범위 결정 근거 + +- 이 작업은 `docs/runtime-image-validation.md`와 current Milestone roadmap만 갱신한다. +- archive 이동은 사용자 완료 승인 전에는 수행하지 않는다. +- `agent-roadmap/archive/**`는 읽지 않는다. + +### 빌드 등급 + +- build=`cloud-G07`, review=`cloud-G07`: roadmap state transition depends on external evidence from split tasks and lock/check consistency. + +## 구현 체크리스트 + +- [ ] [VALIDATION-1] predecessor `complete.log`와 docs evidence를 확인해 app/consumer tasks 완료 여부를 판정한다. +- [ ] [VALIDATION-2] `docs/runtime-image-validation.md` matrix에서 의도치 않은 `SKIP`/`BLOCKED`가 없는지 정리한다. +- [ ] [VALIDATION-3] Milestone 기능 체크박스를 evidence 기준으로 갱신하고, 모두 충족되면 `[검토중]`과 완료 리뷰 요청을 남긴다. +- [ ] [VALIDATION-4] roadmap/current/phase path와 workspace lock 상태를 검증한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +### [VALIDATION-1] Predecessor Evidence Gate + +문제: roadmap closeout이 evidence-producing subtasks보다 먼저 실행되면 완료 판정이 추정이 된다. + +해결 방법: `agent-task/archive/YYYY/MM/m-runtime-image-validation/01_repo_app_validation/complete.log`와 `02_consumer_project_validation/complete.log`를 확인한다. 둘 중 하나가 없으면 이 task를 진행하지 않는다. + +수정 파일 및 체크리스트: + +- [ ] 변경 없음 또는 blocker 기록 + +테스트 작성: skip. File-state gate다. + +중간 검증: + +```sh +find agent-task/archive -path '*/m-runtime-image-validation/01_repo_app_validation/complete.log' -o -path '*/m-runtime-image-validation/02_consumer_project_validation/complete.log' | sort +``` + +### [VALIDATION-2] Evidence Matrix Normalize + +문제: `docs/runtime-image-validation.md`에 남은 `SKIP`/`BLOCKED`가 있으면 Milestone 완료와 충돌할 수 있다. + +해결 방법: `SKIP`는 실제 PASS, 사용자 승인된 범위 제외, 또는 blocker 중 하나로 정리한다. blocker면 `[검토중]`으로 전환하지 않는다. + +수정 파일 및 체크리스트: + +- [ ] `docs/runtime-image-validation.md` + +테스트 작성: skip. Documentation consistency. + +중간 검증: + +```sh +rg --sort path -n "SKIP|BLOCKED|TODO|Follow-up" docs/runtime-image-validation.md +``` + +### [VALIDATION-3] Roadmap Completion Update + +문제: Milestone `repo-smoke`, `consumer-projects`, `evidence-matrix` tasks가 unchecked 상태다. + +해결 방법: docs evidence와 predecessor logs로 각 task를 `[x]` 처리한다. 모든 기능 task가 `[x]`이면 상태를 `[검토중]`으로 바꾸고 완료 리뷰를 `요청됨`으로 갱신한다. 사용자 archive 승인은 남겨둔다. + +수정 파일 및 체크리스트: + +- [ ] `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` + +테스트 작성: skip. Roadmap state update. + +중간 검증: + +```sh +rg --sort path -n "^- \\[[ x]\\] \\[[^]]+\\]|^\\[검토중\\]|완료 리뷰|상태:" agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +``` + +### [VALIDATION-4] Roadmap/Lock Verification + +문제: roadmap update는 active path와 workspace lock consistency를 유지해야 한다. + +해결 방법: current paths, phase milestone path, lock checker, whitespace를 검증한다. + +수정 파일 및 체크리스트: + +- [ ] 필요 시 `agent-roadmap/current.md` +- [ ] 필요 시 `agent-roadmap/phase/product-foundation/PHASE.md` + +테스트 작성: skip. Roadmap structural validation. + +중간 검증: + +```sh +test -f agent-roadmap/current.md +test -f agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +agent-ops/bin/roadmap-dependency-checker.sh --find-milestone "nexo:agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md" both ../.agent-roadmap-sync/locks.yaml +git diff --check +``` + +## 수정 파일 요약 + +| 파일 | 항목 | +|---|---| +| `docs/runtime-image-validation.md` | VALIDATION-2 | +| `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` | VALIDATION-3 | +| `agent-roadmap/current.md` | VALIDATION-4, only if active window needs sync | +| `agent-roadmap/phase/product-foundation/PHASE.md` | VALIDATION-4, only if status/flow needs sync | + +## 최종 검증 + +```sh +bin/test +bin/lint +git diff --check +``` + +모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/docs/runtime-image-validation.md b/docs/runtime-image-validation.md index 6ccc1a87..23bf0c50 100644 --- a/docs/runtime-image-validation.md +++ b/docs/runtime-image-validation.md @@ -104,9 +104,10 @@ This section presents the verification matrix for nexo local/remote runtime comp | **Remote Runtime Smoke** | `ssh toki@toki-labs.com '...'` | Remote host (`toki-labs.com` Mac ARM64) | Active system ping returns `"status":"OK"`, docker compose services are healthy. | `{"status":"OK"}`, all containers (`core`, `db`, `push-proxy`) show Up and healthy on ports `18065`/`18066`. | **PASS** | | **Unit & Widget Tests** | `bin/test` | Local workspace container | All tests in `packages/messaging_flutter` and `apps/flutter-test` pass successfully. | `All tests passed!` output from both Flutter plugin package and test app. | **PASS** | | **Static Code Analysis** | `bin/lint` | Local workspace container | Both projects analyze cleanly with zero static issues or lint warnings. | `Analyzing messaging_flutter... No issues found!`, `Analyzing flutter-test... No issues found!`. | **PASS** | -| **Android Build Unit Tests** | `./gradlew testDebugUnitTest` | `apps/flutter-test/android` | Gradle compiles and runs native unit tests for the Android host wrapper. | `command -v gradle` → not found (exit=1). No local Android SDK available. | **SKIP** (manual verification in local IDE or CI runner) | -| **Original Mattermost App** | `npm run lint` / `npm test` | `apps/mattermost/` | ESLint, TypeScript check, and Jest unit tests pass. | `command -v eslint` → not found (exit=1). `test -d apps/mattermost/node_modules` → exit=1 (not installed). | **SKIP** (to be executed in full frontend client build environment) | -| **Detox E2E Testing** | `npm run e2e:android` / `npm run e2e:ios` | `apps/mattermost/detox` | Detox builds and executes end-to-end user flows against the emulated app. | `command -v detox` → not found (exit=1). `test -d apps/mattermost/detox/node_modules` → exit=1 (not installed). | **SKIP** (requires dedicated remote emulator device runner) | +| **Android Build Unit Tests** | `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/flutter-test/android && ./gradlew testDebugUnitTest'` | Remote host Android SDK (`emulator-5554`) | Gradle compiles and runs native unit tests for the Android host wrapper. | Remote Gradle test completed with `BUILD SUCCESSFUL in 22s`; `NexoMessagingPluginTest > onMethodCall_getPlatformVersion_returnsExpectedValue() PASSED`. | **PASS** | +| **Flutter Integration Test** | `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/flutter-test && flutter test && flutter test integration_test -d emulator-5554'` | Remote host Flutter + Android emulator (`emulator-5554`) | Integration test validates plugin debug event flow on connected device/emulator. | Widget tests passed (`4/4`), debug APK built/installed on `emulator-5554`, and integration suite completed with all `3` tests passing. | **PASS** | +| **Original Mattermost App** | `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/mattermost && npm ci && npm run check-test'` | Remote host Node/Ruby/watchman Mattermost workspace | Dependencies install, ESLint + TypeScript check + Jest unit tests pass. | `npm ci` completed after remote Ruby/watchman setup. `npm run check-test` executed ESLint/TypeScript/Jest but failed `app/components/formatted_date/index.test.tsx`: `Test Suites: 1 failed, 2 skipped, 611 passed`; `Tests: 2 failed, 7 skipped, 8160 passed`; Korean snapshot expected `AM` but received `오전`. A Node `22.22.3` targeted retry produced the same `2` snapshot failures. | **FAIL** — check whether the upstream Mattermost locale snapshots should be updated/pinned for this test host. | +| **Detox E2E Testing** | `ssh toki@toki-labs.com 'cd ~/works/nexo/apps/mattermost && npm run e2e:android'` | Remote host Android emulator + Mattermost runtime | Detox builds and executes end-to-end user flows against the emulated app. | Detox dependencies installed, but Android build failed before test-account login: `:app:processDebugGoogleServices FAILED` because `google-services.json` is missing from `apps/mattermost/android/app` or expected `src/debug` locations. No matching file was found under the remote nexo work/compose paths. | **BLOCKED** — requires a Firebase `google-services.json` debug config or Gradle/test build adjustment before Detox can run. | ---