From 6155f1f9484f3b308714f43c058c9d726625f512 Mon Sep 17 00:00:00 2001 From: toki Date: Thu, 28 May 2026 06:46:50 +0900 Subject: [PATCH] update roadmap and archive completed milestones --- .../milestones/runtime-baseline.md | 25 ++- agent-roadmap/current.md | 4 +- .../phase/product-foundation/PHASE.md | 9 +- .../milestones/runtime-image-validation.md | 94 ++++++++ .../02_runtime_smoke/USER_REVIEW.md | 64 ++++++ .../02_runtime_smoke/CODE_REVIEW-cloud-G07.md | 159 -------------- .../02_runtime_smoke/PLAN-cloud-G07.md | 202 ------------------ scratch/askpass.sh | 2 + 8 files changed, 182 insertions(+), 377 deletions(-) rename agent-roadmap/{ => archive}/phase/product-foundation/milestones/runtime-baseline.md (84%) create mode 100644 agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md create mode 100644 agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/USER_REVIEW.md delete mode 100644 agent-task/m-runtime-baseline/02_runtime_smoke/CODE_REVIEW-cloud-G07.md delete mode 100644 agent-task/m-runtime-baseline/02_runtime_smoke/PLAN-cloud-G07.md create mode 100755 scratch/askpass.sh diff --git a/agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md b/agent-roadmap/archive/phase/product-foundation/milestones/runtime-baseline.md similarity index 84% rename from agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md rename to agent-roadmap/archive/phase/product-foundation/milestones/runtime-baseline.md index 2345bdcb..023db617 100644 --- a/agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md +++ b/agent-roadmap/archive/phase/product-foundation/milestones/runtime-baseline.md @@ -12,7 +12,7 @@ nexo용 포트, 환경 변수, 데이터 경로, push-proxy 설정을 분리하 ## 상태 -[진행중] +[완료] ## 승격 조건 @@ -50,8 +50,8 @@ nexo용 포트, 환경 변수, 데이터 경로, push-proxy 설정을 분리하 local과 원격 Docker에서 같은 shape로 Mattermost 서버와 push-proxy 런타임을 올릴 수 있게 한다. -- [ ] [local-compose] `services/core/compose`에서 core, db, push-proxy가 함께 실행되는 기준을 유지한다. 검증: `cd services/core/compose && docker compose up -d` 후 core ping과 Mattermost 앱 접근이 성공한다. -- [ ] [remote-parity] 원격 `~/docker/services/nexo/compose`와 repo의 compose 파일이 의도적으로 동기화되는 절차를 문서화한다. 검증: local/remote compose와 `.env.example` hash 비교가 일치한다. +- [x] [local-compose] `services/core/compose`에서 core, db, push-proxy가 함께 실행되는 compose 기준과 smoke 절차를 문서화했다. 실제 Mac ARM64 원격 기동과 core ping 성공 검증은 이미지 기반 런타임 검증 Milestone으로 이관한다. +- [x] [remote-parity] 원격 `~/docker/services/nexo/compose`와 repo의 compose 파일이 의도적으로 동기화되는 절차와 hash 비교 기준을 문서화했다. Mac ARM64 원격의 amd64 image 실행 blocker는 후속 이미지 마이그레이션 작업에서 해결한다. - [x] [secret-boundary] `.env`, data, push-proxy credential이 git 추적 밖에 머무는 기준을 유지한다. ### Epic: [upstream] Upstream baseline @@ -61,7 +61,7 @@ Mattermost 앱, 서버, push-proxy를 nexo 제품 앱이 아니라 원본 reposi - [x] [upstream-repos] 외부 `mattermost/` staging 폴더에 Mattermost 앱, 서버, push-proxy 원본 repository clone을 두고 repository별 upstream branch를 따라가는 기준을 기록한다. - [x] [snapshot-record] 이 저장소에 반영하는 각 snapshot의 upstream repository, branch, commit SHA, 반영 경로를 기록하는 기준을 정한다. - [x] [snapshot-mr] snapshot merge 요청은 원칙적으로 앱/서버/push-proxy repository별로 분리하고, 자동 반영 없이 diff 확인과 관련 smoke 검증 후 요청하는 절차를 문서화한다. -- [ ] [push-proxy-source] push-proxy를 latest image 참조만으로 두지 않고, 원본 repository clone 또는 source snapshot을 `services/push-proxy` 기준선에서 재현 가능한 형태로 포함한다. +- [x] [push-proxy-source] push-proxy를 latest image 참조만으로 두지 않고, 원본 repository clone 또는 source snapshot을 `services/push-proxy` 기준선에서 재현 가능한 형태로 포함했다. 실제 nexo-owned image build/publish 전환은 이미지 기반 런타임 검증 Milestone으로 이관한다. - [x] [refresh-workline] repository별 upstream branch 변경 시점 또는 의도적으로 정한 refresh 시점에 외부 staging clone에서 snapshot을 떠서 이 저장소로 merge 요청하는 절차를 문서화한다. - [x] [nexo-patch-boundary] nexo-specific patch를 upstream snapshot과 섞지 않고 compose, 문서, wrapper, 작은 명시 patch로 유지하는 기준을 문서화한다. - [x] [runtime-boundary] `apps/mattermost`는 원래 Mattermost 앱 repository clone으로 선언하고, `apps/flutter-test`는 플러그인 검증 앱 경로로만 유지한다. @@ -75,13 +75,16 @@ Mattermost 앱, 서버, push-proxy를 nexo 제품 앱이 아니라 원본 reposi ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 없음 +- 상태: 승인됨 +- 요청일: 2026-05-27 +- 완료 근거: + - Mattermost 앱, 서버, push-proxy를 원본 repository clone 기준선으로 두는 경계와 upstream refresh 기준을 문서화했다. + - `services/core/compose`의 secret boundary, smoke check, remote parity 절차를 문서화했다. + - Mac ARM64 원격 실행 실패와 custom image 전환 필요성을 후속 이미지 기반 런타임 검증 Milestone으로 이관했다. - 리뷰 필요: - - [ ] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 + - [x] 사용자가 완료 결과를 확인했다 + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 2026-05-27 사용자 요청에 따라 현재 운영 기준선 Milestone은 완료 처리하고, 남은 runtime smoke와 원격 이미지 마이그레이션 검증은 다음 Milestone으로 넘긴다. ## 범위 제외 @@ -105,5 +108,5 @@ Mattermost 앱, 서버, push-proxy를 nexo 제품 앱이 아니라 원본 reposi - credential 기준: 실제 credential 값은 git 밖에 두고, `.env.example`에는 변수명과 기대 경로/형식만 남긴다. 테스트/운영 credential 강제 분리는 실제 운영 배포 단계에서 결정한다. - 완료 근거: `README.md`가 upstream staging, snapshot record, repository별 merge request, patch boundary, runtime boundary를 기록한다. `services/core/compose/README.md`가 secret boundary, smoke check, remote parity 절차를 기록하고 `docs/README.md`가 runtime baseline 문서 위치를 연결한다. - 선행 작업: core compose 원격 테스트 배치 -- 후속 작업: 업스트림 팔로잉 기준선, CI/CD와 운영 업데이트 루프 +- 후속 작업: 이미지 기반 런타임 검증, 클라이언트 검증 기준선, 업스트림 팔로잉 기준선, CI/CD와 운영 업데이트 루프 - 확인 필요: 없음 diff --git a/agent-roadmap/current.md b/agent-roadmap/current.md index 36a70824..a1bb4437 100644 --- a/agent-roadmap/current.md +++ b/agent-roadmap/current.md @@ -7,9 +7,9 @@ ## 활성 Milestone -- [진행중] 운영 기준선 +- [계획] 이미지 기반 런타임 검증 - Phase: `agent-roadmap/phase/product-foundation/PHASE.md` - - 경로: `agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md` + - 경로: `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` ## 선택 규칙 diff --git a/agent-roadmap/phase/product-foundation/PHASE.md b/agent-roadmap/phase/product-foundation/PHASE.md index 11b8bb12..f94fe3be 100644 --- a/agent-roadmap/phase/product-foundation/PHASE.md +++ b/agent-roadmap/phase/product-foundation/PHASE.md @@ -18,9 +18,12 @@ nexo를 Mattermost 기반 서버/front/push-proxy 런타임과 nexo-owned Flutte - [완료] 정체성 기준선 - 경로: `agent-roadmap/archive/phase/product-foundation/milestones/identity-baseline.md` - 요약: 제품 이름, 메시징/알림 서비스 범위, project-owned naming의 nexo 전환 기준을 문서화했다. -- [진행중] 운영 기준선 - - 경로: `agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md` - - 요약: Mattermost server/webapp/push-proxy compose, 원격 Docker 세팅, 환경 변수, 최소 health check를 안정된 기준선으로 만든다. +- [완료] 운영 기준선 + - 경로: `agent-roadmap/archive/phase/product-foundation/milestones/runtime-baseline.md` + - 요약: Mattermost 앱, 서버, push-proxy 원본 clone 경계와 compose/secret/smoke/remote parity 문서 기준선을 고정했다. Mac ARM64 원격 image 실행 검증은 다음 Milestone으로 이관했다. +- [계획] 이미지 기반 런타임 검증 + - 경로: `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` + - 요약: nexo-owned Mattermost/push-proxy image build, 배포/수신 방식, 원격 Mac runtime 전환, 현 repo와 소비 프로젝트 smoke/e2e 검증 기준을 만든다. - [계획] 클라이언트 검증 기준선 - 경로: `agent-roadmap/phase/product-foundation/milestones/client-validation.md` - 요약: `apps/flutter-test`가 플러그인 소비 앱이자 테스트 호스트로 반복 검증을 제공하도록 고정한다. diff --git a/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md b/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md new file mode 100644 index 00000000..19579cd3 --- /dev/null +++ b/agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md @@ -0,0 +1,94 @@ +# Milestone: 이미지 기반 런타임 검증 + +## 위치 + +- Roadmap: `agent-roadmap/ROADMAP.md` +- Phase: `agent-roadmap/phase/product-foundation/PHASE.md` + +## 목표 + +원격 Mac 개발 환경에서 Mattermost server/webapp과 mattermost-push-proxy를 외부 latest image가 아니라 nexo가 통제하는 이미지로 빌드, 배포, 수신하도록 전환한다. +이미지 배포 위치와 pull/auth 방식을 정한 뒤, 이 저장소의 Mattermost 앱과 `apps/flutter-test`, 그리고 소비 프로젝트 `../nomadcode`, `../iop`, `../alt`에서 smoke 테스트와 e2e 사용자 테스트까지 이어지는 검증 기준선을 만든다. + +## 상태 + +[계획] + +## 승격 조건 + +- 없음 + +## 구현 잠금 + +- 상태: 잠금 +- 결정 필요: + - [ ] 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 기준으로 전환할지 정한다. +- 결정 완료: + - 없음 + +## 범위 + +- Mattermost server/webapp image와 mattermost-push-proxy image의 nexo-owned build/publish/pull 기준 +- 원격 Mac `~/docker/services/nexo/compose`가 nexo-owned image를 받도록 compose/runtime 전환 +- `apps/mattermost`의 smoke 테스트와 e2e 사용자 테스트 +- `apps/flutter-test`의 smoke 테스트와 e2e 사용자 테스트 +- 소비 프로젝트 `../nomadcode`, `../iop`, `../alt`의 nexo 세팅 확인, 누락 세팅 보완, smoke 테스트, e2e 사용자 테스트 +- 테스트 evidence를 남기는 실행 매트릭스와 실패 시 repo 문제/환경 문제 분리 기준 + +## 기능 + +### Epic: [images] Nexo-owned image migration + +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를 확인한다. +- [ ] [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 + +이 저장소 안에서 Mattermost 앱과 Flutter 테스트 앱이 새 runtime image 기준으로 실제 사용자 경로를 검증한다. + +- [ ] [mattermost-smoke] `apps/mattermost`가 nexo-owned runtime에 접속하는 smoke 테스트를 통과한다. +- [ ] [mattermost-e2e] `apps/mattermost`에서 로그인, 채널/메시지, 기본 알림 흐름 등 e2e 사용자 테스트 범위를 정의하고 실행 evidence를 남긴다. +- [ ] [flutter-test-smoke] `apps/flutter-test`가 `packages/messaging_flutter` 소비 앱으로 nexo-owned runtime에 접속하는 smoke 테스트를 통과한다. +- [ ] [flutter-test-e2e] `apps/flutter-test`에서 플러그인 초기화, 메시징/알림 open routing, ACK 확인 등 e2e 사용자 테스트 evidence를 남긴다. + +### Epic: [consumer-projects] Consumer project validation + +이 프로젝트를 사용할 sibling 프로젝트들이 같은 runtime/image 기준을 소비할 수 있는지 확인한다. + +- [ ] [consumer-setup] `../nomadcode`, `../iop`, `../alt`가 nexo runtime과 `packages/messaging_flutter`를 사용할 수 있게 세팅되어 있는지 확인하고, 누락된 세팅을 프로젝트별 경계 안에서 보완한다. +- [ ] [consumer-smoke] `../nomadcode`, `../iop`, `../alt` 각각에서 smoke 테스트를 실행하고 결과를 기록한다. +- [ ] [consumer-e2e] `../nomadcode`, `../iop`, `../alt` 각각에서 e2e 사용자 테스트를 실행하고 결과를 기록한다. +- [ ] [evidence-matrix] 현 repo와 consumer 프로젝트별 smoke/e2e 명령, 환경, 성공/실패 근거, 후속 이슈를 한 곳에 정리한다. + +## 완료 리뷰 + +- 상태: 없음 +- 요청일: 없음 +- 완료 근거: 없음 +- 리뷰 필요: + - [ ] 사용자가 완료 결과를 확인했다 + - [ ] archive 이동을 승인했다 +- 리뷰 코멘트: 없음 + +## 범위 제외 + +- Mattermost 앱이나 consumer 프로젝트의 제품 UI/business logic 재설계는 이 Milestone 범위가 아니다. +- 운영 production hardening, nginx/TLS, 장기 secret manager 도입은 image 수신에 필요한 최소 인증 범위를 넘으면 후속 운영화 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 registry, pull/auth 방식, tag/rollback 정책, target architecture diff --git a/agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/USER_REVIEW.md b/agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/USER_REVIEW.md new file mode 100644 index 00000000..42611098 --- /dev/null +++ b/agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/USER_REVIEW.md @@ -0,0 +1,64 @@ +# User Review Required - m-runtime-baseline/02_runtime_smoke + +## 요청 일시 + +2026-05-27 + +## 상태 + +RESOLVED + +## 사유 + +- 유형: environment-blocked +- 현재 리뷰 회차: 1 +- 최종 판정: FAIL +- 요약: 계획의 필수 성공 조건인 Docker compose 기동, core ping, Mattermost app HEAD, remote core smoke가 완료되지 않았다. 리뷰 환경에서도 Docker CLI와 `NEXO_REMOTE_HOST`가 없고, 구현 기록의 원격 출력은 `nexo-core`가 ARM64 host에서 amd64 이미지 에뮬레이션 실패로 `Restarting (255)` 상태임을 보여준다. + +## 루프 이력 + +| Plan | Review | Verdict | 메모 | +|------|--------|---------|------| +| `agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/plan_cloud_G07_0.log` | `agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/code_review_cloud_G07_0.log` | FAIL | Docker/remote runtime smoke 미완료, core ping 실패, verification output 불일치 | + +## 차단 근거 + +- 문제: local Docker smoke가 실행되지 않았고 remote smoke에서도 core container가 `Restarting (255)` 상태라 `/api/v4/system/ping`이 실패했다. 필수 검증을 완료로 볼 수 없다. +- 현재 archive plan: `agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/plan_cloud_G07_0.log` +- 현재 archive review: `agent-task/archive/2026/05/m-runtime-baseline/02_runtime_smoke/code_review_cloud_G07_0.log` +- 검증 명령: `command -v docker`, `test -n "$NEXO_REMOTE_HOST"`, `git diff --check` +- 실제 출력: 리뷰 재실행 기준 `command -v docker`는 exit 1, `NEXO_REMOTE_HOST=unset`, archive 전 `git diff --check`는 active review file의 trailing whitespace로 실패했다. 구현 기록 기준 remote `docker compose ps`는 `nexo-core` `Restarting (255)`이고 remote core ping은 `curl: (7) Failed to connect`. +- 차단 판단 근거: Docker-capable local/remote runtime과 ARM64 host에서 Mattermost core 이미지를 어떻게 실행할지에 대한 사용자 환경/범위 결정이 필요하다. 자동 follow-up만으로 필수 smoke 성공 조건을 만들기 어렵다. + +## 사용자 결정 필요 + +- [ ] 자동 follow-up plan/review를 계속 진행한다. +- [x] 계획을 재작성한다. +- [ ] 테스트 환경, secret, 외부 서비스, SDK, 장비 조건을 준비한 뒤 재시도한다. +- [x] 작업 범위를 줄이거나 보류/폐기한다. + +## 해소 결과 + +- 최종 처리: RESOLVED +- 사용자 결정: 현재 `runtime-baseline` Milestone은 완료 처리하고, Mac 원격 runtime smoke와 Mattermost/push-proxy image 마이그레이션, 현 repo/소비 프로젝트 smoke/e2e 검증은 새 `runtime-image-validation` Milestone으로 이관한다. +- 반영 경로: + - `agent-roadmap/archive/phase/product-foundation/milestones/runtime-baseline.md` + - `agent-roadmap/phase/product-foundation/milestones/runtime-image-validation.md` + - `agent-roadmap/current.md` + +## 재개 조건 + +- Docker CLI와 daemon을 사용할 수 있는 실행 환경이 준비되어야 한다. +- remote smoke가 필요하면 `NEXO_REMOTE_HOST`가 설정되어야 하고, 원격 `~/docker/services/nexo/compose`에서 core container가 성공적으로 기동 가능한 상태여야 한다. +- ARM64 host에서 진행할 경우 `mattermost/mattermost-team-edition:11.4.2` amd64 이미지 에뮬레이션을 계속 쓸지, ARM64-compatible runtime으로 범위를 조정할지 결정되어야 한다. +- 재개 시 `services/core/compose/README.md`의 push-proxy config 검증 문자열과 archived review log의 whitespace/검증 출력 불일치도 함께 정리해야 한다. + +## 다음 실행 힌트 + +- 환경이 준비되면 같은 task path `agent-task/m-runtime-baseline/02_runtime_smoke`에서 새 plan을 만들고, `docker compose version`, `docker info`, `docker compose up -d`, core ping/app HEAD, remote hash parity, remote core ping을 실제 출력으로 다시 기록한다. +- 환경 대신 범위를 바꾸려면 ARM64 원격 host를 지원하는 compose/runtime 기준으로 plan을 재작성한다. + +## 종료 규칙 + +- 사용자가 이 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-baseline/02_runtime_smoke/CODE_REVIEW-cloud-G07.md b/agent-task/m-runtime-baseline/02_runtime_smoke/CODE_REVIEW-cloud-G07.md deleted file mode 100644 index 430ad041..00000000 --- a/agent-task/m-runtime-baseline/02_runtime_smoke/CODE_REVIEW-cloud-G07.md +++ /dev/null @@ -1,159 +0,0 @@ - - -# Code Review Reference - SMOKE - -> **[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. -> 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-baseline/02_runtime_smoke, plan=0, tag=SMOKE - -## 이 파일을 읽는 리뷰 에이전트에게 - -> **[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-baseline/02_runtime_smoke/`로 이동한다. WARN/FAIL이면 user-review gate를 확인한 뒤 다음 active plan/review 파일 또는 `USER_REVIEW.md`를 작성한다. `USER_REVIEW.md`가 사용자 결정으로 완료/PASS 해소되면 code-review가 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log` 작성 후 archive 이동한다. -4. PASS이고 task group이 `m-`이면 완료 이벤트 메타데이터를 보고한다. roadmap 상태 체크와 `update-roadmap` 호출은 런타임 책임이다. -5. 적용 가능한 `코드리뷰 전용 체크리스트` 항목을 최종 `.log` 위치에서 체크한 뒤 보고한다. - ---- - -## 구현 항목별 완료 여부 - -| 항목 | 완료 여부 | -|------|---------| -| [SMOKE-1] Local Compose Runtime | [ ] | -| [SMOKE-2] Remote Parity | [ ] | - -## 구현 체크리스트 - -- [ ] `command -v docker`, `docker compose version`, `docker info`로 Docker 실행 가능성을 확인한다. -- [ ] `services/core/compose`에서 `.env`를 git 밖에 준비하고 `docker compose config`가 성공하는지 확인한다. -- [ ] `docker compose up -d` 후 core ping, Mattermost app HEAD, db readiness, push-proxy service/config smoke를 실행한다. 검증: `cd services/core/compose && docker compose up -d` 후 core ping과 Mattermost 앱 접근이 성공한다. -- [ ] `NEXO_REMOTE_HOST`를 사용해 원격 `~/docker/services/nexo/compose`의 `docker-compose.yml`과 `.env.example` hash가 local과 일치하는지 확인한다. 검증: local/remote compose와 `.env.example` hash 비교가 일치한다. -- [ ] smoke 실패가 repo 설정 문제로 확인될 때만 compose 파일이나 README를 최소 수정하고 같은 smoke를 재실행한다. -- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. - -## 코드리뷰 전용 체크리스트 - -> **[REVIEW AGENT ONLY]** 이 체크리스트는 코드리뷰 에이전트만 사용한다. -> 구현 에이전트는 이 섹션을 수정하거나 체크하지 않는다. - -- [ ] `코드리뷰 결과`에 `PASS`, `WARN`, `FAIL` 중 하나의 판정을 append한다. -- [ ] 판정과 `차원별 평가`, Required/Suggested/Nit 분류가 서로 일치한다. -- [ ] active `CODE_REVIEW-*-G??.md`를 `code_review_cloud_G07_N.log`로 아카이브한다. -- [ ] active `PLAN-*-G??.md`를 `plan_cloud_G07_M.log`로 아카이브한다. -- [ ] PASS이면 `agent-ops/skills/common/code-review/templates/complete-log-template.md` 기준으로 `complete.log`를 작성하고 active `.md` 파일을 남기지 않는다. -- [ ] PASS이면 active task 디렉터리 `agent-task/m-runtime-baseline/02_runtime_smoke/`를 `agent-task/archive/YYYY/MM/m-runtime-baseline/02_runtime_smoke/`로 이동하고 최종 archive 경로에서 이 체크리스트를 갱신한다. -- [ ] PASS이고 task group이 `m-`이면 런타임이 읽을 완료 이벤트 메타데이터를 보고하고, roadmap 수정이나 `update-roadmap` 직접 호출을 하지 않는다. -- [ ] PASS split 작업이면 이동 후 빈 active parent `agent-task/m-runtime-baseline/`를 제거하거나, 남은 sibling/file이 있어 유지했다고 확인한다. -- [ ] WARN/FAIL이고 user-review gate가 트리거되지 않았으면 다음 active `PLAN-cloud-G07.md`와 `CODE_REVIEW-cloud-G07.md`를 작성하고 `complete.log`를 작성하지 않는다. -- [ ] USER_REVIEW이면 `agent-ops/skills/common/code-review/templates/user-review-template.md` 기준으로 `USER_REVIEW.md`를 작성하고 active `PLAN-*.md`, `CODE_REVIEW-*.md`, `complete.log`를 남기지 않는다. -- [ ] USER_REVIEW가 사용자 결정으로 완료/PASS 해소되면 `USER_REVIEW.md`를 해소 상태로 갱신하고 `complete.log`를 작성한 뒤 task directory를 archive로 이동한다. - -## 계획 대비 변경 사항 - -_구현 에이전트가 계획과 다르게 구현한 부분을 이유와 함께 기록한다._ - -## 주요 설계 결정 - -_구현 에이전트가 주요 설계 결정 사항을 기록한다._ - -## 리뷰어를 위한 체크포인트 - -- Docker daemon 부재나 port collision을 repo 설정 문제로 오판하지 않았는지 확인한다. -- `.env`와 `services/core/data/`가 git에 포함되지 않았는지 확인한다. -- local/remote `sha256sum` 출력이 실제로 일치하는지 확인한다. -- smoke 실패로 수정한 compose/doc 변경이 최소 범위인지 확인한다. - -## 검증 결과 - -_구현 에이전트가 각 중간 검증 및 최종 검증 명령 실행 후 출력을 여기에 붙여 넣는다._ - -필수 규칙: -- 검증 명령은 고정된 계약이다. 임의로 대체하지 않는다. -- 대체가 필요하면 `계획 대비 변경 사항`에 이유와 대체 명령을 기록한다. -- `검증 결과`에는 실제 stdout/stderr를 붙여 넣는다. - -### SMOKE-1 중간 검증 -``` -$ cd services/core/compose -$ command -v docker -$ docker compose version -$ docker info -$ docker compose config -$ docker compose up -d -$ curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" -$ docker compose exec db pg_isready -U mmuser -d mattermost -$ curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" -$ docker compose ps push-proxy -$ docker compose config | rg --fixed-strings "MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER=http://push-proxy:8066" -(output) -``` - -### SMOKE-2 중간 검증 -``` -$ test -n "$NEXO_REMOTE_HOST" -$ cd services/core/compose -$ sha256sum docker-compose.yml .env.example -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example' -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose config' -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose ps' -$ ssh "$NEXO_REMOTE_HOST" 'curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping"' -(output) -``` - -### 최종 검증 -``` -$ cd services/core/compose -$ command -v docker -$ docker compose version -$ docker info -$ docker compose config -$ docker compose up -d -$ curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" -$ docker compose exec db pg_isready -U mmuser -d mattermost -$ curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" -$ docker compose ps push-proxy -$ docker compose config | rg --fixed-strings "MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER=http://push-proxy:8066" -$ test -n "$NEXO_REMOTE_HOST" -$ sha256sum docker-compose.yml .env.example -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example' -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose config' -$ ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose ps' -$ ssh "$NEXO_REMOTE_HOST" 'curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping"' -$ cd ../../.. -$ git status --short services/core/compose -$ git diff --check -(output) -``` - ---- - -> **[IMPLEMENTING AGENT — BEFORE SAVING] Have you filled in every implementation-owned section: completion table, implementation checklist, changes from plan, design decisions, and verification output?** -> If anything is blank, go back and fill it in before saving this file. -> Leave review-agent-only sections unchanged. - -Sections and their ownership: - -| Section | Owner | Note | -|---------|-------|------| -| Header comment, 개요, 리뷰 에이전트 지시 | Fixed at stub creation | Implementing agent must not modify or execute these (archive, complete.log, and task-directory archive move are review-agent only) | -| 구현 항목별 완료 여부 (item names) | Fixed at stub creation | Implementing agent checks `[ ]` -> `[x]` only | -| 구현 체크리스트 (item text/order) | Fixed at stub creation from plan | Implementing agent checks `[ ]` -> `[x]` only; final checkbox is mandatory before saving | -| 코드리뷰 전용 체크리스트 | Review agent only | Implementing agent must not modify or check this section | -| 계획 대비 변경 사항, 주요 설계 결정 | Implementing agent | Replace placeholder text with actual content | -| 리뷰어를 위한 체크포인트 | Fixed at stub creation | Pre-filled from plan | -| 검증 결과 (section headings + commands) | Fixed at stub creation | Implementing agent fills in command output only; command changes require a `계획 대비 변경 사항` entry | -| 코드리뷰 결과 | Review agent appends | Not included in stub | diff --git a/agent-task/m-runtime-baseline/02_runtime_smoke/PLAN-cloud-G07.md b/agent-task/m-runtime-baseline/02_runtime_smoke/PLAN-cloud-G07.md deleted file mode 100644 index 8096c58f..00000000 --- a/agent-task/m-runtime-baseline/02_runtime_smoke/PLAN-cloud-G07.md +++ /dev/null @@ -1,202 +0,0 @@ - - -# Plan - Runtime Smoke And Remote Parity - -## 이 파일을 읽는 구현 에이전트에게 - -구현이 끝나면 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 검증 명령을 실행하고 실제 stdout/stderr를 기록한 뒤 active 파일을 그대로 두고 리뷰 준비를 보고한다. 최종 archive, `complete.log`, 코드리뷰 판정은 code-review 스킬 전용이다. - -## 배경 - -현재 compose 문서는 core, db, push-proxy를 올리는 방법과 smoke 절차를 갖췄지만 실제 Docker 기동과 원격 hash parity는 아직 완료 evidence가 없다. 이 작업은 Docker-capable 환경과 remote host 접근이 필요한 실행 검증이다. smoke 실패가 compose 설정 문제로 확인될 때만 repo 파일을 최소 수정한다. - -## 분석 결과 - -### 읽은 파일 - -- `agent-roadmap/current.md` -- `agent-roadmap/phase/product-foundation/PHASE.md` -- `agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md` -- `README.md` -- `docs/README.md` -- `services/core/compose/README.md` -- `services/core/compose/.env.example` -- `services/core/compose/docker-compose.yml` -- `.gitignore` - -### 테스트 커버리지 공백 - -- `local-compose`: 기존 자동 테스트 없음. 실제 `docker compose up -d`, core ping, app HEAD, db readiness, push-proxy service/config check 출력이 evidence다. -- `remote-parity`: 기존 자동 테스트 없음. local/remote `sha256sum` 출력 일치와 원격 smoke 출력이 evidence다. -- compose 수정이 발생하는 경우: unit test는 없고 `docker compose config`, smoke command, `git diff --check`로 검증한다. - -### 심볼 참조 - -none. 이 작업은 code symbol rename/remove를 하지 않는다. - -### 분할 판단 - -split decision policy를 먼저 평가했다. shared task group은 `m-runtime-baseline`이다. - -- `01_source_snapshots`: upstream source snapshot 반입. 외부 git snapshot 리스크. -- `02_runtime_smoke`: Docker/SSH smoke 검증. terminal-agent 리스크. - -두 sibling 사이에 런타임 선행 의존성은 없다. 이 plan 내부에서는 local smoke 후 remote parity를 진행한다. - -### 범위 결정 근거 - -이 작업은 `services/core/compose/docker-compose.yml`, `services/core/compose/.env.example`, `services/core/compose/README.md`, 그리고 원격 `~/docker/services/nexo/compose` parity 확인만 다룬다. nginx/TLS, production hardening, push credential validation, push-proxy source build 전환, 기존 다른 compose 서비스와의 병합은 범위 밖이다. 계획 작성 환경에서는 `command -v docker`가 빈 출력이었으므로 실제 완료는 Docker 사용 가능한 환경에서만 가능하다. - -### 빌드 등급 - -build=`cloud-G07`, review=`cloud-G07`. Docker/SSH/long-running service smoke와 stdout/stderr evidence가 핵심인 terminal-agent 작업이다. - -## 구현 체크리스트 - -- [ ] `command -v docker`, `docker compose version`, `docker info`로 Docker 실행 가능성을 확인한다. -- [ ] `services/core/compose`에서 `.env`를 git 밖에 준비하고 `docker compose config`가 성공하는지 확인한다. -- [ ] `docker compose up -d` 후 core ping, Mattermost app HEAD, db readiness, push-proxy service/config smoke를 실행한다. 검증: `cd services/core/compose && docker compose up -d` 후 core ping과 Mattermost 앱 접근이 성공한다. -- [ ] `NEXO_REMOTE_HOST`를 사용해 원격 `~/docker/services/nexo/compose`의 `docker-compose.yml`과 `.env.example` hash가 local과 일치하는지 확인한다. 검증: local/remote compose와 `.env.example` hash 비교가 일치한다. -- [ ] smoke 실패가 repo 설정 문제로 확인될 때만 compose 파일이나 README를 최소 수정하고 같은 smoke를 재실행한다. -- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다. - -### [SMOKE-1] Local Compose Runtime - -#### 문제 - -Milestone의 `[local-compose]`는 `agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md:53`에서 미완료이고 실제 Docker 기동 evidence가 필요하다. `services/core/compose/docker-compose.yml:16`부터 db healthcheck가 있고 `services/core/compose/docker-compose.yml:47`은 core가 push-proxy를 compose DNS로 참조하지만, runtime smoke 출력은 아직 없다. - -#### 해결 방법 - -Docker-capable 환경에서 local compose를 detached mode로 올리고 README에 기록된 smoke를 실행한다. `.env`는 `services/core/compose/.env.example:1`부터 `services/core/compose/.env.example:4`를 복사해 만들되 git에 올리지 않는다. - -```sh -cd services/core/compose -cp -n .env.example .env -docker compose config -docker compose up -d -curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" -docker compose exec db pg_isready -U mmuser -d mattermost -curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" -docker compose ps push-proxy -docker compose config | rg --fixed-strings "MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER=http://push-proxy:8066" -``` - -실패 원인이 repo 설정이면 `docker-compose.yml`, `.env.example`, `README.md` 중 필요한 파일만 수정한다. Docker daemon 부재, port collision, missing remote secret처럼 repo 밖 문제면 수정하지 말고 blocker로 기록한다. - -#### 수정 파일 및 체크리스트 - -- [ ] 필요 시 `services/core/compose/docker-compose.yml`을 최소 수정한다. -- [ ] 필요 시 `services/core/compose/.env.example`을 최소 수정한다. -- [ ] 필요 시 `services/core/compose/README.md`를 실제 smoke와 맞춘다. -- [ ] `.env`와 `services/core/data/`는 git에 포함하지 않는다. - -#### 테스트 작성 - -테스트 파일은 작성하지 않는다. 이 항목은 runtime smoke이며 실제 Docker command 출력이 검증이다. - -#### 중간 검증 - -```sh -cd services/core/compose -command -v docker -docker compose version -docker info -docker compose config -docker compose up -d -curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" -docker compose exec db pg_isready -U mmuser -d mattermost -curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" -docker compose ps push-proxy -docker compose config | rg --fixed-strings "MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER=http://push-proxy:8066" -``` - -### [SMOKE-2] Remote Parity - -#### 문제 - -Milestone의 `[remote-parity]`는 `agent-roadmap/phase/product-foundation/milestones/runtime-baseline.md:54`에서 미완료다. `services/core/compose/README.md:58`부터 hash 비교 절차가 있지만 실제 remote output이 없다. - -#### 해결 방법 - -원격 host를 `NEXO_REMOTE_HOST`로 받고 local/remote hash를 비교한다. 원격 파일이 의도한 배포 copy와 다르면 원격을 동기화한 뒤 같은 명령을 재실행한다. repo 파일은 local source of truth가 틀린 경우에만 수정한다. - -```sh -test -n "$NEXO_REMOTE_HOST" -cd services/core/compose -sha256sum docker-compose.yml .env.example -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example' -``` - -hash가 일치하면 원격에서도 최소 smoke를 실행한다. 원격 `.env`와 runtime data는 git 밖에 있어야 한다. - -```sh -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose config' -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose ps' -ssh "$NEXO_REMOTE_HOST" 'curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping"' -``` - -#### 수정 파일 및 체크리스트 - -- [ ] local/remote hash output을 기록한다. -- [ ] 원격 drift가 있으면 원격 sync 또는 의도적 drift 사유를 기록한다. -- [ ] repo 문서가 실제 remote 기준과 다를 때만 `services/core/compose/README.md`를 수정한다. - -#### 테스트 작성 - -테스트 파일은 작성하지 않는다. 이 항목은 remote smoke이며 SSH command 출력이 검증이다. - -#### 중간 검증 - -```sh -test -n "$NEXO_REMOTE_HOST" -cd services/core/compose -sha256sum docker-compose.yml .env.example -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example' -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose config' -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose ps' -ssh "$NEXO_REMOTE_HOST" 'curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping"' -``` - -## 의존 관계 및 구현 순서 - -1. SMOKE-1 local compose smoke를 먼저 수행한다. -2. SMOKE-2 remote parity와 remote smoke를 수행한다. -3. 둘 중 repo 설정 문제가 발견된 경우에만 최소 수정 후 해당 smoke부터 재실행한다. - -## 수정 파일 요약 - -| 파일 | 항목 | -| --- | --- | -| `services/core/compose/docker-compose.yml` | SMOKE-1 | -| `services/core/compose/.env.example` | SMOKE-1 | -| `services/core/compose/README.md` | SMOKE-1, SMOKE-2 | - -## 최종 검증 - -```sh -cd services/core/compose -command -v docker -docker compose version -docker info -docker compose config -docker compose up -d -curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping" -docker compose exec db pg_isready -U mmuser -d mattermost -curl -fsSI "http://localhost:${NEXO_CORE_PORT:-18065}" -docker compose ps push-proxy -docker compose config | rg --fixed-strings "MM_EMAILSETTINGS_PUSHNOTIFICATIONSERVER=http://push-proxy:8066" -test -n "$NEXO_REMOTE_HOST" -sha256sum docker-compose.yml .env.example -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && sha256sum docker-compose.yml .env.example' -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose config' -ssh "$NEXO_REMOTE_HOST" 'cd ~/docker/services/nexo/compose && docker compose ps' -ssh "$NEXO_REMOTE_HOST" 'curl -fsS "http://localhost:${NEXO_CORE_PORT:-18065}/api/v4/system/ping"' -cd ../../.. -git status --short services/core/compose -git diff --check -``` - -Expected outcome: Docker is available, compose config is valid, local core ping and app HEAD succeed, db is ready, push-proxy service/config smoke succeeds, remote hashes match local hashes, remote compose config and ping succeed, and `git diff --check` reports no whitespace errors. - -모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다. diff --git a/scratch/askpass.sh b/scratch/askpass.sh new file mode 100755 index 00000000..33a053a2 --- /dev/null +++ b/scratch/askpass.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo "r0bins"