From e82990ddff45952587fc3f4f8b67b40f1c556e10 Mon Sep 17 00:00:00 2001 From: toki Date: Sat, 30 May 2026 15:44:06 +0900 Subject: [PATCH] chore: upstream sync and roadmap updates - Update README with latest project status - Archive upstream-runtime milestone and update roadmap - Update Mattermost Android build configuration - Sync upstream references for core and push-proxy services --- README.md | 46 +++++++++++++++++++ .../milestones/upstream-following.md | 28 +++++------ agent-roadmap/current.md | 4 +- agent-roadmap/phase/upstream-runtime/PHASE.md | 4 +- apps/mattermost/android/app/build.gradle | 3 +- services/core/UPSTREAM.md | 39 +++++++++++++++- services/push-proxy/UPSTREAM.md | 17 ++++++- 7 files changed, 118 insertions(+), 23 deletions(-) rename agent-roadmap/{ => archive}/phase/upstream-runtime/milestones/upstream-following.md (80%) diff --git a/README.md b/README.md index 701f0850..2489cbc1 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,52 @@ docker compose up - staging pull 결과를 이 저장소에 자동 반영하지 않는다. 스냅샷 diff와 관련 smoke 검증을 확인한 뒤 merge 요청한다. - Nexo 전용 패치는 가능한 한 업스트림 스냅샷 밖의 compose, 문서, 래퍼, 작고 명시적인 패치로 둔다. +## 업스트림 스냅샷 운영 + +workspace script를 둘 때의 계약은 자동 merge가 아니라 snapshot 후보 준비다. +script는 외부 `mattermost/` staging clone을 기록된 branch로 update하고, +선택한 commit을 이 repo의 대응 경로로 복사할 수 있다. script 실행만으로 +baseline을 변경한 것으로 보지 않는다. + +snapshot 반영은 다음 단계를 분리한다. + +1. staging clone update와 후보 commit 선택 +2. repo별 snapshot copy: `apps/mattermost`, `services/core`, `services/push-proxy` 중 하나 +3. 해당 `UPSTREAM.md`의 source, branch, tag/commit, snapshot date 갱신 +4. snapshot diff 확인과 nexo-local patch inventory 정리 +5. 변경 범위에 맞는 smoke 검증 +6. repo별 merge 요청 + +release watch는 월 1회 Mattermost server/webapp release 흐름과 push-proxy +`master` 변경을 확인하고, security patch 또는 ESR 영향이 있으면 정기 주기와 +별도로 snapshot 후보를 만든다. watch 결과는 해당 모듈의 `UPSTREAM.md`에 +baseline 후보 또는 보류 사유로 남기고, 검증 증거는 필요하면 +`docs/runtime-image-validation.md`나 merge 요청 본문에 연결한다. + +## 업스트림 Patch 경계 + +`services/core/server`, `services/core/webapp`, `services/push-proxy`는 +upstream-owned runtime으로 취급한다. Nexo 변경은 upstream snapshot과 다시 +비교하기 쉬운 얇은 layer에 둔다. + +webapp은 기본 메시지 앱 또는 reference front로 유지한다. branding, copy, +기능 숨김은 설정, wrapper, 작은 compatibility patch로 제한하고, 제품별 화면 +흐름이나 앱별 business logic은 Nexo Flutter SDK를 소비하는 앱 쪽에서 소유한다. + +대량 rename, directory 재배치, formatting-only churn, deep fork는 금지한다. +예외는 보안 패치, upstream update 차단 해소, Nexo runtime 계약 유지에 필요한 +최소 변경일 때만 허용하며, 해당 모듈의 `UPSTREAM.md`에 변경 path, 사유, +rebase 위험, 검증 결과를 남긴다. + +upstream 새 기능은 다음 후보로 분류한 뒤 반영한다. + +| 후보 | 기준 | 처리 | +| --- | --- | --- | +| keep | runtime 호환성, 보안, 기본 메시징 동작에 필요 | snapshot에 유지하고 smoke 검증에 포함한다. | +| hide | 기본 메시지 앱에서 노출하면 혼선을 주지만 upstream 유지에는 유리 | 설정, feature flag, 얇은 UI patch로 숨긴다. | +| defer | Nexo 계약 영향이 불명확하거나 검증 비용이 큰 기능 | 별도 follow-up으로 보류 사유와 재검토 조건을 남긴다. | +| remove | 보안, 라이선스, runtime 안정성 문제로 유지할 수 없는 기능 | 제거 사유와 upstream rebase 위험을 기록하고 검증한다. | + ## 개발 흐름 1. 변경할 경로의 domain rule을 읽는다. diff --git a/agent-roadmap/phase/upstream-runtime/milestones/upstream-following.md b/agent-roadmap/archive/phase/upstream-runtime/milestones/upstream-following.md similarity index 80% rename from agent-roadmap/phase/upstream-runtime/milestones/upstream-following.md rename to agent-roadmap/archive/phase/upstream-runtime/milestones/upstream-following.md index 866b66d5..b26efa14 100644 --- a/agent-roadmap/phase/upstream-runtime/milestones/upstream-following.md +++ b/agent-roadmap/archive/phase/upstream-runtime/milestones/upstream-following.md @@ -12,7 +12,7 @@ Mattermost server, webapp, push-proxy를 nexo runtime으로 계승하면서도 u ## 상태 -[진행중] +[완료] ## 승격 조건 @@ -44,28 +44,28 @@ Mattermost server, webapp, push-proxy를 nexo runtime으로 계승하면서도 u server/webapp/push-proxy가 어떤 upstream 버전을 기준으로 움직이는지 추적 가능하게 만든다. -- [ ] [source-baseline] server와 webapp의 upstream tag/commit, 적용 patch, nexo-local 변경 범위를 기록하는 기준을 정리한다. -- [ ] [snapshot-script] 외부 `mattermost/` staging clone을 git update하고 선택한 snapshot을 `apps/mattermost`, `services/core`, `services/push-proxy`로 복사하는 workspace script 계약을 정리한다. 검증: script가 staging pull 결과를 자동 merge하지 않고, repo별 commit SHA 기록, snapshot diff 확인, smoke 검증 단계를 분리한다. -- [ ] [push-proxy-baseline] push-proxy를 image-only로 추적할지 source mirror/fork를 둘지 판단 기준과 현재 선택을 문서화한다. -- [ ] [release-watch] Mattermost monthly/ESR release, security patch, push-proxy update를 확인하는 주기와 담당 문서를 정리한다. +- [x] [source-baseline] server와 webapp의 upstream tag/commit, 적용 patch, nexo-local 변경 범위를 기록하는 기준을 정리한다. +- [x] [snapshot-script] 외부 `mattermost/` staging clone을 git update하고 선택한 snapshot을 `apps/mattermost`, `services/core`, `services/push-proxy`로 복사하는 workspace script 계약을 정리한다. 검증: script가 staging pull 결과를 자동 merge하지 않고, repo별 commit SHA 기록, snapshot diff 확인, smoke 검증 단계를 분리한다. +- [x] [push-proxy-baseline] push-proxy를 image-only로 추적할지 source mirror/fork를 둘지 판단 기준과 현재 선택을 문서화한다. +- [x] [release-watch] Mattermost monthly/ESR release, security patch, push-proxy update를 확인하는 주기와 담당 문서를 정리한다. ### Epic: [patch-policy] Patch boundary nexo 변경이 upstream merge를 어렵게 만들지 않도록 허용 경계를 만든다. -- [ ] [thin-branding] webapp은 기본 메시지 앱/reference front로 유지하고, branding과 기능 숨김은 얇은 patch로 제한하는 기준을 정리한다. -- [ ] [no-deep-rename] server/webapp/push-proxy upstream-owned 코드의 대량 rename과 deep fork를 금지하고 예외 조건을 문서화한다. -- [ ] [feature-triage] upstream 새 기능을 keep/hide/defer/remove 후보로 분류하는 기준을 정리한다. +- [x] [thin-branding] webapp은 기본 메시지 앱/reference front로 유지하고, branding과 기능 숨김은 얇은 patch로 제한하는 기준을 정리한다. +- [x] [no-deep-rename] server/webapp/push-proxy upstream-owned 코드의 대량 rename과 deep fork를 금지하고 예외 조건을 문서화한다. +- [x] [feature-triage] upstream 새 기능을 keep/hide/defer/remove 후보로 분류하는 기준을 정리한다. ## 완료 리뷰 -- 상태: 없음 -- 요청일: 없음 -- 완료 근거: 없음 +- 상태: 승인됨 +- 요청일: 2026-05-30 +- 완료 근거: `services/core/UPSTREAM.md`, `services/push-proxy/UPSTREAM.md`, `README.md`에 upstream baseline, snapshot script 계약, push-proxy 추적 방식, release watch, patch boundary 기준을 정리했다. - 리뷰 필요: - - [ ] 사용자가 완료 결과를 확인했다 - - [ ] archive 이동을 승인했다 -- 리뷰 코멘트: 없음 + - [x] 사용자가 완료 결과를 확인했다 + - [x] archive 이동을 승인했다 +- 리뷰 코멘트: 2026-05-30 사용자 승인에 따라 완료 처리하고 archive로 이동한다. ## 범위 제외 diff --git a/agent-roadmap/current.md b/agent-roadmap/current.md index 92083ab3..8bacfa71 100644 --- a/agent-roadmap/current.md +++ b/agent-roadmap/current.md @@ -7,9 +7,9 @@ ## 활성 Milestone -- [진행중] 업스트림 팔로잉 기준선 +- [계획] CI/CD와 운영 업데이트 루프 - Phase: `agent-roadmap/phase/upstream-runtime/PHASE.md` - - 경로: `agent-roadmap/phase/upstream-runtime/milestones/upstream-following.md` + - 경로: `agent-roadmap/phase/upstream-runtime/milestones/cicd-operations.md` ## 선택 규칙 diff --git a/agent-roadmap/phase/upstream-runtime/PHASE.md b/agent-roadmap/phase/upstream-runtime/PHASE.md index f6628cde..49ff0d85 100644 --- a/agent-roadmap/phase/upstream-runtime/PHASE.md +++ b/agent-roadmap/phase/upstream-runtime/PHASE.md @@ -15,8 +15,8 @@ Mattermost server, webapp, push-proxy를 nexo의 upstream-followable 메시징 완료, 검토중, 진행중, 계획, 스케치 순서로 두어 아래로 갈수록 미래 작업에 가까워지게 정렬한다. 스케치 Milestone은 아직 구현 가능한 계획이 아니므로 계획 Milestone보다 아래에 둔다. -- [진행중] 업스트림 팔로잉 기준선 - - 경로: `agent-roadmap/phase/upstream-runtime/milestones/upstream-following.md` +- [완료] 업스트림 팔로잉 기준선 + - 경로: `agent-roadmap/archive/phase/upstream-runtime/milestones/upstream-following.md` - 요약: server/webapp/push-proxy의 upstream baseline, patch 경계, update 판단 기준을 정한다. - [계획] CI/CD와 운영 업데이트 루프 - 경로: `agent-roadmap/phase/upstream-runtime/milestones/cicd-operations.md` diff --git a/apps/mattermost/android/app/build.gradle b/apps/mattermost/android/app/build.gradle index e3330830..ef6573a1 100644 --- a/apps/mattermost/android/app/build.gradle +++ b/apps/mattermost/android/app/build.gradle @@ -207,10 +207,9 @@ dependencies { implementation 'com.google.android.material:material:1.12.0' implementation 'androidx.constraintlayout:constraintlayout:2.2.1' implementation "com.google.firebase:firebase-messaging:$firebaseVersion" - androidTestImplementation('com.wix:detox:+') + androidTestImplementation 'com.wix:detox:20.47.0' androidTestImplementation 'androidx.test:core:1.6.1' androidTestImplementation 'androidx.test:runner:1.6.2' - androidTestImplementation 'com.wix:detox:20.26.2' // For animated GIF support implementation 'com.facebook.fresco:animated-gif:3.6.0' diff --git a/services/core/UPSTREAM.md b/services/core/UPSTREAM.md index fb32a88f..9f541e4e 100644 --- a/services/core/UPSTREAM.md +++ b/services/core/UPSTREAM.md @@ -3,10 +3,45 @@ `services/core/` is derived from the Mattermost server repository. - Source: `https://github.com/mattermost/mattermost.git` +- Branch: `master` - Baseline tag: `v11.4.2` - Baseline commit: `bcf511968217cd0f65cbead926e03260bfcd1011` - Snapshot date: `2026-05-30` +- Snapshot source: `/config/workspace/mattermost/mattermost/` +- Snapshot target: `/config/workspace/nexo/services/core/` -Keep product-specific changes small and easy to compare against this baseline -until the long-term fork and rebranding strategy is settled. +## Component Baseline +Server and webapp are tracked from the same upstream repository baseline, but +they should be reviewed as separate runtime surfaces when a snapshot is updated. + +| Component | Workspace path | Upstream path | Baseline tag | Baseline commit | +| --- | --- | --- | --- | --- | +| Server | `services/core/server/` | `server/` | `v11.4.2` | `bcf511968217cd0f65cbead926e03260bfcd1011` | +| Webapp | `services/core/webapp/` | `webapp/` | `v11.4.2` | `bcf511968217cd0f65cbead926e03260bfcd1011` | + +## Update Record + +When the server or webapp baseline changes, update this file with: + +- upstream branch, tag, and commit SHA used for the snapshot +- snapshot date, source clone path, and target workspace path +- component scope: server, webapp, or both +- patch inventory: upstream snapshot patches, nexo-local patches, and removed patches +- validation summary or a link to the evidence document used before merge + +Do not change the baseline tag or commit only because a staging clone was pulled. +A new baseline is recorded after snapshot diff review and the relevant smoke +checks pass. + +## Patch Boundary + +Keep product-specific changes small and easy to compare against this baseline. +Prefer compose files, workspace docs, helper wrappers, or narrowly documented +compatibility patches over direct edits to upstream-owned server or webapp code. + +Any nexo-local patch inside `services/core/server/` or `services/core/webapp/` +must be listed in the update record with its path, reason, upstream rebase risk, +and validation result. Existing patch-package files under +`services/core/webapp/patches/` are treated as part of the upstream snapshot +unless the update record explicitly marks one as nexo-local. diff --git a/services/push-proxy/UPSTREAM.md b/services/push-proxy/UPSTREAM.md index 264db1ff..70c6dbbe 100644 --- a/services/push-proxy/UPSTREAM.md +++ b/services/push-proxy/UPSTREAM.md @@ -9,4 +9,19 @@ - Snapshot source: `/config/workspace/mattermost/mattermost-push-proxy/` - Snapshot target: `/config/workspace/nexo/services/push-proxy/` -Keep nexo-specific changes outside this snapshot where possible. +## Tracking Mode + +Current choice: source snapshot plus nexo-owned runtime image build. + +Use the source snapshot as the primary baseline because nexo needs reproducible +image builds, local smoke validation, and an explicit place to review FCM/APNs +delivery behavior. Do not treat push-proxy as image-only while local runtime +images are built from this workspace. + +Image-only tracking is only a future candidate if nexo no longer needs local +source-level validation, no nexo-local patch is present, and runtime image +provenance can still be tied to a specific upstream commit or release artifact. + +Keep nexo-specific changes outside this snapshot where possible. If a local +patch is unavoidable, record its path, reason, rebase risk, and validation +evidence in this file before merging the snapshot update.