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
This commit is contained in:
toki 2026-05-30 15:44:06 +09:00
parent 5d1c31fb7e
commit e82990ddff
7 changed files with 118 additions and 23 deletions

View file

@ -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을 읽는다.

View file

@ -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로 이동한다.
## 범위 제외

View file

@ -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`
## 선택 규칙

View file

@ -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`

View file

@ -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'

View file

@ -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.

View file

@ -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.