From 916d8b1049e0af5d4e68fcfa037f114cf87951e0 Mon Sep 17 00:00:00 2001 From: toki Date: Thu, 28 May 2026 09:54:26 +0900 Subject: [PATCH] feat: runtime-image-validation milestone and task plans - Add runtime-image-validation roadmap milestone - Add task plans for image publish, remote compose, and validation matrix --- .../milestones/runtime-image-validation.md | 32 ++-- .../01_image_publish/CODE_REVIEW-cloud-G07.md | 119 ++++++++++++++ .../01_image_publish/PLAN-cloud-G07.md | 135 +++++++++++++++ .../CODE_REVIEW-cloud-G07.md | 112 +++++++++++++ .../02+01_remote_compose/PLAN-cloud-G07.md | 155 ++++++++++++++++++ .../CODE_REVIEW-cloud-G07.md | 116 +++++++++++++ .../03+02_validation_matrix/PLAN-cloud-G07.md | 140 ++++++++++++++++ 7 files changed, 797 insertions(+), 12 deletions(-) create mode 100644 agent-task/m-runtime-image-validation/01_image_publish/CODE_REVIEW-cloud-G07.md create mode 100644 agent-task/m-runtime-image-validation/01_image_publish/PLAN-cloud-G07.md create mode 100644 agent-task/m-runtime-image-validation/02+01_remote_compose/CODE_REVIEW-cloud-G07.md create mode 100644 agent-task/m-runtime-image-validation/02+01_remote_compose/PLAN-cloud-G07.md create mode 100644 agent-task/m-runtime-image-validation/03+02_validation_matrix/CODE_REVIEW-cloud-G07.md create mode 100644 agent-task/m-runtime-image-validation/03+02_validation_matrix/PLAN-cloud-G07.md 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 19579cd3..12411f17 100644 --- a/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md +++ b/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md @@ -20,15 +20,19 @@ ## 구현 잠금 -- 상태: 잠금 +- 상태: 해제 - 결정 필요: - - [ ] nexo-owned Mattermost server/webapp image와 push-proxy image를 어디에 배포할지 결정한다. 후보: GHCR, private Docker registry, Docker Hub private repo, 원격 Mac host local registry. - - [ ] 각 환경이 이미지를 어떻게 받을지 결정한다. 후보: registry pull, SSH 기반 image load, remote build, CI artifact 전달. - - [ ] image tag/version 정책과 rollback 기준을 정한다. 후보: upstream SHA 기반 tag, nexo release tag, date/build-number tag 병행. - - [ ] registry 인증과 consumer project secret 전달 방식을 정한다. - - [ ] 원격 Mac ARM64 환경에서 multi-arch image를 만들지, amd64 image를 유지할지, 또는 remote build를 ARM64 기준으로 전환할지 정한다. -- 결정 완료: - 없음 +- 결정 완료: + - [x] nexo-owned Mattermost server/webapp image와 push-proxy image의 개발 검증용 배포 위치는 원격 Mac `~/docker/services/registry`의 Docker Registry v2로 둔다. + - [x] canonical push/pull 주소는 nginx HTTPS proxy인 `toki-labs.com:5050/:`를 사용한다. + - [x] LAN 직결 점검용 주소는 `http://192.168.0.97:5051`로 둔다. `192.168.0.97:5000`은 registry가 아니며, `https://192.168.0.97:5050`은 인증서 hostname mismatch가 나므로 표준 주소로 쓰지 않는다. + - [x] 이미지 수신 방식은 registry pull을 기본으로 한다. 현재 작업 컨테이너에는 Docker CLI가 없으므로 초기 build/push 검증은 `ssh toki@toki-labs.com` 경유로 원격 Mac의 `/usr/local/bin/docker`를 사용한다. + - [x] 현재 개발 검증 단계에서는 registry 인증 없이 pull 가능한 상태를 사용한다. 장기 registry 인증, consumer project secret 전달, production hardening은 image 수신에 필요한 최소 범위를 넘으면 후속 운영화 Milestone에서 다룬다. + - [x] image tag/version 정책은 immutable tag와 stable pointer tag를 함께 사용한다. immutable tag 형식은 `-nexo..-g`로 두고, evidence에는 immutable tag와 digest를 기록한다. + - [x] `latest`는 최신 빌드가 아니라 최신 검증 완료 stable image를 가리키는 moving tag로 사용한다. consumer compose는 `:latest`를 사용할 수 있지만 배포 시 `docker compose pull && docker compose up -d`로 갱신한다. + - [x] rollback은 이전 immutable tag 또는 digest를 다시 `latest`로 promote하거나, compose를 이전 immutable tag로 pinning하는 방식으로 처리한다. + - [x] 이 Milestone의 target architecture는 원격 Mac 전용 `linux/arm64`로 고정한다. multi-arch manifest와 amd64 image 유지는 이번 범위에서 제외한다. ## 범위 @@ -45,9 +49,9 @@ Mattermost server/webapp과 push-proxy를 원격 Mac에서 재현 가능하게 받는 image 배포 단위로 전환한다. -- [ ] [image-registry] nexo-owned image를 배포할 registry/artifact 위치, pull/auth 방식, tag/rollback 규칙을 정리한다. -- [ ] [core-image] Mattermost server/webapp runtime image를 현재 source snapshot 또는 upstream 기준선에서 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag와 architecture를 확인한다. -- [ ] [push-proxy-image] mattermost-push-proxy image를 `services/push-proxy` 기준선에서 빌드하고 원격 환경이 받을 수 있게 한다. 검증: 선택한 배포 위치에서 원격 Mac이 image를 pull/load하고 `docker image inspect`로 tag와 architecture를 확인한다. +- [ ] [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가 성공한다. ### Epic: [repo-smoke] Current repo smoke/e2e @@ -82,13 +86,17 @@ Mattermost server/webapp과 push-proxy를 원격 Mac에서 재현 가능하게 - Mattermost 앱이나 consumer 프로젝트의 제품 UI/business logic 재설계는 이 Milestone 범위가 아니다. - 운영 production hardening, nginx/TLS, 장기 secret manager 도입은 image 수신에 필요한 최소 인증 범위를 넘으면 후속 운영화 Milestone에서 다룬다. +- multi-arch manifest, amd64 image 유지, amd64 소비 환경 검증은 이 Milestone 범위가 아니다. - `../nomadcode`, `../iop`, `../alt`의 독자 로드맵 상태 전환은 각 프로젝트에서 별도 요청으로 처리한다. - iOS/macOS push 구현 고도화는 이 Milestone의 필수 범위가 아니다. ## 작업 컨텍스트 - 관련 경로: `services/core/`, `services/core/compose/`, `services/push-proxy/`, `apps/mattermost/`, `apps/flutter-test/`, `packages/messaging_flutter/`, `../nomadcode`, `../iop`, `../alt` -- 표준선(선택): 원격 Mac ARM64에서 amd64 image 에뮬레이션이 불안정하므로, image 배포 방식 결정 전에는 runtime smoke를 완료로 처리하지 않는다. +- image tag 표준선: build output은 immutable tag `-nexo..-g`로 추적하고, `latest`는 검증 완료 후 promote되는 stable pointer로만 쓴다. +- 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 registry, pull/auth 방식, tag/rollback 정책, target architecture +- 확인 필요: 실제 nexo-owned core/push-proxy image push/pull evidence, remote compose 전환 smoke evidence diff --git a/agent-task/m-runtime-image-validation/01_image_publish/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-image-validation/01_image_publish/CODE_REVIEW-cloud-G07.md new file mode 100644 index 00000000..bfeedc1b --- /dev/null +++ b/agent-task/m-runtime-image-validation/01_image_publish/CODE_REVIEW-cloud-G07.md @@ -0,0 +1,119 @@ + + +# Code Review Reference - IMG + +> **[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/01_image_publish, plan=0, tag=IMG + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. +리뷰 완료는 아래 순서까지 끝난 상태를 의미합니다. + +1. 판정을 append한다. +2. `CODE_REVIEW-cloud-G07.md` -> `code_review_cloud_G07_N.log`, `PLAN-cloud-G07.md` -> `plan_cloud_G07_M.log`로 아카이브한다. +3. PASS이면 `complete.log` 작성 후 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/01_image_publish/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. +4. PASS이고 task group이 `m-runtime-image-validation`이면 완료 이벤트 메타데이터를 보고하고 roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. +5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [IMG-1] Mac ARM64 image publish wrapper와 evidence 문서 | [ ] | +| [IMG-2] nexo-owned latest image publish와 digest evidence | [ ] | + +## 구현 체크리스트 + +- [ ] [IMG-1] Mac ARM64 image publish wrapper와 evidence 문서를 추가한다. +- [ ] [IMG-2] `toki-labs.com:5050/nexo/mattermost:latest`와 `toki-labs.com:5050/nexo/push-proxy:latest`를 검증 완료 stable image로 publish하고 digest evidence를 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. +> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다. +- [ ] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_N.log`로 아카이브한다. +- [ ] active `PLAN-cloud-G07.md`를 `plan_cloud_G07_M.log`로 아카이브한다. +- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/01_image_publish/`로 이동한다. +- [ ] PASS이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고 roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. +- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성하고 `complete.log`를 작성하지 않는다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 사용자 리뷰 요청 + +_기본값은 `없음`이다. 구현 중 사용자 결정, 외부 환경 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. code-review가 이 내용을 검증해 `USER_REVIEW.md`를 작성한다._ + +- 상태: 없음 +- 사유 유형: 없음 +- 결정 필요: 없음 +- 차단 근거: 없음 +- 실행한 검증/명령: 없음 +- 재개 조건: 없음 + +## 리뷰어를 위한 체크포인트 + +- `latest`가 최신 빌드가 아니라 검증 완료 stable pointer로만 promote됐는지 확인한다. +- published manifest가 `linux/arm64`인지, digest가 evidence 문서와 일치하는지 확인한다. +- wrapper가 secrets를 repo에 쓰지 않고 원격 임시 파일을 정리하는지 확인한다. + +## 검증 결과 + +_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._ + +### IMG-1 중간 검증 +```sh +$ bash -n bin/publish-runtime-images +(output) +$ rg --sort path -n "toki-labs.com:5050|linux/arm64|latest|digest" bin docs +(output) +``` + +### IMG-2 중간 검증 +```sh +$ curl -fsS https://toki-labs.com:5050/v2/_catalog +(output) +$ ssh toki@toki-labs.com '/usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/mattermost:latest >/tmp/nexo-mm-latest.manifest.json && /usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/push-proxy:latest >/tmp/nexo-push-latest.manifest.json && grep -H "\"architecture\": \"arm64\"" /tmp/nexo-*-latest.manifest.json' +(output) +``` + +### 최종 검증 +```sh +$ bash -n bin/publish-runtime-images +(output) +$ rg --sort path -n "toki-labs.com:5050|linux/arm64|latest|digest|nexo/mattermost|nexo/push-proxy" bin docs +(output) +$ curl -fsS https://toki-labs.com:5050/v2/_catalog +(output) +$ ssh toki@toki-labs.com '/usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/mattermost:latest >/tmp/nexo-mm-latest.manifest.json && /usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/push-proxy:latest >/tmp/nexo-push-latest.manifest.json && grep -H "\"architecture\": \"arm64\"" /tmp/nexo-*-latest.manifest.json' +(output) +``` + +## 코드리뷰 결과 + +_리뷰 에이전트가 append한다._ diff --git a/agent-task/m-runtime-image-validation/01_image_publish/PLAN-cloud-G07.md b/agent-task/m-runtime-image-validation/01_image_publish/PLAN-cloud-G07.md new file mode 100644 index 00000000..4297aa16 --- /dev/null +++ b/agent-task/m-runtime-image-validation/01_image_publish/PLAN-cloud-G07.md @@ -0,0 +1,135 @@ + + +# Plan - IMG + +## 이 파일을 읽는 구현 에이전트에게 + +`CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 반드시 실제 구현 내용과 검증 출력으로 채운다. 검증을 실행하고 active 파일을 그대로 둔 채 리뷰 준비를 보고한다. 사용자 결정, 외부 환경 준비, 범위 충돌 없이는 진행할 수 없으면 review stub의 `사용자 리뷰 요청` 섹션에 근거와 재개 조건을 채우고 중단한다. `USER_REVIEW.md`, log archive, `complete.log` 작성은 code-review 전용이다. + +## 배경 + +Milestone은 원격 Mac 전용 `linux/arm64` 이미지를 `toki-labs.com:5050` registry에 배포하기로 결정됐다. 현재 compose는 upstream amd64/core image와 upstream latest push-proxy를 직접 사용하므로, 먼저 nexo-owned 이미지가 실제로 build/push/pull 되는 증거가 필요하다. + +## 사용자 리뷰 요청 흐름 + +구현 중 차단 사항은 active `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/current.md` +- `agent-roadmap/phase/product-foundation/PHASE.md` +- `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` +- `agent-ops/rules/project/domain/workspace-ops/rules.md` +- `agent-ops/rules/project/domain/core-service/rules.md` +- `services/core/compose/docker-compose.yml` +- `services/core/compose/README.md` +- `services/core/compose/.env.example` +- `services/core/UPSTREAM.md` +- `services/core/server/build/Dockerfile` +- `services/core/server/build/passwd` +- `services/push-proxy/Makefile` +- `services/push-proxy/docker/Dockerfile` +- `services/push-proxy/docker/entrypoint` +- `services/push-proxy/UPSTREAM.md` +- `bin/test` +- `bin/lint` +- `bin/build` +- 원격 `~/docker/services/nexo/compose/docker-compose.yml` + +### 테스트 커버리지 공백 + +- 이미지 build/push/pull 경로는 기존 자동 테스트가 없다. 실제 검증은 원격 Mac의 `/usr/local/bin/docker`, registry API, `docker manifest inspect`, `docker image inspect` 출력으로 대체한다. +- core image는 `services/core/server/build/Dockerfile`이 `MM_PACKAGE` URL을 받지만, 이 repo에는 nexo-owned publish wrapper가 없다. +- push-proxy는 ARM64 build target이 있으나 Makefile의 기본 Docker run option은 `linux/amd64`이고 multi-arch target도 포함한다. 이번 작업은 Mac 전용 `linux/arm64`만 검증해야 한다. + +### 심볼 참조 + +- none. 심볼 rename/remove 작업이 아니다. + +### 분할 판단 + +Split policy를 먼저 평가했다. `m-runtime-image-validation` 아래 split work로 진행한다. +- `01_image_publish`: nexo-owned image build/push/pull evidence를 만든다. 선행 없음. +- `02+01_remote_compose`: 01 완료 후 compose를 nexo-owned `latest` image로 전환한다. +- `03+02_validation_matrix`: 02 완료 후 repo와 consumer smoke/e2e evidence를 정리한다. + +### 범위 결정 근거 + +- `services/core/UPSTREAM.md` baseline은 변경하지 않는다. +- `services/core/server/`와 `services/push-proxy/` upstream source는 최소 wrapper/문서 외에는 수정하지 않는다. +- registry auth, production hardening, multi-arch manifest, amd64 image는 Milestone 범위 제외다. +- 원격 `~/docker/services/nexo/compose`는 이 task에서 전환하지 않는다. 이 task는 publish evidence까지만 만든다. + +### 빌드 등급 + +- build=`cloud-G07`, review=`cloud-G07`. SSH, Docker build/push, registry API, stdout/stderr 계약이 성공 조건인 terminal-agent 작업이다. + +## 구현 체크리스트 + +- [ ] [IMG-1] Mac ARM64 image publish wrapper와 evidence 문서를 추가한다. +- [ ] [IMG-2] `toki-labs.com:5050/nexo/mattermost:latest`와 `toki-labs.com:5050/nexo/push-proxy:latest`를 검증 완료 stable image로 publish하고 digest evidence를 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +### [IMG-1] Publish Wrapper And Evidence Doc + +문제: `services/core/compose/docker-compose.yml:27`은 `mattermost/mattermost-team-edition:11.4.2`, `:28`은 `linux/amd64`, `:58`은 `mattermost/mattermost-push-proxy:latest`를 직접 참조한다. 반복 가능한 nexo-owned image publish entrypoint와 evidence 문서가 없다. + +해결 방법: root `bin/`에 얇은 publish wrapper를 추가하고, `docs/runtime-image-validation.md`에 registry/tag/architecture/evidence 표를 만든다. wrapper는 기본값을 `toki-labs.com:5050`, `linux/arm64`, `nexo/mattermost`, `nexo/push-proxy`로 둔다. core는 `services/core/server/build/Dockerfile`에 `MM_PACKAGE=https://releases.mattermost.com/11.4.2/mattermost-team-11.4.2-linux-arm64.tar.gz`를 넘긴다. push-proxy는 원격 임시 디렉터리에 source tar를 풀고 Dockerized Go build로 ARM64 dist를 만든 뒤 `docker build --platform linux/arm64`로 image를 만든다. + +수정 파일 및 체크리스트: +- [ ] `bin/publish-runtime-images`를 추가하고 `bash -n`이 통과하게 한다. +- [ ] `docs/runtime-image-validation.md`를 추가해 immutable tag, `latest` promotion, digest, remote command evidence 표를 둔다. +- [ ] `docs/README.md` runtime index에 새 문서 링크를 추가한다. + +테스트 작성: 자동 unit test는 작성하지 않는다. shell wrapper와 원격 Docker 동작은 명령 기반 smoke가 검증한다. + +중간 검증: + +```sh +bash -n bin/publish-runtime-images +rg --sort path -n "toki-labs.com:5050|linux/arm64|latest|digest" bin docs +``` + +기대 결과: syntax error가 없고, registry/tag/architecture/evidence 문구가 새 wrapper와 문서에 나타난다. + +### [IMG-2] Build Push Pull Evidence + +문제: 원격 Docker는 동작하지만 현재 registry catalog에는 `nexo/mattermost`와 `nexo/push-proxy` image가 없다. upstream `mattermost/mattermost-team-edition:11.4.2` manifest는 amd64뿐이므로 Mac 전용 core image는 ARM64 package로 새로 만들어야 한다. + +해결 방법: `bin/publish-runtime-images`를 실행해 immutable tag와 `latest`를 push한다. `latest`는 최신 빌드가 아니라 이 task에서 검증 통과한 stable pointer로만 promote한다. build 후 원격 Mac에서 pull, inspect, digest 기록을 수행하고 `docs/runtime-image-validation.md`에 결과를 남긴다. + +수정 파일 및 체크리스트: +- [ ] `docs/runtime-image-validation.md`에 core/push-proxy immutable tag, digest, `latest` digest, architecture evidence를 기록한다. +- [ ] registry API catalog와 manifest inspect 결과를 `CODE_REVIEW-cloud-G07.md` 검증 결과에 붙인다. + +테스트 작성: 별도 test file은 작성하지 않는다. 실제 registry push/pull과 Docker inspect가 acceptance test다. + +중간 검증: + +```sh +curl -fsS https://toki-labs.com:5050/v2/_catalog +ssh toki@toki-labs.com '/usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/mattermost:latest >/tmp/nexo-mm-latest.manifest.json && /usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/push-proxy:latest >/tmp/nexo-push-latest.manifest.json && grep -H "\"architecture\": \"arm64\"" /tmp/nexo-*-latest.manifest.json' +``` + +기대 결과: catalog 조회가 성공하고 두 latest manifest가 `arm64` architecture를 포함한다. + +## 수정 파일 요약 + +| 파일 | 항목 | +|------|------| +| `bin/publish-runtime-images` | IMG-1, IMG-2 | +| `docs/runtime-image-validation.md` | IMG-1, IMG-2 | +| `docs/README.md` | IMG-1 | + +## 최종 검증 + +```sh +bash -n bin/publish-runtime-images +rg --sort path -n "toki-labs.com:5050|linux/arm64|latest|digest|nexo/mattermost|nexo/push-proxy" bin docs +curl -fsS https://toki-labs.com:5050/v2/_catalog +ssh toki@toki-labs.com '/usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/mattermost:latest >/tmp/nexo-mm-latest.manifest.json && /usr/local/bin/docker manifest inspect toki-labs.com:5050/nexo/push-proxy:latest >/tmp/nexo-push-latest.manifest.json && grep -H "\"architecture\": \"arm64\"" /tmp/nexo-*-latest.manifest.json' +``` + +모든 명령은 fresh 실행이어야 하며 cached output은 허용하지 않는다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-runtime-image-validation/02+01_remote_compose/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-image-validation/02+01_remote_compose/CODE_REVIEW-cloud-G07.md new file mode 100644 index 00000000..d920ab05 --- /dev/null +++ b/agent-task/m-runtime-image-validation/02+01_remote_compose/CODE_REVIEW-cloud-G07.md @@ -0,0 +1,112 @@ + + +# Code Review Reference - REMOTE + +> **[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. + +## 개요 + +date=2026-05-28 +task=m-runtime-image-validation/02+01_remote_compose, plan=0, tag=REMOTE + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [REMOTE-1] local compose image defaults | [ ] | +| [REMOTE-2] remote compose sync and smoke | [ ] | + +## 구현 체크리스트 + +- [ ] [REMOTE-1] local compose를 nexo-owned `latest` image와 Mac 전용 `linux/arm64` platform 기준으로 전환한다. +- [ ] [REMOTE-2] local compose 변경을 원격 `~/docker/services/nexo/compose`에 반영하고 pull/up/smoke evidence를 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_N.log`로 아카이브한다. +- [ ] active `PLAN-cloud-G07.md`를 `plan_cloud_G07_M.log`로 아카이브한다. +- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/02+01_remote_compose/`로 이동한다. +- [ ] PASS split 작업이면 이동 후 빈 active parent 상태를 확인한다. +- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성하고 `complete.log`를 작성하지 않는다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 사용자 리뷰 요청 + +_기본값은 `없음`이다. 구현 중 사용자 결정, 외부 환경 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. code-review가 이 내용을 검증해 `USER_REVIEW.md`를 작성한다._ + +- 상태: 없음 +- 사유 유형: 없음 +- 결정 필요: 없음 +- 차단 근거: 없음 +- 실행한 검증/명령: 없음 +- 재개 조건: 없음 + +## 리뷰어를 위한 체크포인트 + +- `docker-compose.yml` 기본 image가 `toki-labs.com:5050/nexo/*:latest`이고 platform이 `linux/arm64`인지 확인한다. +- README가 `latest` stable pointer와 `docker compose pull && docker compose up -d` 운영을 설명하는지 확인한다. +- remote smoke 출력이 실제 원격 명령 결과인지 확인한다. + +## 검증 결과 + +### REMOTE-1 중간 검증 +```sh +$ cd services/core/compose +$ rg --sort path -n "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64|NEXO_.*IMAGE" docker-compose.yml .env.example README.md +(output) +``` + +### REMOTE-2 중간 검증 +```sh +$ cd services/core/compose +$ sha256sum docker-compose.yml .env.example +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml' +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" && /usr/local/bin/docker compose ps push-proxy' +(output) +``` + +### 최종 검증 +```sh +$ test -f agent-task/m-runtime-image-validation/01_image_publish/complete.log +(output) +$ cd services/core/compose +$ rg --sort path -n "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64|NEXO_.*IMAGE" docker-compose.yml .env.example README.md +(output) +$ sha256sum docker-compose.yml .env.example +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml' +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" && /usr/local/bin/docker compose ps push-proxy' +(output) +``` + +## 코드리뷰 결과 + +_리뷰 에이전트가 append한다._ diff --git a/agent-task/m-runtime-image-validation/02+01_remote_compose/PLAN-cloud-G07.md b/agent-task/m-runtime-image-validation/02+01_remote_compose/PLAN-cloud-G07.md new file mode 100644 index 00000000..6349b4ae --- /dev/null +++ b/agent-task/m-runtime-image-validation/02+01_remote_compose/PLAN-cloud-G07.md @@ -0,0 +1,155 @@ + + +# Plan - REMOTE + +## 이 파일을 읽는 구현 에이전트에게 + +이 task는 `agent-task/m-runtime-image-validation/01_image_publish/complete.log`가 있어야 시작한다. `CODE_REVIEW-cloud-G07.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운 뒤 active 파일을 그대로 두고 리뷰를 요청한다. 외부 환경이나 사용자 결정으로 막히면 review stub의 `사용자 리뷰 요청`을 채우고 중단한다. + +## 배경 + +core/push-proxy image가 nexo-owned registry로 publish되면 local/remote compose가 그 image를 소비해야 한다. 현재 local과 remote compose는 upstream amd64 core image와 upstream latest push-proxy image를 직접 참조한다. + +## 사용자 리뷰 요청 흐름 + +구현 중 차단 사항은 active `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/current.md` +- `agent-roadmap/phase/product-foundation/PHASE.md` +- `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` +- `agent-ops/rules/project/domain/workspace-ops/rules.md` +- `agent-ops/rules/project/domain/core-service/rules.md` +- `services/core/compose/docker-compose.yml` +- `services/core/compose/.env.example` +- `services/core/compose/README.md` +- `services/core/UPSTREAM.md` +- `bin/test` +- `bin/lint` +- `bin/build` +- 원격 `~/docker/services/nexo/compose/docker-compose.yml` + +### 테스트 커버리지 공백 + +- compose image/platform 변경은 unit test가 없다. 검증은 `docker compose config`, registry pull, remote `docker compose up -d`, HTTP/db/push-proxy smoke로 한다. +- remote parity는 README에 hash 비교가 있지만 자동화되어 있지 않다. + +### 심볼 참조 + +- none. 심볼 rename/remove 작업이 아니다. + +### 분할 판단 + +Split policy를 평가했고 이 task는 `02+01_remote_compose`로 둔다. 01의 image publish evidence 없이는 compose를 바꾸면 pull 실패가 나므로 `01_image_publish`에 의존한다. repo/consumer e2e는 다른 검증 경계라 `03+02_validation_matrix`로 분리한다. + +### 범위 결정 근거 + +- 이 task는 `services/core/compose`와 원격 `~/docker/services/nexo/compose`만 다룬다. +- `services/core/server/`, `services/push-proxy/` source, consumer project 파일은 수정하지 않는다. +- registry auth, production hardening, multi-arch/amd64는 제외한다. + +### 빌드 등급 + +- build=`cloud-G07`, review=`cloud-G07`. SSH, Docker Compose, 원격 smoke 출력이 성공 조건인 terminal-agent 작업이다. + +## 구현 체크리스트 + +- [ ] [REMOTE-1] local compose를 nexo-owned `latest` image와 Mac 전용 `linux/arm64` platform 기준으로 전환한다. +- [ ] [REMOTE-2] local compose 변경을 원격 `~/docker/services/nexo/compose`에 반영하고 pull/up/smoke evidence를 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 의존 관계 및 구현 순서 + +- 선행 subtask: `01_image_publish`. +- 시작 전 `test -f agent-task/m-runtime-image-validation/01_image_publish/complete.log`를 확인한다. + +### [REMOTE-1] Local Compose Image Defaults + +문제: `services/core/compose/docker-compose.yml:27-28`은 upstream `mattermost/mattermost-team-edition:11.4.2`와 `linux/amd64`를 사용한다. `:58`은 upstream `mattermost/mattermost-push-proxy:latest`를 사용한다. + +해결 방법: + +Before: + +```yaml +27: image: mattermost/mattermost-team-edition:11.4.2 +28: platform: linux/amd64 +58: image: mattermost/mattermost-push-proxy:latest +``` + +After: + +```yaml + image: ${NEXO_CORE_IMAGE:-toki-labs.com:5050/nexo/mattermost:latest} + platform: linux/arm64 + image: ${NEXO_PUSH_PROXY_IMAGE:-toki-labs.com:5050/nexo/push-proxy:latest} +``` + +`.env.example`에 `NEXO_CORE_IMAGE`와 `NEXO_PUSH_PROXY_IMAGE` 기본값을 추가한다. README에는 `latest`가 검증 완료 stable pointer이며 배포 시 `docker compose pull && docker compose up -d`를 실행해야 한다고 적는다. + +수정 파일 및 체크리스트: +- [ ] `services/core/compose/docker-compose.yml` +- [ ] `services/core/compose/.env.example` +- [ ] `services/core/compose/README.md` + +테스트 작성: compose 설정 변경은 별도 test file을 추가하지 않는다. `docker compose config`와 remote smoke가 검증이다. + +중간 검증: + +```sh +cd services/core/compose +rg --sort path -n "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64|NEXO_.*IMAGE" docker-compose.yml .env.example README.md +``` + +기대 결과: local compose inputs에 image/platform/env var가 모두 나타난다. 실제 compose config 검증은 원격 Docker CLI로 수행한다. + +### [REMOTE-2] Remote Compose Sync And Smoke + +문제: README는 local/remote parity를 요구하지만, 원격 compose는 아직 upstream amd64/latest image를 쓴다. nexo-owned image로 전환한 뒤 pull/up/smoke evidence가 필요하다. + +해결 방법: local compose 파일과 `.env.example`을 원격 `~/docker/services/nexo/compose`에 복사한다. 원격에서 `docker compose pull`, `docker compose up -d`, core ping, Mattermost HEAD, db readiness, push-proxy service 상태, image inspect를 실행한다. remote drift가 의도적이지 않도록 sha256sum을 기록한다. + +수정 파일 및 체크리스트: +- [ ] 원격 `~/docker/services/nexo/compose/docker-compose.yml` +- [ ] 원격 `~/docker/services/nexo/compose/.env.example` +- [ ] `docs/runtime-image-validation.md`에 remote compose smoke evidence를 추가한다. + +테스트 작성: 원격 runtime smoke가 acceptance test다. 자동 test file은 추가하지 않는다. + +중간 검증: + +```sh +cd services/core/compose +sha256sum docker-compose.yml .env.example +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml' +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" && /usr/local/bin/docker compose ps push-proxy' +``` + +기대 결과: local/remote hash가 일치하고, 원격 compose가 nexo-owned latest image를 사용하며 smoke 명령이 성공한다. + +## 수정 파일 요약 + +| 파일 | 항목 | +|------|------| +| `services/core/compose/docker-compose.yml` | REMOTE-1 | +| `services/core/compose/.env.example` | REMOTE-1 | +| `services/core/compose/README.md` | REMOTE-1 | +| `docs/runtime-image-validation.md` | REMOTE-2 | +| 원격 `~/docker/services/nexo/compose/docker-compose.yml` | REMOTE-2 | +| 원격 `~/docker/services/nexo/compose/.env.example` | REMOTE-2 | + +## 최종 검증 + +```sh +test -f agent-task/m-runtime-image-validation/01_image_publish/complete.log +cd services/core/compose +rg --sort path -n "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64|NEXO_.*IMAGE" docker-compose.yml .env.example README.md +sha256sum docker-compose.yml .env.example +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example && /usr/local/bin/docker compose --env-file .env.example config >/tmp/nexo-compose-config.yml && /usr/bin/grep -E "toki-labs.com:5050/nexo/(mattermost|push-proxy):latest|platform: linux/arm64" /tmp/nexo-compose-config.yml' +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && /usr/local/bin/docker compose pull && /usr/local/bin/docker compose up -d && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose exec -T db pg_isready -U mmuser -d mattermost && curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" && /usr/local/bin/docker compose ps push-proxy' +``` + +모든 명령은 fresh 실행이어야 하며 cached output은 허용하지 않는다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/agent-task/m-runtime-image-validation/03+02_validation_matrix/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-image-validation/03+02_validation_matrix/CODE_REVIEW-cloud-G07.md new file mode 100644 index 00000000..2f7cf118 --- /dev/null +++ b/agent-task/m-runtime-image-validation/03+02_validation_matrix/CODE_REVIEW-cloud-G07.md @@ -0,0 +1,116 @@ + + +# Code Review Reference - VALIDATE + +> **[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. + +## 개요 + +date=2026-05-28 +task=m-runtime-image-validation/03+02_validation_matrix, plan=0, tag=VALIDATE + +## 이 파일을 읽는 리뷰 에이전트에게 + +> **[REVIEW AGENT ONLY]** 아래 종결 절차는 코드리뷰 에이전트 전용이다. 구현 에이전트는 이 섹션을 실행하지 않는다. + +각 항목의 구현을 실제 소스 파일과 대조하고, `검증 결과` 섹션의 출력이 코드와 일치하는지 확인하세요. + +--- + +## 구현 항목별 완료 여부 + +| 항목 | 완료 여부 | +|------|---------| +| [VALIDATE-1] current repo runtime/app evidence | [ ] | +| [VALIDATE-2] consumer project evidence | [ ] | + +## 구현 체크리스트 + +- [ ] [VALIDATE-1] 현 repo의 runtime smoke와 Flutter/Mattermost 검증 결과를 evidence matrix에 기록한다. +- [ ] [VALIDATE-2] `../nomadcode`, `../iop`, `../alt`의 setup/smoke/e2e 결과와 후속 이슈를 evidence matrix에 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 코드리뷰 전용 체크리스트 + +> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. + +- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. +- [ ] active `CODE_REVIEW-cloud-G07.md`를 `code_review_cloud_G07_N.log`로 아카이브한다. +- [ ] active `PLAN-cloud-G07.md`를 `plan_cloud_G07_M.log`로 아카이브한다. +- [ ] PASS이면 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. +- [ ] PASS이면 active task 디렉터리를 `agent-task/archive/YYYY/MM/m-runtime-image-validation/03+02_validation_matrix/`로 이동한다. +- [ ] WARN/FAIL이면 다음 active plan/review 또는 `USER_REVIEW.md`를 작성하고 `complete.log`를 작성하지 않는다. + +## 계획 대비 변경 사항 + +_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ + +## 주요 설계 결정 + +_구현 에이전트가 주요 설계 결정 사항을 기록한다._ + +## 사용자 리뷰 요청 + +_기본값은 `없음`이다. 구현 중 사용자 결정, 외부 환경 준비, 또는 계획 범위 변경 없이는 안전하게 진행할 수 없으면 아래 항목을 실제 내용으로 교체하고, 구현을 중단한 뒤 active 파일을 그대로 둔 채 리뷰를 요청한다. code-review가 이 내용을 검증해 `USER_REVIEW.md`를 작성한다._ + +- 상태: 없음 +- 사유 유형: 없음 +- 결정 필요: 없음 +- 차단 근거: 없음 +- 실행한 검증/명령: 없음 +- 재개 조건: 없음 + +## 리뷰어를 위한 체크포인트 + +- matrix가 skip과 failure를 성공처럼 포장하지 않는지 확인한다. +- consumer 프로젝트 변경이 각 프로젝트 경계 안에서만 이뤄졌는지 확인한다. +- `apps/flutter-test`가 test host 역할을 넘어서 제품 앱처럼 확장되지 않았는지 확인한다. + +## 검증 결과 + +### VALIDATE-1 중간 검증 +```sh +$ test -f agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log +(output) +$ bin/test +(output) +$ bin/lint +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose ps' +(output) +$ rg --sort path -n "apps/mattermost|apps/flutter-test|remote runtime|PASS|FAIL|follow-up" docs/runtime-image-validation.md +(output) +``` + +### VALIDATE-2 중간 검증 +```sh +$ for project in ../nomadcode ../iop ../alt; do test -d "$project" && printf '%s exists\n' "$project" || printf '%s missing\n' "$project"; done +(output) +$ rg --sort path -n "nomadcode|iop|alt|smoke|e2e|follow-up" docs/runtime-image-validation.md +(output) +``` + +### 최종 검증 +```sh +$ test -f agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log +(output) +$ bin/test +(output) +$ bin/lint +(output) +$ ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose ps' +(output) +$ for project in ../nomadcode ../iop ../alt; do test -d "$project" && printf '%s exists\n' "$project" || printf '%s missing\n' "$project"; done +(output) +$ rg --sort path -n "apps/mattermost|apps/flutter-test|nomadcode|iop|alt|smoke|e2e|PASS|FAIL|follow-up" docs/runtime-image-validation.md +(output) +``` + +## 코드리뷰 결과 + +_리뷰 에이전트가 append한다._ diff --git a/agent-task/m-runtime-image-validation/03+02_validation_matrix/PLAN-cloud-G07.md b/agent-task/m-runtime-image-validation/03+02_validation_matrix/PLAN-cloud-G07.md new file mode 100644 index 00000000..cfacb2a3 --- /dev/null +++ b/agent-task/m-runtime-image-validation/03+02_validation_matrix/PLAN-cloud-G07.md @@ -0,0 +1,140 @@ + + +# Plan - VALIDATE + +## 이 파일을 읽는 구현 에이전트에게 + +이 task는 `agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log`가 있어야 시작한다. 검증 출력을 요약하지 말고 active `CODE_REVIEW-cloud-G07.md`에 실제 stdout/stderr와 수동 e2e evidence 위치를 기록한다. 사용자 계정, 기기, 외부 프로젝트 접근이 막히면 review stub의 `사용자 리뷰 요청`에 정확한 재개 조건을 남긴다. + +## 배경 + +원격 runtime이 nexo-owned Mac ARM64 image로 전환된 뒤에는 이 repo의 Mattermost 앱과 Flutter test host, 그리고 sibling consumer 프로젝트가 같은 runtime을 실제로 사용할 수 있는지 확인해야 한다. 이 task는 제품 UI 변경이 아니라 smoke/e2e evidence matrix 작성이다. + +## 사용자 리뷰 요청 흐름 + +구현 중 차단 사항은 active `CODE_REVIEW-cloud-G07.md`의 `사용자 리뷰 요청` 섹션에 기록한다. code-review가 요청을 검증하고 실제 `USER_REVIEW.md` 작성 여부를 결정한다. + +## 분석 결과 + +### 읽은 파일 + +- `agent-roadmap/current.md` +- `agent-roadmap/phase/product-foundation/PHASE.md` +- `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` +- `agent-ops/rules/project/domain/workspace-ops/rules.md` +- `agent-ops/rules/project/domain/client-app/rules.md` +- `agent-ops/rules/project/domain/messaging-flutter/rules.md` +- `services/core/compose/README.md` +- `apps/flutter-test/README.md` +- `apps/flutter-test/pubspec.yaml` +- `apps/flutter-test/test/widget_test.dart` +- `apps/flutter-test/integration_test/plugin_integration_test.dart` +- `apps/mattermost/README.md` +- `apps/mattermost/UPSTREAM.md` +- `apps/mattermost/package.json` +- `apps/mattermost/detox/package.json` +- `docs/README.md` +- `bin/test` +- `bin/lint` +- `bin/build` + +### 테스트 커버리지 공백 + +- `apps/flutter-test` has widget/integration tests for plugin harness routing, but real FCM delivery, ACK, inline reply, and dismiss remain manual smoke checks per README. +- `apps/mattermost` has npm/detox scripts, but this task does not add app tests; it records whether existing scripts can run against the nexo-owned runtime. +- consumer projects `../nomadcode`, `../iop`, `../alt` are outside this repo. Their independent roadmap state is excluded; only setup/smoke/e2e evidence is recorded. + +### 심볼 참조 + +- none. 심볼 rename/remove 작업이 아니다. + +### 분할 판단 + +Split policy를 평가했고 이 task는 `03+02_validation_matrix`로 둔다. 02의 remote runtime smoke가 성공해야 repo/consumer validation이 의미 있으므로 `02+01_remote_compose`에 의존한다. 이 task 안에서는 code change보다 evidence collection이 중심이라 단일 plan으로 둔다. + +### 범위 결정 근거 + +- product UI/business logic 변경은 제외한다. +- `apps/mattermost` upstream clone 내부 수정은 하지 않는다. +- `apps/flutter-test`는 test host로만 사용하고 plugin logic을 복제하지 않는다. +- consumer 프로젝트의 독자 로드맵 상태 전환은 하지 않는다. + +### 빌드 등급 + +- build=`cloud-G07`, review=`cloud-G07`. 여러 앱/consumer smoke와 외부 runtime evidence를 다루는 terminal/integration 검증 작업이다. + +## 구현 체크리스트 + +- [ ] [VALIDATE-1] 현 repo의 runtime smoke와 Flutter/Mattermost 검증 결과를 evidence matrix에 기록한다. +- [ ] [VALIDATE-2] `../nomadcode`, `../iop`, `../alt`의 setup/smoke/e2e 결과와 후속 이슈를 evidence matrix에 기록한다. +- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. + +## 의존 관계 및 구현 순서 + +- 선행 subtask: `02+01_remote_compose`. +- 시작 전 `test -f agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log`를 확인한다. + +### [VALIDATE-1] Current Repo Runtime And App Evidence + +문제: `services/core/compose/README.md:36-52`는 core/db/push-proxy smoke 명령을 제공하지만, Milestone 완료에는 Mattermost 앱과 `apps/flutter-test` evidence까지 필요하다. `apps/flutter-test/README.md`는 real FCM/ACK를 manual smoke로 남긴다. + +해결 방법: `docs/runtime-image-validation.md`에 matrix를 추가하거나 갱신한다. 각 row는 target, command/manual step, environment, expected result, actual evidence, pass/fail/follow-up을 가진다. remote runtime smoke, `bin/test`, `bin/lint`, Flutter integration command availability, Mattermost npm/detox command availability를 기록한다. + +수정 파일 및 체크리스트: +- [ ] `docs/runtime-image-validation.md`에 current repo matrix 섹션을 추가/갱신한다. +- [ ] command가 도구 부재로 skip되면 `command -v ` 출력과 skip 사유를 기록한다. + +테스트 작성: 신규 automated test는 작성하지 않는다. 이 task는 기존 test/smoke 실행 evidence를 수집한다. + +중간 검증: + +```sh +test -f agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log +bin/test +bin/lint +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose ps' +rg --sort path -n "apps/mattermost|apps/flutter-test|remote runtime|PASS|FAIL|follow-up" docs/runtime-image-validation.md +``` + +기대 결과: repo-level checks가 실행 또는 명시적으로 skip되고, remote runtime smoke와 app evidence가 matrix에 남는다. + +### [VALIDATE-2] Consumer Project Evidence + +문제: Milestone은 `../nomadcode`, `../iop`, `../alt`의 smoke/e2e 확인을 요구하지만, 이 repo는 각 consumer의 내부 책임을 소유하지 않는다. + +해결 방법: 각 consumer에서 nexo runtime endpoint, `packages/messaging_flutter` path/dependency, smoke/e2e command availability, 실행 결과를 기록한다. consumer 파일을 고쳐야 할 경우 해당 프로젝트 경계 안에서 최소 변경하고, 변경 파일과 검증을 matrix에 남긴다. 독자 로드맵 상태 전환은 하지 않는다. + +수정 파일 및 체크리스트: +- [ ] `docs/runtime-image-validation.md`에 consumer matrix 섹션을 추가/갱신한다. +- [ ] consumer 프로젝트별 변경이 있으면 해당 프로젝트 경계 안에서만 수정하고, 이 review stub에 변경 파일과 검증 출력을 기록한다. + +테스트 작성: consumer 프로젝트별 기존 smoke/e2e 명령을 사용한다. 새 테스트는 각 consumer의 도메인 경계와 필요가 확인될 때만 해당 프로젝트 안에서 작성한다. + +중간 검증: + +```sh +for project in ../nomadcode ../iop ../alt; do test -d "$project" && printf '%s exists\n' "$project" || printf '%s missing\n' "$project"; done +rg --sort path -n "nomadcode|iop|alt|smoke|e2e|follow-up" docs/runtime-image-validation.md +``` + +기대 결과: 세 consumer의 존재/부재가 기록되고, matrix에 smoke/e2e 상태와 후속 이슈가 남는다. + +## 수정 파일 요약 + +| 파일 | 항목 | +|------|------| +| `docs/runtime-image-validation.md` | VALIDATE-1, VALIDATE-2 | +| consumer 프로젝트 내부 파일 | VALIDATE-2, 필요한 경우만 | + +## 최종 검증 + +```sh +test -f agent-task/m-runtime-image-validation/02+01_remote_compose/complete.log +bin/test +bin/lint +ssh toki@toki-labs.com 'cd ~/docker/services/nexo/compose && curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" && /usr/local/bin/docker compose ps' +for project in ../nomadcode ../iop ../alt; do test -d "$project" && printf '%s exists\n' "$project" || printf '%s missing\n' "$project"; done +rg --sort path -n "apps/mattermost|apps/flutter-test|nomadcode|iop|alt|smoke|e2e|PASS|FAIL|follow-up" docs/runtime-image-validation.md +``` + +모든 명령은 fresh 실행이어야 하며 cached output은 허용하지 않는다. 모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.